有人知道用C#编写的简单C解释器吗?

10

大约13年前,我需要一种在Borland C++中编写应用程序的脚本方式。我找到了一个C解释器并将其嵌入到我的应用程序中。这一直很好地工作着,我有相当多的脚本。

现在我需要重新设计这个应用程序,并使用C#来实现。有人知道是否有适用于C#的C解释器吗?我有原始解释器的源代码,但我只是想节省一些时间。

编辑 这是从脚本中提取的一部分:

main()
{
   LwSet( "STUFE", "00.00" );
   LwSet( "STATUS", "Warten", "AUS" );
   do
   {
      LwSet( "DEBUG", "OFF" );
      LwSet( "FUNKTION", "Warten auf Start" );
      do
      {
         rc = LwGet( "Event" );
         if( rc == "QUIT" ) {
            ...

LwSet/LwGet调用的是我向解释器注册的函数,这是我的应用程序的特性。

编辑2

在任何人觉得需要告诉我应该使用哪种其他语言之前,请看看下面来自我的评论:

当时,考虑到可用的技能,这不是一个令人烦恼的选择。现在,13年后,很多事情看起来完全不同!我只是希望能够使用一堆准-C脚本,而不必以某种方式将它们全部转换。


1
使用C作为应用程序的脚本语言听起来有点烦人。你不能直接使用C#吗?或者Lua呢? - unwind
3
也许他有很多"遗留代码"需要支持(大量已经编写/在他/她的应用程序上运行的C脚本)。 - Pablo Santa Cruz
2
@unwind 当时考虑到可用技能,这并不是一个令人烦恼的选择。现在,13年过去了,很多事情看起来完全不同了!我只是被一堆准C脚本所困扰,我希望能够在不必转换它们的情况下使用它们。 - paul
2
为什么不要使用旧的解释器来进行Interop? - zabulus
1
我真的怀疑你所拥有的是否是C解释器。它更像是“类C”的东西。因此,由于您所有的遗留代码,您别无选择,只能通过互操作或手动将其移植到C#来使用完全相同的解释器。没有其他C解释器能够取代它。 - SK-logic
显示剩余4条评论
4个回答

5
如何通过互操作性从C#使用现有的C解释器?

3
优秀的ANTLR解析器生成器支持C#。其示例包括一个用于C#的C语言文法。这显然不是一个完整的解释器,但该文法、词法分析器和解析器将成为一个很好的起点。

2

2
-1;抱歉,问题非常明确 - 需要一个C解释器。 - Kieren Johnstone
1
+1,这是一个有效的答案。如果SO用户不应该提出更好的方法,则将问题标记为“过于局限”。 - Hans Passant
2
我同意Kieren的观点。问题明确表明他不想转换脚本。 - Jonas Van der Aa
我同意这个问题非常具体,但如果他找不到答案,我们至少要给他一个选择吧。我只是想帮忙。 - Alex Mendez
1
SO应该迎合一个SO用户的需求的想法是愚蠢的。这个问题将被谷歌链接多年,供其他寻找脚本解决方案的程序员使用。如果他们看不到更好的建议,那么SO对他们来说就没有用处。 - Hans Passant
显示剩余5条评论

2

我认为你不能轻易地将其嵌入C#应用程序中。 - Jonas Van der Aa
在C#中与C进行接口编程并不困难,对吧?如果接口编程很容易,那我就看不出有什么问题了。至少我认为值得一试... - Friedrich
据我所知,目前只有COM互操作性,但我怀疑他们的解决方案是否与COM兼容。 - Jonas Van der Aa
请参阅http://www.softintegration.com/support/faq/embed.html。这似乎不过是在传递一个不透明指针,而且这通常没有问题。我以前用C#和C共享库做过这样的事情。因此,这似乎是一种非常可行的获取C/C++解释器的方法。当然,你的情况可能会有所不同... - Friedrich
我认为这是很多工作,但他可能没有选择。 - Jonas Van der Aa
我不这么认为,只需看第一个例子。您将其编译为DLL并在此函数上使用Pinvoke服务。您只需交出文件或字符串,让它执行调用解释器的主要功能即可。但也许另一个链接更有用?只需通过System调用tcc并通过“let”解释文件中的任何内容即可。 - Friedrich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接