为什么没有ANTLR"过度减少"这个表达?

时间:2016-05-12 10:01:24

标签: parsing antlr antlr4 lr

我有以下语法:

expr : factor op ;
op
    : '+' factor op
    | // Blank rule for left-recursion elimination
    ;

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

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

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

我希望以下情况发生:

 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放到堆栈上作为reduce因素的先决条件&#34 ;最多"到expr

ANTLR只会严格按null {"}"因为结果reduce会满足语法吗?

0 个答案:

没有答案