我正在为类 Java 表达式的子集编写一个解析器,并且在解析此代码时发现了歧义:
(something) -x
因为它可以被解析为
something - x
(二进制表达式)或 (something) (-x)
(强制转换的一元表达式)。
目前解析器倾向于第一个选项,但我想要第二个选项。
我的解析器的相关部分如下所示:
expression
: LeftParen expr = expression RightParen # ParenthesizedExpression
| id = Identifier # IdentifierExpression
| op = (Minus | BitwiseNot) expr = expression # UnaryExpression
| < assoc = right > LeftParen type = Identifier RightParen expr = expression # CastExpression
| left = expression op = (Plus | Minus) right = expression # AdditiveExpression
;
有什么想法可以解决这个问题,理想情况下不消除直接左递归? 谢谢。
从上到下尝试 ANTLR 解析器规则中的替代方案。如果您向上移动 case 表达式,它将按预期进行解析:
expression
: <assoc=right> LeftParen type=Identifier RightParen expr=expression # CastExpression
| LeftParen expr=expression RightParen # ParenthesizedExpression
| id=Identifier # IdentifierExpression
| op=(Minus | BitwiseNot) expr=expression # UnaryExpression
| left=expression op=(Plus | Minus) right=expression # AdditiveExpression
;