似乎无法解决 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
。
为了获得以您想要的方式解决的歧义,您需要将运算符的两个操作数设为 expr
s。
我正在创建基本上可以识别算术表达式的最简单的语法。语法需要正确遵循算术运算符优先级规则 (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
。
为了获得以您想要的方式解决的歧义,您需要将运算符的两个操作数设为 expr
s。