编译原理词法分析课程设计_第1页
编译原理词法分析课程设计_第2页
编译原理词法分析课程设计_第3页
编译原理词法分析课程设计_第4页
编译原理词法分析课程设计_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

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

文档简介

1、精选优质文档-倾情为你奉上DONGFANG COLLEGE,FUJIAN AGRICULTURE AND FORESTRY UNIVERSITY课程名称:编译原理 词法分析系 别: 计算机科学系年级专业: 2013级 计算机科学与技术学 号: 姓名: 张清鉴任课教师: 朱均燕成绩:2015年12月31日专心-专注-专业目录前言1一、课程设计的目的1二、 课程设计的要求11.待分析的简单语言的词法12.各种单词符号对应的种别码23. 此法分析程序功能3三、课程设计报告内容331课程设计的环境332系统技术分析:333 系统流程图及各模块434源程序代码清单435程序调试情况9四、总结10参考文献

2、11前言词法分析(英语:lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。词法分析阶段是编译过程的第一个阶段,是编译的基础。这个阶段的任务是从左到右一个字符一个字符地读入源程序,即对构成源程序的字符流进行扫描然后根据构词规则识别单词(也称单词符号或符号)。词法分析程序实现这个任务。词法分析程序可以使用Lex等工具自动生成。词法分析是编译程序的第一个阶段且是必要阶段;词法分析的核心

3、任务是扫描、识别单词且对识别出的单词给出定性、定长的处理;实现词法分析程序的常用途径:自动生成,手工生成.词法分析一、课程设计的目的设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。二、 课程设计的要求1.待分析的简单语言的词法(1)关键字:begin if then while do end 所有的关键字都是小写。(2) 运算符和界符:= + - * / :()(3)其他单词是标识符()和整型常数(),通过以下正规式定义:(4)空格由空白制表符和换行符组成。空格一般用来分隔运算符 界符和关键字,词法分析阶段通常被忽略。2.各种单词符号对应的种别码表各种单词符号对应的种别码单词符号种

4、别码单词符号种别码begin1:17if2:=18then3<20while4<>21do5<=22end6>23letter(letter|digit)*10>=24digit digit*11=25+13;26-14(27*15)28/16#03. 此法分析程序功能 输入:所给文法的源程序字符串。 输出:二元组(syn,token或sum)构成的序列。 其中:syn为单词种别码;token为存放的单词自身字符串;sum为整型常数。例如:对源程序 begin x:=9: if x>9 then x:=

5、2*x+1/3; end #的源文件,经过词法分析后输出如下序列:  (1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if) 三、课程设计报告内容31课程设计的环境311 硬件环境:本系统适用于DOS环境下的计算机,内存1G、2G等现在较普遍的内存容量即可,并且配备有主机、显示屏、键盘和鼠标等硬件结构。312 软件环境: 本系统采用标准C语言,可在基于Windows操作系统的可视化集成开发环境的Visual C+ 6.0 使用。32系统技术分析:算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据

6、扫描到单词符号的第一个字符的种类,拼出相应的单词符号。主程序示意图如图3-1所示。其中初始包括以下两个方面: 图3-1 1) 关键字表的初值。 关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别 出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:Char *rwtab6 = “begin”, “if”, “then”, “while”, “do”, “end”,;2) 程序中需要用到的主要变量为syn,token和sum。33 系统流程图及各模块 首先设置3个变量:token用来存放构成单词符

7、号的字符串;sum用来整型单词;syn用来存放单词符号的种别码。扫描子程序主要部分流程如图3-2所示。 图3-234源程序代码清单#include <stdio.h>#include <string.h>char prog80,token8,ch;int syn,p,m,n,sum;char *rwtab6="begin","if","then","while","do","end" scaner();main()p=0; printf("n

8、 please input a string(end with '#'):/n"); do scanf("%c",&ch); progp+=ch; while(ch!='#'); p=0; do scaner(); switch(syn) case 11:printf("( %-10d%5d )n",sum,syn); break; case -1:printf("you have input a wrong stringn"); getch(); exit(0); default:

9、printf("( %-10s%5d )n",token,syn); break; while(syn!=0); getch(); scaner() sum=0; for(m=0;m<8;m+)tokenm+=NULL; ch=progp+; m=0; while(ch=' ')|(ch='n')ch=progp+; if(ch<='z')&&(ch>='a')|(ch<='Z')&&(ch>='A') while(c

10、h<='z')&&(ch>='a')|(ch<='Z')&&(ch>='A')|(ch>='0')&&(ch<='9') tokenm+=ch; ch=progp+; p-; syn=10; for(n=0;n<6;n+) if(strcmp(token,rwtabn)=0) syn=n+1; break; else if(ch>='0')&&(ch<='9&

11、#39;) while(ch>='0')&&(ch<='9') sum=sum*10+ch-'0' ch=progp+; p-; syn=11; else switch(ch) case '<':tokenm+=ch; ch=progp+; if(ch='=') syn=22; tokenm+=ch; else syn=20; p-; break; case '>':tokenm+=ch; ch=progp+; if(ch='=') syn=2

12、4; tokenm+=ch; else syn=23; p-; break; case '+': tokenm+=ch; ch=progp+; if(ch='+') syn=17; tokenm+=ch; else syn=13; p-; break; case '-':tokenm+=ch; ch=progp+; if(ch='-') syn=29; tokenm+=ch; else syn=14; p-; break; case '!':ch=progp+; if(ch='=') syn=21;

13、 tokenm+=ch; else syn=31; p-; break; case '=':tokenm+=ch; ch=progp+; if(ch='=') syn=25; tokenm+=ch; else syn=18; p-; break; case '*': syn=15; tokenm+=ch; break; case '/': syn=16; tokenm+=ch; break; case '(': syn=27; tokenm+=ch; break; case ')': syn=28;

14、 tokenm+=ch; break; case '': syn=5; tokenm+=ch; break; case '': syn=6; tokenm+=ch; break; case '': syn=26; tokenm+=ch; break; case '"': syn=30; tokenm+=ch; break; case '#': syn=0; tokenm+=ch; break; case ':':syn=17; tokenm+=ch; break; default: syn

15、=-1; break; tokenm+='0' 35程序调试情况输入begin x:=9: if x>0 then x:=2*x+1/3; end # 后经词法分析输出如下序列:(begin 1)(x 10)(:17)(= 18)(9 11)(;26)(if 2) 如图5-1所示:图5-1四总结 通过此次课程设计,使我更加扎实的掌握了有关词法方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。  过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在老师的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题

温馨提示

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

评论

0/150

提交评论