2012-07-09 3 views
1

파일의 일부를 무시하고 싶은 파일이 있습니다. Lexer에서 필자는 파일의 흥미롭지 않은 부분에 대한 토큰을 만드는 것을 피하기 위해 gated semantic predicates를 사용한다. 내 규칙은 다음과 유사합니다.Antlr 불필요한 조건이 필요합니까?

A 
: {!ignore}?=> 'A' 
; 
START_IGNORE 
: 'foo' {ignore = true; skip();} 
; 
END_IGNORE 
: 'oof' {ignore = false; skip();} 
; 
IGNORE 
: {ignore}?=> . {skip();} 
;  

그러나

A 
: {!ignore}?=> 'A' 
; 
START_IGNORE 
: {true}?=> 'foo' {ignore = true; skip();} 
; 
END_IGNORE 
: {true}?=> 'oof' {ignore = false; skip();} 
;  
IGNORE 
: {ignore}?=> . {skip();} 
; 

이유는 술어를 추가해야합니까 .. 내가 START 변경하고 END는 또한 작동하지 않습니다 (아래로) 의미 술어를 사용하지 않는?

편집 : 내가 사용하고 ANTLR-3.4

답변

1

이유는 술어를 추가해야합니까?

그렇지 않습니다. 적어도, ANTLR v3.3을 사용하지 마십시오. 나 do not know 정확히 테스트하고 있지만 ANTLRWorks의 인터프리터 나 Eclipse ANTLR IDE 플러그인을 사용하지 마십시오. 항상 명령 행에서 조금 테스트 해보십시오. 이 같은

grammar T; 

@parser::members { 
    public static void main(String[] args) throws Exception { 
    TLexer lexer = new TLexer(new ANTLRStringStream("A foo A B C oof A")); 
    TParser parser = new TParser(new CommonTokenStream(lexer)); 
    parser.parse(); 
    } 
} 

@lexer::members { 
    private boolean ignore = false; 
} 

parse 
: (t=. 
    {System.out.printf("[\%02d] type=\%s text='\%s'\n", $t.getCharPositionInLine(), tokenNames[$t.type], $t.text);} 
    )* EOF 
; 

A 
: {!ignore}?=> 'A' 
; 

START_IGNORE 
: 'foo' {ignore = true; skip();} 
; 

END_IGNORE 
: 'oof' {ignore = false; skip();} 
; 

IGNORE 
: {ignore}?=> . {skip();} 
;  

SPACE 
: ' ' {skip();} 
; 

실행을 :

java -cp antlr-3.3.jar org.antlr.Tool T.g 
javac -cp antlr-3.3.jar *.java 
java -cp .:antlr-3.3.jar TParser

다음을 인쇄합니다 :

[00] type=A text='A' 
[16] type=A text='A'

즉 : 입력 다음 "A foo A B C oof A"에서는 : "foo A B C oof"skip PED이다.

+0

필자는 이클립스 플러그인을 사용하여 컴파일하지만 플러그인이 제공하는 인터프리터는 사용하지 않습니다. 명령 줄에서 컴파일하기 이전과 같은 결과를 얻었으므로 코드에 이상한 점이 있습니다. 보통 내가 가진 해결책으로 살 것이지만 몇 가지 다른 문제가 있습니다. 행동을 일으키는 것을 찾으려고 노력할 것입니다. –

+0

@HeinrichOdy, v3.4를 사용하는 경우 v3.3으로 되돌아가보십시오. 내 경험상 v3.3의 문제가 적습니다. –

+0

내가 쉽게 버전을 변경할 수 있는지 여부를 볼 것이며, 그렇다면 3.3을 시도합니다, 감사합니다. –