2010-03-09 17 views

cevap

8

Bu semantic predicate kullanılarak ele alınabilir.

Önce gramerinizi, satırlarınızın ne kadar uzun olduğu önemli olmayacak şekilde yazın. line kuralına "yüklemi" ekleyin sonra

grammar Test; 

parse 
    : line* EOF 
    ; 

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

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

ve:

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 doğrultusunda tüm karakterleri içeren bir ArrayList inşa edecek bir örnek şu şekilde görünecektir.

// *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 

hangi çıktısı::

{$c.size()<=5}? ArrayList 'ın boyutu kendiniz test edebilirsiniz böylece 5.

Ben de ayrıştırıcı bir ana yöntem eklendi aştığında bir özel durum neden olur

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

HTH

İlgili konular