用于声明或退出声明的ANTLR语法

时间:2011-03-23 03:11:57

标签: antlr grammar ebnf

我在ANTLR语法中写下了以下声明:

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

如果我理解正确,(statement|exit)*表示我可以拥有statementexit 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 个答案:

答案 0 :(得分:3)

  

pantelis写道:

     

如果我理解正确,(statement|exit)*表示我可以拥有statementexit statement

准确地说,(statement|exit)*匹配空字符串,或零个或多个statementexit语句(没有特定顺序!)。所以它匹配:

  • 陈述声明声明......
  • 退出退出...
  • exit exit statement statement 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