#include "CCG"/* start of cc5 *//* * lval[0] - symbol table address, * else 0 for constant * lval[1] - type of indirect to * fetch, or zero for static object * lval[2] - type pointer or array, * else 0 */fexpress()$(int lval[3];if(hie1(lval))rvalue(lval);$)expression()$(int lval[3];if(hie1(lval))rvalue(lval);while(match(","))$(if(hie1(lval))rvalue(lval);$)$)hie1(lval)int lval[];$(int k,lval2[3];k=hieQuest(lval);if(match("+="))opeq(add,lval,k);else if(match("-="))opeq(sub,lval,k);else if(match("*="))opeq(mult,lval,k);else if(match("/="))opeq(div,lval,k);else if(match("%="))opeq(mod,lval,k);else if(match("<<="))opeq(asl,lval,k);else if(match(">>="))opeq(asr,lval,k);else if(match("&="))opeq(and,lval,k);else if(match("^="))opeq(xor,lval,k);else if(match("|="))opeq(or,lval,k);else if(match("="))$(if(k==0)$(needlval();return 0;$)if(lval[1])push();if(hie1(lval2))rvalue(lval2);store(lval);return 0;$)else return k;return 0;$)opeq(func,lval,k)int func;/* not legal in unix C */int *lval,k;$(char *ptr;int lval2[3];if(k==0)$(needlval();return;$)if(lval[1])push();rvalue(lval); /* load current val */push();if(hieQuest(lval2))rvalue(lval2);if(func==add | func == sub)/* check for pointer arithmatic */if(dbltest(lval,lval2))doublereg();/* call function */(func)(); /* not unix C (sorry) */store(lval);$)hieQuest(lval)int lval[];$(int k,labf,labt;k=hieOr(lval);if(match("?")==0)return k;if(k)rvalue(lval);labf=getlabel();falsejump(labf);expression();labt=getlabel();needcol();jump(labt);outcdf(labf);expression();outcdf(labt);return 0;/* no right value */$)hieOr(lval)int *lval;$(int lab,k,lval2[3];k=hieAnd(lval);blanks();if(streq(line+lptr,"||")==0)return k;if(k)rvalue(lval);lab=getlabel();push();immed();outdec(0);ne();while(match("||"))$(truejump(lab);if(hieAnd(lval2))rvalue(lval2);push();immed();outdec(0);ne();$)outcdf(lab);return 0;$)hieAnd(lval)int *lval;$(int lab,k,lval2[3];k=hie2(lval);blanks();if(streq(line+lptr,"&&")==0)return k;if(k)rvalue(lval);lab=getlabel();push();immed();outdec(0);ne();while(match("&&"))$(falsejump(lab);if(hie2(lval2))rvalue(lval2);push();immed();outdec(0);ne();$)outcdf(lab);return 0;$)hie2(lval)int lval[];$(int k,lval2[3];k=hie3(lval);blanks();if((ch()!='|')| streq(line+lptr,"||")| streq(line+lptr,"|=")) return k;if(k)rvalue(lval);while(1)$(if((streq(line+lptr,"||")==0)& (streq(line+lptr,"|=")==0))$(if(match("|"))$(push();if(hie3(lval2))rvalue(lval2);or();$)else return 0;$)else return 0;$)$)hie3(lval)int lval[];$(int k,lval2[3];k=hie4(lval);blanks();if((ch()!='^')|streq(line+lptr,"^="))return k;if(k)rvalue(lval);while(1)$(if(streq(line+lptr,"^=")==0)$(if(match("^"))$(push();if(hie4(lval2))rvalue(lval2);xor();$)else return 0;$)else return 0;$)$)hie4(lval)int lval[];$(int k,lval2[3];k=hie5(lval);blanks();if((ch()!='&')| streq(line+lptr,"&="))return k;if(k)rvalue(lval);while(1)$(if((streq(line+lptr,"&&")==0)& (streq(line+lptr,"&=")==0))$(if(match("&"))$(push();if(hie5(lval2))rvalue(lval2);and();$)else return 0;$)else return 0;$)$)hie5(lval)int lval[];$(int k,lval2[3];k=hie6(lval);blanks();if((streq(line+lptr,"==")==0)&(streq(line+lptr,"!=")==0))return k;if(k)rvalue(lval);while(1)$(if (match("=="))$(push();if(hie6(lval2))rvalue(lval2);eq();$)else if (match("!="))$(push();if(hie6(lval2))rvalue(lval2);ne();$)else return 0;$)$)hie6(lval)int lval[];$(int k,lval2[3];k=hie7(lval);blanks();if((streq(line+lptr,"<")==0)&(streq(line+lptr,">")==0)&(streq(line+lptr,"<=")==0)&(streq(line+lptr,">=")==0))return k;if(streq(line+lptr,">>")|streq(line+lptr,"<<"))/* this includes "<<=" and ">>=" */return k;if(k)rvalue(lval);while(1)$(if (match("<="))$(push();if(hie7(lval2))rvalue(lval2);if(lval[2] | lval2[2])$(ule();continue;$)le();$)else if (match(">="))$(push();if(hie7(lval2))rvalue(lval2);if(lval[2] | lval2[2])$(uge();continue;$)ge();$)else if((streq(line+lptr,"<"))&(streq(line+lptr,"<<")==0))$(inbyte();push();if(hie7(lval2))rvalue(lval2);if(lval[2] | lval2[2])$(ult();continue;$)lt();$)else if((streq(line+lptr,">"))&(streq(line+lptr,">>")==0))$(inbyte();push();if(hie7(lval2))rvalue(lval2);if(lval[2] | lval2[2])$(ugt();continue;$)gt();$)else return 0;$)$)/* end of cc5 */