S语言词法分析器设计

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

实验1-3 S语言词法分析器设计

一、实验名称:S语言词法分析器设计

二、实验目的:通过手工编写简化C语言词法分析器,熟悉并深入理解编译程序词法分析器的工作原理。

三、实验容:

1.根据保留字和特殊符号表能区分出源文件中的保留字、普通标识符和特殊符号,并能进行简单的错误处理。

2.设计词法分析器模块调用结构图和各模块流程图。

3.程序源代码。

4.程序的执行结果:输入文件,输出结果文件及屏幕信息。

四、实验中出现的问题及解决方法。

遇到问题及解决:

1、关于注释//和除号/。需要区分,在isanotation函数中。

2、关于遇到空格时回退,一开始没有懂,后来经过同学讲解,明白了如何回退的。

3、关于词法分析器的思想过程,经过老师再三讲解,已经大致明白,具体步骤,在最后体会部分中。

五、程序结构和代码

程序结构:

代码:

#include

#include

#include

#include

using namespace std;

//关键字表

string

keywords[20]={"include","void","main","int","c har","float","double","if","else","then","break"," continue","for","do","while","printf","scanf","be gin","end","return"};

char aa[99999]=" ";

//关键字表初始为空

string id[10000];

int pp=0;

//常数表

string nu[10000];

int qq=0;

//初始化函数

void initscanner()

{

int i=0;

FILE *fp;

if((fp=fopen("源程序.txt","r"))==NULL)//打开源程序文件

{

printf("没有找到此文件!");

exit(0);

}

char ch=fgetc(fp);

while(ch!=EOF)

{

aa[i]=ch;

i++;

ch=fgetc(fp);

}

fclose(fp);

}

int decide1(char a) //判断是否是字母

{

if((a>='a'&&a<='z')||(a>='A'&&a<='Z')) return 1;

else return 0;

}

int decide2(char a) //判断是否是数字

{

if(a>='0'&&a<='9')

return 1;

else return 0;

}

int isalpha(int st) //识别保留字和标识符{

char wordbuf[20]=" ";

int n=0;

for( ; ; )

{

wordbuf[n]=aa[st];

st++;

n++; if((decide2(aa[st])==1)||(decide1(aa[st])==1)||( aa[st]=='_'))

wordbuf[n]=aa[st];

else break;

}

int flag=0;

for(int k=0;k<20;k++)

{

if(strcmp(keywords[k].c_str(),wordbuf)==0) flag=1;

}

if(flag==0)

{

int flagg=-1;

for(int t=0;t

{

if(strcmp(id[t].c_str(),wordbuf)==0)

{

flagg=t;

}

}

if(flagg!=-1) printf(" (id,%d) ",flagg);

else

{

id[pp]=wordbuf;

printf(" (id,%d) ",pp);

pp++;

}

}

else

{

printf(" (");

for(int i=0;i

{

printf("%c",wordbuf[i]);

}

printf(",-) ");

}

return st;

}

int isnumber(int st) //识别数字

{

char numbuf[20]=" ";

int n=0;

int k=0;

int flag=0;

for( ; ; )

{

numbuf[n]=aa[st];

st++;

n++;

if(decide2(aa[st])==1)

{

numbuf[n]=aa[st];

}

else if((k==0)&&(aa[st]=='.'))

{

numbuf[n]=aa[st];

k++;

}

else if(decide1(aa[st])==1)

{

numbuf[n]=aa[st];

flag=1;

continue;

}

else break;

}

if(flag==0)

{

int flagg=-1;

for(int t=0;t

if(strcmp(nu[t].c_str(),numbuf)==0)

flagg=t;

if(flagg!=-1) printf(" (nu,%d) ",flagg); else

{

nu[qq]=numbuf;

printf(" (nu,%d) ",qq);

qq++;

}

}

else

{

printf(" (");

for(int i=0;i

} return st;

}

int isanotation(int st) //处理除号/和注释{

char tabuf[9999]=" ";

int n=0;

st++;

if(aa[st]=='/')

{

printf(" (//,-) ");

st++;

while(aa[st]!=10)

{

tabuf[n]=aa[st];

st++;

n++;

}

printf(" (");

for(int i=0;i

printf("%c",tabuf[i]);

printf(",注释容) ");

}

else if(aa[st]=='*')

{

printf(" (/*,-) ");

st++;

int stt=st+1;

while(1)

{

if(aa[st]=='*'&&aa[st+1]=='/') break; tabuf[n]=aa[st];

st++;

n++;

if(aa[st+1]==NULL)

{

printf("(/* 错误\n)");

return st+1;

}

} printf(" (");

for(int i=0;i

printf("%c",tabuf[i]);

printf(",注释容) ");

printf(" (*/,-) ");

st=st+2;

相关文档
最新文档