好文档 - 专业文书写作范文服务资料分享网站

PL0源代码(C语言版) - 图文

天下 分享 时间: 加入收藏 我要投稿 点赞

.. . .. . .

addop=sym; /*保存开头的正负号*/ getsymdo; memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlev[plus]=true; nxtlev[minus]=true; termdo(nxtlev,ptx,lev); /*处理项*/ if(addop==minus) { gendo(opr,0,1); /*如果开头为负号生成取负指令*/ } } else /*此时表达式被看作项的加减*/ { memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlev[plus]=true; nxtlev[minus]=true; termdo(nxtlev,ptx,lev); /*处理项*/ } while(sym==plus||sym==minus) { addop=sym; getsymdo; memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlev[plus]=true; nxtlev[minus]=true; termdo(nxtlev,ptx,lev); /*处理项*/ if(addop==plus) { gendo(opr,0,2); /*生成加法指令*/ } else { gendo(opr,0,3); /*生成减法指令*/ } } return 0; } /*

*项处理 */

int term(bool*fsys,int *ptx,int lev) {

enum symbol mulop; /*用于保存乘除法符号*/ bool nxtlev[symnum];

S. . . . . ..

.. . .. . .

memcpy(nxtlev,fsys,sizeof(bool)*symnum) ; nxtlev[times]=true; nxtlev[slash]=true;

factordo(nxtlev,ptx,lev); /*处理因子*/ while(sym==times||sym==slash) { mulop=sym; getsymdo;

factordo(nxtlev,ptx,lev); if(mulop==times) {

gendo(opr,0,4); /*生成乘法指令*/ } else {

gendo(opr,0,5); /*生成除法指令*/ } }

return 0; } /*

*因子处理 */

int factor(bool*fsys,int *ptx,int lev) {

int i;

bool nxtlev[symnum];

testdo(facbegsys,fsys,24); /*检测因子的开始符好号*/

while(inset(sym,facbegsys)) /*循环直到不是因子开始符号*/ {

if(sym==ident) /*因子为常量或者变量*/ {

i=position(id,*ptx); /*查找名字*/ if(i==0) {

error(11); /*标识符未声明*/ } else { switch(table[i].kind) { case constant: 常量*/ gendo(lit,0,table[i].val); S. . . . /*名字为/*直接把常量

. ..

.. . .. . .

的值入栈*/ break; case variable: /*名字为变量*/ gendo(lod,lev-table[i].level,table[i].adr); /*找到变量地址并将其值入栈*/ break; case procedur: /*名字为过程*/ error(21); 过程*/ break; } } getsymdo; } else { if(sym==number) 为数*/ { if(num>amax) { error(31); num=0; } gendo(lit,0,num); getsymdo; } else { if(sym==lparen) 为表达式*/ { getsymdo; memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlev[rparen]=true; expressiondo(nxtlev,ptx,lev); if(sym==rparen) { getsymdo; } else {

S. . . . /*不能为 /*因子 /*因子 . ..

.. . .. . .

error(22); /*缺少右括号*/ } } testdo(fsys,facbegsys,23); /*银子后有非法符号*/ } } } return 0; } /*

条件处理*/

int condition(bool* fsys,int* ptx,int lev) {

enum symbol relop; bool nxtlev[symnum];

if(sym==oddsym) /*准备按照odd运算处理*/ { getsymdo; expressiondo(fsys,ptx,lev); gendo(opr,0,6); /*生成odd指令*/ } else { memcpy(nxtlev,fsys,sizeof(bool)*symnum); nxtlev[eql]=true; nxtlev[neq]=true; nxtlev[lss]=true; nxtlev[leq]=true; nxtlev[gtr]=true; nxtlev[geq]=true; expressiondo(nxtlev,ptx,lev); if(sym!=eql&&sym!=neq&&sym!=lss&&sym!=leq&&sym!=gtr&&sym!=geq) { error(20); } else { relop=sym; getsymdo; expressiondo(fsys,ptx,lev); switch(relop) {

S. . . . . ..

.. . .. . .

case eql: gendo(opr,0,8); break; case neq: gendo(opr,0,9); break; case lss: gendo(opr,0,10); break; case geq: gendo(opr,0,11); break; case gtr: gendo(opr,0,12); break; case leq: gendo(opr,0,13); break; } } }

return 0;

} /*解释程序*/

void interpret() { int p,b,t; /*指令指针,指令基址,栈顶指针*/ struct instruction i; /*存放当前指令*/ int s[stacksize]; /*栈*/ printf(\ t=0; b=0; p=0; s[0]=s[1]=s[2]=0; do{ i=code[p]; /*读当前指令*/ p++; switch(i.f) { case lit: /*将a的值取到栈顶*/ s[t]=i.a; t++; break;

S. . . . . ..

PL0源代码(C语言版) - 图文

.......addop=sym;/*保存开头的正负号*/getsymdo;memcpy(nxtlev,fsys,sizeof(bool)*symnum)
推荐度:
点击下载文档文档为doc格式
9s86n7jcah036aw5tvxo0daes3y30z00x65
领取福利

微信扫码领取福利

微信扫码分享