ANTLR语法互左递归

ANTLR Grammar Mutually Left Recursive

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

Predicate           : LOWERCASE | Predicate VarChars ;

VarChars            : LOWERCASE | UPPERCASE;

fragment LOWERCASE  : [a-z] ;   

fragment UPPERCASE  : [A-Z] ;

我收到以下错误:"The following sets of rules are mutually left-recursive [Predicate]"

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

完全摆脱 "Predicate" 的递归出现。仅 VarChars 就足以表示小写或大写。使用+后缀表示"one or more instances":

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

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

应用于您的示例,这将取消 "p" 和 "PA" 作为谓词的资格,并限定 "pA".

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