你的“是否有限制”的问题很棘手。我会尽力给你“the回答”而不是仅仅“是的,当然”......这会更方便,尽管不太有教育意义。:)
考虑以下片段。它将解析器位置捕获到x
,然后以 DO 方言运行括号中的内容。该代码重新设置x
到输入的尾部,如果css-parser
函数成功,或者如果函数失败则转到输入的头部。最后,它将解析位置设置为当前x
。正如我们所知,只有当规则完成时我们处于输入序列的末尾时,PARSE 才会返回 true...
parse my-css [x: (x: either css-parser x [tail x] [head x]]) :x]
这是有效的解析方言代码AND当(且仅当)css-parser
函数成功。因此,如果你能用 Rebol 编写 css 解析器,你就可以“用解析方言”编写它。
(这引出了一个问题:是否可以在 Rebol 函数中解决给定的计算问题。值得庆幸的是,计算机科学家不必每次出现新语言时都重新回答该问题。您可以计算通过以下方式计算的任何内容图灵机,没有什么是不可能的……看看吧阿兰·图灵自己的话 http://hostilefork.com/tag/turing/,通俗地说。 CSS 解析并不完全是停止问题,所以是的......它可以完成。)
我将尝试重新构建您的问题:
“是否可以编写一个规则块(不使用 PAREN!、SET-WORD!或 GET-WORD!构造),将其传递到 PARSE 函数中,并在任何有效的 CSS 文件上返回 TRUE,在任何有效的 CSS 文件上返回 FALSE畸形的吗?”
W3C 发布了关于 CSS 好坏的正式规范:
http://www.w3.org/TR/CSS2/grammar.html 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*
;
这让我们不禁要问,在我们通过拿走 PAREN!/GET-WORD!/SET-WORD! 来束缚 PARSE 的手脚之后,我们是否会原谅 Rebol 无法进行这种识别呢? (我只是想针对你的问题指出这一类问题)。
作为 Rebol 3 解析项目的一部分,有一篇文章解析理论 http://www.rebol.net/wiki/Parse_Project#Theory_of_PARSE...
PARSE 方言是自顶向下解析语言家族(TDPL 家族)的增强成员,包括自顶向下解析语言(TDPL)、通用自顶向下解析语言(GTDPL)和解析表达式语法(PEG)使用与家族其他成员相同的“有序选择”解析方法。
正如上面的链接所指出的,作为此类的成员,Rebol 的 PARSE 严格来说比正则表达式和LL解析器 http://en.wikipedia.org/wiki/LL_parser。我认为它也比 LL(k) 和 LL* 解析器更强大,但自从我研究这些东西以来已经有一段时间了,我不会把我的生命押在它上面。 :)
您实际上并不需要理解这一切意味着什么,才能利用它来回答您的“可以做到吗”的问题。既然人们声称可以解析 CSS http://www.bensblog.com/articles/2008/05/23/parsing-css-with-antlr with ANTLR http://en.wikipedia.org/wiki/ANTLR,而 ANTLR 是一个 LL* 解析器,那么我想说 Rebol 可以做到。帕伦!这是一张王牌,如果你碰壁了,它可以让你做“任何事情”,但如果不小心使用它,就会陷入滑坡。