无上下文语法定义中的可选与强制终止符

时间:2009-09-08 19:19:58

标签: language-agnostic parsing compiler-construction context-free-grammar

在关于编译器的书籍章节中,有以下语法定义和示例代码。

...
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 {,代码的最内部}循环如何有效?在我看来,语句定义需要它们。这是书中的错误还是我误解了语法?


[编辑] 我对任何含糊不清表示歉意。上面输入的所有内容都是从书中逐字记录下来的。遗漏不是我做的。

2 个答案:

答案 0 :(得分:2)

你的while语句在)发表声明之后说。您的语法没有完全指定statement,但它不需要大括号。只有语句序列才需要大括号。

答案 1 :(得分: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循环以statement结尾,statementSequence及其必需的大括号,只是statement的众多替代方案之一。第5行和第6行完全符合该规则 - ';'除外,它在规则中没有位置。