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

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

?? yufa.cpp

?? 本程序是實現(xiàn)C-的一個小型編譯器
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h"
#define N  5
typedef struct token
{
	int LineofPro;
	int code;
	char name[30];
}token;

/*語法樹的數(shù)據(jù)結(jié)構(gòu)*/
typedef struct  CTreeNode
{
	int Node_Number;//結(jié)點編號
	int FID;//所用產(chǎn)生式編號
	//int code;//終結(jié)符編號,非終結(jié)符設(shè)置為0,終結(jié)符按編號來處理
	//char name[30];//終結(jié)符名稱,非終結(jié)符設(shè)置為空
	struct token TOKEN;
	struct CTreeNode *Leftchild;//左孩子結(jié)點
	struct CTreeNode *Rightsibling;//右兄弟結(jié)點
	struct CTreeNode *father;//指向父結(jié)點
}CTreeNode,*SyntaxTree;

int k=1;//結(jié)點編號依次累加
CTreeNode* m_pProgram;

//不處理數(shù)組
char stack[10];//棧,用來放括號,如果括號匹配則將高度降一格,并將上格置空
char status[5];//用來暫存數(shù)據(jù)類型或函數(shù)返回值類型,不存放形參
char variable[10];//用來暫存變量名
char function[10];//用來暫存函數(shù)名

/*變量表*/
typedef struct Variable_Table
{
	char name[30];//變量名	
	char type[5]; //變量數(shù)據(jù)類型
	int  kind;//1為全局變量,2為函數(shù)形參,3為函數(shù)局部變量
	int  scope;//作用域,指層數(shù)   定義:10:全局變量; 11:第一個函數(shù)體第一層(最外層)
}Variable_Table;//                12:第一個函數(shù)體第二層;  21:第二個函數(shù)體第一層

/*函數(shù)表*/
typedef struct Global_function
{
	char function_name[10];//函數(shù)名
	char type[5];//函數(shù)返回類型
	int  parameter_variable;//函數(shù)第一個形參在變量表的位置
	int  local_variable;//函數(shù)體內(nèi)的第一個局部變量在變量表里的位置
}Global_function;

/*四元式結(jié)構(gòu)*/
typedef struct equ
{
	char op[10];
	char arg1[10];
	char arg2[10];
	int result;
}equ;
equ EQU[200];//用來存放四元式的結(jié)構(gòu)體數(shù)組

int True_address;//用來存放真出口標號
//因為不做if_else和while的嵌套,所以當做完if和while,truelist和falselist置空
int False_address;//用來存放假出口標號
char OP[10];//用來暫存op符號,如果有必要
char ARG1[10];//用來暫存arg1,如果有必要
char ARG2[10];//用來暫存arg2,如果有必要
int  RESULT;//用來暫存變量名在變量表里的地址標號或填回填標號
int  nextquad=100;//起始標號,注意每次累加
char expression_stack[10][10];//棧,用來暫存求表達式的值,以便生成四元式,這里不考慮算符優(yōu)先
int  Top_stack=0;

FILE *TokenFile;//打開token文件
int error_count=0;//記錄語法有幾個錯誤
token CurrentToken,curToken;
token CurToken[10000];//token文件寫到結(jié)構(gòu)體數(shù)祖
int Token_Number=57;//token表單詞數(shù)量,由詞法分析器提供
Variable_Table VT[20];//變量表的結(jié)構(gòu)體數(shù)組
Global_function GFT[10];//函數(shù)表的結(jié)構(gòu)體數(shù)組
int j=1;
int TopVT=1;//變量表的結(jié)構(gòu)體數(shù)組計數(shù)
int TopGFT=1;//函數(shù)表的結(jié)構(gòu)體數(shù)組計數(shù)
int flag;//判別是插入變量名表還是函數(shù)名表
int param_number=0;//形參個數(shù)
int local_number=0;//局部變量個數(shù)
int Par_number=0;//記錄{}匹配的次數(shù)
int R=0;//用來放括號'{'和'}'
int r=0;//用來放括號,如果匹配成功,減1


/*語法和語義函數(shù)聲明*/
void NextToken();
void advance();
void parser();
CTreeNode* program();
CTreeNode* declaration_list();
CTreeNode* declaration_list1();
CTreeNode* declaration();
CTreeNode* declaration1();
CTreeNode* type_specifier();
CTreeNode* params();
CTreeNode* param_list();
CTreeNode* param_list1();
CTreeNode* param();
CTreeNode* param1();
CTreeNode* compound_stmt();
CTreeNode* local_declarations();
CTreeNode* local_declarations1();
CTreeNode* statement_list();
CTreeNode* statement();
CTreeNode* expression_stmt();
CTreeNode* selection_stmt();
CTreeNode* selection_stmt1();
CTreeNode* iteration_stmt();
CTreeNode* return_stmt();
CTreeNode* return_stmt1();
CTreeNode* expression();
CTreeNode* var();
CTreeNode* var1();
CTreeNode* simple_expression();
CTreeNode* simple_expression1();
CTreeNode* relop();
CTreeNode* additive_expression();
CTreeNode* additive_expression1();
CTreeNode* addop();
CTreeNode* term();
CTreeNode* term1();
CTreeNode* mulop();
CTreeNode* factor();
CTreeNode* call();
CTreeNode* args();
CTreeNode* arg_list();
CTreeNode* arg_list1();
bool PrintTree( CTreeNode* );
void Print();
void PrintVT();
void PrintGFT();
void Symble_Table_error(int,int);
void error(int,int);	
void main_error();
void BackPatch(int,int);//出口回填函數(shù)
int  EquPush(char*, char*,char*,int);//生成四元式
int  newtemp();//生成新結(jié)點函數(shù)
void Print_equ();//打印四元式
void expression_in();//表達式入棧
void Init_expression();//表達式棧的初始化

/*********************四元式的操作*****************************/
//出口回填函數(shù),將當前標號cur_addr賦給上一個出口pre_addr
void BackPatch(int pre_addr,int cur_addr)
{
	EQU[pre_addr].result=cur_addr;
	return;
}

//生成四元式的函數(shù),做完將標號加1,
int	EquPush(char *op1,char *addr1,char *addr2,int add_line)
{	
	int i=nextquad;
	strcpy(EQU[nextquad].op,op1);
	strcpy(EQU[nextquad].arg1,addr1);
	strcpy(EQU[nextquad].arg2,addr2);
	EQU[nextquad].result=add_line;
	nextquad++;
	return i;
}
	
//生成一個新結(jié)點,用來存放
int newtemp()
{
	int a;
	a=nextquad-1;
	return a;
}

//打印四元式函數(shù)
void Print_equ()
{	
	printf("code:      op:      arg1:      arg2:      result:\n");
	for(int i=100;i<nextquad;i++)
	{
		printf("%-11d",i);
		printf("%-11s",EQU[i].op);
		printf("%-10s",EQU[i].arg1);
		printf("%-10s",EQU[i].arg2);
		printf("%d\n",EQU[i].result);
	}
}

//表達式棧的初始化
void Init_expression()
{
	strcpy(ARG1,"\0");
	strcpy(ARG2,"\0");
	strcpy(OP,"\0");
	strcpy(expression_stack[Top_stack++],"#");
}
//表達式入棧
void expression_in(char*in_stack)
{
	strcpy(expression_stack[Top_stack++],in_stack);
}

//查找變量在變量表里的位置
int lookup(char *variable_location)
{
	for(int i=1;i<TopVT;i++)
		if((strcmp(variable_location,VT[i].name)==0))
			return i;
}
				
/*******************關(guān)于符號表的操作****************************/
/************符號表的查找函數(shù)*************/
//先在變量表里找,找不到先將名字存在棧里,如果確定是函數(shù)名,
//在函數(shù)表找.查找到了返回1,沒有查找到返回0.
//找到了注意將名字退棧,不要了
int st_lookup (char *pre_name,char *cur_name)
{
	if(((strcmp(cur_name,";"))==0)&&(stack[R-1]!='{'))//程序體未開始,全局變量的情況
	{
		for(int i=1;i<TopVT;i++)
			if((strcmp(pre_name,VT[i].name)!=0)&&(strcmp(status,VT[i].type)!=0))//是否重復(fù)出現(xiàn)		
				;	
			else 
				break;
		if(i==TopVT)//沒有重復(fù)出現(xiàn)
		{	
			flag=0;//變量名
			return 0;//添加進去
		}
		else 
		{
			Symble_Table_error(1,CurToken[j-1].LineofPro);//全局變量重復(fù)或者數(shù)據(jù)類型為void,報錯
			return 1;
		}
	}//全局變量的處理
	else
		if((strcmp(cur_name,"("))==0)//程序開始,函數(shù)名的情況
		{
			for(int i=1;i<TopGFT;i++)
				if((strcmp(pre_name,GFT[i].function_name)!=0))//是否重復(fù)出現(xiàn)		
					;
				else 
					break;
			if(i==TopGFT)//沒有重復(fù)出現(xiàn)
			{	
				flag=1;//函數(shù)名
				return 0;//添加進去
			}
			else 
				return 1;
		}//對于函數(shù)名重復(fù)出現(xiàn)的情況
		else 
			if(stack[R-1]=='(')//形參的情況
			{
				for(int i=TopVT-param_number;i<TopVT;i++)
					if((strcmp(pre_name,VT[i].name)!=0))//是否重復(fù)出現(xiàn)		
						;	
					else 
						break;
				if(i==TopVT)//沒有重復(fù)出現(xiàn)
				{	
					flag=0;//變量名,形參名
					return 0;//添加進去
				}//同一個函數(shù)中不準定義相同的形參
				else 	
				{
					Symble_Table_error(2,CurToken[j-1].LineofPro);//同一個函數(shù)體有兩個相同形參
					return 1;
				}
			}
			else //即將定義的局部變量的處理
				if(((strcmp(cur_name,";"))==0)&&(stack[R-1]=='{'))
				{
					for(int i=1;i<TopVT;i++)
					{		
						if((strcmp(pre_name,VT[i].name)!=0))		
							;	
						else 
							if((strcmp(pre_name,VT[i].name)==0)&&(VT[i].scope/10!=(Par_number+1)))
								;//同名但作用域不同
							else
								break;
					}
					if(i==TopVT)//沒有重復(fù)出現(xiàn)
					{	
						flag=0;//變量名
						return 0;//添加進去
					}
					else 
					{
						Symble_Table_error(3,CurToken[j-1].LineofPro);//函數(shù)體定義了相同的局部變量
						return 1;
					}
				}
				else
					return 1;
}

int st_lookup(char *cur_name)//查找是否是已經(jīng)定義過的局部變量或調(diào)用函數(shù)
{
	for(int i=1;i<TopVT;i++)//在變量名表里面查,有的話return 1,沒有return 0.
	{
		if((strcmp(cur_name,VT[i].name)==0)&&(VT[i].scope/10==(Par_number+1)))//重復(fù)出現(xiàn)		
			return 1;
	}
	if(i==TopVT)
	{
		for(int j=1;j<TopGFT;i++)//在函數(shù)名表里面查
		{
			if((strcmp(cur_name,GFT[j].function_name)==0))
				return 1;
		}
		if(i==TopGFT)
		{
			Symble_Table_error(5,CurToken[j].LineofPro);//此調(diào)用函數(shù)未定義
			return 0;
		}
	
		Symble_Table_error(4,CurToken[j].LineofPro);//此局部變量未在函數(shù)體里定義
		return 0;
	}
	else 
		return 0;
}

/************符號表的插入函數(shù)*************/
//如果在變量名表和函數(shù)表里都沒有找到,則需要將名字插入變量名表或函數(shù)名表
//這里要設(shè)置一個標記flag,用來分辨此名字是變量名還是函數(shù)名
//flag=0,表示是變量名;flag=1,表示是函數(shù)名,注意插入的表
void st_insert(char *name,char *TYPE,char *CUR_NAME)
{
	if((st_lookup(name,CUR_NAME))==0)//沒有找到,需要插入
	{
		if((flag==0)&&((strcmp(CUR_NAME,";"))==0)&&(stack[R-1]!='{'))//全局變量名,插入到變量名表中
		{
			strcpy(VT[TopVT].name,name);
			strcpy(VT[TopVT].type,TYPE);
			VT[TopVT].kind=1;
			VT[TopVT].scope=10;
			TopVT++;
		}
		else 
			if((stack[R-1]=='(')&&(flag==0))//形參的插入
			{
				strcpy(VT[TopVT].name,name);
				strcpy(VT[TopVT].type,TYPE);
				VT[TopVT].kind=2;
				VT[TopVT].scope=(Par_number+1)*10+R;
				if(param_number==1)//將第一個形參位置放進相應(yīng)函數(shù)里函數(shù)
				{
					for(int i=1;i<=TopGFT;i++)
						if((strcmp(GFT[i].function_name,function))==0)
						{
							GFT[i].parameter_variable=TopVT;
							break;
						}
				}
				TopVT++;
			}
			else
				if(((strcmp(CUR_NAME,";"))==0)&&(stack[R-1]=='{')&&(flag==0))//局部變量的插入
				{
					strcpy(VT[TopVT].name,name);
					strcpy(VT[TopVT].type,TYPE);
					VT[TopVT].kind=3;
					
					VT[TopVT].scope=(Par_number+1)*10+r;
					if(local_number==1)
					{
						for(int i=1;i<TopGFT;i++)
							
							if((strcmp(GFT[i].function_name,function))==0)
							{
								GFT[i].local_variable=TopVT;
								break;
							}
					}
					TopVT++;					
				}
				else
					if((flag==1)&&((strcmp(CUR_NAME,"("))==0))//函數(shù)名的插入
				{
					strcpy(GFT[TopGFT].function_name,name);
					strcpy(GFT[TopGFT].type,TYPE);
					TopGFT++;
				}
			}
}

/***************函數(shù)實現(xiàn)及代碼*********************/
void InitTree()//語法樹的初始化
{
	m_pProgram=(SyntaxTree)malloc(sizeof(CTreeNode));
	m_pProgram = NULL;
}

CTreeNode* BuildSyntaxTree()
{
	return (m_pProgram=program());
}

bool PrintTree( CTreeNode* m_pProgram )
{
	if(m_pProgram)
	{
		printf("%-8d   ",m_pProgram->Node_Number);
		printf("%-10d   ",m_pProgram->TOKEN.LineofPro);
		printf("%-8d   ",m_pProgram->TOKEN.code);
		printf("%-8s   ",m_pProgram->TOKEN.name);
		if(m_pProgram->father!=NULL)
			printf("%-10d",m_pProgram->father->Node_Number);
		else 
			printf("          ");
		switch(m_pProgram->FID)
		{
			case 1: printf("pragram->declaration_list");
					break;
			case 2: printf("declaration_list->declaration declaration_list1");
				    break;
			case 3: printf("declaration_list1->declaration declaration_list1| ^");
				    break;
			case 4: printf("declaration->type_specifier ID declaration1");
				    break;
			case 5: printf("declaration1->;|[NUM];|(params) compound_stmt");
				    break;
			case 6: printf("type_specifier->int|void");
					break;
			case 7: printf("params->param_list|void");
					break;
			case 8: printf("param_list->param param_list1");
					break;
            case 9: printf("param_list1->,param param_list1|^");
					break;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产91洋老外米糕| 亚洲欧洲综合另类| 日韩一区二区精品葵司在线| 欧美日韩视频在线观看一区二区三区| 99天天综合性| av亚洲精华国产精华| 99久久精品情趣| 97久久精品人人澡人人爽| av欧美精品.com| 日本韩国欧美一区| 欧美性大战久久久久久久| 欧美日韩精品专区| 91精品啪在线观看国产60岁| 日韩一区二区三区在线观看 | 国产欧美日韩激情| 久久精品夜色噜噜亚洲a∨| 久久精品亚洲一区二区三区浴池| 国产精品三级久久久久三级| 日韩毛片视频在线看| 亚洲一线二线三线视频| 三级影片在线观看欧美日韩一区二区| 日韩电影在线免费观看| 九九视频精品免费| 成人a免费在线看| 色综合久久久久久久久| 欧美日韩国产小视频在线观看| 欧美一区二区三区喷汁尤物| 精品福利在线导航| 亚洲欧洲99久久| 亚洲高清免费一级二级三级| 免费xxxx性欧美18vr| 国产精品18久久久久久久久 | 在线免费不卡电影| 91精品国产91久久久久久一区二区| 精品日韩一区二区三区 | 成人av电影在线| 欧美调教femdomvk| 精品国产乱码久久久久久久 | 日本vs亚洲vs韩国一区三区二区| 国产一区二区视频在线| 色偷偷成人一区二区三区91 | 亚洲国产精品高清| 亚洲综合丁香婷婷六月香| 裸体歌舞表演一区二区| youjizz国产精品| 678五月天丁香亚洲综合网| 久久久一区二区| 亚洲一区二区av电影| 国精产品一区一区三区mba视频| 99精品视频中文字幕| 日韩午夜av一区| 亚洲色图欧洲色图婷婷| 久久国产免费看| 91极品美女在线| 久久久一区二区三区捆绑**| 亚洲成av人片一区二区| 国产不卡视频一区| 制服丝袜激情欧洲亚洲| 国产精品无遮挡| 毛片av一区二区| 在线观看视频一区二区欧美日韩 | 久国产精品韩国三级视频| 91在线视频网址| 久久综合中文字幕| 亚洲mv在线观看| 色综合一个色综合亚洲| 亚洲精品一区二区三区蜜桃下载 | youjizz久久| ww亚洲ww在线观看国产| 亚洲成人自拍网| 91丝袜国产在线播放| 久久综合九色综合欧美就去吻| 亚洲一线二线三线视频| 91香蕉国产在线观看软件| 久久亚洲欧美国产精品乐播| 日韩国产在线观看一区| 色欧美日韩亚洲| 亚洲欧洲另类国产综合| 国产精品一二三| xf在线a精品一区二区视频网站| 婷婷六月综合网| 色综合久久久久| 亚洲欧美日韩久久精品| 国产91丝袜在线18| 久久久综合视频| 国产一区91精品张津瑜| 日韩欧美第一区| 青草av.久久免费一区| 欧美欧美欧美欧美| 亚洲大片在线观看| 欧美日韩亚洲不卡| 午夜电影一区二区三区| 在线观看欧美黄色| 亚洲一区在线播放| 色哟哟在线观看一区二区三区| 国产精品蜜臀av| 成人高清免费在线播放| 国产精品天天摸av网| 国产suv精品一区二区三区| 日韩美女视频在线| 美国毛片一区二区三区| 精品捆绑美女sm三区| 久久精品国产亚洲a| 亚洲精品一区二区三区精华液| 麻豆免费看一区二区三区| 日韩三级在线观看| 麻豆精品一区二区综合av| 欧美大尺度电影在线| 精品亚洲免费视频| 久久九九影视网| 高清不卡在线观看| 国产精品日产欧美久久久久| 99视频精品在线| 亚洲欧美视频在线观看视频| 色天使色偷偷av一区二区| 亚洲va欧美va人人爽午夜| 在线不卡欧美精品一区二区三区| 日韩影院在线观看| 精品日产卡一卡二卡麻豆| 国产精品一区在线观看你懂的| 国产亚洲视频系列| 99久久婷婷国产综合精品电影| 亚洲综合色婷婷| 欧美一区二区高清| 极品少妇一区二区三区精品视频| 国产日韩欧美制服另类| 91免费看视频| 调教+趴+乳夹+国产+精品| 日韩精品一区二区三区视频| 国产成人免费在线| 亚洲图片另类小说| 欧美亚洲另类激情小说| 欧美aⅴ一区二区三区视频| 久久久久久夜精品精品免费| a级精品国产片在线观看| 亚洲va在线va天堂| 久久久精品综合| 在线免费观看不卡av| 黄一区二区三区| 亚洲欧洲精品成人久久奇米网| 欧美色男人天堂| 国产综合色视频| 一区二区三区四区蜜桃| 欧美大度的电影原声| 91麻豆.com| 毛片不卡一区二区| 亚洲美女在线一区| 精品人在线二区三区| 99精品热视频| 久久精品国产精品亚洲精品 | 波多野结衣中文字幕一区二区三区| 一区二区欧美精品| www精品美女久久久tv| 色综合久久综合网欧美综合网| 理论片日本一区| 亚洲人一二三区| 精品国产第一区二区三区观看体验| k8久久久一区二区三区 | 欧美三片在线视频观看 | 日韩欧美国产综合| 色悠悠亚洲一区二区| 韩国毛片一区二区三区| 一区二区三区不卡视频在线观看 | 国产精品网站在线播放| 91精品国产色综合久久不卡蜜臀| 成人精品国产福利| 久久99精品久久久久婷婷| 一区二区三区四区中文字幕| 久久精品视频一区二区三区| 欧美日韩激情在线| 91丝袜呻吟高潮美腿白嫩在线观看| 国产尤物一区二区在线| 亚洲va欧美va人人爽午夜| 亚洲色图自拍偷拍美腿丝袜制服诱惑麻豆| 精品三级av在线| 欧美一级日韩不卡播放免费| 在线免费观看日本一区| 成人av网站在线观看免费| 久久福利视频一区二区| 亚洲第一激情av| 一二三区精品视频| 国产精品不卡一区二区三区| 国产亚洲综合性久久久影院| 欧美一区二区精品在线| 67194成人在线观看| 欧美私人免费视频| 一本大道久久精品懂色aⅴ| 成人综合在线网站| 国产麻豆精品theporn| 美女一区二区三区在线观看| 视频在线观看91| 亚洲国产一区在线观看| 亚洲综合久久av| 亚洲一区在线观看免费观看电影高清| 中文字幕一区二区在线观看| 中文字幕av一区二区三区高| 久久久91精品国产一区二区三区| 精品国产乱码久久久久久1区2区 | 久久尤物电影视频在线观看| 日韩一级二级三级精品视频|