我在 Treetop 中有一对有效的规则,我的完美主义者认为应该是一个且只有一个规则,或者至少是更漂亮的规则:
rule _
crap
/
" "*
end
rule crap
" "* "\\x0D\\x0A"* " "*
end
我正在解析一些不时以“\x0D\x0A”结尾的表达式。是的,不是“\r\n”而是“\x0D\x0A”。在某些时候,有些东西被双重逃脱了。很长的故事。
这条规则有效,但它很丑陋,而且让我很困扰。我试过这个:
rule _
" "* "\\x0D\\x0A"* " "*
/
" "*
end
这导致
SyntaxError: (eval):1276:in `load_from_string': compile error
(eval):1161: class/module name must be CONSTANT
from /.../gems/treetop-1.4.9/lib/treetop/compiler/grammar_compiler.rb:42:in `load_from_string'
from /.../gems/treetop-1.4.9/lib/treetop/compiler/grammar_compiler.rb:35:in `load'
from /.../gems/treetop-1.4.9/lib/treetop/compiler/grammar_compiler.rb:32:in `open'
from /.../gems/treetop-1.4.9/lib/treetop/compiler/grammar_compiler.rb:32:in `load'
理想情况下,我想实际写一些类似的东西:
rule _
(" " | "\\x0D\\x0A")*
end
但这不起作用,当我们这样做时,我还发现每个规则不能只有一个 *:
rule _
" "*
/
"\n"*
end
这将匹配“”,但从不匹配\n。