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

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

?? litc.c

?? 自己做的一個C語言的解釋器 給大家做個參考
?? C
?? 第 1 頁 / 共 2 頁
字號:
/********************************************************
* Porject Name:
*	Little C Interprete
* Version & Revision:
*	1.0.1
* Creation Date:
*	2005-02-02
* Author:
*	Herbet Schildt & Yock Yu
* Description:
*	A little C interpreter
********************************************************/

#include "stdio.h"
#include "setjmp.h"
#include "math.h"
#include "ctype.h"
#include "stdlib.h"
#include "string.h"

#define NUM_FUNC		100
#define NUM_GLOBAL_VARS	100
#define NUM_LOCAL_VARS	200
#define ID_LEN			31
#define FUNC_CALLS		31
#define NUM_PARAMS		31
#define PROG_SIZE		10000
#define LOOP_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};

/*
	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};

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

/* global block count */
static int gblock = 0;/*Rev 1.03 yock.yu 05-02-16*/
/* backup block count */
static int bak_gblock = 0;/*Rev 1.03 yock.yu 05-02-16*/

struct var_type{
	char var_name[32];
	int v_type;
	int value;
}global_vars[NUM_GLOBAL_VARS];

struct var_type local_var_stack[NUM_LOCAL_VARS];

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

int call_stack[NUM_FUNC];

/*
	Keyword table
*/
struct commands{
	char command[20];
	char tok;
}table[]={ /* Commands must be entered lowercase */
	"if", IF, /* in this table */
	"else", ELSE,
	"for", FOR,
	"do", DO,
	"while", WHILE,
	"char", CHAR,
	"int", INT,
	"return", RETURN,
	"end", END,
	"", END /* mark end of table */
};

char token[80]; /* string representation of token */
char token_type; /* contains type of token */
char tok; /* internal representation of token */

int functos; /* index to top of function call stack */
static int func_index = 0; /* index into function table */
static int gvar_index = 0; /* index into global variable table */
int lvartos; /* index into local variable stack */

int ret_value; /* function return value */

extern void print(void);
void	prescan(void), decl_global(void), call(void);
extern void putback(void);
void decl_local(void), local_push(struct var_type);
extern void eval_exp(int *value);
extern void sntx_err(int error);
void exec_if(void), find_eob(void), exec_for(void);
void get_params(void), get_args(void);
void exec_while(void), func_push(int i), exec_do(void);
void assign_var(char *var_name, int value);
int load_program(char *p, char *fname), find_var(char *s);
void interp_block(void), func_ret(void);
int func_pop(void), is_var(char *s), get_token(void);
char *find_func(char *name);

void exec_else(void);

int main(int argc, char *argv[])
{
	if(argc != 2){
		printf("Usage: litc <filename> \n");
		exit(1);
	}

	/* allocate memory for the program */
	if((p_buf = (char *)malloc(PROG_SIZE)) == NULL){
		printf("Allocation Failure");
		exit(1);
	}

	/* load the program to execute */
	if(!load_program(p_buf, argv[1])){
		printf("Open source file [%s] Failure\n", argv[1]);
		exit(1);
	}
	if(setjmp(e_buf))
		exit(1); /* initialize long jump buffer */

	gvar_index = 0; /* initialize global variable index */

	/* set program pointer to start of program buffer */
	prog = p_buf;

	prescan(); /* find the location of all functions
				and global variables in the program */

	lvartos = 0; /* initialize local variable stack index */
	functos = 0; /* initialize the CALL stack index */

	/* setup call to main() */
	prog = find_func("main"); /* find program starting point */

	if(!prog){ /* incorrect or missing main() function in program */
		printf("main() not found. \n");
		exit(1);
	}

	prog--; /* back up to opening ( */
	strcpy(token, "main");
	call(); /* call main() to start interpreteting */

	return 0;
}

/*
	Interpret a single statement or block of code.
	When interp_block() returns its initial call,
	the final brace(or a return) in main() has been encounted.
*/
void interp_block(void)
{
	int value;
	char block = 0;

	do{
		token_type = get_token();

		/*
			if interpreting single statement,
			return on first semicolon.
		*/

		/* see what kind of token is up */
		if(token_type == IDENTIFIER){
			/* not a keyword, so process expression. */
			putback(); /* restore token to input stream for
						further processing by eval_exp() */
			eval_exp(&value); /* process the expression */
			if(*token != ';')
				sntx_err(SEMI_EXPECTED);
		}
		else if(token_type == BLOCK){ /* if block delimiter */
			if(*token == '{'){ /* is a block */
				block = 1; /* interpreting block, no statement */
				gblock++;/* increamt block number *//*Rev 1.03 yock.yu 05-02-16*/
			}
			else{ /* is a }, so return */
				gblock--;/* decreamt block number*//*Rev 1.03 yock.yu 05-02-16*/
				return;
			}
		}
		else{ /* is keyword */
			bak_gblock = gblock;/*Rev 1.03 yock.yu 05-02-16*/
			switch(tok){
				case CHAR:
				case INT: /* declare local variables */
					putback();
					decl_local();
					break;
				case RETURN: /* return from function call */
					func_ret();
					break;
				case IF: /* process an if statement */
					exec_if();
					break;
				case ELSE: /* process an else statement */
					/*find_eob(); /* find end of else block
								and continue execution */
					exec_else();/*Rev 1.04 yock.yu 05-02-17*/
					break;
				case WHILE: /* process a while loop */
					exec_while();
					break;
				case DO: /* process a do-while loop */
					exec_do();
					break;
				case FOR:
					exec_for(); /* process a for loop */
					break;
				case END:
					exit(0);
			}
		}
	}while(tok != FINISHED && block);
}

/* Load a program. */
int load_program(char *p, char *fname)
{
	FILE *fp;
	int i = 0;

	if((fp = fopen(fname, "rb")) == NULL)
		return 0;

	do{
		*p = getc(fp);
		p++;i++;
	}while(!feof(fp) && i < PROG_SIZE);

	if(*(p - 2) == 0x1A)
		*(p - 2) = '\0'; /* null terminate the program */
	else
		*(p - 1) = '\0';

	fclose(fp);

	return 1;
}

/*
	Find the location of all functions in the
	program and store global variables.
*/
void prescan(void)
{
	char *p, *tp;
	char temp[32];
	int datatype;
	int brace = 0; /* when 0, this var tells us that current
					source position is outside of any function. */

	p = prog;
	func_index = 0;
	do{
		while(brace){ /* bypass code inside function */
			get_token();
			if(*token == '{')
				brace++;
			if(*token == '}')
				brace--;
		}

		tp = prog; /* save current position */
		get_token();
		/* global var type or function return type */
		if(tok == CHAR || tok == INT){
			datatype = tok; /* save data type */
			get_token();
			if(token_type == IDENTIFIER){
				strcpy(temp, token);
				get_token();
				if(*token != '('){ /* must be global var */
					prog = tp; /* return to start of declaration */
					decl_global();
				}
				else if(*token == '('){ /*must be a function */
					func_table[func_index].loc = prog;
					func_table[func_index].ret_type = datatype;
					strcpy(func_table[func_index].func_name, temp);
					func_index++;
					while(*prog != ')')
						prog++;
					prog++;
					/* now prog points to opening curly brace of function */
				}
				else
					putback();
			}
		}
		else if(*token == '{')
			brace++;
	}while(tok != FINISHED);

	prog = p;
}

/*
	Return the entry point of the specified function.
	Return NULL if not found.
*/
char *find_func(char *name)
{
	register int i;

	for(i = 0; i < func_index; i++)
		if(!strcmp(name, func_table[i].func_name))
			return func_table[i].loc;

	return NULL;
}

/* Declare a global variable. */
void decl_global(void)
{
	int vartype;

	get_token(); /* get type */

	vartype = tok; /* save var type */

	do{ /* process comma-separated list */
		global_vars[gvar_index].v_type = vartype;
		global_vars[gvar_index].value = 0; /* init to 0 */
		get_token(); /* get name */
		strcpy(global_vars[gvar_index].var_name, token);
		get_token();
		gvar_index++;
	}while(*token == ',');

	if(*token != ';')
		sntx_err(SEMI_EXPECTED);
}

/* Declare a local variable. */
void decl_local(void)
{

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一区二区三区四区五区黄| 久久网这里都是精品| 国产一区二区91| 麻豆精品视频在线观看| 天天综合色天天综合色h| 亚洲中国最大av网站| 天堂久久一区二区三区| 视频一区二区欧美| 精品一区二区在线播放| 韩国av一区二区三区四区| 国产尤物一区二区| 成人黄色av网站在线| av在线这里只有精品| 色一情一乱一乱一91av| 色诱亚洲精品久久久久久| 色猫猫国产区一区二在线视频| 色综合久久综合网97色综合| 欧美无砖砖区免费| 日韩一区二区电影网| 国产日韩欧美在线一区| 国产精品视频免费看| 一区二区理论电影在线观看| 日本大胆欧美人术艺术动态| 国产老妇另类xxxxx| 95精品视频在线| 欧美日韩一级黄| 久久综合久久综合久久综合| 国产精品伦一区| 五月婷婷久久丁香| 岛国av在线一区| 欧美日韩综合在线| 国产三级欧美三级日产三级99| 国产精品麻豆99久久久久久| 丝袜诱惑亚洲看片| 国产成人免费在线视频| 欧美亚一区二区| 久久久午夜精品| 亚洲激情在线播放| 国产美女精品一区二区三区| 91蝌蚪porny成人天涯| 欧美一区日本一区韩国一区| 国产精品丝袜黑色高跟| 青青青伊人色综合久久| 91在线视频在线| 精品国产亚洲在线| 亚洲福利一二三区| 成人妖精视频yjsp地址| 欧美一区欧美二区| 亚洲一级二级三级| 成人av网在线| 欧美精品一区二区三区蜜桃| 亚洲成人免费视| 91热门视频在线观看| 国产日韩欧美激情| 久久精品国内一区二区三区| 在线观看网站黄不卡| 亚洲天堂福利av| 丁香六月综合激情| 精品国产免费一区二区三区香蕉| 性做久久久久久免费观看欧美| 91丨九色丨蝌蚪丨老版| 久久精品日韩一区二区三区| 久久99国产精品久久99| 91精品国产综合久久久久久久久久| 18成人在线观看| 东方欧美亚洲色图在线| 久久久亚洲欧洲日产国码αv| 日本不卡一区二区三区高清视频| 欧美午夜精品一区二区三区 | 这里只有精品免费| 亚洲免费观看高清在线观看| 成人黄色在线网站| 亚洲视频你懂的| 一本色道久久综合精品竹菊| 中文字幕在线观看不卡视频| 成人av在线一区二区| 久久久99精品久久| 成人自拍视频在线观看| 国产精品视频一二三| 99精品视频一区二区| 亚洲激情综合网| 欧美喷水一区二区| 美女高潮久久久| 国产亚洲一二三区| 国产a精品视频| 成人欧美一区二区三区小说| 色综合天天狠狠| 性做久久久久久久久| 在线电影院国产精品| 毛片av中文字幕一区二区| 欧美精品一区二区久久久| 国产a精品视频| 亚洲综合色成人| 欧美日韩精品免费| 久久99精品国产麻豆婷婷| 国产午夜精品久久久久久免费视 | 成人av网址在线| 最新日韩av在线| 欧美色电影在线| 美国欧美日韩国产在线播放| 欧美韩国一区二区| 欧洲色大大久久| 激情综合五月婷婷| 亚洲人被黑人高潮完整版| 欧美日韩国产a| 成人性生交大合| 亚洲444eee在线观看| 国产欧美一区在线| 色播五月激情综合网| 日韩电影在线一区二区三区| 国产日韩亚洲欧美综合| 欧美色精品在线视频| 成人性生交大合| 日韩和欧美的一区| 国产精品麻豆欧美日韩ww| 欧美日韩国产首页| 99热这里都是精品| 九色porny丨国产精品| 亚洲精品视频免费看| xf在线a精品一区二区视频网站| 91麻豆国产福利在线观看| 狠狠色狠狠色综合日日91app| 一区二区三区日韩精品视频| www国产成人免费观看视频 深夜成人网| 91毛片在线观看| 国产成人av一区| 免费观看在线综合色| 亚洲一区在线观看免费观看电影高清| 久久久亚洲高清| 日韩女同互慰一区二区| 欧美亚一区二区| 97久久超碰精品国产| 成人性生交大合| 国产乱国产乱300精品| 麻豆成人久久精品二区三区小说| 亚洲主播在线播放| 亚洲精品免费在线观看| 国产精品私人自拍| 国产网站一区二区三区| 日韩欧美在线一区二区三区| 欧美日本不卡视频| 欧美日韩日本视频| 欧美三级韩国三级日本一级| av在线不卡免费看| 成人午夜免费av| 国产成人免费视频一区| 国产一区二区网址| 狠狠狠色丁香婷婷综合久久五月| 日本强好片久久久久久aaa| 日韩精品电影在线| 免费成人在线影院| 久久精品噜噜噜成人av农村| 九九在线精品视频| 国产在线视频一区二区三区| 久久国产精品99久久人人澡| 狠狠色丁香婷婷综合久久片| 激情五月婷婷综合网| 国产一区福利在线| 国产精品一区二区不卡| 风间由美性色一区二区三区| 成人动漫一区二区在线| 91小视频在线免费看| 日本精品一区二区三区高清| 欧美日韩一区成人| 日韩欧美专区在线| 精品久久人人做人人爰| 国产校园另类小说区| 中文字幕在线观看不卡视频| 亚洲一区二区三区四区五区黄| 亚洲18女电影在线观看| 久久国产人妖系列| 成人av影视在线观看| 色偷偷成人一区二区三区91 | 精品一区二区久久久| 久久99国产精品免费网站| 丰满放荡岳乱妇91ww| 91黄色免费版| 日韩欧美国产一区在线观看| 久久精品夜色噜噜亚洲a∨| 国产精品国产三级国产普通话三级| 亚洲九九爱视频| 麻豆精品久久久| 91视频在线观看| 欧美一区二区三区成人| 亚洲国产精品传媒在线观看| 亚洲黄色免费电影| 久久狠狠亚洲综合| 91在线观看一区二区| 欧美高清www午色夜在线视频| 久久久久久久久久久电影| 亚洲在线免费播放| 蜜臀精品一区二区三区在线观看 | 欧美一区二区高清| 中文字幕不卡在线| 日产欧产美韩系列久久99| 波多野结衣亚洲一区| 欧美一区二区三区在| 一区二区三区久久| 成人a区在线观看| 精品日本一线二线三线不卡|