一、 实验目的
编制一个递归下降分析程序
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("请输入一串字符串 "); do { ch=getchar(); character[i++]=ch; }while(ch!='#');//输入以#号键结束 p=0; do { scanner();//识别单词 switch(sym) { case 11:printf("(%d,%d) ",sym,sum);break; case -1:printf("error in row %d! ",row);break; case -2:row=row++;break; default:printf("(%d,%s) ",sym,token);break; } }while(sym!=0); printf(" Token Over. "); system("pause"); p=0; scanner(); E(); if (sym==0) printf(" Syntax success. "); else printf(" Syntax fail. "); } //词法分析程序 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++]='