词法语法语义分析器代码.doc_第1页
词法语法语义分析器代码.doc_第2页
词法语法语义分析器代码.doc_第3页
词法语法语义分析器代码.doc_第4页
词法语法语义分析器代码.doc_第5页
免费预览已结束,剩余17页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

#include #include using namespace std;void scaner(); /扫?描void checkIDF(); /检查是?否?是?保馈?留?字?void checkNum(); /检查是?否?是?数簓字?void retract(); /回?退?char getChar(); /获?取?下?一?个?字?符?void concatenation(); /连?接字?符?int reserve();/检查是?否?是?保馈?留?字?void buildlist1();/建立?标括?识?符?表括? void buildlist2(); /建立?数簓字?表括?void error(); /报馈?错洙?bool letter(); /字?母?bool digit(); /数簓字?char character80,token8,ch,tk4; /character数簓组哩?保馈?存?输?入?的?所有瓺字?符? token当獭?前要癮检查的?字?符? int sy,syn,pt,pc,pL1=0,pL2=0,p5,p6; /syn 种?别纄编括?码? pt token数簓组哩?下?标括? pc character数簓组哩?下?标括? pL1 标括?志?符?表括?下?标括? pL2 数簓字?表括?下?标括?vector list1; /标括?志?符?表括?vector list2; /数簓字?表括?void scaner()pt=0;for(int i=0;i8;i+)tokeni=NULL;char s=getChar(); while(s= )|(s=n)s=getChar();if(s=a)|(s=A)checkIDF();else if(s=0)&(s:syn=14;s=getChar();if(s=)sy=3;strcpy(token,relop);strcpy(tk,ME);elsesy=2;retract();strcpy(token,relop);strcpy(tk,MT);break;case:syn=14;s=getChar();if(s=)sy=5;strcpy(token,relop); strcpy(tk,LE);elsesy=4;retract(); strcpy(token,relop); strcpy(tk,LT);break; case!: s=getChar();if(s=)syn=14;strcpy(token,relop); strcpy(tk,UEQ);elseretract();cout第台?p5句?第台?p6个?字?符?!=;error();break;case;:syn=15;tokenpt=;break;case,:syn=16;tokenpt=,;break;case(:syn=17;tokenpt=(;break;case):syn=17;tokenpt=);break;case&:s=getChar();if(s=&)syn=18;strcpy(token,&);elseretract();cout第台?p5句?第台?p6个?字?符?&;error();break;case|:s=getChar();if(s=|)syn=19;strcpy(token,|);elseretract();cout第台?p5句?第台?p6个?字?符?&;error();break;default:cout第台?p5句?第台?p6= 0 & tokeni = 9; +i) n = 10 * n + (tokeni - 0); list2.push_back(n); pL2+; void error()cout出?现?错洙?误-endl;bool letter()char s=characterpc-1;if(s=a)|(s=A)return true;elsereturn false;bool digit()char s=characterpc-1;if(s=0)&(s=9)return true;elsereturn false;#includeusing namespace std;int lookahead; /当獭?前种?别纄编括?码?int a1,v,p7,p8; /a1 pa数簓组哩?下?标括? v=0表括?示? (辍? v=1 表括?示? )?int pa1002; /第台?一?维?保馈?存?单蹋?词洙?的?种?别纄编括?码? 第台?二t维?用?来?区?分?种?别纄编括?码?相同?的?单蹋?词洙?int nexttoken(); /下?一?个?单蹋?词洙?的?种?别纄编括?码?void match();void S();void A();void Op();void B();void relop();void E();void E1();void T();void T1();void F();void p();void error1();int nexttoken()v=pa+a11;int paa=paa10;p8+;if(paa=15)p7+;p8=0;return paa10;void match(int t)if(lookahead=t)lookahead=nexttoken();elseerror1();void S()if(lookahead=1)cout while(A) Sendl;match(1);if(lookahead=17&v=0)match(17); A();elsecout第台?p7句?第台?p8个?字?符?缺?少?左哩?括?号?;error1();if(lookahead=17&v=1)match(17);S();elsecout第台?p7句?第台?p8个?字?符?缺?少?右?括?号?;error1();else if(lookahead=6|lookahead=7)cout i=E;endl;match(lookahead);if(lookahead=8)match(8);E();elsecout第台?p7句?第台?p8个?字?符?缺?少?= 号?;error1();if(lookahead=15)match(15);else cout第台?p7句?第台?p8个?字?符?缺?少?; 号?;error1();else if(lookahead=2)coutif (A) S else Sendl;match(2);if(lookahead=17&v=0)match(17); A();elsecout第台?p7句?第台?p8个?字?符?缺?少?左哩?括?号?;error1();if(lookahead=17&v=1)match(17);S();elsecout第台?p7句?第台?p8个?字?符?缺?少?右?括?号?;error1();coutlookaheadendl;if(lookahead=3)match(3);S();elsecout第台?p7句?第台?p8个?字?符?if缺?少?相应畖的?else;error1();else cout第台?p7句?第台?p8个?字?符?不?匹¥配?文?法?;error1();void A()coutB Op B | Bendl;B();while(lookahead=18|lookahead=19)Op();B();void Op()if(lookahead=18|lookahead=19)if(lookahead=18)cout&endl;elsecout|endl;match(lookahead);elsecout第台?p7句?第台?p8个?字?符?逻?辑-运?算?符?不?匹¥配?;error1();void B()coutE relop Eendl;E();relop();E();void relop()if(v=1) cout =endl;else if(v=2)cout endl;else if(v=3)cout =endl;else if(v=4)cout endl;else if(v=5)cout =endl;if(lookahead=14)match(14);elsecout第台?p7句?第台?p8个?字?符?逻?辑-运?算?符?不?匹¥配?; error1();void E()coutT E1endl;T();E1();void E1()cout+T E1endl;if(lookahead=9)match(9);T();E1();void T() coutF T1endl;F();T1();void T1()cout*F T1endl;if(lookahead=10)match(10);F();T1();void F()cout P*F|Pendl;p();while(lookahead=11)match(11);p();void p()if(lookahead=6|lookahead=7)coutiendl;match(lookahead);else if(lookahead=17&v=0)cout(E)endl;match(17);E();if(lookahead=17&v=1)match(17);elsecout第台?p7句?第台?p8个?字?符?缺?少?右?括?号?;error1();elsecout第台?p7句?第台?p8个?字?符?缺?少?左哩?括?号?或文?法?不?匹¥配?;error1();void error1()cout-语?法?分?析?错洙?误-endl;exit(0);#include#include cf.h#include yf.husing namespace std;int a,b,c,d,vv,nxq; /a pa数簓组哩?词洙?法?分?析?时骸?的?下?标括? b 保馈?存?pa当獭?前下?标括?值 c pa数簓组哩?语?义?分?析?时骸?的?下?标括? d 中D间?变?量?的?下?标括? vv=0 表括?示? (辍? vv=1 表括?示? )?int lookahead1; /pa数簓组哩?当獭?前下?标括? nxq 下?一?条?将?要癮产生?的?四?元a式?的?地?址int e204; /4元a式? 数簓组哩?int s; /4元a式?数簓组哩?下?标括?void S1();int A1();void Op1();int B1();int relop1();int E2();int T2();int F1();int P1();void error2();void scaner1();int emit(int a,int b,int c,int d); /保馈?存?当獭?前4元a式?int newtemp();void backpatch(int p,int t);void show();int merge(int p1,int p2);void main()cout*词洙?法?分?析?器*endl;cout*单蹋?词洙?符?号?种?别纄编括?码?*endl; cout(while ,1) (if ,2) (else , 3) (switch ,?4) (case ,5) endl;cout(标括?志?符?, 6) (常数簓, 7) ( = ,8) ( + , 9) ( * , 10)endl;cout ,14) ( = ,14)endl;cout( ,14) ( = ,14) (= ,14) ( != ,14) ( ; ,15)endl;cout( , ,16) ( ( ,17) ( ) ,17) (辍?& ,? 18)? (辍?| ,?19)? endl;cout请?输?入?一?串?字?符?,?以?#号?键结束?:;pc=0;do /读入?字?符? scanf(%c,&ch); characterpc+=ch; while(ch!=#); pt=0;pc=0;a=0,b=0,c=0,d=0,a1=0,v=0,vv=0,s=0,p5=1,p6=0,p7=1,p8=1;cout-词洙?法?分?析?开a始?-=1&syn=8&syn=15&syn=16)|syn=18|syn=19)cout(token ,syn)endl; paa+0=syn;else if(syn=6)/标括?示?符?cout(id ,(pL1-1)endl;b=a+;pab0=syn;pab1=pL1-1;else if(syn=7)/常数簓cout(num ,(pL2-1)endl;b=a+; pab0=syn; pab1=pL2-1;else if(syn=14)cout(token ,syn)endl; b=a+;pab0=syn;pab1=sy;/内码?值else if(syn=17) cout(token ,syn)endl; b=a+;if(strcmp(token,()=0) pab0=syn; pab1=0;else pab0=syn; pab1=1;elsesyn=30;cout-endl;while(syn!=0);coutendl;cout-语?法?分?析?开a始?-endl; lookahead=pa00;/种?别纄编括?码? 区?分?相同?S(); /语?法?分?析?cout语?法?分?析?成功|endl;coutendl;cout-语?义?分?析?开a始?-endl;nxq=200;lookahead1=pac0;S1(); /语?义?分?析?show();cout语?义?分?析?成功|endl;void S1()if(lookahead1=1)int t;scaner1();if(lookahead1=17&vv=0)scaner1(); t=A1();elsecout1:阰while后左哩?括?号?非?法?!?endl;error2();if(lookahead1=17&vv=1)scaner1();S1();int tt=et-13-2; emit(20,-1,-1,tt);backpatch(t,nxq);elsecout2:阰while后右?括?号?非?法?!?endl;error2();else if(lookahead1=6|lookahead1=7)int t,v3;if(lookahead1=6)/标括?示?符?v3=pac1*10+1;else/常熟酣?v3=pac1*10+2;scaner1();if(lookahead1=8)scaner1(); t=E2(); emit(8,t,-1,v3);elsecout3endl;error2();if(lookahead1=15)scaner1();elseerror1();else if(lookahead1=2)scaner1();int t3,t4;if(lookahead1=17&vv=0) scaner1(); t3=A1();elseerror2();if(lookahead1=17&vv=1)scaner1();S1();t4=emit(20,-1,-1,0);backpatch(t3,nxq);elseerror2();if(lookahead1=3) scaner1();S1();backpatch(t4,nxq);elseerror2();else error2();int A1()int t1=B1();int t2;int i=0;while(lookahead1=18|lookahead1=19)i=1;Op1();t2=B1();t1=merge(t2,t1);return t1;void Op1()if(lookahead1=18|lookahead1=19)scaner1();elseerror2();int B1()int t1=E2();int o=relop1();int t2=E2();emit(o,t1,t2,nxq+2);t1=emit(20,-1,-1,0);return t1;int relop1()int v1=vv;if(lookahead1=14)scaner1();else error1();if(v1=1) return 14*10+1;else if(v1=2)return 14*10+2;else if(v1=3)return 14*10+3;else if(v1=4)return 14*10+4;else if(v1=5)return 14*10+5;int E2()int e1=T2();int t=e1; /中D间?变?量?的?下?标括?while(lookahead1=9)scaner1();int e2=T2();t=newtemp();emit(9,e1,e2,t*10+3);e1=t*10+3;t=t*10+3; return t;int T2()/乘?int t1=F1();int t=t1; /中D间?变?量?的?下?标括?while(lookahead1=10)scaner1();int t2=F1();t=newtemp();emit(10,t1,t2,t*10+3);t1=t*10+3;t=t*10+3; return t;int F1()/ 乘?方?int f1=P1();int t=f1; /中D间?变?量?的?下?标括?while(lookahead1=11)scaner1();int f2=P1();t=newtemp();emit(11,f1,f2,t*10+3);f1=t*10+3;t=t*10+3; return t;int P1()if(lookahead1=6)scaner1();return pac-11*10+1;else if(lookahead1=7)scaner1();return pac-11*10+2;else if(lookahead1=17&vv=0)scaner1(); int pp=E2();if(lookahead1=17&vv=1)scaner1();return pp;else error2();else error2();void error2()cout语?义?出?错洙?endl;exit(0);void scaner1()vv=pa+c1;lookahead1=pac0;int emit(int a,int b,int c,int d)es0=a;es1=b;es2=c;es3=d;s+;nxq+;return s-1;int newtemp()return +d;int merge(int p1,int p2)if(p2=0)return p1;elseep23=p1;return p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论