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循环以 a 结尾statement,而 astatementSequence及其所需的大括号只是 a 的众多替代方案之一statement。第 5 行和第 6 行完全匹配该规则——除了';',它在规则中没有位置。

于 2009-09-08T20:24:02.047 回答