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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? analyze.c

?? 一個使用lex/yacc的小型C編譯器
?? C
字號:
/****************************************************/
/* File: analyze.c                                  */
/* Semantic analyzer implementation					*/
/* for the C_Minus compiler							*/
/****************************************************/

#include "globals.h"
#include "util.h"
#include "parse.h"
#include "symtab.h"
#include "analyze.h"

/* counter for variable memory locations */
static int location = 0;

/* current symble table */
static Symtab * pTable;
static FunEntry * pFun;

/* 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, 
					 void (* preProc) (TreeNode *),
					 void (* postProc) (TreeNode *))
{ 
	if (t != NULL)
	{ 
		int i;
		preProc(t);
		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 void nullpreProc(TreeNode * t)
{ 
	if (t == NULL) return;
	else if (t->nodekind == Dec) {
		switch (t->kind.dec)
		{
		case FunDefK:
			pFun = Lookup_Fun(t->attr.name);
			break;
		case CompK:
			pTable = t->attr.table;
			break;
		}
	}
}

static void nullpostProc(TreeNode * t)
{ 
	if (t == NULL || pTable == NULL) return;
	else if (t->nodekind == Dec && t->kind.dec == CompK)
		pTable = pTable->parent;
}

/* procedure insertNode inserts 
 * identifiers stored in t into 
 * the symbol table 
 */
static void insertNode(TreeNode * t)
{ 
	switch (t->nodekind)
	{ 
    case Dec:
		switch (t->kind.dec)
		{ 
		case FunDecK:
			if (Lookup_Fun(t->attr.name) == NULL)
				Insert_Fun(t->attr.name, t->type, t->child[0]);
			break;
		case FunDefK:
			if (Lookup_Fun(t->attr.name) == NULL)
				pFun = Insert_Fun(t->attr.name, t->type, t->child[0]);
			break;
		case VarK:
		{
			ValEntry Entry;
			TreeNode * child;
			for (child = t->child[0]; child != NULL; child = child->sibling) {
				if (child->nodekind == Exp && child->kind.exp == IdK) {
					if (Lookup_Var(pTable, pFun, child->attr.name, &Entry) != pTable->nestlevel)
						if (child->child[0] == NULL)
							Insert_Var(pTable, child->attr.name, t->type, 1);
						else
							Insert_Var(pTable, child->attr.name, t->type, child->child[0]->attr.val.i);
				}
				else if (child->nodekind == Stmt && child->kind.stmt == AssignK) {
					if (Lookup_Var(pTable, pFun, child->child[0]->attr.name, &Entry) != pTable->nestlevel)
						if (child->child[0]->child[0] == NULL)
							Insert_Var(pTable, child->child[0]->attr.name, t->type, 1);
						else
							Insert_Var(pTable, child->child[0]->attr.name, t->type, child->child[0]->child[0]->attr.val.i);
				}
			}
		}
			break;
		case CompK:
			pTable = Createtab(pTable, pFun);
			if (pTable==NULL)
				fprintf(listing, "Out of memory error at line %d\n", t->lineno);
			t->attr.table = pTable;
			break;
        default:
			break;
      }
      break;
	default:
		break;
	}
}

/* function buildSymtab constructs the symbol 
 * table by preorder traversal of the syntax tree
 */
void buildSymtab(TreeNode * tree)
{
	GlobalTable = Createtab(NULL, NULL);
	if (GlobalTable==NULL)
		fprintf(listing, "Out of memory error at line %d\n", tree->lineno);
	pTable = GlobalTable;
	traverse(tree, insertNode, nullpostProc);
	if (TraceAnalyze)
	{ 
		printFunTab();
		printSymTab(tree);
	}
}

static void typeError(TreeNode * t, char * message)
{ 
	fprintf(listing,"Type error at line %d: %s\n", t->lineno, message);
	Error = TRUE;
}

/* procedure checkNode performs
 * type checking at a single tree node
 */
static void checkNode(TreeNode * t)
{ 
	switch (t->nodekind)
	{ 
    case Dec:
		if (t->kind.dec == CompK)
			pTable = pTable->parent;
		break;
	case Exp:
		switch (t->kind.exp)
		{ 
		case OpK:
			switch(t->attr.op) {
			case PLUS: case SUB: case MUT: case DIV:
				if ((t->child[0]->type != Integer && t->child[0]->type != Float) ||
					(t->child[1]->type != Integer && t->child[1]->type != Float))
					typeError(t, "Op applied to non-number");
				else if (t->child[0]->type == Float || t->child[1]->type == Float)
					t->type = Float;
				else
					t->type = Integer;
				break;
			case LT: case LE: case GT: case GE: case EQ: case NEQ:
				if ((t->child[0]->type != Integer && t->child[0]->type != Float) ||
					(t->child[1]->type != Integer && t->child[1]->type != Float))
					typeError(t, "Op applied to non-number");
				else 
					t->type = Boolean;
				break;
			case AND: case OR:
				if ((t->child[0]->type != Integer && t->child[0]->type != Boolean) ||
					(t->child[1]->type != Integer && t->child[1]->type != Boolean))
					typeError(t, "Op applied to non-boolean");
				else
					t->type = Boolean;
				break;
			}
			break;
        case IdK:
		{
			ValEntry Entry;
			if (Lookup_Var(pTable, pFun, t->attr.name, &Entry) != -1)
				t->type = Entry.type;
			else {
				ValEntry * pEntry;
				for (pEntry = pFun->para; pEntry != NULL; pEntry = pEntry->next)
					if (strcmp(t->attr.name, pEntry->name) == 0) {
						t->type = pEntry->type;
						break;
					}
				if (pEntry == NULL)
					typeError(t, "reference to undefined id");
			}
		}
			break;
		}
		break;
    case Stmt:
		switch (t->kind.stmt)
		{ 
		case IfK:
			if (t->child[0]->type != Boolean && t->child[0]->type != Integer)
				typeError(t->child[0], "if test is not Boolean");
			break;
        case WhileK:
			if (t->child[0]->type != Boolean && t->child[0]->type != Integer)
				typeError(t->child[0], "while test is not Boolean");
			break;
		case CallK: 
		{
			FunEntry * pEntry = Lookup_Fun(t->attr.name);
			if (pEntry != NULL) {
				ValEntry * para;
				t->type = pEntry->type;
				for (para = pEntry->para, t = t->child[0]; para != NULL && t != NULL;
					para = para->next, t = t->sibling)
					if (para->type != t->type)
						typeError(t, "call to function with wrong parameter");
				if (para != NULL || t != NULL)
					typeError(t, "call to function with wrong parameter");
			}
			else
				typeError(t, "call to undefined function");
		}
			break;
		case ReturnK:
			t->type = t->child[0]->type;
			if (t->type != pFun->type)
				typeError(t, "return type inconsistent with definition");
			break;
		case AssignK:
			if (t->child[0]->type != t->child[1]->type) {
				if (t->child[0]->type == Float && t->child[1]->type == Integer)
					t->type = t->child[1]->type = Float;
				else if (t->child[0]->type == Integer && t->child[1]->type == Float) 
					t->type = Integer;
				else 
					typeError(t->child[0], "assignment type mismatched");
			}
			t->type = t->child[0]->type;
			break;
		}
		break;
	}
}

/* procedure transNode transforms
 * a tree node type to the appropriate one 
 */
static void transNode(TreeNode * t)
{
	if (t->nodekind == Exp && t->kind.exp == OpK) {
		switch(t->attr.op) {
		case PLUS: case SUB: case MUT: case DIV:
			if ((t->type == Float && t->child[0]->type == Integer)) {
				t->child[0]->type = Float;
				if (t->child[0]->nodekind == Exp && t->child[0]->kind.exp == NumK)
					t->child[0]->attr.val.f = (float)(t->child[0]->attr.val.i);
			}
			if ((t->type == Float && t->child[1]->type == Integer)) {
				t->child[1]->type = Float;
				if (t->child[1]->nodekind == Exp && t->child[1]->kind.exp == NumK)
					t->child[1]->attr.val.f = (float)(t->child[1]->attr.val.i);
			}
			break;
		}
	}
}

/* procedure typeCheck performs type checking 
 * by a postorder syntax tree traversal
 */
void typeCheck(TreeNode * syntaxTree)
{ 
	traverse(syntaxTree, nullpreProc, checkNode);
	traverse(syntaxTree, transNode, nullpostProc);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品蜜臀在线观看| 欧美天天综合网| 日韩精品一级二级 | 欧美日韩日日夜夜| 99精品欧美一区| 99精品久久久久久| 色婷婷精品大视频在线蜜桃视频| 99免费精品视频| 99久久久国产精品| 欧美综合一区二区三区| 91久久香蕉国产日韩欧美9色| 91色视频在线| 欧美亚洲国产bt| 欧美欧美午夜aⅴ在线观看| 欧美日韩一本到| 日韩欧美一二三四区| 日韩免费看的电影| 国产人久久人人人人爽| 国产精品天天摸av网| 亚洲男人的天堂在线aⅴ视频| 亚洲黄色在线视频| 日本视频一区二区| 国产91在线|亚洲| 色婷婷精品久久二区二区蜜臂av | 亚洲国产你懂的| 成人免费高清视频在线观看| jiyouzz国产精品久久| 色综合天天综合给合国产| 欧美少妇bbb| 久久中文字幕电影| 亚洲男同性视频| 麻豆传媒一区二区三区| 国产91在线观看| 欧美日韩视频在线第一区 | 91论坛在线播放| 欧美一区二区三区系列电影| 久久综合视频网| 亚洲精品v日韩精品| 六月丁香婷婷久久| 99麻豆久久久国产精品免费优播| 欧美日韩aaaaa| 中文字幕精品综合| 日韩经典一区二区| 99精品视频在线观看| 欧美精品在线一区二区| 国产精品情趣视频| 日本91福利区| 欧美中文字幕一区二区三区亚洲| 精品人伦一区二区色婷婷| 中文字幕欧美一| 极品少妇xxxx精品少妇偷拍| 99re免费视频精品全部| 久久亚洲一区二区三区明星换脸| 亚洲免费观看高清完整版在线观看熊| 久久er精品视频| 欧美日韩在线电影| 亚洲色欲色欲www| 国产精品一品二品| 日韩一区二区三区观看| 亚洲午夜电影在线| 91视视频在线观看入口直接观看www | 欧美精品久久久久久久多人混战 | ...xxx性欧美| 国产精品一区三区| 欧美不卡视频一区| 日韩精品福利网| 91麻豆精品在线观看| 国产丝袜在线精品| 久久爱www久久做| 欧美成人一区二区| 青椒成人免费视频| 日韩欧美成人激情| 日本不卡一二三| 3d成人动漫网站| 午夜久久久影院| 欧美在线一区二区| 一个色综合网站| 在线影视一区二区三区| 亚洲欧美电影院| 色综合色狠狠天天综合色| 亚洲图片激情小说| 日本大香伊一区二区三区| 一区二区免费在线| 欧美日韩国产高清一区二区 | 国产欧美中文在线| 成人亚洲一区二区一| 久久精品人人做人人爽人人| 国产不卡视频在线播放| 国产精品久久久久久久久果冻传媒| 国产毛片一区二区| 国产精品久久看| 一本色道亚洲精品aⅴ| 亚洲一区二区欧美日韩| 欧美日本韩国一区二区三区视频| 亚洲一级电影视频| 日韩亚洲欧美中文三级| 国产一区不卡精品| 国产精品久久久久久亚洲伦| 一本大道久久a久久综合婷婷| 亚洲综合一区二区三区| 欧美电影一区二区| 国产老肥熟一区二区三区| 国产精品污www在线观看| 91久久精品日日躁夜夜躁欧美| 亚洲高清在线精品| 精品国产91乱码一区二区三区| 国产成人精品免费视频网站| 亚洲欧洲三级电影| 欧美精品1区2区| 国产精品66部| 亚洲成av人影院在线观看网| 精品蜜桃在线看| 99久久国产综合精品色伊| 天天爽夜夜爽夜夜爽精品视频| 精品第一国产综合精品aⅴ| 丁香婷婷综合色啪| 午夜激情一区二区三区| 国产欧美一区二区精品性色| 欧美综合色免费| 国产999精品久久| 日韩av不卡一区二区| 日韩一区有码在线| 精品剧情在线观看| 在线视频国产一区| 岛国精品在线播放| 老司机精品视频线观看86| 亚洲色图第一区| 久久久久久毛片| 7777精品伊人久久久大香线蕉 | 国产精品正在播放| 免费视频一区二区| 夜夜嗨av一区二区三区| 日本一区免费视频| 欧美精品一区二| 欧美日韩一区 二区 三区 久久精品| 丰满放荡岳乱妇91ww| 免费成人深夜小野草| 亚洲国产精品人人做人人爽| 国产日韩精品一区二区三区| 欧美高清www午色夜在线视频| 91在线视频观看| 成人污污视频在线观看| 国内精品写真在线观看| 麻豆久久久久久| 免费在线观看一区二区三区| 亚洲国产精品人人做人人爽| 亚洲另类在线视频| ㊣最新国产の精品bt伙计久久| 国产欧美日韩亚州综合| 欧美精品一区二区在线播放| 日韩天堂在线观看| 日韩欧美在线综合网| 欧美一区二区三区在线观看视频| 欧美日韩一区 二区 三区 久久精品| 91日韩精品一区| 色哟哟欧美精品| 色噜噜狠狠成人中文综合| 色综合天天天天做夜夜夜夜做| 成人免费视频一区| 久久久久国产精品人| 欧美xxxxx牲另类人与| 欧美mv日韩mv| 26uuu国产一区二区三区| 亚洲精品一区二区三区精华液 | 狠狠色狠狠色综合日日91app| 老司机精品视频导航| 国内精品伊人久久久久影院对白| 蜜桃精品视频在线观看| 国产一区二区三区四区在线观看| 国产精品一区在线观看你懂的| 国产福利一区二区三区视频在线| 高清在线不卡av| 91首页免费视频| 欧美男同性恋视频网站| 日韩欧美二区三区| 国产色产综合色产在线视频| 成人欧美一区二区三区小说| 一区二区三区在线视频观看58| 亚洲欧美日韩在线播放| 天天影视涩香欲综合网| 麻豆国产一区二区| 99久久精品国产精品久久| 欧美视频一区在线观看| 精品少妇一区二区三区免费观看 | 17c精品麻豆一区二区免费| 亚洲综合成人在线视频| 麻豆极品一区二区三区| 成人午夜视频在线| 欧美日韩国产一区| 国产亚洲精品资源在线26u| 亚洲人成网站精品片在线观看| 亚洲国产精品欧美一二99| 国产精品99久久久久久久女警| 色综合中文字幕| 精品免费99久久| 亚洲综合成人在线视频| 国产一区二区三区四区在线观看| 91久久精品一区二区三区| 久久女同性恋中文字幕| 亚洲成va人在线观看|