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

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


[编辑] 对于任何歧义,我深表歉意。上面输入的所有内容都是书中逐字逐句的。遗漏不是我做的。

最佳答案

再次考虑您的示例代码:

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/

相关文章:

language-agnostic - 在给定距离的线上寻找点

language-agnostic - "true"多维数组的定义是什么,哪些语言支持它们?

java - 从 SAXparser 类解析字符串时出现 Long.parseLong 错误 (Java)

python - 选择字符串中的日期

java - 使用一个简单的命令从命令行将一堆 .Java 文件转换为 .Jar 文件

c++ - C/C++ 编译器通常会删除重复的库吗?

arrays - 将重复/重复模式识别为来自父数组的子数组

C# Xml 值总是为空

c++ - 编译器是否可以在仅引用一次时隐式 std::move 参数?

language-agnostic - 在没有数据结构的情况下寻找中位数