1.主要内容:
1.程序设计语言的语法
2.程序设计语言的语义
3.程序设计语言的特点
4.程序设计语言的语法描述
2.1语法
一组规则,用这组规则可以产生形式上正确的程序,可分为:
1.语法规则:合法程序的构成规则,也就是如何把各个单词符号组成更大的语法单位(语句、程序)(用上下文无关文法进行描述);
2.词法规则:合法单词的构成规则,也就是如何从字母表中选择字符构成一个合法单词(用有限状态自动机或正规式描述)。
语法包括三个基本概念:
1.字母表:一个有限的字符集
2.单词符号:具有独立意义的最基本结构
3.语法单位:由单词符号构成的更大的结构,一般包括表达式、语句、分程序、函数、程序。
2.2语义
语义是指这样的一组规则,使用它可以定义一个程序的意义。
语义描述方法:属性文法和基于属性文法的语法制导翻译方法。
2.3特点
程序设计语言的一般特性包括:
1.程序结构:包括支持过程的嵌套定义和不支持过程的嵌套定义。程序结构的不同,决定了符号表构造方法的不同。
2.程序设计语言支持特定的数据类型和操作
3.程序设计语言支持不同的语句与控制结构
2.4语法描述
2.4.1与文法定义相关的几个概念和术语
1.空字:不包含符号的序列称为空字,记为ε。
2.用∑*表示上的所有符号串的全体,空字也包括在其中。
3. 表示不含人何元素的空集{}。
2.4.2上下文无关文法
文法是描述语言的语法结构的形式规则(即语法规则)。
上下文无关文法的特点:它所定义的语法范畴(或语法单位)是完全独立于这种范畴可能出现的环境的。
特点:独立性缺点:不能用来描述自然语言
归纳起来,一个上下文无关文法G包括四个组成部分:一组终结符号,一组非终结符,一个开始符号,以及一组产生式。形式上定义一个上下文无关文法G是一个四元式(VT,VN,S,P)。
1.VT是一个非空有限集,它的每一个元素称为终结符号;
2.VN是一个非空有限集,它的每一个元素称为非终结符号,
VT∩VN=∅;
3.S是一个非终结符号,称为开始符号;
4.P是一个产生式(有限)集合,每个产生式形式是A→α,其中,P∈VN,α∈(VT∪VN)*开始符号S至少必须在某一产生式的左部出现一次。
1.所谓终结符号乃是组成语言的基本符号,即在程序语言中以前屡次提到的单词符号,如基本字,标识符,常数,算符和界符等。
2.所谓非终结符号(也称语法变量)用来代表语法范畴,是一个类(或集合)记号,而不是个体记号。
3.开始符号是一个特殊的非终结符号,它代表所定义的语言中我们最感兴趣的语法范畴。
4.产生式(也称为产生规则或简称规则)是定义语法范畴的一种书写规则。
一个产生式的形式是 A→ α
其中箭头左边的A是一个非终结符,称为产生式的左部符号;箭头右边的α是终结符号或与非终结符号组成的一符号串,称为产生式的右部,或称候选式。
2.4.2.1推导与直接推导
直接推导:仅当A->γ是一个产生式,有αAβ =>αγ β;
推导的描述形式:
1. :任意次推导
2. :至少一次推导
2.4.2.2句型与句子
假定G是一个文法,S是它的开始符号。
如果Sα(表示从S出发,经0步或若干步可推出α),则称α是一个句型。
仅含终结符号的句型是一个句子。
文法G所产生的句子的全体是一个语言,将它记为L(G).
L(G)={α|Sα & α∈VT }
2.4.2.3最左(最右)推导
最左(最右)推导:在推导的任何一步α=>β,其中α、β是句型,都是对α中的最左(右)非终结符进行替换,最右推导被称为规范推导。
例2.9: 试构造文法,该文法可以生成所有不能以0开头的偶数,
解:偶数的组成和特点:
包含符号位,
可以是一位偶数 (A)
2,4,6,8
可以是多位偶数(B)
首位不能为0,末位只能是0,2,4,6,8,中间为任意
G(Z): E->SA|SB
S->+|-| ε
A->2|4|6|8
C->A|1|3|5|7|9
D->0|C
G->0|A
B->CFGF->DF|D| ε
例2.10: 已知语言L={x | x∈{a,b,c}*},且x的排列是对称的(aabcbaa,aabbaa,等,即回文)。 写出该语言的文法。
G(Z):
Z ->a|b|c|ε
|aZa
|bZb
|cZc
2.4.2.4语法分析树与二义性
语法分析树:简称语法树,用来表示推导过程。具有不唯一性。
示例: 例如对于文法 E→E+E|E*E|(E)|i, 关于(i*i+i)的推导形成语法树如图
1.语法树的根结由开始符号所标记。
2.随着推导的展开,当某个非终结符被它的某个候选式所替换时,这个非终结符的相应结就产生了下一代新结点。每个新结点和其父亲结点间都有一条连线。
3.在一棵语法树生长过程中的任何时刻,所有那些没有后代的端末结自左至右排列起来就是一个句型。如果一个文法存在某个句子对应两棵不同的语法树(有两个不同的最左(最右)推导),则称这个文法是二义的。
2.4.2.5上下文无关文法的几点限制
(1)文法中不含任何下面形式的产生式: P→P因为这种产生式除了产生二义性外没有任何用处。
(2)每个非终结符P必须有用处。这一方面意味着,必须存在含P的句型;也就是,从开始符号出发,存在推导 S=>*αPβ.另一方面意味着,必须存在终结符串γ∈VT*,使得P=>+γ;也就是,对于P不存在永不终结的回路。
2.4.2.6形式语言鸟瞰
2.习题总结:
1.最左(右)推导:由文法推导出句子,这类题目还算简单,只是要注意推导过程中不是最后才转化为终结符,而是一边推导一边转换;
2.二义性:
1)证明文法是二义性的问题,方法是构造同等级的终结符号串,判断其是否会产生多棵语法数,(有时候自己构造的不一定就能正好出现多棵语法树);
2)消除文法二义性问题,找到两种方法,一是不改变文法规则,修改优先级;二是构造一个等价的无二义性文法(个人觉得还是第一种比较好想一些);
3.给出语言的相应文法:要熟记四类文法的规则(凭着第一感觉死推一般是推不出来的)。
3.课程总结:
以前学编程,现在学程序设计语言的本质,但确实感觉有点绕,有些东西觉得太简单了,一听就明白,有些东西听了也没绕过来,就比如怎么由语言推导相应的文法,简单的一下子出答案,难点的、复杂的就把自己绕进去了。这一章主要讲的就是文法,概念能理解,有些做题方法还没get到(但是觉得还是比有限自动机好掌握点)。