📝 compiler
64篇技术文档📅  最后修改于: 2020-12-06 07:23:01        🧑  作者: Mango
后缀符号如果给定的语言是表达式,则后缀表示法是中间代码的有用形式。后缀表示法也称为“后缀表示法”和“反向修饰”。后缀表示法是语法树的线性表示。在后缀表示法中,任何表达式都可以明确地编写而没有括号。编写x和y之和的普通(中缀)方式是在中间带x的运算符。但是在后缀符号中,我们将运算符放在右端,为xy *。在后缀表示法中,运算符遵循操作数。例生产Semantic RuleProgram fragment...
📅  最后修改于: 2020-12-06 07:23:57        🧑  作者: Mango
解析树和语法树当您创建一个分析树时,它包含的细节比实际需要的更多。因此,编译器解析语法树非常困难。以下面的解析树为例:在解析树中,大多数叶子节点是其父节点的单个子节点。在语法树中,我们可以消除这些额外的信息。语法树是解析树的变体。在语法树中,内部节点是运算符,叶子是操作数。当以树形结构表示程序时,通常使用语法树。句子id + id * id将具有以下语法树:抽象语法树可以表示为:抽象语法树是编译器...
📅  最后修改于: 2020-12-06 07:24:51        🧑  作者: Mango
三位地址码三地址代码是中间代码。优化编译器使用它。在三地址代码中,给定的表达式分为几个单独的指令。这些说明可以轻松地翻译成汇编语言。每个三地址代码指令最多具有三个操作数。它是赋值和二进制运算符的组合。例GivenExpression:三地址代码如下:t用作目标程序中的寄存器。三种地址代码可以两种形式表示:四倍和三倍。...
📅  最后修改于: 2020-12-06 07:25:45        🧑  作者: Mango
四倍四元组有四个字段来实现三个地址代码。四元组字段分别包含运算符的名称,第一个源操作数,第二个源操作数和结果。图:四倍字段例三地址代码如下:这些语句用四倍数表示,如下所示:OperatorSource 1Source 2Destination(0)uminusb–t1(1)+cdt2(2)*t1t2t3(3):=t3–a...
📅  最后修改于: 2020-12-06 07:26:37        🧑  作者: Mango
三元组三元组具有三个字段来实现三个地址代码。三元组字段包含运算符的名称,第一个源操作数和第二个源操作数。在三元组中,各个子表达式的结果由表达式的位置表示。在表示表达式时,Triple等效于DAG。图:三元组字段例:三个地址代码如下:这些语句由三元组表示,如下所示:OperatorSource 1Source 2(0)uminusb–(1)+cd(2)*(0)(1)(3):=(2)–...
📅  最后修改于: 2020-12-06 07:27:32        🧑  作者: Mango
转让声明的翻译在语法定向翻译中,赋值语句主要处理表达式。表达式的类型可以是实数,整数,数组和记录。考虑语法以上语法的翻译方案如下:Production ruleSemantic actionsS → id :=E{p = look_up(id.name);If p ≠ nil thenEmit (p = E.place)ElseError;}E → E1 + E2{E.place = newt...
📅  最后修改于: 2020-12-06 07:28:27        🧑  作者: Mango
布尔表达式布尔表达式有两个主要目的。它们用于计算逻辑值。它们还用作使用if-then-else或while-do的条件表达式。考虑语法该relop用<,>,<,>表示。AND和OR保持关联。 NOT的优先级高于AND和最后OR。Production ruleSemantic actionsE → E1 OR E2{E.place = newtemp();Emit (E.place ‘:=’ E1...
📅  最后修改于: 2020-12-06 07:29:23        🧑  作者: Mango
改变控制流程的陈述goto语句更改控制流。如果实现goto语句,则需要为一条语句定义一个LABEL。可以为此添加产品:在此生产系统中,附加了语义动作以将LABEL及其值记录在符号表中。以下语法用于合并结构控制流构造:在这里,S是一条语句,L是一条语句列表,A是一个赋值语句,E是一个布尔值表达式。改变控制流程的陈述的翻译方案在布尔表达式的语法情况下,我们引入标记非终结符M。如果这样,则将M都放在语句...
📅  最后修改于: 2020-12-06 07:30:20        🧑  作者: Mango
后缀翻译在产品A→α中,A.CODE的转换规则由α中非末端的CODE转换的串联组成,其顺序与α中非末端出现的顺序相同。生产可以考虑实现后缀形式。while语句的后缀翻译生产可以分解为:合适的过渡方案是Production RuleSemantic ActionW → whileW.QUAD = NEXTQUADC → W E doC W E doS→ C S1BA...
📅  最后修改于: 2020-12-06 07:31:16        🧑  作者: Mango
算术表达式中的数组引用如果将元素存储在连续位置的块中,则可以快速访问数组的元素。数组可以是一维或二维的。对于一维数组:多维数组:行专业或列专业表格主行:a [1,1],a [1,2],a [1,3],a [2,1],a [2,2],a [2,3]专业栏:a [1,1],a [2,1],a [1、2],a [2、2],a [1、3],a [2,3]以原始主格式,a [i1,i2]的地址为基本+((i...
📅  最后修改于: 2020-12-06 07:32:09        🧑  作者: Mango
程序调用过程是编译器的重要且经常使用的编程结构。它用于为过程调用和返回生成良好的代码。调用顺序:呼叫的转换包括在每个过程的进入和退出时采取的一系列操作。在调用顺序中将执行以下操作:当发生过程调用时,则会为激活记录分配空间。评估被调用过程的参数。建立环境指针,以使被调用过程能够访问封闭块中的数据。保存调用过程的状态,以便它可以在调用后恢复执行。同时保存寄信人地址。它是被调用例程在完成后必须转移到的位...
📅  最后修改于: 2020-12-06 07:33:05        🧑  作者: Mango
声明书遇到声明时,我们需要为声明的变量安排存储空间。对于过程中的每个本地名称,我们创建一个ST(符号表)条目,其中包含:名称的类型名称需要多少存储空间生产:声明的合适过渡方案是:Production ruleSemantic actionD → integer, idENTER (id.PLACE, integer)D.ATTR = integerD → real, idENTER (...
📅  最后修改于: 2020-12-06 07:34:00        🧑  作者: Mango
案例陈述Switch和case语句支持多种语言。 case语句的语法如下:其翻译方案如下所示:将E评估为T的代码当看到switch关键字时,将生成一个新的临时T和两个新标签test和next。当出现case关键字时,则为每个case关键字创建一个新标签Li,并将其输入到符号表中。每种情况下常量的Vi值和指向此符号表条目的指针都放在堆栈上。...
📅  最后修改于: 2020-12-06 07:34:55        🧑  作者: Mango
符号表符号表是在编译器中使用的重要数据结构。符号表用于存储有关各种实体(例如对象,类,变量名,接口,函数名等)的出现的信息。在分析和合成阶段均使用该表。符号表用于以下目的:它用于以结构化形式将所有实体的名称存储在一个位置。它用于验证是否已声明变量。它用于确定名称的范围。它用于通过验证源代码中的赋值和表达式在语义上正确来实现类型检查。符号表可以是线性表或哈希表。使用以下格式,它维护每个名称的条目。例...
📅  最后修改于: 2020-12-06 07:35:50        🧑  作者: Mango
符号表的数据结构编译器包含两种类型的符号表:全局符号表和作用域符号表。全局符号表可以由所有过程和作用域符号表访问。名称和符号表的范围按层次结构排列,如下所示:上面的语法可以用符号表的分层数据结构表示:全局符号表包含一个全局变量和两个过程名称。 sum_num表中提到的名称不适用于sum_id及其子表。首先,在当前符号表中搜索符号。如果找到名称,则搜索完成,否则将在父代的符号表中搜索名称,直到,找到...