《C语言词法分析器实验报告》由会员分享,可在线阅读,更多相关《C语言词法分析器实验报告(22页珍藏版)》请在人人文库网上搜索。

1、计算机科学与工程系编译原理课程设计实验报告姓名:__ *__ 学号_ *__ 年级专业及班级___08计算机科学与技术 成绩 实验名称词法分析程序设计与实现完成日期2011/4/12指导教师*实验目的:能够采用C编程语言实现简单的词法分析程序;设计、编制并调试一个词法分析程序,加深对词法分析原理的理解实验要求: 1. 对单词的构词规则有明确的定义;2. 编写的分析程序能够正确识别源程序中的单词符号;3. 识别出的单词以的形式保存在符号表中(链表);4. 词法分析中源程序的输入以.c格式,分析后的符号表,将二元组保存在.txt文件中。实验内容:选择高级语言(C语言),编制它的词法分析程序。词法分。

2、析程序的实现可以采用任何一种编程工具实验原理:1、算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号;2、其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。实验分析:(1)关键字:if else while do case int break等所有的关键字都是小写。(2)运算符和界符: = + - * / = = ; ( ) 等(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:ID = _ | letter (letter | digit)*NUM = digit digit*(4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、。

3、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。(5)注释被忽略(6)各种单词符号对应的种别码(如下):单词符号种别码单词符号种别码auto1double2int3struct4break5else6long7switch8case9enum10register11typedef12char13extern14return15union16const17float18short19unsigned20continue21for22signed23void24default25goto26sizeof27volatile28do29while30static31if32a33b34f35n。

4、36t37v3839?4041”42043ddd44 xhh45数字46标识符47#48(49)505152535455*56:5758%5960+61?62=63|64&65!6668=69=7071!=7281“82%A(A可为dsc)83;84_85/868788899091其他类别99实验流程图(由于流程图过大因此各部分分开写):整体:扫描注释:扫描数字:扫描引号:扫描单词:扫描其他字符:实验环境:需要TC、VC+ 6.0等开发工具作为本次试验的环境。实验步骤:1、准备: 用TC、VC+等开发工具;2、对本实验的任务进行分析,确定实现功能的函数;3、写好程序,仔细修改函数;4、上机操作。

5、:输入源程序,修改、调试,运行。5、写好试验报告。实验调试过程及测试结果/*源代码*/#include#include#include #includevoid main()FILE *fp,*fp1;int hanjsq=1;/行计数器,保存行号int guanjz(char ch1);/关键字和标识符判断char ch,infile15,outfile15;/定义输入和输出文件名printf(*Enter the infile name*n);scanf(%s,infile);/输入需要扫描的文件名printf(*Enter the outfile name*n);scanf(%s,out。

6、file);/输入需要另存为的文件名if(fp = fopen(infile,r) = NULL)/打开需要扫描的文件printf(cannot open filen);exit(0);if(fp1 = fopen(outfile,w) = NULL)/打开需要存入的文件printf(cannot open filen);exit(0);printf(n*n);printf(* 开始进行词法分析 *n);printf(*n);printf(n*n);printf(行号字符串种别码n);printf(*n);fprintf(fp1,*n);fprintf(fp1,行号字符串种别码n);fprin。

7、tf(fp1,*n);while(!feof(fp)ch=fgetc(fp);if(ch=10)hanjsq+;/*扫描头文件单词及保留字*/if(isalpha(ch) | ch=_)/如果第一个字符为字母或下划线则判断为标识符int i=0;char ch130;/假定每个标识符最长为ch1i+=ch;/将ch保存到ch10中并使i自加1while(!feof(fp)ch=fgetc(fp);if(ch=10)hanjsq+;/如果ch为换行符,则行计数器自加1if(isalpha(ch) | isdigit(ch) | ch=_)/如果ch为字母、数字或下划线就把ch放到ch1i中并使i。

8、自加1ch1i+=ch;if(ch=.)/如果ch为小数点则判断是否为头文件 if(ch=fgetc(fp)=h)/如果小数点后一位为h则判定其为头文件if(ch=10)hanjsq+;ch1i+=.;ch1i+=h;ch1i=0;/把结束标志放到ch1i中作为单词结束标志printf(line %d:%s83n,hanjsq,ch1);/以字符串形式输出ch1fprintf(fp1,line %d:%s83n,hanjsq,ch1);break;else/如果小数点后一位不是h则判定其为标识符fseek(fp,-1,1);/fp回退1ch1i=0;/把结束标志放到ch1i中作为单词结束标志p。

9、rintf(line %d:%s%dn,hanjsq,ch1,guanjz(ch1);/以字符串形式输出ch1fprintf(fp1,line %d:%s%dn,hanjsq,ch1,guanjz(ch1);break;if(!isalpha(ch) & !isdigit(ch) & ch!=_ & ch!=.)/如果ch不为字母、数字、下划线和点时判断其为标识符ch1i=0;printf(line %d:%s%dn,hanjsq,ch1,guanjz(ch1);fprintf(fp1,line %d:%s%dn,hanjsq,ch1,guanjz(ch1);break;/*扫描数字*/if(。

10、isdigit(ch) | ch=-)/如果ch为数字或-if(isdigit(ch)/如果ch为数字printf(line %d:%c,hanjsq,ch);fprintf(fp1,line %d:%c,hanjsq,ch);while(!feof(fp)ch=fgetc(fp);/预读一位如果ch为数字和点则循环输出if(isdigit(ch) | ch=.)printf(%c,ch);fprintf(fp1,%c,ch);else/否则视为数字结束printf(46n);fprintf(fp1,46n);fseek(fp,-1,1);/回退一位ch=0;/置ch为0,以免影响下面误判并顺。

11、利退出扫描数字break;if(ch=-)/如果ch为-ch=fgetc(fp);/预读一位if(ch=-)/如果ch还是为-则判断为自减符-printf(line %d:-80n,hanjsq);fprintf(fp1,line %d:-80n,hanjsq);if(ch=)/如果ch为,则判断为结构体运算符-printf(line %d:-81n,hanjsq);fprintf(fp1,line %d:-81n,hanjsq);if(isdigit(ch)/如果ch为数字则可能为减号或负号fseek(fp,-3,1);/回退3为判断ch=fgetc(fp);if(isdigit(ch)/如。

12、果ch为数字则判断-为减号ch=fgetc(fp);printf(line %d:%c79n,hanjsq,ch);fprintf(fp1,line %d:%c79n,hanjsq,ch);else /否则判断-为负号ch=fgetc(fp);printf(line %d:%c,hanjsq,ch);fprintf(fp1,line %d:%c,hanjsq,ch);while(!feof(fp)ch=fgetc(fp);/预读一位如果ch为数字和点则循环输出if(isdigit(ch) | ch=.)printf(%c,ch);fprintf(fp1,%c,ch);else/否则视为数字结束。

13、printf(46n);fprintf(fp1,46n);fseek(fp,-1,1);/回退1break;/*扫描注释*/if(ch=/)/如果ch为/则可能为注释ch=fgetc(fp);/读下一个字符if(ch=10)hanjsq+;if(ch=/)/如果该字符也为/则判断为注释一行while(fgetc(fp)!=10);if(ch=10)hanjsq+;/直到遇到换行符出现才认为注释结束if(ch=*)/如果该字符为*则判断为注释多行/直到出现*/才认为注释结束while(!feof(fp)ch=fgetc(fp);if(ch=10)hanjsq+;if(ch=*)/出现*/且接着出。

14、现/if(ch=fgetc(fp)=/)break;else/否则原样输出/printf(line %d:/83n,hanjsq);fprintf(fp1,line %d:/83n,hanjsq);fseek(fp,-1,1);/回退1break;/*扫描引号*/if(ch=)/出现引号int i=0;printf(line %d:%c82n,hanjsq,ch);fprintf(fp1,line %d:%c82n,hanjsq,ch);printf(line %d:,hanjsq);fprintf(fp1,line %d:,hanjsq);while(!feof(fp)/先整体输出引号内所有。

15、字符并定为第99类ch=fgetc(fp);i+;/用于积累回退长度if(ch=10)hanjsq+;if(ch!=)if(ch!=32)printf(%c,ch);fprintf(fp1,%c,ch);else break;printf(99n);fprintf(fp1,99n);fseek(fp,-i,1);/回退到引号开始for(;i0;i-)ch=fgetc(fp);if(ch=92)/如果ch为则可能为转义字符char ch513=abfntv?0;/转义字符集ch=fgetc(fp);/预读一位for(int k=0;k;/定义部分单符号或双符号(前半部分)集char ch49=+。

16、=|&=;/定义部分双符号(后半部分)for(int i=0;i & ch3j=)/判断符printf(line %d:78n,hanjsq);fprintf(fp1,line %d:78n,hanjsq);else/否则表示ch3j为单符号,不是双符号的一部分printf(line %d:%c%dn,hanjsq,ch3j,j+61);fprintf(fp1,line %d:%c%dn,hanjsq,ch3j,j+61);fseek(fp,-1,1);/*/printf(*n);printf(* 词法分析结束 *n);printf(* 分析结果保存在文件%s中 *n,outfile);pri。

17、ntf(* 欢迎下次使用,谢谢! *n);printf(*n);fprintf(fp1,*n);fprintf(fp1,* 词法分析结束 *n);fprintf(fp1,* 欢迎下次使用,谢谢! *n);fprintf(fp1,*n);int guanjz(char ch1)/关键字和标识符判断char ch2329=auto,double,int,struct,break,else,long,switch,case,enum,register,typedef,char,extern,return,union,const,float,short,unsigned,continue,for,signed,void,default,goto,sizeof,volatile,do,while,static,if;/定义关键字集for(int i=0;i32;i+)/逐个比对如果为关键字则返回类别i+1if(!strcmp(ch1,ch2i)return i+1;return 47;/否则返回一般标识符类总结: 指导教师签名: 2011年4月12日星期二- 22。

c语言字符串算法判断实验原理,C语言词法分析器实验报告相关推荐

  1. c语言字符串算法判断实验原理,C语言第二次实验报告

    一.实验题目,设计思路,实现方法 第十一次作业(二维数组): 11-5 打印杨辉三角(20 分) 本题要求按照规定格式打印前N行杨辉三角. 输入格式: 输入在一行中给出N(1≤N≤10). 输出格式: ...

  2. c语言经典算法大全pdf,c语言经典算法100例pdf版.pdf

    c语言经典算法100例pdf版 C 语言经典算法 100 例 C 语言编程经典 100 例 A:[程序1] 题目:有1.2.3.4 个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程 ...

  3. c语言字符串 从后拷贝,C语言字符串拷贝

    C语言字符串拷贝利用指针操作,要清楚知道指针的指向 代码如下: #include #include #include char* my_strcpy1(char* dest, const char* ...

  4. 北京电大c语言实验作业二,大学大一c语言程序设计实验室上机题全部代码答案(实验报告).doc...

    大学大一c语言程序设计实验室上机题全部代码答案(实验报告).doc C语言实验报告实验1-1:helloworld程序:源代码:#includemain(){printf("hellowor ...

  5. 沈航C语言上机实验题答案,大学大一c语言程序设计实验室上机题全部代码答案(实验报告).doc...

    大学大一c语言程序设计实验室上机题全部代码答案(实验报告) C语言实验报告 实验1-1: hello world程序: 源代码: #include main() { printf("hell ...

  6. c语言char字符判断条件,C语言入门 — 字符型char

    本篇文章将会学习字符类型,并会结合 Ascii码对照表进行学习, 首先我们先来看下 #include // 标准输入输出头文件 stdio.h int main(void) // main 函数,vo ...

  7. c语言字符串数组的合并,C语言实现合并字符串

    学会Perl以及Python之后,处理字符串也只是我很喜欢做的一件事情.进行字符串的拼接在这些高级脚本语言中是一件轻松的事情. C语言是我的编程入门语言,但是我一直对这门语言了解并不是很深.确切说,我 ...

  8. C语言第五章实验原理,C语言第五章实验报告.docx

    C语言第五章实验报告 C语言第五章实验报告?班级:14金工3班??????????学号???????????姓名:周俐俐一.实验目的?1.?熟悉C语言编程环境.2.?进一步熟悉用C语言调试C语言源程序 ...

  9. 华理c语言设计网上作业,华理c程序实验报告(共9篇).doc

    华理c程序实验报告(共9篇) 华理c程序实验报告(共9篇) 2011华理<C语言实验报告> C程序设计课程 实验报告册 所在学院 班 级 学 号 姓 名 任(来自:www.XIelw.Co ...

最新文章

  1. RabbitMQ的安装及集群搭建方法
  2. 知识图谱学习笔记-命名实体识别
  3. Boost:额外的bimap的测试程序
  4. 括号配对问题_栈stack
  5. 递归算法经典实例_【经典算法】利用递归方法求5!
  6. shell里执行执行mysql 语句
  7. 暴力枚举 --- 8.1 Subsets --- 图解
  8. 冒泡、选择、快速、归并、堆排序算法 python实现
  9. android屏幕共享及远程控制,android屏幕共享及远程控制原理
  10. windows内存占用过高
  11. 计算机控制系统与常规仪表控制系统的主要异同点,计算机控制技术复习资料-20210711112641.doc-原创力文档...
  12. oracle 去除空值函数,Oracle学习笔记:删除数据空格(trim、ltrim、rtrim函数)
  13. 从零开始学习CTF——CTF是什么
  14. 计算机相关的名词解释
  15. 筱筱看博客(微信小程序、Lin-ui组件、vant Weapp)
  16. java.io.ioexception 设备未就绪_AxisFault faultString: java.io.IOException: 设备未就绪。
  17. 计算机顶级会议Rankings
  18. Python机器学习个人总结
  19. 研华电脑510上电自启_研华工控机BIOS设置通电自启动方法技巧
  20. latex数字引用参考文献

热门文章

  1. C++查缺补漏之异常(续)
  2. 亚马逊封号误区(二)
  3. 微信小程序云数据库实现登录
  4. 【电脑】如何在win10建立分区,删除分区,合并可用空间
  5. IDC追踪报告:帆软软件蝉联中国BI市场占有率第一
  6. 用python绘制一个简单正三角形
  7. 大话西游服务器维护领了5环,五环任务_《大话西游2经典版》官方网站—中国风情义网游官网...
  8. 以太网插板W5100——基于Arduino
  9. Android视频录制--屏幕录制
  10. 微信公众号开发之授权登录(前端vue篇)