在它可以区分比较和模板实例之前,C的解析器会做什么?

在它可以区分比较和模板实例之前,C的解析器会做什么?,第1张

概述阅读 this question后,我想知道当主要的C编译器解析这样的代码时会发生什么(关于AST): struct foo { void method() { a<b>c; } // a b c may be declared here}; 他们是像GLR解析器那样处理它还是以不同的方式处理它?还有哪些方法可以解析这个和类似的案例? 例如,我认为可以推迟解析方法体,直到解析整个结构 阅读 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为真) ).是否以这种方式设计语言是一个好主意是另一个问题.

总结

以上是内存溢出为你收集整理的在它可以区分比较和模板实例之前,C的解析器会做什么?全部内容,希望文章能够帮你解决在它可以区分比较和模板实例之前,C的解析器会做什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1239076.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存