⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 symbol.c

📁 雏形java的解释器源码。配合flex和bison可以工作
💻 C
📖 第 1 页 / 共 2 页
字号:
{ SYMBOL *s;  if (f!=NULL) {     symImplementationFIELD(f->next,sym);     symTYPE(f->type,sym);     if (defSymbol(sym,f->name)) {        reportStrError("field name %s already declared",f->name,f->lineno);     } else {        s = putSymbol(sym,f->name,fieldSym);        s->val.fieldS = f;     }  }}void symImplementationCONSTRUCTOR(CONSTRUCTOR *c, CLASS *this, SymbolTable *sym){ SymbolTable *csym;  if (c!=NULL) {     symImplementationCONSTRUCTOR(c->next,this,sym);     csym = scopeSymbolTable(sym);     symImplementationFORMAL(c->formals,csym);     symImplementationSTATEMENT(c->statements,this,csym,0);  }}void symImplementationMETHOD(METHOD *m, CLASS *this, SymbolTable *sym){ SymbolTable *msym;  if (m!=NULL) {     symImplementationMETHOD(m->next,this,sym);     msym = scopeSymbolTable(sym);     symImplementationFORMAL(m->formals,msym);     symImplementationSTATEMENT(m->statements,this,msym,m->modifier==staticMod);  }}void symImplementationFORMAL(FORMAL *f, SymbolTable *sym){ SYMBOL *s;  if (f!=NULL) {     symImplementationFORMAL(f->next,sym);     if (defSymbol(sym,f->name)) {        reportStrError("formal %s already declared",f->name,f->lineno);     } else {        s = putSymbol(sym,f->name,formalSym);        s->val.formalS = f;     }  }}void symImplementationLOCAL(LOCAL *l, SymbolTable *sym){ SYMBOL *s;  if (l!=NULL) {     symImplementationLOCAL(l->next,sym);     symTYPE(l->type,sym);     if (defSymbol(sym,l->name)) {        reportStrError("local %s already declared",l->name,l->lineno);     } else {        s = putSymbol(sym,l->name,localSym);        s->val.localS = l;     }  }}void symImplementationSTATEMENT(STATEMENT *s, CLASS *this, SymbolTable *sym, int stat){ SymbolTable *ssym;  if (s!=NULL) {     switch (s->kind) {       case skipK:            break;       case localK:            symImplementationLOCAL(s->val.localS,sym);            break;       case expK:            symImplementationEXP(s->val.expS,this,sym,stat);            break;       case returnK:            if (s->val.returnS!=NULL) {               symImplementationEXP(s->val.returnS,this,sym,stat);            }            break;       case sequenceK:            symImplementationSTATEMENT(s->val.sequenceS.first,this,sym,stat);            symImplementationSTATEMENT(s->val.sequenceS.second,this,sym,stat);            break;       case ifK:            symImplementationEXP(s->val.ifS.condition,this,sym,stat);            symImplementationSTATEMENT(s->val.ifS.body,this,sym,stat);            break;       case ifelseK:            symImplementationEXP(s->val.ifelseS.condition,this,sym,stat);            symImplementationSTATEMENT(s->val.ifelseS.thenpart,this,sym,stat);            symImplementationSTATEMENT(s->val.ifelseS.elsepart,this,sym,stat);            break;       case whileK:	    /* LJH - fixed Oct 13/99             symImplementationEXP(s->val.ifS.condition,this,sym,stat);            symImplementationSTATEMENT(s->val.ifS.body,this,sym,stat);	    */            symImplementationEXP(s->val.whileS.condition,this,sym,stat);            symImplementationSTATEMENT(s->val.whileS.body,this,sym,stat);            break;       case blockK:            ssym = scopeSymbolTable(sym);            symImplementationSTATEMENT(s->val.blockS.body,this,ssym,stat);            break;       case superconsK:            symImplementationARGUMENT(s->val.superconsS.args,this,sym,stat);            if (this->parent==NULL) s->val.superconsS.constructor = NULL;            else s->val.superconsS.constructor = this->parent->constructors;            break;     }  }}SYMBOL *symVar(char *name, SymbolTable *sym, CLASS *this, int lineno, int stat){ SYMBOL *s;  s = getSymbol(sym,name);  if (s==NULL) {     s = lookupHierarchy(name,this);     if (s==NULL) {        reportStrError("identifier %s not declared",name,lineno);     } else {        if (s->kind!=fieldSym) {           reportStrError("%s is not a variable as expected",name,lineno);        }     }  } else {     if ((s->kind!=fieldSym) && (s->kind!=formalSym) && (s->kind!=localSym)) {        reportStrError("%s is not a variable as expected",name,lineno);     }  }  if (s!=NULL && s->kind==fieldSym && stat) {     reportStrError("illegal static reference to %s",name,lineno);  }  return s;}CLASS *symClass(char *name, SymbolTable *sym, int lineno){ SYMBOL *s;  s = getSymbol(sym,name);  if (s==NULL) {     reportStrError("identifier %s not declared",name,lineno);     return(NULL); /* LJH added to avoid core dump */  } else {     if (s->kind!=classSym) {        reportStrError("class with name %s expected",name,lineno);        return(NULL); /* LJH added because s might not be a class */     }  }  return s->val.classS;}void symImplementationEXP(EXP *e, CLASS *this, SymbolTable *sym, int stat){ switch (e->kind) {    case idK:         e->val.idE.idsym = symVar(e->val.idE.name,sym,this,e->lineno,stat);         break;    case assignK:         e->val.assignE.leftsym = symVar(e->val.assignE.left,sym,this,e->lineno,stat);         symImplementationEXP(e->val.assignE.right,this,sym,stat);         break;    case orK:         symImplementationEXP(e->val.orE.left,this,sym,stat);         symImplementationEXP(e->val.orE.right,this,sym,stat);         break;    case andK:         symImplementationEXP(e->val.andE.left,this,sym,stat);         symImplementationEXP(e->val.andE.right,this,sym,stat);         break;    case eqK:         symImplementationEXP(e->val.eqE.left,this,sym,stat);         symImplementationEXP(e->val.eqE.right,this,sym,stat);         break;    case ltK:         symImplementationEXP(e->val.ltE.left,this,sym,stat);         symImplementationEXP(e->val.ltE.right,this,sym,stat);         break;    case gtK:         symImplementationEXP(e->val.gtE.left,this,sym,stat);         symImplementationEXP(e->val.gtE.right,this,sym,stat);         break;    case leqK:         symImplementationEXP(e->val.leqE.left,this,sym,stat);         symImplementationEXP(e->val.leqE.right,this,sym,stat);         break;    case geqK:         symImplementationEXP(e->val.geqE.left,this,sym,stat);         symImplementationEXP(e->val.geqE.right,this,sym,stat);         break;    case neqK:         symImplementationEXP(e->val.neqE.left,this,sym,stat);         symImplementationEXP(e->val.neqE.right,this,sym,stat);         break;    case instanceofK:         symImplementationEXP(e->val.instanceofE.left,this,sym,stat);         e->val.instanceofE.class = symClass(e->val.instanceofE.right,sym,e->lineno);         break;    case plusK:         symImplementationEXP(e->val.plusE.left,this,sym,stat);         symImplementationEXP(e->val.plusE.right,this,sym,stat);         break;    case minusK:         symImplementationEXP(e->val.minusE.left,this,sym,stat);         symImplementationEXP(e->val.minusE.right,this,sym,stat);         break;    case timesK:         symImplementationEXP(e->val.timesE.left,this,sym,stat);         symImplementationEXP(e->val.timesE.right,this,sym,stat);         break;    case divK:         symImplementationEXP(e->val.divE.left,this,sym,stat);         symImplementationEXP(e->val.divE.right,this,sym,stat);         break;    case modK:         symImplementationEXP(e->val.modE.left,this,sym,stat);         symImplementationEXP(e->val.modE.right,this,sym,stat);         break;    case notK:         symImplementationEXP(e->val.notE.not,this,sym,stat);         break;    case uminusK:         symImplementationEXP(e->val.uminusE,this,sym,stat);         break;    case thisK:         break;    case newK:         e->val.newE.class = symClass(e->val.newE.name,sym,e->lineno);         symImplementationARGUMENT(e->val.newE.args,this,sym,stat);         break;    case invokeK:         symImplementationRECEIVER(e->val.invokeE.receiver,this,sym,stat);         symImplementationARGUMENT(e->val.invokeE.args,this,sym,stat);         break;    case intconstK:         break;    case boolconstK:         break;    case charconstK:         break;    case stringconstK:         break;    case nullK:         break;    case castK:         e->val.castE.class = symClass(e->val.castE.left,sym,e->lineno);         symImplementationEXP(e->val.castE.right,this,sym,stat);         break;    case charcastK:         symImplementationEXP(e->val.charcastE,this,sym,stat);         break;  }}void symImplementationRECEIVER(RECEIVER *r, CLASS *this, SymbolTable *sym, int stat){ switch (r->kind) {    case objectK:         symImplementationEXP(r->objectR,this,sym,stat);         break;    case superK:         break;  }}void symImplementationARGUMENT(ARGUMENT *a, CLASS *this, SymbolTable *sym, int stat){ if (a!=NULL) {     symImplementationARGUMENT(a->next,this,sym,stat);     symImplementationEXP(a->exp,this,sym,stat);  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -