2010-12-08 23 views
0

我有DSL的一個簡單方面,我可以定義一個關鍵字和一個值作爲這樣的:如何處理JavaCC中的文本塊中的令牌?

mykey=\ 
    This is my $REF{useful} 
    multiline 
    string 
    where I terminate with a backslash 
    but I support escaped \\ characters 
    and I wish to handle the value part of this string 
    as 3 blocks in this example. 
\ 

的三個標記(爲值部分)我想在這個例子中是

  • ValueLiteral ==這是我
  • ValueReference == $ {REF有用}
  • ValueLiteral ==多等....

我定義的規則來進行價值這樣的:

void multiLineValue(): {} { 
    <BACKSLASH><EOL> 
    (
    valuePartLiteralMulti() | 
    valuePartRef() 
)* 
    <BACKSLASH> 
} 

這裏是我的多字符串類型令牌定義:

TOKEN : 
{ 
    < MULTILINE_STRING:( ((~["\\"]) 
    | ("\\" 
     (["\\", "'", "\"", "$", "n", "r", "t", "b", "f"] 
     | ["u", "U"]["+"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"] 
     ) 
    )))+> 
} 

我的問題是,我的多行字符串令牌類型也會消耗'$ REF {'字符的字符序列。

我想修改這個多行字符串,以便它在遇到非轉義的「$ REF {」(但會繼續讀取「\ $ REF {」序列)時停止使用字符。

任何援助將不勝感激。

回答

2

我不確定,但在您的令牌定義中,您還包括$(在unicode中?),也許您應該在beginnig中添加〜(「$」)(或unicode等效值)。

或者你可以使用syntatic LOOKAHEAD,像LOOKAHEAD(valuePartRef())...

附:你可以有多個REF嗎?