函数调用关系工具-2011-孙光福
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

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

  • 1,546 views
Uploaded on

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

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

  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
1,546
On Slideshare
1,513
From Embeds
33
Number of Embeds
1

Actions

Shares
Downloads
7
Comments
0
Likes
0

Embeds 33

http://10.20.150.23:9508 33

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. 函数调用关系工具
    2011年8月
  • 2. 目录
    原理
    Antlr
    Eclipse CDT
    函数调用关系工具
    工具目标
    工具设计思路
    实现过程
    问题
  • 3. Antlr
    Another Tool for Language Recognition
    • 语言识别工具
    • 4. 提供了一个框架,构造语言识别器,编 译器和解释器
    • 5. 基于LL(*)的识别:自顶向下分析的编译方法,最左推导
    • 6. Input:接受文法语言描述
    Output:产生识别这些语言语句的程序(Java ,Python,C++,C#,Ruby)
    • antlrVSLex,YACC
    • 7. 支持多种语言
    • 8. 使用更加方便
  • Antlr能做什么?
    前端
    1.编程语言处理
    一般的编译技术
    2.文本处理
    正则表达式?
    3.domain-specific languages
    (DSL)(领域专用语言)
    源程序
    词法分析
    Antlr封装
    语法分析
    语义分析
    中间代码
    后端
    目标代码
    代码优化
  • 9. Antlr内部机理
    Character
    Stream
    Lexer(词法分析器)
    形成token
    Parser(语法分析器)
    处理一系列的token,形成AST
    Abstract Syntax Tree(AST)
    得到的解析树
    Tree Parser
    处理AST
    Lexer
    Token
    Stream
    Parser
    AST
    Tree Parser
    Text Output
  • 10. Antlr环境搭建
    JDK(Java Runtime Environment )
    http://www.antlr.org/
    antlr的jar包
    设置环境变量 ClASSPATH
    • AntlrWorks
    集成开发环境
  • 11. Antlr使用一般步骤
    (1) 输入一个grammar(xx.g)
    (2) java org.antlr.Toolxx.g
    (3) 产生Class
    (4) 使用Class进行相应的应用
    Antlrworks?
  • 12. Antlr-Grammar
    EBNF 法则
    Extended Backus-Naur Form 扩展巴科斯范式
    规则
    • ANTLR的规则要以分号“;”结束。
    • 13. A:a;来表示规则,“:”代替了“=>”
    • 14. 选择“|”A:a|b|c符号A可以推导出a或b或c
    • 15. 连接“ ”A:abc;。此规则接收句型abc
    • 16. 重复“*,+” A:a*,A:a+;
    • 17. 可选 “?” A:a?
    终结符
    • “..”: ’A’..’Z’(A到Z的任意字符)
    • 18. “~”: ~’B’;(除B之外的所有字符)
    • 19. “.”:任意字符
  • Antlr-Grammar
    grammar : grammar-name
    Options
    {
    output=AST ? …
    language=Java? C? …
    }
    • 语法规则(第一个字母小写)
    a:INT;
    • 词法规则(第一个字母大写)
    INT: ‘0’.. ‘9’+;
  • 20. Antlr-一个简单的例子
    识别加、减、乘、除 算术表达式
    2+3;
    2+(3*4);
  • 21. Antlr-解析编程语言
    http://www.antlr.org/
    开源的语法文件(grammar)
    C.g, Cpp.g, Java.g, Python.g, js.g …
  • 22. Eclipse CDT
    CDT是什么?
    • C/C++ Development Toolkit
    • 23. 为Eclipse 平台提供功能完全的 C/C++IDE
    • 24. 开放的源代码,免费
    • 25. 许多代码基于JDT
    CDT能做什么?
  • Eclipse CDT-Parser原理
    CDT
    Character
    Stream
    Lexer
    Class CPreprocessor
    Antlr
    Token
    Stream
    IScanner
    Parser
    Class AbstractGNUSourceCodeParser
    AST
    Class IASTTranslationUnit
    Tree Parser
    accept方法
    Text Output
  • 29. CDT——如何访问AST
    创建一个新的 ASTVisitor
    调用 IASTTranslationUnit.accept(ASTVisitor)
    visit方法()
    PROCESS_SKIP
    PROCESS_ABORT
    PROCESS_CONTINUE
    表 1 显示了 Boolean 字段来确定访问器是否对访问此节点感兴趣。
    该字段控制哪种类型的节点能够调用访问程序的 visit() 方法。默认情况下,它们都被设为 false,所以永远都不会调用 visit()。
  • 30. CDT——API
    #include <math.h>
    double circu(double diam){
    return diam*M_PI;
    }
    IASTTranslationUnit:main.c
    IASTDeclaration

    IASTFunctionDefinition
    IASTCompoudStatement
    IASTDeclSpecifier:
    double
    IASTFunctionDeclarator
    IASTParameterDeclaration:
    IASTName:cicru
    IASTReturnStatement
    IASTDeclSpecifier:double
    IASTDelarator
    IASTBinaryExpression:*
    IASTIdExpression
    IASTLiteralExpression:3.1415
    IASTName:diam
    IASTName:diam
  • 31. CDT-API
    IBinding
    ILabel
    IVariable
    ICompositeType
    IEnumberation
    ITypedef
    IParameter
    IField
    IFunction
    IType
    IFunctionType
    ICPPFunction
    ICPPClassType
    ICPPMethod
  • 32. Eclipse-CDT
    一个简单的例子
    获取sourceCode当中所有方法的定义?
  • 33. 函数调用关系工具-简介
    工具目标
    (1) Input:
    • 工程路径
    • 34. 文件路径,某一行
    (2)output:
    • 类的调用关系 or 函数的调用关系
  • 函数调用关系工具-Example
    Source Code
    1 intGetA()
    2 {
    3 return 0;
    4 }
    5 intGetB()
    6 {
    7 return GetA();
    8 }
    9 int main()
    10 {
    11 inti=Get B();
    12 return 0;
    13 }
    intGetA()
    intGetB()
    int main()t
    函数调用关系工具
    projectPath: ..
    filePath: ..
    row: 3
    Node包含的信息:
    文件名?起止行?函数名或者类名?内容?类还是函数?父亲节点?
  • 35. 函数调用关系工具-设计思路
  • 36. 函数调用关系工具-类
    ASTASTTranslationUnitCore:提供解析文件或者Code的接口。
    CPPClassCollector:遍历AST,获得所有的Class
    CPPFunctionCollector:获得所有的Function定义
    CPPNameCollector:获得所有是Function,Class,Method的符号
    NodeInfo:存储节点的信息
    HeaderFileCast: 处理头文件
    FileToString:将File的头文件替换形成String
    CPPCallRelation:形成函数调用关系
  • 37. 函数调用关系工具-变量
    变量含义含义
    • List<IASTName> nameList
    • 38. List<ICPPASTCompositeTypeSpecifier> classList
    • 39. List<IASTFunctionDefinition> functionDefinitionList
    • 40. List<IASTNode> astNodeList
    • 41. Map<File,List<IASTPreprocessorIncludeStatement>> fileIncludeFilesMap
    • 42. Map<String, List<File>> headerFileListMap
    • 43. List<NodeInfo> nodeList
    • 44. Map<File, Integer> fileOffsetMap
  • 函数调用关系-文件预处理
    为什么要预处理?
    • string,vector…无法识别
    如何处理?
    • 1.头文件替换
    • 45. 2.IASTTranslationUnit au=..
    IASTPreprocessorIncludeStatement[] incs = au.getIncludeDirectives();
    • 3.线下处理stl库
  • 函数调用关系工具-文件预处理
    test.cpp
    #include<string>
    #include “test.h”
    int main()
    {
    return0;
    }
    fileIncludeFilesMap
    <test.cpp,{#include<string>,#include“test.h”}>
    headerFileListMap
    <“#include<string>”,List{File string}>
    <“#include “test.h” ”,List{ File vector,Fileiostream}
  • 46. 函数调用关系工具-创建根节点
    ConstructRootNode()
    根据行所在的位置,确定根节点
    • Function||Method
    {
    }
    • Class A
    {
    Method? ----Method,Class A
    Field? ---Class A的调用关系
    friend Class B|| ClassType B--Class A,Class B
    }
  • 47. 函数调用关系工具-创建根节点实现过程
  • 48. 函数调用关系工具-创建调用关系树
    ConstructRelationTree()
    • 对于每一个ASTNode进行处理,获得所有调用此Node的Class或Function,存储在NodeInfo中
    • 49. nodeList中将存储着每个Node的信息及Node父节点
  • 函数调用关系工具-寻找父节点
    • 寻找调用Function的类或者方法
    findFunctionParentNodes()
    • 寻找实例化Class的类或者方法
    findClassParentNodes()
  • 50. 函数调用关系工具-测试
    一个简单的测试用例
  • 51. 函数调用关系工具-问题
    (1)
    多态?
    (2)
    隐式类型转换?
    (3)
    模板?
    (4)
    执行速度的优化?
  • 52. Thank You!