2013-07-01 31 views
1

在ANTLR4這將導致LINE_FOLD令牌被跳過:跳繩令牌這是ANTLR4語法的一部分

LINE_FOLD 
: CRLF WSP -> skip 
; 

但是,如果我這樣做:

ESCAPED_CHAR 
: '\\' LINE_FOLD? '\\' 
| '\\' LINE_FOLD? ';' 
| '\\' LINE_FOLD? ',' 
| '\\' LINE_FOLD? N 
; 

將它沒有返回ESCAPED_CHAR LINE_FOLD,如果不是,我該怎麼做?

回答

1

不,內部ESCAPED_CHAR,CRLF WSP不會是skip ped。 (4)最佳做法是在解析階段(在聽衆或訪客中)處理這些目標特定動作。

但是,您可以您的規則的,它放棄從ESCAPED_CHAR規則\\ CRLF WSP末尾添加一個目標特定塊:

ESCAPED_CHAR 
: '\\' LINE_FOLD? [\\;,nN] 
    { 
    String s = getText(); 
    setText(s.substring(s.length() - 1)); 
    } 
; 

假設你的詞法規則N比賽無論是'n''N'

現在的規則ESCAPED_CHAR只會產生令牌,其內容將是對的:\\;,n,或N

針說,這隻會與Java的目標。

+0

所以,如果我想堅持ANTLR4的最佳實踐,並將其放在一個監聽器中(正如我迄今爲止與監聽器一起構建的那樣),我將如何繼續通過上下文查找我的轉義字符和調整他們相應?我有一個TextContext,其中包含各種令牌...... – jgm

+0

恐怕沒有什麼比使用目標語言的內置字符串方法AFAIK手動替換這些字符了。您可能希望修剪[ANTLR討論組](https://groups.google.com/forum/#!forum/antlr-discussion)以查看是否存在(或曾經)討論過這樣的事情。如果沒有,你可以開始一個:) –