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

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

?? parse.c

?? 自己做的一個C語言的解釋器 給大家做個參考
?? C
字號:
/********************************************************
* Porject Name:
*	Little C Interpretes
* Version & Revision:
*	1.0.1
* Creation Date:
*	2005-02-02
* Author:
*	Herbet Schildt & Yock Yu
* Description:
*	Recursive descent parser for integer expressions
*	which may include variable and function calls.
********************************************************/
#include "setjmp.h"
#include "math.h"
#include "ctype.h"
#include "stdlib.h"
#include "string.h"
#include "stdio.h"

#define NUM_FUNC		100
#define NUM_GLOBAL_VARS	100
#define NUM_LOCAL_VARS	200
#define ID_LEN			31
#define FUNC_CALLS		31
#define PROG_SIZE		10000
#define FOR_NEST		31

enum tok_types{DELIMITER, IDENTIFIER, NUMBER, KEYWORD, TEMP, STRING, BLOCK};

enum tokens{ARG, CHAR, INT, IF, ELSE, FOR, DO, WHILE, SWITCH, RETURN, EOL, FINISHED, END};

enum double_ops{LT = 1, LE, GT, GE, EQ, NE};

/*Rev 1.02 yock.yu 05-02-09*/
enum self_ops{AD = 0x11, DE, AQ, DQ, MQ, VQ, OQ, RQ};
                         /* ++,          --, +=, -=, *=, /=, %=, ^=*/

/*
	These are the constants used to all sntx_err()
	when a syntax error occurs. Add more if you like.
	NOTE:SYNTAX is generic error message used when
	noting else seems appropriate.
*/
enum error_msg{SYNTAX, UNBAL_PARENS, NO_EXP, EQUALS_EXPECTED, NOT_VAR, PARAM_ERR,
				SEMI_EXPECTED, UNBAL_BRACES, FUNC_UNDEF, TYPE_EXPECTED, NEST_FUNC,
				RET_NOCALL, PAREN_EXPECTED, WHILE_EXPECTED, QUOTE_EXPECTED,
				NO_TEMP, TOO_MANY_LVARS, DIV_BY_ZERO};

extern char *prog; /* current location in source code */
extern char *p_buf; /* points to start of program buffer */
extern jmp_buf e_buf; /* hold enviorment for longjmp() */

/*
	An array of these structures will hold
	the info associated with global variables.
*/
extern struct var_type{
	char var_name[32];
	int v_type;
	int value;
}global_vars[NUM_GLOBAL_VARS];

/*
	This is the function call stack
*/
extern struct func_type{
	char func_name[32];
	int ret_type;
	char *loc; /* location of function entry point in file */
}func_stack[NUM_FUNC];

/*
	Keyword table
*/
extern struct commands{
	char command[20];
	char tok;
}table[];

/*
	"Standard library" functions are declared here so
	they can be put into the internal function table
	that follows.
*/
int call_getche(void), call_putch(void);
int call_puts(void), print(void), getnum(void);

struct intern_func_type{
	char *f_name; /* function name */
	int (*p)(); /* pointer to the function */
}intern_func[]={
	"getche", call_getche,
	"putch", call_putch,
	"puts", call_puts,
	"print", print,
	"getnum", getnum,
	"", 0 /* null terminate the list */
};

extern char token[80]; /* string representation of token */
extern char token_type; /* contains type of token */
extern char tok; /* internal representation of token */
extern int ret_value; /* function return value */

void eval_exp(int *value);
void eval_exp0(int *value), eval_exp1(int *value);
void eval_exp2(int *value), eval_exp3(int *value);
void eval_exp4(int *value), eval_exp5(int *value);
void atom(int *value);
void sntx_err(int error), putback(void);
void assign_var(char *var_name, int value);
int isdelim(char c), look_up(char *s), iswhite(char c);
int find_var(char *s), get_token(void);
int internal_func(char *s);
extern int is_var(char *s);
extern char *find_func(char *name);
extern void call(void);

/* Entry point into parser */
void eval_exp(int *value)
{
	get_token();
	if(!*token){
		sntx_err(NO_EXP);
		return;
	}

	if(*token == ';'){
		*value = 0; /* empty expression */
		return;
	}

	eval_exp0(value);
	putback();/* return last token read to input stream */
}

/* Process an assignment expression */
void eval_exp0(int *value)
{
	char temp[ID_LEN]; /* holds name of var receiving the assignment*/

	register int temp_tok;

	if(token_type == IDENTIFIER){
		if(is_var(token)){ /* if a var, see if assignment */
			strcpy(temp, token);
			temp_tok = token_type;
			get_token();
			if(*token == '='){ /* is an assignment */
				get_token();
				eval_exp0(value); /* get value to assignment */
				assign_var(temp, *value); /* assign the value */
				return;
			}
			else{ /* not an assignment */
				putback(); /* restore original token */
				strcpy(token, temp);
				token_type = temp_tok;
			}
		}
	}

	eval_exp1(value);
}

/* Process relatonal operators. */
void eval_exp1(int *value)
{
	int partial_value;
	int t;/*Rev 1.03 yock.yu 05-02-12*/
	char temp[ID_LEN];/*Rev 1.03 yock.yu 05-02-12*/
	register char op;
	char relops[7]={LT, LE, GT, GE, EQ, NE, 0};

	char dualops[7]={AQ, DQ, MQ, VQ, OQ, RQ, 0};/* Rev 1.03 yock.yu 05-02-12*/
	strcpy(temp, token);

	eval_exp2(value);
	op = *token;

	/* Rev 1.03 yock.yu 05-02-12 start*/
	if(strchr(dualops, op)){
		get_token();
		eval_exp2(&partial_value);
		switch(op){
			case AQ:
				*value = *value + partial_value;
				break;
			case DQ:
				*value = *value - partial_value;
				break;
			case MQ:
				*value = *value * partial_value;
				break;
			case VQ:
				if(partial_value == 0)
					sntx_err(DIV_BY_ZERO);
				*value = *value / partial_value;
				break;
			case OQ:
				break;
			case RQ:
				t = (*value) / partial_value;
				*value = *value - (t * partial_value);
				break;
		}
		assign_var(temp, *value);
		return;
	}
	/* Rev 1.03 yock.yu 05-02-12 end*/

	if(strchr(relops, op)){
		get_token();
		eval_exp2(&partial_value);
		switch(op){ /* perform the relation operation */
			case LT:
				*value = *value < partial_value;
				break;
			case LE:
				*value = *value <= partial_value;
				break;
			case GT:
				*value = *value > partial_value;
				break;
			case GE:
				*value = *value >= partial_value;
				break;
			case EQ:
				*value = *value == partial_value;
				break;
			case NE:
				*value = *value != partial_value;
				break;
		}
	}
}

/* Add or subtract two terms. */
void eval_exp2(int *value)
{
	register char op;
	int partial_value;

	eval_exp3(value);
	while((op = *token) == '+' || op == '-'){
		get_token();
		eval_exp3(&partial_value);
		switch(op){ /* add or subtract */
			case '+':
				*value = *value + partial_value;
				break;
			case '-':
				*value = *value - partial_value;
				break;
		}
	}
}

/* Multiply or divide two factors. */
void eval_exp3(int *value)
{
	register char op;
	int partial_value, t;

	eval_exp4(value);
	while((op = *token) == '*' || op == '/' || op == '%'){
		get_token();
		eval_exp(&partial_value);
		switch(op){ /* mul, div, or modulus */
			case '*':
				*value = *value * partial_value;
				break;
			case '/':
				if(partial_value == 0)
					sntx_err(DIV_BY_ZERO);
				*value = *value / partial_value;
				break;
			case '%':
				t = (*value) / partial_value;
				*value = *value - (t * partial_value);
				break;
		}
	}
}

/* Is a unary + or -. */
void eval_exp4(int *value)
{
	register char op;

	op = '\0';
	if(*token == '+' || *token == '-'){
		op = *token;
		get_token();
	}

	eval_exp5(value);

	if(op)
		if(op == '-')
			*value = -(*value);
}

/* Process parenthesized expression. */
void eval_exp5(int *value)
{
	char temp[ID_LEN];/*Rev 1.02 yock.yu 05-02-11*/

	if(*token == '('){
		get_token();
		eval_exp0(value); /* get subexpressoin */
		if(*token != ')')
			sntx_err(PAREN_EXPECTED);
		get_token();
	}
	else{
		strcpy(temp, token);/*Rev 1.02 yock.yu 05-02-11*/
		atom(value);
		/*Rev 1.02 yock.yu 05-02-11 start*/
		if(*token == AD || *token == DE){
			if(*token == AD) ++(*value);
			else if(*token == DE) --(*value);
			assign_var(temp, *value);
			get_token();
		}
		/*Rev 1.02 yock.yu 05-02-11 end*/
	}
}

/* Find value of number, variable, or function. */
void atom(int *value)
{
	int i;

	switch(token_type){
		case IDENTIFIER:
			i = internal_func(token);
			if(i != -1){ /* call "standard library" function */
				*value = (*intern_func[i].p)();
			}
			else{
				if(find_func(token)){ /* call user-defined function */
					call();
					*value = ret_value;
				}
				else{
					*value = find_var(token); /* get var's value */
				}
			}
			get_token();
			return;
		case NUMBER: /* is number constant */
			*value = atoi(token);
			get_token();
			return;
		case DELIMITER: /* see if character constant */
			if(*token == '\''){
				*value = *prog;
				prog++;
				if(*prog != '\'')
					sntx_err(QUOTE_EXPECTED);
				prog++;
				get_token();
				return;
			}
			if(*token == ')') /* process empty expression */
				return;
			else
				sntx_err(SYNTAX); /* syntax error */
		default:
			sntx_err(SYNTAX); /* syntax error */
	}
}

/* Display an error message */
void sntx_err(int error)
{
	char *p, *temp;
	int linecount = 0;
	register int i;

	static char *e[]={
		"syntax error",
		"unbalanced parenthese",
		"no expressoin present",
		"equals sign expected",
		"not a variable",
		"parameter error",
		"semicolon expected",
		"unbalanced braces",
		"type specifier expected",
		"too many nested function calls",
		"return without call",
		"parentheses expected",
		"while expected",
		"closing quote expected",
		"not a string",
		"too many local variables",
		"division by zero"
	};

	printf("\n%s", e[error]);

	p = p_buf;
	while(p != prog){ /* find line number of error */
		p++;
		if(*p == '\r'){
			linecount++;
		}
	}
	printf(" in line %d\n", linecount);

	temp = p;
	for(i = 0; i < 20 && p > p_buf && *p != '\n'; i++, p--);
	for(i = 0; i < 30 && p <= temp; i++, p++) printf("%c", *p);

	longjmp(e_buf, 1); /* return to safe point */
}

/* Get a token */
int get_token(void)
{
	register char *temp;

	token_type = 0;
	tok = 0;

	temp = token;
	*temp = '\0';

	/* skip over white space */
	while(iswhite(*prog) && *prog) ++prog;

	if(*prog == '\r'){
		++prog;
		++prog;
		while(iswhite(*prog) && *prog)
			++prog;
	}

	if(*prog == '\0'){ /* end of file */
		*token = '\0';
		tok = FINISHED;
		return(token_type = DELIMITER);
	}

	if(strchr("{}", *prog)){ /* block delimiters */
		*temp = *prog;
		temp++;
		*temp = '\0';
		prog++;
		return(token_type = BLOCK);
	}

	/* look for comments */
	if(*prog == '/'){
		if(*(prog + 1) == '*'){ /* is a comment */
			prog += 2;
			do{ /* find end of comment */
				while(*prog != '*') prog++;
				prog++;
			}while(*prog != '/');
			prog++;
		}
	}

	if(strchr("!<>=", *prog)){ /* is or might be a relation operator */
		switch(*prog){
			case '=':
				if(*(prog + 1) == '='){
					prog += 2;
					*temp = EQ;
					temp++; *temp = EQ; temp++;
					*temp = '\0';
				}
				break;
			case '!':
				if(*(prog + 1) == '='){
					prog += 2;
					*temp = NE;
					temp++; *temp = NE; temp++;
					*temp = '\0';
				}
				break;
			case '<':
				if(*(prog + 1) == '='){
					prog += 2;
					*temp = LE; temp++; *temp = LE;
				}
				else{
					prog++;
					*temp = LT;
				}
				temp++;
				*temp = '\0';
				break;
			case '>':
				if(*(prog + 1) == '='){
					prog += 2;
					*temp = GE; temp++; *temp = GE;
				}
				else{
					prog ++;
					*temp = GT;
				}
				temp++;
				*temp = '\0';
				break;
		}
		if(*token)
			return(token_type = DELIMITER);
	}

	if(strchr("+-*/^%=;(),'", *prog)){ /* delimiter */
		/* Rev 1.02 yock.yu 05-02-09 start */
		if((*prog == '+') && (*(prog + 1) == '+')){
			prog += 2;
			*temp = AD; temp++; *temp = AD;
		}
		else if((*prog == '-') && (*(prog + 1) == '-')){
			prog += 2;
			*temp = DE; temp++; *temp = DE;
		}
		/* Rev 1.03 yock.yu 05-02-12 start*/
		else if(strchr("+-*/^%", *prog) && (*(prog + 1) == '=')){
			switch(*prog){
				case '+':
					*temp = AQ; temp++; *temp = AQ;
					break;
				case '-':
					*temp = DQ; temp++; *temp = DQ;
					break;
				case '*':
					*temp = MQ; temp++; *temp = MQ;
					break;
				case '/':
					*temp = VQ; temp++; *temp = VQ;
					break;
				case '^':
					*temp = RQ; temp++; *temp = RQ;
					break;
				case '%':
					*temp = OQ; temp++; *temp = OQ;
					break;
			}
			prog += 2;
		}
		/* Rev 1.03 yock.yu 05-02-12 end*/
		else{
		/* Rev 1.02 yock.yu 05-02-09 end */
			*temp = *prog;
			prog++; /* advance to next position */
		}/*Rev 1.02 yock.yu 05-02-09*/
		temp++;
		*temp = '\0';
		return(token_type = DELIMITER);
	}

	if(*prog == '"'){ /* quoted string */
		prog++;
		while(*prog != '"' && *prog != '\r')
			*temp++ = *prog++;
		if(*prog == '\r')
			sntx_err(SYNTAX);
		prog++; *temp = '\0';
		return(token_type = STRING);
	}

	if(isdigit(*prog)){ /* number */
		while(!isdelim(*prog))
			*temp++ = *prog++;
		*temp = '\0';
		return(token_type = NUMBER);
	}

	if(isalpha(*prog)){ /* var or command */
		while(!isdelim(*prog))
			*temp++ = *prog++;
		token_type = TEMP;
	}

	*temp = '\0';

	/* See if a string is a command or a variable */
	if(token_type == TEMP){
		tok = look_up(token); /* convert to internal rep */
		if(tok)
			token_type = KEYWORD; /* is a keyword */
		else
			token_type = IDENTIFIER;
	}

	return token_type;
}

/* Return a token to input stream */
void putback(void)
{
	char *t;

	t = token;
	for(; *t; t++)
		prog--;
}

/*
	Look up a token's internal representation
	int the table.
*/
int look_up(char *s)
{
	register int i;
	char *p;

	/* convert to lowercase */
	p = s;
	while(*p){
		*p = tolower(*p);
		p++;
	}

	/* see if token is in table */
	for(i = 0; *table[i].command; i++){
		if(!strcmp(table[i].command, s))
			return table[i].tok;
	}

	return 0; /* unknown command */
}

/*
	Return index of internal library function or
	-1 if not found.
*/
int internal_func(char *s)
{
	register int i;

	for(i = 0; intern_func[i].f_name[0]; i++){
		if(!strcmp(intern_func[i].f_name, s))
			return i;
	}

	return -1;
}

/* Return 1 if c is a delimiter. */
int isdelim(char c)
{
	if(strchr(" !;,+-<>'/*%^=()", c) || c == 9 ||
		c == '\r' || c == 0)
		return 1;
	return 0;
}

/* Return 1 if c is space or tab. */
int iswhite(char c)
{
	if(c == ' ' || c == '\t')
		return 1;
	return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品日韩综合在线| 亚洲裸体在线观看| 国产精品久久久久永久免费观看| 亚洲精品一卡二卡| 国产精品一区二区久激情瑜伽 | 国产精品久久久久久久久久免费看| 亚洲综合激情小说| 成人高清视频在线观看| 日韩精品一区二区三区四区| 亚洲综合区在线| 波多野结衣亚洲| 久久久久久97三级| 狠狠色伊人亚洲综合成人| 在线观看日韩电影| 亚洲欧洲性图库| 成人午夜在线播放| 久久精子c满五个校花| 人人精品人人爱| 欧美男人的天堂一二区| 亚洲精品视频一区| 色呦呦网站一区| 亚洲男人的天堂在线观看| 成人永久aaa| 中文字幕中文在线不卡住| 成人性生交大片免费看视频在线| 精品捆绑美女sm三区| 久久国产免费看| 日韩视频国产视频| 久久99久国产精品黄毛片色诱| 91精品国产品国语在线不卡| 亚洲第一久久影院| 91精品福利在线一区二区三区| 天天免费综合色| 3d动漫精品啪啪一区二区竹菊| 香蕉加勒比综合久久| 欧美视频精品在线| 日韩精品免费专区| 欧美va亚洲va国产综合| 麻豆精品新av中文字幕| 欧美成人免费网站| 国产不卡在线视频| 亚洲天堂福利av| 欧美性色黄大片手机版| 三级在线观看一区二区| 精品国产sm最大网站| 国产aⅴ综合色| 亚洲老司机在线| 91精品在线麻豆| 国产精品一二三四区| 国产精品久线在线观看| 色成人在线视频| 美女网站视频久久| 国产精品免费看片| 91精品国产福利在线观看| 日本女优在线视频一区二区| 精品国产亚洲在线| 不卡av在线网| 午夜视黄欧洲亚洲| 久久精品一区二区三区不卡牛牛| 成人免费视频视频| 日韩在线a电影| 国产人成亚洲第一网站在线播放| 日本久久一区二区三区| 麻豆精品一区二区av白丝在线| 国产欧美日本一区二区三区| av毛片久久久久**hd| 天天影视色香欲综合网老头| 久久亚洲精精品中文字幕早川悠里 | jlzzjlzz亚洲女人18| 亚洲国产精品影院| 精品国产乱码久久久久久图片| 99视频精品全部免费在线| 天天操天天色综合| 中文字幕巨乱亚洲| 欧美一级午夜免费电影| 99久久综合国产精品| 日韩一区精品字幕| 亚洲精品一卡二卡| 久久久精品国产免费观看同学| 欧美日韩在线亚洲一区蜜芽| 国产一区二区网址| 丝袜亚洲精品中文字幕一区| 国产精品丝袜久久久久久app| 欧美日韩美女一区二区| 成人动漫视频在线| 国内成+人亚洲+欧美+综合在线| 亚洲美女区一区| 久久精品亚洲乱码伦伦中文 | 亚洲成国产人片在线观看| 国产三级久久久| 日韩一区二区三区在线| 欧美影院一区二区| 暴力调教一区二区三区| 久88久久88久久久| 日韩高清不卡一区| 亚洲激情在线激情| 亚洲欧美一区二区视频| 久久久久亚洲综合| 久久综合九色综合欧美98| 欧美日本在线看| 欧美在线一区二区三区| 99久久婷婷国产精品综合| 国产盗摄一区二区三区| 麻豆高清免费国产一区| 亚洲国产毛片aaaaa无费看| 国产精品三级av在线播放| www国产精品av| 久久伊99综合婷婷久久伊| 欧美一区二区视频在线观看2022 | 欧美精品在线一区二区三区| 日韩一区二区三区电影在线观看 | 亚洲国产视频在线| 一区二区三区欧美亚洲| 亚洲丝袜制服诱惑| 亚洲天堂免费看| 亚洲日本在线a| 一区二区三区鲁丝不卡| 亚洲综合色噜噜狠狠| 亚洲一区二区三区四区在线| 一级日本不卡的影视| 亚洲最新视频在线播放| 亚洲精品久久嫩草网站秘色| 亚洲欧美日韩中文播放| 亚洲精品美国一| 午夜视频在线观看一区二区三区| 亚洲伊人伊色伊影伊综合网| 亚洲精品va在线观看| 亚洲成年人影院| 久久精品国产精品亚洲红杏| 久久99精品国产.久久久久| 国产揄拍国内精品对白| 福利一区二区在线观看| 色婷婷av一区| 91精品国产色综合久久ai换脸| 欧美tk丨vk视频| 国产精品你懂的在线| 亚洲女与黑人做爰| 午夜精品成人在线| 精品一二三四区| 成人av电影免费在线播放| 日本道色综合久久| 日韩一级免费观看| 国产欧美日韩激情| 亚洲成av人片在线| 国产乱人伦偷精品视频不卡| 99久久精品国产一区二区三区| 欧美午夜精品久久久久久孕妇| 欧美精选一区二区| 国产精品欧美经典| 日韩电影在线一区| 成人免费毛片片v| 51精品秘密在线观看| 国产欧美日韩精品在线| 亚洲成在人线在线播放| 国产成人午夜99999| 欧美日韩国产小视频在线观看| 欧美大片日本大片免费观看| 日韩美女视频一区| 韩日精品视频一区| 欧美在线|欧美| 国产喂奶挤奶一区二区三区| 亚洲国产美女搞黄色| 国产mv日韩mv欧美| 欧美一区二区久久| 亚洲欧美日韩中文播放| 韩国v欧美v日本v亚洲v| 欧美三级电影在线看| 国产精品色噜噜| 国产在线一区二区综合免费视频| 欧美色图天堂网| 国产精品免费网站在线观看| 免费成人在线视频观看| 色婷婷久久一区二区三区麻豆| 日韩午夜精品电影| 精品亚洲porn| 欧美日韩亚洲国产综合| 中文字幕国产精品一区二区| 日本三级亚洲精品| 欧美午夜理伦三级在线观看| 国产精品全国免费观看高清| 日韩成人一区二区三区在线观看| 91蜜桃网址入口| 亚洲国产精品成人综合色在线婷婷| 美脚の诱脚舐め脚责91| 欧美日韩一区二区三区四区五区| 国产精品久久久久久久久免费桃花| 黑人巨大精品欧美黑白配亚洲| 3d动漫精品啪啪| 天天av天天翘天天综合网| 91麻豆6部合集magnet| 亚洲国产岛国毛片在线| 国产凹凸在线观看一区二区 | 欧美艳星brazzers| 亚洲欧美激情在线| 91在线观看高清| 成人免费小视频| 94色蜜桃网一区二区三区| 国产精品久久一卡二卡| 东方欧美亚洲色图在线| 国产日韩v精品一区二区|