您的位置:首页 > 其它

词法分析程序课程设计

2007-10-13 23:09 260 查看



实验报告<二>

一. 词法分析程序设计

一. 实验目的
加深对词法分析理论的理解,培养动手实践的能力。词法分析的功能:扫描源程序字符流,按照源语言的词法规则识别出各类单词版本号,并产生用于语法分析的符号序列,即将字符串源程序转换成符号串源程序.
二.实验内容与设计思想
内容: 编写一个小的词法分析程序,并进行简单的词法进行分析.
设计思想:字符指针数组保存所有保留字,然后,每输入一个字符就检测是否匹配,若匹配则进行组合标识符,并促留在token中,否则组合标识符结束,如此循环,直至输出结束.
三.实验环境
Microsoft Windows XP Professional SP2下的VC+6.0
四.实验程序代码
//词法分析程序
//TESTscan.cpp
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#define keywordSum 9
char *keyword[keywordSum]={"if","else","for","while","do","int","read","write","real"};
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);//输入文件出错返回错误代码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<keywordSum) && strcmp(token,keyword
))
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=='/')
{
ch=getc(fin);
if(ch=='*')
{ char ch1;
ch1=getc(fin);
do
{ch=ch1;ch1=getc(fin);}
while((ch!='*' || ch1!='/')&&ch1!=EOF);
ch=getc(fin);
}
else
{
token[0]='/'; token[1]='/0';
fprintf(fout,"%s/t%s/n",token,token);
}
}
else
{
token[0]=ch;token[1]='/0';
ch=getc(fin);
es=3;
fprintf(fout,"%s/t%s/n","ERROR",token);
}
}
fclose(fin);
fclose(fout);
return(es);
}
//TESTmain.cpp
//主程序
#include <stdio.h>
#include <ctype.h>
extern int TESTscan();
char Scanin[300],Scanout[300];
FILE *fin,*fout;
void main()
{
int es=0;
es=TESTscan();
if (es>0) printf("词法分析有错,编译停止!");
else printf("词法分析成功!/n");
}
五.简单的词法分析
步骤:首先将{
if(a=1||b=1)
cout<<real;
}以3.T的文件形式保存在D盘路径下,然后用C++语言编写的词法分析器进行词法分析,如下图示:

最后打用记事本打开4.T,结果如下:
{ {
if if
( (
ID a
= =
NUM 1
| |
| |
ID b
= =
NUM 1
) )
ID cout
< <
< <
real real
; ;
} }
词法分析完成.
而对于此词法分析器不能识别的符号时则进行词法分析分出错,如在记事本内输入: {
int a[2];
a[0]=10;
b[1]=100;
}并以C.T文件形式保存在D盘中.
进行词法分析时如图:

用记事本打开D.T文件,会发现词法分析器无法识别”[]”!
D.T:
{ {
int int
ID a
ERROR [
NUM 2
ERROR ]
; ;
ID a
ERROR [
NUM 0
ERROR ]
= =
NUM 10
; ;
ID b
ERROR [
NUM 1
ERROR ]
= =
NUM 100
; ;
} }
实验完成.
六.实验中遇到的问题及解决方法
鉴于第一次实验没有输入输出文件名的路径名的错误,第二次实验时末发现错误.
七.实验心得
通过这次实验,我认识到在做实验前一定要熟读课本以确定实验要我们实现什么,怎么实现,每一步的步骤都要认真的去完成,做实验来不得半点马虎.通过这次实验,我也发现了学习编译原理的重要性,这次是第一次实验,日后的学习还需要更加努力!
附加词法分析的状态图(图1)和词法分析程序流程图(图2),如下图:



图1

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: