代码拉取完成,页面将自动刷新
同步操作将从 Ray/compile2021 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
# 编译原理实验报告 ### 一、实验内容 一个简单的C语言编译器,可将 C 语言测试程序编译为目标代码——汇编程序,用汇编器转换为二 进制程序后运行无误 1. 基本要求: 数据类型:int 语句:注释,声明,赋值,循环(while 和 for),判断(if),输入输出 算术运算:+,-,*,/,% 关系运算:==,>,<,>=,<=,!= 逻辑运算:&&(与),||(或),!(非) 2. 完成功能:词法分析、语法分析、中间代码、类型检查、代码优化、错误分析、汇编程序 3. 加分项:手工实现词法分析语法分析 ### 二、实验思路 编译程序是指把用高级程序设计语言书写的源程序,翻译成等价的机器语言格式目标程序的翻译程序。编译程序属于采用生成性实现途径实现的翻译程序。它以高级程序设计语言书写的源程序作为输入,而以汇编语言或机器语言表示的目标程序作为输出。编译出的目标程序通常还要经历运行阶段,以便在运行程序的支持下运行,加工初始数据,算出所需的计算结果。 1.词法分析 识别关键字、字面量、标识符 (变量名、数据名)、运算符、注释行(一般不处理)、特殊符号(续行、语句结束、数组)等六类符号,分别归类等待处理。 词法分析将源程序读入一个个的字符,根据一定的构词规则,识别出各类有用的单词。当输入字母时,开始识别标识符或关键宇,边拼写边从缓冲区读入下一符号,当读入一非字母数字符号时,标识符识别完成,但已多读入一个符号,所以列记数回退。然后查关键字表,判断拼出的符号串是否为关键字。若是关键字,输出其种别码。否则识别的单词就是标识符,同时输出标识符及其种别码。当输入数字时,开始识别整数或实数,输出常数及其种别码。当输入“/”时,开始识别注解或除号,若是注解时,最后两个连续读出的符号是“*/”,不需再读下一符号,计数不变。当判定是除号“/”时,已多读入一字符,输出“/”的种别码。 2.语法分析 一个语句看作一串记号 (Token)流,由语法分析器进行处理。按照语言的文法检查判定是否是合乎语法的句子。如果是合法句子就以内部格式保存,否则报错。直至检查完整个程序。 语法分析程序读取词法分析传来的token,匹配合适的产生式,若匹配成功则生成相应的语法树结点并插入语法树,若是标识符,需要在符号表中找到其地址并存储。最后全部读取完成之后遍历并打印语法树 3.中间代码生成 中间代码是向目标码过渡的一种编码,其形式尽可能和机器的汇编语言相似,以便下一步的代码生成。但中间码不涉及具体机器的操作码和地址码。采用中间码的好处是可以在中间码上做优化。 输入语法树与符号表,读取当前语法树结点,根据不同的结点类型生成四元式,将四元式存储并打印 4.代码类型检查 根据构造符号表中变量信息的检查实现简单Debug程序 5.代码优化 对中间码程序做局部优化和全局 (整个程序)优化,目的是使运行更快,占用空间最小。局部优化是合并冗余操作,简化计算,例如x:=0可用一条"清零"指令替换。全局优化包括改进循环、减少调用次数和快速地址算法等。 6.汇编程序 由代码生成器生成目标机器的目标码 (或汇编)程序 ### 三、人员分工 孟嘉怡:tree.h\token.h \gencode.h\gencode.cpp 马宁:midcode.h\midcode.cpp 严丽华:Scope.h\Scope.cpp 孙宜辰、李宇琪:lexer.h\lexer.cpp\symbols.h\symbols.cpp\symbolstable.h\symbolstable.cpp\parser.h\parser.cpp\报告撰写 ### 四、项目地址 https://gitee.com/seeuiceland/compile2021
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。