Antlr 如何删除左递归?

Antlr 如何删除左递归?,antlr,antlr3,Antlr,Antlr3,我正试图为一种只剩下递归的简单语言编写语法,但我真的不明白如何编写 基本上我的语法是这样的: expr: expr('@'TYPE)? '.' ID '(' (expr ',')∗ ')' | expr '+' expr | ID | INTEGER | STRING INTEGER : ('0'..'9')+; STRING : '"' ('a'..'z' | 'A'..'Z' | '0'..'9')* '"'; TYPE : ('String' | 'Bool' | 'Int') ID

我正试图为一种只剩下递归的简单语言编写语法,但我真的不明白如何编写

基本上我的语法是这样的:

expr: expr('@'TYPE)? '.' ID '(' (expr ',')∗ ')'
| expr '+' expr
| ID
| INTEGER
| STRING


INTEGER : ('0'..'9')+;
STRING : '"' ('a'..'z' | 'A'..'Z' | '0'..'9')* '"';
TYPE : ('String' | 'Bool' | 'Int')
ID : ('a'..'z' | 'A'..'Z')('a'..'z' | 'A'..'Z' | '0'..'9')*;
还有更多,但这是我试图删除的左递归的重要部分

我一直在看关于它的报道,这就是我最终得到的结果:

expr: function
| add
| ID
| INTEGER
| STRING

function : ( ('@'TYPE)? '.' ID '(' (expr',')* ')'  function)?;
add : (('+' expr) add)?;

然而antlr仍然说它是左递归的,我无法让它识别我想要的语言。有人能帮我解释一下如何删除左递归吗?

函数
添加
匹配ε(空字符串)。删除规则末尾的
,即可:

function 
  :  ('@'TYPE)? '.' ID '(' (expr',')* ')'  function
  ;

add 
  :  '+' expr add
  ;
请注意,
(expr',)*
规定表达式的“列表”必须始终以逗号结尾。或许以下情况更为恰当:

(expr (',' expr)*)?
匹配ε或一个或多个用逗号分隔的
expr

请注意,左递归语法:

expr ::= expr '+' expr
      |  expr '-' expr
      |  expr '*' expr
      |  expr '/' expr
      |  '-' expr
      |  function
      |  INTEGER
      |  STRING
      |  IDENTIFIER
      |  '(' expr ')'
可译为:

expr
  :  addExpr
  ;

addExpr
  :  multExpr (('+' | '-') multExpr)*
  ;

multExpr
  :  unaryExpr (('*' | '/') unaryExpr)*
  ;

unaryExpr
  :  '-' atom
  |  atom
  ;

atom
  :  function
  |  INTEGER
  |  STRING
  |  IDENTIFIER
  |  '(' expr ')'
  ;

其中ANTLR没有问题(即不再有左递归)。

请注意,您的规则
“+”expr add
1+1
之类的字符串不匹配。