ANTLR语法相互左递归

时间:2017-11-07 08:57:01

标签: antlr antlr4

我知道这个问题已被问过很多次了。我正在尝试使用ANTLR构建语法。

Predicate           : LOWERCASE | Predicate VarChars ;

VarChars            : LOWERCASE | UPPERCASE;

fragment LOWERCASE  : [a-z] ;   

fragment UPPERCASE  : [A-Z] ;

我收到以下错误:"以下几组规则是相互左递归的[谓词]"

请告诉我这是如何修复的。如何删除我的antlr语法中的相互左递归。

1 个答案:

答案 0 :(得分:0)

完全摆脱“谓词”的递归出现。仅VarChars就足以表示小写或大写。使用+后缀表示“一个或多个实例”:

fragment LOWERCASE : [a-z];   
fragment UPPERCASE : [A-Z];

VARCHARS  : LOWERCASE | UPPERCASE;
PREDICATE : LOWERCASE VARCHARS+;

应用于您的示例,这将取消“p”和“PA”作为谓词的资格,并且符合“pA”。

观察PREDICATEVARCHARS如何仍然是词法规则(与句法规则相对),因为它们描述了词汇的形成方式。因此它遵循全大写命名约定(Antlr不关心,但它提高了可读性)。