书接上回(要看前面的点这里)
一、高级语言介绍
高级语言指定的是不同于机器语言与汇编语言需要经过编译才能被执行的语言,如c,c++,java,py等(我想大家都知道)。对于他们是强制性、应用性、算法语言,面向对象,数据分析等等语言分类也不赘述了(读者自行补充)。
与机器语言或汇编语言比较,高级语言的优点:
较接近于数学语言和工程语言,比较直观、自然和易于理解;便于验证其正确性,易于改错;编写效率高;易于移植.
二、程序语言的定义
程序语言由两方面定义:语法、语义
1.语法
一组规则,用它可以形成和产生一个合式(well-formed)的程序。
词法规则:
数、标识符、基本字、算符、界符等。
描述工具:
正规式和有限自动机
语法规则:
语法单位的形成规则。语法单位通常包括:表达式、语句、分程序、过程、函数、程序等。
描述工具:
上下文无关文法
eg:
E→i
E→E+E
E→E*E
E→(E)
以上是一组产生式(后面会提到),它就是一种文法描述工具,将抽象的文法分解为具体的。
ps: 语法规则和词法规则定义了程序的的形式结构。定义语法单位的意义属于语义问题。
2.语义
描述方法:
自然语言描述(缺点):隐藏错误、二义性和不完整性
形式描述(方法): 操作语义(PL/1)、指称语义(ADA)、代数语义(PASCAL)
三、数据类型
在不同的编程语言中对于数据类型的符号定义不同,但是对于他们表达的含义基本相同
1.包含要素:
- 用于区别这种类型数据对象的属性
- 这种类型的数据对象可以具有的值
- 可以作用于这种类型的数据对象的操作
2.初等数据类型
-
数值类型:整型、实型、复数、双精度, 运算:+,-,*,/等
-
逻辑类型:布尔运算:∨,∧,┑
- 字符类型:符号处理
- 指针类型
3.抽象数据类型
- 数据对象的一个集合;
- 作用于这些数据对象的抽象运算的集合
- 这种类型对象的封装,即除了使用类型中所定义的运算外,用户不能对这些对象进行操作。
4.标识符与名字
1.标识符
以字母开头的,由字母数字组成的字符串
2.名字
代替某个值的变量指向名(如a=1,a就是名字)
3.区别
标识符:是语法概念
名字:有确切的意义和属性
四、语句与控制结构
1.表达式
表达式由运算量(也称操作数,即数据引用或函数调用)和算符(操作符)组成。具体的形成规则依据编程语言以及定义而定。
形式:
中缀表达式 | 前缀表达式 | 后缀表达式 |
X*Y | -A | P↑ |
2.名字的左值
eg: a=1;语句中的a
该名字代表的那个单元(地址)称为该名字的左值。(所代表的存贮单元的地址)
3.名字的右值
eg: a=1;语句中的1
一个名字的值称为该名字的右值。(所代表的存贮单元的内容)
五、程序语言的语法描述
1.几个概念:
- 考虑一个有穷 字母表∑ 字符集
- 其中每一个元素称为一个字符
- ∑上的字(也叫字符串) 是指由∑中的字符所构成的一个有穷序列
- 不包含任何字符的序列称为空字,记为ε
- 用∑*表示∑上的所有字的全体,包含空字ε
eg:设 ∑={a, b},则∑*={ε,a,b,aa,ab,ba,bb,aaa,...}
- ∑*的子集U和V的连接(积)定义为UV={ ab | aÎU & bÎV },设:U={ a, aa }V= { b, bb } 那么:UV= { ab, abb, aab, aabb}
- ∑*的子集U和V的连接(积)定义为UV={ ab | aÎU & bÎV }, V自身的 n次积记为Vn=VV…V ,规定V0={e},令V*=V0∪V1∪V2∪V3∪… 称V*是V的闭包;记 V+=VV* ,称V+是V的正则闭包。
- 设:U={ a, aa } 那么:U* = { e , a, aa, aaa, aaaa, …}, U+ = { a, aa, aaa, aaaa, …}
2.上下文无关文法
文法:
描述语言的语法结构的形式规则
上下文无关文法的定义:
一个上下文无关文法G是一个四元式 G=(Vt,Vn,S,P),其中
- Vt:终结符集合(非空)
- Vn:非终结符集合(非空),且Vt ∩Vn=空集
- S:文法的开始符号,S∈VN
- P:产生式集合(有限),每个产生式形式为P→a, P∈Vn, a ∈ (Vt ∪Vn)*
- ¨开始符S至少必须在某个产生式的左部出现一次。
例,定义只含 + , * 的算术表达式的文法 G=<{ i , + , * , ( , )} , {E} , E , P> ,其中,P由下列产生式组成:
E → i
E →E+E
E→ E*E
E →(E)
几点规定:
- “ → ”也可以用“::="表示, 这种表示称为巴科斯范式(BNF)
- P → a1 ,P→ a2 ,......,P → an可缩写为 P → a1|a2|......|an 其中,“|”读成“或”,称为P的一个候选式。
表示一个文法时,通常只给出开始符号和产生式,如上例,
可表示为:G(E): E →i | E+E | E*E | (E)
eg:
定义:称aAb直接推出agb,即aAb=>agb仅当A→g是一个产生式, 且a, b∈ (Vt ∪ Vn)* 。
上例解释:我们定义一个这样的过程即如果aAb能够经过若干步推导出agb则称aAb可以推导出agb,记为 aAb=>agb,而这种情况下我们称A→g是一个产生式,因为能够经过几个操作步骤来找到A能够用g来替换。
3.推导
如果a1 => a2 =>....=> an,则我们称这个序列是从a1到an的一个推导。若存在一个从a1到an的推导,则称a1可以推导出an 。
eg:
对文法G(E): E →i | E+E | E*E | (E)
E => (E) => (E+E)=> (i+E)=> (i+i),由该式得知 E 经过若干步,能够推出(i+i),则称E可以推导出(i+i)
最左推导:
任何一步a => b都是对a中的最左非终结符进行替换
E+E => i+E => i+i
最右推导:
任何一步a => b都是对a中的最右非终结符进行替换。
E+E => E+i => i+i
4.句型与语言
- 假定G是一个文法,S 是它的开始符号。如果S经过若干步能够推导出a记作S=*>a,则将a称作是一个句型。仅含终结符号的句型是一个句子。
- 文法G所产生的句子的全体是一个语言,将它记为 L(G)。L(G)={a|S=*>a,a∈Vt*}
例: (i*i+i)是文法 G(E): E → i | E+E | E*E | (E)的一个句子。
证明:
E => (E) => (E+E)=> (E*E+E)=> (i*E+E)=>(i*i+E) => (i*i+i)
E,(E),(E*E+E),…,(i*i+i)是句型。
也就是说在得出最终结果的过程中的每一个步骤的结果都是句型,而句型中不含有非终结字符只含有终结符的句型称为句子,该文法中句子的所有可能的集合称为语言。
eg:文法 G 2 (S) :S →AB
A →aA|a
B → bB|b
请写出G2(S)的语言?
答案: L(G2)={a**mb**n|m,n>0}(**代表乘方)
5.语法树与二义性
语法树:
![](https://i-blog.csdnimg.cn/blog_migrate/ca73a056003ad8620ebfc0004de01e75.png)
二义性:
文法二义性:文法对应的语法树不唯一,如果一个文法的某个句子存在两个不同的语法树,则称该文法具有二义性。即:如果文法含有二义性的句子,则称该文法是二义性的。
语言的二义性:一个语言是二义性的,指的是如果对它不存在无二义性的文法。可能存在文法G和文法G’,一个为二义的,一个为无二义的。但两个对应的语言相等L(G)=L(G’)。即:对于一个句子,有两种文法可以表示它,称为语言二义性
二义性问题是不可判定问题,即不存在一个算法,它能在有限步骤内,确切地判定一个文法是否是二义的。但是可以找到一组无二义性文法的充分条件。
eg:
二义文法:
G(E): E → i|E+E|E*E|(E)
无二义文法:
G(E):E →T | E+T
T → F | T*F
F → (E) | i
小结
编译原理就是概念性很强的一门课,理解起来确实困难,对于一些没见过或者难以理解的定义好好啃啃,逻辑要连贯,找几个文法题练一下。还没写完,后续会尽快发的。发现错误了可以给我留言、指正,谢谢大家观看。