该标准如何定义 C 程序?

How do the standard define a C program?

我正在研究如何制作字节码解释器(我正在研究的语言是站点 https://craftinginterpreters.com/ 上的 clox)。在其中,有效的 clox 程序被定义为声明列表。声明定义为 class、函数或变量声明或语句。

现在在 C 中,我知道有不同类型的声明和不同类型的语句,但是 none 类型的声明是语句,none 类型的语句是声明。我认为任何可能的 C 代码行都是一个或另一个那么标准如何定义 C 程序?

可以是定义或语句的行列表?

C 程序由其语法和标准中定义的实现细节定义。 Get yourself a copy of the C standard,基础什么的版本都行,看语法。可以在附件 A 中找到语法摘要。

第 6.8 节将语句定义为任意数量的特定类型语句之一。

statement:
  labeled-statement
  compound-statement
  expression-statement
  selection-statement
  iteration-statement
  jump-statement

它继续提供更多细节,例如,它告诉我们语句执行的顺序。

A statement specifies an action to be performed. Except as indicated, statements are executed in sequence.

然后你深入研究。例如6.8.4定义了一个selection-statement,涵盖了基本的控制结构if,else,switch.

selection-statement:
  if (expression) statement
  if (expression) statement else statement
  switch (expression) statement

注意语句如何由更多语句组成。

这样就建立了语言的语法。

C 标准将翻译单元(实际上是正在编译的源文件,包括它包含在 #include 中的所有文件)定义为 external-declaration 的列表项,每个 external-declarationfunction-definitiondeclaration (C 2018 6.9 1).

因此,从根本上说,C 程序的每个源文件都是一个声明列表,包括函数定义。

每个函数定义在声明函数类型及其参数的部分之后,有一个复合语句 (6.9.1 1)。 复合语句声明语句项的列表,包含在{} (6.8.2 1).

每个声明告诉我们(通常1)一个或多个标识符(6.8 2 和 5)。 语句 是计算机“做某事”的某种指令,例如迭代循环或计算表达式。在C语法中,声明和语句之间没有重叠。

有关声明的更多信息在 C 2018 标准的第 6.7 条中,有关声明的更多信息在第 6.8 条中。

脚注

1 在C语法中,一个static_assert-declaration也是一个声明。它不声明任何标识符,而是创建一个编译时断言,该断言经过测试并在断言失败时生成错误消息。