负表达式ANTLR

时间:2016-10-15 21:15:10

标签: antlr antlr4

我正在写一个解析器,但我不知道为什么我无法解析它:

Proceso A
    varX <- - 4;
FinProceso

我正在

line 2:12 extraneous input '-' expecting {NEGOP, '(', '-', INT, DOUBLE, STRING, BOOL, ID}

这是我在ANTLR中的语法

Grammar

1 个答案:

答案 0 :(得分:0)

解释

您的语法包含两个匹配字符-的词汇: SUMOP NEG 。在你的情况下,词典总是会生成 SUMOP 词法,因为它是在 NEG 词法之前定义的。因此,永远不会使用规则 operatorUnary

SUMOP : ('+' | '-');
NEG : '-';

expr
    : expr SUMOP expr
    | operatorUnary expr
    ;

operatorUnary: '-';

解决方案

你应该设置你的词汇。例如,您可以删除 NEG lexem并仅使用 SUMOP lexem。

SUMOP : ('+' | '-');

expr
    : SUMOP expr           // higher precedence
    | expr SUMOP expr      // lower precedence
    ;

通常,最好使一元否定运算符的优先级高于二元加法和/或减法运算符。您可以通过更改规则 expr 替代方案的顺序来实现此目的。