首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么ANTLR不“过度减少”这个表达?

为什么ANTLR不“过度减少”这个表达?
EN

Stack Overflow用户
提问于 2016-05-12 10:01:24
回答 1查看 208关注 0票数 1

我有以下语法:

代码语言:javascript
复制
expr : factor op ;
op
    : '+' factor op
    | // Blank rule for left-recursion elimination
    ;

factor 
    : NUM
    | '(' expr ')'
    ;

NUM : ('0'..'9')+ ;

我提供2 + 3,使用expr作为开始规则。来自ANTLR的解析树是正确的;但是,我认为我误解了它使用的shift-reduce方法。

我预计会发生以下情况:

代码语言:javascript
复制
 Step # | Parse Stack   | Lookahead | Unscanned | Action
 1      |               | NUM       | + 3       | Shift
 2      | NUM           | +         | 3         | Reduce by factor -> NUM
 3      | factor        | +         | 3         | Shift a 'null'?
 4      | factor null   | +         | 3         | Reduce by op -> null
 5      | factor op     | +         | 3         | Reduce by expr -> factor op
 6      | expr          | +         | 3         | Shift
 7      | expr +        | NUM       |           | Shift
 8      | expr + NUM    |           |           | Reduce by factor -> NUM
 9      | expr + factor |           |           | ERROR (no production)

我希望在步骤3中会出现一个错误,在这个步骤中,解析器将shift一个null放到堆栈上,作为将因子“向上”放到expr的先决条件。

ANTLR是否只在严格“需要”时才移动null,因为最终的reduce将满足语法要求?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-12 12:20:10

在我看来,ANTLR不使用shift-reduce解析器;生成的解析器是递归下降的,使用任意数量的前瞻性。

解析器的步骤如下所示:

代码语言:javascript
复制
Rule          | Consummed | Input
--------------+-----------+------
expr          |           | 2 + 3
..factor      |           | 2 + 3
....NUM       | 2         | + 3
..op          | 2         | + 3
....'+'       | 2 +       | 3
....factor    | 2 +       | 3
......NUM     | 2 + 3     |
....op        | 2 + 3     |
......(empty) | 2 + 3     |

从我所读到的关于ANTLR的文章中,您可以通过对原始语法的以下更改获得相同的结果:

代码语言:javascript
复制
expr: factor op*;
op: '+' factor;
...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37183571

复制
相关文章

相似问题

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