2010-03-09 13 views

Odpowiedz

8

To może być obsługiwane za pomocą semantic predicate.

Najpierw napisz gramatykę w taki sposób, aby nie miało znaczenia, jak długie są twoje linie. Przykładem może wyglądać następująco:

grammar Test; 

parse 
    : line* EOF 
    ; 

line 
    : Char+ (LineBreak | EOF) 
    | LineBreak // empty line! 
    ; 

LineBreak : '\r'? '\n' | '\r' ; 
Char  : ~('\r' | '\n') ; 

a następnie dodać „orzeczenie” z reguły line:

grammar Test; 

@parser::members { 
    public static void main(String[] args) throws Exception { 
     String source = "abcde\nfghij\nklm\nnopqrst"; 
     ANTLRStringStream in = new ANTLRStringStream(source); 
     TestLexer lexer = new TestLexer(in); 
     CommonTokenStream tokens = new CommonTokenStream(lexer); 
     TestParser parser = new TestParser(tokens); 
     parser.parse(); 
    } 
} 

parse 
    : line* EOF 
    ; 

line 
    : (c+=Char)+ {$c.size()<=5}? (LineBreak | EOF) 
    | LineBreak // empty line! 
    ; 

LineBreak : '\r'? '\n' | '\r' ; 
Char  : ~('\r' | '\n') ; 

c+=Char będzie skonstruować ArrayList zawierający wszystkie znaki w linii. {$c.size()<=5}? powoduje rzucić wyjątek, gdy przekątna ArrayList „s przekracza 5.

Dodałem też główną metodą w parsera, dzięki czemu można go przetestować siebie:

// *nix/MacOSX 
java -cp antlr-3.2.jar org.antlr.Tool Test.g 
javac -cp antlr-3.2.jar *.java 
java -cp .:antlr-3.2.jar TestParser 

// Windows 
java -cp antlr-3.2.jar org.antlr.Tool Test.g 
javac -cp antlr-3.2.jar *.java 
java -cp .;antlr-3.2.jar TestParser 

który będzie wyjściowe:

line 0:-1 rule line failed predicate: {$c.size()<=5}? 

HTH

Powiązane problemy