在一本书关于编译器的章节中,有如下语法定义和示例代码。
...
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
循环如何有效?在我看来,语句定义需要它们。这是书中的错误还是我误解了语法?
[编辑] 对于任何歧义,我深表歉意。上面输入的所有内容都是书中逐字逐句的。遗漏不是我做的。
最佳答案
再次考虑您的示例代码:
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
及其所需的大括号只是众多替代方案之一语句
。第 5 行和第 6 行完全匹配该规则——除了 ';'
,它在规则中没有位置。
关于language-agnostic - 上下文无关语法定义中的可选与强制终止符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1395822/