函数调用关系工具<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 />    ...
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
开放的源代码,免费
Upcoming SlideShare
Loading in …5
×

函数调用关系工具-Lite

1,887 views

Published on

函数调用关系工具的精简版本

Published in: Design, Technology
1 Comment
1 Like
Statistics
Notes
  • 好希望能就一些问题请教作者,该怎么联系你呢?
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
No Downloads
Views
Total views
1,887
On SlideShare
0
From Embeds
0
Number of Embeds
728
Actions
Shares
0
Downloads
9
Comments
1
Likes
1
Embeds 0
No embeds

No notes for slide

函数调用关系工具-Lite

  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 />为什么要预处理?<br /><ul><li>string,vector…无法识别</li></ul>如何处理?<br /><ul><li> 1.头文件替换
  37. 37. 2.IASTTranslationUnit au=..</li></ul>IASTPreprocessorIncludeStatement[] incs = au.getIncludeDirectives();<br /><ul><li> 3.线下处理stl库</li></li></ul><li>函数调用关系工具-测试<br />一个简单的测试用例<br />
  38. 38. 函数调用关系工具-问题<br />(1)<br />多态?<br />(2)<br />隐式类型转换?<br />(3)<br />模板?<br />(4)<br />执行速度的优化?<br />
  39. 39. Thank You!<br />

×