如何在不编写完整解析器的情况下将源程序的一部分转换为库调用?

时间:2015-06-15 16:30:50

标签: c parsing translation

举个例子:

假设我有一个非常简单的库,允许从另一种语言L中调用C代码。

为了使用来自L的C代码,你需要更改C代码中的某些结构,例如将函数类型更改为void,用单个库类型替换函数参数等。所以你的C代码可能会改变这样的东西:

double foo(double bar, double baz) {
  return bar + baz;
}

这样的事情:

void foo(LibraryArgs args) {
  double bar = args.get(1);
  double baz = args.get(2);
  setReturn(baz + bar);
}

现在可以从L调用你的函数。

我试图编写一个程序,当它看到一个标有某种注释的函数时自动执行这种转换,可能是这样的:

@MakeCallableFromL
double foo(double bar, double baz) {
  return bar + baz;
}

但我似乎找不到为C编写近乎完整的解析器的解决方案。是否有更简单的方法来解决这类问题?

1 个答案:

答案 0 :(得分:2)

那里有很多解析包装器生成器,这些SWIG中最主要的(这是很棒的,同时又很糟糕)。

如果您不能使用SWIG或现有解析器之类的东西:

我完全避免更改原始代码 - 无论如何,C函数必须在外部可见,因此只需获取完成的共享对象,并从中提取符号就更容易了,并从头开始生成包装器代码。

根据您的框架,有不同的选项可以做到这一点。对于gccnm将是首选工具,或objdump -tobjdump -T

因为你要求开销:它可以忽略不计;编译器会自动优化大部分可能发生的不必要的事情。