一个程序设计语言是一个记号系统,如同自然语言一样,它的完整定义应包含语法和语义两个方面,所谓一个语言的语法是指一组规则,用它可以形成和产生一个合适的程序,目前广泛使用的手段是上下文无关的文法,即用上下文无关作为程序设计语言语法的描述工具,语法只是定义什么样的符号序列是合法的,与这些符号含义毫无关系的,比如对于一个pascal程序来说,一个上下文无关文法可以定义符号串A:=B+C是一个合乎语法的赋值语句,而A:=B+就不是,但是,如果B是实型,而C是布尔型,或者B,C中任意一个变量没有事先说明,而A:=B+C仍不是正确的程序,也就是说程序结构上的这种特点-类型匹配,变量作用域,等是无法用上下文无关手段检查的,这些工作属于语义分析的工作,我们常常把程序设计语言的语义分类两类,静态语义与动态语义,静态语义是一系列限定规则,并确定哪些合乎语法的程序是合适的,动态语义也称为运行语义或执行语义,表明程序要做些什么,要计算什么。
阐明语法的一个工具是文法,这是形式语言理论的基本概念之一,本章将介绍文法和语言的概念,重点讨论上下文无法文法以及其句型分析中的有关问题。
阐明语义要比阐明语法困难难得多,尽管形式语义学的研究已取得重大进展,但是仍没有哪一种公认的形式系统可借助于来自构造出正确的编译系统,本书不对形式语义学进行介绍。
文法的直观概念
在给出文法和语言的形式定义之前,我们先直观地认识一下文法的概念。
当我们表述一种语言时,无非是说明这种语言的句子,如果语言只含有有穷多个句子,则只需列出句子的有穷集就行了,但对于含有无穷句子的语言来讲,存在着如何给出它的有穷表示的问题。
以自然语言为例,人们无法列出全部句子,但是人们可以给出一些规则,用这些规则来说明句子的组成结构,汉语句子可以由主语后随谓词而成的,
实际上,使用文法作为工具,不仅可以严格地定义句子的结构,也是为了适当条数的规则,把语言的全部句子描述出来,可以说文法是以有穷的集合刻画无穷的集合的工具。
符号和符号表
正如英语是由句子组成的集合,而句子又是有单词和标点符号组成的序列那样,程序设计语言PASCAL或C语言,是由一切PASCAL或C程序组成的集合,而程序是有类似if,begin,end的符号,字母和数字这样的一些基本符号所组成的,从字面上,每个程序都是一个基本符号表,设有一基本符号串组成的集合,为了给出语言的形式定义,我们首先讨论符号和符号串的有关概念。
字母表,字母表是元素的非空有穷集合,我们把字母表中的元素称为符号,因此字母表也称为符号集,不同的语言可以有不同的字母表,例如在汉语的字母表中包含汉字,数字及标点符号,pascal语言的字母表是由字母,数字,若干专用符号及begin,if之类的保留字组成。
ca
符号串 有字母表中的符号组成的任何有穷序列称为符号串,例如00 11 10是字母表,{0,1}上的符号串,又如{a,b,c}上的一些符号串有:a,b,c,ab,aaca。在符号串中,符号的顺序是很重要的,例如符号串就不同于ba,cab,
如果某个符号串x中有m个符号,则其长度为m,表示|x|=m
允许空字符串,既不包含符号的符号串,用表示
下面介绍符号串的一些基本操作。
包含符号串的头尾,固定头,固定尾,符号串的连接,符号串的方幂,符号串的集合。
文法和语言的形式定义
规则,也称为重写规则,产生式,或生成式,是形如例如A->a,读作A定义为a。也把它说成是一条关于A的规则(产生式)
定义3,1 文法G定义为四元组(VN,VT,P,S)
其中vn为非终结符(或语法实体,或变量)集,vt为终结符集,p为规则的集合,S称作标识符或开始符,它是一个非终结符,至少在一条规则中作为左部规则。
VN和vT不含公共的元素,两个集合的交集为0
两者的并集为V,称为文法G的字母表或字汇表。
很多时候,不用将文法G的四元组显示地表示出来,而只将产生式写出,一般约定第一条产生式的左部是标识符,用尖括号括起来的是非终结符,不用尖括号括起来的是非终结符,不用尖括号括起来的是非终结符,不用尖括号括起来的是终结符,
为定义文法所产生的语言,我们引入推到的概念,即定义V中的符号之间的关系,
定义:文法描述的语言是该文法的一切句子的集合。