logo资料库

LL1语法分析.doc

第1页 / 共4页
第2页 / 共4页
第3页 / 共4页
第4页 / 共4页
资料共4页,全文预览结束
1. 实验目的 构造文法的语法分析程序实验要求, 2. 实验要求 采用预测分析法对输入的字符串进行语法分析。 3. 实验环境 VC++6.0 4. 实验原理 对文法 G 进行语法分析,文法 G 如下所示: S→a */ *0. S→^ *1. S→(T) *2. *3. T→SW * *4. W→,SW *5. W→ε; 5. 软件设计与编程 = "a^(),#"; //存储待分析的句子 #include #include #include char str[100]; //终结符,分析表的列符 const char T[ ] const char NT[ ] = "STW"; //非终结符,分析表的行符 /*指向产生式右部符号串*/ const char *p[] = { /*0. S→a */ "a", /*1. S→^ */ /*2. S→(T) /*3. T→SW */ /*4. /*5. W→ε; }; //设 M[i][j]=x,通过 p[M[i][j]]=p[x]获取右部符号串。 const int M[][6] = { a 0, 3, -1, -1,-1, ( 2, -1, -1, -1 }, 3, -1, -1, -1 }, -1 } /* /*S*/ /*T*/ /*W*/ W→,SW */ "" */ "^", */ "(T)", "SW", ",SW", ) , # */ ^ 1, 3, { { { 5, 4, }; void init()//输入待分析的句子
{ printf("请输入待分析的句子(以$结束):\n"); scanf("%s",str); } int lin(char c);//非终结符转换为行号 int col(char c);//终结转换为列号 bool isNT(char c);//isNT 判断是否是非终结符 bool isT(char c);//isT 判断是否是终结符。 void main(void) { {'#','S'}; //栈赋初值 //设置指示句子的当前字符 int i,j=0; int flag=1,flag2=0; char A; char stack[20]= int top = 1 ; char X = ' ' ; init(); A=str[0]; printf("\t 步数\t 分析栈\t 输入串\t 所用规则\n");//在屏幕上输出列表标题 while ( 1 ) { //设置栈顶指针 //存储栈顶字符 printf("\n\t(%d)\t",++j); //输出当前执行步数 for ( i = 0 ; i <= top ; i++ ) { //输出当前栈的内容(出栈前) printf("%c",stack[i]); } printf("\t"); for ( i = flag-1 ; str[i]!='$' ; i++ ) { printf("%c",str[i]); } if(flag2==1) { printf("\t%d",M[ lin(X) ][col(A)]); flag2=0; } //出栈 X = stack[top--] ; if (X=='#')//是结束符 { if (X==A)//是结束符 { printf("\tAcc\n");
} else printf("\tERROR\n"); break; } else if (isT(X))//是终结符 { A=str[flag++]; } else if (isNT(X))//是否是非终结符 { flag2=1; //逆序入栈 for( i = strlen( p[ M[ lin(X) ][col(A)] ] ) - 1; i >= 0; i--) { stack[++top] = *(p[M[lin(X)][col(A)]] + i ) ; } } else { printf("Error in main()>%c\n",X); exit(0); } } } int lin(char c) { for(int i = 0; i < (int)strlen(NT); i ++ ) { if (c == NT[i]) { return i ; } } printf("Error in lin()>%c\n",c); exit(0) ; } int col(char c) { for (int i=0; i<(int)strlen(T); i ++ ) { if (c == T[i]) return i; } printf("Error in col()>%c\n",c); exit(0);
} bool isNT(char c) { //是否是非终结符 for (int i = 0; i < (int)strlen(NT); i ++ ) { if (c==NT[i]) return true; } return false; } bool isT(char c) { //是否是终结符(不包括'#') for (int i = 0; i < (int)strlen(T) - 1; i ++ ) { if (c == T[i]) { return true; } } return false; } 6. 程序测试结果
分享到:
收藏