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
精彩评论