【发布时间】:2013-02-05 14:42:14
【问题描述】:
C 被严格按顺序解析,即所有东西都必须在使用前声明;特别是,类型必须在这些类型的变量之前声明。这是有道理的,因为如果您不知道类型的名称是什么,而类型的名称不是什么,那么语法就会模棱两可,例如a * b 取决于 a 是否命名类型。
另一方面,一些 C 家族语言具有放松这一限制的理想特性(从而消除了对头文件的手动处理)。我正在为 C 超集语言编写一个解析器,该语言旨在同样放宽该限制,所以现在我需要弄清楚如何去做。
我想到的一种方法是进行两次传递。第一遍遍历所有内容,利用顶层的所有内容都必须是声明而不是声明的事实,并选择所有类型。在这个阶段,函数体没有被检查,只是作为由匹配的大括号分隔的标记流被拾取。第二遍解析函数体。函数中的局部声明必须是有序的,但这不是真正的问题。
这种方法有什么我没有想到的绊脚石吗?
C++、Java、C# 等的编译器通常如何处理那些不需要按顺序声明的语言部分?
【问题讨论】:
-
在此之前你会完全预处理源代码吗?
-
是的,预处理仍需作为单独的初始步骤进行。
-
好吧,我放弃了这种方法,因为
a * b提出的模棱两可。顺便说一句,要考虑的其他一些事情包括不完整的类型。首先收集所有类型然后应用它们可能是不正确的。如果这样可行,但代码实际上并没有编译,因为在某些时候类型仍然不完整,该怎么办? -
那么第二遍就会产生错误信息。
-
如果你保留了足够的关于事物顺序的信息。
标签: c parsing compiler-construction programming-languages