[编译原理]学习笔记(二)——文法和语言

一、 对程序设计语言的描述从语法、语义和语用三个因素考虑:
a) 语法:对语言结构的定义;
b) 语义:语言的含义;
c) 语用:从使用的角度描述语言。
形式语言理论是编译的理论基础。
二、 字母表:元素的非空有穷集合;
符号/字符:字母表中的元素;
符号串:符号的有穷序列。
三、 符号串运算:
a) 符号串的连接:εx=xε=x;
b) 集合的乘积:AB={xy|x∈A,y∈B};{ε}A=A{ε}=A;
c) 符号串的幂运算:x=abc,x^2=abcabc;
d) 集合的幂运算
e) 正闭包A+与闭包A*:A*={ε}∪A+
四、 形式语言:字母表上按照某种规则构成的所有符号串的集合,其不考虑语义。描述形式语言的方式有两种:
a) 枚举——当语言为有穷集合时;
b) 文法——描述了无穷集合的语言。
五、 文法:G=(Vn,Vt,P,S)
a) 规则P:也称为产生式,是一个符号与一个符号串的有序对(A,β)
A→β
i. 一组规则定义了一个语言的语法结构;
ii. 规则中出现的符号分为终结符号和非终结符号
b) Vn为非终结符(non-terminate);
c) Vt为终结符(terminate);
d) S为非终结符号,称为文法的开始符号/识别符号,至少要在一条规则的左部出现。
六、 推导:推导的依据是规则
a) 直接推导:仅使用一次规则;
b) 推导:至少使用一次规则;
c) 广义推导:经过0步或若干步的推导。
d) 最右推导又称规范推导,推导出的句型为规范举行;与之对应的最左规约为规范规约。
七、 句型、句子和语言:
a) 句型:S=*>x, x∈(Vn∪Vt)*,其中S=*>x为广义推导。
b) 句子:S=*>x, x∈Vt*,其中S=*>x为广义推导,x必须是终结符的闭包(可为ε)。
c) 语言:L(G[S])={x|S=+>x且x属于Vt*},其中S=+>x为推导,至少使用一次规则。
八、 递归:
a) 递归规则:在规则的左部和右部具有相同非终结符的规则;
i. 规则左递归:A->A…;
ii. 规则右递归:A->…A;
iii. 规则递归:A->…A…;
b) 文法递归:对文法中的任一非终结符,若能建立一个推导过程使得右部再次出现该非终结符,则文法是递归的。如:U->Vx, V->Uy|z,虽然这两个规则都不是递归规则,但组成的文法是递归文法U->Vx->Uyx。所以含有递归规则的文法一定是递归文法,而递归文法不一定含有递归规则。
九、 短语、直接短语和句柄:都是针对某一句型的
a) 短语:S=*>αAδ且A=+>β,则称β是相对于非终结符A的句型αAδ的短语;对应语法树中的子树概念。
b) 直接短语:其中A=>β为直接推导;对应语法树中的简单子树。每个直接短语都是某规则的右部。
c) 句柄:是直接短语(即某规则的右部),且具有最左性;对应简单子树中最左的一棵。
十、 文法的二义性:如果一个文法存在某个句子对应两棵不同的语法树|包含两个或两个以上的最右(最左)推导(规约),则该文法是二义性的,可以利用文法之间的等价性来消除二义性。
a) 不改变文法中原有的语法规则,进增加一些语法的非形式定义,如优先级;
b) 构造一个等价的无二义性文法。
十一、 文法的分类:
a) 0型文法/无限制文法:α->β,其中α∈(Vn∪Vt)*且至少含有一个非终结符,β∈(Vn∪Vt)*。
b) 1型文法/上下文有关文法:αAβ->αuβ,其中A∈Vn,α,β∈(Vn∪Vt)*,u∈(Vn∪Vt)+。
c) 2型文法/上下文无关文法:A->β,其中A∈Vn,β∈(Vn∪Vt)*。常用于句法分析。
d) 3型文法/正规文法:常用于词法分析
i. 右线性文法:只能对推出式的右边展开,A->αB|α,A,B∈Vn,α∈Vt*。
ii. 左线性文法:只能对推出式的左边展开,A->Bα|α,A,B∈Vn,α∈Vt*。

实验2 文法的读入、判定和处理 一、实验目的 熟悉文法的结构,了解文法在计算机内的表示方法。 、实验内容 1、 设计一个表示文法的数据结构; 2、 从文本文件中读入文法,利用定义的数据结构存放文法,并输出; 3、 本实验结果将来还有用。 三、实验要求 1、 了解文法定义的4个部分: G(Vn, Vt, S, P) Vn 文法的非终结符号集合,在实验中用大写的英文字母表示; Vt 文法的终结符号集合,在实验中用小写的英文字母表示; S 开始符号,在实验中是Vn集合中的一个元素; P 产生式,分左部和右部,左部为非终结符号中的一个,右部为终结符号或非终结符号组成的字符串,如S->ab|c 2、 根据文法各个部分的性质,设计一个合理的数据结构用来表示文法, 1) 若使用C语言编写,则文法可以设计成结构体形式,结构体中应包含上述的4部分, 2) 若使用C++语言或java语言编写,则文法可以设计成文法类形式,类中至少含有4个数据成员,分别表示上述4个部分 文法数据结构的具体设计由学生根据自己想法完成,并使用C或C++语言或Java实现设计的数据结构。 3、 利用完成的数据结构完成以下功能: 1) 从文本文件中读入文法文法事先应写入文本文件); 2) 根据文法产生式的结构,分析出文法的4个部分,分别写入定义好的文法数据结构的相应部分; 3) 整理文法的结构,判断该文法文法类型,是否为0型,1型,2型或3型文法,并输出判断结果; 4) 在计算机屏幕或者文本框中输出文法文法输出按照一个非终结符号一行,开始符号引出的产生式写在第一行,同一个非终结符号的候选式用“|”分隔的方式输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值