SNL语言吉大计算机编译原理课程设计_第1页
SNL语言吉大计算机编译原理课程设计_第2页
SNL语言吉大计算机编译原理课程设计_第3页
SNL语言吉大计算机编译原理课程设计_第4页
SNL语言吉大计算机编译原理课程设计_第5页
已阅读5页,还剩69页未读 继续免费阅读

下载本文档

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

文档简介

1、level;param; code; size;/* an alyze.h */#ifndef _anal yze_h_#define _anal yze_h_#defi ne scopemaxlevel 20#in elude treenode.henum idkind typekind , varkind , prockind ;enum typekind inttype , chartype , arraytype recordtype , booltype;enum accessk ind dir, in dir;struct typeir;struct symbolchai n;ty

2、peir *idtype;idki ndkin d;union more struct acc e sskind access; level; offset;intintvarattr;struct intparaint mcha in intprocki nd);struct paramchain(symbolcha inparamchain);struct fieldcha in(chartypeir * int fieldchai n);struct typeir(inttypek ind union(struct(typeir *typeir *jarrayattr;fieldchai

3、 n * more;entry;idname10; uni ttype; offset;size; kind;in dextype;eleme nttypebody;);struct attribute irstruct symbolcha in(intline;charidname10;attributeirattrir;symbolcha inn ext;*);class an alyze(private:treenode* root;intlevel;symbolcha in * scopescopemaxlevel;symbolcha in backupscopemaxlevel of

4、stream output;an alyze(ofstream o, treenode * r);-an alyze();void prin tsymbolchai n();bool fi ndfield();bool searchchai n( char *,i nt,symbolchain * &);bool findentry(char *,bool,symbolchain * &);bool findentry2(char *,symbolchain * &,idkind);bool en ter(char *,symbolchain * &);void destroycha in()

5、;void createcha in();private:void an alysis(treenode *);public:void recordtype(treenode * t,symbolchain * en try); void arraytype(treenode * t, symbolchain * en try); void nametype(treenode * t, symbolchain * en try); symbolchai n * newty();void typeprocess(treenode * t, symbolcha in *);void body(tr

6、eenode * t);void procdecpart(treenode * t);void vardecpart(treenode * t);void typedecpart(treenode * t);static void doa nalyze(treenode *, ofstream ););#en dif/* parse.h */#ifndef_parse_h_#defi ne_parse_h_#i ncludetoke nlist.h#i ncludehtreenode.hh class parse private:ofstream * output;toke nlist* he

7、ad;toke nlist* cur;treenode* root;void fieldvarmore(treenode * t); treenode * fieldvar();void varimore(treenode * t);treenode * variable();treenode * factor();treenode * term();treenode * simple_exp();treenode * exp();treenode * actparammore();treenode * actparamlist();treenode * callstmrest();treen

8、ode * returnstm();treenode * outputstm();treenode * in putstm();treenode * loopstm(); treenode * con ditio nalstm(); treenode * arrayrest();treenode * fieldrest(); treenodeassig nmen trest(); treenode * aiicall(); treenode * stm(); treenode * stmmore(); treenode * stmlist(); treenode * programbody()

9、; treenode * procbody(); treenode * procdecpart(); void fidmore(treenode * t); void formlist(treenode * t); treenode * param();treenode * parammore(); treenode * paramdeclist(); void paramlist(treenode * t); treenode * procdeclarati on(); treenode * procdec();void varldmore(treenode * t); void varld

10、list(treenode * t); treenode * vardecmore(); treenode * vardeclist(); treenode * vardeclaratio n(); treenode * vardec();void ldmore(treenode * t); void ldlist(treenode * t); treenode * fielddecmore(); treenode * fielddeclist();void rectype(treenode * t); void arraytype(treenode * t); void structure?

11、ype(treenode * t); void basetype(treenode * t); void typedef(treenode * t); void typeld(treenode * t); treenode * typedecmore(); treenode * typedeclist(); treenode * typedeclarati on(); treenode * typedec(); treenode * declarepart(); treenode * declarepart2(); treenode * programhead(); treenode * pr

12、ogram();ofstream * getoutputstream();标识符inst, op, assign, delimiter, range, pointer, dot, endfile, error,toke nlist * getcur();toke nlist * gethead();char * getnexttoke nsem();char * getcurre nttoke nsem();void setcur(toke nlist * t);void setoutputstream(ofstream * o);void sethead(toke nlist * t);bo

13、ol read();bool matchsem(c onst char);bool matchlex(lextype i);bool matchnextlex(lextype i);bool matchnextsem(c onst char s);lextype getnexttoke nlex();lextype getcurtoke nlex();parse(toke nlist * ,ofstream *);parse。;void prin ttree(treenode * root);in t getcurre nttoke nlin eno();public:static treen

14、ode * doparse(toke nlist *, ofstream *);#en dif/* scan.h */#ifndef _scan_h_#defi ne _scan_h_#in elude toke nlist.hclass sea n(public:static toke nlist * dosca n(ifstream ofstream *);private:ifstream * i nputfile;ofstream * outputfile;sea n();sea n(ifstream *, ofstream *); sca n();ifstream * get in p

15、utfile(); ofstream * getoutputfile();void setlnputfile(ifstream *); void setoutputfile(ofstream *); void cleararray(); char getnextchar();lextype lookup(char *); toke nlist * gettoke nlist(); void prin ttoke nlist(toke nlist *););#en dif/* toke n.h7#ifndef _token_h_#defi ne _token_h#in clude #in clu

16、de using n amespace std; enum lextype id,charc,字符串reservedword, 保留字整型常量符运算符赋值运算符分界符数组下标结构类型成员运算符程序结束标志文件结束标志错误符号class toke n(public:toke n();toke n(i nt, char*,lextype);-toke n();void prin ttoke n(o fstream *);void prin ttoke n1();void setlex(lextype);void setsem(char *);void setl in e(i nt);int get

17、li ne();lextype getlex();char * getsem();private:int line;char * sem;lextype lex;);#en dif/*toke nlist.h*/#ifndef_tokenlist_h_#defi ne_tokenlist_h_#i nclude toke n.h class toke nlist public:toke nlist();-toke nlist();void settoke n(toke n *); void setnext(toke nlist *);void setnumber(i nt);int getnu

18、mber(); toke n * gettoke n(); toke nlist * getnext(); void appe nd();private:int nu mber;toke n * toke n;toke nlist * n ext;););* en um dec_kind 具体声明(arrayk, / 数组#en dif/* tree no de.h */#ifndef_treenode_h_#defi ne _treenode_h_# in elude # in elude # in elude using n amespace std;en um node_kind语法树节

19、点pheadk,程序头typek,类型声明vark,变量声明procdeck,单个过程声明stmlk,语句序列deck,声明节点stmtk,语句节点expk表达式节点chark,/ 字符in tegerk, 整型recordk, / 记录idk/type定义的类型);en um stmt_kind 具体语句(ifk, /if 语句whilek, /while 语句assignk, /赋值语句readk,writek,callk, returnk;enum exp kind (opk,con stk, idek,/read语句/write 语句过程调用语句返回语句具体表达式操作符常整型标识符ar

20、rayek, / 数组fieldek, 域charek/单字符);union kind/记录语法树节点具体类型dec_kind dec; 声明stmt_kind stmt;/ 语句 exp_kind exp; 表达式);enum param_type/过程参数属性( valparamtype,/ 值参 varparamtype/ 变参);enum exp_op_type/表达式运算符类型 (lt,eq, plus, minus, times, over ; struct arrayattr/ 数组属性 (int low;/ 上界int up;下届dec_kind childtype;/ 类型;

21、 struct procattr / 过程属性 (param_type paramtype;);struct expattr /表达式属性 (exp_op_type op; int val;);struct attr / 属性 (arrayattr arrayattr;procattr procattr; expattr expattr;);class treenode (public:node_kind nodekind;treenode *child3;treenode *sibling;char * idname3;intlineno;kindkind;char * type_name;

22、intidnum;intchildnum;public:设置表达式属性*void setattrexpval(int i);void setattrexpoptype(char * s);exp_op_type getattrexpoptype();设置过程属性*void setprocattrparamtype(param_type d);设置数组属性*void set array attrt ype (d ec_ki n d d);void setarrayattrllp(int u);void setarrayattrlow(int i);void setlineno(int i);vo

23、id setnodekind(node_kind n);void settypename(char * s);void setldname(char *s);void setchild (int i, treenode * c);void setchild(treenode *);void setsibling(treenode * t);void setkindofdec(dec_kind);dec_kind getkindofdec();void setkindofstmt(stmt_kind);void setkindofexp(exp_kind);treenode * getsibli

24、ng();treenode * getchild(int i);intgetldnum();char * getldname(int i);treenode();treenode();treenode(node_kind n);void printtreenode();void printtreenode(ofstream * out);#en dif /* zparse.h */#ifndef _zparse_h_ #defi ne _zparse_h_ #in elude treenode.h #in elude toke nlist.h #define sy_stack_max 20 符

25、号栈大小#defi ne ops_stack_max 20 操作符栈大小 #defi ne opn_stack_max 20 操作数栈大小 *vtjmidparen, vt_pointer, vt_dot, vtjt, vt_eq, vt_rmidparen, vt_then, vt_do, vt_plus, vt_minus, vt_mul5 vt_div5 vt_charc, vt_error):class treestack public:treenode * & tree; treestack * next; treestack * pre; treestack(treenode *

26、& t):tree(t),next(null),pre(null) );i /* *“*m*zparse 步*root;语法树根节点output; 输出语法ll1tab7041;语法分析int表 * . 9 . . 、 /*非终极符集en um vn_vtvn_program, / 开女台符 vn_programhead, vn_programname, vn_declarepart,vn_typedec, vn_typedeclarati on, vn_typedeclist, vn_typedecmore, vn_typeld, vn_typedef, vn_basetype, vn_st

27、ructuretype, vn_arraytype, vn_low, vn_top, vn_rectype, vn_fielddeclist, vn_fielddecmore, vnjdlist, vn idmore, vn v ardec, vn v ardeclarati on, vn v ardeclist, vn_v ardecmore, vn_varldlist, vn_varldmore, vn_procdec, vn_procdeclarati on, vn_procdecmore, vn_procname, vn_paramlist, vn_paramdeclist, vn_p

28、arammore, vn_param, vn_formlist, vn_fidmore, vn_procdecpart, vn_procbody, vn_programbody, vn_stmlist, vn_stmmore, vn_stm, vn_asscall, vn_assig nme ntrest, vn_co nditi on alstm, vn_loopstm, vn n putstm, vnj nvar, vn_outputstm, vn_returnstm, vn_callstmrest, vn_actparamlist, vn_actparammore, vn_relexp,

29、 vn_otherrelexp, vn_exp, vn_otherterm, vn_term, vn_otherfactor, vn_factor, vn_variable, vn_varimore, vn_fieldvar, vn_fieldvarmore, vn_cmpop, vn_addop, vn_multop, vn_basetypeofarray, vt_program = 70,/ 为了与 vn 区分 vtjd, vt_type, vt_var, vt_procedure, vt_begi n, vtjnteger, vt_char, vt_array, vt_arraydot,

30、 vt_of, vt_record, vtjntc, vt_end, vt_semicolon, vt_comma, vt_rparen, vtjparen, vtjf, vt_while, vt_return, vt_read, vt_write, vt_else, vt_fi, vt_endwh, vt_assign,*class zparsepublic:treestack * currenttree;treestack * headtree;inttreenum;voidtree_push(treenode * &);voidtree_pop();treenode*optrops_st

31、ack_max;intoptrtop;voidoptr_push(treenode *);treenode*optr_pop();treenode*opndopn_stack_max;intopndtop;voidopnd_push(treenode *);treenode* opnd_pop();private:tokenlist* head;/tokenlist 头节点tokenlist* cur; /tokenlist当前节点treenode* ofstream * 树vn_vtsy_stacksy_stack_max;intsy_top;voidsy_push(vn_vt);bool

32、read(); tokenlist int char lextypevn_vtsy_pop();zparse(tokenlist *, ofstream *); zparse();getcur();getcurrenttokenlineno(); getcurrenttokensem(); getcurrentt okenlex();bool matchsem(const char); bool matchlex(lextype i);int converttokentovt(); bool matchvt();void exceptionthrow();treenode * parsell(

33、); void createtable(); void predict(int num); int priosity(treenode *);void process1();void process2();void process3();void process4();void process5();void process6();void process7();void process8();void process9();void process10();void processl 1();void processl 2();void processl 3();void processl

34、4();void processl 5();void processl 6();void processl7();void processl 8();void processl 9();void process20();void process21();void process22();void process23();void process24();void process25();void process26();void process27();void process28();void process29();void process30();void process31();voi

35、d process32();void process33();void process34();void process35();void process36();void process37();void process38();void process39();void process40();void process41();void process42();void process43();void process44();void process45();void process46();void process47();void process48();void process49

36、();void process50();void process51();void process52();void process53();void process54();void process55();void process56();void process57();void process58();void process59();void process60();void process61();void process62();void process63();void process64();void process65();void process66();void pro

37、cess67();void process68();void process69();void process70();void process7 1();void process72();void process73();void process74();void process75();void process76();void process77();void process78();void process79();void process80();void process81();void process82();void process83();void process84();v

38、oid process85();void process86();void process87();void process88();void process89();void process90();void process91();void process92();void process93();void process94();void process95();void process96();void process97();void process98();void process99();void process100();void process101();void proce

39、ss102();void process103();void process104();void process105();void process106();void prin ttree(treenode * root);public:static treenode * dozparse(tokenlist * ,ofstream*):b);#en dif/* an alyze.cpp */#in elude “an alyze.hint aexcepti on;char * excename;void except! on throw(treenode * t)aexceptio n =

40、 t-li neno;if (t-getldname(o) != null)(strcpy(excename , t-getldname(o);throw(excename);)void an alyze:doa nalyze(treenode * t, ofstream o) try (an alyze an alyzer(o , t);an alyzer.a nalysis(a nalyzer.root);) catch(i nt excepti on)(coutherror in line hexcepti onen dl;)catch(char * excename) (cout,me

41、xcename is illegalendl; )an alyze:a nalyze(ofstream o, treenode * r) root = r;output = o;level = -1;)an alyze:a nalyze() if (root != null)(delete root;)output.close();)void an alyze:createcha in() level+;scopelevel = null;)void an alyze:destroycha in()level-;)bool analyze:enter(char * idname , symbo

42、lchain *en try)(bool prese nt = finden try(id name,05e ntry);retur n prese nt;throw(aexcepti on);elsebool analyze:findentry(char * idname ,bool flag ,symbolchain * & entry)int i = level;bool present = true;if (flag = true) (while (i != -1) (present = searchchain(idnamej5entry); if (present = false)

43、(return present;)i;)else (present = searchchain(idname,i,entry);if (present = false) (return present;)return present;)bool analyze:searchchain(char * idname jnt currentlevel,symbolchain * & entry)(symbolchain * current;symbolchain * current2;if (scopecurrentlevel = null) (current = newty();scopecurr

44、entlevel = current;entry = current;return true;)else (current = scopecurrentlevel;while (current != null) (if (strcmp(idname , current-idname)current = current-next;)current = newty();current2-next = current;entry = current;return true;)void analyze:analysis(treenode * t)(treenode * p = t-child1;whi

45、le (p != null)(switch (p-nodekind)case typek: typedecpart(p-childo); break case vark: vardecpart(p-childo); break;case procdeck: procdecpart(p-child0);break;default:exceptionthrow(p);)p = p-sibling;)p = t-child2;if (p-nodekind = stmlk)(body(p);)if (level !=-1)(destroychain();0)return false;void anal

46、yze:typedecpart(treenode * t)bool present = false; symbolchain * entry; while (t != null)bool analyze:findentry2(char * type , symbolchain * & entry , idkind idkind)int i = level; symbolchain * current; while (i=0)present = enter(t-idnameo , entry);if (present = true) (coutf,repetition declaration,i

47、llegal id t-idnameohvnendl;)else strcpy(entry-idname , t-idname0);typeprocess(t, entry);)t = t-sibling;)void analyze:typeprocess(treenode *t, symbolchain * entry)switch (t-getkindofdec()(case integerk: entry-attrlr.idtype-kind = inttype;entry-attrlr.idtype-size = 1; break;case chark: entry-attrlr.id

48、type-kind = chartype;entry-attrlr.idtype-size = 1; break;case idk:current = scopei; while (current != null) (if (current-attrlr.kind = idkind & strcmp(current-idname5type) = 0)(entry = current; return true;)i; )return false;)void analyze:nametype(treenode *t, symbolchain * entry)(symbolchain * entry

49、2;bool presentfindentry2(t-type_name3entry2,typekind); if (present = true) (coutf,undeclaredtype-,ht-type_namenihendl;)elsenametype(t, entry);break;case arrayk:arraytype(t,entry); break;case recordk: recordtype(t,entry); break;symbolchain * analyze:newty() (symbolchain * s = (symbolchain*)malloc(siz

50、eof(symbolchain);s-attrlr.idtype = (typeir *)malloc(sizeof(typelr);s-attrlr.kind = typekind;s-next = null;return s:en try-attrlr = en try2-attrlr;)void analyze:arraytype(treenode * t, symbolchain * en try)(typeir * temp;if (t-attr.arrayattr.low t-attr.arrayattr.up)( cout,farrayoverflow-vt-type_ namehh,e ndl;) else(en try-attrlr.idtype-k ind = arraytype;en try-attrlr.idtype-size = t-attr.arrayattr.up -t-attr.arrayattr.low ;temp=en try-attrlr.idtype-more.arrayattr.i ndextype = (typeir *)malloc(sizeof(typeir);temp-k ind = in ttype; temp-size = 1; temp=en try-attrlr.idtype-mo

温馨提示

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

评论

0/150

提交评论