亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來(lái)到蟲(chóng)蟲(chóng)下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲(chóng)蟲(chóng)下載站

?? analyze.cpp

?? 小型編譯系統(tǒng)的源代碼
?? CPP
字號(hào):
#include "analyze.h"
#include "globals.h"
#include "symtab.h"

/* Procedure traverse is a generic recursive 
 * syntax tree traversal routine:
 * it applies preProc in preorder and postProc 
 * in postorder to tree pointed to by t
 */
static void traverse( TreeNode * t,
               int (* preProc) (TreeNode *),
               int (* postProc) (TreeNode *) )
{ if (t != NULL)
  { int result = preProc(t);
		if (result!= SKIP)
    { int i;
      for (i=0; i < MAXCHILDREN; i++)
        traverse(t->child[i],preProc,postProc);
    }
    postProc(t);
    traverse(t->sibling,preProc,postProc);
  }
}

/* nullProc is a do-nothing procedure to 
 * generate preorder-only or postorder-only
 * traversals from traverse
 */
static int nullProc(TreeNode * t)
{ if (t==NULL) return SUCCESS;
  else return SUCCESS;
}

static int insertNode( TreeNode * t)
{ 
	Result result;entryType et;
	switch (t->nodekind){ 
	case StmtK:
    switch (t->kind.stmt){  
		case CompoundK:
				st_newBuck();
				//for (tt = t->child[0]; tt!=NULL; tt = tt->sibling)
				//	insertNode(tt);
				traverse(t->child[0],insertNode,nullProc);
				st_delBuck();
				return SKIP; 
    default:
        break;
    }
    break;
	case DeclK:
		switch (t->kind.decl){
		case VarDeclK:
			TreeNode * tt;
			int res;
			for (tt = t->child[1]; tt!=NULL; tt=tt->sibling){
				if (tt->kind.exp == IdK)
					res = st_insert(tt->attr.name,t->lineno,t->child[0]->attr.vartype,IdK);
				else 
					res = st_insert(tt->attr.name,t->lineno,t->child[0]->attr.vartype,ArrayK, tt->child[0]->attr.vali);
				if (res == FAIL){
				/*error: redeclaration of variable*/
						Error = TRUE;
						fprintf(listing,"Error! Line %d, redeclaration of variable.\n",t->lineno);
				}
  			else {
  				tt->type = tt->attr.vartype = t->child[0]->attr.vartype;
  			}
			}
			return SKIP;
		case FuncDeclK:
			if (st_insert(t->child[1]->attr.name,t->lineno,t->child[0]->attr.vartype,t->child[2])==FAIL){
				/*error: redeclaration of variable*/
				Error = TRUE;
				fprintf(listing,"Error! Line %d, redeclaration of function.\n",t->lineno);
			}
			return SKIP;
		case FuncDefK:
			if (st_funclookup(t->child[1]->attr.name,t->child[0]->attr.vartype,t->child[2])==UNCONFORM){
				/*error: definition unconform to former declaration*/
				Error = TRUE;
				fprintf(listing,"Error! Line %d, parameters mismatch the declaration.\n",t->lineno);
			}
			else if (st_funclookup(t->child[1]->attr.name,t->child[0]->attr.vartype,t->child[2])==INVALID){
				Error = TRUE;
				fprintf(listing,"Error! Line %d, return type mismatch.\n",t->lineno);
			}
			else {
				if (st_funclookup(t->child[1]->attr.name,t->child[0]->attr.vartype,t->child[2])==FAIL){
					st_insert(t->child[1]->attr.name,t->lineno,t->child[0]->attr.vartype,t->child[2]);
				}
				st_newBuck();
				st_inFunc(t->child[1]->attr.name);
				for (tt = t->child[2]; tt!=NULL; tt = tt->sibling){
					tt->child[1]->attr.vartype = tt->child[0]->attr.vartype;
					st_insert(tt->child[1]->attr.name,tt->lineno,tt->child[0]->attr.vartype,tt->child[1]->kind.exp);
				}
				insertNode(t->child[3]);
				st_delBuck();
				st_outFunc();
			}
			return SKIP;
		case ParamK:
			return UNSKIP;
		}
		break;
  case ExpK:
	
      switch (t->kind.exp){ 
			case IdK:	
				if ((st_lookup(t->attr.name,result) == FAIL)||result.vark == Func){
					Error = TRUE;
        /* not yet in table, so treat as error*/
          fprintf(listing,"Error! Line %d,undefined symbol %s\n",t->lineno,t->attr.name);
				}
				else {
					t->type = t->attr.vartype = result.etype;
					t->varK = result.vark;
					if (t->child[0]!=NULL)t->varK = Norm;
				}
        break;
			case CallK:
				if (st_funclookup(t->child[0]->attr.name,result) == FAIL){
          /* not yet in table, so treat as error*/
            fprintf(listing,"Error! Line %d,undefined symbol %s\n",
								t->lineno,t->child[0]->attr.name);
						Error = TRUE;
				}
				else {
					t->type = t->attr.vartype = result.etype;
					t->varK = Func;
					//insertNode(t->child[1]);
					traverse(t->child[1],insertNode,nullProc);
				}
				return SKIP;
        break;
			case ArrayK:
				et.varK = Array;
				if ((st_lookup(t->attr.name,result) == FAIL)||result.vark!=Array){
          /* not yet in table, so treat as error*/
            fprintf(listing,"Error! Line %d,undefined symbol %s\n",t->lineno,t->attr.name);
						Error = TRUE;
				}
				else {
					t->type = t->attr.vartype = result.etype;
					if (t->child[0]!=NULL)
						t->varK = Norm;
				}
        break;
			case ConstK:
				t->type = t->attr.vartype;
      default:
        break;
      }
      break;
  default:
      break;
  }
	return UNSKIP;
}

/* Function buildSymtab constructs the symbol 
 * table by preorder traversal of the syntax tree
 */
void buildSymtab(TreeNode * syntaxTree)
{ 
	traverse(syntaxTree,insertNode,nullProc);
}

static void typeError(TreeNode * t, char * message)
{ fprintf(listing,"Error! Line %d: %s\n",t->lineno,message);
  Error = true;
}

/* Procedure checkNode performs
 * type checking at a single tree node
 */
/*two variable used for function return type checking*/

ExpType funcReturn = Void;
bool valid = false;
bool nullarray = false;

/* Procedure checkParams performs
 * function type checking
 */
int CheckParams(TreeNode * p1,paramType * p2){
	TreeNode * tt;
	paramType * tp;
	Result result;
	for (tt = p1, tp = p2; tt!=NULL&&tp!=NULL; tt=tt->sibling,tp = tp->next){
		if (tt->type!=tp->type.type||(tt->varK==Array&&tp->type.varK!=Array))
			return FAIL;
		else if (tt->varK!=Array&&tp->type.varK == Array){
			//int suc = st_lookup(tt->attr.name,result);
			//if (!(tt->kind.exp==IdK&&suc!=FAIL&&result.vark==Array))
				return FAIL;
		}
	}
	if (tt==NULL&&tp==NULL)
		return SUCCESS;
	else return FAIL;
}

static int checkNode(TreeNode * t)
{ 
	Result result;
	switch (t->nodekind)
  { 
	case ExpK:
      switch (t->kind.exp)
      { case OpK:
					if (nullarray == true)
						fprintf(listing,"Error! Null index to array\n");
					if (t->child[0]->type != t->child[1]->type||
						t->child[0]->varK!=Norm||t->child[1]->varK!=Norm){
						if ((!((t->child[0]->type == Float&&t->child[1]->type == Integer)||
							(t->child[0]->type == Integer&&t->child[1]->type == Float)))
							||t->child[0]->varK!=Norm||t->child[1]->varK!=Norm)
							typeError(t,"Type mismatch on two sides of the operator"); //error
					}
          if ((t->attr.op == EQ) || (t->attr.op == LT)|| (t->attr.op == LE)
						|| (t->attr.op == GT)|| (t->attr.op == GE)|| (t->attr.op == NE)
						|| (t->attr.op == OR)|| (t->attr.op == AND))
            t->type = t->attr.vartype = Boolean;
          else{
						if (t->child[0]->type == Float||t->child[1]->type==Float)
							t->type = t->attr.vartype = Float;
						else t->type = t->attr.vartype = t->child[0]->type;
					}
					t->varK = Norm;
          break;
        case ConstK:
					t->type = t->attr.vartype;
					t->varK = Norm;
					break;
        case IdK:

          break;
				case CallK:
					entryType et;
					et.varK = Func;
					st_funclookup(t->child[0]->attr.name,result);
					if(CheckParams(t->child[1],result.params)==FAIL)
						/*error! Parameters mismatched*/
						typeError(t,"Parameters mismatch the function definition.");
					else {
						t->type = t->attr.vartype = result.etype;
						t->varK = Norm;
					}
					break;
				case ArrayK:
					if (t->child[0] == NULL)
						nullarray = true;
					else if (t->child[0]->type!=Integer)
						/*error! Invalid index type*/
						typeError(t,"Index is not integer type.");
					break;
				case NotK:
					t->type = Boolean;
					break;
				
        default:
          break;
      }
      break;
    case StmtK:
      switch (t->kind.stmt)//IfK,WhileK,ForK,ReturnK,CompoundK
      { case IfK:
          if (t->child[0]->type != Boolean)
            typeError(t->child[0],"if test is not Boolean");
          break;
        case ForK:
          if (t->child[1]->type != Boolean)
            typeError(t->child[0],"for test is not Boolean");
          break;
        case WhileK:
          if (t->child[0]->type != Boolean)
            typeError(t->child[0],"while test is not Boolean");
          break;
        case ReturnK:
					t->type = t->child[0]->type;
					if (valid == false)funcReturn = t->type;
					else if (funcReturn!=t->type){
						//!error!function return type mismatched!
						typeError(t,"Function return type mismatch.");
						funcReturn = t->type;
						}
					valid = true;
          break;
				case CompoundK:
					break;
        default:
          break;
      }//switch t->kind.stmt
      break;
		case DeclK:
			switch(t->kind.decl){//VarDeclK,ArrayDeclK,FuncDeclK,FuncDefK,ParamK
			case FuncDefK:
				t->type = t->child[0]->attr.vartype;
				if (t->type!=funcReturn)
					/*error! function return type mismatch*/
					typeError(t,"Function return type mismatch.");
				funcReturn = Void;
				valid = false;
			}//switch t->kind.decl
		case ParamK:
				nullarray = false;
				t->type = t->child[0]->attr.vartype;
    default:
      break;
	
  }
	return SKIP;
}

/* Procedure typeCheck performs type checking 
 * by a postorder syntax tree traversal
 */
void typeCheck(TreeNode * syntaxTree)
{ traverse(syntaxTree,nullProc,checkNode);
}

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲成人免费视频| 精品国产乱码久久久久久浪潮| 欧美精品乱码久久久久久| 日韩一区二区免费在线电影| 国产色综合一区| 亚洲最新视频在线播放| 麻豆精品视频在线| 97精品超碰一区二区三区| 欧美精品国产精品| 国产精品五月天| 日本三级韩国三级欧美三级| 成人综合日日夜夜| 制服丝袜在线91| 国产精品久久久久久久久晋中 | 久久99精品久久久久久动态图 | 亚洲国产精品传媒在线观看| 亚洲综合另类小说| 国产伦理精品不卡| 精品视频一区 二区 三区| 国产日韩欧美在线一区| 日韩主播视频在线| 国产乱码字幕精品高清av| 在线一区二区观看| 国产视频一区在线播放| 亚洲123区在线观看| 成人久久久精品乱码一区二区三区| 欧洲亚洲国产日韩| 国产精品色眯眯| 久久精品久久综合| 欧美伊人久久久久久久久影院 | 99精品久久久久久| 久久蜜臀中文字幕| 日韩av电影一区| 在线中文字幕不卡| 中文字幕国产一区二区| 美女在线视频一区| 欧美日韩视频在线第一区| 国产精品久久看| 国产一区二区福利视频| 欧美日产在线观看| 国产精品欧美一区喷水| 韩国v欧美v亚洲v日本v| 6080亚洲精品一区二区| 亚洲精品视频在线观看网站| 国产成人啪午夜精品网站男同| 欧美一激情一区二区三区| 一区二区三区电影在线播| 国产1区2区3区精品美女| 精品国产伦一区二区三区观看方式| 亚洲综合丁香婷婷六月香| 99国产欧美另类久久久精品| 国产天堂亚洲国产碰碰| 国产在线播放一区二区三区| 欧美一级夜夜爽| 调教+趴+乳夹+国产+精品| 91国偷自产一区二区开放时间 | 色欧美日韩亚洲| 中文字幕在线不卡国产视频| 国产成人免费视频一区| 久久视频一区二区| 美女视频黄免费的久久 | 秋霞午夜鲁丝一区二区老狼| 欧美日韩精品一区二区在线播放| 亚洲欧美另类在线| 99久久综合99久久综合网站| 欧美国产一区二区在线观看| 国产成人亚洲综合a∨婷婷图片| 2021久久国产精品不只是精品| 久久不见久久见免费视频1| 欧美一区中文字幕| 日本中文一区二区三区| 日韩欧美亚洲一区二区| 精品综合久久久久久8888| 欧美成人vps| 激情六月婷婷久久| 久久久亚洲国产美女国产盗摄| 国产一区二区三区| 日本一区二区三区在线观看| 丁香亚洲综合激情啪啪综合| 久久精品一区八戒影视| 成人免费av网站| 亚洲人成7777| 欧美日韩国产高清一区二区| 男女视频一区二区| 久久综合色婷婷| 国产99精品国产| 国产精品白丝在线| 在线一区二区三区四区| 日日夜夜一区二区| 久久综合99re88久久爱| 高清不卡一区二区在线| 亚洲女与黑人做爰| 欧美美女一区二区在线观看| 久久99国产精品麻豆| 久久伊99综合婷婷久久伊| 不卡av在线网| 亚洲第一电影网| 日韩欧美一区二区久久婷婷| 国产一区不卡在线| 国产精品短视频| 欧美日韩国产首页| 九色综合国产一区二区三区| 国产精品日产欧美久久久久| 色香蕉久久蜜桃| 日本视频一区二区三区| 久久久久国产精品麻豆| 91免费版在线| 天天综合色天天| 久久久精品国产免大香伊| 91免费观看国产| 麻豆精品在线播放| 最近中文字幕一区二区三区| 在线不卡免费欧美| 国产91高潮流白浆在线麻豆| 亚洲一区二区三区自拍| 久久视频一区二区| 欧美性猛片aaaaaaa做受| 国产一区 二区| 亚洲国产成人高清精品| 久久久久久久久免费| 欧美日韩亚洲另类| 国产乱一区二区| 亚洲午夜免费视频| 欧美国产精品中文字幕| 欧美高清一级片在线| 国产91精品一区二区麻豆亚洲| 亚洲成av人在线观看| 亚洲国产精品成人综合 | 精品一区二区免费视频| 亚洲精品成人悠悠色影视| 精品国产伦一区二区三区观看体验| 色欧美片视频在线观看| 国产一区二区三区日韩| 亚洲成人自拍网| 国产精品久久久久久久久久久免费看| 555夜色666亚洲国产免| 97se亚洲国产综合自在线观| 狠狠色狠狠色合久久伊人| 亚洲国产日韩av| 国产精品色呦呦| 欧美精品一区二区三区蜜桃| 欧美视频在线观看一区| 成年人国产精品| 国产老肥熟一区二区三区| 日韩av成人高清| 一区二区三区不卡视频| 国产精品激情偷乱一区二区∴| 欧美成人高清电影在线| 欧美久久久久久久久| 色哟哟在线观看一区二区三区| 国产麻豆91精品| 久久99国内精品| 日本成人在线看| 亚洲成在人线在线播放| 亚洲私人黄色宅男| 国产精品视频一区二区三区不卡| 欧美成人精品二区三区99精品| 欧美高清精品3d| 欧美亚洲国产bt| 91免费观看视频在线| 成人小视频在线观看| 国产又粗又猛又爽又黄91精品| 秋霞电影一区二区| 亚洲一卡二卡三卡四卡五卡| 亚洲视频在线一区观看| 中日韩av电影| 国产精品入口麻豆原神| 亚洲国产精品激情在线观看 | yourporn久久国产精品| 国产aⅴ综合色| 国产成人在线色| 国产 欧美在线| 成人午夜私人影院| 成人午夜短视频| 国产成人免费视频一区| 国产.欧美.日韩| 成人亚洲一区二区一| 粉嫩高潮美女一区二区三区| 国产成人精品一区二区三区网站观看| 国产一区二区三区综合| 毛片av一区二区| 美女国产一区二区三区| 麻豆91精品视频| 韩国欧美国产1区| 国内成+人亚洲+欧美+综合在线| 久久精品免费看| 国产曰批免费观看久久久| 国产成人综合网| 成人美女在线观看| 一本久久综合亚洲鲁鲁五月天| 色综合久久中文综合久久牛| 色婷婷精品久久二区二区蜜臂av| 色婷婷av一区二区三区软件| 色8久久人人97超碰香蕉987| 欧美性猛片xxxx免费看久爱| 7777精品伊人久久久大香线蕉的 | 精品无码三级在线观看视频| 九色综合国产一区二区三区| 国产经典欧美精品| 99麻豆久久久国产精品免费|