导航:首页 > 源码编译 > 编译原理最左推导代码

编译原理最左推导代码

发布时间:2025-05-11 02:17:57

① 句柄的编译原理

一个句型的最左直接短语称为该句型的句柄,句型的句柄是和某产生式右部匹配的子串,并且,把它规约成该产生式左部的非终结符,代表了最右推导过程的逆过程的一步。
如右图,在推导过程中,S→aABe→aAde→aAbcde→abbcde,此四步的句柄分别为aABe,d,Abc,b
句柄的特征:
1. 它是直接短语,即某规则右部。
2. 它具有最左性。
注意:短语、直接短语和句柄都是针对某一句型的,特指句型中的哪些符号子串能构成短语和直接短语,离开具体的句型来谈短语、直接短语和句柄是无意义的。另外句柄的右边仅含终结符如果文法二义,那么句柄可能不唯一。

② 一个编译原理问题

首先写出指定句型的规范推导:

S→(L)→(L,S)→(L,(L))→(L,(S))→(L,(a))→(S,(a))

然后画出分析树如下图

根据分析树的叶子结点可以找出该句型的所有短语:

aS(a)S,(a)(S,(a))

直接短语,就是经过一次非终结符替换得到的短语:

aS没了

句柄就是最左直接短语,要进行规约的部分,根据分析树我们找到最左直接短语为:

S

③ 编译原理文法问题,急急急

第一题
S->AB

A->aA'b
A'->aA'b|ε
B->B'
B'->dB'|ε
----------------------
第二题
S->aS'b

S'->aS'b|D
D->dD|ε
----------------------
第三题
最左推导的话,我认为要先消除左递归才行(把左递归转成右递归),消除之后:
N->DN'
N'->DN'|ε
D->0|1|2|...|9
最左推导为 N->DN'->2N'->2DN'->25N'->25DN'->258N'->258
规范推导(最右推导)为N->ND->N8->ND8->N58->D58->258
----------------------
第四题
构造一下语法树就知道了。直接短语是深度为2的节点(根节点是深度0)。短语是深度为2的节点代入深度为1的产生式中。句柄是所有直接短语中最左的那个。
1.baaa
>>>
_________S
_______/___\
______A_____B
_____/__\____|
____A___a___a
___/__\
__b___B
_______|
______a
直接短语为 Aa、a
短语为 Aaa
句柄为 Aa
2.bBaa
>>>
_________S
_______/___\
______A_____B
_____/__\____|
____A___a___a
___/__\
__b___B
直接短语为 Aa、a
短语为 Aaa
句柄为 Aa

④ 编译原理全部的名词解释

书上有别那么懒!。。。。
编译过程的六个阶段:词法分析,语法分析,语义分析,中间代码生成,代码优化,目标代码生成
解释程序:把某种语言的源程序转换成等价的另一种语言程序——目标语言程序,然后再执行目标程序。解释方式是接受某高级语言的一个语句输入,进行解释并控制计算机执行,马上得到这句的执行结果,然后再接受下一句。
编译程序:就是指这样一种程序,通过它能够将用高级语言编写的源程序转换成与之在逻辑上等价的低级语言形式的目标程序(机器语言程序或汇编语言程序)。
解释程序和编译程序的根本区别:是否生成目标代码
句子的二义性(这里的二义性是指语法结构上的。):文法G[S]的一个句子如果能找到两种不同的最左推导(或最右推导),或者存在两棵不同的语法树,则称这个句子是二义性的。
文法的二义性:一个文法如果包含二义性的句子,则这个文法是二义文法,否则是无二义文法。
LL(1)的含义:(LL(1)文法是无二义的; LL(1)文法不含左递归)
第1个L:从左到右扫描输入串 第2个L:生成的是最左推导
1 :向右看1个输入符号便可决定选择哪个产生式
某些非LL(1)文法到LL(1)文法的等价变换: 1. 提取公因子 2. 消除左递归
文法符号的属性:单词的含义,即与文法符号相关的一些信息。如,类型、值、存储地址等。
一个属性文法(attribute grammar)是一个三元组A=(G, V, F)
G:上下文无关文法。
V:属性的有穷集。每个属性与文法的一个终结符或非终结符相连。属性与变量一样,可以进行计算和传递。
F:关于属性的断言或谓词(一组属性的计算规则)的有穷集。断言或语义规则与一个产生式相联,只引用该产生式左端或右端的终结符或非终结符相联的属性。
综合属性:若产生式左部的单非终结符A的属性值由右部各非终结符的属性值决定,则A的属性称为综合属
继承属性:若产生式右部符号B的属性值是根据左部非终结符的属性值或者右部其它符号的属性值决定的,则B的属性为继承属性。
(1)非终结符既可有综合属性也可有继承属性,但文法开始符号没有继承属性。
(2) 终结符只有综合属性,没有继承属性,它们由词法程序提供。
在计算时: 综合属性沿属性语法树向上传递;继承属性沿属性语法树向下传递。
语法制导翻译:是指在语法分析过程中,完成附加在所使用的产生式上的语义规则描述的动作。
语法制导翻译实现:对单词符号串进行语法分析,构造语法分析树,然后根据需要构造属性依赖图,遍历语法树并在语法树的各结点处按语义规则进行计算。
中间代码(中间语言)
1、是复杂性介于源程序语言和机器语言的一种表示形式。
2、一般,快速编译程序直接生成目标代码。
3、为了使编译程序结构在逻辑上更为简单明确,常采用中间代码,这样可以将与机器相关的某些实现细节置于代码生成阶段仔细处理,并且可以在中间代码一级进行优化工作,使得代码优化比较容易实现。
何谓中间代码:源程序的一种内部表示,不依赖目标机的结构,易于代码的机械生成。
为何要转换成中间代码:(1)逻辑结构清楚;利于不同目标机上实现同一种语言。
(2)便于移植,便于修改,便于进行与机器无关的优化。
中间代码的几种形式:逆波兰记号 ,三元式和树形表示 ,四元式
符号表的一般形式:一张符号表的的组成包括两项,即名字栏和信息栏。
信息栏包含许多子栏和标志位,用来记录相应名字和种种不同属性,名字栏也称主栏。主栏的内容称为关键字(key word)。
符号表的功能:(1)收集符号属性 (2) 上下文语义的合法性检查的依据: 检查标识符属性在上下文中的一致性和合法性。(3)作为目标代码生成阶段地址分配的依据
符号的主要属性及作用:
1. 符号名 2. 符号的类型 (整型、实型、字符串型等))3. 符号的存储类别(公共、私有)
4. 符号的作用域及可视性 (全局、局部) 5. 符号变量的存储分配信息 (静态存储区、动态存储区)
存储分配方案策略:静态存储分配;动态存储分配:栈式、 堆式。
静态存储分配
1、基本策略
在编译时就安排好目标程序运行时的全部数据空间,并能确定每个数据项的单元地址。
2、适用的分配对象:子程序的目标代码段;全局数据目标(全局变量)
3、静态存储分配的要求:不允许递归调用,不含有可变数组。
FORTRAN程序是段结构,不允许递归,数据名大小、性质固定。 是典型的静态分配
动态存储分配
1、如果一个程序设计语言允许递归过程、可变数组或允许用户自由申请和释放空间,那么,就需要采用动态存储管理技术。
2、两种动态存储分配方式:栈式,堆式
栈式动态存储分配
分配策略:将整个程序的数据空间设计为一个栈。
【例】在具有递归结构的语言程序中,每当调用一个过程时,它所需的数据空间就分配在栈顶,每当过程工作结束时就释放这部分空间。
过程所需的数据空间包括两部分
一部分是生存期在本过程这次活动中的数据对象。如局部变量、参数单元、临时变量等;
另一部分则是用以管理过程活动的记录信息(连接数据)。
活动记录(AR)
一个过程的一次执行所需要的信息使用一个连续的存储区来管理,这个区 (块)叫做一个活动记录。
构成
1、临时工作单元;2、局部变量;3、机器状态信息;4、存取链;
5、控制链;6、实参;7、返回地址
什么是代码优化
所谓优化,就是对代码进行等价变换,使得变换后的代码运行结果与变换前代码运行结果相同,而运行速度加快或占用存储空间减少。
优化原则:等价原则:经过优化后不应改变程序运行的结果。
有效原则:使优化后所产生的目标代码运行时间较短,占用的存储空间较小。
合算原则:以尽可能低的代价取得较好的优化效果。
常见的优化技术
(1) 删除多余运算(删除公共子表达式) (2) 代码外提 +删除归纳变量+ (3)强度削弱; (4)变换循环控制条件 (5)合并已知量与复写传播 (6)删除无用赋值
基本块定义
程序中只有一个入口和一个出口的一段顺序执行的语句序列,称为程序的一个基本块。

给我分数啊。。。

⑤ 编译原理的最左推导和最右推导问题

最左推导:
S=> (L) =>(L,S)=>(S,S)=>(a,S)=>(a,(L))=>(a,(L,S))=>(a,(S,S))=>(a,((L),S))=>(a,((L,S),S))
=>(a,((S,S),S))=>(a,((a,S),S))=>(a,((a,a),S))=>(a,((a,a),(L)))=>(a,((a,a),(L,S)))
=>(a,((a,a),(S,S)))=>(a,((a,a),(a,S)))=>(a,((a,a),(a,a))) 共17步
最右推导
S=> (L) =>(L,S)=>(L,(L))=>(L,(L,S))=>(L,(L,(L)))=>(L,(L,(L,S)))=>(L,(L,(L,a)))=>(L,(L,(S,a)))
=>(L,(L,(a,a)))=>(L,(S,(a,a)))=>(L,((L),(a,a)))=>(L,((L,S),(a,a)))=>(L,((L,a),(a,a)))
=>(L,((S,a),(a,a)))=>(L,((a,a),(a,a)))=>(S,((a,a),(a,a)))=>(a,((a,a),(a,a)))

⑥ 编译原理最左最右推导规则

因为推导过程并不要求所有的产生式都用上。再给你举个例子,比如:
baa,那推导也是S=>AB=>bBB=>baB=>baa,也没有用到那个式子啊。
当然,有可能这个式子永远用不到,也就是这个式子的功能可以用另外的式子替换,这时候,这个文法就是有冗余的。

⑦ 编译原理-句型、句子、短语、直接短语、句柄、素短语、最左素短语

在进行语法分析的时候,有时候会对这些词语的概念不清晰,这里我们就详细归纳总结一下。

可以看出这个里面,最需要理解的概念就是短语,其他大部分概念都是在短语基础上延伸的,从概念上可以看出:

假设有一个文法

针对文法的一个特定句型 (Sd(T)db) , 其推导过程如下:

这个句型 (Sd(T)db) 对应的 CFG 分析树如下:

那个这个句型 (Sd(T)db) 有多少个短语呢?

还记得短语的定义么, S ⇒* αβδ , αβδ 代表句型就是这里的 (Sd(T)db) 。

因此这个句型 (Sd(T)db) :

算法非常简单,就是通过分析树的后序遍历,先将子树的叶节点从左到右排合并成字符串(即一个短语),然后用它代表子树的根节点的值,再和与子树根节点同一层节点值合并,得到新的短语。就这样从分析树的最底层,一路合并到分析树的根节点,就能得到所有的短语了。

通过递归的方法,获取短语列表 phraseList , 直接短语列表 directPhraseList 和 素短语列表 plainPhraseList 。

运行结果:

⑧ 编译原理的最左推导和最右推导。。。

(2)给出句子0127,34和568的最左推导和最右推导我是刚学编译原理,不知道该怎么去思考,从那入手呢? (1)带先导0的十进制无符号整数 (2)最左推导:

阅读全文

与编译原理最左推导代码相关的资料

热点内容
android开发升级 浏览:295
要火社区app进不去怎么办 浏览:823
安卓手机上的自定义功能怎么用 浏览:226
方舟服务器怎么购买进去资格 浏览:41
一个新奇app能给用户带来什么 浏览:260
安卓水果忍者叫什么 浏览:400
python爱奇艺爬虫爬取 浏览:827
有病问医生下载哪个app 浏览:680
梁与柱交接处柱箍筋加密区 浏览:702
拿着文件夹正确的上台方式 浏览:118
什么样的app跟微信一样交流的 浏览:304
51单片机代码生成 浏览:479
pythonqt招聘 浏览:255
androidadb开发 浏览:895
什么叫做智能app 浏览:287
androidstudio读取文件 浏览:355
python导出sap 浏览:515
车智汇app如何下载 浏览:437
python如何将图片输出到云服务器 浏览:840
贵阳螺杆压缩冷凝机组组成 浏览:117