9
ANTLR을 사용하여 254자를 초과 할 수없는 행을 포함하는 파일 형식을 지정하고 있습니다 (줄 끝은 제외). 어떻게 일을 부족의 문법이 인코딩 않습니다ANTLR에서 반복 횟수를 어떻게 지정합니까?
line : CHAR? CHAR? CHAR? CHAR? ... (254 times)
ANTLR을 사용하여 254자를 초과 할 수없는 행을 포함하는 파일 형식을 지정하고 있습니다 (줄 끝은 제외). 어떻게 일을 부족의 문법이 인코딩 않습니다ANTLR에서 반복 횟수를 어떻게 지정합니까?
line : CHAR? CHAR? CHAR? CHAR? ... (254 times)
이는 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