【发布时间】:2021-07-10 01:23:57
【问题描述】:
stm 和 stmList 给了我这个错误,似乎 ANTLR 将其视为可能的无限递归循环。我怎样才能避免它? 以下几组规则是相互左递归的[stmList]
stmList: stm stmList | ;
stm: ifStm | whStm;
ifStm: ifPart elifPart* elsePart?;
ifPart: IF LB exp RB CLB stmList CRB;
elifPart: ELIF LB exp RB CLB stmList CRB;
elsePart: ELSE CLB stmList CRB;
whStm: WHILE LB exp RB CLB stmList CRB;
LB: '(';
RB: ')';
CLB: '{';
CRB: '}';
WHILE: 'While';
IF: 'If';
ELIF: 'Elif';
ELSE: 'Else';
【问题讨论】:
-
stmList规则是右递归的。这里没有左递归。 -
但 ANTLR 显示该错误
-
@DuyDuy 可能是这样,但不符合您发布的规则。你把语法删减得太多了。如果您决定剥离代码/语法并将其发布在 SO 上,请始终确保仍在产生原始错误。我建议发布整个语法。
-
@BartKiers 你是对的。我还没有为已经被削减的 forStm 定义生产
标签: antlr left-recursion