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

📄 script.h

📁 一个脚本语言的解释器
💻 H
📖 第 1 页 / 共 2 页
字号:
		else
			++token; // skip ';'
		return se;
	}

	expression * read_expression(token_t &token)
	{
		expression *exp = read_list_expression(token); // exp || exp
		if(token != '=') return exp;
		else
		{
			++token;
			expression_assign *ea = new expression_assign();
			set_debug_info(ea, token);
			ea->set_left(exp);
			DEREF(exp);
			exp = read_expression(token);
			ea->set_right(exp);
			DEREF(exp);
			return ea;
		}
	}

	expression * read_list_expression(token_t &token)
	{
		expression * exp = logic_or_expression(token);
		if(token == ',')
		{
			expression_list * exps = new expression_list();
			set_debug_info(exps, token);
			exps->list.add(exp);
			DEREF(exp);
			while(token == ',')
			{
				++token; // skip ','
				exp = logic_or_expression(token);
				exps->list.add(exp);
				DEREF(exp);
			}
			exp = exps;
		}
		return exp;
	}

	expression * logic_or_expression(token_t &token)
	{
		expression * exp = logic_and_expression(token);
		while(token == "||")
		{
			++token;
			expression *e = logic_and_expression(token);
			expression_logic_or * elo = new expression_logic_or();
			elo->set_left(exp);
			DEREF(exp);
			elo->set_right(e);
			DEREF(e);
			exp = elo;
		}
		return exp;
	}

	expression * logic_and_expression(token_t &token)
	{
		expression * exp = equality_expression(token);
		while(token == "&&")
		{
			++token;
			expression *e = equality_expression(token);
			expression_logic_and * ela = new expression_logic_and();
			set_debug_info(ela, token);
			ela->set_left(exp);
			DEREF(exp);
			ela->set_right(e);
			DEREF(e);
			exp = ela;
		}
		return exp;
	}

	expression * equality_expression(token_t &token)
	{
		expression * exp = relational_expression(token);
		while(token == "==" || token == "!=")
		{
			binary_expression * ee;
			if(token == "==") ee = new expression_equal();
			else ee = new expression_unequal();
			set_debug_info(ee, token);
			++token;

			expression *e = relational_expression(token);
			ee->set_left(exp);
			DEREF(exp);
			ee->set_right(e);
			DEREF(e);
			exp = ee;
		}
		return exp;
	}

	expression * relational_expression(token_t &token)
	{
		expression * exp = additive_expression(token);
		while(token == ">=" || token == "<=" || token == ">" || token == "<")
		{
			binary_expression * ee;
			if(token == ">") ee = new expression_greater();
			else if(token == "<") ee = new expression_less();
			else if(token == ">=") ee = new expression_greater_equal();
			else if(token == "<=") ee = new expression_less_equal();
			set_debug_info(ee, token);
			++token;

			expression *e = additive_expression(token);
			ee->set_left(exp);
			DEREF(exp);
			ee->set_right(e);
			DEREF(e);
			exp = ee;
		}
		return exp;
	}

	expression * additive_expression(token_t &token)
	{
		expression * exp = multiplicative_expression(token);
		while(token == '+' || token == '-')
		{
			binary_expression * ee;
			if(token == '+') ee = new expression_add();
			else ee = new expression_substract();
			set_debug_info(ee, token);
			++token;

			expression *e = multiplicative_expression(token);
			ee->set_left(exp);
			DEREF(exp);
			ee->set_right(e);
			DEREF(e);
			exp = ee;
		}
		return exp;
	}

	expression * multiplicative_expression(token_t &token)
	{
		expression * exp = suffix_expression(token);
		while(token == '*' || token == '/' || token == '%')
		{
			binary_expression * ee;
			if(token == '*') ee = new expression_multiply();
			else if(token == '/') ee = new expression_divide();
			else ee = new expression_mod();
			set_debug_info(ee, token);
			++token;

			expression *e = suffix_expression(token);
			ee->set_left(exp);
			DEREF(exp);
			ee->set_right(e);
			DEREF(e);
			exp = ee;
		}
		return exp;
	}

	expression * suffix_expression(token_t &token)
	{
		if(token == '!')
		{
			expression_logic_not * exp = new expression_logic_not();
			set_debug_info(exp, token);
			++token;
			expression *e = postfix_expression(token);
			exp->set_child(e);
			DEREF(e);
			return exp;
		}
		if(token == '-')
		{
			expression_substract * exp = new expression_substract();
			set_debug_info(exp, token);
			++token;
			expression *e = postfix_expression(token);
			exp->set_right(e);
			DEREF(e);
			return exp;
		}
		else
		{
			return postfix_expression(token);
		}
	}
	
	void read_arguments(expression_func_call *ee, token_t &token)
	{
		++token;
		while(token != ')')
		{
			expression * arg = read_expression(token);
			ee->add_argument(arg);
			DEREF(arg);
			if(token == ',') ++token;
			else if(token == ')') break;
			else
			{
				ERROR_TOK(UnexpectedToken, "read_arguments(): ',' or ')' is expected.", token);
				break;
			}
		}
		if(token == ')') ++token; // skip ')';
	}
	expression * postfix_expression(token_t &token)
	{
		expression * exp = element_expression(token);
		while(token == '[' || token == '(' || token == '.')
		{
			if(token == '[')
			{
				++token;
				expression_subscribe *ee = new expression_subscribe();
				set_debug_info(ee, token);

				expression *e = read_expression(token);
				ee->set_left(exp);
				DEREF(exp);
				ee->set_right(e);
				DEREF(e);
				exp = ee;

				if(token != ']')
					ERROR_TOK(UnexpectedToken, "postfix_expression(): ']' is expected.", token);
				else
					++token; // skip ']'
			}
			else if(token == '(')
			{
				expression_func_call *ee = new expression_func_call();
				set_debug_info(ee, token);

				ee->set_function(exp);
				DEREF(exp);
				// read arguments
				read_arguments(ee, token);
				exp = ee;
			}
			else
			{
				++token;
				expression_member * ee = new expression_member();
				set_debug_info(ee, token);

				expression *e = element_expression(token);
				ee->set_left(exp);
				DEREF(exp);
				ee->set_right(e);
				DEREF(e);
				exp = ee;
			}
		}
		return exp;
	}

	/*expression * member_expression(token_t &token)
	{
		expression * exp = element_expression(token);
		while(token == '.')
		{
			++token;
			expression_member * ee = new expression_member();
			set_debug_info(ee, token);

			expression *e = element_expression(token);
			ee->set_left(exp);
			DEREF(exp);
			ee->set_right(e);
			DEREF(e);
			exp = ee;
		}
		return exp;
	}*/

	expression * element_expression(token_t &token)
	{
		if(token == "new")
		{
			return new_expression(++token);
		}
		else if( token == "function" || token == "object" )
		{
			return anonymous_function_expression(++token);
		}
		else if(token[0] == '\'' || token[0] == '\"')
		{
			expression_literal *el = new expression_literal();
			el->set_literal(token.ToContent(), expression_literal::t_str);
			set_debug_info(el, token);
			++token;
			return el;
		}
		else if(CppLex::IsDigit(token[0]))
		{
			expression_literal *el = new expression_literal();
			el->set_literal(token.ToString(), expression_literal::t_num);
			set_debug_info(el, token);
			++token;
			return el;
		}
		else return identifier_expression(token);
	}

	expression * new_expression(token_t &token)
	{
		// read object name
		expression * name = identifier_expression(token);
		// read argument list
		expression_new * expnew = new expression_new();
		expnew->set_function(name);
		set_debug_info(expnew, token);
		read_arguments(expnew, token);
		DEREF(name);
		return expnew;
	}

	expression * anonymous_function_expression(token_t &token)
	{
		char funcname[128];
		sprintf(funcname, "%s_%d", "anonymous", token.Line());
		expression_anonymous * func = new expression_anonymous(funcname);
		set_debug_info(func, token);
		// read parameter list
		id_list * param = read_parameter(token);
		func->function_tree->set_param_list(param);
		// read function body
		statement * s = read_compound_statement(token);
		func->function_tree->set_body(s);
		DEREF(param);
		DEREF(s);
		return func;
	}

	expression * identifier_expression(token_t &token)
	{
		expression *e = 0;
		if(token == "null")
			e = new expression_null();
		else if(token == "true")
			e = new expression_bool(true);
		else if(token == "false")
			e = new expression_bool(false);
		else if(token == "this")
			e = new expression_this();
		else if(token == "(")
		{
			expression * parenthesis = read_expression(++token);
			if(token != ')') ERROR_TOK(UnexpectedToken, "identifier_expression() - parenthesis: ')' is expected.", token);
			e = parenthesis;
		}
		else
		{
			if(!is_identifier(token.ToString()))
			{
				ERROR_TOK(UnexpectedToken, "identifier_expression(): identifier is expected.", token);
				return 0;
			}
			expression_identifier *ei = new expression_identifier();
			ei->set_identifier(token.ToString());
			e = ei;
		}
		set_debug_info(e, token);
		++token;
		return e;
	}

private:
	debug_files * _df;

	void set_debug_info(expression * e, token_t &token)
	{
		e->set_debug_info(_df);
		e->debug_file = _df->get_last_file();
		e->debug_line = token.Line();
	}

};

__END_NAMESPACE__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -