3

我在 ANTLR 语法中写下了以下语句:

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

如果我理解正确,(statement|exit)*则意味着我可以拥有 astatementexit statement. 那就是 ie statement_1 exit_1, or statement_1, or 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;

我的语法有什么问题吗?

4

1 回答 1

3

潘特利斯写道:

如果我理解正确,(statement|exit)*则意味着我可以拥有 astatementexit statement.

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

  • 声明声明声明...
  • 退出退出退出...
  • exit 退出语句 语句 exit ...
  • ...

但是,为什么不让你的exit声明只是一个常规的声明呢?我的小demo:

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;

在此处输入图像描述


2

loop
  x:=x+1;

end loop;

在此处输入图像描述


3

loop

  exit when x=9;
end loop;

在此处输入图像描述


4

或者什么都没有:

loop

end loop;

在此处输入图像描述

于 2011-03-23T07:43:17.143 回答