3

私はANTLR文法で次のステートメントを書き留めました:

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

私が正しく理解している場合、それは私がまたは(statement|exit)*を持つことができることを意味します。つまり、、または、、または、そうですか? ステートメントがない場合を除いて、私のパーサーは機能します。 例えば:statementexit statementstatement_1 exit_1statement_1statement_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)*を持つことができることを意味します。statementexit statement

正確には(statement|exit)*、空の文字列、または 0 個以上のstatementorexitステートメント (順不同!) に一致します。したがって、次のように一致します。

  • ステートメント ステートメント ステートメント ...
  • 出口 出口 出口 ...
  • exit 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;

ここに画像の説明を入力


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 に答える