2010-03-09 2 views
9

Я использую ANTLR для указания формата файла, который содержит строки, которые не могут превышать 254 символа (за исключением окончаний строк). Как закодировать это в граммному короткий делать:В ANTLR, как вы указываете определенное количество повторений?

line : CHAR? CHAR? CHAR? CHAR? ... (254 times) 

ответ

8

Это может быть обработано с помощью semantic predicate.

Сначала напишите свою грамматику таким образом, чтобы не иметь значения, как долго ваши строки. Примером может выглядеть следующим образом:

grammar Test; 

parse 
    : line* EOF 
    ; 

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

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

, а затем добавить «предикат» к 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 построит ArrayList, содержащий все символы в строке. {$c.size()<=5}? вызывает бросить исключение, когда размер ArrayList «s превышает 5.

Я также добавил главный метод в парсер, так что вы можете проверить это сами:

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

, которые будут выводить:

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

HTH

Смежные вопросы