阅读
this question后,我想知道当主要的C编译器解析这样的代码时会发生什么(关于AST):
struct foo { void method() { a<b>c; } // a b c may be declared here };
他们是像GLR解析器那样处理它还是以不同的方式处理它?还有哪些方法可以解析这个和类似的案例?
例如,我认为可以推迟解析方法体,直到解析整个结构,但这是否真的可行且实用?
解决方法
虽然使用GLR技术来解析C当然是可能的(参见
Ira Baxter的一些答案),但我相信常用编译器(如gcc和clang)中常用的方法恰好是推迟函数体解析的方法.类定义是完整的. (由于C源代码在被解析之前通过预处理器,解析器在令牌流上工作,这是必须保存以便重新解析函数体.我不相信重新解析源代码是可行的. )
很容易知道函数定义何时完成,因为即使不知道尖括号如何嵌套,大括号({})也必须平衡.
在处理声明之前,C不是推迟解析的唯一语言.例如,允许用户定义具有不同优先级的新运算符的语言将要求在知道运算符的名称和优先级后(重新)解析所有表达式.一个更具病态的例子是COBOL,其中a = b OR c中OR的优先级取决于c是否是整数(a等于b或c之一)或布尔值(a等于b或c为真) ).是否以这种方式设计语言是一个好主意是另一个问题.