logo资料库

编译原理课程设计-PL0编译程序.doc

第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
资料共13页,剩余部分请下载后查看
添加的功能模块: 1、关键字和保留字部分: const NORW = 19; //添加 IFSYM,ELSESYM,FORSYM,TOSYM,DOWNTOSYM,RETURNSYM, typedef enum { NUL, IDENT, NUMBER, PLUS, MINUS, TIMES, GTR, GEQ, PERIOD, THENSYM, CALLSYM, PROGSYM, RETURNSYM, SLASH, ODDSYM, EQL, NEQ, LSS, LEQ, LPAREN, RPAREN, COMMA, SEMICOLON, BECOMES, BEGINSYM, ENDSYM, IFSYM, WHILESYM, WRITESYM, READSYM, DOSYM, CONSTSYM, VARSYM, PROCSYM, ELSESYM,FORSYM,TOSYM, DOWNTOSYM, PLUSE, MINUSE, DPLUS, DMINUS } SYMBOL; //添加 "ELSESYM", "FORSYM", "TOSYM", "DOWNTOSYM", "RETURNSYM", // "PLUSEQL", "MINUSEQL", "DOUBLEPLUS", "DOUBLEMINUS" char *SYMOUT[] = {
"SLASH", "NUL", "IDENT", "NUMBER", "PLUS", "MINUS", "TIMES", "ODDSYM", "EQL", "NEQ", "LSS", "LEQ", "COMMA", "BEGINSYM", "WHILESYM", "DOSYM", "GTR", "GEQ", "LPAREN", "RPAREN", "SEMICOLON", "PERIOD", "BECOMES", "ENDSYM", "IFSYM", "THENSYM", "WRITESYM", "READSYM", "CALLSYM","CONSTSYM","VARSYM","PROCSYM", "PROGSYM", "ELSESYM", "FORSYM", "TOSYM", "DOWNTOSYM", "RETURNSYM", "PLUSE", "MINUSE","DPLUS", "DMINUS" }; 2、词法处理部分(++,--,+=,-=,不等号) void GetSym() { int i,J,K; ALFA A; while (CH<=' ') GetCh(); if (CH>='A' && CH<='Z') { K=0; do { if (K='A' && CH<='Z')||(CH>='0' && CH<='9'));
A[K]='\0'; strcpy(ID,A); i=1; J=NORW; do { K=(i+J) / 2; if (strcmp(ID,KWORD[K])<=0) J=K-1; if (strcmp(ID,KWORD[K])>=0) i=K+1; }while(i<=J); if (i-1 > J) SYM=WSYM[K]; else SYM=IDENT; } else if (CH>='0' && CH<='9') { K=0; NUM=0; SYM=NUMBER; do { NUM=10*NUM+(CH-'0'); K++; GetCh(); }while(CH>='0' && CH<='9'); if (K>NMAX) Error(30); } else if (CH==':') { GetCh(); if (CH=='=') { SYM=BECOMES; GetCh(); } else SYM=NUL;
} //+=,++,-=,--词法处理 else if (CH=='+') { GetCh(); if (CH=='=') { SYM=PLUSE; GetCh(); } else if (CH=='+') { SYM=DPLUS; GetCh(); } else SYM=PLUS; } else if (CH=='-') { GetCh(); if (CH=='=') { SYM=MINUSE; GetCh(); } else if (CH=='-') { SYM=DMINUS; GetCh(); } else SYM=MINUS; } //结束 else if (CH=='<') { GetCh();
if (CH=='=') { SYM=LEQ; GetCh(); } //不等号<>处理 else if (CH=='>') { SYM=NEQ; else SYM=LSS; //结束 } else if (CH=='>') { GetCh(); if (CH=='=') { SYM=GEQ; else SYM=GTR; else { SYM=SSYM[CH]; GetCh(); } GetCh(); } GetCh(); } } } 、因子++、--处理 void FACTOR(SYMSET FSYS, int LEV, int &TX) { int i; TEST(FACBEGSYS,FSYS,24); while (SymIn(SYM,FACBEGSYS)) { if (SYM==IDENT) { i=POSITION(ID,TX); if (i==0) Error(11); else switch (TABLE[i].KIND) { case CONSTANT: GetSym(); GEN(LIT,0,TABLE[i].VAL); break;
case VARIABLE: GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); //添加因子后++,后--处理 GetSym(); if (SYM==DPLUS){ //++ GetSym(); GEN(LIT,0,1); GEN(OPR,0,2); GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); // 将 1 取入栈顶 //加操作 }else if(SYM==DMINUS){ GetSym(); GEN(LIT,0,1); GEN(OPR,0,3); GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); // 将 1 取入栈顶 //减操作 } //结束 break; case PROCEDUR: GetSym(); Error(21); break; } } else if (SYM==NUMBER) { if (NUM>AMAX) { Error(31); NUM=0; } GEN(LIT,0,NUM); GetSym(); } else if (SYM==LPAREN) { GetSym(); expression_r(SymSetAdd(RPAREN,FSYS),LEV,TX); if (SYM==RPAREN) GetSym(); else Error(22); } //添加因子前++,前--处理 else if (SYM==DPLUS){ GetSym(); if(SYM==IDENT){ i=POSITION(ID,TX); if (i==0) Error(11); else if (TABLE[i].KIND!=VARIABLE) { Error(12); i=0; }
GetSym(); GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); GEN(LIT,0,1); if (i!=0){ GEN(OPR,0,2); GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); //加操作 } GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); }else Error(19); } else if(SYM==DMINUS){ GetSym(); if(SYM==IDENT){ i=POSITION(ID,TX); if (i==0) Error(11); else if (TABLE[i].KIND!=VARIABLE) { Error(12); i=0; } GetSym(); GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); GEN(LIT,0,1); if (i!=0){ GEN(OPR,0,3); GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); //减操作 } GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); }else Error(19); } //结束 TEST(FSYS,FACBEGSYS,23); } } 4、语法处理部分(++,--,+=,-=,FOR,ELSE) void STATEMENT(SYMSET FSYS,int LEV,int &TX) { int i,CX1,CX2; SYMBOL ADDOP; switch (SYM) { case IDENT: i=POSITION(ID,TX);
if (i==0) Error(11); else if (TABLE[i].KIND!=VARIABLE) { Error(12); i=0; } GetSym(); //后++,后--,-=,+-处理 if (SYM==BECOMES){ //= GetSym(); expression_r(FSYS,LEV,TX); if (i!=0){GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);} //将栈顶 //处理表达式 值存入变量 } else if (SYM==DPLUS){ //++ // 将 1 取入栈顶 GetSym(); GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); GEN(LIT,0,1); if (i!=0){ GEN(OPR,0,2); GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); } //加操作 } else if (SYM==DMINUS){ //-- GetSym(); GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); GEN(LIT,0,1); if (i!=0){ GEN(OPR,0,3); GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); } //减操作 } else if (SYM==PLUSE){ //+= GetSym(); GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); expression_r(FSYS,LEV,TX); if (i!=0){ GEN(OPR,0,2); GEN(STO,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR); } //加操作 } else if (SYM==MINUSE){ //-= GetSym(); GEN(LOD,LEV-TABLE[i].vp.LEVEL,TABLE[i].vp.ADR);
分享到:
收藏