函数调用关系工具-Lite
Upcoming SlideShare
Loading in...5
×
 

函数调用关系工具-Lite

on

  • 1,823 views

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

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

Statistics

Views

Total Views
1,823
Views on SlideShare
1,095
Embed Views
728

Actions

Likes
1
Downloads
6
Comments
1

7 Embeds 728

http://qa.alibaba.com 665
http://10.20.160.10:8080 24
http://10.20.150.23:9508 14
http://119.38.217.40 9
http://feed.feedsky.com 8
http://10.20.150.23 5
http://qa.alibaba.com:8080 3
More...

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • 好希望能就一些问题请教作者,该怎么联系你呢?
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

函数调用关系工具-Lite 函数调用关系工具-Lite Presentation Transcript

  • 函数调用关系工具
    2011年8月
  • 目录
    原理
    Antlr
    Eclipse CDT
    函数调用关系工具
    工具目标
    工具设计思路
    实现过程
    问题
  • Antlr
    Another Tool for Language Recognition
    • 语言识别工具
    • 提供了一个框架,构造语言识别器,编 译器和解释器
    • 基于LL(*)的识别:自顶向下分析的编译方法,最左推导
    • Input:接受文法语言描述
    Output:产生识别这些语言语句的程序(Java ,Python,C++,C#,Ruby)
    • antlrVSLex,YACC
    • 支持多种语言
    • 使用更加方便
  • Antlr能做什么?
    前端
    1.编程语言处理
    一般的编译技术
    2.文本处理
    正则表达式?
    3.domain-specific languages
    (DSL)(领域专用语言)
    源程序
    词法分析
    Antlr封装
    语法分析
    语义分析
    中间代码
    后端
    目标代码
    代码优化
  • Antlr内部机理
    Character
    Stream
    Lexer(词法分析器)
    形成token
    Parser(语法分析器)
    处理一系列的token,形成AST
    Abstract Syntax Tree(AST)
    得到的解析树
    Tree Parser
    处理AST
    Lexer
    Token
    Stream
    Parser
    AST
    Tree Parser
    Text Output
  • Antlr环境搭建
    JDK(Java Runtime Environment )
    http://www.antlr.org/
    antlr的jar包
    设置环境变量 ClASSPATH
    • AntlrWorks
    集成开发环境
  • Antlr使用一般步骤
    (1) 输入一个grammar(xx.g)
    (2) java org.antlr.Toolxx.g
    (3) 产生Class
    (4) 使用Class进行相应的应用
    Antlrworks?
  • Antlr-Grammar
    EBNF 法则
    Extended Backus-Naur Form 扩展巴科斯范式
    规则
    • ANTLR的规则要以分号“;”结束。
    • A:a;来表示规则,“:”代替了“=>”
    • 选择“|”A:a|b|c符号A可以推导出a或b或c
    • 连接“ ”A:abc;。此规则接收句型abc
    • 重复“*,+” A:a*,A:a+;
    • 可选 “?” A:a?
    终结符
    • “..”: ’A’..’Z’(A到Z的任意字符)
    • “~”: ~’B’;(除B之外的所有字符)
    • “.”:任意字符
  • Antlr-Grammar
    grammar : grammar-name
    Options
    {
    output=AST ? …
    language=Java? C? …
    }
    • 语法规则(第一个字母小写)
    a:INT;
    • 词法规则(第一个字母大写)
    INT: ‘0’.. ‘9’+;
  • Antlr-一个简单的例子
    识别加、减、乘、除 算术表达式
    2+3;
    2+(3*4);
  • Antlr-解析编程语言
    http://www.antlr.org/
    开源的语法文件(grammar)
    C.g, Cpp.g, Java.g, Python.g, js.g …
  • Eclipse CDT
    CDT是什么?
    • C/C++ Development Toolkit
    • 为Eclipse 平台提供功能完全的 C/C++IDE
    • 开放的源代码,免费
    • 许多代码基于JDT
    CDT能做什么?
    • C/C++编辑器
    • C/C++调试器
    • C/C++解析器
    • 搜索引擎
  • Eclipse CDT-Parser原理
    CDT
    Character
    Stream
    Lexer
    Class CPreprocessor
    Antlr
    Token
    Stream
    IScanner
    Parser
    Class AbstractGNUSourceCodeParser
    AST
    Class IASTTranslationUnit
    Tree Parser
    accept方法
    Text Output
  • CDT——如何访问AST
    创建一个新的 ASTVisitor
    调用 IASTTranslationUnit.accept(ASTVisitor)
    visit方法()
    PROCESS_SKIP
    PROCESS_ABORT
    PROCESS_CONTINUE
    表 1 显示了 Boolean 字段来确定访问器是否对访问此节点感兴趣。
    该字段控制哪种类型的节点能够调用访问程序的 visit() 方法。默认情况下,它们都被设为 false,所以永远都不会调用 visit()。
  • 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
  • CDT-API
    IBinding
    ILabel
    IVariable
    ICompositeType
    IEnumberation
    ITypedef
    IParameter
    IField
    IFunction
    IType
    IFunctionType
    ICPPFunction
    ICPPClassType
    ICPPMethod
  • Eclipse-CDT
    一个简单的例子
    获取sourceCode当中所有方法的定义?
  • 函数调用关系工具-简介
    工具目标
    (1) Input:
    • 工程路径
    • 文件路径,某一行
    (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包含的信息:
    文件名?起止行?函数名或者类名?内容?类还是函数?父亲节点?
  • 函数调用关系工具-设计思路
  • 函数调用关系-文件预处理
    为什么要预处理?
    • string,vector…无法识别
    如何处理?
    • 1.头文件替换
    • 2.IASTTranslationUnit au=..
    IASTPreprocessorIncludeStatement[] incs = au.getIncludeDirectives();
    • 3.线下处理stl库
  • 函数调用关系工具-测试
    一个简单的测试用例
  • 函数调用关系工具-问题
    (1)
    多态?
    (2)
    隐式类型转换?
    (3)
    模板?
    (4)
    执行速度的优化?
  • Thank You!