热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【eclipse高效开发】——ASTView

要想自己设计并实现一个代码自动分析、优化和重构工具,得先理解代码;要想理解代码,得先用一个好的数据结构来存储和表示所读取的代码。基于程序代码本身的层次结构,用树状结构来表示是再好不过的了,。




要想自己设计并实现一个代码自动分析、优化和重构工具,得先理解代码;要想理解代码,得先用一个好的数据结构来存储和表示所读取的代码。基于程序代码本身的层次结构,用树状结构来表示是再好不过的了,微笑


       抽象语法树(Abstract Syntax Tree, AST)使用树状结构来表示源代码的抽象语法结构,树上的每一个节点都对应源代码中的一种结构,它作为程序代码的一种中间表示形式,在代码分析、代码重构、语言翻译等领域得到广泛的应用。现有的一些相关工具中,都会存在自行将源代码转换为抽象语法树的模块。至于将哪些语法节点进行转换,不同的工具会有不同的定义。

       在图1中,对于Java程序中一个for循环片段,使用抽象语法树进行简单的转换/分解,以便于大家可以简单直观地感受到抽象语法树中所展示的字、词、句、段、篇,图1的分解所依据的是Eclipse JDT中Eclipse AST对抽象语法树的定义。

图1 抽象语法树Java程序片段实例

       根据Eclipse AST的定义,图中每一个节点对应一个节点名,每一个子节点也在其依附的父节点中扮演着一个角色(身份),并且叶子节点基本为名称、操作符和字面量。表1给出了图1中的for循环节点(ForStatement)的四个子节点的节点名和依附于父节点的角色。

子节点

子节点名

依附于父节点的角色

 int i = 1

 VariableDeclarationExpression

INITIALIZERS 

i <= 10 

InfixExpression 

EXPRESSION 

 i++

 PostExpression

UPDATERS 

{

   count = count + 1;

}

Block 

BODY

       为了更直观地阅读和理解AST,可以使用ASTView等工具。ASTView(http://www.eclipse.org/jdt/ui/astview/)是一款Eclipse官方提供的抽象语法树浏览插件,可用来浏览Eclipse编辑器中的代码对应的抽象语法树。在官方网站下载插件后放入Eclipse安装目录下的dropins文件夹中(Eclipse 3.4 M3以下版本放入plugins文件夹中),打开Eclipse后在Window-Show View下找到ASTView点击(如图2),即可打开ASTView视图(如图3)。

图2 打开ASTView

 

图3 ASTView视图

        下面是一个完整的Java类的源代码: 

[java] view plain copy 在CODE上查看代码片派生到我的代码片
  1. package com.ast.usecase;  
  2.   
  3. public class ClassDemo {  
  4.   
  5.        private  String text = "Hello World!";  
  6.   
  7.        public  void print(int value) {  
  8.   
  9.               System.out.println(value);  
  10.   
  11.        }  
  12.   
  13. }  

       从ASTView的显示结果来看,这货生成的抽象语法树居然有32个节点!大笑

图4 ASTView显示结果

       ASTView中所展示的除了抽象语法树的节点外,还显示相关的属性,因此哪怕只是一个小而简单的类,一眼看遍整棵树还是不太现实的。

图5 ASTView常用功能按钮 

       图5是ASTView的一组常用功能按钮,从左到右依次为:

  • Show AST of active editor:展示编辑器光标当前所在位置的节点
  • Refresh AST:当编辑器中代码有所改动后,点击刷新抽象语法树
  • Clear AST and release memory:关闭当前抽象语法树的显示
  • Home:与Back和Go Into配合使用,返回全局根节点,查看子树
  • Back:与Home和Go Into配合使用,返回父节点,并以父节点为根节点,查看其子树
  • Go Into:与Home和Back配合使用,以当前所在节点为根节点,查看其子树
  • Expand Selected Node:展开当前所选节点,以查看其子节点
  • Collapse Selected Node:折叠当前所选节点
  • Link With Editor:关联ASTView与编辑器,动态显示光标所在的节点

       双击ASTView中的任一节点,可以在编辑器中看到对应的代码片段被高亮显示。配合以上功能按钮的使用能够非常直观、方便的浏览代码的抽象语法结构。

图6 ASTView双击节点高亮显示代码

       代码虽小,五脏俱全。图7是这个小而简单的类所包含的32个节点以节点名和节点内容的形式制作成的树状图【PS:韬韬童鞋画这个图可是费了大力气的,偷笑】,大家可以认真感受一下(对照源代码和抽象语法树)。

 

图7 示例类ClassDemo所对应的完整抽象语法树

       了解了抽象语法树和Java程序的语法结构后,接下来我们将学习如何使用Eclipse AST操作和生成Java源代码,欲知详情,请听下回分解!微笑

 

尊重原创:【本文作者:刘伟,刘宏韬  http://blog.csdn.NET/lovelion

仅供个人学习使用,如侵犯作者本人权益请联系我删除




推荐阅读
  • 使用eclipse创建一个Java项目的步骤
    本文介绍了使用eclipse创建一个Java项目的步骤,包括启动eclipse、选择New Project命令、在对话框中输入项目名称等。同时还介绍了Java Settings对话框中的一些选项,以及如何修改Java程序的输出目录。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了如何在给定的有序字符序列中插入新字符,并保持序列的有序性。通过示例代码演示了插入过程,以及插入后的字符序列。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 本文介绍了在MFC下利用C++和MFC的特性动态创建窗口的方法,包括继承现有的MFC类并加以改造、插入工具栏和状态栏对象的声明等。同时还提到了窗口销毁的处理方法。本文详细介绍了实现方法并给出了相关注意事项。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • C++字符字符串处理及字符集编码方案
    本文介绍了C++中字符字符串处理的问题,并详细解释了字符集编码方案,包括UNICODE、Windows apps采用的UTF-16编码、ASCII、SBCS和DBCS编码方案。同时说明了ANSI C标准和Windows中的字符/字符串数据类型实现。文章还提到了在编译时需要定义UNICODE宏以支持unicode编码,否则将使用windows code page编译。最后,给出了相关的头文件和数据类型定义。 ... [详细]
  • 本文讨论了如何使用IF函数从基于有限输入列表的有限输出列表中获取输出,并提出了是否有更快/更有效的执行代码的方法。作者希望了解是否有办法缩短代码,并从自我开发的角度来看是否有更好的方法。提供的代码可以按原样工作,但作者想知道是否有更好的方法来执行这样的任务。 ... [详细]
author-avatar
this_is_me活在自己小世界
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有