LL1文法 i+i*i 分析
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; #define MAXSIZE 100 typedef struct{ char *base; char *top; }Sqstack; //手动构造预测分析表 42个字符串 char* str[6][7]={" " , "i" , "+" , "*" , "(" , ")" , "#" , "E" , "TH" , " " , " " , "TH" , " " , " ", "H" , " " , "+TH" , " " ," " , "e" ,"e", "T" , "FY" , " " , " " , "FY" , " " , " ", "Y" , " " , "e" , "*FY" , " " , "e" , "e", "F" , "i" , " " , " " , "(E)" , " " , " " }; /*初始化顺序栈*/ void Creatstack(Sqstack &S) { S.base = new char[MAXSIZE];/*base指向第0个元素*/ S.top = S.base; } /*判断栈是否为空*/ int stackempty(Sqstack &S) { if(S.base == S.top) return 1; else return 0; } /*入栈*/ void push(Sqstack &S,char e) { *S.top++ = e; } /*出栈*/ void pop(Sqstack &S) { --S.top; } /*获取栈顶元素*/ char gettop(Sqstack &S) { --S.top; return *S.top; } /*把栈里的内容输出*/ void showstack(Sqstack &S) { int i = 0;//记步 while(S.top != S.base) { printf("%c",*S.base); S.base++; i++; } //把栈还原成原来的样子 while(i != 0) { S.base--; i--; } } void showinput(char *p) { int i = 0; while(*p != '\0') { printf("%c ",*p); p++; i++; } //将p指向原来的位置 while(i != 0) { p--; i--; } } void main() { int test = 0; //建立栈 Sqstack S; char ch; char *p; char *s; int i,j; int a,b; int z; int k; //要验证的i+i*i char *input = "i+i*i#"; p = input; Creatstack(S); //将#入栈 push(S,'#'); //文法开始符入栈 push(S,'E'); while(S.base != S.top) { showstack(S); printf(" "); showinput(p); printf(" "); //找栈顶元素的和输入串的首元素 ch = gettop(S); //获取之后还要还原 S.top++; if(ch == *p && *p != '\0') { pop(S); p++; printf("匹配成功"); printf("\n"); } else{ for(i = 0;i < 6;i++) { if(*str[i][0] == ch) { a = i; } } for(j = 0;j < 7;j++) { if(*str[0][j] == *p) { b = j; } } if(str[a][b] == "e") { pop(S); } else { pop(S); //逆序 s = str[a][b]; z = 0; while(*s != '\0') { s++; z++; } s--; //z--; while(z != 0) { push(S,*s); s--; z--; } } printf("%c -> %s \n",ch,str[a][b]);//find } } }