开发者

Recursive treetop is not working

开发者 https://www.devze.com 2023-03-20 02:40 出处:网络
I\'m trying to create a parser using Tree开发者_如何学JAVAtop that is somewhat recursive. An expression can be a number but it also can be an addition of expressions, so I wrote this:

I'm trying to create a parser using Tree开发者_如何学JAVAtop that is somewhat recursive. An expression can be a number but it also can be an addition of expressions, so I wrote this:

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

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

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

  # space
  rule _
   ' '*
  end
end

That just doesn't work. Any time I'm trying to parse anything I get an exception "SystemStackError: stack level too deep" (stack overflow! yay!). Any ideas why? what's the correct way to specify such a recursive definition with Treetop?


You grammar is left-recursive: i.e. a expression can immediately be an addition which in its turn can be an expression etc. causing the parser to go in an infinite loop.

Try something like this instead (untested!):

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
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号