C 是严格按顺序解析的,即一切都必须在使用前声明;特别是,类型必须在这些类型的变量之前声明。这是有道理的,因为如果您不知道类型的名称是什么,而类型的名称不是什么,则语法将是模棱两可的,例如a * b
取决于是否a
命名了一个类型。
另一方面,一些 C 系列语言具有放松这种限制的理想特性(从而消除了对头文件的手动处理)。我正在为 C 超集语言编写一个解析器,该语言旨在同样放松该限制,所以现在我需要弄清楚如何去做。
我想到的一种方法是做两次传球。第一遍遍历所有内容,利用顶层的所有内容都必须是声明而不是声明的事实,并选择所有类型。在这个阶段,函数体没有被检查,只是作为由匹配的大括号分隔的标记流被拾取。第二遍解析函数体。函数中的局部声明必须是有序的,但这并不是真正的问题。
这种方法有没有我没有想到的绊脚石?
C++、Java、C# 等的编译器通常如何处理那些不需要按顺序声明的语言部分?