Ruby 如何避免树顶中的左递归而不进行回溯?

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').

在我正在研究的这个简单表达式解析器中,我很难避免左递归。本质上,我想将方程'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').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这样的语言是如何解析这种东西的?