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

📄 pass2.c

📁 类PASCAL语言的编译器,LINUX环境的,我没试过是否正确.
💻 C
📖 第 1 页 / 共 4 页
字号:
        CALL(Pass2PutArg(scr, p1data->num[0]));	/* assign type */        if (datain->code==COMP_REF_LOCAL_SYMBOL) {          CALL(Pass2Put(scr, PASS2_ASSIGN_LOCAL_SYMBOL, datain, pass2_list, 5));        } else {          if (datain->code==COMP_REF_GLOBAL_SYMBOL) {            CALL(Pass2Put(scr, PASS2_ASSIGN_GLOBAL_SYMBOL, datain, pass2_list, 5));          } else {            CALL(Pass2PutString(scr, datain->string, datain->strlen));            CALL(Pass2Put(scr, PASS2_ASSIGN_EXPORT_SYMBOL, datain, pass2_list, 5));          }        }        if (bracket_link_first.next) {          CALL(Pass2Link(scr, pass2_list, bracket_link_first.next));          bracket_link_first.next=NULL;        }        p1data=p1data->next;			/* eat assign */        if (p1data->code==COMP_START_OF_EXPR)          p1data=p1data->next;			/* eat begin of expression */          CALL(ParseExpression(scr, &p1data, pass2_list));        CALL(Pass2Put(scr, PASS2_END_OF_EXPR, p1data, pass2_list, 1));      }      break;    case COMP_OPEN_BRACKET:      do {        p1data=p1data->next; 				/* eat bracket */        CALL(Pass2Put(scr, PASS2_OPEN_BRACKET, p1data, &bracket_link, 1));        CALL(ParseExpression(scr, &p1data, &bracket_link));        CALL(Pass2Put(scr, PASS2_CLOSE_BRACKET, p1data, &bracket_link, 1));      } while (p1data->code==COMP_OPEN_BRACKET);      stop=FALSE;      break;    default:      CALL(Pass2PutArg(scr, datain->num[0]));	/* put hash or local number */      if (datain->code==COMP_REF_LOCAL_SYMBOL) {        CALL(Pass2Put(scr, PASS2_REF_LOCAL_SYMBOL, datain, pass2_list, 3));      } else {        if (datain->code==COMP_REF_GLOBAL_SYMBOL) {          CALL(Pass2Put(scr, PASS2_REF_GLOBAL_SYMBOL, datain, pass2_list, 3));        } else {          CALL(Pass2PutString(scr, p1data->string, datain->strlen));          CALL(Pass2Put(scr, PASS2_REF_EXPORT_SYMBOL, datain, pass2_list, 3));        }      }      if (bracket_link_first.next) {        CALL(Pass2Link(scr, pass2_list, bracket_link_first.next));        bracket_link_first.next=NULL;      }      switch(p1data->code) {      case COMP_POSTINC:        CALL(Pass2Put(scr, PASS2_POSTINC, p1data, pass2_list, 1));        p1data=p1data->next;				/* eat me */        break;      case COMP_POSTDEC:        CALL(Pass2Put(scr, PASS2_POSTDEC, p1data, pass2_list, 1));        p1data=p1data->next;				/* eat me */        break;      }      break;    }  } while (!stop);  *p1datapek=p1data;  return FPL_OK;}static ReturnCode ExamineLevel(struct Data *scr, struct Pass1Data **p1datapek,                               struct Pass2Data **pass2_list){  char stop=FALSE;  ReturnCode ret;  struct Pass1Data *p1data=*p1datapek;  struct Pass2Data case_link_first, default_link_first;  struct Pass2Data *case_link=&case_link_first;  struct Pass2Data *default_link=&default_link_first;  struct Pass2Data *initial_link=*pass2_list;  default_link_first.next=NULL;  case_link_first.next=NULL;  if (level>max_level)    max_level=level;  do {    switch(p1data->code) {    case COMP_DECLARE:      {        struct Pass2Data *declare_link=&function_declare_link_first;        struct Pass1Data *ingoingdata=p1data;        long var_number;        if (mainlevel==0)          declare_link=&main_declare_link_first;        CALL(Pass2PutArg(scr, p1data->num[0]));        CALL(Pass2PutArg(scr, p1data->num[1]));        var_number=p1data->num[1];        if (!(p1data->num[0]&FPL_EXPORT_SYMBOL)) {          if (total_number_of_variables<var_number)             total_number_of_variables=var_number;	}        CALL(Pass2PutString(scr, p1data->string, p1data->strlen));        while (declare_link->next && declare_link->next->num[0]<p1data->num[0])          declare_link=declare_link->next;        CALL(Pass2Put(scr, PASS2_DECLARE, p1data, &declare_link, 0));        switch(p1data->next->code) {        case COMP_ASSIGN:          CALL(Pass2PutArg(scr, p1data->num[1]));          CALL(Pass2PutArg(scr, p1data->next->num[0])); /* assign type */          if (p1data->num[0]&FPL_EXPORT_SYMBOL) {            CALL(Pass2PutString(scr, p1data->string, p1data->strlen));            CALL(Pass2Put(scr, PASS2_ASSIGN_EXPORT_SYMBOL, p1data, pass2_list, 5));          } else {            if (p1data->num[0]&FPL_GLOBAL_SYMBOL) {              CALL(Pass2PutString(scr, p1data->string, p1data->strlen));              CALL(Pass2Put(scr, PASS2_ASSIGN_GLOBAL_SYMBOL, p1data, pass2_list, 5));            } else {              CALL(Pass2Put(scr, PASS2_ASSIGN_LOCAL_SYMBOL, p1data, pass2_list, 5));            }          }          p1data=p1data->next;				/* eat declare */          p1data=p1data->next; 				/* eat assign */          p1data=p1data->next; 				/* eat begin of expression */          CALL(ParseExpression(scr, &p1data, pass2_list));          CALL(Pass2Put(scr, PASS2_END_OF_EXPR, p1data, pass2_list, 1));          break;        case COMP_OPEN_BRACKET:  /* [ */          CALL(Pass2PutArg(scr, p1data->num[1]));          if (p1data->num[0]&FPL_EXPORT_SYMBOL) {            CALL(Pass2PutString(scr, p1data->string, p1data->strlen));            CALL(Pass2Put(scr, PASS2_REF_EXPORT_SYMBOL, p1data, pass2_list, 3));          } else {            if (p1data->num[0]&FPL_GLOBAL_SYMBOL) {              CALL(Pass2PutString(scr, p1data->string, p1data->strlen));              CALL(Pass2Put(scr, PASS2_REF_GLOBAL_SYMBOL, p1data, pass2_list, 3));            } else {              CALL(Pass2Put(scr, PASS2_REF_LOCAL_SYMBOL, p1data, pass2_list, 3));            }          }          p1data=p1data->next;				/* eat declare */          CALL(Pass2Put(scr, PASS2_RESIZE, p1data, pass2_list, 1));          do {            p1data=p1data->next; 				/* eat bracket */            CALL(Pass2Put(scr, PASS2_OPEN_BRACKET, p1data, pass2_list, 1));            CALL(ParseExpression(scr, &p1data, pass2_list));            CALL(Pass2Put(scr, PASS2_CLOSE_BRACKET, p1data, pass2_list, 1));          } while (p1data->code==COMP_OPEN_BRACKET);          if (p1data->code==COMP_ASSIGN) {            CALL(Pass2PutArg(scr, ingoingdata->num[1]));            CALL(Pass2PutArg(scr, p1data->num[0])); /* assign type */            if (ingoingdata->num[0]&FPL_EXPORT_SYMBOL) {              CALL(Pass2PutString(scr, ingoingdata->string, ingoingdata->strlen));              CALL(Pass2Put(scr, PASS2_ASSIGN_EXPORT_SYMBOL, ingoingdata, pass2_list, 5));            } else {              if (ingoingdata->num[0]&FPL_GLOBAL_SYMBOL) {                CALL(Pass2Put(scr, PASS2_ASSIGN_GLOBAL_SYMBOL, ingoingdata, pass2_list, 5));              } else {                CALL(Pass2Put(scr, PASS2_ASSIGN_LOCAL_SYMBOL, ingoingdata, pass2_list, 5));              }            }            p1data=p1data->next; 				/* eat assign */            CALL(ParseExpression(scr, &p1data, pass2_list));            CALL(Pass2Put(scr, PASS2_END_OF_EXPR, p1data, pass2_list, 1));          }          break;        default:          {            long type=p1data->num[0];            p1data=p1data->next;				/* eat declare */            if (!(type&(FPL_EXPORT_SYMBOL|FPL_GLOBAL_SYMBOL))) {              CALL(Pass2PutArg(scr, var_number));              CALL(Pass2Put(scr, PASS2_RESET_VARIABLE, p1data, pass2_list, 3));            }          }        }      }      break;    case COMP_END_OF_DECLARE:   /* end of allowed declaration phase */      p1data=p1data->next;	/* eat END OF DECLARE */      break;    case COMP_FUNCTION_DECLARE:      {        struct Pass2Data *declare_link=&main_declare_link_first;        long argument_count=0;        while (declare_link->next && declare_link->next->num[0]<p1data->num[0])          declare_link=declare_link->next;        if (p1data->num[0]&FPL_EXPORT_SYMBOL) {          long label=labelcount;          labelcount++;          CALL(Pass2PutArg(scr, label));          CALL(Pass2Put(scr, PASS2_LABEL, p1data, &function_contain_link, 0));          CALL(Pass2PutString(scr, p1data->string, p1data->strlen));          CALL(Pass2PutArg(scr, p1data->num[0]));          CALL(Pass2PutArg(scr, label));          CALL(Pass2PutArg(scr, p1data->num[1]));          p1data=p1data->next;	/* eat function declare */          CALL(Pass2PutString(scr, p1data->string, p1data->strlen)); /* put param list */          CALL(Pass2Put(scr, PASS2_EXPORT_FUNCTION, p1data, &declare_link, 9));          p1data=p1data->next;	/* eat parameter list */        } else {          if (total_number_of_functions<p1data->num[1])            total_number_of_functions=p1data->num[1];          CALL(Pass2PutString(scr, p1data->string, p1data->strlen));          CALL(Pass2PutArg(scr, p1data->num[1]));          CALL(Pass2Put(scr, PASS2_FUNCTION_START, p1data, &function_contain_link, 0));/*          CALL(Pass2PutString(scr, p1data->string, p1data->strlen));          CALL(Pass2PutArg(scr, p1data->num[0]));          CALL(Pass2PutArg(scr, p1data->num[1]));          CALL(Pass2PutArg(scr, (long)*pass2_list));          CALL(Pass2Put(scr, PASS2_LOCAL_FUNCTION, p1data, &declare_link, 0));*/          p1data=p1data->next;	/* eat function declare */          p1data=p1data->next;	/* eat parameter list */        }        function_start=function_contain_link;        p1data=p1data->next;	/* eat open paren */        while (p1data->code!=COMP_CLOSE_PAREN) {          declare_link=&function_declare_link_first;          CALL(Pass2PutArg(scr, p1data->num[0]));          CALL(Pass2PutArg(scr, p1data->num[1]));          if (total_number_of_variables<p1data->num[1])            total_number_of_variables=p1data->num[1];          CALL(Pass2PutString(scr, p1data->string, p1data->strlen));          while (declare_link->next && declare_link->next->num[0]<p1data->num[0])            declare_link=declare_link->next;          CALL(Pass2Put(scr, PASS2_DECLARE, p1data, &declare_link, 0));          CALL(Pass2PutArg(scr, p1data->num[1]));          CALL(Pass2PutArg(scr, argument_count++));          CALL(Pass2Put(scr, PASS2_ASSIGN_ARGUMENT, p1data, &function_contain_link, 5));          p1data=p1data->next; /* eat declaration */        }        p1data=p1data->next; /* eat close paren */        if (p1data->code==COMP_OPEN_BRACE) {          p1data=p1data->next;	/* eat me */          mainlevel++;          CALL(ExamineLevel(scr, &p1data, &function_contain_link));			/* examine level */          mainlevel--;        }      }      break;    case COMP_MAIN_START:      main_label_number=labelcount;      labelcount++;      mainlevel++;      CALL(Pass2PutArg(scr, main_label_number));      CALL(Pass2Put(scr, PASS2_LABEL, p1data, pass2_list, 0));      function_start=*pass2_list;        /* Falling down */    case COMP_OPEN_BRACE:      p1data=p1data->next;	/* eat me */      CALL(ExamineLevel(scr, &p1data, pass2_list));			/* examine level */      break;    case COMP_MAIN_END:      CALL(Pass2Put(scr, PASS2_EXIT, p1data, pass2_list, 1));      CALL(Pass2Put(scr, PASS2_END_OF_EXPR, p1data, pass2_list, 1));#if 0      if (function_declare_link_first.next) {        CALL(Pass2Link(scr, &function_start, function_declare_link_first.next));      }      function_declare_link=&function_declare_link_first;      function_declare_link_first.next=NULL;#endif      {        struct Pass2Data *declare_link=&main_declare_link_first;        while (declare_link->next)          declare_link=declare_link->next;        CALL(Pass2PutArg(scr, main_label_number));        CALL(Pass2Put(scr, PASS2_MAIN_START, p1data, &declare_link, 3));#if 0        if (main_declare_link_first.next) {          struct Pass2Data *temp=&pass2_first_data;          CALL(Pass2Link(scr, &temp, main_declare_link_first.next));          main_declare_link_first.next=NULL;        }#endif        CALL(Pass2Put(scr, PASS2_MAIN_END, p1data, pass2_list, 0));#if 0        if (function_contain_link_first.next) {          CALL(Pass2Link(scr, pass2_list, function_contain_link_first.next));          function_contain_link_first.next=NULL;        }#endif        CALL(Pass2Put(scr, PASS2_MAIN_END, p1data, pass2_list, 0));        CALL(Pass2Put(scr, PASS2_MAIN_END, p1data, pass2_list, 0));        CALL(Pass2Put(scr, PASS2_MAIN_END, p1data, pass2_list, 0));      }      p1data=p1data->next;	/* eat me */      break;    case COMP_END_OF_FUNCTION:      CALL(Pass2Put(scr, PASS2_RETURN, p1data, &function_contain_link, 1));      CALL(Pass2Put(scr, PASS2_END_OF_EXPR, p1data, &function_contain_link, 1));      CALL(Pass2Put(scr, PASS2_END_OF_FUNCTION, p1data, &function_contain_link, 0));      p1data=p1data->next;	/* eat me */      if (function_declare_link_first.next) {        CALL(Pass2Link(scr, &function_start, function_declare_link_first.next));      }      function_declare_link=&function_declare_link_first;      function_declare_link_first.next=NULL;      break;          case COMP_CLOSE_BRACE:      stop=TRUE;      p1data=p1data->next;	/* eat me */      break;    case COMP_AMOUNT_VARIABLES:      CALL(Pass2PutArg(scr, p1data->num[0]));      CALL(Pass2Put(scr, PASS2_AMOUNT_VARIABLES, p1data, pass2_list, 0));      p1data=p1data->next;	/* eat me */      break;    case COMP_IF:      {        long label=labelcount;        labelcount+=2;        p1data=p1data->next; /* Eat and forget IF */        CALL(Pass2PutArg(scr, label));        CALL(Pass2Put(scr, PASS2_IFNOT_BRANCH_ELSE, p1data, pass2_list, 3));        p1data=p1data->next;				/* Eat begin of expression */        CALL(ParseExpression(scr, &p1data, pass2_list));/* repeat command */        CALL(Pass2Put(scr, PASS2_END_OF_EXPR, p1data, pass2_list, 1));	/* together with IFNOT */        p1data=p1data->next;				/* Eat open brace */

⌨️ 快捷键说明

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