[英]Optional vs. mandatory terminators in context-free grammar definition
在关于编译器的书籍章节中,有以下语法定义和示例代码。
...
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
循环有效,而不{
}
? 在我看来,语句定义需要它们。 这是书中的错误还是我误解了语法?
[编辑]我对任何含糊不清表示歉意。 上面输入的所有内容都是从书中逐字记录下来的。 遗漏不是我的行为。
你同时声明说,以后)
来声明。 您的语法没有完全指定statement
,但它不需要大括号。 只有语句序列才需要大括号。
再次考虑您的示例代码:
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行完全匹配该规则 - 除了';'
,在规则中没有位置。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.