递归树梢不起作用

时间:2011-07-13 04:38:11

标签: ruby parsing treetop

我正在尝试使用Treetop创建一个有点递归的解析器。表达式可以是数字,但也可以是表达式的添加,所以我写了这个:

grammar Language
  rule expression
    "(" _ expression _ ")" / addition / integer 
  end

  rule addition
    expression _ "+" _ expression
    /
    expression _ "-" _ expression
  end

  rule integer
    '-'? _ [0-9]+
  end

  # space
  rule _
   ' '*
  end
end

那是行不通的。每当我试图解析任何东西时,我都会得到一个异常“SystemStackError:堆栈级别太深”(堆栈溢出!耶!)。有什么想法吗?使用Treetop指定这种递归定义的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

你的语法是左递归的:即expression可以立即成为addition,而expression又可以是grammar Language rule expression addition end rule addition multiplication (_ [+-] _ multiplication)* end rule multiplication unary (_ [*/%] _ unary)* end rule unary "-"? _ atom end rule atom number / "(" _ expression _ ")" end rule number float / integer end rule float [0-9]+ "." [0-9]+ end rule integer [0-9]+ end rule _ ' '* end end 等,导致解析器进入无限循环。

尝试这样的事情(未经测试!):

{{1}}