У меня есть простой аспект 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.
\
Три токена (для части значения), которые я хотел бы в этом примере:
- 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 {").
Любая помощь будет принята с благодарностью.