【问题标题】:ANTLR 4 : Bad grammar and 'no viable alternative at input'ANTLR 4:语法错误和“输入时没有可行的替代方案”
【发布时间】:2013-01-31 10:03:28
【问题描述】:

我正在使用这样的 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]

我认为我的语法有错误,但我没有看到。 你有什么想法吗?

为了您的帮助, 提前致谢。

【问题讨论】:

    标签: parsing antlr grammar token antlr4


    【解决方案1】:

    您的INT 规则应该是fragment 规则。照原样,表达式M1==2 被标记为 [MEASURE, COMP, INT] 而不是您所期望的 [MEASURE, COMP, REAL]。

    fragment INT : [0-9]+;
    

    【讨论】:

    • 太棒了。 fragment 关键字要求的一个很好的例子。当 AntrWorks 突出显示图形输出中的错误时,这将是一个很好的补充。
    • 您好,Sam 先生,很抱歉打扰您,但是请您看看我这里关于用 unicode 编写规则名称的问题(规则名称而不是规则正文),谢谢 =) stackoverflow.com/questions/30614712/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-14
    • 1970-01-01
    相关资源
    最近更新 更多