В настоящее время я разрабатываю синтаксический анализатор для старого проприетарного языка разметки, который должен быть преобразован в новый стандарт. Для этого я использую ANTLR 4.
Структура состоит из блоков, разделенных определенным c стартером и его относительным ограничителем (например, {
... }
, <
. .. >
, INPUT
... END
). Внутри каждого блока элементы указываются в строках, разделенных символами новой строки; на самом деле, только где-то эти новые строки нужны, чтобы понять, что означает код.
Например:
< ID
SOME_VAR "optional modifier string"
$anEnvironmentVariable
"a constant string"
"another constant" "with its optional modifier"
>
Правило парсера, подобное следующему
field
: OPEN_ANGLED_BRACKET row_id
((ENVIRONMENT_VAR | DQUOTE_STR | VAR) DQUOTE_STR?)+
CLOSED_ANGLED_BRACKET
;
// [...]
WHITESPACE
: [ \t\r\n] -> skip
;
, может легко проанализировать приведенный выше пример, но поскольку новые строки игнорируются, он не может различить guish, если строка в двойных кавычках является константой (что означает, что она находится в начале строки) или строкой модификатора (которая следует за предыдущей переменная / константа в той же строке).
Фактически я мог бы явно обработать новую строку следующим образом:
field
: OPEN_ANGLED_BRACKET row_id NEWLINE
((ENVIRONMENT_VAR | DQUOTE_STR | VAR) DQUOTE_STR? NEWLINE)+
CLOSED_ANGLED_BRACKET NEWLINE
;
// [...]
WHITESPACE
: [ \t] -> skip
;
NEWLINE
: '\r'? '\n'
| '\r'
;
, но тогда я должен явно обрабатывать новую строку везде в остальной части грамматики , что сильно усложняет!
Есть ли способ сохранить явную новую строку внутри угловых скобок, пропуская ее везде «автоматически»?