编译原理实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编译原理实验报告

实验名称:_____编写词法分析程序_______ 实验类型:_______设计类__________________ 指导教师:________蒋勇________________ 专业班级:________软件1002班_________ 姓名:________ 邓椿嵋______________ 学号:____ 20101575________________ 实验地点:_______东6A319_____________ 实验成绩:____________________________

日期:2012年4月21 日

实验一编写词法分析程序

一、实验目的

通过设计、调试词法分析程序,掌握词法分析程序的设计工具,即有穷自动机,进一步理解自动机理论;掌握文法转换成自动机的技术及有穷自动机实现的方法;会确定词法分析器的输出形式及标识符与关键字的区分方法;加深对课堂教学的理解,提高词法分析方法的实践能力。

二、实验设计

1、根据TEST语言的词法规则,写出正则文法或者正则表达式

2、将正则文法或者正则表达式转换为NFA

3、将NFA确定化并化简

4、根据化简后的DFA画出流程图

5、确定单词分类、单词输出方案

6、编写词法分析程序

1、程序设计语言词法规则⇒正则文法⇒ FA;

或:词法规则⇒正则表达式⇒ FA;

2、NFA确定化⇒ DFA;

3、DFA最小化;

4、确定单词符号输出形式;

5、化简后的DFA+单词符号输出形式⇒构造词法分析程序。

三、实验过程

1.根据老师发的那个实验要求自己写好了代码。

2.再通过老师讲了一些后修改了代码,主要是之前的测试数据没有弄好,缺少对注释不匹配问题的考虑。

3.再根据老师的提示修改好了代码。

四、实验结果

测试数据为:{

int a=0;

for

/*fgrtg*/

}

/*fgthy

现象:提示第二个注释那个地方匹配不成功!

通过词法分析过后的那个文件里的内容为:

五、讨论与分析

1、你的编写词法分析程序满足最长匹配原则吗?如果满足请给出你的实现方案。如果不满足请给出改进方案。

2、你的单词分类考虑了哪些因素?

TEST语言的单词符号如下:

标识符:字母打头,后接任意字母或数字。

保留字:标识符的子集,包括:if,else,for,while,do, int,write,read。

无符号整数:由数字组成。

分界符:+、-、*、/、(、)、;、<、>、{、}、!

双分界符:>=、<=、!=、==

注释符:/* */

3、构建词法分析程序一般过程是怎样的?

1、根据词法规则写出正则文法;

2、将正则文法转换成状态图;

3、将状态图转换成流程图;

4、根据流程图写出词法分析程序。

六、附录:#include

#include

#include

#define keywordSum 8

char * keyword[keywordSum]={"if","else","for","while","do","int","read","write"};

char singleword[50]="+-*;,:";

char doubleword[10]="><=!(){}";

extern char Scanin[300],Scanout[300];

extern FILE * fin,*fout;

int TESTscan()

{

char ch,token[40];

int es=0,j,n;

printf("请输入源程序文件名(包括路径):");

scanf("%s",Scanin);

printf("请输入词法分析输出文件名(包括路径):");

scanf("%s",Scanout);

if((fin=fopen(Scanin,"r"))==NULL)

{

printf("\n打开词法分析输入文件出错!\n");

return(1);

}

if((fout=fopen(Scanout,"w"))==NULL)

{

printf("\n创建词法分析输入文件出错!\n");

return(2);

}

ch=getc(fin);

while (ch!=EOF)

{

while (ch==' '||ch=='\n'||ch=='\t') ch=getc(fin);

if(isalpha(ch))

{

token[0]=ch;j=1;

ch=getc(fin);

while (isalnum(ch))

{

token[j++]=ch;

ch=getc(fin);

}

token[j]='\0';

n=0;

while((n

if(n>=keywordSum)

fprintf(fout,"%s\t%s\n","ID",token);

else

fprintf(fout,"%s\t%s\n",token,token);

}else if (isdigit(ch))

{

token[0]=ch;j=1;

ch=getc(fin);

while(isdigit(ch))

{

token[j++]=ch;

ch=getc(fin);

}

token[j]='\0';

fprintf(fout,"%s\t%s\n","NUM",token);

}else if(strchr(singleword,ch)>0)

{

token[0]=ch;token[1]='\0';

ch=getc(fin);

fprintf(fout,"%s\t%s\n",token,token);

}else if(strchr(doubleword,ch)>0)

{

token[0]=ch;

ch=getc(fin);

if(ch=='=')

{

token[1]=ch;token[2]='\0';

ch=getc(fin);

}

else

token[1]='\0';

fprintf(fout,"%s\t%s\n",token,token);

}else if (ch == '/') //如果是/,继续读下一个符号{

char ch1;

相关文档
最新文档