词法分析程序课程设计
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
相关文章推荐
- 【2017网络协议编程与分析课程设计】(一)开始写程序之前的一些准备
- 算法分析与设计课程——LeetCode刷题之 Rotate Image
- 算法分析与设计课程10——523. Continuous Subarray Sum
- 操作系统课程设计——pintos源码的分析与修改
- RTB日志分析MR程序设计
- [置顶] 程序转制作人——游戏设计课程导论
- 课程设计2成绩分析
- C语言课程设计:歌手大奖赛计分程序
- c++程序课程设计的内容--职工工资管理系统
- 算法分析与设计课程06——542. 01 Matrix(Medium)
- 递归下降语法分析程序设计
- 关于C# Windows 程序设计里的button click事件的分析
- 算法分析与设计课程(11):【leetcode】Gray Code
- sql server数据库课程设计分析
- 递归下降语法分析程序设计
- 做统计分析课程设计时回忆的一些知识
- 1217 实验四 递归下降语法分析程序设计
- 算法分析与设计课程07——330. Patching Array(Hard)
- 实验四递归下降语法分析程序设计
- 算法分析与设计课程(2):Letter Combinations of a Phone Number