5

最近、The Definitive ANTLR Referenceを購入しました。ANTLR を使い始めることに興奮しています。
最初の章では、この文法が示されています。

grammar T;

options {
    language = Java;
}

r : 'call' ID ';' {System.out.println("invoke " + $ID.text);} ;
ID : 'a'..'z'+ ;
WS : (' '|'\n'|'\r')+   {$channel=HIDDEN;} ;

この文法をファイル (.g 拡張子) にコピーし、レクサーとパーサーを生成し、次のようなメイン クラスを作成しました。

import org.antlr.runtime.*;

public final class Test {
    public static void main(String[] args) throws Exception {
        ANTLRInputStream input = new ANTLRInputStream(System.in);
        TLexer lexer = new TLexer(input);
        CommonTokenStream tokens = new CommonTokenStream(lexer);
        TParser parser = new TParser(tokens);

        parser.r();
    }
}

実際のエラーはありませんが、メイン クラスを実行して次のように入力すると、次のようになります。

call foo;

何も起こりません。画面に「invoke foo」と出力されるはずですが、何も起こりません。演習を 1 つも完了せずに本を読み進めたくありません。問題があれば、EclipseでANTLR 3.4を使用しています。これが簡単な質問のように思える場合は申し訳ありませんが、ANTLR は初めてです。

ありがとう、
オマー

4

1 に答える 1

6

EOF 文字を入力する必要があります。

UNIX ベースのシステムの場合はCtrl-D.

Windows ベースのシステムの場合はCtrl-Z.

編集

コンソール経由で入力を入力しており、ANTLR はデータをストリームとして読み取っているため、EOF が必要です。この本の後半では、ファイルを介してデータを入力し、ファイルの EOF でストリームを終了します。入力をファイルに保存し、ファイルからの入力をコマンドにパイプすることもできます。

于 2012-05-03T01:07:41.757 に答える