3

コンパイラに関する本の章には、次の文法定義とサンプル コードがあります。

...
statement: whileStatement
           | ifStatement
           | ... // Other statement possibilities
           | '{' statementSequence '}'
whileStatement: 'while' '(' expression ')' statement
ifStatement: ... // Definition of "if"
statementSequence: '' // empty sequence (null)
                   | statement ';' statementSequence
expression: ... // Definition of "expression"
...             // More definitions follow

 

while (expression) {
 statement;
 statement;
 while (expression) {
  while(expression)
     statement;
  statement;
 }
}

コードの最も内側のwhileループは、なしでどのように有効です{ }か? ステートメント定義にはそれらが必要であるように見えます。これは本の間違いですか、それとも構文を誤解していますか?


[編集]あいまいさをお詫びします。上に入力したものはすべて、本からの逐語的なものです。省略は私のしたことではありません。

4

2 に答える 2

2

あなたのwhileステートメントは、後に)ステートメントが来ると言っています。文法で完全に指定statementされているわけではありませんが、中かっこは必要ありません。中括弧は、ステートメントシーケンスにのみ必要です。

于 2009-09-08T19:27:31.163 に答える
2

サンプルコードをもう一度考えてみましょう:

1 while (expression) {
2  statement;
3  statement;
4  while (expression) {
5   while(expression)
6      statement;
7   statement;
8  }
9 }

6 行目に中括弧がないことを心配しているのに、2 行目、3 行目、7 行目には中括弧がないことを気にしないのはなぜですか? 文法では、whileループは astatementで終了しstatementSequence、必要な中括弧を含む a は、a の多くの代替手段の 1 つにすぎませんstatement。5 行目と 6 行目はそのルールと完全に一致しますが、例外として、ルールに';'は含まれていません。

于 2009-09-08T20:24:02.047 に答える