编译原理
让高级语言不再神秘。
samarua
while "live" : print("Loli")
展开
-
【编译原理】代码优化,流图/DAG优化
优化原因逐条语句进行的代码生成策略经常产生含有大量冗余指令和次最优解结构的目标代码。代码优化就是被优化程序进行一种语义保持的变换 优化位置中间代码优化(与机器无关)目标代码优化(与机器有关) 优化分类局部优化循环优化全局优化 优化技术删除公共子表达式:t1 = 4 * i和t2 = 4 * i的右侧是公共的,优化为t1 = 4 * i和t2 = t1复写传播:t1 = f[t2]、t3 = t2、t4 = f[t3]优化为t1 = f原创 2020-12-11 20:52:32 · 7451 阅读 · 1 评论 -
【编译原理】活动记录
活动与活动记录概念:过程的一次执行称为过程的一次活动把过程的一个活动所需要的信息组成的一块连续的存储单元 ,称为活动记录理解:一个活动所需要的信息的每个数据项有相同的生存周期,因此,将它们组成一个活动记录是很自然的把活动看作位于栈上的方法(不严谨 ),或许更好理解?源语言不同,活动记录的域不同——活动记录因语言而异,下面的内容你更能体会到这一点(比如过程能否作为参数?) 运行时的内存分配内存被划分为:目标代码(编译后才知道大小)原创 2020-12-11 20:49:58 · 5468 阅读 · 3 评论 -
【编译原理】中间语言与中间代码的生成
中间语言(简述)▍后缀表达式后缀表达式最大的优点是便于计算机处理(栈)后缀表达式显著的特点是不需要括号>>>【典例】>>> 中缀表达式:-(x + y) * (y + z) - (x + y + z)>>> 后缀表达式:xy+-yz+*xy+z+-▍语法树图形化的语法树更加直观有向无环图(DAG)也是一种图形化的表示方法构造语法树便于分析语法制导的语义计算>>>【典例】>>> a =原创 2020-12-05 14:46:59 · 2062 阅读 · 0 评论 -
【编译原理】语法制导的语义计算——翻译程序,语义栈,中缀转后缀
本节内容依旧非常抽象,因此这里给出三道完整例题 ,对应以下3个重要知识点/题型:1.0「自顶向下」构造LL(1)翻译程序2.0「自底向上」构造LR(1)语义栈3.0 「自顶向下/自底向上」中缀转后缀 ▍1.0「自顶向下」构造LL(1)翻译程序下面的翻译模式可用于将二进制无符号小数转化为十进制小数。请构造相应的递归下降翻译程序:N → p {S.f := 1} S {print(S.val)}S → {B.f.原创 2020-11-21 13:44:43 · 2942 阅读 · 1 评论 -
【编译原理】语法制导的语义计算——注释分析树
记住下面八个字,所有题目引刃而解 —— 向上综合,向下继承由于【综合属性】【继承属性】【注释分析树】的概念过于抽象,本文通篇采用立例题的形式。文章末尾给出手绘答案(图解) ▍1·简单的向上综合给出G[S]的一个属性文法,且注释分析树已经画好。补全注释分析树即可:S →( L ){S.num := L.num + 1;}S → a{S.num := 0;}L → L₁, S{L.num := L₁.num + .原创 2020-11-21 13:44:21 · 13756 阅读 · 3 评论 -
【编译原理】轻松学会LR(0)、SLR(1)、LR(1)、LALR(1)
LR分析过程已知文法生成式(已标号)1E → E + T2E → T3T → T * F4T → F5F → ( E )6F → i已知LR分析表(根据项目图+已标号文法写出来的)完整分析过程状态栈串串操作0#i*i+i#s505#ii*i+i#r603#Fi*i+I#r402#Ti*i+i#s7027#T*i*i+i#s50275原创 2020-11-18 16:12:29 · 5794 阅读 · 4 评论 -
【编译原理】自底向上的算符优先分析
本文用一个例子作为演示,通俗易懂 Qs:已知文法G(S)为:S→a∣∧∣(T)S→a | ∧ | (T)S→a∣∧∣(T)T→T,S∣ST→T,S | ST→T,S∣S对输入串(a,a)#进行自底向上的算符优先分析 An:一·计算FirstVT和LastVT方法:求FirstVT集:从左向右找第一个终结符VT,可以忽视非终结符VN求LastVT集:从右向左找第一个终结符VT,可以忽视非终结符VNFirstVTL.原创 2020-11-14 14:16:25 · 1235 阅读 · 0 评论 -
【编译原理】自顶向下的语法分析
原创 2020-11-04 10:17:31 · 1200 阅读 · 0 评论 -
【编译原理】词法分析(正规式与自动机)
一·单词的形式化描述工具▶ 正规文法即3型文法,是一个四元式:G = (VN, VT, S, P)▶ 正规式也称为正则表达式,形式诸如:(a|b)*(aa|bb)(a|b)*▶ 正规文法与正规式的等价性一个正规语言可以由正规文法定义,也可以由正规式定义——它们当然就可能是等价的可以使用的转化规则(理解????)正规文法的产生式正规式A➡️xB B➡️yA = xyA➡️xA|yA = x*yA➡️x A➡️yA = x|y原创 2020-10-07 20:52:45 · 2271 阅读 · 1 评论 -
【编译原理】文法和文法树
符号,符号串,串集表示说明符号a,b,c语言中不可再分的最小单位符号串α,β,γ符号组成的有穷集合(ε表示空串)串集A,B,C顾名思义(若串都是单个字母,也可以理解为字母表)相关运算:乘积运算(即连接运算):A={a, b}, B={c, d},则AB={ac, ad, bc, bd}幂运算(理解为多次乘积运算)A^0 = {ε}字母表A的闭包(A*):A中符号组成的所有串的集合,包括空串字母表A的正闭包(A+):A中符号组成的原创 2020-09-26 23:26:14 · 1841 阅读 · 0 评论 -
【编译原理】引论和概述
0.编译程序工作图解 1.词法分析概念:输入源程序,对构成源程序的字符进行扫描和分解,识别出一个个的单词;转换成统一规格备用单词是最小语法单位,由字符构成单词有:关键字(int,float),标识符(x,y,temp),常数,运算符,界限符描述词法规则的有效工具是正规式和有限自动机 2.语法分析概念:在词法分析的基础上,根据语言的语法规则,把单词符号组成各类语法单位(短句,子句,语句,过程,程序)语法规则又称文法语法分析的方法:推导(derive原创 2020-09-26 23:14:18 · 274 阅读 · 0 评论 -
编译原理Java实现——完整的自顶向下语法分析过程
前排提示——本文只提供思路和代码运行效果具体的可运行代码移步这里进行下载(免费的):【编译原理实验】Java实现完整自顶向下语法分析——First、Follow、Select、判断LL(1)、提取公因子、消除左递归、自顶向下分析输入串下载的Java代码是直接可运行的,且在注释中包含了10个以上的测试用例 完整的自顶向下语法分析过程求emptyOK和emptyNO求First集求Follow集求Select集判断是否为LL(1)文法提取公原创 2020-11-04 12:09:40 · 1138 阅读 · 1 评论 -
编译原理Java实现——提取公因子、消除左递归
前排提示——本文只提供思路,不提供代码甚至代码具体的可运行代码移步这里进行下载(免费的):【编译原理实验】Java实现完整自顶向下语法分析——First、Follow、Select、判断LL(1)、提取公因子、消除左递归、自顶向下分析输入串代码运行效果放在文末,可直接翻到最后进行查看 消除隐式在「提取公因子」「消除左递归」之前进行隐式的消除————如果产生式的右部以非终结符(ABC)开头,那么公因子有可能是隐式的;递归同理先对所有非终结符(即生成原创 2020-11-04 12:08:56 · 1784 阅读 · 3 评论 -
编译原理Java实现——First集、Follow集、Select集、判断是否为LL(1)文法
前排提示——本文只提供思路,不提供代码甚至代码具体的可运行代码移步这里进行下载(免费的):【编译原理实验】Java实现完整自顶向下语法分析——First、Follow、Select、判断LL(1)、提取公因子、消除左递归、自顶向下分析输入串代码运行效果放在文末,可直接翻到最后进行查看 求 emptyOK和emptyNO对非终结符号VN分为了两类:最终可以推出空串(emptyOK) + 最终也无法推导出空串的(emptyNO)(这尤为关键,是整个自上原创 2020-11-04 12:07:59 · 2135 阅读 · 2 评论 -
编译原理Java实现——DFA最小化
DFA的最小化 也称为 确定的有穷状态机的化简。 DFA的最小化 = 消除无用状态 + 合并等价状态消除无用状态这里是指删掉那些达到不了的状态。这不是我们的重点,DFS+HashSet不难实现。其实关键在于合并等价状态。那么,怎样的两个状态是等价的呢?状态的等价需要满足两个条件:一致性条件:它们都是可接受状态或不可接受状态(即都是终态或非终态)蔓延性条件:我们用所有的输入符号进行转化,它们都可以转化到等价的状态里 DFA最原创 2020-10-12 10:03:44 · 3304 阅读 · 1 评论 -
编译原理Java实现——NFA确定化为DFA
▶ 不确定的有穷自动机(NFA) 是一个五元组 M = (K, ∑, f, S, Z)其中:K是状态集,∑是输入符号集,f是转化映像,S是初态集,Z是终态集不确定是说下一个状态可以有多个 ▶ 确定的有穷自动机(DFA) 是一个五元组 M = (K, ∑, f, S, Z)其中:K是状态集,∑是输入符号集,f是转化映像,S是唯一初态,Z是终态集给定当前状态和输入符号,f就可以唯一确定下一个状态 DFA原创 2020-10-12 10:02:31 · 4887 阅读 · 9 评论