词法分析
实验目的通过本教材附录B(词法分析程序)调试,改编一个词法分析程序,加深对词法分析原理的理解。
实验要求
2.1 待分析的简单的词法
(1)保留字:if,else, for, while, do, int ,read, write,real,char
(2)纯单分界符:+ — * () {}; : ,
(3)双分界符:> < = ! ,&&,||
2.2 实现功能:
(1)在命令行中输入源程序文件名(包括文件名路径)
(2)输入目标文件名(包括文件名路径)
(3)调用所编词法分析代码将分析结果写入目标文件代码(编译完成)
三、词法分析程序的算法思想:
算法的基本任务是从源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,分析与代码中相应的单词符号。
3.1 主程序示意图:
调用子程序
调用子程序
输入串结束
结束
是
否
3.2词法分析示意图:
输入源程序文件名
输入源程序文件名
输入目标文件名
文件名判断
文件名判断
是
是
否
否
开始
读取一个字符
是否为字母?
标识符处理
是否数字?
是
是
否
组合整数
数字
分界符
分界符处理
注释处理
反斜杠
错误处理
其他
返回
四、词法分析程序的C语言程序源代码:
词法分析子程序:
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#define keywordSum 10
char *keyword[keywordSum]={"if","else","for","while","do","int","read","write","char","real"};//添加的保留字char,real;
char singleword[50]="+ - * () {} ; , : ";
char doubleword[10]="> < = ! ";
char doubleword1[10]="& &";
char doubleword2[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<keywordSum) && strcmp(token,keyword[n])) 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 (strchr(doubleword1,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 (strchr(doubleword2,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]=ch;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);
}
主程序:
#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");
}
五、结果分析:
当源代码文件为“a.t”:{
int a;
a=10;
read;
&
}
编译结果:
当源文件为a.t:{
int a;
real;
for(a=10||a=1){
return 0;}
}
结果为:
b.t的结果为:
六、总结:
词法分析的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。通过本试验的完成,更加加深了对词法分析原理的理解。
本组成员:阳京,黄菁华,龙功成
相关热词搜索: 词法 分析报告 实验 代码 材料