首页 > 代码库 > 递归下降分析程序
递归下降分析程序
一、 实验目的
编制一个递归下降分析程序
LL(1)文法:
E->TE1
E1->+TE1|-TE1|∑
T->FT1;
T1->*FT1|/FT1|∑
F->(E)|i|1
二、 实验内容和要求
输入:LL(1)文法
判断:每遇到一个终结符,则判断当前读入的单词符号是否与该终结符相匹配,若匹配,则继续读取下一个单词符号,若不匹配,则进行错误处理。
每遇到一个非终结符,则调用相应的分析子程序
一、 实验方法、步骤及结果测试
- 1. 源程序名:
源程序名
可执行程序名:
- 2. 原理分析及流程图
/*存储结构以及变量*/
char character[80];//存放所有输入的字符
char*rwtab[6]={"begin","if","then","while","do","end"};
char token[8];//单词自身字符串
char ch;//单个字符
int sym;//sym:单词种别码
int p,m=0,i,row,sum=0;//sum:整型常数 row:记录新读入的字符行的行号
/*主要算法*/
void scanner();
E();
E1();
T();
T1();
F();
#include<stdio.h> #include<string.h> char character[80];//存放所有输入的字符 char token[8];//单词自身字符串 char ch;//单个字符 int sym;//sym:单词种别码 int p,m=0,i,row,sum=0;//sum:整型常数 row:记录新读入的字符行的行号 char*rwtab[6]={"begin","if","then","while","do","end"}; void scanner(); E(); E1(); T(); T1(); F(); error(); void main() { p=0; row=1; printf("请输入一串字符串\n"); do { ch=getchar(); character[i++]=ch; }while(ch!=‘#‘);//输入以#号键结束 p=0; do { scanner();//识别单词 switch(sym) { case 11:printf("(%d,%d)\n",sym,sum);break; case -1:printf("error in row %d!\n",row);break; case -2:row=row++;break; default:printf("(%d,%s)\n",sym,token);break; } }while(sym!=0); printf("\n Token Over. \n"); system("pause"); p=0; scanner(); E(); if (sym==0) printf("\n Syntax success. \n"); else printf("\n Syntax fail. \n"); } //词法分析程序 void scanner() { for(i=0;i<8;i++) token[i]=NULL; ch=character[p++]; while(ch==‘ ‘) { ch=character[p]; p++; } if((ch>=‘a‘&&ch<=‘z‘)||(ch>=‘A‘&&ch<=‘Z‘))//标识符或者变量名 { m=0; while((ch>=‘0‘&&ch<=‘9‘)||(ch>=‘a‘&&ch<=‘z‘)||(ch>=‘A‘&&ch<=‘Z‘)) { token[m++]=ch; ch=character[p++]; } token[m++]=‘\0‘; p--; sym=10; for(i=0;i<6;i++) //将识别出来的字符和已定义的标示符作比较, if(strcmp(token,rwtab[i])==0) { sym=i+1; break; } } else if((ch>=‘0‘&&ch<=‘9‘))//数字 { sum=0; while((ch>=‘0‘&&ch<=‘9‘)) { sum=sum*10+ch-‘0‘; ch=character[p++]; } p--; sym=11; if(sum>32767) sym=-1; } else switch(ch)//其他字符 { case‘<‘:m=0;token[m++]=ch; ch=character[p++]; if(ch==‘=‘) { sym=21; token[m++]=ch; } else if(ch==‘>‘) { sym=22; token[m++]=ch; } else { sym=23; p--; } break; case‘>‘:m=0;token[m++]=ch; ch=character[p++]; if(ch==‘=‘) { sym=24; token[m++]=ch; } else { sym=20; p--; } break; case‘:‘:m=0;token[m++]=ch; ch=character[p++]; if(ch==‘=‘) { sym=18; token[m++]=ch; } else { sym=17; p--; } break; case‘+‘:sym=13;token[0]=ch;break; case‘-‘:sym=14;token[0]=ch;break; case‘*‘:sym=15;token[0]=ch;break; case‘/‘:sym=16;token[0]=ch;break; case‘=‘:sym=25;token[0]=ch;break; case‘;‘:sym=26;token[0]=ch;break; case‘(‘:sym=27;token[0]=ch;break; case‘)‘:sym=28;token[0]=ch;break; case‘#‘:sym=0;token[0]=ch;break; case‘\n‘:sym=-2;break; default:sym=-1;break; } } //E程序 E() { printf("E "); T(); E1(); } E1() { printf("E1 "); if(sym==13||sym==14 ) { scanner(); T(); E1(); } else { if (sym!=28 && sym!=0) error(); } } T() { printf("T "); F(); T1(); } T1() { printf("T1 "); if(sym==15||sym==16) { scanner(); F(); T1(); } else { if (sym!=28 && sym!=0 && sym!=13&& sym!=14) error(); } } F() { printf("F "); if(sym==27) { scanner(); E(); if(sym==28) scanner() ; else error(); } else { if(sym==10||sym==11) scanner(); } } error() { printf("\n (%d,%s)Syntax Error! \n",sym, token); }
运行结果:
递归下降分析程序
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。