Antlr Lexer Parse错误

时间:2015-06-24 13:23:13

标签: c# antlr antlr3

Antlr版本:antlr-dotnet-tool-3.5.0.2

TestGrammar.g

lexer grammar TestGrammar;

options
{
    language=CSharp3;   
    backtrack=true; 
}

DOT
    :   '.'
    ;

NUMBER
    :   ( '0'..'9' )+ ('.' ( '0'..'9' )+)?
    ;

WS  
    : (' '|'\r'|'\t'|'\u000C'|'\n') {$channel=Hidden;}
    ;

C#代码:

        var lexer = new TestGrammar(new ANTLRStringStream("2..3"));
        while (true)
        {
            var token = lexer.NextToken();
            Console.WriteLine(token);

            if (token.Type == -1)
                break;
        }

结果:

[@-1,3:3='3',<5>,1:3]
[@-1,4:4='<EOF>',<-1>,1:4]

所以,我用输入

测试这个语法
2..3

我希望结果如下:

NUMBER["2"] DOT["."] DOT["."] NUMBER["3"]

那么,我做错了什么?谢谢!

1 个答案:

答案 0 :(得分:0)

使用Java目标进行测试:

TestGrammar lexer = new TestGrammar(new ANTLRInputStream("2..3"));

for (Token t : lexer.getAllTokens()) {
  System.out.printf("%s -> %s\n", t.getText(), TestGrammar.VOCABULARY.getSymbolicName(t.getType()));
}

产生以下输出:

2 -> NUMBER
. -> DOT
. -> DOT
3 -> NUMBER

所以,语法是正确的。我怀疑C#运行时会产生除我发布的内容以外的任何内容(使用C#等效测试类)。如果它仍然无效,请编辑您的问题并添加一些代码,演示如何重现您获得的错误。