JavaCCを利用して、「 -{ 」と「 }- 」で囲んだ文字列を取得する

JavaCCを利用して、「 -{ 」と「 }- 」で囲んだ文字列を取得する時の方法。
「 /* 」と「 */ 」に置き換えれば、C言語複数行コメントの中身を取得するときに利用できる。


SPECIAL_TOKENに、「 -{ 」と「 }- 」で囲まれる文字列を指定するのが肝要。SPECIAL_TOKENで指定したパターンにヒットした文字列は、その後にヒットしたTokenで
(Token名).specialToken.image
を呼び出すことで取得できる。


jjtファイル

options {
//(略)
    UNICODE_INPUT=true;      //日本語が扱えるようにUnicodeの入力にする
//(略)
}
//               (前略)
TOKEN: {
  <NATIVE_CODE_START: "-{" (" ")? >: NATIVE_CODE      // -{ にマッチ
}
<NATIVE_CODE> TOKEN : {
  <NATIVE_CODE_END: (" ")? "}-" >: DEFAULT            // }- にマッチ
}
<NATIVE_CODE> SPECIAL_TOKEN: {
  <NATIVE_CODE_BLOCK: (~["}"] | "}" ~["-"])+ >        // }- 以外にマッチ
}

//              (中略)

//ノード生成部
void NativeCodeBlock(): { Token t; } {
  // native code block is a SPECIAL_TOKEN, so we need to get it from NATIVE_CODE_END
  <NATIVE_CODE_START> t=<NATIVE_CODE_END> 
    { jjtThis.jjtSetValue(t.specialToken.image); } Type()
}

参考:
hlang/HLisp.jjt at 630a4a439f507729cc8c4833cd37e91e1b8e96f2 · hrehfeld/hlang · GitHub