C_minus语言词法分析器实验报告_第1页
C_minus语言词法分析器实验报告_第2页
C_minus语言词法分析器实验报告_第3页
C_minus语言词法分析器实验报告_第4页
C_minus语言词法分析器实验报告_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

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

文档简介

1、Word 专业资料编译原理实验报告题目 : 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 的状态转化为相应的子程序,最后得到词法分析器4. C 语言的基本语法。三、实验要求1 、该个词法分析器要求至少能够识别以下几类单词:关键字: else if int return void w

3、hile共 6 个,所有的关键字都是保留字, 并且必须是小写;标识符:识别与 C 语言词法规定相一致的标识符,通过下列正则表达式定义:ID = letter (letter | digit)*;常 数 : NUM = digit digit*(.digit digit* | )(e(+ | - | ) digit digit* |) ,letter = a|.|z|A|.|Z| , digit = 0|.|9 ,包括整数,如 123 等;小数,如 123.45 等;科学计 数法表示的常数,如 1.23e3 , 2.3e-9 等;专用符号: + - * / = = != = , ( ) /* *

4、/;2 、分析器的输入为由上述几类单词构成的程序, 输出为该段程序的机表示形式, 即关键字、 运算符、 界限符变为其对应的机符, 常数使用二进制形式, 标识符使用相应的标识符表指针表示。3、词法分析器应当能够指出源程序中的词法错误,如不可识别的符号、错误的词法等。四、实验结果(程序)及分析#include#include#include#define N 100typedef struct char name30;int code;int addr;token;/ 存储刚从文件中读取的字符typedef struct char name30;int code;Keyword;typedef s

5、truct char name30;int code;int addr;symbol;Keyword key6=else,1,if,2,int,3,return,4,void,5,where,6;char ch;/ 接受字符FILE *source;/ 源文件FILE *badgetxt;/FILE *othertxt;/FILE *number;int error_count;/ int addr_count;/ int lineof;/ 行号 token current;/FILE *keytxt;/ 关键字输出文件 标识符输出文件其他单词输出文件错误的个数标识符表的指针暂时存放读入的字符

6、 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() int i=0;void iskeyword();/ 判断关键字void isOthers() / 判断其他单词void output_1();/ 关键字输出文件void output_2();/ 标识符输出文件void output_others();

7、/ 其他单词输出文件void Iszhushi();void isnumber();if(source=fopen(Source.txt,r)=NULL) /printf(file open error/n);exit(0);打开源文件if(keytxt=fopen(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

8、,w)=NULL) printf(file open 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=a & ch=A & ch=0& ch=a) & (ch=A) & (ch0 & & ch9) i=ch;i+;ch=fgetc(source);zancun=current;for(i=0;i6;i+) for( j=0;j30;j+) if(current.nam

9、e j= j)h=0; elseh=1;break;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;i30;i+)i=0;sw

10、itch(ch)Word 专业资料0=+;case +: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 /:Word 专业资料0=/;current.code

11、=16;current.addr=-1;output_others();break;case:ch1=fgetc(source);if(ch1=)0=;1=;current.code=17;output_others(); break; else fseek(source,-1,1);0=: if(ch1=) 0=;1=;current.code=19;output_others();break;elsefseek(source,-1,1);0=;cu

12、rrent.code=20;output_others();break;case=: ch1=fgetc(source);if(ch1=)0=;1=;Word 专业资料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=)current.na

13、me0=!;1=;current.code=23;current.addr=-1;break;output_others();Word 专业资料fseek(source,-1,1);0=!;current.code=24;current.addr=-1;output_others();break;case ;: 0=;current.code=25;current.addr=-1;output_others();break;case ,: 0=,;current.code=26;curren

14、t.addr=-1;output_others();Word 专业资料int i=ftell(source);case (: char ch1=ch;char ch2;while(ch!=) ch=fgetc(source);if(ch=) 0=ch1;1=ch;current.code=27;current.addr=-1; output_others(); fseek(source,i,0);ch2=fgetc(source);ch2=fgetc(source);break;elseerror_count+;error(1);fseek(so

15、urce,i,0);ch2=fgetc(source);Word 专业资料ch2=fgetc(source);break;case :0=;current.code=28;current.addr=-1;output_others();break;case :0=;current.code=28;current.addr=-1; output_others(); break;case :0=;current.code=29;current.addr=-1;Word 专业资料output_others();break;cas

16、e : 0=;current.code=29;current.addr=-1;output_others();break;case10: lineof+;break;void Iszhushi() char 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 isn

17、umber() int k=0;void output_number();while(ch=0& ch=9)k+=ch;ch=fgetc(source);current.code=11;output_number();void output_1() printf( 关键字 :,,current.code); putchar(10);fprintf(keytxt,,current.code);void output_2() printf( 标识符地址 :,,addr_count); putchar(10);fprintf(badgetxt,,addr_count);void output_others() printf( 其它单词 :,,current.code);putchar(10); fprintf(othertxt,,current.code); v

温馨提示

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

评论

0/150

提交评论