2013-02-11 3 views
1

У меня есть язык сценариев формы: <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 выполнял всю работу, а не целевой язык.

Если у вас нет способа сделать это напрямую, я думал, что выполнил бы это в два этапа.

  1. Использовать файл * .g выше для разбора входного файла
  2. Калл все, кроме command и command_b узлов; передайте эти узлы в другой парсер, используя грамматику, определенную только для синтаксиса command и command_b.

Есть ли способ, чтобы разобрать сценарий с помощью одного грамматики такое, что я могу справиться с command/command_b правилами иначе, чем любое другое правило? Или мне придется обрабатывать файл сценария в несколько этапов?

Спасибо за любую помощь.

Джош

ответ

1

Посмотрите мой ответ здесь:

antlr identifier name same as pre-defined function name cause MismatchedTokenException

Вы можете использовать неоднозначности семантические предикаты, чтобы эти правила из вашей грамматики:

COMMAND : 'command' ; 
COMMAND_B : 'command_b' ; 
DISPLAY : 'display' ; 

И вместо вы будете писать такие правила, как:

functions_stats 
    : {input.LT(1).getText().equals("command")}? '=' /* parser rules for command */ ',' ; 
    ; 

Действие в семантическом предикате зависит от языка, поэтому оно может отличаться в зависимости от вашего целевого языка. Он работает на Java и, возможно, на многих других.

Смежные вопросы