计算机编译原理实验二.docx

上传人:b****8 文档编号:30289573 上传时间:2023-08-13 格式:DOCX 页数:17 大小:186.33KB
下载 相关 举报
计算机编译原理实验二.docx_第1页
第1页 / 共17页
计算机编译原理实验二.docx_第2页
第2页 / 共17页
计算机编译原理实验二.docx_第3页
第3页 / 共17页
计算机编译原理实验二.docx_第4页
第4页 / 共17页
计算机编译原理实验二.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

计算机编译原理实验二.docx

《计算机编译原理实验二.docx》由会员分享,可在线阅读,更多相关《计算机编译原理实验二.docx(17页珍藏版)》请在冰豆网上搜索。

计算机编译原理实验二.docx

计算机编译原理实验二

华中师范大学

CENTRALCHINANORMALUNIVERSITY

 

题目:

语法分析

院系:

计算机科学与技术系

班级:

0701

姓名:

王辉

学号:

2007210514

指导老师:

王明安

 

一.实验题目

语法分析

二.实验目的

编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。

三.实验内容

用C语言编制递归下降分析程,并对简单语言进行语法分析。

四.实验步骤

1.设计语法分析程序的算法。

2.画流程图。

3.编写程序。

4.测试并调试程序。

5.写实验报告。

五.实验设计思想

 

出错处理

打印分析成功

语句串分析示意图

递归下降分析程序示意图

 

六.实现代码

#include

#include

#include

charstr[50][10];

charword[6][10]={"begin","if","then","while","do","end"};

charpro[80],token[10];

intsyn,num,kk;

voidscaner();

voidlrparser();

voidyuxu();

voidstatement();

voidexpression();

voidterm();

voidfactor();

voidreadfile();

voidreadbroad();

voidmain()

{

charch;

intTag=1;

while(Tag)

{

num=0;

printf("1键盘读取2文件读取:

");

scanf("%c",&ch);

if(ch=='1')

readbroad();

if(ch=='2')

{

readfile();

}

printf("\n是否继续输入1:

");

scanf("%d",&Tag);

getchar();

}

}

voidreadfile()//从文件中读取

{

FILE*fp;

charch;

inti=0;

fp=fopen("date.txt","rt");

if(fp==NULL)

{

printf("thememoryisnotenough");

exit(0);

}

while(!

feof(fp))

{

memset(pro,NULL,80);

num=0;

do

{

fscanf(fp,"%c",&ch);

pro[num++]=ch;

}while((ch!

='\n')&&(!

feof(fp)));

printf("\n%d.文件中的符号为:

%s",++i,pro);

num=0;

kk=0;

scaner();

lrparser();

}

fclose(fp);

}

voidreadbroad()//从键盘中读取

{

FILE*fp;

charch;

memset(pro,NULL,80);

ch=getchar();

printf("inputthestring:

");

do

{

ch=getchar();

pro[num++]=ch;

}while(ch!

='#');

fp=fopen("date.txt","a++");

if(fp==NULL)

{

printf("thememoryisnotenough");

exit(0);

}

num=0;

do

{

ch=pro[num++];

fprintf(fp,"%c",ch);

}while(ch!

='#');

fprintf(fp,"\n");

fclose(fp);

num=0;

kk=0;

scaner();

lrparser();

}

voidlrparser()

{

if(syn==1)

{

{

scaner();

yuxu();

}

if(syn==6)

{

scaner();

if(syn==0&&(kk==0))

printf("success!

");

else

{

printf("语句串错误!

");

kk=1;

}

}

else

if((kk!

=1))

{

printf("lackend");

kk=1;

}

}

else

{

printf("lackbegin!

");

}

return;

}

voidyuxu()

{

statement();

while(syn==26)

{

scaner();

statement();

}

return;

}

voidstatement()

{

if(syn==10)

{

scaner();

if(syn==18)

{

scaner();

expression();

}

else

{

printf("赋值错误");

kk=1;

}

}

else

{

printf("语句错误!

");

kk=1;

}

}

voidexpression()

{

term();

while(syn==13||syn==14)

{

scaner();

term();

}

return;

}

voidterm()

{

factor();

while(syn==15||syn==16)

{

scaner();

factor();

}

return;

}

voidfactor()

{

if(syn==10||syn==11)

{

scaner();

}

elseif(syn==27)

{

scaner();

expression();

if(syn==28)

scaner();

else

{

printf("错误')'");

kk=1;

}

}

else

{

printf("表达式错误1");

kk=1;

}

return;

}

voidscaner()

{

inti=0;

charch;

for(i=0;i<10;i++)

token[i]=NULL;

ch=pro[num++];

while(ch=='')

{

ch=pro[num++];

}

i=0;

if('a'<=ch&&ch<='z')

{

while('a'<=ch&&ch<='z'||'0'<=ch&&ch<='9')

{

token[i++]=ch;

ch=pro[num++];

}

token[i++]='\0';

num--;

syn=10;

for(i=0;i<10;i++)

if(strcmp(token,word[i])==0)

{

syn=i+1;

break;

}

}

elseif('0'<=ch&&ch<='9')

{

while('0'<=ch&&ch<='9')

{

token[i++]=ch;

ch=pro[num++];

}

token[i]='\0';

num--;

syn=11;

}

else

switch(ch)

{

case'<':

i=0;

token[i++]=ch;

ch=pro[num++];

if(ch=='>')

{

token[i++]=ch;

syn=21;

}

elseif(ch=='=')

{

token[i++]=ch;

syn=22;

}

else

{

syn=20;

num--;

syn=20;

}

break;

case'>':

i=0;

token[i++]=ch;

ch=pro[num++];

if(ch=='=')

{

token[i++]=ch;

syn=24;

}

else

{

num--;

syn=23;

}

break;

case':

':

token[i++]=ch;

ch=pro[num++];

if(ch=='=')

{

token[i++]=ch;

syn=18;

}

else

{

num--;

syn=17;

}

break;

case'+':

token[i++]=ch;

syn=13;

break;

case';':

token[i++]=ch;

syn=26;

break;

case'-':

token[i++]=ch;

syn=14;

break;

case'*':

token[i++]=ch;

syn=15;

break;

case'/':

token[i++]=ch;

syn=16;

break;

case'(':

token[i++]=ch;

syn=27;

break;

case')':

token[i++]=ch;

syn=28;

break;

case'#':

token[i++]=ch;

syn=0;

break;

default:

syn=-1;

break;

}

}

程序运行结果:

七.小结

八.参考文献

编译原理教材后面的程序模板

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 数学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1