有许多定义编程语言语义的方案:指称语义(将语法映射到计算程序状态的函数);操作语义(相当于为您的语言构建解释器)、转换语义(相当于将您的语言翻译成另一种已经存在其他语义的语言)等。
目前,它们中很少有人会导致可用于真正的编程语言的系统。这里的其他答案之一表明 Centaur 作为一个试图做到这一点的系统。
Peter Mosses 的动作语义是最近比较严肃的尝试之一。
对于实际系统,目前最有效的方法是更多的 ad hoc 方法。这些包括可以有效定义词汇和语法语法的系统(作为 LEX 和 YACC 的变体),并自动构建树。属性文法允许对树的计算进行规范,这允许人们定义某些类型的分析,例如符号表构造或度量(从技术上讲,您可以通过这种方式进行指称语义)。大多数传统语言(C、Java、C#、COBOL 等)在控制流和数据流方面都具有相对相似的结构,因此可以构建通用流分析例程以允许对此类标准语言进行推理。
最后,你需要一个语义分析的目的:你到底想提取什么事实?可用的静态分析系统具有混合模式驱动/过程代码方法,用于收集感兴趣的语法、符号表和流事实,以计算特定问题的特定答案。
一些系统使人们能够使用这种语义信息来进行源代码修改。
遵循上述更特别方法的一个系统是我们的
DMS Software Reengineering Toolkit,它还具有为 Java、C、C++ 和 COBOL 等真实语言完成的通用语义定义(语法、符号表、数据流分析)。DMS 可以对受各种事实收集程序制约的 AST 应用源到源的转换,从而以可靠的方式实现代码的大规模转换。