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
之类的字符串不匹配。