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

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

?? parser.cpp

?? 一個采用面向對象實現編譯解釋器,自己驗證過絕對能用.
?? CPP
字號:
#include"parser.h"
#include"stdarg.h"
#include "semantics.h"

#define enter(x) printf("enter in ");printf(x);printf("\n")

#define back(x)printf("exit from ");printf(x);printf("\n")

#define call_match(x)printf("matchtoken ");printf(x);printf("\n")

#define Tree_trace(x) PrintSyntaxTree(x,1);

double Parameter=0,
Origin_x=0,
Origin_y=0,
Scale_x=1,
Scale_y=1,
Rot_angle=0;

static Token token;

//-------輔助函數聲明
static void FetchToken();
static void MatchToken(enum Token_Type AToken);
static void SyntaxError(int case_of);
static void ErrMsg(unsigned LineNo,char *descrip,char *string);
static void PrintSyntaxTree(struct ExprNode *root,int indent);

//--------非終結符的遞歸子程序聲明
static void Program();
static void Statement();
static void OriginStatement();
static void RotStatement();
static void ScaleStatement();
static void ForStatement();
static struct ExprNode *Expression();
static struct ExprNode *Term();
static struct ExprNode *Factor();
static struct ExprNode *Component();
static struct ExprNode *Atom();
//---------外接口與語法樹的構造函數聲明
extern void Parser(char *SrcFilePtr);
static struct ExprNode *MakeExprNode(enum Token_Type opcode,...);

//---------通過詞法分析器接口
static void FetchToken()
{
	token=GetToken();

	if(token.type==ERRTOKEN)
		SyntaxError(1);
}

//--------匹配記號
static void MatchToken(enum Token_Type The_Token)
{
	if(token.type!=The_Token)
		SyntaxError(2);
	FetchToken();
}
//-------語法錯誤處理
static void SyntaxError(int case_of)
{
	switch(case_of)
	{
	case 1:ErrMsg(LineNo,"錯誤記號哦",token.lexeme);
		break;
	case 2:ErrMsg(LineNo,"非預期符號",token.lexeme);
		break;
	}
}
//------打印錯誤信息
void ErrMsg(unsigned LineNo,char *descrip,char *string)
{
#ifdef PARSER_DEBUG
	printf("Line No %5d:%s %s!\n",LineNo,descrip,string);
#else
	char msg[256];
	memset(msg,0,256);
	sprintf(msg,"Line No %5d:%s %s!\n",LineNo,descrip,string);
#endif

#ifdef _VC_COMPILER
	MessageBox(NULL,msg,"error!",MB_OK);
#endif
//

#ifdef _BC_COMPIKER
	printf("%s\n",msg);
#endif

	CloseScanner();
	exit(1);
}

//---------先序遍歷并且打印表達式的語法樹
void PrintSyntaxTree(struct ExprNode *root,int indent)
{
	int temp;
	for(temp=1;temp<=indent;temp++)
		printf("\t");
	switch(root->OpCode)
	{
	case PLUS:     printf("%s\n","+");break;
	case MINUS:    printf("%s\n","-");break;
	case MUL:      printf("%s\n","*");break;
	case DIV:      printf("%s\n","/");break;
	case POWER:    printf("%s\n","**");break;
	case FUNC:     printf("%x\n",root->Content.CaseFunc.MathFuncPtr);
		           break;
	case CONST_ID: printf("%f\n",root->Content.CaseConst);
		           break;
    case T:        printf("%s\n","T");break;
    default: printf("Error Tree Node!\n");
		exit(0);
	}
	if(root->OpCode==CONST_ID||root->OpCode==T)
	{
		return;
	}
	if(root->OpCode==FUNC)
		PrintSyntaxTree(root->Content.CaseFunc.Child,indent+1);
	else
	{
		PrintSyntaxTree(root->Content.CaseOperator.Left, indent+1);
		PrintSyntaxTree(root->Content.CaseOperator.Right,indent+1);
	}
}
//--------繪圖語言解釋器的入口

void Parser(char *SrcFilePtr)
{
	printf("Parser");
	if(!InitScanner(SrcFilePtr))
	{
		printf("Open Source File Error!\n");
		return;
	}
	FetchToken();
	Program();
	CloseScanner();
	printf("Parser");
	return;
}
//--------Program的遞歸子程序
static void Program()
{
	printf("enter in Program\n");
	while(token.type!=NONTOKEN)
	{
		Statement();
		MatchToken(SEMICO);
	}
	printf("back Program\n");
}
//----------Statement的遞歸子程序
static void Statement()
{
	printf("enter in Statement\n");
	switch(token.type)
	{
	case ORIGIN:     OriginStatement();break;
	case SCALE:      ScaleStatement();break;
	case ROT:        RotStatement();break;
	case FOR:        ForStatement();break;
	default :        SyntaxError(2);
	}
	printf("exit from Statement\n");
}
//---------OriginStatement的遞歸子程序
static void OriginStatement(void)
{
	struct ExprNode *tmp;
	printf("*****OriginStatement\n");
	MatchToken(ORIGIN);            printf("matchtoken ORIGIN\n");
	MatchToken(IS);                printf("matchtoken IS\n");
	MatchToken(L_BRACKET);         printf("matchtoken L_BRACKET\n");
	tmp=Expression();      
	Origin_x=GetExprValue(tmp);
	DelExprTree(tmp);

	MatchToken(COMMA);             printf("matchtoken COMMA\n");            
	tmp=Expression();                 
#ifdef PARSER_DEBUG 
	Origin_y=GetExprValue(tmp);
	DelExprTree(tmp);
#endif

	MatchToken(R_BRACKET);          printf("matchtoken R_BRACKET\n");
	printf("*****OriginStatement\n");
}



//-----------Scalestatement的遞歸子程序
static void ScaleStatement(void)
{
	struct ExprNode *tmp;
	printf("*****ScaleStatement\n");     
	MatchToken(SCALE);               printf("matchtoken SCALE\n");
	MatchToken(IS);                  printf("matchtoken IS\n");
	MatchToken(L_BRACKET);           printf("matchtoken L_BRACKET\n");
	tmp=Expression();
#ifdef PARSER_DEBUG
	Scale_x=GetExprValue(tmp);      printf("matchtoken L_BRACKET\n");
	DelExprTree(tmp);
#endif

	MatchToken(COMMA);                printf("matchtoken COMMA\n");
	tmp=Expression();
/*#ifndef PARSER_DEBUG
	Scale_y=GetExprValue(tmp);
	DelExprTree(tmp);
#endif
*/
	MatchToken(R_BRACKET);          printf("matchtoken R_BRACKET\n");
	printf("******Scalestatement\n");
}



//--------RotStatement的遞歸子程序
static void RotStatement(void)
{
	struct ExprNode *tmp;
	printf("*****RotStatement\n");
	MatchToken(ROT);                 printf("matchtoken  ROT\n");                                                      
	MatchToken(IS);                  printf("matchtoken  IS\n");
	tmp=Expression();
/*#ifdef PARSER_DEBUG 
	Rot_angle=GetExprValue(tmp);
	DelExprTree(tmp);
#endif
	*/
	printf("*****RotStatement\n");
}

//------------For的遞歸子程序
static void ForStatement(void)
{
/*#ifndef PARSER_DEBUG
	double Start,End,Step;
#endif
*/
	struct ExprNode *start_ptr,*end_ptr,*step_ptr,
		            *x_ptr,*y_ptr;
	printf("*****ForStatement\n");
	MatchToken(FOR);                 printf("matchtoken  FOR\n");
	MatchToken(T);                   printf("matchtoken  T\n");
	MatchToken(FROM);                printf("matchtoken  FROM\n");
	start_ptr=Expression();
/*#ifndef PARSER_DEBUG 
	Start=GetExprValue(start_ptr);
	DelExprTree(start_ptr);
#endif
*/
	MatchToken(TO);                  printf("matchtoken  TO\n");
	call_match("TO");
	end_ptr=Expression();
/*#ifndef PARSER_DEBUG 
	End=GetExprValue(end_ptr);
	DelExprTree(end_ptr);
#endif
*/
	MatchToken(STEP);                printf("matchtoken  STEP\n");
	call_match("STEP");
	step_ptr=Expression();
/*#ifndef PARSER_DEBUG
	Step=GetExprValue(step_ptr);
	DelExprTree(step_ptr);
#endif
*/
	MatchToken(DRAW);                printf("matchtoken  DRAW\n");
	call_match("DRAW");
	MatchToken(L_BRACKET);           printf("matchtoken  L_BRACKET\n");
	call_match("(");
	x_ptr=Expression();
	MatchToken(COMMA);               printf("matchtoken COMMA \n");
	call_match(",");
	y_ptr=Expression();
	MatchToken(R_BRACKET);           printf("matchtoken  R_BRACKET\n");
	call_match(")");
/*#ifdef PARSER_DEBUG
	DrawLoop(Start,End,Step,x_ptr,y_ptr);
    DelExprTree(x_ptr);
	DelExprTree(y_ptr);
#endif
*/
	printf("*****ForStatement\n");
}
//---------Expression的遞歸子程序
static struct ExprNode *Expression()
{
	struct ExprNode *left,*right;
	Token_Type token_tmp;
	printf("enter in Expression\n");
	left=Term();
	while(token.type==PLUS||token.type==MINUS)
	{
		token_tmp=token.type;
		MatchToken(token_tmp);
		right=Term();
		left=MakeExprNode(token_tmp,left,right);
	}
	Tree_trace(left);
	printf("exit from Expression\n");
	return left;
}



//------------Term的遞歸子程序
static struct ExprNode *Term()
{
	struct ExprNode *left,*right;
	Token_Type token_tmp;
	left = Factor();
	while(token.type==MUL||token.type==DIV)
	{
		token_tmp=token.type;
		MatchToken(token_tmp);
		right=Factor();
		left=MakeExprNode(token_tmp,left,right);
	}
	return left;
}
//-----------Factor的遞歸子程序
static struct ExprNode *Factor()
{
	struct ExprNode *left,*right;
	if(token.type==PLUS)
	{
		MatchToken(PLUS);
		right=Factor();
	}
	else if(token.type==MINUS)
	{
		MatchToken(MINUS);
		right=Factor();
		left=new ExprNode;
		left->OpCode=CONST_ID;
		left->Content.CaseConst=0.0;
		right=MakeExprNode(MINUS,left,right);
	}
	else right=Component();
	return right;
}
//----------Component的遞歸子程序
static struct ExprNode* Component()
{
	struct ExprNode *left,*right;
	left =Atom();
	if(token.type==POWER)
	{
		MatchToken(POWER);
		right=Component();
		left=MakeExprNode(POWER,left,right);
	}
	return left;
}
//----------Atom的遞歸子程序
static struct ExprNode *Atom()
{
	struct Token t=token;
	struct ExprNode *address,*tmp;
	switch(token.type)
	{
	case CONST_ID:
		MatchToken(CONST_ID);
		address=MakeExprNode(CONST_ID,t.value);
		break;
	case T:
		MatchToken(T);
		address=MakeExprNode(T);
		break;
	case FUNC:
		MatchToken(FUNC);
		MatchToken(L_BRACKET);
		tmp=Expression();
		address=MakeExprNode(FUNC,t.FuncPtr,tmp);
		MatchToken(R_BRACKET);
		break;
	case L_BRACKET:
		MatchToken(L_BRACKET);
		address=Expression();
		MatchToken(R_BRACKET);
		break;
	default:
		SyntaxError(2);
	}
	return address;
}
//----------生成語法樹的一個節點
static struct ExprNode *MakeExprNode(enum Token_Type opcode,...)
{
	struct ExprNode *ExprPtr=new (struct ExprNode);
	ExprPtr->OpCode=opcode;
	va_list ArgPtr;
	va_start(ArgPtr,opcode);
	switch(opcode)
	{
	case CONST_ID:
		ExprPtr->Content.CaseConst=(double)va_arg(ArgPtr,double);
		break;
    case T:
		ExprPtr->Content.CaseParmPtr=&Parameter;
		break;
	case FUNC:
		ExprPtr->Content.CaseFunc.MathFuncPtr
			=(FuncPtr)va_arg(ArgPtr,FuncPtr);
		ExprPtr->Content.CaseFunc.Child
			=(struct ExprNode *)va_arg(ArgPtr,struct ExprNode *);
		break;
	default: 
		ExprPtr->Content.CaseOperator.Left
			=(struct ExprNode *)va_arg(ArgPtr,struct ExprNode *);
		ExprPtr->Content.CaseOperator.Right
			=(struct ExprNode *)va_arg(ArgPtr,struct ExprNode *);
		break;
	}
	va_end(ArgPtr);
	return ExprPtr;
}











 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
不卡一区在线观看| 欧美三片在线视频观看| av中文字幕一区| 在线这里只有精品| 日韩欧美一二三| 日韩欧美精品三级| 国产女同性恋一区二区| 亚洲精品视频自拍| 欧美aaaaaa午夜精品| 成人中文字幕合集| 欧美亚男人的天堂| 久久日韩粉嫩一区二区三区| 亚洲日本va午夜在线影院| 亚洲青青青在线视频| 日本欧洲一区二区| 国产黑丝在线一区二区三区| 91浏览器入口在线观看| 欧美一区二区私人影院日本| 精品日韩欧美一区二区| 一色桃子久久精品亚洲| 男男视频亚洲欧美| 一本久久综合亚洲鲁鲁五月天| 91精品国产综合久久精品app| 国产日韩精品一区二区三区在线| 亚洲综合在线五月| 久久97超碰色| 欧美日韩精品欧美日韩精品一综合| 欧美精品乱码久久久久久按摩| 国产夜色精品一区二区av| 亚洲精品国产无天堂网2021 | 国产精品亚洲综合一区在线观看| 一本久久a久久免费精品不卡| 久久色在线视频| 日韩成人精品视频| 在线视频欧美区| 国产精品三级在线观看| 蜜臀精品久久久久久蜜臀 | 91色.com| 欧美经典三级视频一区二区三区| 日韩精品一二三区| 欧美伊人久久久久久久久影院| 中文字幕不卡三区| 国产一区二区三区四区五区入口 | 国产精品66部| 欧美精品一区二区三区蜜臀| 奇米影视一区二区三区| 在线电影欧美成精品| 亚洲一区二区三区自拍| 国产日产欧美一区二区三区 | 理论片日本一区| 欧美怡红院视频| 亚洲午夜激情网站| 欧美日韩免费一区二区三区| 亚洲福中文字幕伊人影院| 91小视频在线| 亚洲精品欧美综合四区| 91福利在线免费观看| 一区二区三区毛片| 欧美美女直播网站| 日本午夜精品一区二区三区电影| 欧美日韩精品一区二区三区蜜桃 | 精品一区二区在线观看| 欧美tickling挠脚心丨vk| 热久久一区二区| 久久这里只有精品首页| 国产精品一区二区在线播放 | 国产精品毛片无遮挡高清| 国产成人在线电影| 国产精品国产自产拍在线| 91麻豆6部合集magnet| 亚洲午夜久久久久中文字幕久| 欧美亚洲一区三区| 一区二区在线观看av| 欧美日韩视频一区二区| 麻豆成人91精品二区三区| 久久综合久久综合久久综合| 国产福利视频一区二区三区| 欧美变态凌虐bdsm| 波多野结衣在线aⅴ中文字幕不卡| 中文字幕在线免费不卡| 欧美四级电影在线观看| 精品亚洲欧美一区| 亚洲精品久久久久久国产精华液| 一本到不卡免费一区二区| av在线播放不卡| 亚洲最新视频在线播放| 色哟哟国产精品免费观看| 91精品在线一区二区| 宅男在线国产精品| 日本中文字幕一区| xnxx国产精品| 成人免费三级在线| 日韩一级免费观看| 欧美国产乱子伦| av电影在线不卡| 在线播放91灌醉迷j高跟美女 | 亚洲视频一区二区免费在线观看 | 欧美喷水一区二区| 国产欧美日本一区视频| 国产中文字幕精品| 91精品国产福利在线观看 | 亚洲一区二区三区在线看| 日本亚洲三级在线| 在线观看一区不卡| 午夜一区二区三区在线观看| 精品区一区二区| 在线电影院国产精品| 一本色道a无线码一区v| 欧美自拍偷拍午夜视频| 99精品在线观看视频| 色综合久久久久| 日韩欧美在线123| 亚洲猫色日本管| 狠狠色丁香婷婷综合| av欧美精品.com| 国产精品久久久久久久浪潮网站| 日韩一区日韩二区| 国产日产欧美一区二区视频| 国产日韩综合av| 久久综合狠狠综合久久激情| 69久久夜色精品国产69蝌蚪网| 欧美性生活影院| 成人教育av在线| 国产成人av电影在线| 日本免费新一区视频| 国产在线精品一区二区夜色 | 国产欧美日韩久久| 免费观看久久久4p| 精品国产乱码久久| 欧美一级高清片在线观看| 一本久久a久久精品亚洲| 欧美高清hd18日本| 中文字幕国产一区| 亚洲欧洲国产日韩| 亚洲欧洲综合另类| 一本在线高清不卡dvd| 久久色成人在线| 国产一区二区三区四区五区美女| 91精品国产色综合久久不卡蜜臀 | 欧美成人a∨高清免费观看| 日本中文字幕不卡| 欧美tk丨vk视频| 三级在线观看一区二区 | 婷婷成人激情在线网| 亚洲国产精品麻豆| 精品综合久久久久久8888| 色综合久久久久久久久久久| 久久网站最新地址| 洋洋av久久久久久久一区| 亚洲激情成人在线| 精品少妇一区二区三区免费观看 | 国产亚洲精品超碰| 亚洲色图在线视频| 午夜精品久久久久久久久久久| 狠狠色狠狠色综合系列| av毛片久久久久**hd| 在线不卡中文字幕播放| 国产亚洲一区二区三区在线观看 | 亚洲国产成人91porn| 美女国产一区二区三区| 成人午夜私人影院| 91麻豆精品91久久久久久清纯| 国产午夜亚洲精品不卡| 天使萌一区二区三区免费观看| 国产精品69毛片高清亚洲| 欧美三片在线视频观看| 日本一区二区三区视频视频| 午夜精品一区二区三区电影天堂 | 日韩欧美高清一区| 亚洲欧洲一区二区三区| 青草av.久久免费一区| 色悠悠久久综合| 国产欧美va欧美不卡在线| 日本伊人色综合网| 91国产免费观看| 国产亚洲欧美一级| 免播放器亚洲一区| 色欲综合视频天天天| 日本一区二区三区免费乱视频| 日韩电影在线免费观看| 色综合久久久久综合99| 国产精品三级在线观看| 久久99精品久久久| 欧美巨大另类极品videosbest | 国产福利一区在线观看| 欧美喷潮久久久xxxxx| 亚洲精品视频免费看| 国产成人福利片| 欧美mv和日韩mv的网站| 日韩精品电影在线观看| 欧美在线不卡视频| 成人免费一区二区三区视频| 成人免费高清在线观看| 国产日韩欧美不卡在线| 国产精品资源在线| 国产亚洲综合在线| 国产成a人亚洲| 国产精品日产欧美久久久久| 国产中文一区二区三区| 欧美精品一区在线观看|