logo资料库

Eclipse JDT AST使用方法(word).doc

第1页 / 共20页
第2页 / 共20页
第3页 / 共20页
第4页 / 共20页
第5页 / 共20页
第6页 / 共20页
第7页 / 共20页
第8页 / 共20页
资料共20页,剩余部分请下载后查看
3.1 AST View简介
第二章 AST 的相关操作 2.1 AST 的节点的定位 本节主要介绍 AST 节点获取子节点的方法和从源代码搜索节点的方法。 2.1.1 获取 AST 节点的子节点 ASTNode 是 AST 用于表示树中节点的数据结构,也是所有节点类型(如 Expression,的 父类 ASTNode 获得父节点可以直接调用 getParent 即可,若想获得根节点可以调用 getRoot, 具体可以参照 JDT API,但是仔细查看方法列表就会发现 ASTNode 类没有提供 getChildren 方 法,下面就介绍如何获得 ASTNode 的子节点。 首先介绍节点属性,一个节点的子节点被属性划分,例如 TypeDeclaration 节点(类的 声明节点),该节点有一个 SimpleName 节点(表示类的名称),这个节点在 TypeDeclaration 节点中的属性就是 Name,节点通过属性为节点分类,方便用户提取对应的节点,也更容易 理解子节点的含义。ASTNode 关于属性有两个重要的方法: 1) structuralPropertiesForType 功能:返回节点的属性列表(List 对象) 2) getLocationInParent 功能:返回该节点在其父节点的位置(属性) 属性列表中的元素是 StructuralPropertyDescriptor,属性有三种类型: 1)SimplePropertyDescriptor 表示该节点为一个简单属性 2)ChildPropertyDescriptor 表示该节点仍有一个子节点 3)ChildListPropertyDescriptor 表示该节点有大于 1 个的子节点 ASTNode 从属性获得子节点(属性)的方法: getStructuralProperty(StructuralPropertyDescriptor property) 该方法的返回值根据上述三种类型也有三种返回值类型: 1)SimplePropertyDescriptor 返回一个 Object 对象,通过 toString()方法获得内容 ,通过 property.getId 获得属性名称。 2)ChildPropertyDescriptor 返回一个 ASTNode 对象,即该节点的子节点 3)ChildListPropertyDescriptor 返回一个 List 对象,包含多个 ASTNode,都为该属性下的子节点 总的来说,ASTNode 获得子节点的机制如下图所示:(图 1,2)
图 1 ASTNode 通过 Property 获得子节点和自身属性信息 图 2 ASTNode 根据 Property 不同而得到类型的节点或属性 2.2.2 从源代码搜索节点 NodeFinder 类介绍:在 ASTView(具体可以参照“AST View 插件介绍”)源代码中实现了 该类,JDT 从 3.5 版起正式收入 NodeFinder,路径为 org.eclipse.jdt.core.dom.NodeFinder NodeFinder 类的初始化: NodeFinder(ASTNode root, int start, int length) //root 为开始搜索的根节点,start 为源代码开 始位置,length 为长度 使用 NodeFinder 有两种方式: 第一种,创建该类的实体对象,有两种方法供调用: getCoveredNode() 返回被覆盖的节点(完全覆盖),如果覆盖节点大于一个,则返回尽可能接近所给范围的节点, 具有同样范围则返回第一个发现的节点 getCoveringNode() 返回正被覆盖(部分覆盖)节点,如果该类种节点大于一个,则返回尽可能多的被覆盖的节点, 具有同样的范围则返回最后一个发现的节点。 第二种,调用静态方法: public static ASTNode perform(ASTNode root, int start, int length) 该方法规则:
1、查找节点的 start 和 length 与所给的起始位置和长度完全匹配的节点 2、若找不到,在这个范围的附近查找,优先完全覆盖的节点,若完全覆盖节点不存在,则 返回部分覆盖节点。 3、若 length 为 0,则返回节点的 start 或者 end 等于所给起始位置的节点 4、若上述三条均查找不到,则返回 null 2.2 AST 的遍历 本节主要介绍 ASTVisitor 的使用方法。 ASTVisitor 提供了一种遍历树的能力,由节点以访问者模式对其子树遍历,我们将对树 的操作在 ASTVisitor 中实现,使用 ASTNode 的 accept 方法,完成用户定义的 visitor 对树的遍 历。 该方法用来对 AST 节点的访问,提供了四个方法: 1) public boolean visit(T node) T 代表了不同的 AST 节点类型(ASTNode 子类),可以控制对该节点的子节点的访问,如果 返回 true,则继续访问子节点,若返回 false 则不访问子节点 2) public void endVisit(T node) 该方法在该节点的所有子节点访问完成(或 visit 返回 false)后被调用 3) public void preVisit(ASTNode node) 在 visit 方法之前被调用 4) public void postVisit(ASTNode node) 在 endvisit 方法之后被调用 子类根据需要重写上述方法,完成对树的某些操作。 PreVisit 和 visit 的区别: 图 3 ASTVisitor 的执行顺序 两者的最主要区别是参数不同,前者的参数是 ASTNode,并且在 ASTVisitor 中该方法只 有一个,而后者的参数是所有可能的节点类型,所以该方法因重载在 ASTVisitor 有很多个。 ASTVisitor 这样设计是因为有些操作是对所有节点的统一操作,而这些操作不关注节点类型, 并且可能需要最先执行,所以提供了 preVisit 方法供调用,随后节点的类型被确定,随即调 用匹配类型的 visit 方法,完成对某类节点的操作。
同理可知 postVisit 和 endvisit 的区别。 AST 的遍历示例可以参考“数据元素的构造” 第三章 AST View 插件介绍 3.1 AST View 简介 AST View 是 eclipse 环境中的一个 view 插件,它提供了如下主要功能: 1) 将 eclipse 编辑窗口打开的一个 Java 文件转换为抽象语法树(AST: Abstract syntax tree)的形式,并显示出来; 2) 可进行从编辑器中的文本(代码、注释等)选择到 AST 节点的操作,也可以进行从 节点到文本的反向操作; 3) 进行节点比较; 4) 显示节点的绑定信息和简单的错误信息; AST View 界面如图 1 所示 图 1 AST View 基本界面 AST View 安装 3.2 AST View 的安装分为更新和手动安装两种方式。 3.2.1 更新方式 更新站点: http://www.eclipse.org/jdt/ui/update-site 1)在 eclipse 菜单中选择 Help -> Install new software... 2)在打开的窗口中点击“Add...”按钮(已添加过的跳过此步),填写更新站点的网址。(见 图 2)
3)在列表中选择对应的版本,Next 就可以在线更新。(见图 3) 图 2 添加更新站点 图 3 选择安装的版本 3.2.2 手动安装 1) 下载 下载地址: http://www.eclipse.org/jdt/ui/astview/index.php 见 Manual Install 列表,找到适合(对应 eclipse 版本)的版本下载。(见图 4) 2) 解压缩后拷贝文件夹到 eclipse 文件夹下的 plugins 或者 dropins 文件夹中。 图 4 选择手动安装版本 3.3 AST View 使用
(1) 打开 AST View 插件(已经打开的跳过此步) 1) 从菜单中选择打开: eclipse 菜单:Window -> Show View -> Other... 选择 Java,找到 AST View 并选择。 2) 使用快捷键:Alt+Shift+Q, A (2) 在 eclipse 编辑器中打开一个 Java 文件 (3) 点击“Show AST( )”,在 view 插件中显示当前编辑器的中代码的 AST 结果。 (4) AST View 节点介绍。(见图 5) 图 5 AST View 节点总览 1)AST 节点显示为灰色,中括号里的是该节点在源代码中的起始位置和长度。 2)节点属性的名为全大写显示,节点属性代表了子节点或者本身的属性信息。 3)绑定信息显示为蓝色。 (5) 可以选择“链接编辑器( )”,自动的建立编辑器中文本与插件中的 AST 节点的关 联,具体表现形式是:在编辑器中选定的一段代码,AST View 插件可以自动定位到选定代码 对应的 AST 节点,并突出显示。 (6) 双击 AST View 中的节点,在编辑器中自动突出显示选定该节点对应的代码。(见图 6)
图 6 选定节点显示 (7) 再次双击以上节点,会以拓展形式显示对应的代码,包括了与该节点相关的注释文本。 (8) 在 AST View 选定一个节点后,右键菜单中可以选择放入比较,该机制允许用户选定 某些节点放在一起比较。(见图 7,8) 图 7 添加到比较盒
(9) 当 AST View 解析的 Java 文件发生变化的时候,可以点击“刷新( )”以更新 AST 结果。 图 8 比较盒内容 AST View 源码分析 3.4 3.4.1 从 CVS 中获得源码 Repository: :pserver:anonymous@dev.eclipse.org:/cvsroot/eclipse Module: jdt-ui-home/plugins/org.eclipse.jdt.astview 添加步骤: eclipse 菜单:选择 File -> Import... 1) 选择 CVS –> Projects from CVS 2) 选中 Create a new repository location 3) 填写相应信息。(见图 9) 4) 找到 astview 项目,导入到 eclipse。 图 9 CVS 信息添加 3.4.2 源代码结构 导入 astview 以后的源代码结构如图 10 所示:
分享到:
收藏