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

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

?? cgen.c

?? tiny編譯器++
?? C
字號:
/****************************************************/
/* File: cgen.c                                     */
/* The code generator implementation                */
/* for the TINY compiler                            */
/* (generates code for the TM machine)              */
/* Compiler Construction: Principles and Practice   */
/* Kenneth C. Louden                                */
/****************************************************/

#include "globals.h"
#include "symtab.h"
#include "code.h"
#include "cgen.h"

/* tmpOffset is the memory offset for temps
 It is decremented each time a temp is
 stored, and incremeted when loaded again
 */
static int tmpOffset = 0;

/* prototype for internal recursive code generator */
static void cGen(TreeNode * tree);

/* Procedure genStmt generates code at a statement node */
static void genStmt(TreeNode * tree)
{
	TreeNode * p1, * p2, * p3;
	int savedLoc1, savedLoc2, currentLoc;
	int loc;
	switch (tree->kind.stmt)
	{

	case IfK:
		if (TraceCode)
			emitComment("-> if");
		p1 = tree->child[0];
		p2 = tree->child[1];
		p3 = tree->child[2];
		/* generate code for test expression */
		cGen(p1);
		savedLoc1 = emitSkip(1);
		emitComment("if: jump to else belongs here");
		/* recurse on then part */
		cGen(p2);
		savedLoc2 = emitSkip(1);
		emitComment("if: jump to end belongs here");
		currentLoc = emitSkip(0);
		emitBackup(savedLoc1);
		emitRM_Abs("JEQ", ac, currentLoc, "if: jmp to else");
		emitRestore();
		/* recurse on else part */
		cGen(p3);
		currentLoc = emitSkip(0);
		emitBackup(savedLoc2);
		emitRM_Abs("LDA", pc, currentLoc, "jmp to end");
		emitRestore();
		if (TraceCode)
			emitComment("<- if");
		break; /* if_k */

	case RepeatK:
		if (TraceCode)
			emitComment("-> repeat");
		p1 = tree->child[0];
		p2 = tree->child[1];
		savedLoc1 = emitSkip(0);
		emitComment("repeat: jump after body comes back here");
		/* generate code for body */
		cGen(p1);
		/* generate code for test */
		cGen(p2);
		emitRM_Abs("JEQ", ac, savedLoc1, "repeat: jmp back to body");
		if (TraceCode)
			emitComment("<- repeat");
		break; /* repeat */

	case AssignK:
		if (TraceCode)
			emitComment("-> assign");
		/* generate code for rhs */
		cGen(tree->child[0]);
		/* now store value */
		loc = st_lookup(tree->attr.name);
		emitRM("ST", ac, loc, gp, "assign: store value");
		if (TraceCode)
			emitComment("<- assign");
		break; /* assign_k */

	case ReadK:
		emitRO("IN", ac, 0, 0, "read integer value");
		loc = st_lookup(tree->attr.name);
		emitRM("ST", ac, loc, gp, "read: store value");
		break;
	case WriteK:
		/* generate code for expression to write */
		cGen(tree->child[0]);
		/* now output it */
		emitRO("OUT", ac, 0, 0, "write ac");
		break;
	default:
		break;
	}
} /* genStmt */

/* Procedure genExp generates code at an expression node */
static void genExp(TreeNode * tree)
{
	int loc;
	TreeNode * p1, * p2;
	switch (tree->kind.exp)
	{

	case ConstK:
		if (TraceCode)
			emitComment("-> Const");
		/* gen code to load integer constant using LDC */
		emitRM("LDC", ac, tree->attr.val, 0, "load const");
		if (TraceCode)
			emitComment("<- Const");
		break; /* ConstK */

	case IdK:
		if (TraceCode)
			emitComment("-> Id");
		loc = st_lookup(tree->attr.name);
		emitRM("LD", ac, loc, gp, "load id value");
		if (TraceCode)
			emitComment("<- Id");
		break; /* IdK */

	case OpK:
		if (TraceCode)
			emitComment("-> Op");
		p1 = tree->child[0];
		p2 = tree->child[1];
		/* gen code for ac = left arg */
		cGen(p1);
		/* gen code to push left operand */
		emitRM("ST", ac, tmpOffset--, mp, "op: push left");
		/* gen code for ac = right operand */
		cGen(p2);
		/* now load left operand */
		emitRM("LD", ac1, ++tmpOffset, mp, "op: load left");
		switch (tree->attr.op)
		{
		case PLUS:
			emitRO("ADD", ac, ac1, ac, "op +");
			break;
		case MINUS:
			emitRO("SUB", ac, ac1, ac, "op -");
			break;
		case TIMES:
			emitRO("MUL", ac, ac1, ac, "op *");
			break;
		case OVER:
			emitRO("DIV", ac, ac1, ac, "op /");
			break;
		case LT:
			emitRO("SUB", ac, ac1, ac, "op <");
			emitRM("JLT", ac, 2, pc, "br if true");
			emitRM("LDC", ac, 0, ac, "false case");
			emitRM("LDA", pc, 1, pc, "unconditional jmp");
			emitRM("LDC", ac, 1, ac, "true case");
			break;
		case EQ:
			emitRO("SUB", ac, ac1, ac, "op ==");
			emitRM("JEQ", ac, 2, pc, "br if true");
			emitRM("LDC", ac, 0, ac, "false case");
			emitRM("LDA", pc, 1, pc, "unconditional jmp");
			emitRM("LDC", ac, 1, ac, "true case");
			break;
		default:
			emitComment("BUG: Unknown operator");
			break;
		} /* case op */
		if (TraceCode)
			emitComment("<- Op");
		break; /* OpK */

	default:
		break;
	}
} /* genExp */

/* Procedure cGen recursively generates code by
 * tree traversal
 */
static void cGen(TreeNode * tree)
{
	if (tree != NULL)
	{
		switch (tree->nodekind)
		{
		case StmtK:
			genStmt(tree);
			break;
		case ExpK:
			genExp(tree);
			break;
		default:
			break;
		}
		cGen(tree->sibling);
	}
}

/**********************************************/
/* the primary function of the code generator */
/**********************************************/
/* Procedure codeGen generates code to a code
 * file by traversal of the syntax tree. The
 * second parameter (codefile) is the file name
 * of the code file, and is used to print the
 * file name as a comment in the code file
 */
void codeGen(TreeNode * syntaxTree, char * codefile)
{
	char * s = malloc(strlen(codefile) + 7);
	strcpy(s, "File: ");
	strcat(s, codefile);
	emitComment("TINY Compilation to TM Code");
	emitComment(s);
	/* generate standard prelude */
	emitComment("Standard prelude:");
	emitRM("LD", mp, 0, ac, "load maxaddress from location 0");
	emitRM("ST", ac, 0, ac, "clear location 0");
	emitComment("End of standard prelude.");
	/* generate code for TINY program */
	cGen(syntaxTree);
	/* finish */
	emitComment("End of execution.");
	emitRO("HALT", 0, 0, 0, "");
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲va在线va天堂| 久久精品一二三| 亚洲欧洲99久久| 国产美女久久久久| 99国产一区二区三精品乱码| 在线成人av网站| 日本中文字幕一区二区视频| 在线观看欧美黄色| 午夜不卡av在线| 欧美一区二区三区免费大片 | 色悠久久久久综合欧美99| 精品成人一区二区三区| 麻豆成人av在线| 国产精品嫩草久久久久| 成人污污视频在线观看| 亚洲国产激情av| 99久久精品情趣| 亚洲国产毛片aaaaa无费看| 欧美亚洲综合一区| 激情六月婷婷综合| 亚洲精品国产无天堂网2021| 色悠悠亚洲一区二区| 日韩高清不卡一区二区| 精品剧情v国产在线观看在线| 亚洲大片精品永久免费| 欧美sm极限捆绑bd| 色一情一伦一子一伦一区| 一区二区三区四区视频精品免费| 另类小说视频一区二区| 日本一区二区三级电影在线观看 | 亚洲人成小说网站色在线| 欧美日本韩国一区| 亚洲国产精品成人久久综合一区| 欧美中文字幕一二三区视频| 日韩高清在线不卡| 亚洲宅男天堂在线观看无病毒| 日韩亚洲欧美在线观看| 国产91在线|亚洲| 久久国产精品99精品国产 | 91网页版在线| 国产一区二区久久| 久久99精品久久只有精品| 亚洲免费观看高清完整版在线观看熊| 日韩一区二区三区三四区视频在线观看| 成人午夜激情在线| jlzzjlzz欧美大全| 91丨九色丨蝌蚪丨老版| 国产盗摄女厕一区二区三区| 久久er精品视频| 精品在线观看免费| 国精产品一区一区三区mba桃花 | 欧美日韩在线播放一区| 成人一区二区三区| 国产伦精品一区二区三区在线观看| 国产精品色噜噜| 亚洲欧美综合色| 国产午夜精品福利| 久久久精品国产99久久精品芒果| 日韩欧美国产一区二区三区 | 国产精品丝袜在线| 国产精品毛片大码女人| 亚洲欧美日韩在线| 久久国产精品免费| 91香蕉视频mp4| 2020日本不卡一区二区视频| 中文字幕亚洲一区二区va在线| 亚洲日本护士毛茸茸| 日韩主播视频在线| 国产不卡视频在线播放| 4438x亚洲最大成人网| 久久综合网色—综合色88| 亚洲日本丝袜连裤袜办公室| 一区二区久久久| 福利一区二区在线| 欧美电视剧在线观看完整版| 中文字幕一区av| 国产精品911| 日韩精品中文字幕一区| 亚洲综合视频网| 成人黄色免费短视频| 欧美精品一区二区三区很污很色的| 亚洲欧美日韩一区二区 | 色综合久久中文字幕| 国产午夜精品福利| 成人综合在线观看| 精品三级在线看| 视频在线在亚洲| 欧美日韩午夜在线视频| 综合色中文字幕| 99久久国产免费看| 日韩西西人体444www| 亚洲va韩国va欧美va| 蜜臀精品一区二区三区在线观看| 欧美色图在线观看| 综合久久国产九一剧情麻豆| 91亚洲精品一区二区乱码| 一区二区三区欧美视频| 欧美日韩一区三区| 国产在线视视频有精品| 国产精品色哟哟网站| av在线不卡观看免费观看| 亚洲激情第一区| 日韩欧美aaaaaa| 99久久精品一区二区| 五月天激情小说综合| 欧美tickling挠脚心丨vk| 国产资源精品在线观看| 久久久综合九色合综国产精品| 不卡一区二区三区四区| 一区二区不卡在线视频 午夜欧美不卡在| voyeur盗摄精品| 日韩中文字幕不卡| 亚洲欧洲av在线| 欧美v日韩v国产v| 欧美日韩国产高清一区二区三区| 免费观看成人鲁鲁鲁鲁鲁视频| 久久先锋影音av| 欧美乱熟臀69xxxxxx| 午夜免费久久看| 亚洲私人黄色宅男| 久久久久久日产精品| 91久久人澡人人添人人爽欧美| 国产呦精品一区二区三区网站| 国产精品国产三级国产aⅴ中文| 在线播放视频一区| 欧美在线小视频| 97精品超碰一区二区三区| 日韩av中文字幕一区二区| 亚洲一区二区三区三| 中文字幕一区二区三区精华液| 日韩欧美一级精品久久| 日韩一卡二卡三卡国产欧美| 一本到一区二区三区| 麻豆一区二区在线| 久久国产尿小便嘘嘘尿| 国产剧情av麻豆香蕉精品| 国产成人精品aa毛片| 成人av在线一区二区三区| 精品一区二区三区免费毛片爱| 麻豆精品新av中文字幕| 精品一区二区三区免费| 国产a精品视频| 91老师片黄在线观看| 精品视频一区三区九区| 欧美日韩免费高清一区色橹橹| 精品1区2区3区| 欧美一区二区三区日韩视频| 久久影院视频免费| 一区二区三区蜜桃| 国产东北露脸精品视频| 色先锋aa成人| 久久综合久久综合亚洲| 亚洲一区二区精品视频| 美腿丝袜在线亚洲一区| 不卡在线观看av| 久久久一区二区三区捆绑**| 亚洲精品老司机| 国产不卡视频在线观看| 欧美精品久久一区二区三区| 欧美一级生活片| 亚洲愉拍自拍另类高清精品| 麻豆成人av在线| 日韩一卡二卡三卡四卡| 丝袜美腿亚洲综合| 欧美图区在线视频| 亚洲国产高清aⅴ视频| 精品一区二区在线免费观看| 欧美唯美清纯偷拍| 一区二区三区在线视频免费| 春色校园综合激情亚洲| 国产欧美精品一区二区三区四区| 蜜桃久久精品一区二区| 99国产精品国产精品毛片| 国产欧美日韩麻豆91| 国产传媒一区在线| 欧美大尺度电影在线| 国产激情一区二区三区四区 | 日韩免费福利电影在线观看| 国内精品写真在线观看| 国产精品大尺度| 91麻豆精品国产91久久久久久久久 | 国产在线视视频有精品| 亚洲色图都市小说| 26uuu亚洲综合色欧美| 色综合视频一区二区三区高清| 亚洲一二三专区| 日韩伦理电影网| 国产网红主播福利一区二区| 在线看国产一区二区| 麻豆成人免费电影| 一区二区三区高清| 欧美国产成人在线| 欧美电影免费观看高清完整版| 在线免费观看日韩欧美| 国产成人综合自拍| 国产夫妻精品视频| 老司机精品视频在线| 五月婷婷久久丁香| 亚洲综合男人的天堂| 亚洲精品五月天|