我的编译报告
- 格式:doc
- 大小:353.50 KB
- 文档页数:27
keil中显示编译信息的方法
Keil是一款非常流行的嵌入式系统开发软件,它可以方便地编写和调试单片机程序。
在编写程序时,我们经常需要查看编译信息,以便更好地了解代码的编译情况。
下面介绍一下Keil中显示编译信息的方法。
1. 打开Keil软件,点击“Options for Target”按钮,弹出“Options for Target”对话框。
2. 在对话框中选择“Listing”选项卡,勾选“Generate Assembly Listings”和“Generate Map File”选项,并指定输出目录和文件名。
点击“OK”按钮保存设置。
3. 在编译程序时,Keil会自动生成一个.lst文件和一个.map
文件。
其中.lst文件是汇编代码的清单,可以查看编译器生成的汇编代码。
.map文件是链接器生成的映射文件,可以查看程序的存储地址和占用空间等信息。
4. 如果需要查看编译器输出的详细信息,可以在Keil的输出窗口中查看。
点击“View”菜单下的“Output”选项,弹出“Output”窗口。
在“Output”窗口中可以看到编译器输出的详细信息,包括警告和错误信息等。
通过上述方法,我们可以方便地查看Keil的编译信息,帮助我们更好地了解代码的编译情况,并及时修正错误,提高程序的质量和可靠性。
- 1 -。
高级语言及其文法编译原理实验示例文章篇一:哎呀,这“高级语言及其文法编译原理实验”听起来可真够复杂的!就好像是一个超级大迷宫,等着我们去探索呢!你想想,高级语言就像是我们跟计算机交流的神奇密码,文法呢,就是这些密码的规则。
那编译原理实验呢,就像是破解密码的神秘过程!比如说C 语言,它就是一种很厉害的高级语言。
我们用它能写出各种各样的程序,从简单的计算,到复杂的游戏。
那它的文法规则就像是一条条不能违反的命令,告诉我们怎么写才是对的。
再看看Java 语言,它的面向对象特性多牛啊!写出来的程序清晰又好理解。
可要是不懂它的文法,那不就像是在黑暗中乱撞,找不到方向?编译原理实验呢,就好像我们是侦探,要找出程序中的错误和问题。
我们得一点点分析,一点点研究,就像在一堆乱麻中找出那根关键的线头。
“这高级语言和文法,还有编译原理实验,到底有啥用啊?”有人可能会这么问。
哎呀,用处可大了!没有它们,我们怎么能让计算机按照我们的想法工作?怎么能开发出那些好用的软件和程序?就像盖房子,高级语言是砖头和木材,文法是建筑图纸,编译原理实验就是检查房子是不是结实的过程。
少了哪一个,这房子都盖不好!我觉得啊,要学好这高级语言及其文法编译原理实验,就得像勤劳的小蜜蜂,不停地学习、实践。
可不能怕困难,一遇到问题就退缩。
只有这样,我们才能在这个神奇的计算机世界里畅游,创造出属于我们自己的精彩!示例文章篇二:哎呀,你说的“高级语言及其文法编译原理实验”,这可真是个复杂又有趣的话题!就拿我们平时学的编程语言来说吧,像Python 、Java 这些,它们可不简单!它们就像是一个个神奇的魔法盒子,里面装满了各种奇妙的指令和规则。
你想啊,高级语言里的那些文法,不就像是给这些魔法盒子编的使用说明书吗?告诉我们怎么正确地打开盒子,拿出我们想要的宝贝。
比如说,定义一个变量,就像是给一个小盒子贴上标签,告诉它装什么东西。
这规则要是错了,那可就乱套啦!再说说编译原理实验。
实验四内核裁减和编译一、实验目的1.了解和掌握内核源代码的目录结构;2.了解内核系统配置方式,了解Makefile和config.in脚本文件的作用;3.了解内核各项内容;4.熟悉make命令的使用。
二、实验环境预装redhat9.0(内核版本2.4.x)的PC机一台,XScale嵌入式实验箱一台(已构建嵌入式linux系统),以太网线一根,交叉编译工具链。
三、实验步骤①察看和了解Linux内核的目录及内容;②察看和了解Linux内核的Makefile文件及作用;③察看和了解Linux内核的config.in文件及作用;④使用menuconfig或xconfig察看内核编译选项及作用;⑤开关某些编译选项,自己裁剪一个Linux内核;A.[root @localhost ~]# cd XSBASE/xsbase/Kernel/2.4.18-rmk-pxal-XSBASE[root @localhost 2.4.18-rmk-pxal-XSBASE]# make menuconfigB.设置开发板上的鼠标不能操作。
进入Input Core device,然后敲空格键,取消屏幕上的鼠标操作。
退出时并保存。
C.[root @localhost 2.4.18-rmk-pxal-XSBASE]# make dep[root @localhost 2.4.18-rmk-pxal-XSBASE]# make zImage[root @localhost 2.4.18-rmk-pxal-XSBASE]# cd arch/arm/boot/[root @localhost 2.4.18-rmk-pxal-XSBASE]# cp zImage /tftpD.启动mini终端。
XSBase255> boot[root @XSBASE /root]$ tfp 192.168.0.77ftp>cd /ftp>get /tftp/zImageE.这个时候在重启板子一下,板子就不能执行触摸屏上的鼠标操作了。
编译linux实验报告
编译Linux实验报告
在计算机科学领域,Linux操作系统一直被广泛使用。
它是一个开放源代码的操作系统,具有稳定性和安全性。
在本次实验中,我们将学习如何编译Linux内核,并撰写实验报告以记录我们的实验过程和结果。
实验目的:
1. 了解Linux内核的编译过程
2. 熟悉编译工具和技术
3. 掌握编译过程中可能遇到的问题和解决方法
实验步骤:
1. 下载Linux内核源代码
2. 解压源代码并配置编译环境
3. 使用make命令编译内核
4. 安装编译后的内核
5. 测试新内核的稳定性和功能
实验结果:
经过一系列的操作,我们成功地编译了Linux内核,并将其安装到我们的计算机上。
新内核的稳定性和功能得到了验证,证明我们的编译过程是成功的。
实验总结:
通过本次实验,我们不仅了解了Linux内核的编译过程,还学习了如何使用编译工具和技术。
在实验过程中,我们遇到了一些问题,但通过查阅资料和尝试不同的解决方法,最终成功地完成了编译过程。
这次实验为我们提供了宝贵的
经验,也增强了我们对Linux操作系统的理解和掌握。
总的来说,编译Linux内核的实验是一次有意义的学习过程,我们通过实践提升了自己的技能和知识水平。
希望在未来的学习和工作中,能够运用这些经验和技能,为我们的计算机科学之路增添更多的成就和贡献。
学年第学期《编译原理》实验报告学院(系):计算机科学与工程学院班级:11303070A学号:***********姓名:无名氏指导教师:保密式时间:2016 年7 月目录1.实验目的 (1)2.实验内容及要求 (1)3.实验方案设计 (1)3.1 编译系统原理介绍 (1)3.1.1 编译程序介绍 (2)3.1.2 对所写编译程序的源语言的描述 (2)3.2 词法分析程序的设计 (3)3.3 语法分析程序设计 (4)3.4 语义分析和中间代码生成程序的设计 (4)4. 结果及测试分析 (4)4.1软件运行环境及限制 (4)4.2测试数据说明 (5)4.3运行结果及功能说明 (5)5.总结及心得体会 (7)1.实验目的根据Sample语言或者自定义的某种语言,设计该语言的编译前端。
包括词法分析,语法分析、语义分析及中间代码生成部分。
2.实验内容及要求(1)词法分析器输入源程序,输出对应的token表,符号表和词法错误信息。
按规则拼单词,并转换成二元形式;滤掉空白符,跳过注释、换行符及一些无用的符号;进行行列计数,用于指出出错的行列号,并复制出错部分;列表打印源程序;发现并定位词法错误;(2)语法分析器输入token串,通过语法分析,寻找其中的语法错误。
要求能实现Sample 语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while语句、do while语句等。
(3)语义分析和中间代码生成输入token串,进行语义分析,修改符号表,寻找其中的语义错误,并生成中间代码。
要求能实现Sample语言或自定义语言中几种最常见的、基本的语法单位的分析:算术表达式、布尔表达式、赋值语句、if语句、for语句、while 语句、do while语句等。
实验要求:功能相对完善,有输入、输出描述,有测试数据,并介绍不足。
3.实验方案设计3.1 编译系统原理介绍编译器逐行扫描高级语言程序源程序,编译的过程如下:(1).词法分析识别关键字、字面量、标识符(变量名、数据名)、运算符、注释行(给人看的,一般不处理)、特殊符号(续行、语句结束、数组)等六类符号,分别归类等待处理。
《编译原理》实验报告软件131 陈万全132852一、需求分析通过对一个常用高级程序设计语言的简单语言子集编译系统中词法分析、语法分析、语义处理模块的设计、开发,掌握实际编译系统的核心结构、工作流程及其实现技术,获得分析、设计、实现编译程序等方面的实际操作能力,增强设计、编写和调试程序的能力。
通过开源编译器分析、编译过程可视化等扩展实验,促进学生增强复杂系统分析、设计和实现能力,鼓励学生创新意识和能力。
1、词法分析程序设计与实现假定一种高级程序设计语言中的单词主要包括五个关键字begin、end、if、then、else;标识符;无符号常数;六种关系运算符;一个赋值符和四个算术运算符,试构造能识别这些单词的词法分析程序。
输入:由符合和不符合所规定的单词类别结构的各类单词组成的源程序文件。
输出:把所识别出的每一单词均按形如(CLASS,VALUE)的二元式形式输出,并将结果放到某个文件中。
对于标识符和无符号常数,CLASS字段为相应的类别码的助记符;VALUE字段则是该标识符、常数的具体值;对于关键字和运算符,采用一词一类的编码形式,仅需在二元式的CLASS字段上放置相应单词的类别码的助记符,VALUE字段则为“空”。
2、语法分析程序设计与实现选择对各种常见高级程序设计语言都较为通用的语法结构——算术表达式的一个简化子集——作为分析对象,根据如下描述其语法结构的BNF定义G2[<算术表达式>],任选一种学过的语法分析方法,针对运算对象为无符号常数和变量的四则运算,设计并实现一个语法分析程序。
G2[<算术表达式>]:<算术表达式> → <项> | <算术表达式>+<项> | <算术表达式>-<项><项> → <因式> | <项>*<因式> | <项>/<因式><因式> → <运算对象> | (<算术表达式>)若将语法范畴<算术表达式>、<项>、<因式>和<运算对象>分别用E、T、F和i 代表,则G2可写成:G2[E]:E → T | E+T | E-T T → F | T*F | T/F F → i | (E)输入:由实验一输出的单词串,例如:UCON,PL,UCON,MU,ID ······输出:若输入源程序中的符号串是给定文法的句子,则输出“RIGHT”,并且给出每一步分析过程;若不是句子,即输入串有错误,则输出“ERROR”,并且显示分析至此所得的中间结果,如分析栈、符号栈中的信息等,以及必要的出错说明信息。
***学生实验报告一、实验目的(1)学习重新编译Linux内核的方法(2)理解Linux标准内核和发行版本内核的区别。
二、实验内容在Linux系统中下载同一发行版本的版本号较高的内核,编译之后运行自己编译的内核,并使用uname-r命令查看是否运行成功。
由于不同版本的内核在编译过程中可能出现不同的问题,本书推荐的内核版本为4.16.10。
从第7章开始的进阶实验篇,都可以选用该版本的内核。
三、实验设备Vmware上运行的linux ubuntu 5.11.0-43-generic实验成功:linux ubuntu 4.18.0-generic(Ubuntu18.04均可)实验成功的方法在最后四、实验过程和原理分析一、实验(一)准备工作:在这里我建议用一个全新的虚拟机,避免编译错误对原来常使用的虚拟机造成不可逆的影响,安装好后就先安装gcc、make等工具首先下载好Linux***内核文件解压至/usr/src 目录下,如下:确认安装好gcc、make等工具,后可直接运行命令sudo make menuconfig进行查看内核功能是否需要编译,如果遇到如下错误可以运行命令sudo apt bison 或sudo apt-get install fiex bison命令解决错误:解决:(不建议)(强烈建议)除此之外还可以直接运行,上一条命令解决不了就用下面这个:sudo apt-get install --reinstall bison libbison-dev flex libfl-dev解决上述错误(强烈建议)运行完上述命令后再次输入sudo make menuconfig便正常进入如下:见到这个界面后无需任何多余操作,使用键盘方向键选择<Save>回车再回车即可此时.config文件生成成功.config文件是隐藏文件记得加参数-a此外还有一个方法就是用cp 命令从原有系统的内核复制.config文件过来也可以命令:sudo cp /boot/config- 5.11.0-43-generic ./.config(二)编译内核为了避免多线程编译时同时出现过多错误,我们这里一开始只使用单线程编译在这里除了用make编译还可以用make-kpkg等工具,个人比较喜欢用make-kpkg但课本用make所以我接下来的实验也先用make完成。
一、实验目的1. 理解编译原理的基本概念和过程。
2. 掌握编译器的基本组成和编译流程。
3. 学会使用编译器对源代码进行编译,并分析编译结果。
二、实验环境1. 操作系统:Windows 102. 编译器:GCC (GNU Compiler Collection)3. 开发工具:Visual Studio Code三、实验内容1. 编译器的基本组成和编译流程2. 编译器的使用3. 编译结果分析四、实验步骤1. 编译器的基本组成和编译流程(1)词法分析:将源代码分解成一个个的单词,如标识符、关键字、运算符等。
(2)语法分析:将单词序列转换成语法树,验证源代码是否符合语法规则。
(3)语义分析:检查语法树,确保源代码在语义上是正确的。
(4)中间代码生成:将语法树转换成中间代码,如三地址代码。
(5)代码优化:对中间代码进行优化,提高程序运行效率。
(6)目标代码生成:将优化后的中间代码转换成目标代码,如汇编代码。
(7)代码生成:将目标代码转换成可执行文件。
2. 编译器的使用(1)编写源代码:使用Visual Studio Code编写C语言源代码。
(2)编译源代码:在命令行中输入gcc -o 程序名源文件名.c,编译源代码。
(3)运行程序:在命令行中输入程序名,运行编译后的程序。
3. 编译结果分析(1)词法分析:编译器将源代码中的单词进行分解,如以下代码:```cint main() {int a = 1;return a;}```编译器将分解为以下单词:- int- main- (- )- {- int- a- =- 1- ;- return- a- ;- }- }(2)语法分析:编译器将单词序列转换成语法树,验证源代码是否符合语法规则。
(3)语义分析:编译器检查语法树,确保源代码在语义上是正确的。
(4)中间代码生成:编译器将语法树转换成中间代码,如以下三地址代码:```t1 = 1a = t1t2 = areturn t2```(5)代码优化:编译器对中间代码进行优化,如以下优化后的三地址代码:```a = 1return a```(6)目标代码生成:编译器将优化后的中间代码转换成汇编代码。
我的Platform Builder编译错误总结作者:jbb0523(彬彬有礼)环境:S3C2440A+Platform Builder 5.0+4.2BSP1、Ram start overlaps rom binary错误分析:记得第一次自已定制操作系统,新建platform时就出现过这个错误,当时也没在意,就没再研究。
这次想研究一下PB的使用,首先添加了PDF、WORD、EXCEL和PPT的阅览器,下载内核后果然有变化,很有成就感;然后又想添加Windows Player,但添加了几个组件再次进行sysgen时,却出现了这个错误。
我的反应:好像前一段时间网上见过这种错误,再说添加几个组件后不至于出错呀,而且由错误提示的意思感觉是添加的组件导致内核太大了。
错误原因:操作系统添加的组件过多,其内核大小超出了BSP中files文件夹中的config.bib文件中规的大小。
解决方法:1)删除不必要的组件;2)修改BSP包下config.bib文件,具体方法可以在百度或google搜索“Ram start overlaps rom binary”或参考/ joyzml/ archive/2010/01/18/5207176.aspx文章。
2、Failed to initialize from CECONFIG.H.错误分析:修改BSP添加驱动后总是出奇怪的错误,无奈时就新建platform,为防止BSP包有错,新建好platform后直接在FileView下找到SMDK2440目录下的drivers目录,然后在driver上右击,Build current project,结果出错。
我的反应:很郁闷,一波未平,一波又起。
错误原因:后来我就当没这个错误,sysgen新建的platform,发现也没再出现这个错误,渐渐地快把它忘了,后来在网上看到了这个错误的解释,原来是因为没有编译platform所致。
解决方法:不要新建platform后就编译BSP,先编译platform再编译BSP,一切OK!3、Bootloader引导OS到SDRAM后无法执行,提示“Dabort exception!!!”(数据中止异常)错误分析:此错误应该不算是PB编译出错的范畴,但也把它列在这里。
《编译原理》课程实验报告题目PL/0编译程序的C语言扩充专业化学工程与工艺班级学号姓名任课教师华东理工大学信息学院一.实验题目PL/0编译程序的C语言扩充二.实验目的在分析理解PL/0编译程序的基础上,对其词法分析程序、语法分析程序和语义处理程序进行部分修改扩充。
三.实验内容在PL/0语言的基础上增加对整型一维数组的支持、扩充IF-THEN-ELSE条件语句、增加REPEAT 语句、支持带参数的过程和增加注释等,如下所示:(1)整型一维数组,数组的定义格式为:VAR<数组标识名>(<下界>:<上界>)其中上界和下界可以是整数或者常量标识名。
访问数组元素的时候,数组下表是整型的表达式,包括整数、常量或者变量和他们的组合。
(2)扩充条件语句,格式为:<条件语句> ::= EF<条件>THEN<语句> [ELSE<语句>](3)增加REPEAT语句,格式为:<复合语句> ::= REPEAT<语句>UNTL<条件>四.实验过程(1)PL/0编译程序的C语言源代码输入(2)运行PL/0编译程序的C语言源代码,调试运行PL/0编译程序(3)对PL/0编译程序进行功能扩充(4)PL/0编译程序功能扩充部分的分析与设计(5)对PL/0编译程序进行功能扩充,即编写代码(6)进行PL/0编译程序功能扩充部分的运行调试(7)完成实验报告总结五.PL/0编译程序的功能扩充程序说明(1)扩充赋值运算:+=,-=.此功能扩充只需在语句分析里面进行增加如下程序:if(SYM==BECOMES||SYM==PLUSBECOMES||SYM==MINUSBECOMES){if (SYM==BECOMES){GetSym();EXPRESSION(FSYS,LEV,TX);}elseif(SYM==PLUSBECOMES||SYM==MINUSBECOMES){GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);if(SYM==PLUSBECOMES){GetSym();FACTOR(FSYS,LEV,TX);GEN(OPR,0,2);}elseif(SYM==MINUSBECOMES){GetSym();FACTOR(FSYS,LEV,TX);GEN(OPR,0,3);}}if (i!=0)GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);}(2)扩充FOR TO和FOR DOWNTO语句,此功能的关键是如何判断条件是否成立,并如何进行程序跳转.在这里用到了几条指令,和地址回填技术.扩充程序如下:case FORSYM:GetSym();if(SYM!=IDENT)Error(31); //FOR后面要标识符i=POSITION(ID,TX);if (i==0) Error(11);elseif (TABLE[i].KIND!=VARIABLE) { /*ASSIGNMENT TO NON-VARIABLE*/Error(12); //变量}GetSym();if(SYM!=BECOMES)Error(13);GetSym();EXPRESSION(SymSetUnion(SymSetNew(TOSYM,DOWNTOSYM,DOSYM),FSYS),LEV,TX);//表达式if(SYM==DOWNTOSYM)CX1=CX;GetSym();GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);//保存结果至变量单元GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);//重新调入栈顶EXPRESSION(SymSetAdd(DOSYM,FSYS),LEV,TX);//表达式GEN(OPR,0,11);//判断运算CX2=CX;GEN(JPC,0,0);//如果栈顶非真跳转GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);///重新调入栈顶GEN(LIT,0,1) ;//送1到栈顶GEN(OPR,0,3); //减运算if(SYM==DOSYM){GetSym();STATEMENT(FSYS,LEV,TX);}GEN(JMP,0,CX1);CODE[CX2].A=CX;}else if(SYM==TOSYM){CX1=CX;GetSym();GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); //保存结果至变量单元GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); /重新调入栈顶EXPRESSION(SymSetAdd(DOSYM,FSYS),LEV,TX);//表达式分析GEN(OPR,0,13);//判断运算CX2=CX;GEN(JPC,0,0);//如果栈顶非真跳转GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);GEN(LIT,0,1);GEN(OPR,0,2);if(SYM==DOSYM){GetSym();STATEMENT(FSYS,LEV,TX);}GEN(JMP,0,CX1);CODE[CX2].A=CX;//回填地址}else Error(35);break;(3) 增加条件语句的ELSE子ELSE语句的语法语义分析程序:case IFSYM:GetSym();CONDITION(SymSetUnion(SymSetNew(THENSYM,DOSYM),FSYS),LEV,TX);if (SYM==THENSYM) GetSym();else Error(16);CX1=CX; GEN(JPC,0,0);STATEMENT(FSYS,LEV,TX);CX2=CX; GEN(JMP,0,CX+1);CODE[CX1].A=CX;if (SYM==SEMICOLON) GetSym();if(SYM==ELSESYM){GetSym();STATEMENT(FSYS,LEV,TX);CODE[CX2].A=CX;} //add the statement of ELSEelse STATEMENT(FSYS,LEV,TX);break;(4)修改单词:不等号# 改为 <>if (CH=='<'){GetCh();if (CH=='=') { SYM=LEQ; GetCh(); }elseif(CH=='>') { SYM=NEQ; GetCh(); }else SYM=LSS;六.实验设计思想1.设计说明PL/0语言是Pascal语言的一个子集,这里分析的PL/0的编译程序包括了对PL/0语言源程序进行分析处理、编译生成类PCODE代码,并在虚拟机上解释运行生成的类PCODE代码的功能。
课程设计报告( 2014 -- 2015年度第 1 学期)名称:编译技术课程设计B题目:词法分析器设计算符优先分析程序设计基于算符优先分析方法的语法制导翻译程序设计院系:计算机系班级:计科1202班学号:201209010211学生姓名:刘莉菲指导教师:编译课程教学组设计周数:1周成绩:日期:2015 年1月9 日《编译技术》课程设计B任务书一、目的与要求1.词法分析器设计的目的与要求1.1 词法分析器设计的实验目的本实验是为计算机科学与技术专业、网络工程专业、信息安全专业的学生在学习《编译技术》课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。
通过这个实验,使学生应用编译程序设计的原理和技术设计出词法分析器,了解扫描器的组成结构,不同种类单词的识别方法。
能使得学生在设计和调试编译程序的能力方面有所提高。
为将来设计、分析编译程序打下良好的基础。
1.2 词法分析器设计的实验要求设计一个扫描器,该扫描器是一个子程序,其输入是源程序字符串,每调用一次识别并输出一个单词符号。
为了避免超前搜索,提高运行效率,简化扫描器的设计,假设该程序设计语言中,基本字(也称关键词)不能做一般标识符用,如果基本字、标识符和常数之间没有确定的运算符或界符作间隔,则用空白作间隔。
单词符号及其内部表示如表1-1所示,单词符号中标识符由一个字母后跟多个字母、数字组成,常数由多个十进制数字组成。
单词符号的内部表示,即单词的输出形式为二元式:(种别编码,单词的属性值)。
表1-1 单词符号及其内部表示2.算符优先分析程序设计的目的和要求 2.1 算符优先分析程序设计的实验目的本实验是为计算机科学与技术等专业的学生在学习《编译技术》课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。
通过这个实验,使学生应用编译程序设计的原理和技术, 设计、编写和调试算符优先分析程序,了解算符优先分析程序的组成结构,掌握实现通用算符优先分析算法的方法。
能使得学生在设计和调试编译程序的能力方面有所提高。
为将来设计、分析编译程序打下良好的基础。
2.2 算符优先分析程序设计的实验要求算符优先分析属于自下而上的分析方法,该语法分析程序的输入是终结符号串(即单词符号串,以一个“#”结尾),如果输入串是句子则输出“YES ”,否则输出“NO ”和错误信息。
算符优先分析过程与非终结符号无关,当由文法产生了优先关系之后文法也就失去了作用,本题目给出文法的目的是为了便于对语法分析结果进行验证。
(1)文法 设算符优先文法G 为:T T E E |+→F F T T |*→P F P F |↑→i E P |)(→说明:i 为整型常数或者为标识符表示整型变量;使用中↑用**表示。
(2)优先关系表 设优先关系表如表1-2所示。
表1-2 优先关系表3.基于算符优先分析方法的语法制导翻译程序设计的目的和要求3.1基于算符优先分析方法的语法制导翻译程序设计的实验目的本实验是为计算机科学与技术等专业的学生在学习《编译技术》课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。
通过这个实验,使学生应用编译程序设计的原理和技术, 通过设计、编写和调试语法制导翻译程序,掌握从一种语句的语法和语义出发,构造相应的语义子程序,实现基于算符优先分析方法的语法制导翻译的方法。
能使得学生在设计和调试编译程序的能力方面有所提高。
为将来设计、分析编译程序打下良好的基础。
3.2 基于算符优先分析方法的语法制导翻译程序设计的实验要求算符优先分析方法是通过反复把输入符号移进分析栈,使用优先关系表在分析栈顶寻找最左素短语,将其归约为一个非终结符号而实现的。
这个分析过程与非终结符号无关,当由文法产生了优先关系之后文法也就失去了作用(所以本题目无需给出文法)。
基于算符优先分析方法的语法制导翻译是在算符优先语法分析的基础上进行翻译工作(即语义分析),每当将一个最左素短语归约为一个非终结符号时,就调用对应产生式的语义子程序,去完成相应的语义翻译工作,这步归约使用的产生式对非终结符号不加区分(即将所有的非终结符号用一个通用的非终结符号表示)。
语法制导翻译程序的输入是终结符号串(即单词符号串,以一个“#”结尾),如果输入符号串是句子,则按照其语义进行翻译,输出等价的四元式序列(作为练习应显示输出)。
4.上机前的准备为了充分利用上机时间,在进行编译技术上机实验前应做好各种准备工作,具体应包括:(1)复习与上机题目有关的知识,熟悉有关定义、概念和实现算法。
(2)设计出程序流程框图和数据结构,编写出完整的源程序,进行静态检查。
(3)为所编写的程序构思一个运行、调试环境,例如,以什么方式提供输入数据、显示输出数据,如何调用(或启动)编写的程序。
制定出程序调试计划和典型输入代码数据。
5.课程设计报告课程设计完成后,按学校给定的格式和要求写出课程设计报告。
二、主要内容完成以下课程设计内容:1.完成词法分析器设计,实现输入源程序字符串,每调用一次扫描器,就输出一个以内部形式表示的单词符号,输出形式为二元式:(种别编码,单词属性)2.完成算符优先分析程序设计,掌握实现通用算符优先分析算法的方法,实现输入终结符号串(即单词符号串,以一个“#”结尾),如果输入串是句子则输出“YES”,否则输出“NO”和错误信息。
3.完成基于算符优先分析方法的语法制导翻译程序设计,实现输入是终结符号串(即单词符号串,以一个“#”结尾),如果输入符号串是句子,则按照其语义进行翻译,输出等价的四元式序列。
三、进度计划四、设计成果要求1.按进度计划和自己的能力完成课程设计内容要求,包括程序框图、源程序、调试步骤、调试方法、对运行结果的分析等。
2.总结整个课程设计,撰写出课程设计报告。
五、考核方式1.程序调试完成后,由指导教师在计算机上检查,验收课程设计成果,并现场答辩。
2.评阅课程设计报告。
学生姓名:(签字)指导教师:编译课程教学组2015年1月9日实验一.词法分析器的设计与实现一、课程设计(综合实验)的目的与要求1.1 词法分析器设计的实验目的本实验是为计算机科学与技术专业的学生在学习《编译技术》课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。
通过这个实验,使学生应用编译程序设计的原理和技术设计出词法分析器,了解扫描器的组成结构,不同种类单词的识别方法。
能使得学生在设计和调试编译程序的能力方面有所提高。
为将来设计、分析编译程序打下良好的基础。
1.2 词法分析器设计的实验要求设计一个扫描器,该扫描器是一个子程序,其输入是源程序字符串,每调用一次识别并输出一个单词符号。
为了避免超前搜索,提高运行效率,简化扫描器的设计,假设该程序设计语言中,基本字(也称关键词)不能做一般标识符用,如果基本字、标识符和常数之间没有确定的运算符或界符作间隔,则用空白作间隔。
单词符号及其内部表示如表1-1所示,单词符号中标识符由一个字母后跟多个字母、数字组成,常数由多个十进制数字组成。
单词符号的内部表示,即单词的输出形式为二元式:(种别编码,单词的属性值)。
表1-1 单词符号及其内部表示二、设计(实验)正文1.词法分析器流程图2.词法分析器设计程序代码#include "stdafx.h"#include <iostream>#include <string>using namespace std;int what(char a){if((int(a)>=48)&&(int(a)<=57)){return 0;//0-9数字}elseif((int(a)>=97)&&(int(a)<=122)){return 1;//a-z的字母}else{return 2;//其他的标点符号}}void scan(char a[],int &m,char zc[100][100],int &n){char zh[100];int b=0,weizhi,r=0;int zbbm;//-----------------------------检测整形常数while(a[m]==' '){cout<<"遇到空格"<<endl;m++;}if(what(a[m])==0){while(what(a[m])==0){b=b*10+int(a[m])-48;m++;}zbbm=7;cout<<"("<<zbbm<<","<<b<<")"<<endl;}else//----------------------------------检测字符型if(what(a[m])==1){if((a[m]=='b')&&(a[m+1]=='e')&&(a[m+2]=='g')&&(a[m+3]=='i')&&(a[m+4]=='n')&&(wha t(a[m+5])==2)){m=m+5;zbbm=1;cout<<"("<<zbbm<<",-)"<<endl;}//=====检测beginelseif((a[m]=='i')&&(a[m+1]=='f')&&(what(a[m+2])==2)){m=m+2;zbbm=2;cout<<"("<<zbbm<<",-)"<<endl;}//检测ifelseif((a[m]=='t')&&(a[m+1]=='h')&&(a[m+2]=='e')&&(a[m+3]=='n')&&(what(a[m+4])==2)) {m=m+4;zbbm=3;cout<<"("<<zbbm<<",-)"<<endl;}//检测thenelseif((a[m]=='e')&&(a[m+1]=='l')&&(a[m+2]=='s')&&(a[m+3]=='e')&&(what(a[m+4])==2)){m=m+4;zbbm=4;cout<<"("<<zbbm<<",-)"<<endl;}//检测elseelseif((a[m]=='e')&&(a[m+1]=='n')&&(a[m+2]=='d')&&(what(a[m+3])==2)){m=m+3;zbbm=5;cout<<"("<<zbbm<<",-)"<<endl;}//检测end//----------------------------对未知字符的检测else{int j=0;while(what(a[m])!=2){zh[j]=a[m];m++;j++;}zh[j]='#';if(n==0){j=0;while(zh[j]!='#'){zc[0][j]=zh[j];j++;}zc[0][j]='#';n=1;weizhi=1;}elseif(n>0){int k=0,y=1;while((k<n)&&(y==1)){r=0;while(zc[k][r]!='#'){r++;}if(r!=j){k++;y=1;}elseif(r==j){r=0;while((int(zc[k][r])==int(zh[r]))&&(r<j)){r++;}if(r==j){weizhi=k+1;y=0;}else{k++;y=1;}}}if(y==1){j=0;while(zh[j]!='#'){zc[n][j]=zh[j];j++;}zc[n][j]='#';n=n+1;weizhi=n;}}zbbm=6;//怎么输出地址cout<<"("<<zbbm<<","<<weizhi<<")"<<endl;}}elseif(what(a[m])==2){if(a[m]=='+'){zbbm=8;m++;cout<<"("<<zbbm<<",-)"<<endl;}//检测+elseif(a[m]=='('){zbbm=11;m++;cout<<"("<<zbbm<<",-)"<<endl;}//检测(elseif(a[m]==')'){zbbm=12;m++;cout<<"("<<zbbm<<",-)"<<endl;}//检测)elseif(a[m]=='*'){if(a[m+1]=='*'){zbbm=10;m+=2;}else{zbbm=9;m++;}cout<<"("<<zbbm<<",-)"<<endl;}else {cout<<"非法字符"<<endl;m++;}}}int main(){char zc[100][100];int n=0;cout<<"begin------------1"<<endl;cout<<"if ------------2"<<endl;cout<<"then ------------3"<<endl;cout<<"else ------------4"<<endl;cout<<"end ------------5"<<endl;cout<<"标志符------------6"<<endl;cout<<"整型常数------------7"<<endl;cout<<"+------------8"<<endl;cout<<"*------------9"<<endl;cout<<"**------------10"<<endl;cout<<"(------------11"<<endl;cout<<")------------12"<<endl;cout<<"========================================================="<<e ndl;cout<<endl;int m=0;char a[100];cout<<"请输入测试语句:";cin.getline(a,100,'\n');cout<<"输出格式为:(种别编码,单词的属性值)"<<endl;while(a[m]!='#'){scan(a,m,zc,n);}return 0;}3.词法分析器运行结果实验二. 算符优先分析的设计与实现一、课程设计(综合实验)的目的与要求2.1 算符优先分析程序设计的实验目的本实验是为计算机科学与技术专业的学生在学习《编译技术》课程后,为加深对课堂教学内容的理解,培养解决实际问题能力而设置的实践环节。