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".
观察 PREDICATE
和 VARCHARS
如何仍然是词法分析器规则(与句法规则相反),因为它们描述了词位是如何形成的。因此它遵循全部大写的命名约定(Antlr 不关心,但它提高了可读性)。
我知道这个问题已经被问过很多次了。我正在尝试使用 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".
观察 PREDICATE
和 VARCHARS
如何仍然是词法分析器规则(与句法规则相反),因为它们描述了词位是如何形成的。因此它遵循全部大写的命名约定(Antlr 不关心,但它提高了可读性)。