函数调用关系工具<br />2011年8月<br />
目录<br />原理<br />Antlr<br />Eclipse CDT<br />函数调用关系工具<br />工具目标<br />工具设计思路<br />实现过程<br />问题<br />
Antlr<br />Another Tool  for Language Recognition<br /><ul><li>语言识别工具
提供了一个框架,构造语言识别器,编 译器和解释器
基于LL(*)的识别:自顶向下分析的编译方法,最左推导
Input:接受文法语言描述</li></ul>Output:产生识别这些语言语句的程序(Java ,Python,C++,C#,Ruby)<br /><ul><li>antlrVSLex,YACC
支持多种语言
使用更加方便</li></li></ul><li>Antlr能做什么?<br />前端<br />1.编程语言处理<br />一般的编译技术<br />2.文本处理<br />正则表达式?<br />3.domain-specific lang...
Antlr内部机理<br />Character<br />Stream<br />Lexer(词法分析器)<br />形成token<br />Parser(语法分析器)<br />处理一系列的token,形成AST<br />Abstrac...
Antlr环境搭建<br />JDK(Java Runtime Environment )<br />http://www.antlr.org/<br />antlr的jar包<br />设置环境变量 ClASSPATH<br /><ul><l...
Antlr使用一般步骤<br />(1) 输入一个grammar(xx.g)<br />(2) java org.antlr.Toolxx.g<br />(3) 产生Class<br />(4) 使用Class进行相应的应用<br />Antl...
Antlr-Grammar <br />EBNF 法则<br />Extended Backus-Naur Form 扩展巴科斯范式<br />规则<br /><ul><li>ANTLR的规则要以分号“;”结束。
A:a;来表示规则,“:”代替了“=>”
选择“|”A:a|b|c符号A可以推导出a或b或c
连接“  ”A:abc;。此规则接收句型abc
重复“*,+” A:a*,A:a+;
可选 “?” A:a?</li></ul>终结符<br /><ul><li>“..”: ’A’..’Z’(A到Z的任意字符)
“~”: ~’B’;(除B之外的所有字符)
“.”:任意字符</li></li></ul><li>Antlr-Grammar<br />grammar : grammar-name<br />Options<br />{<br />output=AST ? …<br />language...
Antlr-一个简单的例子<br />识别加、减、乘、除 算术表达式<br />    2+3;<br />    2+(3*4);<br />
Antlr-解析编程语言<br />http://www.antlr.org/<br />开源的语法文件(grammar)<br />C.g, Cpp.g, Java.g, Python.g, js.g   …<br />
Eclipse CDT<br /> CDT是什么?<br /><ul><li>    C/C++ Development Toolkit
为Eclipse 平台提供功能完全的 C/C++IDE
开放的源代码,免费
许多代码基于JDT</li></ul> CDT能做什么?<br /><ul><li>    C/C++编辑器
    C/C++调试器
    C/C++解析器
搜索引擎</li></li></ul><li>Eclipse CDT-Parser原理<br />CDT<br />Character<br />Stream<br />Lexer<br />Class CPreprocessor<br />A...
CDT——如何访问AST<br />创建一个新的 ASTVisitor<br />调用 IASTTranslationUnit.accept(ASTVisitor)<br />visit方法()<br />PROCESS_SKIP<br />P...
CDT——API<br />#include <math.h><br />double circu(double diam){<br />	return diam*M_PI;<br />}<br />IASTTranslationUnit:ma...
CDT-API<br />IBinding<br />ILabel<br />IVariable<br />ICompositeType<br />IEnumberation<br />ITypedef<br />IParameter<br /...
Upcoming SlideShare
Loading in...5
×

函数调用关系工具-2011-孙光福

1,136

Published on

上周五,孙光福同学给我们分享了“C/C++函数调用关系分析工具”的设计和实现,以下是他分享的PPT

Published in: Self Improvement, Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,136
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
9
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

函数调用关系工具-2011-孙光福

  1. 1. 函数调用关系工具<br />2011年8月<br />
  2. 2. 目录<br />原理<br />Antlr<br />Eclipse CDT<br />函数调用关系工具<br />工具目标<br />工具设计思路<br />实现过程<br />问题<br />
  3. 3. Antlr<br />Another Tool for Language Recognition<br /><ul><li>语言识别工具
  4. 4. 提供了一个框架,构造语言识别器,编 译器和解释器
  5. 5. 基于LL(*)的识别:自顶向下分析的编译方法,最左推导
  6. 6. Input:接受文法语言描述</li></ul>Output:产生识别这些语言语句的程序(Java ,Python,C++,C#,Ruby)<br /><ul><li>antlrVSLex,YACC
  7. 7. 支持多种语言
  8. 8. 使用更加方便</li></li></ul><li>Antlr能做什么?<br />前端<br />1.编程语言处理<br />一般的编译技术<br />2.文本处理<br />正则表达式?<br />3.domain-specific languages<br /> (DSL)(领域专用语言)<br />源程序<br />词法分析<br />Antlr封装<br />语法分析<br />语义分析<br />中间代码<br />后端<br />目标代码<br />代码优化<br />
  9. 9. Antlr内部机理<br />Character<br />Stream<br />Lexer(词法分析器)<br />形成token<br />Parser(语法分析器)<br />处理一系列的token,形成AST<br />Abstract Syntax Tree(AST)<br />得到的解析树<br />Tree Parser<br />处理AST<br />Lexer<br />Token<br />Stream<br />Parser<br />AST<br />Tree Parser<br />Text Output<br />
  10. 10. Antlr环境搭建<br />JDK(Java Runtime Environment )<br />http://www.antlr.org/<br />antlr的jar包<br />设置环境变量 ClASSPATH<br /><ul><li>AntlrWorks</li></ul>集成开发环境<br />
  11. 11. Antlr使用一般步骤<br />(1) 输入一个grammar(xx.g)<br />(2) java org.antlr.Toolxx.g<br />(3) 产生Class<br />(4) 使用Class进行相应的应用<br />Antlrworks?<br />
  12. 12. Antlr-Grammar <br />EBNF 法则<br />Extended Backus-Naur Form 扩展巴科斯范式<br />规则<br /><ul><li>ANTLR的规则要以分号“;”结束。
  13. 13. A:a;来表示规则,“:”代替了“=>”
  14. 14. 选择“|”A:a|b|c符号A可以推导出a或b或c
  15. 15. 连接“ ”A:abc;。此规则接收句型abc
  16. 16. 重复“*,+” A:a*,A:a+;
  17. 17. 可选 “?” A:a?</li></ul>终结符<br /><ul><li>“..”: ’A’..’Z’(A到Z的任意字符)
  18. 18. “~”: ~’B’;(除B之外的所有字符)
  19. 19. “.”:任意字符</li></li></ul><li>Antlr-Grammar<br />grammar : grammar-name<br />Options<br />{<br />output=AST ? …<br />language=Java? C? …<br />}<br /><ul><li>语法规则(第一个字母小写)</li></ul> a:INT;<br /><ul><li>词法规则(第一个字母大写)</li></ul> INT: ‘0’.. ‘9’+;<br />
  20. 20. Antlr-一个简单的例子<br />识别加、减、乘、除 算术表达式<br /> 2+3;<br /> 2+(3*4);<br />
  21. 21. Antlr-解析编程语言<br />http://www.antlr.org/<br />开源的语法文件(grammar)<br />C.g, Cpp.g, Java.g, Python.g, js.g …<br />
  22. 22. Eclipse CDT<br /> CDT是什么?<br /><ul><li> C/C++ Development Toolkit
  23. 23. 为Eclipse 平台提供功能完全的 C/C++IDE
  24. 24. 开放的源代码,免费
  25. 25. 许多代码基于JDT</li></ul> CDT能做什么?<br /><ul><li> C/C++编辑器
  26. 26. C/C++调试器
  27. 27. C/C++解析器
  28. 28. 搜索引擎</li></li></ul><li>Eclipse CDT-Parser原理<br />CDT<br />Character<br />Stream<br />Lexer<br />Class CPreprocessor<br />Antlr<br />Token<br />Stream<br />IScanner <br />Parser<br />Class AbstractGNUSourceCodeParser<br />AST<br />Class IASTTranslationUnit<br />Tree Parser<br />accept方法<br />Text Output<br />
  29. 29. CDT——如何访问AST<br />创建一个新的 ASTVisitor<br />调用 IASTTranslationUnit.accept(ASTVisitor)<br />visit方法()<br />PROCESS_SKIP<br />PROCESS_ABORT<br />PROCESS_CONTINUE<br />表 1 显示了 Boolean 字段来确定访问器是否对访问此节点感兴趣。<br /> 该字段控制哪种类型的节点能够调用访问程序的 visit() 方法。默认情况下,它们都被设为 false,所以永远都不会调用 visit()。<br />
  30. 30. CDT——API<br />#include <math.h><br />double circu(double diam){<br /> return diam*M_PI;<br />}<br />IASTTranslationUnit:main.c<br />IASTDeclaration<br />…<br />IASTFunctionDefinition<br />IASTCompoudStatement<br />IASTDeclSpecifier:<br />double<br />IASTFunctionDeclarator<br />IASTParameterDeclaration:<br />IASTName:cicru<br />IASTReturnStatement<br />IASTDeclSpecifier:double<br />IASTDelarator<br />IASTBinaryExpression:*<br />IASTIdExpression<br />IASTLiteralExpression:3.1415<br />IASTName:diam<br />IASTName:diam<br />
  31. 31. CDT-API<br />IBinding<br />ILabel<br />IVariable<br />ICompositeType<br />IEnumberation<br />ITypedef<br />IParameter<br />IField<br />IFunction<br />IType<br />IFunctionType<br />ICPPFunction<br />ICPPClassType<br />ICPPMethod<br />
  32. 32. Eclipse-CDT<br />一个简单的例子<br />获取sourceCode当中所有方法的定义?<br />
  33. 33. 函数调用关系工具-简介<br />工具目标<br />(1) Input:<br /><ul><li>工程路径
  34. 34. 文件路径,某一行</li></ul>(2)output:<br /><ul><li>类的调用关系 or 函数的调用关系</li></li></ul><li>函数调用关系工具-Example<br />Source Code<br />1 intGetA()<br />2 {<br />3 return 0;<br />4 }<br />5 intGetB()<br />6 {<br />7 return GetA();<br />8 }<br />9 int main()<br />10 {<br />11 inti=Get B();<br />12 return 0;<br />13 }<br />intGetA()<br />intGetB()<br />int main()t<br />函数调用关系工具<br />projectPath: ..<br />filePath: ..<br />row: 3<br />Node包含的信息:<br />文件名?起止行?函数名或者类名?内容?类还是函数?父亲节点?<br />
  35. 35. 函数调用关系工具-设计思路<br />
  36. 36. 函数调用关系工具-类<br />ASTASTTranslationUnitCore:提供解析文件或者Code的接口。<br />CPPClassCollector:遍历AST,获得所有的Class<br />CPPFunctionCollector:获得所有的Function定义<br />CPPNameCollector:获得所有是Function,Class,Method的符号<br />NodeInfo:存储节点的信息<br />HeaderFileCast: 处理头文件<br />FileToString:将File的头文件替换形成String<br />CPPCallRelation:形成函数调用关系<br />
  37. 37. 函数调用关系工具-变量<br />变量含义含义<br /><ul><li>List<IASTName> nameList
  38. 38. List<ICPPASTCompositeTypeSpecifier> classList
  39. 39. List<IASTFunctionDefinition> functionDefinitionList
  40. 40. List<IASTNode> astNodeList
  41. 41. Map<File,List<IASTPreprocessorIncludeStatement>> fileIncludeFilesMap
  42. 42. Map<String, List<File>> headerFileListMap
  43. 43. List<NodeInfo> nodeList
  44. 44. Map<File, Integer> fileOffsetMap</li></li></ul><li>函数调用关系-文件预处理<br />为什么要预处理?<br /><ul><li>string,vector…无法识别</li></ul>如何处理?<br /><ul><li> 1.头文件替换
  45. 45. 2.IASTTranslationUnit au=..</li></ul>IASTPreprocessorIncludeStatement[] incs = au.getIncludeDirectives();<br /><ul><li> 3.线下处理stl库</li></li></ul><li>函数调用关系工具-文件预处理<br />test.cpp<br />#include<string><br />#include “test.h”<br />int main()<br />{<br /> return0;<br />}<br />fileIncludeFilesMap<br /><test.cpp,{#include<string>,#include“test.h”}><br />headerFileListMap<br /><“#include<string>”,List{File string}><br /><“#include “test.h” ”,List{ File vector,Fileiostream}<br />
  46. 46. 函数调用关系工具-创建根节点<br />ConstructRootNode()<br /> 根据行所在的位置,确定根节点<br /><ul><li>Function||Method</li></ul> {<br /> }<br /><ul><li>Class A</li></ul> {<br /> Method? ----Method,Class A<br /> Field? ---Class A的调用关系<br /> friend Class B|| ClassType B--Class A,Class B<br /> }<br />
  47. 47. 函数调用关系工具-创建根节点实现过程<br />
  48. 48. 函数调用关系工具-创建调用关系树<br />ConstructRelationTree()<br /><ul><li> 对于每一个ASTNode进行处理,获得所有调用此Node的Class或Function,存储在NodeInfo中
  49. 49. nodeList中将存储着每个Node的信息及Node父节点</li></li></ul><li>函数调用关系工具-寻找父节点<br /><ul><li>寻找调用Function的类或者方法</li></ul>findFunctionParentNodes()<br /><ul><li>寻找实例化Class的类或者方法</li></ul>findClassParentNodes()<br />
  50. 50. 函数调用关系工具-测试<br />一个简单的测试用例<br />
  51. 51. 函数调用关系工具-问题<br />(1)<br />多态?<br />(2)<br />隐式类型转换?<br />(3)<br />模板?<br />(4)<br />执行速度的优化?<br />
  52. 52. Thank You!<br />
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×