布尔表达式的LR翻译器--中间代码为四元式
布尔表达式的翻译

例如,对于条件语句 if A∨B<C then S1 else S2 经翻译后,可得四元式序列: (1) (jnz, A, -, 5) (2) (j, - ,- , 3) (3) (j<, B, C, 5) (4) (j, -, -, p+1) (5) S1相应的四元式序列 (p) (j, -, -, q) (p+1) S2相应的四元式序列 (q)… 其中,表达式A的真出口为5(也是整个表达式的真出 口),假出口为3(即表达式B<C的第一四元式); B<C的真、假出口也分别是整个表达式的真、假出口。
10. 语义变量及辅助语义函数
1.NXQ全局变量,用于指示所要产生的下一四元式的 序号; 2.GEN(…)其意义同前,每次调用,NXQ++; 3.int Merge(int p1,int p2)将链首“指针”分别为 p1和p2的两条链合并为一条,并返回新链的链首 “指针”(此处的“指针”实际上是四元式的序号, 应为整型值)我们假定四元式是以一结构形式表示 (存储)的: struct _Quadruple{ int Op, arg1, arg2, Result; } QuadrupleList[]; 4.void BackPatch(int p,int t)用四元式序号t回填 以p为首的链,将链中每个四元式的Result域改写为t 的值。 函数Merge )及BackPatch )的程序见书 Merge( BackPatch(
4. 布尔表达式的出口
对于布尔表达式A 对于布尔表达式A∨(B∧(┑C∨D)),其等价的表述是 A ? 1 :(B ?((C ? 0 :1)? 1 : D ): 0 ) :(B ?((C 显然,采用此种结构可产生更为有效的中间代码。这里需假 定原布尔表达式的计算过程中不含有任何的副作用 定原布尔表达式的计算过程中不含有任何的副作用。 副作用。 在上式的计算中,根据A 在上式的计算中,根据A、B、C、D的取值不同,计算的结 果以及运算的终止点亦不同。例如,当A=1(真)时,结 果以及运算的终止点亦不同。例如,当A=1(真)时,结 果为1且终止于左边第一个‘1’处。 果为1且终止于左边第一个‘1’处。 这样终止的点我们称为该布尔表达式的出口,同时,把使布 这样终止的点我们称为该布尔表达式的出口,同时,把使布 尔表达式取值为真 出口称为真出口 尔表达式取值为真的出口称为真出口,反之称为假出口。 真出口,反之称为假出口 假出口。 对一个布尔表达式而言,它至少有一个真出口 对一个布尔表达式而言,它至少有一个真出口和一个假出口 真出口和一个假出口 (当然可以有多个)。在用于控制流程的布尔表达式E (当然可以有多个)。在用于控制流程的布尔表达式E的 计算中,这些出口 计算中,这些出口分别指出当E值为真和假时,控制所应 出口分别指出当E值为真 时,控制所应 转向的目标(即某一四元式的序号)。 转向的目标(即某一四元式的序号)。
编译原理四元式

编译原理四元式什么是编译原理四元式编译原理四元式是编译器中的一种数据结构,用于将源代码转化为计算机能够理解和执行的中间代码。
它由四个字段组成:操作符、操作数1、操作数2和结果。
四元式可以描述源代码中的各种数学和逻辑运算,以及赋值和控制流等操作。
四元式的优点1.易于生成:四元式的生成比解析源代码直接生成目标代码更容易,因为四元式是对源代码的直接翻译。
2.易于优化:通过对四元式进行优化,可以减少生成的目标代码的长度和运行时间。
3.易于理解:四元式是一种中间表示形式,可以帮助开发人员更好地理解和调试源代码。
4.易于扩展:可以通过添加新的操作符和操作数类型来扩展四元式的功能。
四元式的组成四元式由四个字段组成:操作符、操作数1、操作数2和结果。
操作符表示进行的操作,如加法、乘法等;操作数1和操作数2是参与操作的数值或变量;结果是操作的结果。
四元式的形式如下:<操作符, 操作数1, 操作数2, 结果>四元式的生成过程四元式的生成过程可以分为词法分析、语法分析和语义分析三个步骤。
1.词法分析:将源代码分割成一个个的词法单元,如标识符、关键字、操作符等。
2.语法分析:根据源代码的语法规则,生成语法树。
语法树是一个由节点和边组成的树状结构,每个节点表示一个语法单元,例如表达式、语句等。
3.语义分析:遍历语法树,并根据语义规则生成四元式。
语义规则定义了源代码中各个语法单元的含义和操作。
四元式的生成过程既可以手动实现,也可以通过编译器生成器生成。
四元式的应用四元式主要用于编译器的各个阶段,在优化和生成目标代码过程中起到关键作用。
1.优化:通过对四元式进行优化,可以减少生成的目标代码的长度和运行时间。
常见的优化技术包括常量折叠、公共子表达式消除和无用代码删除等。
2.目标代码生成:通过对四元式进行目标代码生成,可以将中间代码转化为目标机器代码。
目标机器代码是计算机能够直接执行的二进制指令。
四元式还可以用于源代码的调试和性能分析。
编译原理报告for循环语句的翻译程序

学号:0120810680326课程设计题目f or循环语句的翻译程序学院计算机学院专业软件工程班级0803姓名徐泽前指导教师何九周2011 年 6 月日目录1设计目的 (4)2设计环境与工具 (4)3设计任务要求与说明 (4)4设计时间 (4)5设计地点 (4)6系统描述 (4)7文法及属性文法的描述 (5)7.1文法描述 (5)7.1.1 FOR语句相关的产生式: (5)7.1.2 布尔表达式: (5)7.1.3 赋值表达式: (5)7.2属性文法的描述 (5)8 语法分析方法描述及语法分析表设计 (7)8.1语法分析方法描述 (7)8.2系统中使用的action和goto表(见附录1) (9)9 给出中间代码形式的描述及中间代码序列的结构设计 (9)10简要的分析与概要设计 (10)11 详细的算法描述 (11)11.1词法分析的数据结构设计与详细的流程图 (11)11.2词法分析流程图 (11)11.3语法制导翻译的数据结构与详细的设计图 (12)11.3.1数据结构的设计 (12)11.3.2算法描述 (13)11.3.3程序流程图 (13)12给出软件的测试方法和测试结果 (14)12.1 FOR循环语句的测试 (14)12.2词法分析出错处理 (15)12.3语法分析出错处理 (16)13收获与体会 (16)14 参考文献 (17)课程设计任务书学生姓名:徐泽前专业班级:软件0803班指导教师:何九周工作单位:计算机学院题目: for循环语句的翻译程序初始条件:程序设计语言:主要使用C语言的开发工具,或者采用LEX、YACC等工具,也可利用其他熟悉的开发工具。
算法:可以根据《编译原理》课程所讲授的算法进行设计。
要求完成的主要任务:(包括课程设计工作量及其技术要求,说明书撰写等具体要求)1.明确课程设计的目的和重要性,认真领会课程设计的题目,读懂课程设计指导书的要求,学会设计的基本方法与步骤,学会如何运用前修知识与收集、归纳相关资料解决具体问题的方法。
编译原理教程课后习题答案——第四章

第四章语义分析和中间代码生成4.1 完成下列选择题:(1) 四元式之间的联系是通过实现的。
a. 指示器b. 临时变量c. 符号表d. 程序变量(2) 间接三元式表示法的优点为。
a. 采用间接码表,便于优化处理b. 节省存储空间,不便于表的修改c. 便于优化处理,节省存储空间d. 节省存储空间,不便于优化处理(3) 表达式(┐A∨B)∧(C∨D)的逆波兰表示为。
a. ┐AB∨∧CD∨b. A┐B∨CD∨∧c. AB∨┐CD∨∧d. A┐B∨∧CD∨(4) 有一语法制导翻译如下所示:S→bAb {print″1″}A→(B {print″2″}A→a {print″3″}B→Aa) {print″4″}若输入序列为b(((aa)a)a)b,且采用自下而上的分析方法,则输出序列为。
a. 32224441 b. 34242421c. 12424243d. 34442212【解答】(1) b (2) a (3) b (4) b4.2 何谓“语法制导翻译”?试给出用语法制导翻译生成中间代码的要点,并用一简例予以说明。
【解答】语法制导翻译(SDTS)直观上说就是为每个产生式配上一个翻译子程序(称语义动作或语义子程序),并且在语法分析的同时执行这些子程序。
也即在语法分析过程中,当一个产生式获得匹配(对于自上而下分析)或用于归约(对于自下而上分析)时,此产生式相应的语义子程序进入工作,完成既定的翻译任务。
用语法制导翻译(SDTS)生成中间代码的要点如下:(1) 按语法成分的实际处理顺序生成,即按语义要求生成中间代码。
(2) 注意地址返填问题。
(3) 不要遗漏必要的处理,如无条件跳转等。
例如下面的程序段:if (i>0) a=i+e-b*d; else a=0;在生成中间代码时,条件“i>0”为假的转移地址无法确定,而要等到处理“else”时方可确定,这时就存在一个地址返填问题。
此外,按语义要求,当处理完(i>0)后的语句(即“i>0”为真时执行的语句)时,则应转出当前的if语句,也即此时应加入一条无条件跳转指令,并且这个转移地址也需要待处理完else之后的语句后方可获得,就是说同样存在着地址返填问题。
编译原理课程设计——算术表达式、for、while语句转换为四元式

计算机与信息学院《操作系统与编译原理联合课程设计报告》专题:编译原理部分学生姓名:学号:专业班级:指导教师:2014 年 7 月一、设计目标设计一个语法制导翻译器,将算术表达式、for语句、while语句翻译成四元式。
要求先确定一个定义算术表达式、for语句、while语句的文法,为其设计一个语法分析程序,为每条产生式配备一个语义子程序,按照一遍扫描的语法制导翻译方法,实现翻译程序。
对用户输入的任意一个正确的表达式,程序将其转换成四元式输出。
二、设计思路开发平台:Visual C++ MFC解决这个问题的方案分为以下几个步骤:1.将算数表达式、for语句、while语句转换为四元式的第一步为对读入的表达式进行处理,即删除不必要的空格、回车、换行等,保证之后的步骤能够顺利进行。
2.分析算术表达式、for语句、while语句的文法。
3.通过词法分析判断语句中的每个字符的类型,如:数字、字母、符号等。
4.建立每种文法的LR(0)分析表,通过每个文法的LR(0)分析表对相应的表达式进行语法分析。
5.在语法分析正确的情况下,通过语法分析的中间过程的符号栈输出四元式,四元式的形式为:(op arg1 arg2 result)。
(一)算术表达式转换为四元式将算术表达式转换为四元式首先考虑了括号的问题,对于不同的算术表达式第一步进行词法分析,即确定各种符号的位置。
而括号中的式子是优先级最高的,应该最先进行处理。
我使用了一个数组记录算术表达式中括号的位置,并且定义了first_cc和first_jj函数对括号内的乘除法和加减法分别进行处理。
后将括号内的式子以四元式的形式输出。
通过以上转换,已将原算术表达式中的括号中的内容使用大写字母’A’、’B’……等代替(其中定义声明了change函数,用来将括号部分替换为大写字母)。
新的式子中,只含有加减乘除以及赋值这四种运算,后根据优先级的不同,逐步生成四元式。
其算法流程图如右图所示。
《编译原理》复习题(看完必过)

《编译原理》复习题(看完必过)一、单项选择题1.将编译程序分成若干个“遍”是为了( B )A.提高程序的执行效率B. 使程序的结构更加清晰C.利用有限的机器内存并提高机器的执行效率D.利用有限的机器内存但降低了机器的执行效率2.不可能是目标代码的是( D )A.汇编指令代码 B.可重定位指令代码C.绝对指令代码 D.中间代码3.词法分析器的输入是( B )A.单词符号串 B.源程序C.语法单位 D.目标程序4.中间代码生成时所遵循的是( C )A.语法规则 B.词法规则C.语义规则 D.等价变换规则5.编译程序是对( D )A.汇编程序的翻译 B.高级语言程序的解释执行C.机器语言的执行 D.高级语言的翻译6.词法分析应遵循( C )A.语义规则 B.语法规则C.构词规则 D.等价变换规则7.词法分析器的输出结果是( C )A.单词的种别编码 B.单词在符号表中的位置C.单词的种别编码和属性值 D.单词属性值8.正规式M1和M2等价是指( C )A.M1和M2的状态数相等 B.M1和M2的有向弧条数相等C.M1和M2所识别的语言集相等 D.M1和M2状态数和有向弧条数相等9.词法分析器作为独立的阶段使整个编译程序结构更加简洁、明确,因此,( B ) A.词法分析器应作为独立的一遍B.词法分析器作为子程序较好C.词法分析器分解为多个过程,由语法分析器选择使用.D.词法分析器并不作为一个独立的阶段10.如果L(M1)=L(M2),则M1与M2( A )A .等价B .都是二义的C .都是无二义的D .它们的状态数相等 11.文法G :S →xSx|y 所识别的语言是( C )A .xyxB .(xyx)* c .x n yx n (n ≥0) d .x *yx *12.文法G 描述的语言L(G)是指( A ) A.⎭⎬⎫⎩⎨⎧∈⇒=+*,|)(T V S G L αααB .⎭⎬⎫⎩⎨⎧⋃∈⇒=+*)(,|)(N T V V S G L ααα C .⎭⎬⎫⎩⎨⎧∈⇒=**,|)(T V S G L αααD .⎭⎬⎫⎩⎨⎧⋃∈⇒=**)(,|)(N T V V S G L ααα 13.有限状态自动机能识别( C )A .上下文无关文法B .上下文有关文法C .正规文法D .短语文法14.如果文法G 是无二义的,则它的任何句子( A ) A .最左推导和最右推导对应的语法树必定相同 B .最左推导和最右推导对应的语法树可能不同 C .最左推导和最右推导必定相同D .可能存在两个不同的最左推导,但它们对应的语法树相同 15.由文法的开始符经0步或多步推导产生的文法符号序列是( C ) A .短语 B .句柄 C .句型 D .句子 16.文法G :E →E+T|T T →T*P|P P →(E)|i则句型P+T+i 的句柄为( B )A .P+TB .PC .P+T+iD .i 17.文法G :S →b|∧|(T) T →T ∨S|S 则FIRSTVT(T)=( C )A .{ b ,∧,( }B .{ b ,∧,) }C .{ b ,∧,(,∨ }D .{ b ,∧,),∨ } 18.产生正规语言的文法为( D )A .0型B .1型C .2型D .3型19.任何算符优先文法( D )优先函数。
布尔表达式到四元式的转换 -回复

布尔表达式到四元式的转换-回复
布尔表达式到四元式的转换可分为以下几个步骤:
1. 将布尔表达式化简,将每个运算符左右两边的操作数分别用变量或常量表示。
2. 对于每个子表达式,生成一个形如(操作符, 操作数1, 操作数2, 结果)的四元式。
3. 对于布尔运算符,需要特别处理。
例如,将'&&' 转换为'JZ'(跳转指令)和'&&'(取反操作),将' ' 转换为'JNZ' 和' '。
4. 如果表达式中含有括号,则需要按照括号的顺序来生成四元式,确保表达式的顺序正确。
5. 最后将所有生成的四元式按顺序输出即可。
举例说明:
假设需要将布尔表达式a && b (c !d) 转换成四元式。
首先化简该表达式,得到a, b, c, d 四个操作数。
然后对于子表达式a && b 和c !d 生成四元式:
①(&&, a, b, t1)
②(!, d, _, t2)
③(, c, t2, t3)
再对于整个表达式生成四元式:
④(, t1, t3, t4)
其中,t1, t2, t3, t4 是临时变量,用于储存子表达式的结果。
最终输出的四元式为:①、②、③、④。
语法制导翻译和中间代码生成【共50张PPT】

例 完成类型检查的属性文法
1) E→T1+T2{T1.t=int AND T2.t=int}
2) E→T1 or T2 {T1.t=bool AND T2.t=bool}
3) T→num
{T.t :=int}
4) T→true {T.t :=bool}
5) T→false
{T.t :=bool}
6.1 属性文法(续)
四元式(续)
四元式的优点:
四元式比三元式更便于优化 优化要求改变运算顺序或删除某些运算,引起编号的变化。 三元式通过编号引用中间结果,编号的变化引起麻烦;四元 式通过临时变量引用中间结果,编号变化无影响。
四元式对生成目标代码有利
四元式表示很类似于三地址指令,很容易转换成机器代 码。
四元式(续)
3) E→T
{ E.val :=T.val }
4) T→T1*F { T.val :=T1.val * F.val }
5) T→F
{ T.val :=F.val }
6) F→(E) { F.val :=E.val }
7) F→digit { F.val :=digit.lexval }
E.val、T.val、F.val都是综合属性
每个使用性标识符是否都有声明? 运算符的分量类型是否相容? 赋值语句的左右部的类型是否相容?
➢ 赋值语句的翻译目标:
在赋值语句右部表达式产生的四元式序列后加一 条赋值四元式
简单赋值语句到四元式的翻译
考虑如下文法描述的简单赋值句的翻译: A→i:=E E→E+E|E*E|-E|(E)|i (6.1)
:=
a
+
叶子结点代表运算量, 非叶子结点代表运算符
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
学号:0121110680224课程设计题目布尔表达式的LR翻译器学院计算机科学与技术学院专业软件工程班级软件1102姓名李帅奇指导教师何九周2014 年 1 月 2 日课程设计任务书学生姓名:李帅奇专业班级:软件1102指导教师:何九周工作单位:计算机科学与技术学院题目: 布尔表达式的LR翻译器初始条件:程序设计语言:主要使用C语言的开发工具,或者采用LEX、YACC等工具,也可利用其他熟悉的开发工具。
算法:可以根据《编译原理》课程所讲授的算法进行设计。
要求完成的主要任务:(包括课程设计工作量及其技术要求,说明书撰写等具体要求)1.明确课程设计的目的和重要性,认真领会课程设计的题目,读懂课程设计指导书的要求,学会设计的基本方法与步骤,学会如何运用前修知识与收集、归纳相关资料解决具体问题的方法。
严格要求自己,要独立思考,按时、独立完成课程设计任务。
2.主要功能包括:利用LR分析法编制、调试其语法及语义分析程序,生成的中间代码为四元式。
编制好分析程序后计若干用例,上机测试并通过所设计的分析程序。
(参考教材P181~182)进行总体设计,详细设计:包括算法的设计和数据结构设计。
系统实施、调试,合理使用出错处理程序。
3.设计报告:要求层次清楚、整洁规范、不得相互抄袭。
正文字数不少于0.3万字。
包含内容:①课程设计的题目。
②目录。
③正文:包括引言、需求分析、总体设计及开发工具的选择,设计原则(给出语法分析方法及中间代码形式的描述、文法和属性文法的设计),数据结构与模块说明(功能与流程图)、详细的算法设计、软件调试、软件的测试方法和结果、有关技术的讨论、收获与体会等。
④结束语。
⑤参考文献。
⑥附录:软件清单(或者附盘)。
时间安排:消化资料、系统调查、形式描述1天系统分析、总体设计、实施计划3天撰写课程设计报告书1天指导教师签名:2014年1月2日系主任(或责任教师)签名:2014年1月2日目录1引言 (3)2需求分析 (3)3总体设计及开发工具的选择 (5)3.1设计分析 (5)3.2设计原理 (6)3.2.1词法分析 (6)3.2.2语法分析 (6)3.2.3中间代码生成 (7)3.3开发工具 (7)4设计原则 (7)5数据结构与模块说明 (8)5.1 ACTION表和GOTO表 (8)5.2 存储符号和产生式的数组 (9)5.2 状态栈和符号栈 (9)6算法设计 (14)6.1词法分析算法描述 (14)6.1.1词法分析流程图 (14)6.1.2词法分析算法 (14)6.2语法分析算法代码描述 (15)6.2.1语法分析算法流程图 (15)6.2.2语法分析算法 (15)6.3中间代码的生成 (19)7软件调试 (21)8软件的测试方法和结果 (22)9有关技术的讨论 (24)10收获与体会 (24)11参考文献 (24)本科生课程设计成绩评定表 (25)布尔表达式的LR翻译器1引言编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。
内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。
编译原理是计算机专业设置的一门重要的专业课程这门课在理论、技术、方法上都对学生提供了系统而有效的训练,有利于提高软件人员的素质和能力。
所谓LR(K)分析,是指从左至右扫描和自底向上的语法分析,且在分析的每一步,只须根据分析栈当前已移进和归约出的全部文法符号,并至多再向前查看K个输入符号,就能确定相对于某一产生式左左部符号的句柄是否已在分析栈的顶部形成,从而也就可以确定当前所应采取的分析动作(是移进还是按某一产生式进行归约等)。
2需求分析已知有如下的布尔表达式文法:B →B and T | TT→T or F | FF→not F|true|false |(B)| i rop i利用LR分析法编制、调试其语法及语义分析程序,生成的中间代码为四元式。
编制好分析程序后计若干用例,上机测试并通过所设计的分析程序。
布尔表达式的LR分析分为扩展文法,构造识别活动前缀的DFA图,判断有误冲突,若有冲突,则消除冲突和构造LR分析表等步骤。
首先要拓广文法:非二义性文法如下:(0) B’ → B(1) B → B and T(2) B → T(3) T → T or F(4) T → F(5) F → not F(6) F →( B )(7) F →true(8) F →false(9) F →i rop i●构造识别活动前缀的DFA图●判断有无冲突LR(0)分析时有移进—规约冲突,但冲突可以由SLR(1)分析解决。
●构造LR分析表3总体设计及开发工具的选择3.1设计分析编译器设计的编译程序涉及到编译五个阶段中的三个,即词法分析器、语法分析器和中间代码生成器。
编译程序的输出结果为中间代码即逆波兰式。
整个编译程序分为三部分:词法分析部分、语法分析处理及逆波兰式生成部分、输出显示部分。
编译程序需要在单词级别上来分析和翻译源程序,所以首先要识别出单词,而词法分析部分的任务是:从左至右扫描源程序的字符串,按照词法规则(正则文法规则)识别出一个个正确的单词,并转换成该单词相应的二元式(种别码、属性值)交给语法分析使用。
因此,词法分析是编译的基础。
执行词法分析的程序称为词法分析器。
语法分析是编译程序的核心部分,其主要任务是确定语法结构,检查语法错误,报告错误的性质和位置,并进行适当的纠错工作。
语法分析中主要以二元式作为输入部分,所以输出显示部分的任务是将二元式通过LR分析表对语法分析处理过程进行控制,使逆波兰式翻译的工作有条不紊的进行,同时识别语法分析中的语法错误。
3.2设计原理3.2.1词法分析词法分析是编制一个读单词的过程,从输入的源程序中,识别出各个具有独立意义的单词,即基本保留字、标识符、常数、运算符、分隔符五大类。
并依次输出各个单词的内部编码及单词符号自身值。
程序语言的单词符号一般分为五种:关键字(保留字/基本字)、标识符、常数、运算符、界限符。
词法分析的功能是输入源程序,输出单词符号。
词法分析的单词符号常常表示成二元式(单词种别码,单词符号的属性值)。
词法分析器的设计方法有如下四个步骤:1、写出该语言的词法规则。
2、把词法规则转换为相应的状态转换图。
3、把各转换图的初态连在一起,构成识别该语言的自动机。
4、设计扫描器;把扫描器作为语法分析的一个过程,当语法分析需要一个单词时,就调用扫描器。
扫描器从初态出发,当识别一个单词后便进入终态,送出二元式3.2.2语法分析语法分析是编译程序的核心部分,其主要任务是确定语法结构,检查语法错误,报告错误的性质和位置,并进行适当的纠错工作.法分析的方法有多种多样,常用的方法有递归子程序方法、运算符优先数法、状态矩阵法、LL(K)方法和LR(K)方法。
归纳起来,大体上可分为两大类,即自顶向下分析方法和自底向上分析方法. Syntax进行语法分析。
对于语法分析,这里采用LR(1)分析法,判断程序是否满足规定的结构.构造LR(1)分析程序,利用它进行语法分析,判断给出的符号串是否为该文法识别的句子,了解LR(K)分析方法是严格的从左向右扫描,和自底向上的语法分析方法。
3.2.3中间代码生成进入编译程序的第三阶段:中间代码产生阶段。
为了使编译程序有较高的目标程序质量,或要求从编译程序逻辑结构上把与机器无关和与机器有关的工作明显的分开来时,许多编译程序都采用了某种复杂性介于源程序语言和机器语言之间的中间语言。
常用的几种中间语言有: 逆波兰式、四元式、三元式、树表示。
本课程设计主要实现逆波兰式的生成。
逆波兰式定义: 将运算对象写在前面,而把运算符号写在后面。
用这种表示法表示的表达式也称做后缀式。
逆波兰式的特点在于运算对象顺序不变,运算符号位置反映运算顺序。
采用逆波兰式可以很好的表示简单算术表达式,其优点在于易于计算机处理表达式。
3.3开发工具Windows环境下使用Visual C++6.04设计原则算法是对问题求解过程的一种描述,是为解决一个或一类问题给出的一个确定的、有限长的操作序列。
严格说来,一个算法必须满足以下五个重要特性:●有穷性:对于任意一组合法的输入值,在执行有穷步骤之后一定能结束。
●确定性:对于每种情况下所应执行的操作,在算法中都有确切的规定,使算法的执行者或阅读者都能明确其含义及如何执行。
并且在任何条件下,算法都只有一条执行路径。
●可行性:算法中的所有操作都必须足够基本,都可以通过已经实现的基本操作运算有限次实现之。
●有输入:作为算法加工对象的量值,通常体现为算法中的一组变量。
但有些算法的字面上可以没有输入,实际上已被嵌入算法之中。
●有输出:它是一组与“输入”有确定关系的量值,是算法进行信息加工后得到的结果,这种确定关系即为算法的功能。
在设计算法时,通常应考虑以下原则:首先说设计的算法必须是“正确的”,其次应有很好的“可读性”,还必须具有“健壮性”,最后应考虑所设计的算法具有“高效率与低存储量”。
所谓算法是正确的,除了应该满足算法说明中写明的"功能"之外,应对各组典型的带有苛刻条件的输入数据得出正确的结果。
在算法是正确的前提下,算法的可读性是摆在第一位的,这在当今大型软件需要多人合作完成的环境下是换重要的,另一方面,晦涩难读的程序易于隐藏错误而难以调试。
算法的效率指的是算法的执行时间,算法的存储量指的是算法执行过程中所需最大存储空间。
算法是程序设计的另一个不可缺的要素,因此在讨论数据结构的同时免不了要讨论相应的算法。
这里有两重意思,即算法中的操作步骤为有限个,且每个步骤都能在有限时间内完成。
确定性表现在对算法中每一步的描述都没有二义性,只要输入相同,初始状态相同,则无论执行多少遍,所得结果都应该相同。
5数据结构与模块说明5.1 ACTION表和GOTO表在程序中,我们使用两个二维数组存储SLR分析表,并初始化,初始化SLR表,其中action表中:100表示acc,除了100以外整数表示移进状态;负数表示用对应产生式进行规约。
int action[18][10]={ { 0 , 0 ,4 ,5 , 6 ,7 , 0 , 8 , 0 , 0},//0{ 9 , 0 ,0 ,0 , 0 ,0 ,-2 , 0 , 0 ,100},//1{-2 ,10 ,0 ,0 , 0 ,0 ,-2 , 0 , 0 , -2},//2{-4 ,-4 ,0 ,0 , 0 ,0 ,-4 , 0 , 0 , -4},//3{ 0 , 0 ,4 ,5 , 6 ,7 , 0 , 8 , 0 , 0},//4{-7 ,-7 ,0 ,0 , 0 ,0 ,-7 , 0 , 0 , -7},//5{-8 ,-8 ,0 ,0 , 0 ,0 ,-8 , 0 , 0 , -8},//6{ 0 , 0 ,4 ,5 , 6 ,7 , 0 , 8 , 0 , 0},//7{ 0 , 0 ,0 ,0 , 0 ,0 , 0 , 0 ,13 , 0},//8{ 0 , 0 ,4 ,5 , 6 ,7 , 0 , 8 , 0 , 0},//9{ 0 , 0 ,4 ,5 , 6 ,7 , 0 , 8 , 0 , 0},//10{-5 ,-5 ,0 ,0 , 0 ,0 ,-5 , 0 , 0 , -5},//11{ 9 , 0 ,0 ,0 , 0 ,0 ,16 , 0 , 0 , 0},//12{ 0 , 0 ,0 ,0 , 0 ,0 , 0 ,17 , 0 , 0},//13{-1 ,10 ,0 ,0 , 0 ,0 ,-1 , 0 , 0 , -1},//14{-3 ,-3 ,0 ,0 , 0 ,0 ,-3 , 0 , 0 , -3},//15{-6 ,-6 ,0 ,0 , 0 ,0 ,-6 , 0 , 0 , -6},//16{-9 ,-9 ,0 ,0 , 0 ,0 ,-9 , 0 , 0 , -9}};//17int gotol[18][3]={ {1 ,2 , 3},{0 ,0 , 0},{0 ,0 , 0},{0 ,0 , 0}, {0 ,0 ,11},{0 ,0 , 0},{0 ,0 , 0},{12 ,2 , 3},{0 ,0 , 0},{0 ,14 , 3},{0 ,0 ,15},{0 ,0 , 0},{0 ,0 , 0},{0 ,0 , 0},{0 ,0 , 0},{0 ,0 , 0},{0 ,0 , 0},{0 ,0 , 0}};5.2 存储符号和产生式的数组用三个数组来存储和符号以及产生式相关的信息:endls数组存储终结符、noends数组存储非终结符、products数组存储产生式信息。