У меня возникли проблемы с тем, чтобы избежать левой рекурсии в этом простом синтаксическом анализаторе выражений, над которым я работаю. По сути, я хочу разобрать уравнение «f x y» на два выражения «f x» и «(f x) y» (с неявными скобками). Как я могу сделать это, избегая левой рекурсии и возврата? Должен ли быть промежуточный шаг?
#!/usr/bin/env ruby
require 'rubygems'
require 'treetop'
Treetop.load_from_string DATA.read
parser = ExpressionParser.new
p parser.parse('f x y').value
__END__
grammar Expression
rule equation
expression (w+ expression)*
end
rule expression
expression w+ atom
end
rule atom
var / '(' w* expression w* ')'
end
rule var
[a-z]
end
rule w
[\s\n\t\r]
end
end