ANTLR 4: плохая грамматика и «нет жизнеспособной альтернативы при вводе»

Я использую ANTLR 4 вот так:

import org.antlr.v4.runtime.ANTLRInputStream;
import org.antlr.v4.runtime.CharStream;
import org.antlr.v4.runtime.CommonTokenStream;
import org.antlr.v4.runtime.TokenStream;

public class Builder
{
    public static void main(String[] args)
    {
        CharStream input = new ANTLRInputStream("ON M1==2 && M3 == 5 && (M2 > 1 || M5 <= 5.0) "
                                              + "DO P5:42 P4:10");
        ExprLexer lexer = new ExprLexer(input);
        TokenStream tokens = new CommonTokenStream(lexer);
        ExprParser parser = new ExprParser(tokens);
        ExprParser.ExpressionContext uu = parser.expression();
        for (int i = 0; i < uu.getChildCount(); ++i)
            System.out.println(uu.getChild(i));
    }
}

И следующая грамматика:

grammar Expr;
options
{
  // antlr will generate java lexer and parser
  language = Java;

}
WS      : [ \t\r\n]+ -> skip ;
OP      : '&&' | '||';
COMP    : '==' | '<' | '>' | '<=' | '>=' | '!=';
INT     : [0-9]+;
REAL    : INT '.' INT | INT;

ACTION  : 'P' INT ':' INT;
MEASURE : 'M' INT;

// ***************** parser rules:
cond       : MEASURE COMP REAL;
condexpr   : '(' condexpr ')' | cond OP condexpr | cond;
actionexpr : ACTION actionexpr | ACTION;
expression : 'ON' condexpr 'DO' actionexpr;

У меня такой вывод:

line 1:7 no viable alternative at input 'M1==2'
ON
[29]
DO
[31]

Думаю, у меня есть ошибка в грамматике, но я ее не вижу. Есть идея?

За вашу помощь, заранее спасибо.


person GlinesMome    schedule 31.01.2013    source источник


Ответы (1)


Ваше INT правило должно быть fragment правилом. Как есть, выражение M1==2 токенизируется как [MEASURE, COMP, INT] вместо [MEASURE, COMP, REAL], как вы ожидаете.

fragment INT : [0-9]+;
person Sam Harwell    schedule 31.01.2013
comment
Блестяще. Хороший пример требования для ключевого слова fragment. Это было бы отличным дополнением для AntrWorks, чтобы указать, когда он выделяет ошибки в графическом выводе. - person Brent Faust; 14.10.2014
comment
Здравствуйте, мистер Сэм, извините за беспокойство, но не могли бы вы взглянуть на мою проблему здесь относительно записи имени правила в юникоде (имя правила, а не тело правила) и спасибо =) stackoverflow.com/questions/30614712/ - person Khaled Hassan; 03.06.2015