编译原理
文章平均质量分 73
阿达King哥
如何看透生活的本质却依然热爱生活
展开
-
运算符的优先级(规矩是人定的)
先乘除后加减的本质就是运算符的结合性9+5*2等价于9+(5*2)这里要注意一个问题,无论是都是左结合的。因此加减法的产生式为乘除法的产生式为现在问题是如何把上述两个产生式混合在一起,并且符合先乘除后加减。原创 2024-01-02 22:38:03 · 679 阅读 · 0 评论 -
运算符的结合性(形神兼备)
在编译原理中,产生式就是权威。表达式如果以某产生式进行语法分析,那么就只能按照它的方式进行表达,且不能具有二义性。但是,在表达式中有时会涉及打括号的问题。很多时候,在原表达式中打括号和原表达式等价。比如但有时候却不等价 ,比如在编译原理中,括号代表了运算符的结合性,如果运算符以左侧为标准则被称为左结合的,此时在左侧打括号和不打括号等价。反之亦然。原创 2023-12-26 23:41:57 · 831 阅读 · 0 评论 -
二义性(说话装X有罪)
上述二者都是二义性表达,在离散数学上来看都不具有唯一表示。在《编译原理(第二版)》中对二义性有这样的定义一个文法可能有多棵语法分析树能够生成同一个给定的终结符号串,这样的文法称为具有二义性(ambiguous)。注:ambiguous,在英文中是模糊的意思。那么反言之,如果表达式不具有二义性则应为一个文法如果有且只有一棵语法分析树可以生成给定的终结符号串,那么该文法不具有二义性。有关语法分析树的内容参见语法分析树(先看例子再看定义)-CSDN博客说话要说明白,意思表达要唯一,不要没事装逼!原创 2023-12-25 15:17:07 · 866 阅读 · 0 评论 -
语法分析树(先看例子再看定义)
如果非终结符A有一个产生式A->XYZ,那么在语法分析树种就可能有一个标号为A的内部结,该结点有3个子结点,从左到右标号分别为X、Y、Z。如图给定一个上下文无关文法,则该文法就有一颗语法分析树(parse tree)原创 2023-12-23 23:16:59 · 991 阅读 · 0 评论 -
编译器语法推导(1)基本定义(逐句举例对照)
在中,我们讲到了两个概念,分别是终结符号和非终结符号。回忆一下二者。词法单元,不可再变词法变量,尚未确定比如其终结符号为if, (), {}非终结符号为expr, stmt。原创 2023-12-22 09:46:13 · 386 阅读 · 0 评论 -
什么是文法产生式(尽量写简单了)
一个典型的if-else语句可由下述构造规则表达其中变量名全称stmtstatementexprexpression比如if(i==0){return 1;涉及术语产生式(production)终结符号(terminal)if, (), {}非终结符号(nonterminal)expr, stmt上下文无关文法(context-free grammar)由四部分构成终结符号集合:也被称为”词法单元“非终结符号集合:也称为”语法变量“产生式集合。原创 2023-12-21 16:10:34 · 753 阅读 · 0 评论 -
静态单赋值(SSA)(只讲形式不讲实现)
除了三地址代码之外,静态单赋值(SSA)是另一种表现形式。原创 2023-12-21 14:47:47 · 550 阅读 · 0 评论 -
什么是DAG(只讲概念不讲算法)
编译器的目的是将源程序编程目标代码(汇编)放入计算机执行。这里有一个问题,世界上有很多不同架构的CPU,比如x86,ARM等。不同架构的CPU有不同的汇编。于是上图带来的问题是直接从源程序翻译成不同架构CPU的目标代码工作量太大且容易出错。正确的做法是在和中间加一层作为桥梁,将其衔接起来。原创 2023-12-21 11:24:15 · 820 阅读 · 0 评论 -
什么是抽象语法树和三地址表达(通俗理解版)
根据《编译原理(第2版)》第二章用通俗的语言解释什么是抽象语法树和三地址表达原创 2023-12-20 16:46:16 · 571 阅读 · 2 评论 -
x86的编码格式
x86采取可变长度的方式进行编码,其主要原因应是8086的机器性能不高,导致编码越短越好。而8086的编码模式相较于x64较简单,且x64兼容x86编码,所以,以下阐述将由8086一直讲到x648086采取以下编码格式其中opcode是必须的,其他的是可选的opcodeopcode的格式前6位表示操作,后2位分为以及位Mod R/MMod R/M表示寻址方式,下表表示寻址的类型首先以mod=11为例进行阐述首先制定reg域的编码规则,此规则适用于任何mod方式假设指令为则指令序列为,根据上述的格式可知为o原创 2022-06-20 16:54:32 · 2104 阅读 · 0 评论