2017-07-04 11 views
2

number(doubleとinteger)を解析するのにantlr4を使用しようとしていますが、失敗します。誰かが私を助けることを願っています。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} 
[] 

誰もがこれで間違っているものを私に伝えることができますか?

+0

下記の更新された回答をご覧ください。 – TomServo

答えて

1

文法は大丈夫です。 Lexesと入力して私のために細かい解析し、 "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); 

コンパイルとはうまく動作します。

UPDATE:

私はあなたのレクサーとパーサーが異なっ命名されていることに気づいた、あなたは単純なコピー/貼り付けエラーが発生しているだろうか?通常、クラスを生成するときは、すべてが文法の名前に基づいて一様に名前が付けられます。

+0

お返事ありがとうございました。私の問題は本当に解決しました。実際に私の実際のプロジェクトではantrl4の問題が発生しました。テスト用の文法は単純ですが、ユニットテストコードをコピーして変更する際に間違いがあります。ニースの観察!レクサーを修正すると、それは動作します:> TokenSource tokenSource = new TestAntlr4Lexer(inputCharStream); – arganzheng

関連する問題