【问题标题】:Antlr4 parse number failedAntlr4解析号码失败
【发布时间】:2017-12-07 18:49:54
【问题描述】:

我正在尝试使用 antlr4 解析数字(双精度和整数),但未能成功。希望有人可以帮助我。

我的测试代码是:

public class TestAntlr4 {

    @Test
    public void test() throws IOException {
        String input = "30";

        CharStream inputCharStream = new ANTLRInputStream(new StringReader(input));
        // create a lexer that feeds off of input CharStream
        TokenSource tokenSource = new GqlLexer(inputCharStream);
        // create a buffer of tokens pulled from the lexer
        TokenStream inputTokenStream = new CommonTokenStream(tokenSource);

        // create a parser that feeds off the tokens buffer
        TestAntlr4Parser parser = new TestAntlr4Parser(inputTokenStream);

        parser.removeErrorListeners(); // remove ConsoleErrorListener
        parser.addErrorListener(new VerboseListener());

        parser.getInterpreter().setPredictionMode(PredictionMode.LL_EXACT_AMBIG_DETECTION);

        NumberContext context = parser.number();

        System.out.println(context.toString());
    }
}

我的antlr4语法是:

grammar TestAntlr4 ;


number
    : INT_NUMBER
    | DOUBLE_NUMBER ;

DOUBLE_NUMBER
    : ('+'|'-')? INTEGER '.' INTEGER? ;

INT_NUMBER
    : ('+'|'-')? INTEGER ;

WS
    : [ \t\r\n]+ -> skip ; // skip spaces, tabs, newlines

fragment INTEGER
    : '0'
    | '1'..'9' ('0'..'9')* ;

fragment DIGIT
    : [0-9] ;

结果是:

rule stack: [number]
line 1:0 at [@0,0:1='30',<31>,1:0]: mismatched input '30' expecting {DOUBLE_NUMBER, INT_NUMBER}
[]

谁能告诉我这有什么问题?

【问题讨论】:

  • 查看下面的更新答案。

标签: parsing antlr4


【解决方案1】:

语法似乎没问题。输入“30”对我来说词法和解析很好:

[@0,0:1='30',<INT_NUMBER>,1:0]
[@1,2:1='<EOF>',<EOF>,1:2]

也尝试过双重:

[@0,0:6='30.3343',<DOUBLE_NUMBER>,1:0]
[@1,7:6='<EOF>',<EOF>,1:7]

解析就好了。

现在,在我的环境中,我使用的是 C# 目标,所以我的代码与你的有点不同。

我的 (C#) 代码使用访问者模式:

                AntlrInputStream inputStream = new AntlrInputStream(stream);
                Grammar1Lexer lexer = new Grammar1Lexer(inputStream);
                CommonTokenStream tokenStream = new CommonTokenStream(lexer);
                Grammar1Parser parser = new Grammar1Parser(tokenStream);
                IParseTree tree = parser.number(); 
                Grammar1Visitor visitor = new Grammar1Visitor();
                visitor.Visit(tree);

编译并运行良好。

更新:

我注意到您的词法分析器和解析器的名称不同,您能遇到简单的复制/粘贴错误吗?通常,当您生成类时,所有类都根据您的语法名称统一命名。

【讨论】:

  • 感谢您的快速响应,您确实解决了我的问题。实际上我在实际项目中遇到了一个antrl4问题,我简单的语法进行测试但是在复制和修改单元测试代码时出现错误。不错的观察!当我更正 Lexer 时,它起作用了: > TokenSource tokenSource = new TestAntlr4Lexer(inputCharStream);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多