/*---------------------------------------------------------------------------
文件 :
描述 :
作者 : wsl(shinesl@163.com)
版本 : V1.2
时间 :
2011-08-10 修正程序返回时nest_scope_stack弹出一次,修改同名的函数覆盖上一个
2011-10-24 增加了表达式函数接口
2011-11-03 修正了一些告警
---------------------------------------------------------------------------*/
#include "StdAfx.h"
#include "Expression.h"
// 关键字表 lookup table.
struct commands
{
char command[20];
token_ireps tok;
} com_table[] = {
"if", TOKEN_IF,
"else", TOKEN_ELSE,
"for", TOKEN_FOR,
"do", TOKEN_DO,
"while", TOKEN_WHILE,
"char", TOKEN_CHAR,
"int", TOKEN_INT,
"float", TOKEN_FLOAT,
"double", TOKEN_DOUBLE,
"long", TOKEN_LONG,
"short", TOKEN_SHORT,
"bool", TOKEN_BOOL,
"return", TOKEN_RETURN,
"switch", TOKEN_SWITCH,
"break", TOKEN_BREAK,
"case", TOKEN_CASE,
"cout", TOKEN_COUT,
"cin", TOKEN_CIN,
"", TOKEN_END // mark end of table
};
//标准库函数表
struct intern_func_type
{
char* f_name; // function name
int (CExpression::*p)(); // 函数指针
} intern_func[] = {
"abs", &CExpression::call_abs,
"rand", &CExpression::call_rand,
"", 0 // 数据尾部标志
};
CExpression::CExpression(void)
{
//初始化成员
err_count = 0;
ret_value = 0;
memset(ret_string,0,sizeof(ret_string));
breakfound = false;
func_table.clear();
global_vars.clear();
local_vars.clear();
memset(token,0,sizeof(token));
memset(p_buf,0,sizeof(p_buf));
memset(errMsg,0,sizeof(errMsg));
}
CExpression::~CExpression(void)
{
}
/***********************************************************************************
函数名:SetVariable(CString strName, double dValue);
功能:插入一个参数,如果参数名已经存在,则修改值。
输入参数:参数名和参数值
输出参数:无
返回值:true-正常 flase-异常
***********************************************************************************/
bool CExpression::SetVariable(CString strName,double dValue)
{
strName.MakeLower();
var_type vt;
for(unsigned i=0; i < global_vars.size(); i++)
{
if(!strcmp(global_vars[i].var_name, strName.GetBuffer(0)))//若变量存在,覆盖
{
global_vars[i].value = dValue;
return true;
}
}
strcpy(vt.var_name, strName.GetBuffer(0));
vt.value = dValue;
vt.v_type = TOKEN_DOUBLE;
global_vars.push_back(vt);
return false;
}
/***********************************************************************
函数名:bool SetVariable(CString strName, CString strValue)
功能:插入一个参数,如果参数名已经存在,则修改值。
输入参数:参数名和参数值
输出参数:无
返回值:true-正常 flase-异常
************************************************************************/
bool CExpression::SetVariable(CString strName,CString strValue)
{
return SetVariable(strName,atof(strValue));
}
/***********************************************************************
函数名:bool GetVariable(CString strName,double& dValue)
功能:根据参数名获取参数值
输入参数:参数名
输出参数:参数值
返回值:true-正常 flase-异常
************************************************************************/
bool CExpression::GetVariable(CString strName,double& dValue)
{
strName.MakeLower();
for(unsigned i=0; i < global_vars.size(); i++)
{
if(!strcmp(global_vars[i].var_name, strName.GetBuffer(0)))
{
dValue = global_vars[i].value;
return true;
}
}
return false;
}
//double CExpression::GetVariable(CString strName)
//{
// strName.MakeLower();
// for(unsigned i=0; i < global_vars.size(); i++)
// {
// if(!strcmp(global_vars[i].var_name, strName.GetBuffer(0)))
// return global_vars[i].value;
// }
// return 0;
//}
//
//
//int CExpression::GetLogicValue(CString strLogic)
//{
// double dValue = 0;
// GetLogicValue(strLogic,dValue);
// return (int)dValue;
//}
/*****************************************************************************
函数名:bool GetLogicValue(CString& strLogic,CString& strValue);
功能:解释脚本语句
输入参数:脚本
输出参数:计算的结果值(转换为ASCII码)
返回值:true-正常 flase-异常
*****************************************************************************/
bool CExpression::GetLogicValue(CString strLogic,CString& strValue)
{
memset(token,0,sizeof(token));
//memset(p_buf,0,sizeof(p_buf));
err_count = 0;
breakfound = false;
//构造标准函数
strLogic.MakeLower();
strLogic.Insert(0,"double main() {");
strLogic += " }";
//设置返回的值为字符串
is_ret_value = false;
//执行解释语句
execute(strLogic);
//判断解释过程中是否有错误
if (err_count)
{
return false;
}
strValue = ret_string;
return true;
}
/****************************************************************
函数名:bool GetLogicValue(CString strLogic,double& dValue);
功能:解释脚本语句
输入参数:脚本
输出参数:计算结果(双浮点型数值)
返回值:true-正常 flase-异常
*****************************************************************/
bool CExpression::GetLogicValue(CString strLogic,double& dValue)
{
memset(token,0,sizeof(token));
//memset(p_buf,0,sizeof(p_buf));
err_count = 0;
breakfound = false;
//构造标准函数
strLogic.MakeLower();
strLogic.Insert(0,"double main() {");
strLogic += " }";
//设置返回的值为数值
is_ret_value = true;
//执行解释语句
execute(strLogic);
//判断解释过程中是否有错误
if (err_count)
{
return false;
}
dValue = ret_value;
return true;
}
/********************************************************************
名称:bool GetMathValue(CString strMath,double& dValue);
功能:计算表达式
输入:表达式,格式例子:20+30-20
输出:表达式计算结果
返回值:true-正常 flase-异常
*********************************************************************/
bool CExpression::GetMathValue(CString strMath,double& dValue)
{
//复位
memset(token,0,sizeof(token));
err_count = 0;
breakfound = false;
//构造标准函数
strMath.MakeLower();
strMath.Insert(0,"double main() { return ");
strMath += " }";
//设置返回的值为数值
is_ret_value = true;
//执行解释语句
execute(strMath);
//判断解释过程中是否有错误
if (err_count)
{
return false;
}
dValue = ret_value;
return true;
}
bool CExpression::execute(const char* p)
{
// 加载程序代码.
if(!load_program(p)) return false;
// 程序代码指针
prog = p_buf;
try
{
// 扫绘所有函数和全局变量
if(!prescan())
{
return false;
}
// 查找main函数
prog = find_func("main");
// main函数存在
if(!prog)
{
return false;
}
// 回到 (.
prog--;
// 设置入口函数为main
strcpy(token, "main");
// 从main代码段开始解释程序
if(!call())
{
return false;
}
}
catch(...)
{
return false;
}
return true;
}
bool CExpression::load_program(const char *pCode)
{
char* p = p_buf;
int i = (int)strlen(pCode);
if (i >= PROG_SIZE)
{
return false;
}
while (*pCode != 0)
{
*p++ = *pCode++;
}
*(p) = '\0';
return true;
}
bool CExpression::prescan()
{
char *p, *tp;
char temp[MAX_ID_LEN+1];
token_ireps datatype;
func_type ft;
int brace = 0;
p = prog;
do {
while(brace) {
get_token();
if(tok == TOKEN_END)
{
sntx_err(UNBAL_BRACES,"[CExpression::prescan] ");
return false;
}
if(*token == '{') brace++;
if(*token == '}') brace--;
}
tp = prog;
get_token();
// 判断是否是全局变量或是函数的返回值
if(tok==TOKEN_CHAR || tok==TOKEN_INT || tok==TOKEN_DOUBLE ||
tok==TOKEN_FLOAT || tok==TOKEN_LONG || tok==TOKEN_SHORT || tok==TOKEN_BOOL)
{
datatype = tok; // 保存token类型
get_token();
if(token_type == IDENTIFIER) {
strcpy(temp, token);
get_token();
if(*token != '(') { // must be global var
prog = tp;
decl_global();
}
else if(*token == '(') { // must be a function
// 判断该函数是否被定义
bool bFind = false;
for(unsigned i=0; i < func_table.size(); i++)
if(!s
本人改写的C语言解释器C++类
4星 · 超过85%的资源 需积分: 9 120 浏览量
2012-11-28
11:04:49
上传
评论 4
收藏 9KB RAR 举报
shinewsl
- 粉丝: 1
- 资源: 10
最新资源
- TG-2024-04-26-183849310.mp4
- 汇编语言的概要介绍与分析
- 个人博客系统设计与开发.zip
- 2023-04-06-项目笔记 - 第一百十五阶段 - 4.4.2.113全局变量的作用域-113 -2024.04.26
- 2023-04-06-项目笔记 - 第一百十五阶段 - 4.4.2.113全局变量的作用域-113 -2024.04.26
- htmlzwbjq_downyi.com.zip
- 无头单向非循环链表的实现(Test.c)
- 无头单向非循环链表的实现(SList.c)
- 浏览器重定向插件更新文件
- SSA-BP麻雀算法优化BP神经网络多特征分类预测(Matlab实现完整源码和数据)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈