如何解决根据RNG模式进行XML自动补全
让RNG
是一个宽松的NG规范,XML
是一个相对于RNG
的有效XML文档,指定n
是该字符的第n
个字符XML
文档,B
的{{1}}节点和XML
XML文档,其中节点XML[n = B]
插入字符B
处。>
- 对于任何
suggest(RNG,XML,n) → {Node} = O
,B ∈ O
是相对于XML[n = B]
的有效XML文档,并且 - 对于任何
RNG
,C ∉ O
无效有效。
目前,我尝试了两种方法:
-
在
XML[n = C]
和XML
的元素RNG
上使用双递归,其中元素XML[n]
包含字符和RNGn
{{ 1}}与<element>
匹配,并返回元组RNG[n]
,然后根据这两个元素决定下一步返回什么。例如,如果当前的XML[n]
节点是(boolean,suggestions)
和RNG
之间的选择,则如果A
为true而B
为false,则返回{{1} },如果它们都为假,则fn(A)[0]
,如果它们都为真,则……fn(B)[0]
可能还不错,但肯定并不总是正确的答案。 -
使用带有四个堆的“状态机”(例如
(true,fn(A)[1])
和(false,[])
的孩子,(true,fn(A)[1] + fn(B)[1])
和*r
的孩子,{{ 1}}包含正在解决的当前选项,RNG[n]
包含输出建议),这样
- 如果
*x
等于XML[n]
,则弹出*c
和*s
,如果*r
不等于*x
,则弹出{{ 1}},然后将其推入*r
, - 如果
*x
是*r
和*x
之间的选择,则按*r
中的*s
并按{{1}中的*r
}。 - 如果
A
是引用,则将其弹出并推送匹配的定义(如果它是一个定义,则将其作为一个组进行处理, - 如果
B
是一个组,则将其元素推到(*r,*x,B,null)
- 如果
*c
等于A
,并且*r
是一个节点,则将其弹出,将*r
和*r
设置为*r
和{ {1}},分别在*c[0]
中推*r
- 如果
*c[2]
等于*r
并且*x
为空,则将其弹出,比较*c[2],*c[0]
和*c[1]
,然后确定( )。 - 根据选择和分组简化其他节点(不是很困难),以使它们只有两个元素。
但两者都没有那么成功:
- 在大型模式下,a都很慢
- 第一个错误经常由于递归过多而失败,特别是如果RNG包含多个
(*r,null,*s)
,并且检查无限循环也变得非常困难。 - 第二个使用大量内存,因为我必须在遇到的每个
*c
上深度复制每个XML节点。 - 由于可能的案例数量众多,笔试很难,而且我找不到一种以编程方式生成它们的方法。因此,实际上,我什至不确定我的函数是否会生成有效的XML文档。
- 我仍然不清楚我应该如何处理
*c[0]
。例如,以*r
为例:我应该如何编码,以便建议所有个有效节点?
我知道有多个编辑器(例如Emacs的http://www.thaiopensource.com/nxml-mode/)提供了此选项,但是我不确定他们确实会生成有效的文档,而且我对阅读Lisp并不熟悉。
所以我正在寻找一种在DOM上实现此目标的“好方法”,或者甚至更好的JavaScript库来实现这一目标。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。