编译原理
starter_zheng
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
编译原理 —— 字母表
字母表概念字母表 Σ 是一个有穷符号集合基本运算乘积幂运算字母表的n次幂长度为n的符号串构成的集合长度为0的符号串即为空串正闭包长度正数的符号串构成的集合克林闭包任意长度(包括0)的字符串构成的集合串概念设是 Σ 一个字母表,若 x ∈ Σ ,则称 x 是 Σ 上的一个串,即串是字母表中符号的一个有穷序列串s的长度,通常记作|s|,是指s中...原创 2019-01-19 12:54:30 · 4520 阅读 · 0 评论 -
编译原理 —— 短语、直接短语、素短语和句柄
定义如果 βββ 中至少含有一个终结符,而且除它自身之外不再含任何更小的素短语,那么称 βββ 为 素短语题目令文法 G1G_1G1 为:①S−>(L)∣aS∣a①S->(L)|aS|a①S−>(L)∣aS∣a②L−>L,S∣S②L->L,S|S②L−>L,S∣S证明(S,(a))(S,(a))(S,(a))是它...原创 2019-03-17 13:11:54 · 66675 阅读 · 39 评论 -
编译原理 —— 正规文法转换为正规式
正规文法与正规式都是描述正规集的工具。对任意一个正规文法,存在定义统一语言的正规式;反之,对每个正规式存在一个生成同一语言的正规文法。正规文法 → 正规式对任何正规文法G,存在定义同一语言的正规式L求解过程:① 将文法中的规则写成关于每个非终结符的正规式方程,得到一个方程组;② 依照求解规则:若A=αA∣βA=αA |βA=αA∣β,则解为A=α∗βA= α^*βA=α∗β;...原创 2019-05-01 23:51:39 · 20820 阅读 · 8 评论 -
编译原理 —— DFA的化简
DFA 的化简任何正规语言都有一个唯一的状态数目最少的DFADFA M的化简是指:寻找一个状态数比M少的DFA M’,使得L(M)=L(M’)有穷自动机的多余状态:从自动机的开始状态出发,任何可识别的输入串也不能到达的状态化简了的DFA M’ 满足两个条件:没有多余状态 ;没有两个状态是等价的。DFA M 的化简方法求解过程:① 将DFA M的状态集Q分划成两个子集:...原创 2019-05-02 08:50:11 · 26385 阅读 · 16 评论 -
编译原理 —— 有穷自动机到正规式的转换
求解步骤① 改造M为M’:引进新的初态结点X、终态结点Y;② 对M’的状态转换图实施替换,逐步消除结点,直至只剩下结点X、Y替换规则示例题目:有穷自动机的状态图如下图,求该自动机识别语言的正规式。根据规则 ① ,引入 X 结点和 Y 结点根据规则 ②,消去 V 结点和 U 结点根据规则 ②,消去 S 结点和 Z 结点故 RE = (1001)(10101)*...原创 2019-05-02 09:15:55 · 2241 阅读 · 3 评论 -
编译原理 —— 正规式转换为正规文法
对任何正规式 r,存在生成同一语言的正规文法G求解过程① 令 VT=∑V_T= ∑VT=∑ ;② 令文法的开始符号 S=RS = RS=R ;③ 对形如A→abA→abA→ab 的规则转换为A→aBA→aBA→aB 和 B→bB→bB→b;④ 在新的文法中,将形如A→a*b 的规则进一步转换为A→aA∣bA→aA | bA→aA∣b;⑤ 不断利用 ③ 和 ④ 进行转换,直到每条规...原创 2019-05-02 09:26:52 · 19612 阅读 · 5 评论 -
编译原理 —— 有穷自动机到正规文法的转换
已知有穷自动机M=(Q,∑,f,q0,Z)M=(Q, ∑ ,f ,q_0,Z)M=(Q,∑,f,q0,Z)其中,QQQ 是有限状态集,∑∑∑ 是输入字符的字母表,fff 是 Q×ΣQ×ΣQ×Σ 到 QQQ 的单值部分映射(即状态转换),q0∈Qq_0∈Qq0∈Q 是唯一初态, ZZZ 是终态集(可空)其对应的文法GR=(VN,VT,P,S)G_R=(V_N,V_T,P,S)GR...原创 2019-05-04 11:38:07 · 2571 阅读 · 0 评论 -
编译原理 —— C语言词法分析程序(C++实现)
测试文件:运行结果:单词种别码表:源代码lex.h#ifndef LEX_H_INCLUDED#define LEX_H_INCLUDED#include <iostream>#include <ctype.h>#include <string>#include <cstdio>#include <stdlib....原创 2019-05-04 21:38:53 · 7095 阅读 · 13 评论 -
编译原理 —— 非确定性的自上而下分析法
基本思想从文法的开始符号出发,向下推导出句子试图用一切可能的办法,从文法开始符号出发,自上而下地为输入串建立一课语法树(寻找一个最左推导)此分析过程本质上是一种试探过程。示例题目:设有文法 G[S]G[S]G[S]S→aAbS→aAbS→aAbA→de∣dA→de|dA→de∣d输入串 W=adbW=adbW=adb 是否为文法 G[S]G[S]G[S] 中的一个句子?...原创 2019-05-04 23:54:19 · 637 阅读 · 0 评论 -
编译原理 —— 非LL(1)文法到LL(1)文法的改写
当一个文法是左递归文法时,采用自上而下分析法会使分析过程进入无穷循环之中。文法左递归是指文法中的某个非终结符A存在推导方法一:引进一个新的非终结符,把含左递归的规则改写成右递归。(1)设关于非终结符 AAA 的直接左递归的规则为其中 α、βα、βα、β 是任意的符号串,ααα 不等于 εεε,βββ 不以 AAA 开头(2)对A的规则可改写成如下右递归形式:改写以后的形式...原创 2019-05-05 00:29:13 · 18407 阅读 · 1 评论 -
编译原理 —— 递归下降分析法
什么是递归下降分析法递归下降分析法是确定的自上而下分析法,这种分析法要求文法是LL(1)文法。为每个非终结符编制一个递归下降分析函数,每个函数名是相应的非终结符,函数体则是根据规则右部符号串的结构和顺序编写。子程序相互递归调用。示例设有 LL(1) 文法如下试构造一个识别该文法句子的递归下降分析程序。解:...原创 2019-05-06 11:42:43 · 25331 阅读 · 2 评论 -
编译原理—— 预测分析法与预测分析表的构造
预测分析法预测分析法也称为LL(1)分析法,是确定的自上而下分析法,这种分析法要求文法是LL(1)文法。预测分析表的构造预测分析器的总控程序对于不同的 LL(1)LL(1)LL(1) 文法都是相同的,而预测分析表对于不同的 LL(1)LL(1)LL(1) 文法是不相同的。产生式的 SELECT 集由 SELECT 集得预测分析表分析过程...转载 2019-05-06 13:27:10 · 12064 阅读 · 2 评论 -
编译原理 —— 自下而上分析法的一般原理
从输入串出发,反复利用产生式做归约 (用产生式的左部替代右部),自底向上逐步构造语法分析树,直至得到文法的开始符号。最终若栈中剩下句子右界符“$"和文法的开始符号,则所分析的输入符号串是文法的正确句子,否则,就不是文法的正确句子,报告错误。不管哪种自下而上的分析法都是按照”移进 - 规约“法的原理建立起来的一种语法分析方法。转载地址:https://www.icourse163.or...转载 2019-05-07 07:35:23 · 2168 阅读 · 0 评论 -
编译原理 —— 属性文法和语义规则
什么是属性文法一个属性文法是在上下文无关文法的基础上,允许每个文法符号 XXX(终结符或非终结符)根据处理的需要,定义与 XXX 相关的属性。对属性的处理有计算、传递信息等,属性处理的过程也就是语义处理过程。当然,处理时必须遵循一定的规则。为此,为每个文法规则式都定义一组属性的计算规则,称为语义规则。属性文法的表示一个属性文法形式上定义为一个三元组 AGAGAGAG=(G,V,...原创 2019-05-12 15:33:43 · 9568 阅读 · 2 评论 -
编译原理 —— 逆波兰式
逆波兰式除去了原表达式中的括号,并将运算对象写在前面,运算符写在后面,因而又称为后缀式。用逆波兰式表示表达式的最大优点是易于计算处理。逆波兰式只使用一个工作栈,当计算机自左向右顺序扫描逆波兰式时,若当前符号是运算对象则进栈,若当前符号是运算符,并且为K元运算符,则将栈顶的K个元素依次取出,同时进行K元运算,并将运算结果置于栈顶,表达式处理完毕时,其计算结果自然呈现在栈顶。逆波兰式的定义...转载 2019-05-12 21:05:29 · 6614 阅读 · 0 评论 -
编译原理 —— 三元式和树形表示
三元式三元式主要由三部分组成:(OP,arg1,arg2)其中,OP是运算符,arg1、arg2分别是第一和第二两个运算对象。当OP是一目运算时,常常将运算对象定义为arg1。三元式出现的顺序和语法成份的计值顺序相一致。三元式之间的联系是通过指示器实现的。间接三元式为了尽量少地改动三元式表,我们可以另设一张间接码表来表示有关三元式在三元式表的计值顺序。用这种方法处理的中间...转载 2019-05-12 21:41:22 · 10549 阅读 · 0 评论 -
编译原理 —— 四元式和三地址代码
四元式四元式主要由四部分组成:(OP,arg1,arg2,result)其中,OP是运算符,argl,arg2分别是第一和第二个运算对象,result是编译程序为存放中间运算结果而引进的变量,常称为临时变量。当OP是一目运算时,常常将运算对象定义为arg1。四元式出现的顺序和语法成份的计值顺序相一致。四元式之间的联系是通过临时变量实现的,这样易于调整和变动四元式。便于优化处理。...转载 2019-05-12 21:53:51 · 31944 阅读 · 0 评论 -
编译原理 —— 推导
因为最左的非终结符和最右的非终结符是唯一的,所以最左推导和最右推导具有唯一性。最左推导在最左推导中,总是选择每个句型的最左非终结符进行替换在自顶向下的分析中,总是采用最左推导的方式最右推导在最右推导中,总是选择每个句型的最右非终结符进行替换在自底向上的分析中,总是采用最左归约的方式,因此把最左归约称为规范归约,而最右推导相应地称为规范推导转载地址:https://...转载 2019-02-27 09:37:49 · 4652 阅读 · 0 评论 -
编译原理 —— S_文法,q_文法及LL(1)文法
预测分析法的工作过程S_文法条件:每个产生式的右部都以终结符开始同一非终结符的各个候选式的首终结符都不同局限性:右部不能包含ε产生式q_文法引入SELECT集和FOLLOW集q_文法中SELECT集的定义:条件:每个产生式的右部或为ε,或以终结符开始具有相同左部的产生式有不相交的SELECT集局限性:右部不可以以非终结符打头LL(1)文法...原创 2019-02-27 00:47:23 · 1754 阅读 · 0 评论 -
编译原理 —— SELECT集
SELECT集产生式 A→αA → αA→α 的可选集是指可以选用该产生式进行推导的输入符号的集合,记为SELECT(A→α)SELECT(A→α)SELECT(A→α)同一非终结符的各个产生式的可选集互不相交(否则依然无法确定使用哪一个产生式)计算产生式的SELECT集对于产生式①,FIRST(TE′)={(,id}(TE&amp;amp;amp;#x27;)=\{ (,id \}(TE′)...原创 2019-02-26 11:27:31 · 22441 阅读 · 2 评论 -
编译原理 —— 什么是编译
计算机是如何工作的机器语言:机器语言直接用二进制代码指令表达的计算机语言,指令是用0和1组成的一串代码,可以被计算机直接理解,如上图的C706 0000 0002(以16进制书写,但在计算机中是二进制)汇编语言:汇编语言是面向机器的程序设计语言,使用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。如上图的MOV X,2高级语言:高级语言是高度封...原创 2019-01-19 13:16:05 · 2763 阅读 · 0 评论 -
编译原理 —— 文法的定义
文法的形式化定义VTV_TVT:终结符是文法所定义的语言的基本符号,有时也称为token。(对应词义分析)VNV_NVN:非终结符是用来表示语法成分的符号,有时也称为&amp;amp;amp;quot;语法变量&amp;amp;amp;quot;,可以推出其它的语法成分(对应语法分析)PPP:SSS:S∈VNS∈V_NS∈VN , 开始符号表示的是该文法中最大的语法成分示例产生式的简写符号约定文法分类体系0型文法...原创 2019-01-26 17:36:42 · 16320 阅读 · 0 评论 -
编译原理 —— 语言的定义
语言的形式化定义推导用产生式的右部替换产生式的左部(生成语言)规约用产生式的左部替换产生式的右式(识别语言)判定有了文法(语言规范),如何判定某一词串是否是满足文法的句子?从生成语言的角度,如果句子可以推导出词串中的单词(token),则该词串是语言的句子从识别语言的角度,如果词串可以规约出句子的形式,则该词串是语言的句子句子和句型句子句型示...原创 2019-01-26 17:44:37 · 5162 阅读 · 0 评论 -
编译原理 —— 正规式、正规集和正则定义
正则表达式的定义正则表达式(Regular Expression,RE)是一种用来描述正则语言的更紧凑的表示方法正则文法与正则表达式等价正则表达式可以由较小的正则表达式按照特定规则递归地构建。每个正则表达式r定义(表示)一个语言,记为L(r)。ε是一个RE,L(ε)={ε}如果a是任意一个符号,则a是一个RE,L(a)={a}引用图片的语法:运算的优先级:*、连接、|示例...转载 2019-01-26 18:03:53 · 50118 阅读 · 0 评论 -
编译原理 —— 有穷自动机(FA)
有穷自动机的定义系统只需要根据当前所处的状态和当前面临的输入信息就可以决定系统的后继行为。当前状态+当前输入=后继行为FA模型FA转换图结点:FA的状态初始状态(开始状态):只有一个,由start箭头指向终止状态(接收状态):可以有多个,用双圈表示带标记的有向边:如果对于输入a,存在一个从状态p到状态q的转换,就在p、q之间画一条有向边,并标记上a。(如图中0到1)...原创 2019-01-26 19:40:18 · 9107 阅读 · 1 评论 -
编译原理 —— 串
概念设是 Σ 一个字母表,若 x ∈ Σ ,则称 x 是 Σ 上的一个串,即串是字母表中符号的一个有穷序列串s的长度,通常记作|s|,是指s中符号的个数空串是长度为0的串,用ε表示基本运算连接(类比字母表的乘积运算)如果 x 和 y 是串,那么 x 和 y 的连接是把 y 附加到 x 后面而形成的串,记作 xy空串是连接运算的单位元,即对于任何串 s 都有εs=sε=s...原创 2019-01-31 17:17:48 · 2288 阅读 · 0 评论 -
编译原理 —— 正规式转换为有穷自动机
要将正则表达式RE转换到DFA比较困难,因此,我们往往先将正则表达式RE转换为NFA,再将NFA转换为DFA根据RE构造NFA示例r=(alb)*abb从NFA到DFA的转换DFA的每个状态都是一个由NFA中的状态构成的集合,即NFA状态集合的一个子集示例(不带ε边的NFA)r=a* a b* b c* c(1)画出NFA图(2)得到转换表(3)得到结果示例...原创 2019-01-26 22:07:06 · 3732 阅读 · 1 评论 -
编译原理 —— 识别单词的DFA
识别标识符的DFA若需要识别关键字,可使用相同的DFA,再查找关键字表。识别无符号数的DFA(1)根据正则表达式得到NFA(2)将NFA转换成DFA当状态为0,输入为d时,可以进入状态1,3,6,故构造一个新的状态{1,3,6}当状态为1,输入为d时,可以进入状态1,3,6;当状态为3,输入为d时,可以进入状态3,6;当状态为6,输入为d时,可以进入状态6。{1,3,6}∪{...原创 2019-01-26 22:25:25 · 6884 阅读 · 0 评论 -
编译原理 —— CFG的分析树
CFG的分析树的定义根节点的标号为文法开始符号内部结点表示对一个产生式 A→βA→βA→β 的应用,该结点的标号是此产生式左部 AAA 。该结点的子结点的标号从左到右构成了产生式的右部 βββ叶结点的标号既可以是非终结符,也可以是终结符。从左到右排列叶节点得到的符号串称为是这棵树的产出(yield)或边缘(frontier)分析树是推导的图形化表示。句型的短语给定一个句型,其...转载 2019-01-31 21:07:38 · 6572 阅读 · 0 评论 -
编译原理 —— 知识结构导图
一、什么是编译二、语言及其文法(1)字母表(2)串(3)语言的定义(4)文法的定义(5)CFG的分析树原创 2019-01-31 21:52:23 · 4089 阅读 · 5 评论 -
编译原理 —— 什么是词法分析
词法分析词法分析用于确定各个单词的词性从左向右逐行扫描源程序的字符,识别出各个单词,确定单词的类型,将识别出的单词转换成统一的机内表示 —— 词法单元(token)形式词法分析要解决的问题是:如何将输入的字符序列转换成 token 序列token:<种别码,属性值>转载地址:https://www.icourse163.org/learn/HIT-1002123007...转载 2019-02-02 12:08:39 · 3639 阅读 · 0 评论 -
编译原理 —— 什么是语法分析
语法分析识别句子中的各个短语从词法分析器输出的token序列中识别出各类短语,并构造语法分析树(parse tree)语法分析要解决的问题是:如何根据语法规则为输入句子构造语法分析树转载地址:https://www.icourse163.org/learn/HIT-1002123007?tid=1003246005#/learn/announce...转载 2019-02-02 17:09:38 · 4648 阅读 · 0 评论 -
编译原理 —— 什么是语义分析
分析语句和声明是如何构成程序的收集标识符的属性信息种属简单变量复合变量过程类型整型实型字符型布尔型指针型存储位置、长度值作用域参数和返回值信息使用符号表和字符串表来存储这些信息符号表中Name字段为什么要设计字符串表,而不是将标识符直接放到Name字段中?必要性:现代程序语言一般不限制标识符的长度,故name字段的长度不便预先固定,短了:适用...转载 2019-02-03 11:17:54 · 5712 阅读 · 0 评论 -
编译原理 —— 自顶向下的分析
自顶向下的分析从分析树的顶部 (根节点) 向底部 (叶节点) 方向构造分析树可以看成是从文法开始符号S 推导 出词串w的过程每一步推导中,都需要做两个选择替换当前句型中的哪个非终结符用该非终结符的哪个产生式进行替换首先解决第一个问题,如何替换当前句型中的哪个非终结符?推导最左推导和最右推导具有唯一性最左推导在最左推导中,总是选择每个句型的最左非终结符进行替换...原创 2019-02-04 00:12:08 · 1197 阅读 · 0 评论 -
编译原理 —— FIRST集
串首终结符是串首第一个符号,并且是终结符。给定一个文法符号串α,α的串首终结符集 FIRST(a) 被定义为可以从a推导出的所有串首终结符构成的集合。如果 α=&amp;amp;amp;amp;amp;amp;amp;gt;∗εα=&amp;amp;amp;amp;amp;amp;amp;gt;^*εα=&amp;amp;amp;amp;amp;amp;gt;∗ε ,那么 εεε 也在 FIRST(a) 中计算文法符号 XXX 的FIRST集合对于一原创 2019-02-05 18:24:41 · 9508 阅读 · 2 评论 -
编译原理 —— FOLLOW集
FOLLOW集FOLLOW(A):紧跟在非终结符A后边的终结符α的集合如果A是某个句型的的最右符号,则将结束符 $$$ 添加到 FOLLOW(A)中计算非终结符A的 FOLLOW集合(1)将$$$放入 FOLLOW(S)中,其中S是开始符号,$$$是输入右端的结束标记(2)如果存在一个产生式 A→αBβA→αBβA→αBβ ,那么FIRST(B)中除 εεε 之外的所有符号都在FOL...原创 2019-02-05 22:08:25 · 9811 阅读 · 2 评论 -
编译原理 —— 算符优先分析法
什么是算符优先分析法算符优先分析法是一种简单、直观的自下而上分析法算符优先分析法就是仿照算术表达式的四则运算过程而设计的一种语法分析方法。这种分析方法首先要规定运算符之间(确切地说终结符之间)的优先关系和结合性质,然后借助这种关系,比较相邻运算符的优先级来确定句型的可归约串并进行归约。算符优先文法的定义一、算符文法的定义在算符文法中,任何一个规则右部都不存在两个非终...原创 2019-05-17 17:12:36 · 23265 阅读 · 9 评论
分享