高级语言及其语法描述
本章内容概述了高级程序的结构和主要的共同特征,并介绍程序语言的语法描述方法。全部内容分为三个部分,分别为程序语言的定义、高级语言的一般特性和程序语言的语法描述。
一、程序语言的定义
任何语言实现的基础是语言的定义。程序语言主要由语法和语义两方面来定义。
语法
任何语言都可看成是一定字符集(称为字母表)上的一字符串(有限序列)。
所谓一个语言的语法是指这样一组规则,用它可以形成和产生一个合式的程序。这些规则的一部分被称为词法规则,另一部分被称为语法规则(或产生规则)。
词法规则:合法单词的构成规则(单词符号的形成规则),也就是如何从字母表中选择字符构成一个合法单词(用有限状态自动机或正规式描述)。
语法规则:合法程序的构成规则,也就是如何把各个单词符号组成更大的语法单位(语句、程序)(用上下文无关文法进行描述)。
在词法与语法规则中几个基本概念如下。
1、字母表:一个有限的字符集。比如:C语言的字母表,大小写英文字母、数字和特殊符号。(一个程序语言只使用一个有限字符集作为字母表)
2、单词符号:是语言中具有独立意义的最基本结构,一般包括:常数、标识符,基本字,算符和界符。
3、语法单位(语法范畴):有单词符号构成的更大的结构,一般包括:表达式,语句,分程序(语句块),函数(有返回值),程序。
语义
对于一个语言来说,不仅要给出他的词法、语法规则,而且要定义他的单词符号和语法单位的意义。
语义:指一组可以定义一个程序的意义的一组规则。
语义描述方法:属性文法和基于属性文法的语法制导规则。
二、高级语言的一般特征
高级语言的分类
1、按程序设计范型分:
(1)、强制式语言(过程式语言,c)特点是命令驱动,面向语句。每个语句的执行引起若干存储单元的值的改变。
(2)、应用是语言(函数式语言,lisp)注重程序所表示的功能。
(3)、基于规则的语言(prolog,yacc)检查一定的条件,当它满足时,则执行适当的动作。
(4)、面向对象的语言(java) 封装性:类和对象 继承性:子类 多态性:操作符或子程序名能够根据参数和结果的数据类型,引用某些函数定义中的任意一个。
2、按编译时是否需要类型检查分:(1)、静态类型语言(c,c++,java) (2)、动态类型语言(Python, Ruby,PHP)
3、按类型检查强弱分:(1)、弱类型语言(C,C++,VB)(2)、强类型语言(JAVA,C#)
程序设计语言的一般特性:
程序设计语言支持特定的数据类型及操作。
2、数据类型:包括基本数据类型,构造数据类型,自定义数据类型。每种数据类型都隐含了数据对象可以具有的值和作用于这种数据类型对象的操作。
3、数据结构:
(1)、数组:一个数组是由同一类型数据所组成的某种n维矩形结构。每个元素占相同的存储空间。
(2)、结构体类型/记录/类类型:从逻辑上说,结构体类型和类类型是由已知类型的数据组合起来的一种结构。
程序设计语言支持不同的语句与控制结构
表达式
组成:操作数和操作符组成。
常见的算术表示形式:前缀式 中缀式 后缀式
语句:根据属性文法的定义进行处理
包括:说明性语句 , 执行性语句 ( 赋值语句 控制语句 输入/输出语句 )
三、程序语言的语法描述
基本概念:
字母表:由若干元素组成的有限非空集合,用ε表示,它的每个元素称为一个符号。
符号串:由ε中的符号所构成的有穷序列。
符号串的前缀和后缀及子串:设x是一个符号串,将x的尾(前)部删掉几个字符后形成的符号串,称为x的前(后)缀;从一个符 号串中删去他的一个前缀和后缀后所剩下部分称为x的子串
空字:不包含符号的序列称为空字,记为ε。用ε*表示ε上的所有符号串的全体,空字也包括在其中。
符号串的运算:
1、符号串的连接运算:设x和y是两个符号串,如果将y直接拼接在x之后,称这种操作为符号串的连接;
2、符号串的方幂: 一个符号串与其自身的n-1的任意连接称为次符号串的n次幂,记作:xn,特别地:x0=ε。
符号串集合的运算:
1、字符串集合的和(等价于集合的并运算):设A、B是两个符号串的集合,则将集合A、B的和记为A+B或A U B,定义为:A UB={w|w∈A或w∈B}。
2、符号串集合的连接:(1)、Σ*的子集U和V中的(连接)积定义为: UV={αβ∣α∈U & β∈V }
即集合UV中的符号串是由U和V的符号串连接而成的。注意,一般UV≠VU,但(UV)W=U(VW).
(2)、 符号串集合V自身的连接:Vn=V V ...V(n个V)规定V0={ε}。
v的闭包:V*=V0UV1U.... 称V*是V的闭包
v的正则包:记V+ = VV*, 称 V+是V的正则包,即V+ =V1UV2UV3U…。
上下文无关文法:
文法是描述语言的语法结构的形式。
上下文无关文法的语法范畴是完全独立于这种范畴可能出现的环境的。特点是具有独立性,缺点是不能用来描述自然语言。
上下文无关文法G组成部分
一组终结符号,一组非终结符,一个开始符号,以及一组产生式。
1、所谓终结符号乃是组成语言的基本符号,即在程序语言中以前屡次提到的单词符号,如基本字,标识符,常数,算符和界符等.
2、所谓非终结符号(也称语法变量)用来代表语法范畴。一个非终结符代表一个一定的语法概念。因此非终结符是一个类(或集合)记号,而不是个体记号。
3、开始符号是一个特殊的非终结符号,它代表所定义的语言中我们最感兴趣的语法范畴。
4、产生式(也称为产生规则或简称规则)是定义语法范畴的一种书写规则。
一个产生式的形式是 A→ α,其中箭头左边的A是一个非终结符,称为产生式的左部符号;箭头右边的α是终结符号或与非终结符号组成的一符号串,称为产生式的右部,或称候选式。
形式上定义一个上下文无关文法G是一个四元式(VT,VN,S,P)
VT是一个非空有限集,它的每一个元素称为终结符号;
VN是一个非空有限集,它的每一个元素称为非终结符号,VT∩VN=Φ;
S是一个非终结符号,称为开始符号;
P是一个产生式(有限)集合,每个产生式形式是A→ ,其中,P∈VN,α∈( VT∪VN)*
开始符号S至少必须在某一产生式的左部出现一次。
推导与直接推导:
直接推导:仅当Aγ是一个产生式,有αAβ=>αγ β,该推导称为直接推导(直接导出)。
推导的描述形式:
*=> :任意次推导
+=>:至少一次推导
句型与句子
假定G是一个文法,S是它的开始符号。如果S+=>α (表示从S出发,经0步或若干步可推出α),则称α是一个句型。仅含终结符号的句型是一个句子。文法G所产生的句子的全体是一个语言,将它记为L(G).
L(G)={α|S+=>α & α∈VT }
最左(最右)推导:
在推导的任何一步α=>β,其中α、β是句型,都是对α中的最左(右)非终结符进行替换
语法分析树与二义性
语法分析树:简称语法树,用来表示推导过程。
文法G[E]:E→E+T│T
T→T*F│F
F→(E)│i
句型E+F*i对应的语法树如图:
1、语法树的根结由开始符号所标记。
2、随着推导的展开,当某个非终结符被它的某个候选式所替换时,这个非终结符的相应结就产生了下一代新结点。每个新结点和其父亲结点间都有一条连线。
3、在一棵语法树生长过程中的任何时刻,所有那些没有后代的端末结自左至右排列起来就是一个句型。
文法的二义性:
如果一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的。也就是说,若一个文法存在某个句子,它有两个不同的最左(最右)推导,则这个文法是二义的。
例:文法G[E]:E→E+E | E*E | (E) | i,试为符号串E*E+i构造语法树.
明显两个语法树都可以表示符号串E*E+i,但是表示的含义并不相同,左边的语法树表示先先乘后加,而右边的语法树表示先加后乘。这就产生了二义性。
有关文法二义性的几个问题:
1、文法二义不等于语言二义
2、文法的二义性是不可判定的
3、文法的二义性证明:找出一个句子,它有两个不同的最左推导或最右推导
4、文法二义性的消除:给每个产生式定义优先级
作为描述程序语言的上下文无关文法,对他还有几点限制:
(1)文法中不含任何下面形式的产生式: P→P因为这种产生式除了产生二义性外没有任何用处。
(2)每个非终结符P必须有用处。这一方面意味着,必须存在含P的句型;也就是,从开始符号出发,存在推导 S=>*αPβ.
另一方面意味着,必须存在终结符串γVT*,使得P=>+γ;也就是,对于P不存在永不终结的回路。
形式语言鸟瞰:
0型文法:
0型文法也称短语文法,G=(VT ,VN ,S ,P) 是一个0型文法,如果它的每个产生式是这样的结构 α->β。
α∈(VNUVT)* 且至少有一个非终结符,而β∈(VNUVT)* 。
1型文法
也称上下文有关文法。这种文法意味着,对非终结符进行替换时务必考虑上下文,一般不允许替换成空串。
例如:αAβ->αγβ是1型文法G的一个产生式,α、β都不空,则终结符只有在α和β这样的一个上下文环境中才可以把它替换为γ.
2型文法
该文法又称为上下文无关文法,产生式满足:A->α。
A为非终结符,α为终结符和非终结符组成的符号串,可以是空串。
3型文法
该文法又称为右线性文法,或左线性文法,通称正规文法,该文法所描述的语言又称为正规语言。
该文法的产生式满足:A->αB 或 A->Bα,A为非终结符,α为终结符组成的符号串,可以是空串。
课后习题:
9、iiiei有两个不同的语法树:
第一:S->iSeS->iSei->iiSei->iiiei
第二:S->iS->iiSeS->iiSei->iiiei
10、S->TS|T T->S|()
11、
学习感受
本章为高级语言及其语法描述,通过对这一章的学习,学到了许多关于程序语言的概念,特点以及重点学习了上下文无关文法,如何分析文法推导出它所定义的语言,还有如何通过语言到处定义他的文法,这部分内容一开始接触是有些云里雾里的,不过后来通过做题,对这部分知识也有了一定的掌握。还学习了文法的二义性以及不同类型的文法。这一章中关于语言与文法的转换以及推导需要再花些时间去理解与巩固,如果理解不到位,以后做题难免出错。