似乎无法解决 Antlr 语法中的歧义

Cannot seem to resolve ambiguity in Antlr Grammar

我正在创建基本上可以识别算术表达式的最简单的语法。语法需要正确遵循算术运算符优先级规则 (PEMDAS),为此我将 expr ('*'|'/') term 放在 expr ('+'|'-') term 之前以确保此优先级。 这是我拥有的 arithmetic.g4 文件:


/*Productions */
 
expr: expr ('*'|'/') term
    | expr ('+'|'-') term
    | term
    ;
term: '('expr')'
    | ID
    | NUM
    ;

/*Tokens */
ID: [a-z]+;
NUM: [0-9]+;

WS:  [\t\r\n]+->skip;

但是语法的输出不是它应该的。例如算术表达式 4 * (3 + 10) 我得到下面的解析树(这绝对不正确):

关于如何更改语法以获得我正在寻找的内容的任何建议。我是 antlr 的新手,不确定我犯了什么错误。 (顺便说一句,我的 OS 是 windows)

(我假设你在你的例子中犯了一个错误(看起来不错)并且你的意思是你得到了错误的输入树4 + 3 * 10,所以这就是我我要回答了,如果不是这个意思,请说明。)

你说得对,ANTLR 根据规则的顺序解决歧义,但这不适用于你的语法,因为你的语法没有歧义。对于像 4 + 3 * 10 这样的输入,只有一种方法可以根据您的语法解析它:* 是外部运算符,4 + 3 是它的左边,10 是它的右操作数。正确的方法(+ 作为外部运算符,3 * 10 作为右操作数)不适用于您的语法,因为 3 * 10 不是有效的 term 和右操作数根据您的语法需要 term

为了获得以您想要的方式解决的歧义,您需要将运算符的两个操作数设为 exprs。