У меня есть эта рабочая пара правил в 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.