2010-03-09 5 views

답변

8

이는 semantic predicate를 사용하여 처리 할 수 ​​있습니다.

처음에는 문장 길이에 상관없이 문법을 작성하십시오. line 규칙에 "조건"을 추가 한 후

grammar Test; 

parse 
    : line* EOF 
    ; 

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

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

과 :

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를 구성합니다 예는 다음과 같을 것입니다.

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

하는 출력 : :

{$c.size()<=5}?ArrayList의 크기는 당신이 스스로를 테스트 할 수 있도록 5.

가 나는 또한 파서의 주요 방법을 추가 초과하는 경우 예외를 발생시킨다

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

HTH

관련 문제