


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、编译原理实验报告题目:C_minus 语言词法分析器学院计算机科学与技术专 业 XXXXXXXXXXXXXXXX学 号 XXXXXXXXXXXX姓 名XXXX指导教师XXXX20xx年xx月xx日订C_minus语言词法分析器线一、实验追求1. 理解词法分析器的设计方法:利用 DFA编写相应的程序。2. 掌握手工编写词法分析程序的方法。3复习熟悉以前学过的编程语言4.通过实验了解编译器词法分析的工作原理二、实验原理1. 文法的概念,DFA的表示方法。2. 词法分析程序的输出和输入:词法分析程序的功能是读入源程序,输出单词符号。单词符号是程序设计语言的比本语法符号,程序设计语言的单词符号一般分为
2、如下几种:关键字,标示符,常数,运算符,界符,单词 的输出是二元式的形式,需要知道二元式的表示方法,把得到的二元式写入输出文件。.转化图如下:3. 熟悉单词的描述工具,如正规文法,正规式,以及知道正规文法和正规式的等价性以及他们之间的互相转 化。熟悉把正规文法转化为正规式,把正规式转化为NFA以及把NFA转为相应的 DFA,最后再把 DFA简化,DFA的状态转化为相应的子程序,最后得到词法分析器正规式正规文法状态最小DFA词法分析器4. C语言的基本语法。三、实验要求1、该个词法分析器要求至少能够识别以下几类单词:关键字:else if int return void while共6个,所有的
3、关键字都是保留字,并且必须是小写。O .包括整标识符:识别与 C语言词法要求相一致的标识符,通过下列正则表达式定义:ID = letter (letter | digit)*常数:NUM = digit digit*(.digit digit* |£ )(e(+ | - | £ ) digit digit* | £ ), letter =, digit = 0|.|9 ,数,女口 123等。小数,如123.45等。科学计数法表示的常数,如1.23e3, 2.3e-9等。.专用符号:+ - * / < <= > >= = != = , ( )
4、 /*/。.2、分析器的输入为由上述几类单词构成的程序,输出为该段程序的机内表示形式,即关键字、运算符、界限符 变为其对应的机内符,常数使用二进制形式,标识符使用相应的标识符表指针表示。3、词法分析器应当能够指出源程序中的词法不对,如不可识别的符号、不对的词法等。四、实验结果(程序)及分析#i nclude<stdio.h>#i nclude<stdlib.h>#in clude<stri ng.h>#defi ne N 100typedef struct char n ame30;int code;int addr;token;存储刚从文件中读取的字符ty
5、pedef struct char n ame30;int code;Keyword;typedef struct char n ame30;int code;int addr;symbol;Keyword key6="else",1,"if",2,"i nt",3,"return",4,"void",5,"where",6;char ch;/接受字符FILE *source;/ 源文件FILE *keytxt;/关键字输出文件FILE *badgetxt;/标识符输出文件F
6、ILE *othertxt;/其他单词输出文件FILE *number;int error_count;/ 不对的个数int addr_count;/ 标识符表的指针int lineof;/ 行号token current;/ 暂时存放读入的字符token zancun;symbol currentsymbol;symbol symboltableN;/ 标识符表 void error(int i);void main() void scan(); error_count=0; addr_count=0;error_count=0;lineof=0; scan();void scan() in
7、t i=0;void iskeyword();/ 判断关键字void isOthers() / 判断其他单词void output_1();/ 关键字输出文件void output_2();/ 标识符输出文件void output_others();/ 其他单词输出文件void Iszhushi();void isnumber();if(source=fopen("Source.txt","r")=NULL) / 打开源文件 . printf("file open error/n");exit(0);if(keytxt=fopen(&
8、quot;key.txt","w")=NULL) / 打开关键字文件 . printf("file open error/n");exit(0);if(badgetxt=fopen("badge.txt","w")=NULL) / 打开标识符文件 printf("file open error/n");exit(0); if(othertxt=fopen("others.txt","w")=NULL) printf("file open
9、 errorn");exit(0); if(number=fopen("number.txt","w")=NULL) printf("file open errorn");exit(0);ch=fgetc(source);while(ch!=EOF) for(i=0;i<30;i+) i='0'if(ch>='a' && ch<='z') |(ch>='A' && ch<=
10、39;Z') | ch='_' ) iskeyword();if(ch='')Iszhushi(); if(ch>='0'&& ch<='9') isnumber(); elseisOthers();ch=fgetc(source);fclose(source);fclose(keytxt);fclose(badgetxt);fclose(othertxt);fclose(number);void iskeyword()int i=0,k=0,j=0;int h=0;while(ch>=&
11、#39;a') && (ch<='z') |(ch>='A') && (ch<='Z') | ch='_' | (ch>'0' && ch<'9') i=ch;i+;ch=fgetc(source);zancun=current;for(i=0;i<6;i+) for(j=0;j<30;j+) if(j=j)h=0; elseh=1;br
12、eak;if(h=0)break;if(h=0) current.code=keyi.code; output_1(); else strcpy(symboltableaddr_,);symboltableaddr_count.code=10;symboltableaddr_count.addr=addr_count; addr_count+;output_2();void isOthers()char ch1;int i;for(i=0;i<30;i+)i='0'switch(ch)case '
13、+':0='+'current.code=13;current.addr=-1;output_others();break;case '-': 0='-'current.code=14;current.addr=-1;output_others();break;case '*': 0='*'current.code=15;current.addr=-1;output_others();break;case '/':cur
14、0='/'current.code=16;current.addr=-1;output_others();break;case'<':ch1=fgetc(source);if(ch1='=')0='<'1='='current.code=17;output_others();break; elsefseek(source,-1,1);0='<'current.code=18; current.
15、addr=-1;output_others();break;case'>': ch1=fgetc(source);if(ch1='=')0='>'1='=' current.code=19; output_others(); break;elsefseek(source,-1,1);0='>' current.code=20;output_others(); break;case'=': ch1=fgetc(s
16、ource); if(ch1='=') 0='=' 1='=' current.code=21; current.addr=-1; output_others(); break;else 0='=' current.code=22; current.addr=-1; output_others(); fseek(source,-1,1); break;case '!': ch1=fgetc(source);if(ch1='=')
17、 0='!' 1='=' current.code=23; current.addr=-1; output_others(); break;else fseek(source,-1,1); 0='!' current.code=24; current.addr=-1; output_others(); break;case '': 0=''current.code=25;current.addr=-1; output_o
18、thers(); break;case ',': 0=','current.code=26;current.addr=-1; output_others();case '(': int i=ftell(source);char ch1=ch;char ch2;while(ch!=')') ch=fgetc(source);if(ch=')') 0=ch1; 1=ch; current.code=27; current.addr=-1; outp
19、ut_others(); fseek(source,i,0); ch2=fgetc(source); ch2=fgetc(source);break;elseerror_count+; error(1); fseek(source,i,0); ch2=fgetc(source); ch2=fgetc(source); break;case '':0=''current.code=28; current.addr=-1; output_others();break;case '':0='
20、9;current.code=28;current.addr=-1; output_others(); break;case '':0=''current.code=29;current.addr=-1;output_others(); break;case '': 0=''current.code=29;current.addr=-1; output_others(); break;case'10': lineof+;break;void Iszhushi() ch
21、ar ch1;ch1=ch;ch=fgetc(source);if(ch='*') for(;) ch=fgetc(source); if(ch=EOF) error(2);break; if(ch='*') ch1=ch; ch=fgetc(source); if(ch='') ch=fgetc(source); break;elseerror_count+;error(2);void isnumber() int k=0;void output_number();while(ch>='0'&& ch<
22、;='9') k+=ch; ch=fgetc(source);current.code=11;output_number(); void output_1() printf(" 关键字 :<%s,%d>",,current.code); putchar(10);fprintf(keytxt,"<%s,%d>",,current.code); .void output_2() printf(" 标识符地址 :<%s,%d>",,addr_count); putchar(10);fprintf(badgetxt,"<%s,%d>",,addr_count); .void output_others() printf(" 其它单词 :<%s,%d>",,current.code); putchar(10); fprintf(othertxt,"<%s,%d>",,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025企业与个人借款合同范本简约版
- 2024年新高考语文复习题型专练八 写作(全国适用)原卷版
- 北京市朝阳区2022-2023学年高三上学期上学期期中地理含解析
- 直肠恶性肿瘤放疗护理查房
- 腔镜甲状腺切除术后的护理
- 气切拔管的指证护理
- 如何设计出炫酷的视觉设计
- 肿瘤科用药安全护理
- 造血系统疾病患儿的护理
- 铜仁职业技术学院《人工智能:机器学习在数据分析上的实际运用》2023-2024学年第二学期期末试卷
- 复杂应用的C语言设计考题及答案
- 事故隐患内部报告奖励制度
- 工学云周报范文200字
- 西方文论经典导读智慧树知到期末考试答案章节答案2024年浙江大学
- 中国居民膳食指南(全)
- 辽宁医院明细.xls
- JYC全自动变频抗干扰介质损耗测试仪
- 报考广东警官学院考生政审表
- 《加工配方设计》PPT课件.ppt
- 综合办公室安全工作职责
- 质量环境及职业健康安全管理手册
评论
0/150
提交评论