首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ANTLR中的左递归

ANTLR中的左递归
EN

Stack Overflow用户
提问于 2021-04-15 01:47:50
回答 1查看 71关注 0票数 1

stmstmList给了我这个错误,看起来ANTLR把它看作是一个可能的无限递归循环。如何避免这种情况呢?下面的规则集是相互左递归的stmList

代码语言:javascript
复制
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';
EN

回答 1

Stack Overflow用户

发布于 2021-04-15 07:08:34

这可能是因为stmList中的alt为空,但我也想知道为什么会出现这个错误。这看起来不太对。但是,我建议无论如何不要使用空alts,除非您使用谓词来保护其他alt(s),并无条件地“调用”包含的规则。当你忘记这一点时,这很容易导致问题。相反,删除空的alt并使调用成为可选的:

代码语言:javascript
复制
stmList: stm stmList;
elsePart: ELSE CLB stmList? CRB;

此外,stmList看起来很像在yacc中执行这样的定义,在这里不可能有EBNF后缀。相反,只需写:

stmList: stm+;

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67101143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档