使用 ANTLR 4 澄清类 Java 表达式中的解析歧义

问题描述 投票:0回答:1

我正在为类 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 antlr4
1个回答
0
投票

从上到下尝试 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
 ;

© www.soinside.com 2019 - 2024. All rights reserved.