⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parse.c

📁 自己做的一个C语言的解释器 给大家做个参考
💻 C
📖 第 1 页 / 共 2 页
字号:
			}
			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 */
			break;
		/*Rev1.06 yock.yu 05-03-01 start*/
		case KEYWORD:
			if(tok == SIZEOF){
				get_token();
				if(*token != '(')
					sntx_err(PAREN_EXPECTED);

				get_token();
				if(token_type == NUMBER){
					*value = atoi(token);
					if(*value <= 255) *value = 1;
					else *value = 2;
					get_token();
					if(*token !=  ')')
						sntx_err(PAREN_EXPECTED);

					get_token();
					return;
				}
				else if((*value = find_type(token)) != -1){
					get_token();
					if(*token !=  ')')
						sntx_err(PAREN_EXPECTED);

					get_token();
					return;
				}
			}

			sntx_err(SYNTAX);
			break;
		/*Rev1.06 yock.yu 05-03-01 end*/
		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",/*SYNTAX*/
		"unbalanced parenthese",/*UNBAL_PARENS*/
		"no expressoin present",/*NO_EXP*/
		"equals sign expected",/*EQUALS_EXPECTED*/
		"not a variable",/*NOT_VAR*/
		"parameter error",/*PARAM_ERR*/
		"semicolon expected",/*SEMI_EXPECTED*/
		"unbalanced braces",/*UNBAL_BRACES*/
		"type undefine",/*FUNC_UNDEF*/
		"type specifier expected",/*TYPE_EXPECTED*/
		"too many nested function calls",/*NEST_FUNC*/
		"return without call",/*RET_NOCALL*/
		"parentheses expected",/*PAREN_EXPECTED*/
		"while expected",/*WHILE_EXPECTED*/
		"closing quote expected",/*QUOTE_EXPECTED*/
		"not a string",/*NO_TEMP*/
		"too many local variables",/*TOO_MANY_LVARS*/
		"division by zero"/*DIV_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) && (*prog != '{'))/*Rev 1.04 yock.yu 05-02-18*/
			*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;
}

/* Make sure token is word. */
int is_alpha(char c)
{
	return((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'));
}

/* 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 + -