2012-05-02 16 views
5

Niedawno kupiłem The Definitive ANTLR Reference i jestem podekscytowany rozpoczęciem korzystania z ANTLR.
W pierwszym rozdziale, to gramatyka jest pokazany:Ostateczny ANTLR Reference - Pierwszy program nie działa

grammar T; 

options { 
    language = Java; 
} 

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

skopiowałem tę gramatykę w dół do pliku (rozszerzenie .g) wygenerował Lexer i Parser i stworzył główne klasy tak:

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(); 
    } 
} 

Nie istnieją żadne realne błędy, ale gdy uruchamiam główną klasę i wpisać:

call foo; 

Nic się nie dzieje. "invoke foo" powinno być wyprowadzane na ekran, ale nic się nie dzieje. Nie chcę kontynuować tej książki, nie wykonując żadnego ćwiczenia. Używam ANTLR 3.4 w Eclipse, jeśli to ma znaczenie. Przepraszam, jeśli wydaje się to łatwym pytaniem, ale jestem nowy w ANTLR.

Dzięki,
Omer

+1

Witamy w ANTLR. Twoje pytanie jest bardzo ważne dla początkujących. –

+0

Czy wprowadziłeś znak końca pliku, jak zapisano w książce? –

+0

Nie, nigdy o tym nie myślałem. Czy w systemie Windows to \ n, \ r lub \ r \ n? Lub po prostu naciśnij przycisk Enter? – leaf

Odpowiedz

6

Trzeba wprowadzić znak EOF.

W systemach z systemem UNIX jest to Ctrl-D.

W przypadku systemów opartych na Windows jest to Ctrl-Z.

EDIT

Ponieważ wchodzimy wejście za pośrednictwem konsoli, a ANTLR odczytuje dane w postaci strumienia, potrzebuje EOF. W dalszej części książki będziesz wprowadzał dane za pośrednictwem pliku, a plik EOF zakończy strumień. Możesz również zapisać dane wejściowe w pliku, a następnie wprowadzić dane wejściowe z pliku do polecenia.