2012-07-09 57 views
1

我有一個文件,我想忽略它的一部分。在Lexer中,我使用門控語義謂詞來避免爲文件的無趣部分創建令牌。我的規則類似於以下內容。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();} 
; 

爲什麼我添加的謂詞?

編輯:我使用ANTLR-3.4

回答

1

爲什麼我添加的謂詞?

你不知道。至少,不使用ANTLR v3.3。我不知道你正在測試的是,但不要使用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

我使用Eclipse插件編譯等,但不是插件提供的解釋器。從命令行編譯我得到了和以前相同的結果,所以在我的代碼中有一些奇怪的東西。通常我會接受我得到的解決方案,但還有其他一些問題。我會盡力找出造成這種行爲的原因。 – 2012-07-09 20:40:21

+0

@HeinrichOdy,如果您使用的是v3.4,請嘗試恢復到v3.3:根據我的經驗,v3.3的問題較少。 – 2012-07-09 20:43:55

+0

請看我是否可以輕鬆更改版本,如果是的話,會嘗試3.3,謝謝。 – 2012-07-09 20:49:23