背景: - 有表达编程语言有效词典和语法的正式语言 - 这些表示(例如正则表达式和无上下文语法)可以使用某些工具(例如LEX和YACC)自动编译成某些编程语言的词典/语法分析器

问题: - 是否有用于定义编程语言语义的正式语言? - 是否有编译器根据这些正式语言自动生成语义分析器的代码? - 有关源代码语义分析的任何资源?

注释: - 你可能会发现我的问题不现实,没关系......我是编译器的新手? - 通过语义分析,我的意思是从源代码中收集必要的信息,用于代码优化和生成的下一步......这应该包括类型/边界检查......等等。

我希望我能说清楚 非常感谢提前

有帮助吗?

解决方案

有许多方案可用于定义编程语言的语义: 指称语义(将语法映射到计算程序状态的函数); 操作语义(相当于为您的语言构建解释器), 转换语义(相当于将你的语言翻译成另一种语言) 已经存在其他语义的语言等等。

目前很少有人能够使用可用于实际编程语言的系统。这里的其他答案之一表明Centaur是一个尝试这样做的系统。 Peter Mosses的行动语义是近期最严重的尝试之一。

对于真实系统,目前最有效的方法是更有效。 这些包括词汇和语法语法可以有效的系统 定义(作为LEX和YACC的变体),并自动构建树。 属性语法允许指定树上的计算, 允许人们定义某种分析,例如符号表 建设或指标(技术上你可以 以这种方式做指称语义)。大多数传统语言(C,Java,C#, COBOL,......)在控制流和控制流方面都有相对相似的结构 数据流,因此可以构建通用的流分析例程 允许人们推理这种标准语言。

最后,您需要一个用于语义分析的目的:什么是事实 你想提取什么?可用的静态分析 系统具有混合模式驱动/过程代码方法 收集感兴趣的语法,符号表和流程事实 计算特定问题的具体答案。

某些系统允许用户携带此语义信息 源代码修改。

遵循上述更多临时方法的一个系统是我们的 DMS Software Reengineering Toolkit ,它还具有通用语义定义 (语法,符号表,数据流anlaysis)为真实完成 Java,C,C ++和COBOL等语言。 DMS可以申请 源到源的转换到ASTs条件 通过各种事实收集程序,这使大众 以可靠的方式转换代码。

其他提示

有许多用于编程语言语义的正式语言 - 请查看维基百科条目更多关于谷歌的条款。在我早期的职业生涯中,我做了少量的 Z (与正式方法wiki的链接是另一个可能开始探索的地方)。我建议在 lambda最终的论坛上询问,因为那里的人使用其中一些,可以建议您用于任何用例的内容; 本文似乎与您在生成编译器方面的要求有些相关 - 您需要语言的语义和创建编译器的目标机器的描述。

专门针对静态分析,请查看 http://rw4.cs。 uni-sb.de/~martin/pag/

您所描述的正是Centaur项目的内容:

http://www-sop.inria.fr/croap/centaur /centaur.html

事实上,你可以在很远的地方描述语言的语义,以至于系统能够为你提供该语言的解释器(就在你完全描述语义的时候)。但你不必一路走下去。你可以做更少的描述工作,并且仍然可以获得结构化的编辑器和类型检查器。

虽然该项目的工作已经停止(据我所知), 您可以在链接中找到有趣的文章并下载。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top