Re: VLOmniCpp - vim 的新的基于 ctags 的 c/cpp 全能补全插件
发表于 : 2011-05-26 22:40
javacomplete.vim 还行吧。acer4740 写了: java呢
javacomplete.vim 还行吧。acer4740 写了: java呢
codeblocks的parser有点乱,我目前在整一个新的,你可以看这里:fanhe 写了:最近一个星期一直在搞模版的事, 现在算是基本完成了, 在处理名空间的事asmwarrior 写了:嘿嘿,非常值得我学习,我目前立志于改进/重写 codeblocks的代码完成模块。
最大的感想就是, 实在没办法做到100%精确, 只能处理风格良好的代码
如果想办法做到100%准确, 开销相当大, 对于脚本来说不可接受
你可以试一下下面这个不是很复杂的模版测试, 如果复杂的情况, 如基类加了一堆作用域, 或者基类定义在打开的某个命名空间中等等
[cpp]
class A {
public:
int a;
};
class AA {
public:
int aa;
};
template<typename T>
class A2 {
public:
int a2;
T ta2;
};
int g_b;
template<typename T>
class B {
public:
int b;
T tb;
class BB {
int bb;
void BBFunc()
{
}
};
};
template<typename T1, typename T2>
class B2 : public A2<T2> {
public:
int b2;
T1 tb21;
T2 tb22;
AA aaaa;
A2<T1> b2a2t1;
A2<A> b2a2t2;
T1 B2Get();
//T2<T1> bt2t1;
};
template<typename T = A>
class C : public B<T>, public B2<T, A> {
public:
int c;
T tc;
T Get() { return B2<T, A>::tb21; }
};
int main(int argc, char *argv[])
{
C<AA> c;
c.tc; // test1
c.tb; // test2
c.ta2; // test3
c.tb21; // test4
c.tb22; // test5
c.tb; // test6
c.b; // test7 -> failed
c.Get(); // test8
c.b2a2t1.ta2; // test9
c.b2a2t2.ta2; // test10
return 0;
}
[/cpp]
最后, 我对codeblocks的parser有点兴趣, 不知道能不能提取出来, 我可以把ctags换成cb的parser, 只要符号能存进去我的数据库就行了
上次提到的对于stl的模版支持问题, 我看了下stl的头文件, 发现, 真的不是这么好处理的...
估计codelite作者作了硬替换
ctags 也是没有lexer, 都是直接流处理, 现在用的 ctags 都是codelite作者打过patch的, 但是也有很多不足, 不能解析不少c++的东西asmwarrior 写了:codeblocks的parser有点乱,我目前在整一个新的,你可以看这里:fanhe 写了:最近一个星期一直在搞模版的事, 现在算是基本完成了, 在处理名空间的事asmwarrior 写了:嘿嘿,非常值得我学习,我目前立志于改进/重写 codeblocks的代码完成模块。
最大的感想就是, 实在没办法做到100%精确, 只能处理风格良好的代码
如果想办法做到100%准确, 开销相当大, 对于脚本来说不可接受
你可以试一下下面这个不是很复杂的模版测试, 如果复杂的情况, 如基类加了一堆作用域, 或者基类定义在打开的某个命名空间中等等
[cpp]
class A {
public:
int a;
};
class AA {
public:
int aa;
};
template<typename T>
class A2 {
public:
int a2;
T ta2;
};
int g_b;
template<typename T>
class B {
public:
int b;
T tb;
class BB {
int bb;
void BBFunc()
{
}
};
};
template<typename T1, typename T2>
class B2 : public A2<T2> {
public:
int b2;
T1 tb21;
T2 tb22;
AA aaaa;
A2<T1> b2a2t1;
A2<A> b2a2t2;
T1 B2Get();
//T2<T1> bt2t1;
};
template<typename T = A>
class C : public B<T>, public B2<T, A> {
public:
int c;
T tc;
T Get() { return B2<T, A>::tb21; }
};
int main(int argc, char *argv[])
{
C<AA> c;
c.tc; // test1
c.tb; // test2
c.ta2; // test3
c.tb21; // test4
c.tb22; // test5
c.tb; // test6
c.b; // test7 -> failed
c.Get(); // test8
c.b2a2t1.ta2; // test9
c.b2a2t2.ta2; // test10
return 0;
}
[/cpp]
最后, 我对codeblocks的parser有点兴趣, 不知道能不能提取出来, 我可以把ctags换成cb的parser, 只要符号能存进去我的数据库就行了
上次提到的对于stl的模版支持问题, 我看了下stl的头文件, 发现, 真的不是这么好处理的...
估计codelite作者作了硬替换
http://code.google.com/p/quexparser/
但是距离完全能用还有很大的距离。
codeblocks的parser里面当前设计一个很不好的地方是没有使用一个lexer,什么东西从lexer返回都是用string类型的,我觉得非常糟糕。我的这个quexparser采用了集成的quex lexer。内部逻辑基本和codeblocks的parser类似。
另外,ctags的源代码我也看过,感觉很乱。。。。
codeblocks的parser和我目前尝试写的quexparser都是采用所谓的recursive parser的函数递归调用结构,还是比较清楚的,你只要把保存tags的内容变成你自己的保存sqlite的就可以了。
另外,stl的头文件里面很多宏,肯定需要进行硬替换,否则这些stl的头文件都没有办法分析。(当然我们无法写一个完善的preprocessor是一个重要原因)
基于ctags的自动完成基本完工了, 只是暂时纠结与头文件嵌套包含处理问题.asmwarrior 写了:codelite最近开启了clang的代码完成支持,最为常规 基于ctags/bison parser代码完成支持失败后的补充。
见:
http://codelite.svn.sourceforge.net/vie ... w=revision
貌似很不错!