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

📄 tree.cpp

📁 c语言的简化编译器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* wig tree.c
 *
 * History:
 * 18.10.2000 - created
 * 20.10.2000 - added all functions (empty except makeSERVICE())
 * 23.10.2000 - kasper : implemented rest of the functions, initialized all next pointers to NULL
 */

/* --** Includes: **--------------------------------------------------- */
#include "stdafx.h"

#include "tree.h"
#include "memory.h"
#include "error.h"


/* --** Functions: **-------------------------------------------------- */
struct SCRIPTCOLLECTION *makeSCRIPTCOLLECTION(TOPLEVEL *toplevels)
{
  SCRIPTCOLLECTION *p = NEW(SCRIPTCOLLECTION);
  p->lineno = lineno;
  p->toplevels = toplevels;
  p->sym = NULL;
  return p;
}


struct TOPLEVEL *makeTOPLEVELfunction(FUNCTION *function)
{
  TOPLEVEL *p = NEW(TOPLEVEL);
  p->lineno = lineno;
  p->kind = functionK;
  p->val.functionT = function;
  p->next = NULL;
  return p;
}

struct TOPLEVEL *makeTOPLEVELprogram(PROGRAM *program)
{
  TOPLEVEL *p = NEW(TOPLEVEL);
  p->lineno = lineno;
  p->kind = programK;
  p->val.programT = program;
  p->next = NULL;
  return p;
}

/* chenhongyu, 2004-9-17 */
/* 全局变量, 这里存在一些问题, 呵呵 */
struct TOPLEVEL *makeTOPLEVELsimpledecl(DECL *d)
{
  TOPLEVEL *p = NEW(TOPLEVEL);
  p->lineno = lineno;
  p->kind = simpledeclK;
  d->globel = 1;
  p->val.decl = d;
  p->next = NULL;
  return p;
}

struct FUNCTION *makeFUNCTION(char *name,struct TYPE *type,struct DECL *formals,struct STM *stms)
{
  FUNCTION *p = NEW(FUNCTION);
  p->lineno = lineno;
  p->name = name;
  p->type = type;
  p->formals = formals;
  p->stms = stms;
  p->sym = NULL;
  p->opcodes = NULL;
  p->labels = NULL;
  return p;
}

struct TRIGGER *makeTRIGGERonclick(char *name)
{
 TRIGGER *p = NEW(TRIGGER);	
 p->lineno = lineno;
 p->name = name;
 p->kind = trigger_on_clickK;
 return p;
}

struct TRIGGER *makeTRIGGERoncollide(char *name)
{
 TRIGGER *p = NEW(TRIGGER);	
 p->lineno = lineno;
 p->name = name;
 p->kind = trigger_on_collideK;
 return p;
}

struct TRIGGER *makeTRIGGERonpickup(char *name)
{
 TRIGGER *p = NEW(TRIGGER);	
 p->lineno = lineno;
 p->name = name;
 p->kind = trigger_on_pickupK;
 return p; 
}

struct TRIGGER *makeTRIGGERoninit()
{
 TRIGGER *p = NEW(TRIGGER);	
 p->lineno = lineno;
 p->name = NULL;
 p->kind = trigger_on_initK;
 return p;
}


struct PROGRAM *makePROGRAM(char *name, struct TRIGGER *trigger, struct STM *stms)
{
  PROGRAM *p = NEW(PROGRAM);
  p->lineno = lineno;
  p->name = name;
  p->trigger = trigger;
  p->stms = stms;
  p->sym = NULL;
  return p;
}

struct TYPE *makeTYPEbool()
{
  TYPE *p = NEW(TYPE);
  p->lineno = lineno;
  p->kind = boolK;
  return p;
}

struct TYPE *makeTYPEint()
{
  TYPE *p = NEW(TYPE);
  p->lineno = lineno;
  p->kind = intK;
  return p;
}


struct TYPE *makeTYPEstring()
{
  TYPE *p = NEW(TYPE);
  p->lineno = lineno;
  p->kind = stringK;
  return p;
}

struct TYPE *makeTYPEvoid()
{
  TYPE *p = NEW(TYPE);
  p->lineno = lineno;
  p->kind = voidK;
  return p;
}


struct DECL *makeDECLformal(struct TYPE *type, char *name)
{
  DECL *p = NEW(DECL);
  p->type = NULL;
  p->next = NULL;
  p->lineno = lineno;
  p->globel = 0;            /* chenhongyu, 2004-9-17. */
  p->kind = formalK;
  p->type = type;
  p->val.formalD.name = name;
  return p;
}

struct DECL *makeDECLvariable(ModifierKind modifier, struct TYPE *type, struct IDENTIFIER *identifiers, struct EXP *initialization)
{
  DECL *p = NEW(DECL);
  p->type = NULL;
  p->next = NULL;
  p->lineno = lineno;
  p->globel = 0;
  p->kind = variableK;
  p->val.variableD.modifier = modifier;
  p->type = type;
  p->val.variableD.identifiers = identifiers;
  p->val.variableD.initialization = initialization;
  return p;
}

struct DECL *makeDECLsimplevar(struct TYPE *type, char *name, struct EXP *initialization)
{
  DECL *p = NEW(DECL);
  p->type = NULL;
  p->next = NULL;
  p->lineno = lineno;
  p->globel = 0;
  p->kind = simplevarK;
  p->type = type;
  p->val.simplevarD.name = name;
  p->val.simplevarD.initialization = initialization;
  return p;
}

struct FORINIT *makeFORINITdecl(DECL *decl)
{
  FORINIT *p = NEW(FORINIT);
  p->lineno = lineno;
  p->kind = declforinitK;
  p->val.declforinitF = decl;
  p->next = NULL;

  return p;
}

struct FORINIT *makeFORINITexp(EXP *exp)
{
  FORINIT *p = NEW(FORINIT);
  p->lineno = lineno;
  p->kind = expforinitK;
  p->val.expforinitF = exp;
  p->next = NULL;

  return p;
}

struct STM *makeSTMskip()
{
  STM *p = NEW(STM);
  p->lineno = lineno;
  p->kind = skipK;
  return p;
}

struct STM *makeSTMdecl(struct DECL *decl)
{
  STM *p = NEW(STM);
  p->lineno = lineno;
  p->kind = declstmK;
  p->val.declstmS = decl;
  return p; 
}

struct STM *makeSTMexp(struct EXP *exp)
{
  STM *p = NEW(STM);
  p->lineno = lineno;
  p->kind = expK;
  p->val.expS = exp;
  return p;
}

struct STM *makeSTMreturn(struct EXP *exp)
{
  STM *p = NEW(STM);
  p->lineno = lineno;
  p->kind = returnK;
  p->val.returnS.exp = exp;
  return p;
}
struct STM *makeSTMif(struct EXP *condition,struct STM *body)
{
  STM *p = NEW(STM);
  p->lineno = lineno;
  p->kind = ifK;
  p->val.ifS.condition = condition;
  p->val.ifS.body = body;
  return p;
}
struct STM *makeSTMifelse(struct EXP *condition,struct STM *thenpart,struct STM *elsepart)
{
  STM *p = NEW(STM);
  p->lineno = lineno;
  p->kind = ifelseK;
  p->val.ifelseS.condition = condition;
  p->val.ifelseS.thenpart = thenpart;
  p->val.ifelseS.elsepart = elsepart; 
  return p;
}
struct STM *makeSTMwhile(struct EXP *condition,struct STM *body)
{
  STM *p = NEW(STM);
  p->lineno = lineno;
  p->kind = whileK;
  p->val.whileS.condition = condition;
  p->val.whileS.body = body;
  return p;
}

struct STM *makeSTMfor(struct FORINIT *inits, struct EXP *condition, struct EXP *updates, struct STM *body)
{
  STM *p = NEW(STM);
  p->lineno = lineno;
  p->kind = forK;
  p->val.forS.inits = inits;
  p->val.forS.condition = condition;
  p->val.forS.updates = updates;
  p->val.forS.body = body;

  return p;
}

struct STM *makeSTMsequence(struct STM *first,struct STM *second)
{
  STM *p = NEW(STM);
  p->lineno = lineno;
  p->kind = sequenceK;
  p->val.sequenceS.first = first;
  p->val.sequenceS.second = second;
  return p;
}

struct STM *makeSTMscope(struct STM *stm)
{
  STM *p = NEW(STM);
  p->lineno = lineno;
  p->kind = scopeK;
  p->val.scopeS.sym = NULL;
  p->val.scopeS.stm = stm;
  return p;
}

struct STM *makeSTMsetint(EntityKind kind, struct EXP *modelname, struct EXP *nr, struct EXP *val)
{	
  STM *p = NEW(STM);
  p->lineno = lineno;
  p->kind = setintK;
  p->val.setintS.kind = kind;
  p->val.setintS.modelname = modelname;
  p->val.setintS.nr = nr;
  p->val.setintS.val = val;
  return p;	
}


struct STM *makeSTMsleep(struct EXP *time) 
{
  STM *p = NEW(STM);
  p->lineno = lineno;
  p->kind = sleepK;
  p->val.sleepS.time = time;
  return p;	
}


struct IDENTIFIER *makeIDENTIFIER(char *name)
{
  IDENTIFIER *p = NEW(IDENTIFIER);
  p->lineno = lineno;
  p->name = name;
  p->next = NULL;
  return p;
}

struct EXP *makeEXPintconst(int value)
{
  EXP *p = NEW(EXP);
  p->type = NULL;
  p->lineno = lineno;
  p->kind = intconstK;
  p->val.intconstE = value;
  p->next = NULL;
  return p;
}


struct EXP *makeEXPboolconst(int value)
{
  EXP *p = NEW(EXP);
  p->type = NULL;
  p->lineno = lineno;
  p->kind = boolconstK;
  p->val.boolconstE = value;
  p->next = NULL;
  return p;
}

struct EXP *makeEXPstringconst(char *value)
{
  EXP *p = NEW(EXP);
  p->type = NULL;
  p->lineno = lineno;
  p->kind = stringconstK;
  p->val.stringconstE = value;
  p->next = NULL;
  return p;
}


struct EXP *makeEXPuminus(struct EXP *exp)
{
  EXP *p = NEW(EXP);
  p->type = NULL;
  p->lineno = lineno;
  p->kind = uminusK;
  p->val.uminusE = exp;
  p->next = NULL;
  return p;
}


struct EXP *makeEXPnot(struct EXP *exp)
{
  EXP *p = NEW(EXP);
  p->type = NULL;
  p->lineno = lineno;
  p->kind = notK;
  p->val.notE.exp = exp;
  p->next = NULL;
  return p;
}



struct EXP *makeEXPlvalue(struct LVALUE *lvalue)
{
  EXP *p = NEW(EXP);
  p->type = NULL;
  p->lineno = lineno;
  p->kind = lvalueK;
  p->val.lvalueE = lvalue;
  p->next = NULL;
  return p;
}

struct EXP *makeEXPassignment(struct LVALUE *lvalue, struct EXP *right)
{
  EXP *p = NEW(EXP);
  p->type = NULL;
  p->lineno = lineno;
  p->kind = assignmentK;
  p->val.assignmentE.left = lvalue;
  p->val.assignmentE.right = right;
  p->next = NULL;
  return p;
}

struct EXP *makeEXPequals(struct EXP *left, struct EXP *right)
{
  EXP *p = NEW(EXP);
  p->type = NULL;
  p->lineno = lineno;
  p->kind = equalsK;
  p->val.equalsE.left = left;
  p->val.equalsE.right = right;
  p->next = NULL;
  return p;
}

struct EXP *makeEXPnequals(struct EXP *left,struct  EXP *right)
{
  EXP *p = NEW(EXP);
  p->type = NULL;
  p->lineno = lineno;
  p->kind = nequalsK;
  p->val.nequalsE.left = left;
  p->val.nequalsE.right = right;
  p->next = NULL;
  return p;
}

struct EXP *makeEXPless(struct EXP *left,struct  EXP *right)
{
  EXP *p = NEW(EXP);
  p->type = NULL;
  p->lineno = lineno;
  p->kind = lessK;
  p->val.lessE.left = left;
  p->val.lessE.right = right;
  p->next = NULL;
  return p;
}

struct EXP *makeEXPgreater(struct EXP *left, struct EXP *right)
{
  EXP *p = NEW(EXP);
  p->type = NULL;
  p->lineno = lineno;
  p->kind = greaterK;
  p->val.greaterE.left = left;
  p->val.greaterE.right = right;
  p->next = NULL;
  return p;
}

struct EXP *makeEXPlequals(struct EXP *left, struct EXP *right)
{
  EXP *p = NEW(EXP);
  p->type = NULL;
  p->lineno = lineno;
  p->kind = lequalsK;
  p->val.lequalsE.left = left;
  p->val.lequalsE.right = right;
  p->next = NULL;
  return p;
}

struct EXP *makeEXPgequals(struct EXP *left, struct EXP *right)
{
  EXP *p = NEW(EXP);
  p->type = NULL;
  p->lineno = lineno;
  p->kind = gequalsK;
  p->val.gequalsE.left = left;
  p->val.gequalsE.right = right;
  p->next = NULL;
  return p;
}

struct EXP *makeEXPplus(struct EXP *left, struct EXP *right)
{
  EXP *p = NEW(EXP);
  p->type = NULL;
  p->lineno = lineno;

⌨️ 快捷键说明

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