消除antlr中的语法歧义

消除antlr中的语法歧义,antlr,antlrworks,Antlr,Antlrworks,我正在写一个解析器。我有一个产品是左递归的a:a op a 所以我用这种方式来解决它: ab:()(op ab)* 其中op:+|-|/|* 现在我认为这是模棱两可的,例如对于一些语句,比如x+y*z。我怎样才能 消除这种歧义œ对于ANTLR 3,在对表达式执行的多个规则调用中,优先级是隐含的。有很多关于如何在web上构建递归下降表达式解析器的示例 expr : primary (op primary)* ; 顺便说一句,它一点也不含糊 ANTLR 4允许您指定左递归表达式规则,并隐式地根据备

我正在写一个解析器。我有一个产品是左递归的
a:a op a
所以我用这种方式来解决它:
ab:()(op ab)*
其中
op:+|-|/|*
现在我认为这是模棱两可的,例如对于一些语句,比如x+y*z。我怎样才能

消除这种歧义œ

对于ANTLR 3,在对表达式执行的多个规则调用中,优先级是隐含的。有很多关于如何在web上构建递归下降表达式解析器的示例

expr : primary (op primary)* ;
顺便说一句,它一点也不含糊

ANTLR 4允许您指定左递归表达式规则,并隐式地根据备选方案的顺序定义优先级,假设存在歧义。例如,这里有一个典型的规则:

expr : expr '*' expr
     | expr '+' expr
     | INT
     ;

我不知道,我使用antlr的一个选项来删除左递归
删除左递归
,它会自动转换为这种格式。我不知道你的意思。我的问题是,对于一些表达式,比如x+y*z,我有两个解析树。我认为你写的这本语法书不能解决这个问题。是吗?是的,antlr添加了pred并将expr重写为非左递归。看见