在我正在研究的这个简单的表达式解析器中,我无法避免左递归。本质上,我想将方程“fx y”解析为两个表达式“fx”和“(fx)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