rebol 解析功能是否有限制?它是否能够解析整个 css2/css 3 规范,还是会遇到理论上不可能形成一些规则?
在 HostileFork 回答后更新:我的意思是在正则表达式中我认为这是不可能的,解析更强大吗?
如果是,这是否意味着可以在与 html5 兼容的 rebol vid 中构建浏览器?
rebol 解析功能是否有限制?它是否能够解析整个 css2/css 3 规范,还是会遇到理论上不可能形成一些规则?
在 HostileFork 回答后更新:我的意思是在正则表达式中我认为这是不可能的,解析更强大吗?
如果是,这是否意味着可以在与 html5 兼容的 rebol vid 中构建浏览器?
你的“有限制”的问题很滑。我会试着给你“答案”,而不仅仅是“是的,当然”……这会更方便,尽管不太有教育意义。:)
考虑以下代码段。它将解析器位置捕获到x
中,然后运行 DO 方言中括号中的内容。如果函数成功,该代码将重新设置x
为输入的尾部,css-parser
如果函数失败,则重新设置为输入的头部。最后,它将解析位置设置为 current x
。正如我们所知,只有当规则完成时我们处于输入系列的末尾时,PARSE 才会返回 true……
parse my-css [x: (x: either css-parser x [tail x] [head x]]) :x]
这是有效的解析方言代码,并且当(且仅当)css-parser
函数成功时它返回 true。因此,如果您完全可以在 Rebol 中编写一个 css 解析器,那么您可以“在解析方言中”编写它。
(这就引出了一个问题,即是否有可能在 Rebol 函数中解决给定的计算问题。幸运的是,计算机科学家不必在每次出现新语言时都重新回答该问题。您可以计算任何由一台图灵机,没有什么是不可能的……看看艾伦·图灵自己的话,用外行的话。CSS解析不完全是停机问题,所以是的……可以做到。)
我将尝试重新提出您的问题:
“是否可以编写一个规则块(不使用 PAREN!、SET-WORD! 或 GET-WORD! 结构),可以传递给 PARSE 函数并在任何有效的 CSS 文件上返回 TRUE,在任何有效的 CSS 文件上返回 FALSE畸形的吗?”
W3C 提出了 CSS 好坏的正式规范:
http://www.w3.org/TR/CSS2/grammar.html
但请注意,即使在那里,也并非一帆风顺。不能排除他们对颜色常量的“正式”规范#abcd
,他们必须在评论中用英文写下它:
/*
* There is a constraint on the color that it must
* have either 3 or 6 hex-digits (i.e., [0-9a-fA-F])
* after the "#"; e.g., "#000" is OK, but "#abcd" is not.
*/
hexcolor
: HASH S*
;
这导致我们问我们是否会原谅 Rebol 在我们通过拿走 PARSE!/GET-WORD!/SET-WORD 来束缚 PARSE 之后无法进行这种识别!(我只是想根据你的问题指出这种问题)。
作为 Rebol 3 解析项目的一部分,有一篇关于解析理论的文章……
PARSE方言是自顶向下解析语言(TDPL家族)家族的增强成员,包括自顶向下解析语言(TDPL)、广义自顶向下解析语言(GTDPL)和解析表达式语法(PEG)和使用与该系列的其他成员相同的“有序选择”解析方法。
正如上面链接中所指出的,作为此类的成员,Rebol 的 PARSE 严格来说比正则表达式和LL 解析器更强大。我认为它也比 LL(k) 和 LL* 解析器更强大,但是自从我研究这些东西以来已经有一段时间了,我不会赌上我的生命。:)
您实际上并不需要了解所有这些意味着什么才能利用它来回答您的“可以完成”的问题。由于人们声称使用ANTLR解析 CSS ,而 ANTLR 是一个 LL* 解析器,所以我会说 Rebol 可以做到。PAREN!是一个 ace-in-the-hole,如果你撞到墙上,它可以让你做“任何事情”,但如果开始使用它太粗心,就会很滑。
应该完全有能力解析规范,如果你有动机和耐心来编写规则。它会比 JSON 解析器更复杂一些,但它的想法是一样的。