2010-12-08 63 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吗?