将注释语法添加到C ++源代码中

时间:2010-12-16 06:27:53

标签: c++ compiler-construction annotations

我想在我的C ++源代码中创建自己的自定义注释(就像Java样式注释一样)。由于标准C ++语法不允许注释,我想根据自己的需要修改/增强编译器。

但Visual Studio是否公开了其编译器内部供用户修改(例如其词法分析器的输出,抽象语法树等)?如果没有,是否有任何第三方工具用于解析c ++语法并允许我根据自己的注释发出自己的自定义c ++源代码?

2 个答案:

答案 0 :(得分:9)

  

Visual Studio是否公开其编译器内部供用户修改(例如,其词法分析器的输出,抽象语法树等)?

没有

  

是否有任何第三方工具可用于解析C ++语法并允许我根据自己的注释发出自己的自定义C ++源代码?

Clang

答案 1 :(得分:6)

像这样的问题的标准解决方案,如果它面向的是非C ++的编程语言,就是编写一个自定义预处理器,它可以理解有问题的语言的某些子集和注释,重写删除了注释的代码,然后将其传递给实际的语言编译器。

这是扩展语言的标准方法:在编译器之前添加预处理步骤。

不幸的是,只是解析功能完整的C ++几乎是不可能的;处理C ++源代码几乎总是最终创建一个完整的AST生成器,因为它有一些分析语言功能的繁琐。

看看这些声明:

template<bool b, class T> void foo(T &t){if(b) T.do_this(); else T.do_that();}
class foobar { public: virtual void do_this(); virtual void do_that(); };
class barfoo : public foobar { public: virtual void do_this(); virtual void do_that(); };

现在这个功能

void bar(float l){ barfoo t; foo<fsqrt(l) > 1, foobar>(t); }

这里的问题是,对于模板和模板参数的比较,括号具有双重含义。决定每个括号所属的唯一方法需要一个完整的语法树。

我只知道你所描述的一个这样的工具:Qt工具包的MOC,做你的建议:用关键字 signal slot 注释的C ++代码。 Qt是开源的,因此查看MOC的来源可能是个好主意。

编写和阅读C ++确实很难。