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

📄 vbs_context.cpp

📁 vb script子集解释器 Makefile.vb用于生成解释器的c代码 可执行程序需要自己写main函数
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "vbs_context.h"#include <iostream>#include <stdio.h>#include <stdlib.h>#include <ctype.h>#include <math.h>#include "string_util.h"#include "../inc/tracelog.h"int vbs_parse(Cvbs_context* p);int Cvbs_context::parse(FILE* pf){        nlastCol=1;        nlastLeng=0;        vbslex_init_extra(this,&scanner);	if (pf) vbsset_in(pf,scanner);        register int n=vbs_parse(this);        vbslex_destroy(scanner);	Release();        return n;}int Cvbs_context::parse(const char* szClause){	TRACE(1,"parse:%s",szClause);	nlastCol=1;	nlastLeng=0;        vbslex_init_extra(this,&scanner);	YY_BUFFER_STATE buf;	buf = vbs_scan_string(szClause, scanner );	vbsset_lineno(1,scanner);        register int n=vbs_parse(this);	vbs_delete_buffer(buf,scanner);        vbslex_destroy(scanner);	Release();        return n;}void Cvbs_context::save_func(const char* szName){        string str(szName);        toUpperCase(str);	sub_table.insert(var_value_type(str,string("Func")));}string Cvbs_context::eval(const char* szExp, vars_table& tvar){	var.clear();	var = tvar;	string exp("eval ");	exp+= szExp;	parse(exp.c_str());	exp=".";	exp = get_var(".");	if (exp[0]=='$') return string("\"") + string(exp.c_str()+1) + string("\"");	if (exp[0]=='#') return string(exp.c_str()+1);	return exp;}void Cvbs_context::do_eval(const char* szExp){	set_var(".",szExp);}string Cvbs_context::eval(const char* szExp){        string exp("eval ");        exp+= szExp;        parse(exp.c_str());        exp=".";        exp = get_var(".");        if (exp[0]=='$') return string("\"") + string(exp.c_str()+1) + string("\"");        if (exp[0]=='#') return string(get_var(".").c_str()+1);        return exp;}void Cvbs_context::execute(const char* szExp, vars_table& tvar){	push_var(tvar);	        try {		parse(szExp);	}	catch(int n)	{		TRACE(0, "excute exception:%d",  n);	}	pop_var(tvar);}void Cvbs_context::execute(const char* szExp){        try 	{              parse(szExp);        }        catch(int n)        {                ;        }}void Cvbs_context::push_var(vars_table& g_var){        vars_table::iterator i;        i=g_var.begin();        for (i=g_var.begin();i!=g_var.end();i++)        {               set_var((*i).first.c_str(),(*i).second.c_str());        }}void Cvbs_context::pop_var(vars_table& g_var){	vars_table::iterator i;	i=g_var.begin();	for (i=g_var.begin();i!=g_var.end();i++)	{	       string str;	       str = get_var((*i).first.c_str());	       if  (!str.empty())	       	(*i).second = str;	}}string Cvbs_context::get_var(const char* name){		        vars_table::iterator i;        string str(name);	toUpperCase(str);        i = var.find(str);        if (i == var.end() ) 	{		return string("");	}        return (*i).second;}bool Cvbs_context::set_var(const char* name, const char* value){        vars_table::iterator i;        string str(name);        toUpperCase(str);	i = var.find(str);        if (i == var.end())        {		insert_var(name,value);                return true;        }        (*i).second = string(value);        return true;}bool Cvbs_context::insert_var(const char* szVarName,const char* value){        string str(szVarName);	toUpperCase(str);        return var.insert(var_value_type(str,string(value))).second;}string Cvbs_context::namev(const char* szName){	string r(szName);	toUpperCase(r);	r = get_var(r.c_str());	set_var(".",r.c_str());	return r;}string Cvbs_context::name_av(const char* szName,int idx){        string r(szName);        toUpperCase(r);	char tmp[32];	sprintf(tmp,"#%u",idx);        r+=tmp;        r = get_var(r.c_str());	set_var(".",r.c_str());        return r;}string Cvbs_context::eq(const char* s1,const char* s2){	string r((strcmp(s1,s2)==0)?string("True"):string("False"));	set_var(".",r.c_str());	return r;}string Cvbs_context::lt(const char* s1,const char* s2){	register bool r;	if (s1[0]=='#' && s2[0] == '#')	{		register long n1,n2;		n1 = atol(s1+1);		n2 = atol(s2+1);		r = (n1 < n2);	}	else	{	    	r = (strcmp(s1,s2)<0)?true:false;	}	set_var(".",r?"True":"False");	return r?string("True"):string("False");}string Cvbs_context::le(const char* s1,const char* s2){	register bool r;        if (s1[0]=='#' && s2[0] == '#')        {                register long n1,n2;                n1 = atol(s1+1);                n2 = atol(s2+1);                r = (n1 <= n2);        }        else        {                r = (strcmp(s1,s2)<=0)?true:false;        }	set_var(".",r?"True":"False");        return r?string("True"):string("False");}string Cvbs_context::gt(const char* s1,const char* s2){        register bool r;        if (s1[0]=='#' && s2[0] == '#')        {                register long n1,n2;                n1 = atol(s1+1);                n2 = atol(s2+1);                r = (n1 > n2);        }        else        {                r = (strcmp(s1,s2)>0)?true:false;        }	set_var(".",r?"True":"False");        return r?string("True"):string("False");}string Cvbs_context::ge(const char* s1,const char* s2){        register bool r;        if (s1[0]=='#' && s2[0] == '#')        {                register long n1,n2;                n1 = atol(s1+1);                n2 = atol(s2+1);                r = (n1 >= n2);        }        else        {                r = (strcmp(s1,s2)>=0)?true:false;        }	set_var(".",r?"True":"False");        return r?string("True"):string("False");}string Cvbs_context::ne(const char* s1,const char* s2){	string r((eq(s1,s2)=="True")? string("False") : string("True"));	set_var(".",r.c_str());	return r;}string  Cvbs_context::plus(const char* s1,const char* s2){        if (s1[0]=='$' && s2[0] == '$')//Concatenation strings        {                string r=string("$")+ string(s1+1)+string(s2+1);		set_var(".",r.c_str());		return r;        }        else        {                register long n1,n2;		char r[32];		r[0]='#';                n1 = atol(s1+1);                n2 = atol(s2+1);                n1 +=n2;		snprintf(r+1,31,"%d",n1);		set_var(".",r);		return string(r);        }}string  Cvbs_context::amd(const char* s1,const char* s2){                string r("$");		if (strlen(s1)>0) r += s1+1;		if (strlen(s2)>0) r += s2+1;                set_var(".",r.c_str());                return r;}string  Cvbs_context::minus(const char* s1,const char* s2){        if (s1[0]=='#' && s2[0] == '#')        {                register long n1,n2;                char r[32];                r[0]='#';                n1 = atol(s1+1);                n2 = atol(s2+1);                n1 -=n2;                snprintf(r+1,31,"%d",n1);		set_var(".",r);                return string(r);        }        else        {		set_var(".","$");                return string("$");        }}string  Cvbs_context::mult(const char* s1,const char* s2){        if (s1[0]=='#' && s2[0] == '#')        {                register long n1,n2;                char r[32];                r[0]='#';                n1 = atol(s1+1);                n2 = atol(s2+1);                n1 *=n2;                snprintf(r+1,31,"%d",n1);		set_var(".",r);                return string(r);        }        else        {		set_var(".","$");                return string("$");        }}string  Cvbs_context::divide(const char* s1,const char* s2){        if (s1[0]=='#' && s2[0] == '#')        {                register long n1,n2;                char r[32];                r[0]='#';                n1 = atol(s1+1);                n2 = atol(s2+1);                n1 = n1 / n2;                snprintf(r+1,31,"%d",n1);		set_var(".",r);                return string(r);        }        else        {		set_var(".","$");                return string("$");        }}string  Cvbs_context::neg(const char* s1){        if (s1[0]=='#')        {                register long n1;                char r[32];                r[0]='#';                n1 = atol(s1+1);                n1 = -n1;                snprintf(r+1,31,"%d",n1);		set_var(".",r);                return string(r);        }        else        {		set_var(".","$");                return string("$");        }}string Cvbs_context::vb_and(const char* s1,const char* s2){	if (s1[0]=='#' && s2[0]=='#')	{		int n = int_value(s1) & int_value(s2);		char tmp[32]={0};		sprintf(tmp,"#%d",n);		return string(tmp);	}	return (true_value(s1) && true_value(s2))?string("True"):string("False");}string Cvbs_context::vb_or(const char* s1,const char* s2){        if (s1[0]=='#' && s2[0]=='#')        {                int n = int_value(s1) | int_value(s2);                char tmp[32]={0};                sprintf(tmp,"#%d",n);                return string(tmp);        }	return (true_value(s1) || true_value(s2))?string("True"):string("False");}string Cvbs_context::vb_xor(const char* s1,const char* s2){        if (s1[0]=='#' && s2[0]=='#')        {                int n = int_value(s1) ^ int_value(s2);                char tmp[32]={0};                sprintf(tmp,"#%d",n);                return string(tmp);        }        return (true_value(s1) ^ true_value(s2))?string("True"):string("False");}string Cvbs_context::vb_not(const char* s1){	if (true_value(s1)) return string("False");	return string("True");}string  Cvbs_context::value(const char* s1){	set_var(".",s1);	string str;	str = s1;	return str;}void Cvbs_context::printv(const char* s1){	if (s1[0]=='$' || s1[0]=='#')		printf("%s\n",s1+1);	else

⌨️ 快捷键说明

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