首页 理论教育 软件工程专业导论:语法与语义分类及重要性

软件工程专业导论:语法与语义分类及重要性

时间:2023-10-23 理论教育 版权反馈
【摘要】:0型最强,是短语结构文法,与图灵机是相当的,可以抽象地描述冯·诺伊曼机;1型是上下文有关文法,相当于线性有限自动机;2型是上下文无关文法,是下推自动机,是目前高级编程语言语法描述的主要文法;3型是正则文法,相当于有限状态自动机。目前,大多数高级编程语言采用上下文无关的文法,对应于乔姆斯基定义的2型文法。只有语法是不够的,语义是一个代码语句或结构的真实含义。语义又分为静态语义和动态语义。

软件工程专业导论:语法与语义分类及重要性

虽然高级编程语言的词法采用英文单词,但是仅仅把单词按语法拼在一起可能没有任何意义(语义)。例如,自然语言(natural language)英语的:“Colorless green ideas sleep furiously”是什么意思?

自然语言常常有二义性的,例如“开刀的是他的父亲”——到底是谁动的刀——谁被开的刀! 自然语言中,听者可以根据该句话的前言后语,推断出结论。

然而,高级编程语言是不允许有二义性的。这会导致编译程序太复杂! 编程语言的文法必须是形式化的,不能有任何二义性。程序员容易读懂,还要能容易地转换(或翻译)为机器的指令。

乔姆斯基(Chomsky)将编程语言的形式化文法划分为四类:0型文法、1、2、3型文法。

(1)0型最强,是短语结构文法,与图灵机是相当的,可以抽象地描述冯·诺伊曼机;

(2)1型是上下文有关文法,相当于线性有限自动机;

(3)2型是上下文无关文法,是下推自动机,是目前高级编程语言语法描述的主要文法;(www.xing528.com)

(4)3型是正则文法,相当于有限状态自动机。能力较弱,只能描述词法。

目前,大多数高级编程语言采用上下文无关的(context-free)文法,对应于乔姆斯基定义的2型文法(Type-2 grammar)。高级编程语言的编译过程是将程序员容易读懂和表达的2型文法转换为冯·诺依曼机能够正确执行的0型文法。

只有语法是不够的,语义是一个代码语句或结构的真实含义。语义又分为静态语义和动态语义。

静态语义:对于编译型语言,在编译时进行语义规则检查,例如,检查每个标识符使用前是否声明?例如,C语言中检查switch语句的case分支是否明确区分开了。针对上下文,进行(变量和表达式的)类型检查;检查函数名是不是纯整数,子程序中的每个参数是否与调用的一致。或者,做数据流(data-flow)分析,看某个变量是否会永远也用不到。有些语言,如Java和C#,还要做赋值语句的类型分析。

一旦数据被说明,机器按指令对数据执行操作。只有执行时,才可能知道,例如,语义定义了表达式如何被计算,或控制结构按条件执行某语句,是否会出现除零错等。这类语义称为动态语义或执行语义——表明语言的各种构件运行时的行为。

针对动态语义的检查是非常重要的,例如,飞机上控制程序是否会出现除零错、数组下标是否会越界等,这样可以避免在高可靠的系统中出现灾难,在网络系统中判断外来的数据是否有网络病毒或攻击性指令等。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈