实验一、递归下降分析程序实验
专业 商业软件工程 姓名 姓名 学号 201506110148
一、 实验目的
编译递归下降分析程序识别c语言文法
二、 实验内容和要求
- 简单写出c语言文法
- 分析c语言文法是否为LL1文法,若不是,修改成LL1文法。
- 编写程序实现对c语言LL1文法判断是否有语法错误
三、 实验方法、步骤及结果测试
1. 源程序名:递归下降分析程序
源程序名递归下降分析程序.c
可执行程序名:递归下降分析程序.exe
2. 原理分析及流程图
主要总体设计问题。
(包括存储结构,主要算法,关键函数的实现等)
3. 主要程序段及其解释:
#include<stdio.h> #include <string.h> void scaner(); void E(); void E1(); void T(); void T1(); void F(); void error(); char proce[100],ch,token[20]; int syn,i,j,m,sum=0; char *keyword[6]= {"begin","if","then","while","do","end"}; main() { i=0;//记录输入多少个字符 printf("\n 请输入词法分析程序:"); do{ ch=getchar(); proce[i]=ch; i++; }while (ch!=‘#‘); i=0; do{ scaner(); switch(syn) { case 11: printf("\n(%d,%d)",syn,sum); break; case -1: printf("\n(%s,#)",token); break; default: printf("\n(%d,%s)",syn, token); } }while (syn!=0); printf("\n"); i=0; scaner(); E(); if (syn==0) printf("\n 语法正确. \n"); else printf("\n 语法失败. \n"); } void scaner() { for (j=0;j<20;j++) token[j]=NULL;//将token赋值为空 m=0; sum=0; ch=proce[i]; i++; while (ch==‘ ‘) { ch=proce[i++]; } if (ch>=‘a‘&& ch<=‘z‘) {while (ch>=‘a‘&& ch<=‘z‘||ch>=‘0‘ && ch<=‘9‘) { token[m++]=ch; ch=proce[i++];//继续看后面的 } syn=10;i--;//判断为变量 for (j=0;j<6;j++) if(strcmp(token,keyword[j])==0) { syn=j+1; break; }//如果有可以匹配的就为关键字 } else if(ch>=‘0‘ && ch<=‘9‘) {while (ch>=‘0‘ && ch<=‘9‘) { sum=sum*10+(ch-‘0‘); ch=proce[i]; i++; } syn=11; i--; } else switch(ch) { case ‘<‘: token[m]=ch; m++; ch=proce[i]; i++; if (ch==‘>‘) { syn=21; token[m]=ch; m++; } else if (ch==‘=‘) { syn=22; token[m]=ch; m++; } else { syn=20; i--; } break; case ‘>‘: m=0; token[m]=ch; m++; ch=proce[i]; i++; if (ch==‘=‘) { syn=24; token[m]=ch; m++; } else { syn=23; i--; } break; case ‘:‘: m=0; token[m++]=ch; ch=proce[i++]; if (ch==‘=‘) { syn=18; token[m++]=ch; } else { syn=17; i--; } break; case ‘+‘: syn=13; token[0]=ch; break; case ‘-‘: syn=14; token[0]=ch; break; case ‘*‘: syn=15; token[0]=ch; break; case ‘/‘: syn=16; token[0]=ch; break; case ‘=‘: syn=25; token[0]=ch; break; case ‘;‘: syn=26; token[0]=ch; break; case ‘(‘: syn=27; token[0]=ch; break; case ‘)‘: syn=28; token[0]=ch; break; case ‘#‘: syn=0; token[0]=ch; break; default: syn=-1; token[0]=ch; } } void E() { printf("E "); T(); E1(); } void E1() { printf("E1 "); if (syn==13) { scaner(); T(); E1(); } else { if (syn!=28 && syn!=0) error(); } } void T() { printf("T "); F(); T1(); } void T1() { printf("T1 "); if (syn==15) { scaner(); F(); T1(); } else { if (syn!=28 && syn!=0 && syn!=13) error(); } } void F() { printf("F "); if (syn==27) { scaner(); E(); if(syn==28) scaner(); else error(); } else if (syn==11 || syn==10) scaner(); } void error() { printf("\n (%d,%s)语法错误! \n",syn, token); }
- 4. 运行结果及分析
四、 实验总结
程序还有问题,今后在改进
时间: 2024-09-29 23:43:55