Ruby 如何避免树顶中的左递归而不进行回溯?
在我正在研究的这个简单表达式解析器中,我很难避免左递归。本质上,我想将方程'fxy'解析为两个表达式'fx'和'(fx)y'(带隐式括号)。如何在避免左递归和回溯的同时做到这一点?是否必须有一个中间步骤Ruby 如何避免树顶中的左递归而不进行回溯?,ruby,parsing,treetop,peg,left-recursion,Ruby,Parsing,Treetop,Peg,Left Recursion,在我正在研究的这个简单表达式解析器中,我很难避免左递归。本质上,我想将方程'fxy'解析为两个表达式'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').
#!/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
你没有提供足够的关于你想要的结果的信息。特别是,您是否希望“f(ab)y”解析为“(f(a(b)))y”?我想你是。。。这意味着一个函数后面没有开括号,它的arity为1 所以你想说:
rule equation
expression w* var / expression w* parenthesised_list
end
rule parenthesised_list
'(' w* ( expression w* )+ ')'
end
另一方面,如果您对f的算术有外部(语法)知识,并且您想要迭代“表达式”那么多次(例如在解析TeX时发生的情况),那么您将需要在迭代表达式列表中使用语义谓词&{s |…})。请注意,传递给sempred块的参数不是SyntaxNode(由于此序列子规则尚未成功,因此无法构造SyntaxNode),而是序列中迄今为止累积的节点数组。块返回值的真实性决定了解析结果,可以停止迭代
您可能考虑使用的另一个工具是“前瞻”(PosithIIONoToTyPrEppToToSuxor或PosithE.SuthMube)。
你也可以在中问这样的问题,如果我正确理解了OP,作者想要一种类似Haskell的语法,所以这里的主题不是用于参数列表,而是用于分组表达式,这正是我想要的语法类型。然而,树梢并没有后退。。。因此,无法返回将
fx
重新解析为(fx)
。也许我误解了像Haskell或SASL这样的语言是如何解析这种东西的?