一、知识点
1、程序设计语言的语法和语义
语法:一组规则,用这组规则可以产生形式上正确的程序;
词法规则:合法单词的构成规则,也就是如何从字母表中选择字符构成一个合法单词(用有限状态自动机或正规式描述)。
语法规则:合法程序的构成规则,也就是如何把各个单词符号组成更大的语法单位(语句、程序)(用上下文无关文法进行描述)
语义是指这样的一组规则,使用它可以定义一个程序的意义。
语义描述方法:属性文法和基于属性文法的语法制导翻译方法。
2、高级语言的一般特征
程序语言分类:
程序设计范型:强制式语言(过程式语言,c)、应用式语言(函数式语言,lisp)基于规则的语言(prolog,yacc)面向对象的语言(java)。
编译时是否需要类型检查:静态类型语言(c,c++,java)、动态类型语言(Python, Ruby,PHP)。
类型检查强弱:弱类型语言(C,C++,VB)、强类型语言(JAVA, C#)。
程序设计语言的一般特性:程序结构、数据类型与操作、语句、控制结构。
程序结构:支持过程的嵌套定义(Pascal)、不支持过程的嵌套定义(c/c++/java)。
数据类型·;基本数据类型(int,char,float,double)、构造数据类型(指针,静态数组,动态数组)、自定义数据类型(栈,队列,字符串,结构体)。
一个数据类型通常包括以下三种要素:a.用于区别这种类型的数据对象的属性、b.这种类型的数据对象可以具有的值、c.可以作用于这种类型数据对象的操作。
表达式:
表达式的形式(前缀,中缀,后缀)、表达式中的运算符(算数,关系,逻辑;优先级,结合性)、运算符的代数性质(交换律,结合律等等)。
组成:操作数和操作符组成。
常见的算术表示形式:前缀式: +a*bc、中缀式:a+b*c、后缀式:abc*+
语句:说明性语句、执行性语句(赋值语句、控制语句、输入/输出语句)
3、程序语言的语法描述
<1>基本概念
字母表:由若干元素组成的有限非空集合,用S表示,它的每个元素称为一个符号。
符号串: 由S中的符号所构成的有穷序列。
符号串的前缀和后缀及子串:设x是一个符号串,将x的尾(前)部删掉几个字符后形成的符号串,称为x的前(后)缀;从一个符号串中删去他的一个前缀和后缀后所剩下部分称为x的子串。
空字:不包含符号的序列称为空字,记为e。
符号串的连接运算:
设x和y是两个符号串,如果将y直接拼接在x之后,称这种操作为符号串的连接;
符号串的方幂:
一个符号串与其自身的n-1的任意连接称为次符号串的n次幂,记作:xn
字符串集合的和(等价于集合的并运算):
设A、B是两个符号串的集合,则将集合A、B的和记为A+B或A È B,定义为:A ÈB={w|wÎA或wÎB}
符号串集合的连接:
S*的子集U和V中的(连接)积定义为:
UV={ab∣aÎU & bÎV }
即集合UV中的符号串是由U和V的符号串连接而成的。注意,一般UV¹VU,但(UV)W=U(VW).
符号串集合V自身的n次(连接)积记为:
Vn= V V…V (n个V)
规定 V0 = {e}.
V的闭包:
令:V* = V0ÈV1ÈV2È…
称 V*是V的闭包。
V的正则包(正闭包,正则闭包):
记V+ = VV*, 称 V+是V的正则包,即V+=V1ÈV2ÈV3È…。
<2>文法
文法是描述语言的语法结构的形式规则(即语法规则)。
上下文无关文法的特点:
它所定义的语法范畴(或语法单位)是完全独立于这种范畴可能出现的环境的。
特点:独立性
上下文无关文法G包括四个组成部分:一组终结符号,一组非终结符,一个开始符号,以及一组产生式。
形式上定义一个上下文无关文法G是一个四元式(VT,VN,S,P)。
终结符号:组成语言的基本符号,即在程序语言中以前屡次提到的单词符号。开始符号:一个特殊的非终结符号,它代表所定义的语言中我们最感兴趣的语法范畴。
αAβ Þ αγ β 该推导称为直接推导(直接导出)
最左(最右)推导:在推导的任何一步αÞβ,其中α、β是句型,都是对α中的最左(右)非终结符进行替换。
语法分析树:简称语法树。用来表示推导过程。
<3>文法的二义性如果一个文法存在某个句子对应两棵不同的语法树,则称这个文法是二义的。也就是说,若一个文法存在某个句子,它有两个不同的最左(最右)推导,则这个文法是法是二义的。
<4>四种文法的比较
类型 | 产生式形式 | 文法名称 | 定义的语言 | 描述能力 | 包含关系 |
0型文法 | a®b | 短语文法 | 递归可枚举语言 | 最强 | |
1型文法 | a®b |a|<=|b| | 上下文有关文法 | 上下文有关语言 | 次之 | 又是0型文法 |
2型文法 | A®b | 上下文无关文法 | 上下文无关语言 | 次之 | 0,1文法 |
3型文法 | A®Bb A®bB | 正规文法 | 正规语言 | 最弱 | 0,1,2型文法 |
二、应用
课后题:
6、(1) L ( G6 ) 是0~9 组成的数字串.
(2)最左推导: N =>ND =>NDD =>NDDD =>DDDD =>0DDD =>01DD=>012D=>0127
N =>ND =>DD =>3D=>34
N =>ND =>NDD =>DDD =>5DD =>56D =>568
最右推导: N =>ND =>N7=>ND7=> N27=> ND27=> N127=> D127=>0127
N =>ND =>N4=>D4=> 34
N =>ND =>N8=>ND8=> N68=>D68=>568
7、G( S )
S->J | AJ
J->1 |3| 5| 7| 9
O->2 |4 |6 |8 | J
T->0 | O
A->AT | O
8、(2)
i + i + i i + i * i
10、S->TS | T
T->( S ) | ( )
三、学习感受
经过两周编译原理的学习,感觉编译原理有点难理解,错综复杂的知识点,理解性偏多,课上老师讲的文法,老师讲时自己能跟下来,但一到自己做的时候,无从下手,思路不清,感觉自己想不到。学习编译原理觉得有点困难。