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

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

?? parse.c

?? tiny編譯器++
?? C
字號:
/****************************************************/
/* File: parse.c                                    */
/* The parser implementation for the TINY compiler  */
/* Compiler Construction: Principles and Practice   */
/* Kenneth C. Louden                                */
/****************************************************/

#include "globals.h"
#include "util.h"
#include "scan.h"
#include "parse.h"

static TokenType token; /* holds current token */

/* function prototypes for recursive calls */
static TreeNode * program(void);
static TreeNode * decl_sequence(void);
static TreeNode * declaration(void);
static TreeNode * int_decl(void);
static TreeNode * bool_decl(void);
static TreeNode * string_decl(void);
static TreeNode * bool_exp(void);
static TreeNode * bool_term(void);
static TreeNode * bool_comp(void);
static TreeNode * bool_factor(void);
static TreeNode * stmt_sequence(void);
static TreeNode * statement(void);
static TreeNode * if_stmt(void);
static TreeNode * repeat_stmt(void);
static TreeNode * assign_stmt(void);
static TreeNode * read_stmt(void);
static TreeNode * write_stmt(void);
static TreeNode * while_stmt(void);
static TreeNode * exp(void);
static TreeNode * simple_exp(void);
static TreeNode * term(void);
static TreeNode * factor(void);

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

static void match(TokenType expected)
{
	if (token == expected)
		token = getToken();
	else
	{
		syntaxError("unexpected token -> ");
		printToken(token, tokenString);
		fprintf(listing, "");
	}
}

TreeNode * program(void)
{
	TreeNode * t = newProgNode();
	if ((t != NULL) && ((token == INT) ||
		(token == BOOL) || (token == STRING)))
	{
		t->child[0] = decl_sequence();
	}
	if (t != NULL)
	{
		t->child[1] = stmt_sequence();
	}

	return t;
}

TreeNode * decl_sequence(void)
{
	TreeNode * t = declaration();
	TreeNode * p = t;

	while (token != ENDFILE && ((token == INT)
		|| (token == BOOL) || (token == STRING) || (token == SEMI)))
	{
		TreeNode * q;
		match(SEMI);
		q = declaration();
		if (q != NULL)
		{
			if (t == NULL)
				t = p = q;
			else /* now p cannot be NULL either */
			{
				p->sibling = q;
				p = q;
			}
		}
	}

	return t;
}

TreeNode * declaration()
{
	TreeNode * t = NULL;
	switch (token)
	{
	case INT:
		int_decl();
		break;
	case BOOL:
		bool_decl();
		break;
	case STRING:
		string_decl();
		break;
	case ENDFILE:
		break;
	default:
		/*syntaxError("unexpected token -> ");
		printToken(token, tokenString);
		token = getToken();*/
		break;
	}
	return t;
}

TreeNode * int_decl(void)
{
	TreeNode * t = newDeclNode(IntK);
	match(INT);
	match(ID);

	return t;
}

TreeNode * bool_decl(void)
{
	TreeNode * t = newDeclNode(BoolK);
	match(BOOL);
	match(ID);

	return t;
}

TreeNode * string_decl(void)
{
	TreeNode * t = newDeclNode(StringK);
	match(STRING);
	match(ID);

	return t;
}

TreeNode * bool_exp(void)
{
	TreeNode * t = bool_term();
	while (token == OR)
	{
		TreeNode * p = newExpNode(OpK);
		if (p != NULL)
		{
			p->child[0] = t;
			p->attr.op = token;
			t = p;
			match(token);
			t->child[1] = bool_term();
		}
	}
	return t;
}

TreeNode * bool_term(void)
{
	TreeNode * t = bool_comp();
	while (token == AND)
	{
		TreeNode * p = newExpNode(OpK);
		if (p != NULL)
		{
			p->child[0] = t;
			p->attr.op = token;
			t = p;
			match(token);
			p->child[1] = bool_comp();
		}
	}
	return t;
}

TreeNode * bool_comp(void)
{
	TreeNode * t = bool_factor();
	if ((token == LT) || (token == EQ))
	{
		TreeNode * p = newExpNode(OpK);
		if (p != NULL)
		{
			p->child[0] = t;
			p->attr.op = token;
			t = p;
		}
		match(token);
		if (t != NULL)
			t->child[1] = bool_factor();
	}

	return t;
}

TreeNode * bool_factor(void)
{
	TreeNode * t = NULL;
	switch (token)
	{
	case TINYTRUE:
		t = newExpNode(ConstK);
		if (t != NULL)
		{
			t->attr.val = 1;
		}
		match(TINYTRUE);
		break;
	case TINYFALSE:
		t = newExpNode(ConstK);
		if (t != NULL)
		{
			t->attr.val = 0;
		}
		match(TINYFALSE);
		break;
	case ID:
		t = newExpNode(IdK);
		if (t != NULL)
		{
			t->attr.name = copyString(tokenString);
		}
		match(ID);
		break;
	case NUM:
		t = newExpNode(ConstK);
		if (t != NULL)
		{
			t->attr.val = atoi(tokenString);
		}
		match(NUM);
		break;
	case LPAREN:
		match(LPAREN);
		t = bool_exp();
		match(RPAREN);
		break;
	case NOT:
		match(NOT);
		t = bool_exp();
		break;
	default:
		syntaxError("unexpected token -> ");
		printToken(token, tokenString);
		token = getToken();
		break;
	}
	return t;
}

TreeNode * stmt_sequence(void)
{
	TreeNode * t = statement();
	TreeNode * p = t;
	while ((token != ENDFILE) && (token != END) && (token != ELSE) && (token
			!= UNTIL))
	{
		TreeNode * q;
		match(SEMI);
		q = statement();
		if (q != NULL)
		{
			if (t == NULL)
				t = p = q;
			else /* now p cannot be NULL either */
			{
				p->sibling = q;
				p = q;
			}
		}
	}
	return t;
}

TreeNode * statement(void)
{
	TreeNode * t = NULL;
	switch (token)
	{
	case IF:
		t = if_stmt();
		break;
	case REPEAT:
		t = repeat_stmt();
		break;
	case ID:
		t = assign_stmt();
		break;
	case READ:
		t = read_stmt();
		break;
	case WRITE:
		t = write_stmt();
		break;
	case WHILE:
		t = while_stmt();
		break;
	case ELSE:	/* handle error */
	case UNTIL:
	case END:
	case ENDFILE:
		break;
	default:
		syntaxError("unexpected token -> ");
		printToken(token, tokenString);
		token = getToken();
		break;
	} /* end case */
	return t;
}

TreeNode * if_stmt(void)
{
	TreeNode * t = newStmtNode(IfK);
	match(IF);
	if (t != NULL)
		t->child[0] = bool_exp();
	match(THEN);
	if (t != NULL)
		t->child[1] = stmt_sequence();
	if (token == ELSE)
	{
		match(ELSE);
		if (t != NULL)
			t->child[2] = stmt_sequence();
	}
	match(END);
	return t;
}

TreeNode * repeat_stmt(void)
{
	TreeNode * t = newStmtNode(RepeatK);
	match(REPEAT);
	if (t != NULL)
		t->child[0] = stmt_sequence();
	match(UNTIL);
	if (t != NULL)
		t->child[1] = bool_exp();
	return t;
}

TreeNode * assign_stmt(void)
{
	TreeNode * t = newStmtNode(AssignK);
	if ((t != NULL) && (token == ID))
		t->attr.name = copyString(tokenString);
	match(ID);
	match(ASSIGN);
	if (t != NULL)
		t->child[0] = exp();
	return t;
}

TreeNode * read_stmt(void)
{
	TreeNode * t = newStmtNode(ReadK);
	match(READ);
	if ((t != NULL) && (token == ID))
		t->attr.name = copyString(tokenString);
	match(ID);
	return t;
}

TreeNode * write_stmt(void)
{
	TreeNode * t = newStmtNode(WriteK);
	match(WRITE);
	if (t != NULL)
		t->child[0] = exp();
	return t;
}

TreeNode * while_stmt(void)
{
	TreeNode * t = newStmtNode(WhileK);
	match(WHILE);
	if (t != NULL)
	{
		t->child[0] = bool_exp();
	}
	match(DO);
	if (t != NULL)
	{
		t->child[1] = stmt_sequence();
	}
	match(END);

	return t;
}

TreeNode * exp(void)
{
	TreeNode * t = NULL;
	if (token == NOT)
	{
		t = bool_exp();
	}
	else if (token == STR)	/* handle string type */
	{
		t = newExpNode(ConstK);
		t->attr.name = copyString(tokenString);
		match(STR);
	}
	else
	{
		switch (getToken())
		{
		case PLUS:
		case MINUS:
		case TIMES:
		case OVER:
			ungetNextToken();
			t = simple_exp();
			break;
		case EQ:
		case LT:
		case OR:
		case AND:
		case NOT:
			ungetNextToken();
			t = bool_exp();
			break;
		case SEMI:
			ungetNextToken();
			if (token == ID)
			{
				match(ID);
			}
			else
			{
				match(NUM);
			}
			break;
		default:
			syntaxError("unexpected token -> ");
			printToken(token, tokenString);
			token = getToken();
			break;
		}
	}

	return t;
}

TreeNode * simple_exp(void)
{
	TreeNode * t = term();
	while ((token == PLUS) || (token == MINUS))
	{
		TreeNode * p = newExpNode(OpK);
		if (p != NULL)
		{
			p->child[0] = t;
			p->attr.op = token;
			t = p;
			match(token);
			t->child[1] = term();
		}
	}
	return t;
}

TreeNode * term(void)
{
	TreeNode * t = factor();
	while ((token == TIMES) || (token == OVER))
	{
		TreeNode * p = newExpNode(OpK);
		if (p != NULL)
		{
			p->child[0] = t;
			p->attr.op = token;
			t = p;
			match(token);
			p->child[1] = factor();
		}
	}
	return t;
}

TreeNode * factor(void)
{
	TreeNode * t = NULL;
	switch (token)
	{
	case NUM:
		t = newExpNode(ConstK);
		if (t != NULL)
			t->attr.val = atoi(tokenString);
		match(NUM);
		break;
	case ID:
		t = newExpNode(IdK);
		if (t != NULL)
			t->attr.name = copyString(tokenString);
		match(ID);
		break;
	case LPAREN:
		match(LPAREN);
		t = exp();
		match(RPAREN);
		break;
	default:
		syntaxError("unexpected token -> ");
		printToken(token, tokenString);
		token = getToken();
		break;
	}
	return t;
}

/****************************************/
/* the primary function of the parser   */
/****************************************/
/* Function parse returns the newly
 * constructed syntax tree
 */
TreeNode * parse(void)
{
	TreeNode * t;
	token = getToken();
	t = program();
	if (token != ENDFILE)
		syntaxError("Code ends before file\n");
	return t;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
人人狠狠综合久久亚洲| 3d动漫精品啪啪1区2区免费| 国产成人精品三级麻豆| 国内国产精品久久| 精品一区二区av| 久久99精品一区二区三区 | 成人免费毛片高清视频| 国产乱人伦偷精品视频不卡| 国产在线日韩欧美| 国产传媒欧美日韩成人| 国产成人精品一区二区三区网站观看 | 天堂成人免费av电影一区| 天天综合网 天天综合色| 午夜欧美在线一二页| 蜜臀av国产精品久久久久| 美女视频一区二区| 国产盗摄女厕一区二区三区| 成人福利视频在线看| 91首页免费视频| 欧美日韩一区 二区 三区 久久精品| 在线一区二区视频| 欧美高清www午色夜在线视频| 日韩免费看的电影| 国产三级一区二区三区| 亚洲卡通动漫在线| 天天综合网 天天综合色| 激情小说欧美图片| 成人精品视频.| 欧美色图在线观看| 日韩午夜在线观看| 国产视频一区二区在线| 亚洲尤物视频在线| 蜜乳av一区二区三区| 国产91丝袜在线18| 在线区一区二视频| 欧美成人午夜电影| 亚洲欧洲日产国码二区| 亚洲第一av色| 国产精品一区二区视频| 色偷偷久久人人79超碰人人澡| 在线播放91灌醉迷j高跟美女| 精品国产露脸精彩对白| 亚洲女同ⅹxx女同tv| 久久福利资源站| 91视频在线看| 精品少妇一区二区三区日产乱码 | 精品视频123区在线观看| 精品成人一区二区三区四区| 成人欧美一区二区三区白人| 五月天网站亚洲| 国产sm精品调教视频网站| 欧美性大战久久久| 久久嫩草精品久久久久| 亚洲中国最大av网站| 黑人精品欧美一区二区蜜桃| 色婷婷激情一区二区三区| 精品国产凹凸成av人网站| 亚洲视频免费观看| 黑人巨大精品欧美黑白配亚洲| 色婷婷av一区二区三区gif| 久久久综合激的五月天| 天天影视网天天综合色在线播放| 高清在线观看日韩| 日韩女优电影在线观看| 亚洲女女做受ⅹxx高潮| 激情欧美一区二区三区在线观看| 91高清视频在线| 国产欧美日韩在线看| 日本va欧美va欧美va精品| 91免费看`日韩一区二区| 久久影院视频免费| 午夜精品久久久久影视| 91丨九色丨蝌蚪富婆spa| 国产网站一区二区| 激情综合网天天干| 欧美二区三区91| 亚洲精品国产视频| 国产成人小视频| 久久这里都是精品| 看电影不卡的网站| 欧美久久婷婷综合色| 亚洲黄色小视频| heyzo一本久久综合| 日韩精品一区二区三区在线播放 | 亚洲欧美在线视频| 国产精品乡下勾搭老头1| 欧美成人高清电影在线| 日本美女一区二区三区视频| 精品视频在线视频| 一区二区在线观看视频在线观看| 成人国产一区二区三区精品| 国产午夜久久久久| 国产精品1区2区3区在线观看| 日韩视频永久免费| 免费在线成人网| 欧美成人性战久久| 精品一区二区三区在线观看国产| 欧美一级日韩一级| 日本三级亚洲精品| 日韩欧美国产综合| 精品一区二区在线观看| xnxx国产精品| 国产精品小仙女| 国产精品伦一区二区三级视频| 成人午夜视频福利| 中文字幕一区二区三区在线播放| 成人精品国产福利| 国产精品乱码久久久久久| av一区二区久久| 亚洲天堂av一区| 欧美怡红院视频| 午夜视频一区二区| 91精品国产福利| 裸体一区二区三区| 久久久99久久| 99re6这里只有精品视频在线观看| 国产精品久久久久久久久快鸭| 91猫先生在线| 午夜亚洲福利老司机| 日韩精品一区二区在线观看| 国产精品1024久久| 亚洲视频小说图片| 欧美日韩精品一区视频| 蜜臀久久99精品久久久久宅男| 欧美tickle裸体挠脚心vk| 粉嫩高潮美女一区二区三区 | 精品一区二区日韩| 国产精品久久久久一区| 在线精品视频免费播放| 全部av―极品视觉盛宴亚洲| 精品国产一区二区三区av性色| 国产伦精品一区二区三区免费| 国产精品丝袜一区| 一本久久a久久精品亚洲| 日本一道高清亚洲日美韩| www国产精品av| 色哟哟一区二区三区| 日本一区中文字幕| 国产精品视频观看| 日本韩国欧美在线| 精品制服美女久久| 中文字幕五月欧美| 欧美一级国产精品| 成人一区二区三区中文字幕| 亚洲高清一区二区三区| 久久久久久久电影| 91黄色在线观看| 极品少妇xxxx偷拍精品少妇| 亚洲美女电影在线| 日韩精品一区二区三区视频播放| 国产91精品在线观看| 亚洲r级在线视频| 国产欧美精品一区aⅴ影院 | 久久九九99视频| 在线视频国内一区二区| 国内精品国产三级国产a久久| 一区二区三区四区在线免费观看| 日韩欧美一卡二卡| 色婷婷久久久亚洲一区二区三区| 国模无码大尺度一区二区三区| 亚洲另类在线一区| 欧美经典三级视频一区二区三区| 欧美日本国产一区| 97久久久精品综合88久久| 麻豆国产精品一区二区三区 | 亚洲一区二区欧美| 国产欧美一区二区三区网站 | 亚洲国产乱码最新视频| 国产精品久久久久天堂| 精品欧美黑人一区二区三区| 欧美性淫爽ww久久久久无| 国产风韵犹存在线视精品| 另类小说色综合网站| 亚洲在线视频一区| 亚洲欧美一区二区久久| 国产欧美精品国产国产专区 | 亚洲精品日韩综合观看成人91| 久久久久久电影| 欧美一级一区二区| 欧美色图天堂网| 91麻豆6部合集magnet| 国产69精品久久99不卡| 九色综合狠狠综合久久| 日韩—二三区免费观看av| 亚洲欧美日韩中文字幕一区二区三区 | 久久久久久夜精品精品免费| 欧美福利视频一区| 91精品91久久久中77777| 成人午夜av在线| 国产99久久精品| 国产成人欧美日韩在线电影| 久久av老司机精品网站导航| 视频一区二区不卡| 午夜国产精品影院在线观看| 亚洲午夜一区二区| 一区二区三区日韩欧美精品| 亚洲日本中文字幕区| 成人欧美一区二区三区1314| 国产精品不卡视频| 亚洲天堂av一区|