当前位置: 首页 > 工具软件 > 太极语言 > 使用案例 >

发布太极语言部分解释器

岳亮
2023-12-01

发布太极语言部分解释器
 
 

发布太极语言部分解释器
(太极元年丙戌三月二十九日辰时发布)

我先发布太极语言一部分的解释器,能解释运行一些太极语言程序。
我重点做的是编译部分,但还没最后完成,不过解释器倒好做,现在先发布一部分。

把下面的例子程序保存成tj1.u,tj2.u……文件,
输入
taiji tj1.u
taiji tj2.u
……
就可以运行了。

例1.
int leijiahe(int n)
{
 int i;i=0;
 int j;j=0;
 while(i<=n)
 {
  j=j+i;
  i=i+1;
 }
 return j;
}
show(leijiahe(20));//显示
show(leijiahe(21));

int k;
k=leijiahe(10);
show(k);

例2.
void swap(int *p1;int *p2)
{
 int i;
 i=*p1; 
 *p1=*p2;
 *p2=i; 
}

int a;a=2;
int b;b=3;
swap(&a;&b);
show(a);
show(b);

例3.

type student
{
 char * name; 
 int age;
 int high;
};

student chen;
chen.name="wei";
chen.age=26;
student * pcw;
pcw=&chen;
pcw->high=170;
show(chenwei.name);

……

我将写文章全面的从0开始教太极语言。

我为什么这么早发布这个解释器呢?

看如下的C/C++代码:

int id=tj_compile(str);
tj_setMemberint(id,"x",x);
tj_setMemberint(id,"y",x);
tj_run(id);
int z=tj_getMemberint(id,"z");
tj_compile等函数都是导出函数,我把这些函数都做在了动态链接库中。

能猜出来这是在做什么吗?

比如说str是
"int x;/
int y;/
int z;/
z=x*x+y*y;"

上面的代码我注释一下:
int id=tj_compile(str);
//编译这个字符串
tj_setMemberint(id,"x",x);
tj_setMemberint(id,"y",x);
//设置x与y
tj_run(id);
//运行,
int z=tj_getMemberint(id,"z");
//取得z的值!

这样解释器可以与应用程序相交互!

再看一个:

char * str;
int color;
int bkcolor;

int RGB(int red;int green;int blue)
{
 int c;
 c=red+green*256+blue*256*256;
 return c;
}

color=RGB(0;0;0);

bkcolor=RGB(255;255;255);

if(dllcall("kernel32.dll";"lstrcmp";str;"while")==0)
{
 color=RGB(0;0;255);
 bkcolor=RGB(208;12;243);
}
elseif(str[0]=='i')
{
 color=RGB(255;255;255);
 bkcolor=RGB(208;12;243);
}
elseif('0'<=str[0]&&str[0]<='9')
{
 color=RGB(255;0;0);
 bkcolor=RGB(255;255;255);
}

“太极宝鉴”是未来太极语言的开发环境。这是太极宝鉴配置文件(conf.txt),修改这个文件就可以自由设置显示颜色!这里把while设置成紫底蓝字,所有以i开头的词为紫底白字,数字为白底红字。现在你可以打开太极宝鉴试一下,看到了吧,你可以自己试着修改一下这个文件。以前我做过一个可以自由设置颜色的程序,但这次这个程序的设置自由到了这种程度!

你可以想想在太极宝鉴程序中的运行情况了——
 这是一段C++代码:
 ……
 int id=tj_compile(strfile);
 tj_setMemberstr(id,"str",str1);//str1是要显示的
 tj_run(id);
 color=tj_getMemberint(id,"color");
 bkcolor=tj_getMemberint(id,"bkcolor"); 
 show(hdc,x,y,str,len,color,bkcolor);
 ……

太极宝鉴配置文件程序中的str为什么没初试化就被使用了呢?在tj_run前不是有一句tj_setMemberstr吗,这就是给str赋初值,tj_compile是编译并初始化全局名字空间。太极语言解释器实现了完全的与应用程序的沟通。太极宝鉴通过太极语言解释器可以完全自由的配置。这个用途是非常广泛的。比如离线浏览器或批量下载软件,把判断某个URL是要下载的格式的方法完全提供给使用者

 int id=tj_compile(UserConfigFile);
 tj_setMemberstr(id,"str",CurrentUrl);
 tj_run(id);
 match=tj_getMemberint(id,"match");
 if(match)
  Download(CurrentUrl);

UserConfigFile是使用者自己的配置文件内容,灵活的用太极语言判断是否要下载。你可以用类C/C++的那种方式来判断URL。

再给大家看一个例子:
type FILETIME
{
 int a1;
 int a2;
};
type WIN32_FIND_DATA
{
    int dwFileAttributes;   
 FILETIME ftCreationTime;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    int nFileSizeHigh;
    int nFileSizeLow;
    int dwReserved0;
    int dwReserved1;
    char   [260]cFileName;
    char   [14]cAlternateFileName;
} ;
WIN32_FIND_DATA wfd;
int hl;
hl=dllcall("Kernel32.dll";"FindFirstFileA";"*.*";&wfd);
show(wfd.cFileName);
while(dllcall("Kernel32.dll";"FindNextFileA";hl;&wfd)!=0)

 show(wfd.cFileName);
 show("/n");
}
运行后显示当前目录下所有文件。


太极宝鉴支持宏操作,你现在按F1,再按几下键盘,然后按F2,发生什么事情了?
F1是开始记录宏,F2是播放宏,再按F1就停止记录。
现在可以想想是怎么运行的了。

刚才的宏是被保存在“太极宝鉴.exe”所在目录下的"input.txt"文件中,打开看:
int id;
dllcall("太极宝鉴.dll";"input";id;97);
dllcall("太极宝鉴.dll";"input";id;97);
dllcall("太极宝鉴.dll";"input";id;113);
……

你把这个文件改成
int id;
int i;i=97;
while(i<97+26)
{
 dllcall("太极宝鉴.dll";"input";id;i);
 i=i+1;
}
再按F2,看到什么了?从a到z的26个字母。


dllcall是调用dll中的函数。
刚才有句代码:
if(dllcall("kernel32.dll";"lstrcmp";str;"while")==0)……
这是在调用kernel32.dll中的函数lstrcmp。


看dllcall("太极宝鉴.dll";"input";id;113):
input是太极宝鉴.dll中的一个函数。
太极宝鉴.exe--->taijidllr.dll--->太极宝鉴.dll--->太极宝鉴.exe
数据就在这些模块中互相传递,而且有taijidllr.dll解释太极语言代码。

用这种方式,任何软件都可以迅速建立宏机制!所需要考虑的仅仅是生成宏代码。
然后调用太极语言解释运行,宏中用dll调用反过来控制程序自身。

看下面的代码
#include
extern "C"
{
int  __declspec(dllimport) __stdcall tj_compile(char * str);
int  __declspec(dllimport) __stdcall tj_run(int id);
int  __declspec(dllimport) __stdcall tj_setMemberint(int id,char * name,int n);
int  __declspec(dllimport) __stdcall tj_setMemberstr(int id,char * name,char * str);
int  __declspec(dllimport) __stdcall tj_getMemberint(int id,char * name);
char *  __declspec(dllimport) __stdcall tj_getMemberstr(int id,char * name);
int  __declspec(dllimport) __stdcall tj_runstr(int id,char * str);
}
#pragma comment(lib, "taijidllr.lib")
main()
{
 char * str=
  "int x;"
  "int y;"
  "y=x*x;";

 int id=tj_compile(str);
 tj_setMemberint(id,"x",3);
 tj_run(id);
 int y=tj_getMemberint(id,"y");
 printf("y=%d",y);
}

现在能想到怎么实现宏机制吗?还有,能想到声明中最后一个函数是干什么用的吗?

下面的代码是太极宝鉴中的。
记录按键时:
if(remember)
{
 char * str=new char[200];
 sprintf(str,"dllcall(/"太极宝鉴.dll/";/"input/";id;%d);/r/n",key);
 file_addline("input.txt",str);
};
(生成宏程序)

播放按键时:
int id=tj_compile(str); 
tj_setMemberint(id,"id",(int)this);
tj_run(id);
(编译并运行宏程序,this指向当前窗口类实例)

run时会遇到这样的代码:
dllcall("太极宝鉴.dll";"input";id;97);
调用太极宝鉴.dll中的input函数。
太极宝鉴.dll中input函数的 C++源代码如下:
extern "C" int __declspec(dllexport) __stdcall input(int id,char key)
{
 wintj * ptj=(wintj * )id;//当前窗口类实例
 ptj->input(key);
 return 1;
}


用这种方式,任何软件都可以迅速建立宏机制!而且宏是用的太极语言!基本与C/C++是兼容的,语法与C/C++很多是一样的,描述非常自由。你的C/C++库都可以拿来用上做为宏的函数库类库!我觉的这可比微软的VBA强多了吧?如果将来微软的Visual Studio , MS OFFICE 等都用太极语言来做宏机制……哈,那太好了!

我的 csdn blog:
http://blog.csdn.net/universee

目前太极语言解释器还未经过严格测试,如果你发现了问题,可以去我的blog上回复告诉我。

       2006.4.22夜

 

下载地址:http://taiji9.getbbs.com/
http://free3.getbbs.com/Post/Topic.aspx?BID=16994&TID=30240

 类似资料: