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



我正在为游戏Bitfighter编写一个新的和扩展的Lua API文档(http://bitfighter.org)。我们的Lua对象模型是C++对象模型的一个子集,而我需要文档化的暴露于Lua的方法是C++中可用方法的子集。我只想记录与Lua相关的项目,而忽略其他项目。

例如,对象BfObject是所有Lua对象的根,但它本身位于C++对象树的中间。BfObject有大约40个C++方法,其中大约有10个与Lua脚本相关。我希望我们的文档显示BfObject作为根对象,并且只显示这10个相关的方法。我们还需要以明确方法继承的方式显示其子对象。

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

一种想法是以某种方式标记我们想要记录的对象,这样像doxygen这样的系统就会知道该看什么,而忽略其余的。另一种想法则是对C++代码进行预处理,删除所有不相关的位,并记录像doxygan这样的系统剩下的内容。(实际上,我使用luadoc的这种方法已经走得很远了,但找不到让luadoc显示对象层次结构的方法。)

有一件事可能会被证明是有用的,那就是每个Lua对象类都以一致的方式与其父类一起注册。

现在有越来越多的游戏使用Lua进行脚本编写,其中许多都有不错的文档。有人对如何制作它有什么好的建议吗?


PS澄清一下,我很乐意使用任何能完成这项工作的工具——doxygen和luadoc只是我有些熟悉的例子。

我找到了一个解决方案,虽然不理想,但效果很好。我拼凑了一个Perl脚本,它撕毁了所有的Bitfighter源代码,并生成了第二组"伪"源代码,其中只包含我想要的元素。然后我可以通过Doxygen运行这个第二个源,得到的结果是我想要的95%。

我宣布胜利。

这种方法的一个优点是,我可以以"自然"的方式记录代码,而不需要担心标记哪些内容在里面,哪些内容在外面。这个脚本足够聪明,可以从代码结构中找到它。

如果有人感兴趣,可以在Bitfighter源文件中找到Perl脚本,网址为https://code.google.com/p/bitfighter/source/browse/luadoc.pl.它只完成了大约80%,并且缺少了一些非常重要的项目(例如正确显示函数args),但结构是存在的,我很满意这个过程会起作用。剧本会随着时间的推移而改进。

该过程的(非常初步的)结果可以在http://bitfighter.org/luadocs/index.html.模板几乎没有被修改,所以它看起来很"普通",但它表明事情或多或少是可行的。

由于一些评论者认为使用Doxygen不可能生成好的文档,我应该注意到,我们的内联文档几乎还没有添加。要了解它们的外观,请参阅Teleporter课程。它不是很好,但我认为它确实驳斥了Doxygen总是产生无用文档的说法。

在这一点上,我的主要遗憾是,我的解决方案实际上是一次性的,没有解决我认为社区日益增长的需求。也许在某个时候,我们会对合并C++和Lua的方法进行标准化,创建通用文档工具的任务将更易于管理。

PS你可以看到原始源文件中的标记是什么样子的。。。看见https://code.google.com/p/bitfighter/source/browse/zap/teleporter.cpp,并搜索@luacalass

按命名空间(也可以是class)排除C++代码,但不包括lua代码

EXCLUDE_SYMBOLS = myhier_cpp::*

在doxygen配置文件或cherry中选择要使用排除的内容

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

在您的c++代码中。

我个人认为按名称空间分离更好,因为它反映了代码+文档中的分离,这导致了一种基于名称空间的方案,用于将纯c++与lua绑定分离。

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

另一个解决方案是使用LDoc。它还允许您编写C++注释,这些注释将由LDoc解析并包含在文档中。

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

我自己为c++做了一些小的调整。看看这里。