一个程序设计语言其实就是一个记号系统,和自然语言一样,它的完整定义包括语法和语义两方面。一个语言的语法是指一组规则,用它可以形成和产生一个合适的程序。
语法只是定义什么样的符号序列是合法的
用上下文无关法作为程序设计语言语法的描述工具,目前较为广泛使用的,就比如说我们可以定义符号串A:= B + C,是一个合乎语法的赋值语句,但是如果B是实型的,C是布尔型的,或者B、C中任何一个变量没有事先声明,A:=B+C 其实仍不是正确的程序,其实上下文无关文法就是拿来定义句子结构的
也就是说程序结构上的特点—类型匹配、变量作用域等是无法用上下文无关手段检查的,这些工作是属于语义分析工作
而A:=B+ 就不是一个合乎语法的赋值语句
程序设计语言的语义常常分为两类,一种是静态语义,另一种是动态语义。静态语义是一系列限定规则,并确定哪些合乎语法的程序是合适的,动态语义也称为运行语义或者是执行语义,表面程序要做什么,要计算什么
阐明语法的一个工具就是文法
其实当我们去表述一种语言的时候,无非就是去说明这种语言的句子,如果语言只含有有穷多个句子,则只需要列出句子的有穷集就可以了,如果对于含有无穷多个句子来说就会存在着如何去给出它的有穷的表示的问题
动态错误又被称为动态语义错误,比如说变量取值为0,是用作除数,引用数组元素时下标出界,源程序当中的逻辑错误,它们发生在程序运行期间
静态语义分析就是语义审查,检查上下文的相关性,类型匹配和类型转换
我们把判别句子结构合法与否的规则可以看成是一种元语言,就是用来描述语言的,也称为文法
其实我们使用文法作为工具,不仅仅是为了严格地定义句子结构,也是为了用适当条数的规则把语言的全局句子描述出来,也就是说可以说文法就是以有穷的集合刻画无穷的集合的工具