CINT 是一个使用 C/C++ 语法的解释器,

21 篇文章 0 订阅
2 篇文章 0 订阅

       CINT 是一个使用 C/C++ 语法的解释器,CINT 兼容 95% 的 ANSI C 代码和85% 的 ANSI C++ 代码。这基本上意味着如果你的代码没有使用太过于专业的 C/C++ 语法,CINT 都能够正确的解析,诸如类、虚函数、运算符重载、继承、指针、数组等等。CINT 甚至支持模板。CINT 所不支持的 C/C++ 语言特性已被列在 Limitions。

一、构成

CINT 已被移植到多种平台下,当前的最新版本是 5.18.00,在 Windows 平台下,CINT 由以下四部分组成:

解释器 cint.exe

    它接受扩展名为 .c、.cpp、.cxx 等 C/C++ 的源代码,并将其解释执行。

库文件 libcint.dll

    它提供了 cint 的运行时环境。

lib 编译器makecint.exe

    它将指定的 C/C++ 库编译为可由 CINT使用扩展库,虽然 CINT 本身不进行编译,但它为使用C/C++编译器创建了一个 makefile。

系统库 /include

    提供诸如 stdio.h、iostream.h、time.h 等标准的 C/C++ 库的头文件。

二、安装

首先到 CINT 网站上下载一个最新的安装包,安装包通常分为两种,一种是已经编译好的二进制文件,一种是未经过编译的源代码,我的建议是这两个包都进行下载,因为在二进制包中不包括系统库。对于得到的源代码,首先确定所使用的编译器,在安装包目录的 platform 子目录中找到你的编译器,如果没有找到,呵呵。在自己编译器对应的目录中,通常有一个 setup.bat 文件,使用它来设置相关的变量并进行编译。CINT 运行时必须的系统变量为 CINTSYSDIR,它应该被设置为包含上述 CINT 组成的目录,另外,为了使用方便,将 CINTSYSDIR 添加到系统的 PATH 中是个不错的选择。

三、功能

3.1、支持 K&R-C, ANSI-C, ANSI-C++ 

Cint 覆盖了80-90%的K&R-C、ANSI-C和C++语言特性。包括多继承、虚函数重载、操作符重载、默认参数、模板(这个猛)等等。 Cint的目标不是成为100%兼容ANSI/ISOC++语言的处理机,而是一个可移植的足以解析大部分标准C++的脚本环境。

3.2、可处理大规模C/C++源码 

Cint可以处理大规模的C/C++源码,这可不是所有C++解释器都能做到的。Cint可以快速加载入源文件并解析超过6万行的代码。

3.3、可与编译代码混合使用

基于速度和交互的需要,你可以混合使用编译代码和脚本代码。"makecint"工具可以把任何C/C++对象作为预编译库嵌入到脚本中去,预编译库可以 配置成动态链接库。脚本代码和预编译代码可以双向无缝调用。

3.4、动态C++

Cint是动态的。它可以从命令行处理C++声明,动态地定义/删除类和函数的声明、载入/卸载源文件和动态库,以及一个扩展的 RTTI机制,这些足以让你开发出不可思议的C++用法。

3.5、内置的Debugger和Class Browser

Cint有一个内置的debugger,可以用于调试复杂的C++执行流程。基于的文本Class Browser是Debugger功能的一部分

四、源码编译

    4.1、安装MinGW与Msys,并将其添加到环境路径PATH中,如:

MINGW_HOME = C:\MinGW

PATH=$PATH: ;%MINGW_HOME%;%MINGW_HOME%\bin;%MINGW_HOME%\msys\1.0;%MINGW_HOME%\msys\1.0\bin;

    4.2、设定msys的fstab(C:/MinGW/msys/1.0/etc/),在文件末加入如下语句,注意这里使用到了Dos8.3命名规则。可以参考如下语句实现:

char *TMP_SDK = "C:\\Program Files\\MicrosoftSDKs";

     TCHAR strLongPathName[256];

     MultiByteToWideChar(CP_ACP, 0, TMP_SDK, -1, strLongPathName,256); 

     TCHAR szShortPathName[MAX_PATH] = {0};

     GetShortPathNameW(strLongPathName,szShortPathName, MAX_PATH);

fstab:

c:/mingw        /mingw

c:/ActiveState/perl /perl

C:/Workspace/Interpreter/cint-5.18.00 /cint

C:/PROGRA~1/MID05A~1 /msvc8

C:/PROGRA~1/MI2578~1/Windows/v7.0A /psdk

    4.3、配制cint的configure文件

4.3.1、将 C:\cint\configure 函数config_msvc7中的一行

   CFLAGS="-G5 -MD-nologo -wd4996 -GX"

   修改为

   CFLAGS="-G5 -MT-nologo -wd4996 -GX"

4.3.2、将MANGLEPATHS="cygpath-m"注释,在最前面加上#

    4.4、从vs2005的控制台运行vcvarsall.bat设定:

Setting environment for using Microsoft Visual Studio 2005 x86tools.

然后在vs2005的命令窗口输入msys.bat运行msys.

    4.5在msys中设定变量:

export PATH=/msvc8/VC/bin:/msvc8/Common7/IDE:$PATH   

export INCLUDE=/psdk/include:/msvc8/VC/include   

export LIB=/psdk/lib:/msvc8/VC/lib

然后cd 到cint源码路径下,再输入:./configure,最后输入:make –j4就能生成cint的动态库


http://blog.csdn.net/wenrenhua08/article/details/40047835

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gSOAP编译工具提供了一个SOAP/XML 关于C/C++ 语言的实现,从而让C/C++语言开发web服务或客户端程序的工作变得轻松了很多。绝大多数的C++web服务工具包提供一组API函数类库来处理特定的SOAP数据结构,这样就使得用户必须改变程序结构来适应相关的类库。与之相反,gSOAP利用编译器技术提供了一组透明化的SOAP API,并将与开发无关的SOAP实现细节相关的内容对用户隐藏起来。   gSOAP的编译器能够自动的将用户定义的本地化的C或C++数据类型转变为符合XML语法的数据结构,反之亦然。这样,只用一组简单的API就将用户从SOAP细节实现工作中解脱了出来,可以专注与应用程序逻辑的实现工作了。gSOAP编译器可以集成C/C++和Fortran代码(通过一个Fortran到C的接口),嵌入式系统,其他SOAP程序提供的实时软件的资源和信息;可以跨越多个操作系统,语言环境以及在防火墙后的不同组织。   gSOAP使编写web服务的工作最小化了。gSOAP编译器生成SOAP的代码来序列化或反序列化C/C++的数据结构。gSOAP包含一个WSDL生成器,用它   来为你的web服务生成web服务的解释。gSOAP的解释器及导入器可以使用户不需要分析web服务的细节就可以实现一个客户端或服务端程序。   下面是gSOAP的一些特点:   ×gSOAP编译器可以根据用户定义的C和C++数据结构自动生成符合SOAP的实例化代码。   ×gSOAP支持WSDL 1.1, SOAP 1.1, SOAP 1.2, SOAP RPC 编码方式以及 literal/document 方式.   ×gSOAP是少数完全支持SOAP1.1 RPC编码功能的工具包,包括多维数组及动态类型。比如,一个包含一个基类参数的远程方法可以接收客户端   传来的子类实例。子类实例通过动态绑定技术来保持一致性。   ×gSOAP 支持 MIME (SwA) 和 DIME 附件包。   ×gSOAP是唯一支持DIME附件传输的工具包。它允许你在保证XML可用性的同时能够以最快的方式(流方式)传递近乎无大小限制的二进制数据   。   ×gSOAP 支持 SOAP-over-UDP。   ×gSOAP 支持 IPv4 and IPv6.   ×gSOAP 支持 Zlib deflate and gzip compression(for HTTP, TCP/IP, and XML file storage)。   ×gSOAP 支持 SSL (HTTPS)。   ×gSOAP 支持 HTTP/1.0, HTTP/1.1 保持连接, 分块传输及基本验证。   ×gSOAP 支持 SOAP 单向消息。   ×gSOAP 包含一个 WSDL 生成器,便于web服务的发布。   ×gSOAP 包含一个WSDL解析器(将WSDL转换为gSOAP头文件),可以自动化用户客户端及服务端的开发。   ×生成可以单独运行的web服务及客户端程序。   ×因为只需要很少内存空间,所以可以运行在类似Palm OS, Symbian, Pocket PC的小型设备中。   ×适用于以C或C++开发的web服务中。   ×跨平台:Windows, Unix, Linux, Mac OS X, Pocket PC, Palm OS, Symbian等。   ×支持序列化程序中的本地化C/C++数据结构。   ×可以使用输入和输出缓冲区来提高效率,但是不用完全消息缓冲来确定HTTP消息的长度。取而代之的是一个三相序列化方法。这样,像64位   编码的图像就可以在小内存设备(如PDA)中以DIME附件或其他方式传输。   ×支持C++单继承,动态绑定,重载,指针结构(列表、树、图、循环图,定长数组,动态数组,枚举,64位2进制编码及16进制编码)。   ×不需要重写现有的C/C++应用。但是,不能用unions,指针和空指针来作为远程方法调用参数的数据结构中元素。   ×三相编组:1)分析指针,引用,循环数据结构;2)确定HTTP消息长度;3)将数据序列化位SOAP1.1编码方式或用户定义的数据编码方式。   ×双相编组:1)SOAP解释及编码;2)分解“forward”指针(例如:分解SOAP中的href属性)。   ×完整可定制的SOAP错误处理机制。   ×可定制的SOAP消息头处理机制,可以用来保持状态信息   2 gSoap2.2版与gSOAP 2.1版(或以前版本)的不同   如果你是从2.1版升级到2.2或以后版本,请注意这些变化。   为了能够分离传输、内容编码、映射中的接收/发送设置,改变了运行时选项及标志。这些标志分布再四个类中:传输(IO),内容编码(ENC   
好的,我理解您的问题了。下面是一个简单的用C++编写的函数绘画解释器,它使用了lex和yacc来解析绘画命令: 1. 创建文件draw.l,定义绘图命令的词法规则: ``` %{ #include "y.tab.h" %} %% line { return LINE; } circle { return CIRCLE; } rect { return RECT; } [0-9]+ { yylval.num = atoi(yytext); return NUMBER; } [ \t\n] { /* ignore whitespace */ } . { printf("Invalid input: %s\n", yytext); } %% int yywrap() { return 1; } ``` 2. 创建文件draw.y,定义绘图命令的语法规则: ``` %{ #include <iostream> #include <vector> #include <cmath> using namespace std; struct Point { int x; int y; }; enum Shape { LINE, CIRCLE, RECT }; struct Command { Shape shape; Point p1; Point p2; int radius; }; vector<Command> commands; %} %token LINE CIRCLE RECT NUMBER %left '+''-' %left '*''/' %% commands: /* empty */ | commands command ; command: LINE '(' NUMBER ',' NUMBER ')' '(' NUMBER ',' NUMBER ')' { Command cmd; cmd.shape = LINE; cmd.p1.x = $2; cmd.p1.y = $4; cmd.p2.x = $6; cmd.p2.y = $8; commands.push_back(cmd); } | CIRCLE '(' NUMBER ',' NUMBER ',' NUMBER ')' { Command cmd; cmd.shape = CIRCLE; cmd.p1.x = $2; cmd.p1.y = $4; cmd.radius = $6; commands.push_back(cmd); } | RECT '(' NUMBER ',' NUMBER ')' '(' NUMBER ',' NUMBER ')' { Command cmd; cmd.shape = RECT; cmd.p1.x = $2; cmd.p1.y = $4; cmd.p2.x = $6; cmd.p2.y = $8; commands.push_back(cmd); } ; %% int main() { yyparse(); // 绘图代码 for (int i = 0; i < commands.size(); i++) { Command cmd = commands[i]; switch (cmd.shape) { case LINE: // 绘制直线 break; case CIRCLE: // 绘制圆形 break; case RECT: // 绘制矩形 break; default: break; } } return 0; } int yyerror(const char *msg) { cout << msg << endl; return 0; } ``` 3. 运行以下命令,生成词法分析器和语法分析器: ``` flex draw.l yacc -d draw.y ``` 4. 编译并运行程序: ``` g++ -o draw lex.yy.c y.tab.c -lm ./draw ``` 5. 在程序中输入以下命令,将绘制一个红色正方形: ``` rect(100, 100)(300, 300) ``` 希望这个示例可以帮助您了解如何使用lex和yacc来实现函数绘画解释器。注意,在这个示例中只是将解析出的命令存储在了一个vector中,您需要将其转换为相应的绘图指令,具体实现可以使用OpenGL或其他绘图库。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值