2012-11-12 54 views
1

我正在學習ANTLR。比方說,我有一個VHDL代碼,並希望對PROCESS塊做一些處理。其餘的應該完全忽略。我不想描述整個VHDL語言,因爲我只對流程塊感興趣。所以我可以編寫一個匹配進程塊的規則。但是,如何告訴ANTLR僅匹配進程阻止規則並忽略其他任何內容?ANTLR:消除混亂

回答

3

我知道旁邊沒有VHDL,讓我們說你要更換所有單行註釋與多線(Java)的源文件註釋:

//foo 

應該變成:

/* foo */ 

當然,您需要讓詞法分析器匹配單行註釋。但是,你也應該確保它承認多行註釋,因爲你不希望//bar被確認爲單行註釋信息:

/* 
//bar 
*/ 

這同樣適用於字符串字面量:

String s = "no // comment"; 

最後,你應該在詞法分析器中創建一些可以匹配任何字符的全部規則。

一個快速演示:

grammar T; 

parse 
: (t=. {System.out.print($t.text);})* EOF 
; 

Str 
: '"' ('\\' . | ~('\\' | '"'))* '"' 
; 

MLComment 
: '/*' .* '*/' 
; 

SLComment 
: '//' ~('\r' | '\n')* 
    { 
    setText("/* " + getText().substring(2) + " */"); 
    } 
; 

Any 
: . // fall through rule, matches any character 
; 

如果你現在解析輸入這樣的:

//comment 1 
class Foo { 

    //comment 2 

    /* 
    * not // a comment 
    */ 
    String s = "not // a // comment"; //comment 3 
} 

以下將被打印到控制檯:

/* comment 1 */ 
class Foo { 

    /* comment 2 */ 

    /* 
    * not // a comment 
    */ 
    String s = "not // a // comment"; /* comment 3 */ 
} 

注意,這是隻是一個快速演示:在Java中的字符串文字可能包含Unicode轉義,我的演示不支持,以及我的演示也不處理字符文字(字符文字char c = '"';會打破它)。當然,所有這些事情都很容易解決。

+0

不客氣@Andy。 –

+0

Thanks @Bart。我想知道是否有可能使用符合「任何」規則的ANTLR數據進行捕獲?比如說,我想要捕捉兩個SLComment令牌之間的所有文本,怎麼可能? – user1552175