C4.docx
- 文档编号:16656377
- 上传时间:2023-07-16
- 格式:DOCX
- 页数:46
- 大小:20.96KB
C4.docx
《C4.docx》由会员分享,可在线阅读,更多相关《C4.docx(46页珍藏版)》请在冰点文库上搜索。
C4
//c4.c-Cinfourfunctions
//char,int,andpointertypes
//if,while,return,andexpressionstatements
//justenoughfeaturestoallowself-compilationandabitmore
//WrittenbyRobertSwierczek
#include
#include
#include
#include
char*p,*lp,//currentpositioninsourcecode
*data;//data/bsspointer
int*e,*le,//currentpositioninemittedcode
*id,//currentlyparsedidentifier
*sym,//symboltable(simplelistofidentifiers)
tk,//currenttoken
ival,//currenttokenvalue
ty,//currentexpressiontype
loc,//localvariableoffset
line,//currentlinenumber
src,//printsourceandassemblyflag
debug;//printexecutedinstructions
//tokensandclasses(operatorslastandinprecedenceorder)
enum{
Num=128,Fun,Sys,Glo,Loc,Id,
Char,Else,Enum,If,Int,Return,Sizeof,While,
Assign,Cond,Lor,Lan,Or,Xor,And,Eq,Ne,Lt,Gt,Le,Ge,Shl,Shr,Add,Sub,Mul,Div,Mod,Inc,Dec,Brak
};
//opcodes
enum{LEA,IMM,JMP,JSR,BZ,BNZ,ENT,ADJ,LEV,LI,LC,SI,SC,PSH,
OR,XOR,AND,EQ,NE,LT,GT,LE,GE,SHL,SHR,ADD,SUB,MUL,DIV,MOD,
OPEN,READ,CLOS,PRTF,MALC,MSET,MCMP,EXIT};
//types
enum{CHAR,INT,PTR};
//identifieroffsets(sincewecan'tcreateanidentstruct)
enum{Tk,Hash,Name,Class,Type,Val,HClass,HType,HVal,Idsz};
voidnext()
{
char*pp;
while(tk=*p){
++p;
if(tk=='\n'){
if(src){
printf("%d:
%.*s",line,p-lp,lp);
lp=p;
while(le printf("%8.4s",&"LEA,IMM,JMP,JSR,BZ,BNZ,ENT,ADJ,LEV,LI,LC,SI,SC,PSH," "OR,XOR,AND,EQ,NE,LT,GT,LE,GE,SHL,SHR,ADD,SUB,MUL,DIV,MOD," "OPEN,READ,CLOS,PRTF,MALC,MSET,MCMP,EXIT,"[*++le*5]); if(*le<=ADJ)printf("%d\n",*++le);elseprintf("\n"); } } ++line; } elseif(tk=='#'){ while(*p! =0&&*p! ='\n')++p; } elseif((tk>='a'&&tk<='z')||(tk>='A'&&tk<='Z')||tk=='_'){ pp=p-1; while((*p>='a'&&*p<='z')||(*p>='A'&&*p<='Z')||(*p>='0'&&*p<='9')||*p=='_') tk=tk*147+*p++; tk=(tk<<6)+(p-pp); id=sym; while(id[Tk]){ if(tk==id[Hash]&&! memcmp((char*)id[Name],pp,p-pp)){tk=id[Tk];return;} id=id+Idsz; } id[Name]=(int)pp; id[Hash]=tk; tk=id[Tk]=Id; return; } elseif(tk>='0'&&tk<='9'){ if(ival=tk-'0'){while(*p>='0'&&*p<='9')ival=ival*10+*p++-'0';} elseif(*p=='x'||*p=='X'){ while((tk=*++p)&&((tk>='0'&&tk<='9')||(tk>='a'&&tk<='f')||(tk>='A'&&tk<='F'))) ival=ival*16+(tk&15)+(tk>='A'? 9: 0); } else{while(*p>='0'&&*p<='7')ival=ival*8+*p++-'0';} tk=Num; return; } elseif(tk=='/'){ if(*p=='/'){ ++p; while(*p! =0&&*p! ='\n')++p; } else{ tk=Div; return; } } elseif(tk=='\''||tk=='"'){ pp=data; while(*p! =0&&*p! =tk){ if((ival=*p++)=='\\'){ if((ival=*p++)=='n')ival='\n'; } if(tk=='"')*data++=ival; } ++p; if(tk=='"')ival=(int)pp;elsetk=Num; return; } elseif(tk=='='){if(*p=='='){++p;tk=Eq;}elsetk=Assign;return;} elseif(tk=='+'){if(*p=='+'){++p;tk=Inc;}elsetk=Add;return;} elseif(tk=='-'){if(*p=='-'){++p;tk=Dec;}elsetk=Sub;return;} elseif(tk=='! '){if(*p=='='){++p;tk=Ne;}return;} elseif(tk=='<'){if(*p=='='){++p;tk=Le;}elseif(*p=='<'){++p;tk=Shl;}elsetk=Lt;return;} elseif(tk=='>'){if(*p=='='){++p;tk=Ge;}elseif(*p=='>'){++p;tk=Shr;}elsetk=Gt;return;} elseif(tk=='|'){if(*p=='|'){++p;tk=Lor;}elsetk=Or;return;} elseif(tk=='&'){if(*p=='&'){++p;tk=Lan;}elsetk=And;return;} elseif(tk=='^'){tk=Xor;return;} elseif(tk=='%'){tk=Mod;return;} elseif(tk=='*'){tk=Mul;return;} elseif(tk=='['){tk=Brak;return;} elseif(tk=='? '){tk=Cond;return;} elseif(tk=='~'||tk==';'||tk=='{'||tk=='}'||tk=='('||tk==')'||tk==']'||tk==','||tk==': ')return; } } voidexpr(intlev) { intt,*d; if(! tk){printf("%d: unexpectedeofinexpression\n",line);exit(-1);} elseif(tk==Num){*++e=IMM;*++e=ival;next();ty=INT;} elseif(tk=='"'){ *++e=IMM;*++e=ival;next(); while(tk=='"')next(); data=(char*)((int)data+sizeof(int)&-sizeof(int));ty=PTR; } elseif(tk==Sizeof){ next();if(tk=='(')next();else{printf("%d: openparenexpectedinsizeof\n",line);exit(-1);} ty=INT;if(tk==Int)next();elseif(tk==Char){next();ty=CHAR;} while(tk==Mul){next();ty=ty+PTR;} if(tk==')')next();else{printf("%d: closeparenexpectedinsizeof\n",line);exit(-1);} *++e=IMM;*++e=(ty==CHAR)? sizeof(char): sizeof(int); ty=INT; } elseif(tk==Id){ d=id;next(); if(tk=='('){ next(); t=0; while(tk! =')'){expr(Assign);*++e=PSH;++t;if(tk==',')next();} next(); if(d[Class]==Sys)*++e=d[Val]; elseif(d[Class]==Fun){*++e=JSR;*++e=d[Val];} else{printf("%d: badfunctioncall\n",line);exit(-1);} if(t){*++e=ADJ;*++e=t;} ty=d[Type]; } elseif(d[Class]==Num){*++e=IMM;*++e=d[Val];ty=INT;} else{ if(d[Class]==Loc){*++e=LEA;*++e=loc-d[Val];} elseif(d[Class]==Glo){*++e=IMM;*++e=d[Val];} else{printf("%d: undefinedvariable\n",line);exit(-1);} *++e=((ty=d[Type])==CHAR)? LC: LI; } } elseif(tk=='('){ next(); if(tk==Int||tk==Char){ t=(tk==Int)? INT: CHAR;next(); while(tk==Mul){next();t=t+PTR;} if(tk==')')next();else{printf("%d: badcast\n",line);exit(-1);} expr(Inc); ty=t; } else{ expr(Assign); if(tk==')')next();else{printf("%d: closeparenexpected\n",line);exit(-1);} } } elseif(tk==Mul){ next();expr(Inc); if(ty>INT)ty=ty-PTR;else{printf("%d: baddereference\n",line);exit(-1);} *++e=(ty==CHAR)? LC: LI; } elseif(tk==And){ next();expr(Inc); if(*e==LC||*e==LI)--e;else{printf("%d: badaddress-of\n",line);exit(-1);} ty=ty+PTR; } elseif(tk=='! '){next();expr(Inc);*++e=PSH;*++e=IMM;*++e=0;*++e=EQ;ty=INT;} elseif(tk=='~'){next();expr(Inc);*++e=PSH;*++e=IMM;*++e=-1;*++e=XOR;ty=INT;} elseif(tk==Add){next();expr(Inc);ty=INT;} elseif(tk==Sub){ next();*++e=IMM; if(tk==Num){*++e=-ival;next();}else{*++e=-1;*++e=PSH;expr(Inc);*++e=MUL;} ty=INT; } elseif(tk==Inc||tk==Dec){ t=tk;next();expr(Inc); if(*e==LC){*e=PSH;*++e=LC;} elseif(*e==LI){*e=PSH;*++e=LI;} else{printf("%d: badlvalueinpre-increment\n",line);exit(-1);} *++e=PSH; *++e=IMM;*++e=(ty>PTR)? sizeof(int): sizeof(char); *++e=(t==Inc)? ADD: SUB; *++e=(ty==CHAR)? SC: SI; } else{printf("%d: badexpression\n",line);exit(-1);} while(tk>=lev){//"precedenceclimbing"or"TopDownOperatorPrecedence"method t=ty; if(tk==Assign){ next(); if(*e==LC||*e==LI)*e=PSH;else{printf("%d: badlvalueinassignment\n",line);exit(-1);} expr(Assign);*++e=((ty=t)==CHAR)? SC: SI; } elseif(tk==Cond){ next(); *++e=BZ;d=++e; expr(Assign); if(tk==': ')next();else{printf("%d: conditionalmissingcolon\n",line);exit(-1);} *d=(int)(e+3);*++e=JMP;d=++e; expr(Cond); *d=(int)(e+1); } elseif(tk==Lor){next();*++e=BNZ;d=++e;expr(Lan);*d=(int)(e+1);ty=INT;} elseif(tk==Lan){next();*++e=BZ;d=++e;expr(Or);*d=(int)(e+1);ty=INT;} elseif(tk==Or){next();*++e=PSH;expr(Xor);*++e=OR;ty=INT;} elseif(tk==Xor){next();*++e=PSH;expr(And);*++e=XOR;ty=INT;} elseif(tk==And){next();*++e=PSH;expr(Eq);*++e=AND;ty=INT;} elseif(tk==Eq){next();*++e=PSH;expr(Lt);*++e=EQ;ty=INT;} elseif(tk==Ne){next();*++e=PSH;expr(Lt);*++e=NE;ty=INT;} elseif(tk==Lt){next();*++e=PSH;expr(Shl);*++e=LT;ty=INT;} elseif(tk==Gt){next();*++e=PSH;expr(Shl);*++e=GT;ty=INT;} elseif(tk==Le){next();*++e=PSH;expr(Shl);*++e=LE;ty=INT;} elseif(tk==Ge){next();*++e=PSH;expr(Shl);*++e=GE;ty=INT;} elseif(tk==Shl){next();*++e=PSH;expr(Add);*++e=SHL;ty=INT;} elseif(tk==Shr){next();*++e=PSH;expr(Add);*++e=SHR;ty=INT;} elseif(tk==Add){ next();*++e=PSH;expr(Mul); if((ty=t)>PTR){*++e=PSH;*++e=IMM;*++e=sizeof(int);*++e=MUL;} *++e=ADD; } elseif(tk==Sub){ next();*++e=PSH;expr(Mul); if(t>PTR&&t==ty){*++e=SUB;*++e=PSH;*++e
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- C4