У меня есть язык сценариев формы: <keyword> = <text>,
ANTLR домен v3 Синтаксических специфический язык
Где <text>
может содержать ключевые слова и иногда <text>
может содержать инструкции в зависимости от того, какого <keyword>
используется.
Я пытаюсь обрабатывать <text>
на основе того, что используется <keyword>
.
/* lang.g */
grammar lang;
/* parser rules */
script : assignment+ ;
assignment : keyword VALUE ;
/* cannot do the following (but I would like to)
assignment : command | command_b | display ;
command : COMMAND '=' /* parser rules for command */ ',' ;
command_b : COMMAND_B '=' /* parser rules for command_b */ ',' ;
display : DISPLAY '=' ~(',')+ ',' ;
*/
/* lexer rules */
VALUE : '='! ~(',')+ ','!
COMMAND : 'command' ;
COMMAND_B : 'command_b' ;
DISPLAY : 'display' ;
WS : (' '|'\t'|'\r'|'\n')+ {$channel=HIDDEN;} ;
Пример входного файла:
command = goto->step_b,
display = this is some plain text. command keyword used,
command_b = read_file:"readme.txt",
Я хочу, чтобы иметь возможность обрабатывать command
, command_b
и display
правила по-разному, используя ANTLR для разбора все, что без использования целевого языка, чтобы помочь. Использование вышеуказанного * .g файла; первая строка имеет command
и goto->step_b
в качестве жетонов. goto->step_b
необходимо проанализировать дальше, было бы неплохо, чтобы ANTLR выполнял всю работу, а не целевой язык.
Если у вас нет способа сделать это напрямую, я думал, что выполнил бы это в два этапа.
- Использовать файл * .g выше для разбора входного файла
- Калл все, кроме
command
иcommand_b
узлов; передайте эти узлы в другой парсер, используя грамматику, определенную только для синтаксисаcommand
иcommand_b
.
Есть ли способ, чтобы разобрать сценарий с помощью одного грамматики такое, что я могу справиться с command
/command_b
правилами иначе, чем любое другое правило? Или мне придется обрабатывать файл сценария в несколько этапов?
Спасибо за любую помощь.
Джош