2017-04-02 17 views
0
BLOCK_COMMENT : '/*' .*? '*/' -> skip; 
EOL_COMMENT : '//' ~[\r\n]* -> skip; 
WS: [ \n\t\r]+ -> skip; 

program: usingDirectives? EOF; 

usingDirectives: usingDirective+; 

usingDirective: USING 
     fullyQualifiedType 
     (usingAlias | USING_ALL)? 
     END; 

USING: 'using'; 

fullyQualifiedType: identifier (DOT identifier)*; 

identifier: (LETTER | UNDERSCORE) 
     (LETTER | DIGIT | UNDERSCORE)*; 

DOT: '.'; 

usingAlias: AS identifier; 

USING_ALL: '.*'; 

AS: 'as'; 

END: ';'; 

LETTER: [a-zA-Z]; 

DIGIT: [0-9]; 

UNDERSCORE: '_'; 

これは私の文法です。Antlr4 - 識別子を単一のトークンとして一致させる

using IO.Console.Print as Print; 
using IO.Console; // same as using IO.Console as Console; 
using IO.Console.*; 

これは私のテストデータです。

文法は意図どおりに動作しますが、識別子の各文字は単一のトークンになりますが、これは少し役に立たないものです。

私は、識別子レクサー・ルール(識別子)を作成しようとした場合、テストを実行しているとき、私は、次のエラーを取得する:

line 1:23 extraneous input 'as' expecting {'.', '.*', 'as', ';'} 

私は識別子は唯一のこと持ってしようとした場合でも、[-はZa - Z]、サブルールなしで、同じことが起こります。

問題がある場合は、Python3をターゲット言語として使用しています。 Antlrを使った私の最初のプロジェクトであるので、他のルーキーの間違いも指摘してください。ありがとう!

答えて

0

今では、識別子の代わりに識別子に適した文字の集合を生成するようにレクサーに指示します。単純化された文法(レクサーとパーサ)以下のあなたのために働く必要があります。

grammar test; 

root 
    : identifier*; 

identifier 
    : IdentifierChars; 

IdentifierChars 
    : [a-zA-Z0-9_]+; 

WhiteSpace 
    : [ \r\n\t]+ -> skip; 

はここで私がチェックするために使用するサンプルJavaコードです:

abc 
a0bc 
a_bc 

InputStream input = IntegrationMain.class.getResourceAsStream("test.txt"); 
    ANTLRInputStream inputStream = new ANTLRInputStream(input); 
    TokenSource tokenSource = new testLexer(inputStream); 
    CommonTokenStream tokenStream = new CommonTokenStream(tokenSource); 
    testParser parser = new testParser(tokenStream); 
    testParser.RootContext root = parser.root(); 

    root.identifier().forEach(identifier -> System.out.println(identifier.getText())); 

、ここでは、標準出力からの結果であります

+0

ありがとうございます。私はあなたのアドバイスを受け、文法を単純化しました。また、Antlrの仕組みについての私の基本的な理解が欠けていたことが判明しました。ルールの順序が重要であり、パーザの規則の前にレクサーのルールがすべて評価されたことを理解したら、すべてが意味をなさないようになった。 – MackThax

+0

あなたの問題を解決するのを助けてくれてうれしい。 – Yevgeniy

関連する問題