ANTLR грамматика для оператора или оператора выхода - PullRequest
3 голосов
/ 23 марта 2011

Я записал следующее утверждение в грамматике ANTLR:

loopStatement
    : 'loop'  (statement|exit)* 'end' 'loop' ';'
    ;

Если я правильно понимаю, (statement|exit)* означает, что у меня может быть statement или exit statement. То есть то есть statement_1 exit_1, или statement_1, или statement_1 statement_2, exit_1, верно?
Мой парсер работает, кроме случаев, когда нет оператора.
Например:

это работает:

loop
x:=x+1;   <<< statement_1
exit when x=9; <<<<exit_1
end loop;

это также работает (нет exit):

loop
x:=x+1;   <<< statement_1
          <<<<exit_1  (no exit)
end loop;

но это НЕ работает (нет statement):

loop
          <<< statement_1
exit when x=9; <<<<exit_1
end loop;

Что-то не так с моей грамматикой?

1 Ответ

3 голосов
/ 23 марта 2011

Пантелис писал:

Если я правильно понимаю, (statement|exit)* означает, что у меня может быть statement или exit statement.

Если быть точным, (statement|exit)* соответствует пустой строке или нулю или большему количеству statement или exit операторов (в произвольном порядке!). Так что это будет соответствовать:

  • оператор оператор оператор ...
  • выход, выход, выход ...
  • оператор оператора выхода exit оператор выхода ...
  • ...

Но почему бы не сделать ваше заявление exit обычным утверждением? Я небольшой демо:

loopStatement
  :  'loop'  statement* 'end' 'loop' ';'
  ;

statement
  :  'exit' 'when' expression ';' // exit statement
  |  ID ':=' expression ';'       // assignment
  ;

expression
  :  equalityExpression
  ;

equalityExpression
  :  addExpression ('=' addExpression)*
  ;

addExpression
  :  atom ('+' atom)*
  ;

atom
  :  ID
  |  Number
  |  '(' expression ')'
  ;

ID
  :  'a'..'z'+
  ;

Number
  :  '0'..'9'+
  ;

, который правильно анализирует все ваши 3 примера:


1

loop
  x:=x+1;
  exit when x=9;
end loop;

enter image description here


2

loop
  x:=x+1;

end loop;

enter image description here


3

loop

  exit when x=9;
end loop;

enter image description here


4

Или вообще ничего:

loop

end loop;

enter image description here

...