背景:-存在用于表达编程语言有效词典和语法的正式语言-这些表示(例如正则表达式和上下文无关语法)可以使用一些工具(例如LEX和YACC)自动编译到某些编程语言的词典/语法分析器中。
问题:-有这样的正式语言来定义编程语言语义吗?-有编译器可以基于这些正式语言自动生成语义分析器的代码吗?-关于源代码语义分析有什么可读的资源吗?
备注:-你可能会发现我的问题不现实,这是ok…我是一个编译器新手--我所说的语义分析实际上是指从源代码中收集必要的信息,用于下一步的代码优化和生成…这应该包括类型/边界检查…等
我希望我事先已经说清楚了很多感谢。
发布于 2009-09-14 00:15:00
定义编程语言的语义有许多方案:指代语义(将语法映射到计算程序状态的函数中);操作语义(相当于为您的语言构建解释器);转换语义(相当于将您的语言翻译成另一种已存在其他语义的语言),等等。
目前,它们中很少有系统可用于真正的编程语言。这里的另一个答案表明Centaur系统试图做到这一点。Peter Mosses的Action semantics 是最近比较严肃的尝试之一。
对于真实的系统,目前更多的特别方法是最有效的。这些引入系统可以有效地定义词汇和语法语法(作为LEX和YACC的变体),并自动构建树。属性语法允许在树上指定计算,这允许定义某些类型的分析,例如符号表构造或度量(从技术上讲,您可以通过这种方式进行指称语义)。大多数传统语言(C、Java、C#、COBOL...)所有这些都具有关于控制流和数据流的相对相似的结构,因此可以构建通用的流分析例程,以允许人们对这些标准语言进行推理。
最后,您需要语义分析的目的:您到底想提取哪些事实?可用的静态分析系统具有混合模式驱动/过程代码方法,用于收集语法、符号表和感兴趣的流事实,以计算特定问题的特定答案。
一些系统使人们能够使用该语义信息来携带源代码修改。
遵循上述更特别方法的一个系统是我们的DMS Software Reengineering Toolkit,它还具有为真正的语言完成的通用语义定义(语法、符号表、数据流分析),例如Java、C、C++和COBOL。DMS可以将源代码到源代码的转换应用于受各种事实收集过程限制的AST,这使得以可靠的方式进行大量代码转换成为可能。
发布于 2009-09-13 08:17:46
有许多用于编程语言语义的正式语言-在wikipedia entry中可以找到更多与谷歌相关的术语。在我早期的职业生涯中,我做了少量的Z (到正式方法的链接wiki是另一个可以开始探索的地方)。我建议在lambda the ultimate论坛上询问一下,因为那里的人正在使用它们中的一些,并且可以建议在你脑海中的任何用例中使用什么;this paper似乎在生成编译器方面与你所要求的有一定的关系-你需要语言的语义和对目标机器的描述来创建编译器。
发布于 2009-09-13 19:49:47
特别是对于静态分析,请查看http://rw4.cs.uni-sb.de/~martin/pag/
https://stackoverflow.com/questions/1417120
复制相似问题