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';发布于 2021-04-15 07:08:34
这可能是因为stmList中的alt为空,但我也想知道为什么会出现这个错误。这看起来不太对。但是,我建议无论如何不要使用空alts,除非您使用谓词来保护其他alt(s),并无条件地“调用”包含的规则。当你忘记这一点时,这很容易导致问题。相反,删除空的alt并使调用成为可选的:
stmList: stm stmList;
elsePart: ELSE CLB stmList? CRB;此外,stmList看起来很像在yacc中执行这样的定义,在这里不可能有EBNF后缀。相反,只需写:
stmList: stm+;
https://stackoverflow.com/questions/67101143
复制相似问题