我应该如何记录用C ++代码编写的Lua API /对象模型?

我正在努力为 Bitfighter 游戏(http://bitfighter.org)编写一份新的、扩展的 Lua API 文档。我们的 Lua 对象模型是 C++ 对象模型的一个子集,而我要记录的那些暴露给 Lua 的方法是 C++ 中可用方法的一个子集。我想只记录与 Lua 相关的内容,而忽略其余部分。

例如,对象 BfObject 是所有 Lua 对象的根对象,但它本身处于 C++ 对象树的中间位置。BfObject 有大约 40 个 C++ 方法,其中约有 10 个与 Lua 脚本有关。我希望我们的文档将 BfObject 显示为根对象,并仅显示那些与之相关的 10 个方法。我们还需要以一种清晰明了的方式显示其子对象的继承关系。

目前,我们可以假设所有代码都是用 C++ 编写的。

一个想法是以某种方式标记我们想要记录的对象,以使像 Doxygen 这样的系统知道该查看什么内容而忽略其余部分。另一种方法是以预处理 C++ 代码的方式删除所有不相关的部分,然后使用类似 Doxygen 的工具记录剩余部分。(我实际上在使用 luadoc 时已经取得了很大的进展,但无法找到一种可以让 luadoc 显示对象层次结构的方法。)

有一件可能有帮助的事情是每个 Lua 对象类都以一种一致的方式注册,并伴随其父类。

目前有越来越多的游戏使用 Lua 进行脚本编写,并且很多游戏都有不错的文档。有没有人有好的建议,可以帮助我编写出好的文档呢?


顺便说一句,为了澄清,我很乐意使用任何可以完成工作的工具——Doxygen 和 luadoc 只是我比较熟悉的例子。

点赞
用户163231
用户163231

在 doxygen 配置文件中,可以通过 namespace(也可以是类)从你的 C++ 代码中排除,但不排除 lua 代码。

EXCLUDE_SYMBOLS = myhier_cpp::*

或者使用以下方法进行选择性排除:

/// @cond
class aaa {
  ...
  ...
}

/// @endcond

在你的 C++ 代码中。

个人认为通过 namespace 分离更好,因为它反映了代码和文档中的分离,这导致了一个基于 namespace 的纯 C++ 和 lua 绑定分离方案。

通过排除进行分离可能是最具有针对性的方法,但这将涉及到一个额外的工具来解析代码,标记相关的 lua 部分并将排除添加到代码中。(此外,您还可以使用此标记单独呈现特殊的信息,例如图形,并通过 Image 添加到您的文档中,至少使用 Doxygen 容易完成。)由于必须要有一些 lua 代码的指示,因此标记可能不太难推导。

2012-09-12 12:53:41
用户103252
用户103252

我已经找到了一个解决方案,虽然并不完美但很有效。我拼凑了一个Perl脚本,遍历Bitfighter源代码并生成第二套“虚假”源代码,其中仅包含我想要的元素。然后我可以通过Doxygen运行这个二级源代码并获得95%的我想要的结果。

我宣布获得了胜利。

这种方法的一个优点是我可以自然地文档化代码,无需担心标记哪些在内部和外部。该脚本足够聪明,可以从代码结构中找出答案。

如果有人感兴趣,Perl脚本可在Bitfighter源存档中找到https://code.google.com/p/bitfighter/source/browse/luadoc.pl 。它只完成了80%,缺少一些非常重要的内容(如正确显示函数参数),但结构已存在,并且我满意该过程将顺利进行。该脚本将随着时间的推移而改进。

(非常初步的)过程结果可在http://bitfighter.org/luadocs/index.html 查看。模板几乎没有修改,因此看起来非常“基本”,但它表明事情或多或少起作用。

由于一些评论者认为使用Doxygen生成好的文档是不可能的,因此我应该指出,几乎没有添加任何内联文档。要了解它们看起来像什么,请参见Teleporter类。它不是很好,但我认为它可以反驳Doxygen总是产生无用文档的观点。

现在我最大的遗憾是我的解决方案实际上只是一次性的,并且没有解决我认为社区中日益增长的需求。也许在某个时候,我们将以一种合并C ++和Lua的方式为标准,并且创建通用文档工具的任务将更加可行。

PS您可以看到原始源文件中的标记呈现方式...请参见https://code.google.com/p/bitfighter/source/browse/zap/teleporter.cpp,并搜索@luaclass

2012-09-13 13:41:00
用户7520239
用户7520239

另一个解决方案是使用[LDoc](https://github.com/stevedonovan/LDoc)。它还允许您编写C ++注释,这些注释将由LDoc解析并包含在文档中。

优点是您可以使用相同的工具来记录您的lua代码。缺点是该项目似乎未得到维护。像提问者提到的那样,可能无法记录复杂的对象层次结构。

我为一些与C ++有关的小调整分叉了它。请看[这里](https://github.com/flyingdutchman23/LDoc)。

2018-03-28 08:04:48