logo资料库

LR语法分析器.docx

第1页 / 共17页
第2页 / 共17页
第3页 / 共17页
第4页 / 共17页
第5页 / 共17页
第6页 / 共17页
第7页 / 共17页
第8页 / 共17页
资料共17页,剩余部分请下载后查看
输入:3+4*6 输出:27(当然中间包括 LR(1)语法分析过程 程序提供主要为了给大家提供一些方便,你懂得。。。呵呵 如有问题,QQ:718561468 来自:大连理工大学软件学院 #include using namespace std; #include #include #include #include string AnalyzeChart[16][11]= {//LR 文法的分析表 "e1", "s5", "e1", "s4", "e2", "e1", "1", "2", "3", "e1", "e1", "e3", "s6", "e1", "e3", "e2", "acc", "error", "error", "error", "s7", "e1", "e6", "r2", "s8", "r2", "s9", "e6", "r4", "r4", "r4", "r4", "e6", "e6", "r2", "r4", "r2", "r4", "error", "error", "error", "error", "error", "error", "s5", "e1", "e1", "s4", "e2", "e1", "10", "2", "3", "e1", "e1", "e5", "r6", "r6", "r6", "r6", "s5", "e1", "e1", "e1", "e1", "e3", "s4", "r6", "e2", "r6", "error", "error", "error", "e1", "error", "11", "3", "3", "s5", "e1", "e1", "s4", "e2", "e1", "error", "12", "e1", "e1", "s5", "e1", "e1", "e1", "e1", "s5", "e1", "e1", "e1", "e1", "s4", "s4", "e2", "e1", "e1", "e1", "error", "error", "13", "error", "error", "14", "e3", "s6", "e1", "e3", "s15", "r3", "error", "error", "error", "s9", "e1", "e6", "r1", "s8", "r1", "s9", "e6", "r7", "s8", "r7", "s9", "e6", "r3", "r3", "r3", "r3", "e6", "r8", "r8", "r8", "r8", "e6", "r5", "r5", "e6", "e6", "e6", "e6", "e6", "r1", "r7", "r3", "r8", "r5", "r1", "r7", "r3", "r8", "r5", "error", "error", "error", "error", "error", "error", "error", "error", "error", "error", "error", "error", "error", "error", "error",
"r5", "r5", }; stack digit; queue digit1; queue inputid; char *FinalSymbol[6]= { "i","+","*","(",")","#"//终结符 }; char *UnfinalSymbol[5]= { "E","E'","T","T'","F"//非终结符 }; stack ufstack;//状态栈 void initialize() { ufstack.push('0'); inputid.push(0); } char * keyword[6] = {"for","if","then","else","while","do"}; int flag1=-1,flag2=-1; typedef struct sign { int line; int token; char temp[10]; int i; }; void reset(sign & s) { s.i = 0; memset(s.temp,'$',10); s.token = -1; } bool is_key_word(sign & s) { int i,r; for(i=0;i<6;i++) { r = memcmp(s.temp,keyword[i],s.i);
if(r == 0) { s.token = i+1; return true; break; } } return false; } bool is_id(sign & s) { int i; bool b = false; if( (s.temp[0]>='a' && s.temp[0]<='z') | (s.temp[0]>='A' && s.temp[0]<='Z') ) else b = true; return b; for(i=1;i='a' && s.temp[i]<='z') | (s.temp[i]>='A' && s.temp[i]<='Z') | (s.temp[i]>='0' && s.temp[i]<='9')) ; else { b = false; return b; } } return b; } bool is_num(sign & s) { digit.push(0); bool b = true; char c; int state = 12; for(int i=0;i
case 12: { } case 13: { } case 14: { } case 15: { } case 16: { } case 17: { if(c>='0' && c<='9' || c=='-') { state = 13; } else return false; break; if(c>='0' && c<='9') state = 13; else if(c=='.') state=14; else if(c=='E' || c=='e') state=16; else return false; break; if(c>='0' && c<='9') state=15; else return false; break; if(c>='0' && c<='9') state=15; else if(c=='E' || c=='e') state=16; else return false; break; if(c=='+' || c=='-') state=17; else if(c>='0' && c<='9') state=18; else return false; break; if(c>='0' && c<='9') state=18;
else return false; break; if(c>='0' && c<='9') state=18; else return false; break; } case 18: { } } } return b; } int handle(sign & s) { s.temp[s.i] = '\0'; if(strlen(s.temp)==0) return 0; if(is_key_word(s)) { cout<<"("<
} else { } n=n*10+(s.temp[i]-'0'); i++; } if(n1!=0) n=n/n1; // cout<
} else if(ch=='-') { handle(mark); cout<<"(14,"<') { handle (mark); cout<<"(23,"<
inputid.push(18); } else { handle(mark); cout<<"(25,"<
分享到:
收藏