ImageVerifierCode 换一换
格式:DOCX , 页数:18 ,大小:272.72KB ,
资源ID:13616432      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-13616432.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(词法分析 编译原理论文.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

词法分析 编译原理论文.docx

1、词法分析 编译原理论文词法分析*摘 要:词法分析(lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。关键词:词法分析标识符计算机系统与人信息交换界面多数是应用高级语言来实现。一个高级语言程序的实现,必须依赖于相应的编译系统。所谓编译程序就是指能够把某一种语言程序转换成另一种与之等价的语言程序。它通常包括五个阶段:词法分析,语法分析,语义分析与中间代码的产生、优化,目标代码的生成。

2、完成计算机翻译过程的关键阶段,它为后面的语法分析、语义分析做好准备,打好基础,以便快速地、高质量地生成目标语言程序。因此词法分析是编译的基础。词法分析器所处理的对象即词法分析程序的输入数据,实际上是源程序经过编译预处理,去掉多余的符号后而形成的代码,这样给词法分析带来方便。词法分析的过程是线性的从头至尾扫描一遍,复杂度较低,易实现。一、实验目的设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。二、实验要求2.1 待分析的简单词法(1).关键字:begin if then while do end lishuman lishuman2015041886所有的关键字都是小写。(2).运算

3、符和界符:= + - * / ( ) , : ; = 35=21 =37-239thenx:=2*x+1/3;end#的源文件,经过词法分析后输出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)2.4识别语言单词的状态转换图识别语言单词的状态转换图如下图2-4所示:状态0为初态,凡带双圈者为终态。 图2-4识别语言单词的状态转换图三、词法分析程序的算法思想算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。3.1主程序示意图:图3-1主程序示意图其中初始包括以下两个方

4、面:(1).关键字表的初值。关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:Char*nrwtab6=“begin”,“if,then”,while”,“do,end,;(2).程序中需要用到的主要变量为syn,token和sum3.2扫描子程序的算法思想:首先设置3个变量:token用来存放构成单词符号的字符串;sum用来整型单词;syn用来存放单词符号的种别码。图3-2扫描子程序主要部分流程图四、运行结果4.1.安装Linux虚拟机(已经

5、配置好虚拟机的可以跳过此步骤)1.安装VMware-player2.解压Ubuntu16.04_64-bit.rar3.在VMware-player中设置虚拟机:点击“打开已经存在的虚拟机”,然后选择“Ubuntu16.04_64-bit.vmx”。4.启动虚拟机,查看是否安装成功。4.2.创建工作目录在用户家目录下建立lishuman 文件夹,建立scaner.c文件编写代码,建立testin.txt输入程序。4.3.词法分析1.打开命令行。 cd lishuman/回车,进入lishuman目录2.编译程序。编译scaner.c文件。图4-3编译scaner.c文件4.4. 编译运行程序t

6、estin.txt是词法分析器的输入程序(即输入的源程序,此程序由学生给出)。运行后,自动在lishuman目录下生成result.txt文件。(testin.txt和result.txt文件都可由记事本查看内容)图4-4.1 testin.txt文件内容图4-4.2 result.txt文件内容如果testin.txt中输入有误图4-4.3 testin.txt错误文件内容则运行时显示:图4-4.4 result.txt错误文件内容五、源程序#include #include #include #define _KEY_WORD_END waiting for your expandingt

7、ypedef struct int typenum; char * word; WORD;char input255;/输入缓冲区 char token255=;/单词缓冲区 int p_input;/输入缓冲区指针 int p_token;/单词缓冲区指针 char ch;/当前读入字符 char* KEY_WORDS=begin,if,then,while,do,end,lishuman,lishuman2015041886,_KEY_WORD_END;/关键字数组 WORD* scaner(WORD* word);/词法扫描函数 int main(int argc,char * argv

8、) int over=1; WORD* oneword= calloc(1,sizeof(WORD*); /printf(Enter Your words(end with $):); /scanf(%$s,input); FILE *fin; char buffer1000; if(fin=fopen(testin.txt,r)=NULL) printf(Cannot open the file!n); exit(-1); while(fgets(buffer,100,fin)!=NULL) strcat(input,buffer); fclose(fin); FILE *fout; if(

9、fout=fopen(result.txt,w)=NULL) printf(Cannot open the file!n); exit(-1); p_input=0; printf(Your words:n%sn,input); while(overtypenumtypenum,oneword-word); /打印种别码和单词自身的值 over=oneword-typenum; fclose(fout); printf(npress done.);/从缓冲区读取一个字符到ch中 char m_getch() ch=inputp_input; p_input=p_input+1; return

10、(ch);/去掉空白符号 void getbc() while(ch= |ch=10) ch=inputp_input; p_input=p_input+1; /拼接单词 void concat() tokenp_token=ch; p_token=p_token+1; tokenp_token=0;/判断是否字母 int letter() if(ch=a&ch=A&ch=0&chtypenum=10; myword-word=; p_token=0; m_getch(); getbc(); if(letter() while(letter()|digit() concat(); m_getc

11、h(); retract(); myword-typenum=reserve(); myword-word=token; return(myword); else if(digit() while(digit() concat(); m_getch(); / retract(); if(letter() myword-typenum=-1; myword-word=ERROR; printf(In %s(), line=%d, invalid variable, error!n, _func_, _LINE_); exit(0); else retract(); myword-typenum=

12、20; myword-word=token; else switch(ch) case =: m_getch(); if (ch=) myword-typenum=39; myword-word=; return(myword); retract(); myword-typenum=21; myword-word=; return(myword); break; case +: myword-typenum=22; myword-word=+; return(myword); break; case -: myword-typenum=23; myword-word=-; return(myw

13、ord); break; case *: myword-typenum=24; myword-word=*; return(myword); break; case /: myword-typenum=25; myword-word=/; return(myword); break; case (: myword-typenum=26; myword-word=(; return(myword); break; case ): myword-typenum=27; myword-word=); return(myword); break; case : myword-typenum=28; m

14、yword-word=; return(myword); break; case : myword-typenum=29; myword-word=; return(myword); break; case : myword-typenum=30; myword-word=; return(myword); break; case : myword-typenum=31; myword-word=; return(myword); break; case ,: myword-typenum=32; myword-word=,; return(myword); break; case : myw

15、ord-typenum=33; myword-word=:; return(myword); break; case ;: myword-typenum=34; myword-word=; return(myword); break; case : m_getch(); if (ch=) myword-typenum=37; myword-word=; return(myword); retract(); myword-typenum=35; myword-word=; return(myword); break; case typenum=38; myword-word=typenum=36

16、; myword-word=typenum=40; myword-word=!=; return(myword); retract(); myword-typenum=-1; myword-word=ERROR; return(myword); break; case 0: myword-typenum=1000; myword-word=OVER; return(myword); break; default: myword-typenum=-1; myword-word=ERROR; return(myword); 六、实验总结通过这次实验,我对词法分析器有了一定的了解,进一步的巩固了这部分的知识。既通过这次用C语言对词法分析程序的编制,回顾了C语言的编程方法;又加深了对词法分析原理的理解和词法分析的实现过程,掌握了编译程序的实现方法和技术,懂得了词法分析器的工作原理。在编程过程中,遇到了不少的问题,在同学的帮助下,问题一步一步的得到了解决。先从实现最简单的扫描和输出开始,后继实现了扫描范围的扩大和输出结果的更加具体。

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2