2012-03-26 42 views
1

一個Tcl嵌套字符串可以是這樣的:如何在ANTLR中編寫Tcl嵌套字符串規則?

{abc {xyz foo {hello world}}} 

以上括號用於包圍字符串的內容,它們不是字符串(類似雙引號)的一部分。

{abc {xyz foo\{\} {hello world}}} 

我有逃避一個沒有支架工作詞法規則:

NestedBraces 
    : '{' (~('{'|'}') | NestedBraces)* '}' 
    ; 

我試圖找到一個,他們可以使用"\{""\}"改變串"foo""foo{}"進行轉義在保持嵌套語法的同時添加轉義部分的方式,到目前爲止尚未成功。

回答

0

試試這個:

NestedBraces 
: '{' (~('{' | '}' | '\\') | '\\' ('{' | '}') | NestedBraces)* '}' 
; 

在內部循環,你匹配:

​​

如果你想要去除從令牌未逃脫括號中一氣呵成,像做此:

NestedBraces 
: Helper {setText($text.replaceAll("\\\\(.)|[{}]", "$1"));} 
; 

fragment Helper 
: '{' (~('{' | '}' | '\\') | '\\' ('{' | '}') | Helper)* '}' 
; 

這將創建具有內部文本"abc xyz foo{ hello world"令牌用於輸入"{abc {xyz foo\{ {hello world}}}"。請注意,您需要幫助程序規則:您不能在一個規則中執行替換也是遞歸調用。

+0

感謝。我使用的語法非常相似:{code} \ nNestedBraces \t:{{(EscapeBraces |〜('{'|'}')| NestedBraces){'}'; {code} – Benjamin 2012-03-28 01:07:54

+0

@ user995807,歡迎。 – 2012-03-28 09:13:28

0

謝謝,巴特。

無法在評論部分鍵入正確的代碼,所以我貼我的代碼在這裏:

NestedBraces 
: '{'(EscapeBraces | ~('{'|'}') | NestedBraces)* '}'; 
fragment 
EscapeBraces 
: '\\' 
    (
    '{' 
    | '}' 
    ) 
;