Я пытаюсь представить строки языка BYOND DM в форме лексера (см. http://byond.com и http://byond.com/docs/ref). Вот правила для строк:
- Строканачинаются и заканчиваются двойными кавычками, т. е.
"hello world"
оценивается как hello world
- Обратная косая черта действует как escape-символ, который может экранировать конечную кавычку, т. е.
"hello\"world"
оценивается как hello"world
- Новые строки в строке можно игнорировать, заканчивая строку обратной косой чертой, т. Е.
"hello\
world"
оценивается как helloworld
- Если строка открывается / закрывается с последовательностью
{"
/ "}
соответственно,символы новой строки разрешены и введены в окончательную строку. Последовательность \\\n
по-прежнему игнорируется - Строка может содержать встроенные выражения внутри фигурных скобок, которые отформатированы в результате. Обратные косые черты могут экранировать открывающую фигурную скобку, т.е.
"hello [ "world" ] \["
во время выполнения оценивается как hello world [
. Любое выражение может быть заключено в фигурные скобки (вызовы, математика и т. д.) - Если начальная кавычка / фигурная скобка начинаются с escape-последовательности «@» и вставляютсяexpressions отключены для строки.т. е.
@{"hello [worl\d"}
и @"hello [worl\d"
оцениваются как hello [worl\d
Я пытаюсь создать правила лексера ANTLR4 .g4 для токенизации этих строк.Я полагаю, что мне нужно 4 (или более) типа токенов:
- Обычная строка.т.е.
"hello world"
, @"hello world"
, @{"hello world"}
или {"hello world"}
- Строка начинается перед вложенным выражением.т.е.
"hello [
или {"hello [
- Конец строки после встроенного выражения.т.е.
] world"
или ] world"}
- Строка между двумя встроенными выражениями.то есть
] hello world [
Вот мои (неполные и неудачные) попытки:
LSTRING: '"' ('\\[' | ~[[\r\n])* '[';
RSTRING: ']' ('\\"' | ~["\r\n])* '"';
CSTRING: ']' ('\\[' | ~[[\r\n])* '[';
FSTRING: '"' ('\\"' | ~["\r\n])* '"';
Если это не может быть решено в лексере, я могу написать правила парсера намои собственные с токенами @
, {"
, "}
, [
, ]
, \\
и "
.Но, думаю, я бы попробовал, потому что это было бы более производительно.