编译原理试题及答案_第1页
编译原理试题及答案_第2页
编译原理试题及答案_第3页
编译原理试题及答案_第4页
编译原理试题及答案_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编译原理试题及答案选择题(20分)A.词法分析器负责检查程序的语法错误B.语法分析器的主要任务是从源代码中识别出单词符号C.语义分析器负责生成中间代码D.符号表用于记录源程序中各种标识符的属性和相关信息A.abcB.a.cC.a[^a-c]cD.a[^b]cA.一个产生式加上一个点的位置B.一个终结符C.一个非终结符D.一个状态A.语法制导翻译是一种在语法分析过程中进行语义处理的技术B.S-属性文法只能生成自上而下的语法制导翻译C.L-属性文法可以进行自上而下和自下而上的语法制导翻译D.继承属性可以在语法分析过程中计算A.循环不变量外提B.常量折叠C.删除不可达代码D.强度削弱A.x=yopzB.x=opyC.x[y]=zD.x=&yA.抽象语法树B.三地址代码C.控制流图D.四元式A.减少目标代码的大小B.提高目标代码的执行效率C.简化代码生成的过程D.增加代码的可读性A.LL(1)文法是LL(k)文法的一个特例B.LL(1)文法可以进行自上而下的语法分析C.LL(1)文法不允许左递归D.LL(1)文法允许任意形式的公共左因子A.合并常量表达式B.删除冗余的存储操作C.循环展开D.删除无用赋值填空题(20分)1.编译器是将____语言程序转换为____语言程序的软件工具。2.词法分析器的主要任务是从源程序中识别出具有独立意义的____,并将其转换为____。3.正则表达式中的元字符""表示____,"+"表示____。4.在语法分析中,自顶向下的分析方法主要包括____和____两种。5.在LR分析中,LR(k)分析器中的k表示____。6.语法制导翻译定义了____和____之间的对应关系。7.在编译器中,符号表的主要作用是存储____和____的信息。8.三地址代码是一种中间表示形式,其特点是每个指令最多包含____个操作数。9.编译优化技术可以分为____优化和____优化两大类。10.在目标代码生成中,寄存器分配策略主要有____和____两种。简答题(20分)1.简述编译器的主要组成部分及其功能。2.解释什么是LL(1)文法,并说明如何判断一个文法是否是LL(1)文法。3.简述语法制导翻译的基本思想及其在编译器中的应用。4.解释什么是数据流分析,并列举至少三种常用的数据流分析技术。分析与应用题(20分)1.给出以下文法:E→E+T|TT→TF|FF→(E)|id(1)判断该文法是否是LL(1)文法,并说明理由。(2)为该文法构造LL(1)分析表。(3)给出输入串"id+idid"的LL(1)分析过程。2.对于以下三地址代码序列:t1=a+bt2=c-dt3=t1t2t4=t3+et5=t4-fx=t5(1)画出该代码序列的控制流图。(2)识别出其中的可用表达式。(3)应用常量折叠优化技术对该代码序列进行优化。综合设计题(20分)设计一个简单的编译前端,能够处理以下语言:<程序>→<声明部分><语句部分><声明部分>→<声明>;|<声明>;<声明部分><声明>→int<标识符>|float<标识符><语句部分>→<语句>|<语句><语句部分><语句>→<赋值语句>|<输出语句><赋值语句>→<标识符>=<表达式><输出语句>→print(<表达式>)<表达式>→<项>|<表达式>+<项>|<表达式>-<项><项>→<因子>|<项><因子>|<项>/<因子><因子>→(<表达式>)|<标识符>|<整数>|<浮点数>要求:1.为该语言设计词法规则(正则表达式)。2.设计一个递归下降语法分析器,能够识别该语言的语法结构。3.设计一个简单的语义分析器,能够检查变量是否已声明,并生成三地址代码。4.给出对输入程序"x=10;y=20;print(x+y);"的分析过程和生成的三地址代码。---标准答案及解析选择题1.答案:D解析:词法分析器负责识别单词符号,语法分析器负责检查语法错误,语义分析器负责进行语义分析和类型检查,中间代码生成通常在语义分析之后进行。符号表用于记录源程序中各种标识符的属性和相关信息,如类型、作用域、内存地址等,是编译器各阶段共享的重要数据结构。2.答案:B解析:选项A中,abc可以匹配以任意数量的a开头,接着任意数量的b,最后以c结尾的字符串,不满足"以a开头"的要求(因为可以为空)。选项C中,a[^a-c]c表示以a开头,接着不是a、b或c的任意字符,最后以c结尾,这不符合要求。选项D中,a[^b]c表示以a开头,接着不是b的任意字符,最后以c结尾,这也不符合要求。只有选项B中的a.c可以匹配以a开头,接着任意字符(包括空),最后以c结尾的字符串。3.答案:A解析:在LR分析中,项目是指一个产生式加上一个点的位置,用于表示语法分析的进度。例如,对于产生式E→E+T,可以有项目E→E+.T、E→E.+T等。项目集规范族是指LR分析器在不同状态下可能遇到的所有项目的集合,是构造LR分析表的基础。4.答案:B解析:S-属性文法只包含综合属性,可以进行自下而上的语法制导翻译,但不一定只能生成自上而下的语法制导翻译。L-属性文法包含综合属性和继承属性,可以进行自上而下和自下而上的语法制导翻译。语法制导翻译是一种在语法分析过程中进行语义处理的技术,继承属性可以在语法分析过程中计算。5.答案:B解析:常量折叠是一种局部优化技术,是指在编译时将常量表达式计算出来,用计算结果替换原表达式。例如,将表达式"2+3"替换为"5"。循环不变量外提、删除不可达代码和强度削弱都属于全局优化技术,需要考虑整个程序的控制流和数据流。6.答案:C解析:在三地址代码中,x[y]=z表示将z的值赋给数组x的第y个元素。这种指令通常用于处理数组元素的赋值操作。其他选项中,x=yopz表示二元运算,x=opy表示一元运算,x=&y表示取y的地址。7.答案:C解析:控制流图(CFG)是一种有向图,其中节点代表基本块(没有分支的连续指令序列),边代表控制流转移。控制流图最适合进行数据流分析,因为它明确地表示了程序中各部分之间的控制流关系。抽象语法树和三地址代码虽然也是中间表示形式,但不如控制流图适合进行数据流分析。四元式是三地址代码的一种具体表示形式。8.答案:B解析:在编译器的目标代码生成阶段,寄存器分配的主要目的是提高目标代码的执行效率。因为访问寄存器比访问内存快得多,合理分配寄存器可以减少内存访问次数,提高程序运行速度。减少代码大小、简化代码生成过程和增加代码可读性虽然也是代码生成的目标,但不是寄存器分配的主要目的。9.答案:D解析:LL(1)文法是LL(k)文法的一个特例,其中k=1。LL(1)文法可以进行自上而下的语法分析,且不允许左递归。对于LL(1)文法,需要消除公共左因子,以确保在分析时能够根据当前输入符号唯一确定使用哪个产生式。10.答案:C解析:循环展开是一种全局优化技术,通过复制循环体来减少循环迭代次数,从而减少循环开销。合并常量表达式和删除冗余的存储操作属于局部优化,因为它们只考虑单个基本块内的代码。删除无用赋值可以是局部优化,也可以是全局优化,取决于无用赋值的定义范围。填空题1.高级,低级/机器解析:编译器是将高级语言程序(如C、Java等)转换为低级语言(如汇编语言或机器语言)程序的软件工具。编译过程包括多个阶段,如词法分析、语法分析、语义分析、中间代码生成、代码优化和目标代码生成等。2.单词符号,记号解析:词法分析器的主要任务是从源程序中识别出具有独立意义的单词符号(如关键字、标识符、运算符、分隔符等),并将其转换为记号(token),记号通常包含单词符号的类型和值等信息。3.零次或多次,一次或多次解析:在正则表达式中,元字符""表示其前面的字符可以出现零次或多次,"+"表示其前面的字符可以出现一次或多次。例如,正则表达式"ab"可以匹配"b"、"ab"、"aab"等,而正则表达式"a+b"只能匹配"ab"、"aab"等,不能匹配"b"。4.递归下降分析法,预测分析法解析:自顶向下的分析方法主要包括递归下降分析法和预测分析法。递归下降分析法为每个非终结符编写一个函数,通过函数调用模拟语法分析过程。预测分析法(如LL(1)分析法)使用分析表和栈来指导语法分析过程。5.向前看k个符号解析:在LR分析中,LR(k)分析器中的k表示向前看k个符号的能力。例如,LR(0)分析器不向前看任何符号,LR(1)分析器向前看1个符号,以此类推。k值越大,分析能力越强,但分析表也会越大。6.语法规则,语义规则解析:语法制导翻译定义了语法规则和语义规则之间的对应关系。语法规则定义了语言的语法结构,语义规则定义了如何根据语法结构生成中间代码或进行语义分析。语法制导翻译将语法分析和语义处理结合起来,在语法分析过程中同时进行语义处理。7.标识符,属性解析:在编译器中,符号表的主要作用是存储标识符和属性的信息。标识符是程序中定义的变量、函数、常量等的名称,属性包括标识符的类型、作用域、内存地址、参数信息等。符号表是编译器各阶段共享的重要数据结构。8.三个解析:三地址代码是一种中间表示形式,其特点是每个指令最多包含三个操作数。例如,x=y+z表示将y和z相加,结果存入x。三地址代码类似于汇编语言,但更抽象,不依赖于具体的机器架构。9.局部,全局解析:编译优化技术可以分为局部优化和全局优化两大类。局部优化只考虑单个基本块内的代码,如常量折叠、死代码删除等。全局优化考虑整个程序的控制流和数据流,如循环不变量外提、强度削弱、全局公共子表达式消除等。10.寄存器分配策略,寄存器选择策略解析:在目标代码生成中,寄存器分配策略主要有寄存器分配策略和寄存器选择策略两种。寄存器分配策略决定哪些变量应该分配到寄存器中,寄存器选择策略决定在某个时刻使用哪个寄存器。常见的寄存器分配策略包括全局寄存器分配和局部寄存器分配,寄存器选择策略包括最频繁使用优先和最近最少使用优先等。简答题1.编译器的主要组成部分及其功能:编译器是将高级语言程序转换为低级语言程序的软件工具,其主要组成部分及其功能如下:(1)词法分析器:从源程序中识别出具有独立意义的单词符号(如关键字、标识符、运算符、分隔符等),并将其转换为记号(token)。词法分析器通常使用有限自动机来实现。(2)语法分析器:根据语法规则分析源程序的语法结构,检查语法错误。语法分析器通常使用上下文无关文法来描述语言的语法结构,常用的分析方法有自顶向下分析法和自底向上分析法。(3)语义分析器:进行语义分析和类型检查,确保程序在语义上是正确的。语义分析器通常使用语法制导翻译技术,根据语法结构生成中间代码或进行语义处理。(4)中间代码生成器:将语法树或语义分析结果转换为中间代码。中间代码是一种与机器无关的表示形式,便于进行优化和目标代码生成。常见的中间代码形式有三地址代码、抽象语法树等。(5)代码优化器:对中间代码进行优化,提高目标代码的效率。优化技术可以分为局部优化和全局优化,常量折叠、循环不变量外提、公共子表达式消除等。(6)目标代码生成器:将优化后的中间代码转换为目标机器的代码。目标代码生成器需要考虑目标机器的架构、寄存器分配、指令选择等因素。(7)符号表管理器:管理符号表,存储源程序中各种标识符的属性和相关信息。符号表是编译器各阶段共享的重要数据结构。(8)错误处理器:检测和处理源程序中的错误,提供有意义的错误信息,使编译过程能够继续进行。2.LL(1)文法及其判断方法:LL(1)文法是一种特殊的上下文无关文法,可以进行自上而下的语法分析,且在分析时只需要向前看1个符号。LL(1)文法具有以下特点:-不允许左递归-消除了公共左因子-对于每个非终结符的各个产生式,它们的FIRST集互不相交,或者某个产生式的FIRST集包含ε,且该产生式对应的FOLLOW集与其他产生式的FIRST集不相交判断一个文法是否是LL(1)文法的方法如下:(1)检查文法是否含有左递归,如果有,则需要消除左递归。(2)检查文法是否存在公共左因子,如果有,则需要提取公共左因子。(3)对于文法中的每个非终结符A,计算其各个产生式的FIRST集和FOLLOW集。(4)对于非终结符A的每个产生式A→α,计算FIRST(α)。如果α可以推导出ε,还需要计算FOLLOW(A)。(5)检查以下条件是否满足:-对于非终结符A的任意两个不同的产生式A→α和A→β,FIRST(α)和FIRST(β)不相交。-如果某个产生式A→α可以推导出ε,那么FIRST(α)和FOLLOW(A)不相交。如果文法满足以上所有条件,则该文法是LL(1)文法,否则不是。3.语法制导翻译的基本思想及其应用:语法制导翻译的基本思想是将语法规则和语义规则结合起来,在语法分析过程中同时进行语义处理。具体来说,就是为语法分析中的每个语法结构(产生式)关联一组语义动作,当语法分析器识别出一个语法结构时,就执行相应的语义动作。语法制导翻译在编译器中有广泛的应用,主要包括:(1)中间代码生成:在语法分析过程中,根据语法结构生成中间代码。例如,对于表达式"1+2",语法分析器识别出这是一个加法表达式后,生成相应的三地址代码"t1=1+2"。(2)类型检查:在语法分析过程中,检查表达式的类型是否匹配。例如,检查赋值语句两边的类型是否一致,检查函数调用的参数类型是否正确等。(3)符号表管理:在语法分析过程中,将标识符及其属性(如类型、作用域等)添加到符号表中,或查询符号表获取标识符的属性。(4)错误处理:在语法分析过程中,检测和处理语义错误,如未定义的变量、类型不匹配等。语法制导翻译可以分为S-属性文法和L-属性文法。S-属性文法只包含综合属性,可以进行自下而上的语法制导翻译。L-属性文法包含综合属性和继承属性,可以进行自上而下和自下而上的语法制导翻译。4.数据流分析及其常用技术:数据流分析是一种编译优化技术,用于分析程序中数据的流动情况,包括数据的定义和使用。数据流分析通常在控制流图上进行,通过迭代计算每个点的数据流信息,直到达到不动点。数据流分析的主要目的是:-识别程序中的优化机会-检测程序中的错误-辅助其他编译优化技术常用的数据流分析技术包括:(1)可用表达式分析:确定哪些表达式在程序的某个点上是可用的,即该表达式的值在之前的某点被计算过,且之后没有被重新计算。可用表达式分析可用于公共子表达式消除优化。(2)活跃变量分析:确定哪些变量在程序的某个点上是活跃的,即该变量的值在之后会被使用。活跃变量分析可用于寄存器分配优化。(3)到达定义分析:确定哪些定义(变量赋值)可以到达程序的某个点。到达定义分析可用于确定变量的值来源,辅助常量传播和死代码删除等优化。(4)复制传播分析:确定哪些变量的值可以通过复制操作传播到其他变量。复制传播可用于消除不必要的复制操作。(5)定值-使用链分析:建立变量定义和使用之间的对应关系,帮助理解程序的执行流程和数据依赖关系。数据流分析通常使用迭代算法或位向量算法来实现,这些算法通过反复计算数据流方程,直到达到不动点,从而得到每个点的数据流信息。分析与应用题1.对于文法:E→E+T|TT→TF|FF→(E)|id(1)判断该文法是否是LL(1)文法,并说明理由。该文法不是LL(1)文法,理由如下:-首先,该文法存在左递归。对于非终结符E,有产生式E→E+T,这是左递归的。同样,对于非终结符T,有产生式T→TF,这也是左递归的。-其次,即使消除左递归,该文法也可能不满足LL(1)文法的条件。例如,对于非终结符E,有两个产生式E→E+T和E→T。如果消除左递归后,得到E→TE'和E'→+TE'|ε,那么对于产生式E→TE'和E'→+TE',它们的FIRST集可能有交集。(2)为该文法构造LL(1)分析表。首先,消除左递归:E→TE'E'→+TE'|εT→FT'T'→FT'|εF→(E)|id然后,计算FIRST集和FOLLOW集:FIRST(E)=FIRST(T)=FIRST(F)={(,id}FIRST(E')={+,ε}FIRST(T')={,ε}FIRST(F)={(,id}FOLLOW(E)={$,)}FOLLOW(E')={$,)}FOLLOW(T)={+,$,)}FOLLOW(T')={+,$,)}FOLLOW(F)={,+,$,)}最后,构造LL(1)分析表:|非终结符|终结符||---------|--------|||(|id|+||)|$||E|E→TE'|E→TE'||||||E'|||E'→+TE'||E'→ε|E'→ε||T|T→FT'|T→FT'||||||T'|||T'→ε|T'→FT'|T'→ε|T'→ε||F|F→(E)|F→id|||||(3)给出输入串"id+idid"的LL(1)分析过程。初始状态:E'输入串:id+idid分析步骤:1.根据分析表,E→TE',替换:TE'2.根据分析表,T→FT',替换:FT'E'3.根据分析表,F→id,替换:idT'E'4.匹配id,输入串变为:+idid5.匹配结束,弹出T',根据分析表,T'→ε,替换:E'6.根据分析表,E'→+TE',替换:+TE'7.匹配+,输入串变为:idid8.根据分析表,T→FT',替换:FT'E'9.根据分析表,F→id,替换:idT'E'10.匹配id,输入串变为:id11.匹配结束,弹出T',根据分析表,T'→FT',替换:FT'E'12.匹配,输入串变为:id13.根据分析表,F→id,替换:idT'E'14.匹配id,输入串变为:15.匹配结束,弹出T',根据分析表,T'→ε,替换:E'16.匹配结束,弹出E',根据分析表,E'→ε,替换:17.匹配结束,分析成功。2.对于以下三地址代码序列:t1=a+bt2=c-dt3=t1t2t4=t3+et5=t4-fx=t5(1)画出该代码序列的控制流图。该代码序列是一个线性序列,没有分支和循环,因此控制流图只有一个基本块,包含所有指令:```┌─────────────┐│t1=a+b││t2=c-d││t3=t1t2││t4=t3+e││t5=t4-f││x=t5│└─────────────┘```(2)识别出其中的可用表达式。可用表达式分析是确定哪些表达式在程序的某个点上是可用的,即该表达式的值在之前的某点被计算过,且之后没有被重新计算。在该代码序列中,初始时没有任何表达式是可用的。随着代码的执行,可用表达式集合的变化如下:-执行t1=a+b后,表达式a+b可用。-执行t2=c-d后,表达式a+b和c-d可用。-执行t3=t1t2后,表达式a+b、c-d和t1t2可用。-执行t4=t3+e后,表达式a+b、c-d和t3+e可用(t1t2不再可用,因为t3被重新定义)。-执行t5=t4-f后,表达式a+b、c-d和t4-f可用(t3+e不再可用,因为t4被重新定义)。-执行x=t5后,表达式a+b、c-d和t5可用(t4-f不再可用,因为t5被重新定义)。因此,在该代码序列的最后,可用表达式集合为{a+b,c-d,t5}。(3)应用常量折叠优化技术对该代码序列进行优化。常量折叠是指在编译时将常量表达式计算出来,用计算结果替换原表达式。在该代码序列中,如果a、b、c、d、e、f都是常量,那么可以进行常量折叠:假设a=1,b=2,c=3,d=4,e=5,f=6,则:-t1=a+b=1+2=3-t2=c-d=3-4=-1-t3=t1t2=3(-1)=-3-t4=t3+e=-3+5=2-t5=t4-f=2-6=-4-x=t5=-4优化后的代码序列为:```t1=3t2=-1t3=-3t4=2t5=-4x=-4```进一步优化,可以删除不必要的中间变量:```x=-4```但如果a、b、c、d、e、f不是常量,或者部分是常量,那么只能对部分表达式进行常量折叠。例如,如果只有a和b是常量,那么只能优化第一个表达式:```t1=3//假设a=1,b=2t2=c-dt3=t1t2t4=t3+et5=t4-fx=t5```综合设计题1.词法规则(正则表达式):```//关键字int="int"float="float"print="print"//标识符identifier=[a-zA-Z_][a-zA-Z0-9_]//常量integer=[0-9]+float_number=[0-9]+\.[0-9]+|[0-9]+\.|\.[0-9]+//运算符plus="+"minus="-"multiply=""divide="/"assign="="//分隔符lparen="("rparen=")"semicolon=";"comma=","//空白字符whitespace=[\t\n\r]+```2.递归下降语法分析器设计:递归下降语法分析器为每个非终结符编写一个函数,通过函数调用模拟语法分析过程。以下是主要函数的设计:```classParser:def__init__(self,tokens):self.tokens=tokensself.current_token=Noneself.token_index=0self.advance()defadvance(self):ifself.token_index<len(self.tokens):self.current_token=self.tokens[self.token_index]self.token_index+=1else:self.current_token=Nonedefmatch(self,token_type):ifself.current_tokenandself.current_token.type==token_type:self.advance()else:raiseSyntaxError(f"Expected{token_type},got{self.current_token}")defprogram(self):declarations=self.declaration_part()statements=self.statement_part()return{'declarations':declarations,'statements':statements}defdeclaration_part(self):declarations=[]whileself.current_tokenandself.current_token.typein['int','float']:declaration=self.declaration()self.match('semicolon')declarations.append(declaration)returndeclarationsdefdeclaration(self):type_token=self.current_tokenself.match(type_token.type)identifier_token=self.current_tokenself.match('identifier')return{'type':type_token.value,'name':identifier_token.value}defstatement_part(self):statements=[]whileself.current_tokenandself.current_token.type!='EOF':statement=self.statement()statements.append(statement)ifself.current_tokenandself.current_token.type=='semicolon':self.match('semicolon')returnstatementsdefstatement(self):ifself.current_token.type=='identifier':returnself.assignment_statement()elifself.current_token.type=='print':returnself.print_statement()else:raiseSyntaxError(f"Unexpectedtoken:{self.current_token}")defassignment_statement(self):identifier_token=self.current_tokenself.match('identifier')self.match('assign')expression=self.expression()return{'type':'assignment','target':identifier_token.value,'value':expression}defprint_statement(self):self.match('print')self.match('lparen')expression=self.expression()self.match('rparen')return{'type':'print','value':expression}defexpression(self):term=self.term()whileself.current_tokenandself.current_token.typein['plus','minus']:op_token=self.current_tokenself.match(op_token.type)term2=self.term()term={'type':'binary','op':op_token.value,'left':term,'right':term2}returntermdefterm(self):factor=self.factor()whileself.current_tokenandself.current_token.typein['multiply','divide']:op_token=self.current_tokenself.match(op_token.type)factor2=self.factor()factor={'type':'binary','op':op_token.value,'left':factor,'right':factor2}returnfactordeffactor(self):ifself.current_token.type=='lparen':self.match('lparen')expression=self.expression()self.match('rparen')returnexpressionelifself.current_token.type=='identifier':identifier_token=self.current_tokenself.match('identifier')return{'type':'variable','name':identifier_token.value}elifself.current_token.type=='integer':number_token=self.current_tokenself.match('integer')return{'type':'number','value':int(number_token.value)}elifself.current_token.type=='float_number':number_token=self.current_tokenself.match('float_number')return{'type':'number','value':float(number_token.value)}else:raiseSyntaxError(f"Unexpectedtoken:{self.current_token}")```3.语义分析器设计:语义分析器的主要任务是检查变量是否已声明,并生成三地址代码。以下是语义分析器的设计:```classSemanticAnalyzer:def__init__(self,ast):self.ast=astself.symbol_table={}self.quadruples=[]self.temp_count=0defanalyze(self):分析声明部分fordeclarationinself.ast['declarations']:var_name=declaration['name']var_type=declaration['type']ifvar_nameinself.symbol_table:raiseSemanticError(f"Variable{var_name}alreadydeclared")self.symbol_table[var_name]={'type':var_type}分析语句部分forstatementinself.ast['statements']:self.analyze_statement(statement)returnself.quadruplesdefanalyze_statement(self,statement):ifstatement['type']=='assignment':self.analyze_assignment(statement)elifstatement['type']=='print':self.analyze_print(statement)defanalyze_assignment(self,statement):检查目标变量是否已声明target=statement['target']iftargetnotinself.symbol_table:raiseSemanticError(f"Variable{target}notdeclared")分析表达式expr_value=self.analyze_expression(statement['value'])生成三地址代码self.quadruples.append((target,'=',expr_value,''))defanalyze_print(self,statement):分析表达式expr_value=self.analyze_expression(statement['value'])生成三地址代码self.quadruples.append(('print','',expr_value,''))defanalyze_expression(self,expression):ifexpression['type']=='variable':var_name=expression['name']ifvar_namenotinself.symbol_table:raiseSemanticError(f"Variable{var_name}notdeclared")returnvar_nameelifexpression['type']=='number':returnexpression['value']elifexpression['type']=='binary':left=self.a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论