想写一个IDE 可是不知道如何分析头文件里定义的变量和函数
想写一个IDE 可是不知道怎么分析头文件里定义的变量和函数 求助
最近想写一个IDE。。。。。假如用户#include一个头文件 我怎么分析出里面定义的函数和变量方便智能提示和高亮啊。。。。万一这个头文件错误怎么办。。。能不能借助编译器来完成这些工作啊。。。唉 头大死。。。。求解啊。。。。
------解决方案--------------------
去了解一下clang,可以直接生成程序的语法树,下面是clang文档里的例子:
http://clang.llvm.org/docs/IntroductionToTheClangAST.html
$ cat test.cc
int f(int x) {
int result = (x / 42);
return result;
}
# Clang by default is a frontend for many tools; -Xclang is used to pass
# options directly to the C++ frontend.
$ clang -Xclang -ast-dump -fsyntax-only test.cc
TranslationUnitDecl 0x5aea0d0 <<invalid sloc>>
... cutting out internal declarations of clang ...
`-FunctionDecl 0x5aeab50 <test.cc:1:1, line:4:1> f 'int (int)'
------解决方案--------------------
-ParmVarDecl 0x5aeaa90 <line:1:7, col:11> x 'int'
`-CompoundStmt 0x5aead88 <col:14, line:4:1>
------解决方案--------------------
-DeclStmt 0x5aead10 <line:2:3, col:24>
------解决方案--------------------
`-VarDecl 0x5aeac10 <col:3, col:23> result 'int'
------解决方案--------------------
`-ParenExpr 0x5aeacf0 <col:16, col:23> 'int'
------解决方案--------------------
`-BinaryOperator 0x5aeacc8 <col:17, col:21> 'int' '/'
------解决方案--------------------
------解决方案--------------------
-ImplicitCastExpr 0x5aeacb0 <col:17> 'int' <LValueToRValue>
------解决方案--------------------
------解决方案--------------------
`-DeclRefExpr 0x5aeac68 <col:17> 'int' lvalue ParmVar 0x5aeaa90 'x' 'int'
------解决方案--------------------
`-IntegerLiteral 0x5aeac90 <col:21> 'int' 42
`-ReturnStmt 0x5aead68 <line:3:3, col:10>
`-ImplicitCastExpr 0x5aead50 <col:10> 'int' <LValueToRValue>
`-DeclRefExpr 0x5aead28 <col:10> 'int' lvalue Var 0x5aeac10 'result' 'int'
最近想写一个IDE。。。。。假如用户#include一个头文件 我怎么分析出里面定义的函数和变量方便智能提示和高亮啊。。。。万一这个头文件错误怎么办。。。能不能借助编译器来完成这些工作啊。。。唉 头大死。。。。求解啊。。。。
------解决方案--------------------
去了解一下clang,可以直接生成程序的语法树,下面是clang文档里的例子:
http://clang.llvm.org/docs/IntroductionToTheClangAST.html
$ cat test.cc
int f(int x) {
int result = (x / 42);
return result;
}
# Clang by default is a frontend for many tools; -Xclang is used to pass
# options directly to the C++ frontend.
$ clang -Xclang -ast-dump -fsyntax-only test.cc
TranslationUnitDecl 0x5aea0d0 <<invalid sloc>>
... cutting out internal declarations of clang ...
`-FunctionDecl 0x5aeab50 <test.cc:1:1, line:4:1> f 'int (int)'
------解决方案--------------------
-ParmVarDecl 0x5aeaa90 <line:1:7, col:11> x 'int'
`-CompoundStmt 0x5aead88 <col:14, line:4:1>
------解决方案--------------------
-DeclStmt 0x5aead10 <line:2:3, col:24>
------解决方案--------------------
`-VarDecl 0x5aeac10 <col:3, col:23> result 'int'
------解决方案--------------------
`-ParenExpr 0x5aeacf0 <col:16, col:23> 'int'
------解决方案--------------------
`-BinaryOperator 0x5aeacc8 <col:17, col:21> 'int' '/'
------解决方案--------------------
------解决方案--------------------
-ImplicitCastExpr 0x5aeacb0 <col:17> 'int' <LValueToRValue>
------解决方案--------------------
------解决方案--------------------
`-DeclRefExpr 0x5aeac68 <col:17> 'int' lvalue ParmVar 0x5aeaa90 'x' 'int'
------解决方案--------------------
`-IntegerLiteral 0x5aeac90 <col:21> 'int' 42
`-ReturnStmt 0x5aead68 <line:3:3, col:10>
`-ImplicitCastExpr 0x5aead50 <col:10> 'int' <LValueToRValue>
`-DeclRefExpr 0x5aead28 <col:10> 'int' lvalue Var 0x5aeac10 'result' 'int'