我的C语言解释器开源了
下载地址:http://download.csdn.net/detail/linxren/4204728
使用说明:
#include <stdio.h>
#include <malloc.h>
#pragma comment ( lib, "xrc.lib" )
int xrc_init( void * x );
int xrc_par( void * x, char * source );
int xrc_exe( void * x, char * callname );
int xrc_done( void * x );
int xrc_reg( void * x, char * callname, void * fptr );
int xrc_string( void * x, char * source, char * callname );
int xrc_file( void * x, char * srcfile, char * callname );
int xrc_value_get( void * x, char * srcfile, char * varname, void * value );
int xrc_value_free( void * x );
/*struct _st 取消内存对齐*/
#pragma pack(1)
struct _st{
int a;
char b;
float c;
char d[100];
}st;
#pragma pack()
int reg_func( char * a )
{
printf( "%s", a );
return 0;
}
int main()
{
int i, ret;
char xbuf[4096];/*xrc的运行空间,大小必须大于4096*/
char *source;
size_t len;
FILE *fp;
/******************************************************************
**脚本解析测试 1
** 如果只执行一次脚本,那么可以直接调用xrc_file或者是xrc_string
*/
ret = xrc_file( xbuf, "../testsource.txt", "main" );
if( ret != 0 ){
printf( "par error: %s\n", xbuf );
return 0;
}
/******************************************************************
**脚本解析测试 2
** 如果要多次执行一个脚本,为了提高效率,可以这么调用:
** int xrc_init( void * x );
** int xrc_par( void * x, char * source );
** int xrc_exe( void * x, char * callname );可以多次调用xrc_exe函数,用来多次执行一个脚本
** int xrc_done( void * x );
**
** 可以在调用xrc_int之后,调用xrc_reg注册一个函数供脚本使用
*/
/*读取脚本文件*/
if((fp = fopen( "../testsource.txt", "rb")) == NULL)return -1;
fseek( fp, 0, SEEK_END );
len = ftell( fp );
source = (char *)malloc( len+1 );
fseek( fp, 0, SEEK_SET );
if( fread( source, 1, len, fp ) != len ){
fclose( fp );
return 0;
}
source[len] = 0;
fclose( fp );
/*初始化xrc空间*/
xrc_init( xbuf );
/*注册reg_func函数为reg_test函数,在脚本中可以调用reg_test函数*/
xrc_reg( xbuf, "reg_test", reg_func );
/*解析脚本*/
ret = xrc_par( xbuf, source );
if( ret != 0 ){
printf( "par error: %s\n", xbuf );
return 0;
}
/*多次执行脚本中的main函数*/
for( i=0; i<10; i++ ){
ret = xrc_exe( xbuf, "main" );
if( ret != 0 ){
printf( "exe error: %s\n", xbuf );
return 0;
}
}
/*释放xrc空间*/
xrc_done( xbuf );
free( source );
/******************************************************************
**变量交互测试,获取脚本中st的值
** 可以通过xrc_value_get函数来获取脚本中的全局变量的值,该函数可以很好
** 的用于配置文件的读取
*/
ret = xrc_value_get( xbuf, "../testsource.txt", "st", &st );
if( ret != 0 ){
printf( "val error: %s\n", xbuf );
return 0;
}
printf( "a = %d\n", st.a );
printf( "b = %c\n", st.b );
printf( "c = %f\n", st.c );
printf( "d = %s\n", st.d );
xrc_value_free( xbuf );
/********************************************************************
** 1. xrc支持多线程安全,执行每个线程中用不同的xbuf, 那么每个线程可以独立的
** 解析执行不同的脚本。
** 2. 不支持形如 char a[] = "asd";
*/
return 0;
}