当前位置:首页 » 编程软件 » 推导编译原理

推导编译原理

发布时间: 2025-03-03 11:37:31

❶ 什么是*=>星推导(编译原理) 星推导和加推导的区别

在编译原理中,产生式的推导可以细分为  *=>  "星推导"和 +=> "加推导",

那么这两个分别是什么意思呢?

其实,'*' 和 '+' 这两个符号是来自 正则表达式 的,正则表达式是什么大家可以先不了解,弄懂这个问题暂时只需要知道 '*' 和 '+' 这两个符号的意思就可以了。

符号 * :[1, n)  1到多

符号 + :[0, n) 0到多

则, *=>  "星推导" 为对产生式进行1到多次推导; +=> "加推导" 为对产生式进行0到多次推导。

【举例】

(1)v +=> w:意为产生式左端的 v 经过1到多次推导后能得到右端的 w

(2)v * => w: 意为产生式左端的 v 经过0到多次推导后能得到右端的w(其实,

                 就是比第(1)条多了一种情况,即 v= w,当 v= w 时,v不需要推导即可得到w,所以推导的次数为0)

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

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

❸ 编译原理问题:求解

E是文法开头。ε代表终结符号(推理中代表终点或结果,程序语言中代表常量等)。E T 这些大写字母一般代表非终结符号(这些代表中间过程,非结果。程序中代表函数等等)。开始是E。因为有个G(E)。E就是文法开始符号。推导就有E开始,它也是一个非终结符(代表函数、或者一个推导过程,类似于程序中的main(c++)、winmain(vc++)、dllmain(dll)等主函数)。

1算术表达式文法:这个文法是一个递归文法。计算机进行逻辑推导时会走很多弯路(类似于遍历一颗树的过程)。为了不让计算机走弯路(提高效率的目的),可以变换为第二种文法。这种文法消除了递归(消除了歧义,类似于后缀表达式),使计算机可以一条直线走到底儿推导出结果。

我也很久没看编译原理了。 呵呵

❹ 【编译原理】第二章:语言和文法



上述文法 表示,该文法由终结符集合 ,非终结符集合 ,产生式集合 ,以及开始符号 构成。
而产生式 表示,一个表达式(Expression) ,可以由一个标识符(Identifier) 、或者两个表达式由加号 或乘号 连接、或者另一个表达式用括号包裹( )构成。

约定 :在不引起歧义的情况下,可以只写产生式。如以上文法可以简写为:

产生式

可以简写为:

如上例中,

可以简写为:

给定文法 ,如果有 ,那么可以将符号串 重写 为 ,记作 ,这个过程称为 推导
如上例中, 可以推导出 或 或 等等。

如果 ,
可以记作 ,则称为 经过n步推导出 ,记作 。

推导的反过程称为 归约

如果 ,则称 是 的一个 句型(sentential form )。

由文法 的开始符号 推导出的所有句子构成的集合称为 文法G生成的语言 ,记作 。
即:


文法

表示什么呢?
代表小写字母;
代表数字;
表示若干个字母和数字构成的字符串;
说明 是一个字母、或者是字母开头的字符串。
那么这个文法表示的即是,以字母开头的、非空的字符串,即标识符的构成方式。

并、连接、幂、克林闭包、正闭包。
如上例表示为:

中必须包含一个 非终结符


产生式一般形式:
即上式中只有当上下文满足 与 时,才能进行从 到 的推导。

上下文有关文法不包含空产生式( )。


产生式的一般形式:
即产生式左边都是非终结符。

右线性文法
左线性文法
以上都成为正则文法。
即产生式的右侧只能有一个终结符,且所有终结符只能在同一侧。

例:(右线性文法)

以上文法满足右线性文法。
以上文法生成一个以字母开头的字母数字串(标识符)。
以上文法等价于 上下文无关文法

正则文法能描述程序设计语言中的多数单词。

正则文法能描述程序设计语言中的多数单词,但不能表示句子构造,所以用到最多的是CFG。

根节点 表示文法开始符号S;
内部节点 表示对产生式 的应用;该节点的标号是产生式左部,子节点从左到右表示了产生式的右部;
叶节点 (又称边缘)既可以是非终结符也可以是终结符。

给定一个句型,其分析树的每一棵子树的边缘称为该句型的一个 短语
如果子树高度为2,那么这棵子树的边缘称为该句型的一个 直接短语

直接短语一定是某产生式的右部,但反之不一定。

如果一个文法可以为某个句子生成 多棵分析树 ,则称这个文法是 二义性的

二义性原因:多个if只有一个else;
消岐规则:每个else只与最近的if匹配。

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

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

❻ 一个编译原理问题

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

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

然后画出分析树如下图

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

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

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

aS没了

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

S

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

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

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

假设有一个文法

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

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

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

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

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

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

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

运行结果:

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

最左推导:
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)))

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

最左推导:
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)))

❿ 编译原理

编译原理):利用编译程序从源语言编写的源程序产生目标程序的过程; 用编译程序产生目标程序的动作。 编译就是把高级语言变成计算机可以识别的2进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成2进制的。

编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码生成

(10)推导编译原理扩展阅读:

编译程序的语法分析器以单词符号作为输入,分析单词符号串是否形成符合语法规则的语法单位,如表达式、赋值、循环等,最后看是否构成一个符合要求的程序,按该语言使用的语法规则分析检查每条语句是否有正确的逻辑结构,程序是最终的一个语法单位。

编译程序的语法规则可用上下文无关文法来刻画。语法分析的方法分为两种:自上而下分析法和自下而上分析法。自上而下就是从文法的开始符号出发,向下推导,推出句子。

而自下而上分析法采用的是移进归约法,基本思想是:用一个寄存符号的先进后出栈,把输入符号一个一个地移进栈里,当栈顶形成某个产生式的一个候选式时,即把栈顶的这一部分归约成该产生式的左邻符号。

热点内容
nginx访问下载 发布:2025-03-03 21:49:00 浏览:243
sqlserver2008服务器配置 发布:2025-03-03 21:47:35 浏览:143
猫怎么重新设置密码 发布:2025-03-03 21:47:29 浏览:343
linux文件的类型 发布:2025-03-03 21:47:26 浏览:840
网络共享无法访问权限 发布:2025-03-03 21:27:52 浏览:72
安卓移动服务是什么意思啊 发布:2025-03-03 21:27:43 浏览:460
用命令行运行java 发布:2025-03-03 21:19:00 浏览:164
c语言62f 发布:2025-03-03 21:17:30 浏览:231
政务云服务器 发布:2025-03-03 21:01:35 浏览:685
美团一般服务器搭建什么位置 发布:2025-03-03 20:59:01 浏览:825