キーと値を次のように定義できる DSL の単純な側面があります。
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. \
この例で必要な 3 つのトークン (値の部分) は次のとおりです。
- ValueLiteral == これは私のものです
- ValueReference == $REF{便利}
- ValueLiteral == 複数行など....
値のルールを次のように定義しました。
void multiLineValue(): {} {
< BACKSLASH >< EOL >
(
valuePartLiteralMulti() |
valuePartRef()
)*
< BACKSLASH >
}
複数行の文字列型の TOKEN 定義は次のとおりです。
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{" シーケンスを超えて読み続けます)。
どんな援助でも大歓迎です。