我正在研究如何制作字节码解释器(我正在研究的语言是站点https://craftinginterpreters.com/上的clox)。在其中,有效的clox程序定义为声明列表。声明定义为类,函数或变量声明,或者定义为语句。
现在在C中,我知道有不同类型的声明和不同类型的语句,但是声明的类型都不是语句,语句的类型都不是声明。我认为任何可能的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
接着提供了更多详细信息,例如,它告诉我们语句的执行顺序。
一条语句指定要执行的动作。除非另有说明,否则语句按顺序执行。
然后,您将深入研究。例如,6.8.4定义了一个selection-statement
,它覆盖了if和else开关的基本控制结构。
selection-statement:
if (expression) statement
if (expression) statement else statement
switch (expression) statement
请注意如何构建更多的语句。
并且以此方式建立了语言的语法。
C标准定义了一个翻译单元(实际上是正在编译的源文件,包括它包含在#include
中的所有文件)作为external-declaration项目的列表,以及每个external-declaration是function-definition或declaration(C 2018 6.9 1)。
因此,从根本上讲,C程序的每个源文件都是声明列表,包括函数定义。
每个功能定义在声明函数的类型及其参数的部分之后,具有复合语句(6.9.1 1)。 复合语句是包含在{
和}
(6.8.2 1)中的声明或语句项目的列表。
每个声明
告诉我们(通常)一个或多个标识符(6.8 2和5)。 statement是计算机“执行某些操作”的某种指令,例如迭代循环或评估表达式。在C语法中,声明和语句之间没有重叠。