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

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

?? parse.cpp

?? CMinus 小型編譯器的詞法分析與語法分析部分
?? CPP
字號:
/****************************************************/
/* 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;

static TreeNode * declaration_list(void);
static TreeNode * declaration(void);
static TreeNode * params(void);
static TreeNode * param_list(void);
static TreeNode * param(void);
static TreeNode * compound_stmt(void);
static TreeNode * local_declarations(void);
static TreeNode * statement_list(void);
static TreeNode * statement(void);
static TreeNode * expession_stmt(void);
static TreeNode * selection_stmt(void);
static TreeNode * iteration_stmt(void);
static TreeNode * return_stmt(void);
static TreeNode * expression(void);
static TreeNode * expression_stmt(void);
static TreeNode * var(void);
static TreeNode * simple_expression(void);
static TreeNode * additive_expression(void);
static TreeNode * term(void);
static TreeNode * factor(void);
static TreeNode * call(void);
static TreeNode * args(void);
static TreeNode * arg_list(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 * declaration_list(void)
{
	TreeNode * t = NULL;
	if(token == INT|| token == VOID)
	{
		t = declaration();
		TreeNode * p = t;
		while ((token != ENDFILE)&&(token == INT || token == VOID))
		{
			TreeNode * q = declaration();
			if (q != NULL)
			{
				if (t != NULL)	t = p = q;
				else
				{
					p->sibling = q;
					p = q;
				}
			}
		}
	}
	return t;
}

TreeNode * declaration(void)
{
	TreeNode * t = newDecNode();
	switch(token) {
	case INT:
		t->attr.type = "int";
		match(INT);
		break;
	case VOID:
		t->attr.type = "void";
		match(VOID);
		break;
	default:
		syntaxError("unexpected token in Type-> ");
		printToken(token,tokenString);
		token = getToken();
		break;
	}
	t->attr.name = copyString(tokenString);
	match(ID);
	switch(token) {
		case SEMI:
			match(SEMI);
			t->kind.dec = VarK;
			break;
		case LBRA:
			match(LBRA);
			t->kind.dec = ArrayK;
			t->child[0] = factor();
			match(RBRA);
			match(SEMI);
			break;
		case LPAREN:
			match(LPAREN);
			t->kind.dec = FunK;
			if (t != NULL)
				t->child[0] = params();
			match(RPAREN);
			if (t != NULL)
				t->child[1] = compound_stmt();
			break;
		default:
			syntaxError("unexpected token in Declaration -> ");
			printToken(token,tokenString);
			token = getToken();
			break;
	}
	return t;
}

TreeNode * params(void)
{
	TreeNode * t = newParamNode(Null);
	if (token == VOID)
	{
		t->attr.type = copyString(tokenString);
		match(VOID);
	}
	else if(token == INT)
		t->child[0] = param_list();
	else
	{
		syntaxError("unexpected token in Params -> ");
		printToken(token,tokenString);
		token = getToken();
	}
	return t;
}

TreeNode * param_list(void)
{
	TreeNode * t = param();
	TreeNode * p = t;
	while(token == COMMA)
	{
		match(COMMA);
		TreeNode * q = param();
		if(q != NULL)
		{
			if(t == NULL)	t = p = q;
			else
			{
				p->sibling = q;
				p = q;
			}
		}
	}
	return t;
}

TreeNode * param(void)
{
	TreeNode * t = newParamNode(Null);
	t->attr.type = copyString(tokenString);
	match(INT);
	t->kind.param = Var;
	t->attr.name = copyString(tokenString);
	match(ID);
	if (token == LBRA)
	{
		match(LBRA);	//識別數組;
		t->kind.param = Array;
		match(RBRA);
	}
	return t;
}

TreeNode * compound_stmt()
{
	TreeNode * t = newStmtNode(CompoundK);
	match(LBRACE);
	if((t != NULL)&&(token == INT || token == VOID))
		t->child[0] = local_declarations();
	if (t!=NULL)
		t->child[1] = statement_list();
	match(RBRACE);
	return t;
}

TreeNode * local_declarations(void)
{
	TreeNode * t = declaration();
	TreeNode * q =t;
	while(token == INT)
	{
		TreeNode * p = declaration();
		q->sibling=p;
		q=p;
	}
	return t;
}

TreeNode * statement_list(void)
{
	TreeNode * t = statement();
	TreeNode * q = t;
	while((token != RBRACE)&&(token != ENDFILE))
	{
		TreeNode *  p = statement();
		if(p!=NULL)
		{ 
			if(q==NULL)t=q=p;
			else
			{  
			q->sibling = p;
			q = p;}
			}
	}
	return t;
}

TreeNode * statement(void)
{
	TreeNode * t = NULL;
	switch(token){
		case LBRACE:	t = compound_stmt();break;
		case IF:	t = selection_stmt();break;
		case WHILE:	t = iteration_stmt();break;
		case RETURN:	t = return_stmt();break;
		case LPAREN:
		case ID:
		case NUM:
		case SEMI:
			t = expression_stmt();break;
		default:
			syntaxError("unexpected statement -> ");
			printToken(token,tokenString);
			token = getToken();
			break;
	}
	return t;
}

TreeNode * expression_stmt(void)
{
	TreeNode * t = newStmtNode(ExpressionK);
	if (token == SEMI){
		match(SEMI); 
	}
	else
	{
		t->child[0] = expression();
		match(SEMI);
	}
	return t;
}

TreeNode * selection_stmt(void)
{
	TreeNode * t = newStmtNode(SelectionK);
	match(IF);
	match(LPAREN);
	if(t != NULL)	t->child[0] = expression();
	match(RPAREN);
	if(t != NULL)	t->child[1] = statement();
	if(token == ELSE)
	{
		match(ELSE);
		if(t != NULL)	t->child[2] = statement();
	}
	return t;
}

TreeNode * iteration_stmt(void)
{
	TreeNode * t = newStmtNode(IterationK);
	match(WHILE);
	match(LPAREN);
	if(t != NULL)	t->child[0] = expression();
	match(RPAREN);
	if(t != NULL)	t->child[1] = statement();
	return t;
}

TreeNode * return_stmt(void)
{
	TreeNode * t = newStmtNode(ReturnK);
	match(RETURN);
	if(token == SEMI)
		match(SEMI);
	else 
	{
		t->child[0]=expression();
		match(SEMI);
	}
	return t;
}

TreeNode * expression(void)
{
	TreeNode * t = simple_expression();
	if(token==ASSIGN)
	{
		TreeNode * p = newExpNode(OpK);
		if (p!=NULL)
		{
			p->child[0] = t;
			p->attr.op = token;
			t = p;
			match(token);
			t->child[1] = expression();
		}
		
	}
	return t;
}
TreeNode * var(void)
{
	TreeNode * t = newExpNode(IdK);
	t->attr.name = copyString(tokenString);
	match(ID);
	if(token == LBRA)
	{
		match(LBRA);
		t->child [0] = expression();
		match(RBRA);
	}
	return t;
}

TreeNode * simple_expression(void)
{
	TreeNode * t = additive_expression();
	if ((token == LT)||(token == LTEQ)||(token == GT)||(token == GTEQ)||(token == EQ)||(token ==NOEQ))
	{
		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] = additive_expression();
	}
	return t;
}

TreeNode * additive_expression(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;
	char * varToken;
	switch(token) {
		case NUM:
			t = newExpNode(ConstK);
			if ((t != NULL)&&(token == NUM))
			{
				t->attr.val = atoi(tokenString);
				match(NUM);
			}
			break;
		case LPAREN:
			match(LPAREN);
			t = expression();
			match(RPAREN);
			break;
		case ID:
			{
			varToken = copyString(tokenString);
			match(ID);
			if(token == LBRA)
			{
					t = newExpNode(IdK);
					match(LBRA);
					t->attr.name = copyString(varToken);
					t->child[0] = expression();
					match(RBRA);
			}
			else if(token == LPAREN)
			{
					t = newExpNode(CallK);
					t->attr.name = copyString(varToken);
					match(LPAREN);
					t->child[0] = args();
					match(RPAREN);
			}
			else
			{
					t = newExpNode(IdK);
					t->attr.name = copyString(varToken);
			}
			}
			break;
		default:
			syntaxError("unexpected token in factor-> ");
			printToken(token,tokenString);
			token = getToken();
			break;
	}
	return t;
}

TreeNode * args(void)
{
	TreeNode * t = NULL;
	if (token != RPAREN)
		t = arg_list();
	return t;
}

TreeNode * arg_list(void)
{
	TreeNode * t = expression();
	TreeNode * p = t;
	while(token != RPAREN)
	{
		match(COMMA);
		TreeNode * q = expression();
		if(q != NULL)
		{
			if(t == NULL)	t = p = q;
			else
			{
				p->sibling = q;
				p = q;
			}
		}
	}
	return t;
}

/****************************************/
/* the primary function of the parser   */
/****************************************/

TreeNode * parse(void)
{ TreeNode * t;
  token = getToken();
  t = declaration_list();
  if (token!=ENDFILE)
    syntaxError("Code ends before file\n");
  return t;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
一级日本不卡的影视| 亚洲国产欧美在线人成| 亚洲一区免费在线观看| 久久99精品久久久久婷婷| eeuss国产一区二区三区| 日韩一级高清毛片| 亚洲综合激情小说| 丁香六月综合激情| 亚洲精品一区在线观看| 亚洲第一在线综合网站| 99精品热视频| 久久精品夜色噜噜亚洲aⅴ| 日韩一级免费一区| 韩国毛片一区二区三区| 国产嫩草影院久久久久| 日韩影院在线观看| 色婷婷精品大在线视频| 国产午夜精品美女毛片视频| 热久久国产精品| 91美女视频网站| 国产精品黄色在线观看| 国产精品18久久久久久久久 | 色久综合一二码| 久久久久国产免费免费| 狠狠色丁香九九婷婷综合五月| 欧美三级电影一区| 一区二区三区四区在线免费观看| 国产.欧美.日韩| 国产亚洲成年网址在线观看| 久久电影国产免费久久电影 | 午夜影院久久久| 欧美午夜视频网站| 亚洲一区二区五区| 欧美日韩国产影片| 五月婷婷久久综合| 正在播放亚洲一区| 蜜臀va亚洲va欧美va天堂| 91精品免费在线观看| 美国精品在线观看| 26uuu国产一区二区三区| 精品一区二区久久久| 久久午夜色播影院免费高清 | 亚洲成人午夜影院| 欧美亚洲国产一区二区三区| 亚洲已满18点击进入久久| 欧洲国产伦久久久久久久| 亚洲韩国一区二区三区| 欧美日韩电影在线播放| 热久久久久久久| 国产性做久久久久久| 成人精品高清在线| 亚洲一区二区三区三| 欧美日韩中文一区| 狠狠狠色丁香婷婷综合激情| 国产婷婷一区二区| 在线观看免费一区| 久久99久久精品| 亚洲国产岛国毛片在线| 在线国产电影不卡| 蜜臀久久99精品久久久久久9| 久久久综合视频| 色综合久久精品| 久久激情综合网| 亚洲天堂免费在线观看视频| 欧美在线播放高清精品| 激情成人综合网| 亚洲欧美日韩在线| 日韩精品资源二区在线| 成人av集中营| 久久精工是国产品牌吗| 亚洲欧洲精品天堂一级| 91精品婷婷国产综合久久| 国产精品资源网| 婷婷综合五月天| 国产精品欧美一级免费| 91精品国产综合久久久蜜臀图片 | 日韩电影免费一区| 中文字幕免费观看一区| 欧美日韩一区视频| 成人午夜精品在线| 石原莉奈一区二区三区在线观看| 中文一区二区完整视频在线观看| 欧美吻胸吃奶大尺度电影| 国产麻豆91精品| 日本伊人色综合网| 亚洲精品视频免费观看| 久久精品亚洲精品国产欧美kt∨| 欧美视频中文一区二区三区在线观看| 久久er精品视频| 亚洲成人动漫av| 亚洲婷婷国产精品电影人久久| 精品国产免费视频| 欧美男人的天堂一二区| 色一情一乱一乱一91av| 国产成人av电影在线| 久久精品免费观看| 偷拍亚洲欧洲综合| 国产精品二区一区二区aⅴ污介绍| 欧美日韩一区二区在线视频| 国产欧美日韩三区| 99国产精品久久久久久久久久久| 麻豆91精品91久久久的内涵| 香蕉久久一区二区不卡无毒影院| 中文字幕日本乱码精品影院| 欧美国产激情一区二区三区蜜月| 欧美xxxxxxxx| 日韩欧美一卡二卡| 欧美一区二区三区免费视频| 欧美日韩一区二区三区高清| 日本久久精品电影| 色噜噜狠狠一区二区三区果冻| 高清不卡一区二区| 风间由美一区二区三区在线观看 | 精品欧美一区二区在线观看| 51精品视频一区二区三区| 精品视频一区二区三区免费| 欧美日韩一本到| 欧美军同video69gay| 在线不卡欧美精品一区二区三区| 欧美日韩情趣电影| 欧美理论在线播放| 欧美一级爆毛片| 精品国产乱码久久久久久1区2区| 欧美www视频| 久久美女艺术照精彩视频福利播放| 久久新电视剧免费观看| 国产亚洲精品aa午夜观看| 中文字幕av一区二区三区免费看| 国产女人aaa级久久久级| 中文字幕日韩一区| 亚洲自拍偷拍av| 青青草视频一区| 国产一区福利在线| 成人妖精视频yjsp地址| 91丨porny丨国产入口| 欧美日韩国产一二三| 日韩一区二区不卡| 国产午夜精品福利| 一区二区三区在线不卡| 日韩专区在线视频| 国产露脸91国语对白| 99国产精品久久久久| 欧美日韩你懂得| 欧美成人一级视频| 天天综合网 天天综合色| 老司机精品视频导航| 国产成人精品免费网站| 91福利在线看| 精品欧美乱码久久久久久1区2区 | 亚洲夂夂婷婷色拍ww47| 日本欧美韩国一区三区| 成人性生交大片免费看视频在线| 色综合天天狠狠| 精品日韩av一区二区| 亚洲色图欧洲色图| 美女视频黄免费的久久| 99热这里都是精品| 91精品国产欧美日韩| 日韩理论片网站| 久久99国产精品久久99| 91久久精品一区二区| 久久久噜噜噜久久中文字幕色伊伊| 一区二区三区欧美日韩| 精品一区二区三区久久久| 欧洲精品一区二区| 久久久av毛片精品| 亚洲一区影音先锋| 丁香啪啪综合成人亚洲小说 | 欧美tickling挠脚心丨vk| 亚洲欧美精品午睡沙发| 国产在线播放一区三区四| 欧美性videosxxxxx| 国产精品久久久久久久久动漫 | 精品成人a区在线观看| 亚洲国产精品国自产拍av| 天堂一区二区在线| 色综合久久综合| 国产欧美日韩在线视频| 美腿丝袜一区二区三区| 欧美日韩亚洲综合在线| 亚洲欧美一区二区久久| 国产成人亚洲精品青草天美| 日韩欧美一级精品久久| 亚洲va天堂va国产va久| 色综合天天做天天爱| 亚洲国产精品二十页| 狠狠色综合播放一区二区| 5858s免费视频成人| 亚洲国产精品人人做人人爽| 91蜜桃在线免费视频| 国产精品美女久久久久久久久| 精品综合久久久久久8888| 欧美精品久久久久久久多人混战| 亚洲天堂福利av| 99国产精品久久久久| 国产精品久久看| 99视频有精品| 亚洲人吸女人奶水| 在线电影欧美成精品| 国产精品另类一区|