1、计算机编译原理实验二华中师范大学CENTRAL CHINA NORMAL UNIVERSITY题 目: 语法分析 院 系:计算机科学与技术系 班 级: 0701 姓 名: 王辉 学 号: 2007210514 指导老师: 王明安 一.实验题目语法分析二实验目的 编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。三.实验内容 用C语言编制递归下降分析程,并对简单语言进行语法分析。四.实验步骤 1.设计语法分析程序的算法。 2.画流程图。 3.编写程序。 4.测试并调试程序。 5写实验报告。五.实验设计思想 出错处理打印分析成功语句串分析示意图递归下降分析程序示意图
2、六实现代码#include #include#include char str5010;char word610=begin,if,then,while,do,end;char pro80,token10;int syn,num,kk;void scaner();void lrparser();void yuxu();void statement();void expression();void term();void factor();void readfile();void readbroad();void main() char ch; int Tag=1; while(Tag) num
3、 = 0; printf(1键盘读取 2文件读取:); scanf(%c, &ch); if(ch = 1) readbroad(); if(ch=2) readfile(); printf(n是否继续输入1:); scanf(%d, &Tag); getchar(); void readfile()/从文件中读取 FILE *fp; char ch; int i=0; fp = fopen(date.txt,rt); if(fp = NULL) printf(the memory is not enough); exit(0); while(!feof(fp) memset(pro,NULL
4、,80); num=0; do fscanf(fp,%c,&ch); pronum+ = ch; while(ch!=n) & (!feof(fp); printf(n%d.文件中的符号为:%s,+i, pro); num=0; kk = 0; scaner(); lrparser(); fclose(fp);void readbroad()/从键盘中读取 FILE *fp; char ch; memset(pro, NULL, 80); ch = getchar(); printf(input the string:); do ch = getchar(); pronum+ = ch; wh
5、ile(ch != #); fp = fopen(date.txt,a+); if(fp = NULL) printf(the memory is not enough); exit(0); num = 0; do ch = pronum+; fprintf(fp,%c,ch); while(ch!=#); fprintf(fp, n); fclose(fp); num = 0; kk=0; scaner(); lrparser();void lrparser() if(syn = 1) scaner(); yuxu(); if(syn = 6) scaner(); if(syn = 0 &
6、(kk = 0) printf(success!); else printf(语句串错误!); kk =1; else if(kk !=1) printf(lack end); kk = 1; else printf(lack begin!); return;void yuxu() statement(); while(syn = 26) scaner(); statement(); return;void statement() if(syn = 10) scaner(); if(syn = 18) scaner(); expression(); else printf(赋值错误); kk
7、= 1; else printf(语句错误!); kk =1; void expression() term(); while(syn = 13 | syn = 14) scaner(); term(); return;void term() factor(); while(syn = 15 | syn = 16) scaner(); factor(); return;void factor() if(syn = 10 | syn = 11) scaner(); else if(syn = 27) scaner(); expression(); if(syn = 28) scaner(); e
8、lse printf(错误); kk=1; else printf(表达式错误1); kk = 1; return; void scaner() int i = 0; char ch; for(i = 0; i 10; i+) tokeni = NULL; ch = pronum+; while(ch = ) ch = pronum+; i = 0; if( a=ch & ch=z) while(a=ch & ch=z | 0=ch & ch=9) tokeni+ = ch; ch = pronum+; tokeni+ = 0; num-; syn = 10; for(i = 0; i 10;
9、 i+) if(strcmp(token, wordi)= 0) syn = i+1; break; else if(0=ch & ch=9) while(0=ch & ch=9) tokeni+ = ch; ch = pronum+; tokeni = 0; num-; syn= 11; else switch(ch) case ) tokeni+ = ch; syn = 21; else if(ch = =) tokeni+ = ch; syn = 22; else syn = 20; num-; syn=20; break; case : i = 0; tokeni+ = ch; ch
10、= pronum+; if(ch = =) tokeni+ = ch; syn= 24; else num-; syn=23; break; case : tokeni+ = ch; ch = pronum+; if(ch = =) tokeni+ = ch; syn=18; else num-; syn=17; break; case +: tokeni+ = ch; syn=13; break; case ;: tokeni+ = ch; syn=26; break; case -: tokeni+ = ch; syn=14; break; case *: tokeni+ = ch; syn= 15; break; case /: tokeni+ = ch; syn=16; break; case (: tokeni+ = ch; syn=27; break; case ): tokeni+ = ch; syn=28; break; case #: tokeni+ = ch; syn=0; break; default: syn= -1; break; 程序运行结果:七.小结 八.参考文献编译原理教材后面的程序模板
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1