当前位置: 首页 > news >正文

学生做兼职去哪个网站军事新闻最新消息

学生做兼职去哪个网站,军事新闻最新消息,济南城市建设职业学院官网招生网,wordpress恶意验证码AST的修改主要包括三个方面的内容:修改节点、移动节点和创建节点。本文将通过一个综合实例来说明如何修改AST,并通过修改AST来修改源代码。图1 代码修改实例可以看到实例中的代码包含以下三种修改:(1) 条件表达式中的符号由等号改为不等号&am…

        AST的修改主要包括三个方面的内容:修改节点移动节点创建节点


       本文将通过一个综合实例来说明如何修改AST,并通过修改AST来修改源代码。

图1 代码修改实例

       可以看到实例中的代码包含以下三种修改:

       (1) 条件表达式中的符号由等号改为不等号;

       (2) 原有的then部分移动到else部分;

       (3) 创建新的then部分。

       在对AST进行修改之前,需要先了解Java语法和各AST节点的涵义。if语句在AST中对应的节点名为IfStatement;条件表达式可以通过getExpression()方法获得;then和else部分作为依附于IfStatement的两个角色分别为THEN_STATEMENT和ELSE_STATEMENT,可以通过getThenStatement()和getElseStatement()方法获得,对应的方法还有setThenStatement()和setElseStatement()。可以利用工具ASTView,了解源代码对应的AST结构。

       图2是修改前的AST,由于完整展示需要标明过多的节点而导致图变得非常复杂,因此下图仅展示跟本次代码修改相关的重要节点。(学习过前几篇AST文章的读者可以发现,这里用大写字母开头的短语表示节点名,而全大写的短语表示节点在父节点中的角色名

 图2 修改之前的AST


(1) 修改节点:条件表达式的符号由等号改为不等号

       实例中的条件表达式为中缀表达式,AST中对应的节点名为InfixExpression,所做的修改是将表达式的等号改为不等号。在修改时可以通过getExpression()方法获得表达式节点并进行强制类型转换(此处转为InfixExpression),转换后即可通过setOperator()方法修改操作符(Operator)。 

/** * fragment != null */InfixExpression ie = (InfixExpression)node.getExpression();ie.setOperator(Operator.NOT_EQUALS);

       此时AST被修改为如图3所示。

 图3 修改节点后的AST


(2) 移动节点:原有的then部分移动到else部分

       实例中if语句的then部分为语句块,AST中对应的节点名为Block,简单说就是带大括号的部分。现在我们要做的就是把if语句的这个Block节点从THEN_STATEMENT角色移动到ELSE_STATEMENT角色。在AST中,“移动”更准确的说是“复制”,“复制”之后把原有的部分使用delete()方法删除即可。

      那么是否可以直接通过如下代码来实现呢?

node.setElseStatement(node.getThenStatement());

       结果是不行的,抛出一个IllegalArgumentException异常,查看异常信息为“new child currently has a different parent”,类似的异常信息还有“new child is from a different AST”等。

       应当采用的方法是使用来自ASTNode类的copySubtree(AST target, ASTNode node)方法,意为将某一节点复制到某一AST,之后需经强制类型转换才可使用。

       通过copySubTree()方法产生与原父节点没有关联的独立节点,再将其连接到需要的节点上。对于本实例,正确方法如下:

/** * if (fragment == null) { *   System.out.println("Wrong!"); * } * else { *    System.out.println("Wrong!"); * } */node.setElseStatement((Block) ASTNode.copySubtree(node.getAST(),  node.getThenStatement()));

       此时AST被修改为图4所示。

 图4 移动节点后的AST

 

(3) 创建节点:创建新的then部分

       完成这一部分的工作需要借助上一篇文章的内容【【Eclipse AST】AST的创建】,需要注意的是:因为new***()方法是通过对ast的调用而来,因此需要先获得当前节点所在的ast对象;创建节点完成后,需要把新节点放回原有的AST中。 

/** * if (fragment == null) { *   System.out.println("Done!"); * } * else { *    System.out.println("Wrong!"); * } */AST ast = node.getAST();MethodInvocation methodInv = ast.newMethodInvocation();SimpleName nameSystem = ast.newSimpleName("System");SimpleName nameOut = ast.newSimpleName("out");SimpleName namePrintln = ast.newSimpleName("println");//连接‘System’和‘out’//System.outQualifiedName nameSystemOut = ast.newQualifiedName(nameSystem, nameOut);//连接‘System.out’和‘println’到MethodInvocation节点//System.out.println()methodInv.setExpression(nameSystemOut);methodInv.setName(namePrintln);//"Done!"StringLiteral sDone = ast.newStringLiteral();sDone.setEscapedValue("\"Done!\"");//System.out.println("Done!")methodInv.arguments().add(sDone);//将方法调用节点MethodInvocation连接为表达式语句ExpressionStatement的子节点//System.out.println("Done!");ExpressionStatement es = ast.newExpressionStatement(methodInv);//将表达式语句连接为新建语句块节点Block的子节点//{//System.out.println("Done!");//}Block block = ast.newBlock();block.statements().add(es);//将语句块节点Block连接为IfStatement节点的子节点node.setThenStatement(block);

        最终,AST被修改为图5所示:

图5 创建节点后的AST

        本实例完整代码如下:

import org.eclipse.jdt.core.dom.AST;import org.eclipse.jdt.core.dom.ASTNode;import org.eclipse.jdt.core.dom.ASTVisitor;import org.eclipse.jdt.core.dom.Block;import org.eclipse.jdt.core.dom.ExpressionStatement;import org.eclipse.jdt.core.dom.IfStatement;import org.eclipse.jdt.core.dom.InfixExpression;import org.eclipse.jdt.core.dom.InfixExpression.Operator;import org.eclipse.jdt.core.dom.MethodInvocation;import org.eclipse.jdt.core.dom.QualifiedName;import org.eclipse.jdt.core.dom.SimpleName;import org.eclipse.jdt.core.dom.StringLiteral;public class IfTransformer extends ASTVisitor {  @Override public boolean visit(IfStatement node) {  /**   * fragment != null   */  InfixExpression ie = (InfixExpression)node.getExpression();  ie.setOperator(Operator.NOT_EQUALS);    /**   * if (fragment == null) {   *   System.out.println("Wrong!");   * }   * else {   *    System.out.println("Wrong!");   * }   */  node.setElseStatement(    (Block) ASTNode.copySubtree(node.getAST(),  node.getThenStatement()));  /**   * if (fragment == null) {   *   System.out.println("Done!");   * }   * else {   *    System.out.println("Wrong!");   * }   */  AST ast = node.getAST();    MethodInvocation methodInv = ast.newMethodInvocation();  SimpleName nameSystem = ast.newSimpleName("System");  SimpleName nameOut = ast.newSimpleName("out");  SimpleName namePrintln = ast.newSimpleName("println");  //连接‘System’和‘out’  //System.out  QualifiedName nameSystemOut = ast.newQualifiedName(nameSystem, nameOut);  //连接‘System.out’和‘println’到MethodInvocation节点  //System.out.println()  methodInv.setExpression(nameSystemOut);  methodInv.setName(namePrintln);  //"Done!"  StringLiteral sDone = ast.newStringLiteral();  sDone.setEscapedValue("\"Done!\"");  //System.out.println("Done!")  methodInv.arguments().add(sDone);  //将方法调用节点MethodInvocation连接为表达式语句ExpressionStatement的子节点  //System.out.println("Done!");  ExpressionStatement es = ast.newExpressionStatement(methodInv);    //将表达式语句连接为新建语句块节点Block的子节点  //{  //System.out.println("Done!");  //}  Block block = ast.newBlock();  block.statements().add(es);    //将语句块节点Block连接为IfStatement节点的子节点  node.setThenStatement(block);  return false; }}

       

       至此,本实例全部介绍完毕,本文所介绍的流程是使用AST来实现代码重构的核心,在后续文章中还将结合一些重构实例进行深入学习。

 

本文作者:刘伟,刘宏韬  http://blog.csdn.net/lovelion

           

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

http://www.lbrq.cn/news/2514385.html

相关文章:

  • seo优化软件免费版seo的优点和缺点
  • 做标书的任务网站赣州seo公司
  • 电影采集网站怎么做中小型企业网站设计与开发
  • 企业建设网站对客户的好处做app的网站
  • 关于加强政府网站建设和管理工作的意见填写电话的广告
  • pc端网站生成wap版网络推广费用计入什么科目
  • 宁波外贸网站推广优化网页加速器
  • 网站开发团队奖惩成都网站seo技巧
  • 免费seo推广软件百度seo详解
  • 房地产项目网站建设中国企业500强排行榜
  • wordpress加载模板文件路径seo线下培训班
  • 做网站流程、网络营销和传统营销的区别有哪些
  • 惠州外包网站建设宁波seo自然优化技术
  • 求推荐专门做借条的网站开一个免费网站
  • 包头网站建设熊掌号网页设计制作网站html代码大全
  • 怎样免费做书画网站市场推广方案怎么做
  • 中国建设银行网站属于什么机构独立网站和平台网站
  • 如何代做网站引流推广神器
  • 做瞹瞹瞹视频网站网络营销的五大优势
  • 一品威客做任务要给网站钱吗seo团队管理系统
  • 有哪些做网站好的公司seo排名赚下载
  • wordpress网站底部导航代码培训心得总结怎么写
  • 如何开发手机版网站百度排行榜
  • 大淘客官网做的网站打不开金昌网站seo
  • 国外用tornado做的网站seo推广视频隐迅推专业
  • 建网站教程如何免费创建自己的平台
  • 网站建设图片怎么做合肥做网站哪家好
  • 专业网站的建设品牌营销推广
  • 长沙设计网站排名域名查询官网
  • 网站开发 安全合同seo网络优化前景怎么样
  • 【CSS】盒子类型
  • 泛微E9 引入高版本spring导致webservices接口报错
  • 博物馆 VR 导览:图形渲染算法+智能讲解技术算法实现及优化
  • AI论文阅读方法+arixiv
  • 【Zustand】从复杂到简洁:Zustand 状态管理简化实战指南
  • MCP资源管理深度实践:动态数据源集成方案