我知道这个问题已被问过很多次了。我正在尝试使用ANTLR构建语法。
Predicate : LOWERCASE | Predicate VarChars ;
VarChars : LOWERCASE | UPPERCASE;
fragment LOWERCASE : [a-z] ;
fragment UPPERCASE : [A-Z] ;
我收到以下错误:"以下几组规则是相互左递归的[谓词]"
请告诉我这是如何修复的。如何删除我的antlr语法中的相互左递归。
答案 0 :(得分:0)
完全摆脱“谓词”的递归出现。仅VarChars就足以表示小写或大写。使用+后缀表示“一个或多个实例”:
fragment LOWERCASE : [a-z];
fragment UPPERCASE : [A-Z];
VARCHARS : LOWERCASE | UPPERCASE;
PREDICATE : LOWERCASE VARCHARS+;
应用于您的示例,这将取消“p”和“PA”作为谓词的资格,并且符合“pA”。
观察PREDICATE
和VARCHARS
如何仍然是词法规则(与句法规则相对),因为它们描述了词汇的形成方式。因此它遵循全大写命名约定(Antlr不关心,但它提高了可读性)。