成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專(zhuān)欄INFORMATION COLUMN

Java代碼分析器(五): 語(yǔ)義分析簡(jiǎn)介

宋華 / 3742人閱讀

摘要:另載于本系列臨近尾聲,科技樹(shù)到此點(diǎn)滿(mǎn)。如果做插件,可以享受的語(yǔ)義分析能力。為了讓程序獨(dú)立運(yùn)行,我自己按需實(shí)現(xiàn)了語(yǔ)義分析。為了提速分析大型代碼庫(kù),可以手動(dòng)限制范圍。直接貼代碼了,已在項(xiàng)目提供。

另載于 http://www.qingjingjie.com/blogs/6

本系列臨近尾聲,科技樹(shù)到此點(diǎn)滿(mǎn)。

語(yǔ)法分析主要用庫(kù)解決了,代碼變成了一棵樹(shù),但是變量類(lèi)型,方法簽名之類(lèi)的東東都不清楚。

如果做IDE插件,可以享受IDE的語(yǔ)義分析能力。為了讓程序獨(dú)立運(yùn)行,我自己按需實(shí)現(xiàn)了語(yǔ)義分析。

比較復(fù)雜,就分享一種最典型的吧。貼代碼為主,有問(wèn)題請(qǐng)告訴我,我再改文章。

解析某個(gè)變量的聲明類(lèi)型,會(huì)上溯當(dāng)前方法和類(lèi),以及祖先類(lèi)。為了提速(分析大型代碼庫(kù)),可以手動(dòng)限制范圍。
直接貼代碼了,已在Exia項(xiàng)目提供。

public class VariableTypeResolver {
  private final String symbol;
  private final ASTNode minScope;

  private boolean methodLevel = true;
  private boolean typeLevel = true;
  
  /**
   * The found result
   */
  private SimpleName declSN;

  private final ASTVisitor visitor = new ASTVisitor() {
    @Override
    public boolean visit(SimpleName sn) {
      if (found()) {
        return false;
      }
      if (sn.getIdentifier().equals(symbol) && sn.getParent() instanceof VariableDeclaration) {
        declSN = sn;
        return false;
      }
      return true;
    }
  };
  
  /**
   * Starts resolving with the requested symbol
   * @param varSymbolNode the variable symbol node to resolve (node must be in the AST)
   */
  public VariableTypeResolver(SimpleName varSymbolNode) {
    this.symbol = varSymbolNode.getIdentifier();
    this.minScope = varSymbolNode;
  }
  
  public VariableTypeResolver(String varSymbol, ASTNode minScope) {
    this.symbol = varSymbol;
    this.minScope = minScope;
  }
  
  public VariableTypeResolver disableMethodLevel() {
    methodLevel = false;
    return this;
  }
  public VariableTypeResolver disableTypeLevel() {
    typeLevel = false;
    return this;
  }
  
  /**
   * Node"s parent is instance of {@link VariableDeclarationFragment} or {@link SingleVariableDeclaration}
   * @return the SimpleName node of declaration
   */
  public SimpleName resolveDeclSimpleName() {
    if (!found()) {
      resolve();
    }
    return declSN;
  }
  
  private void resolve() {
    if(found()) {return;}
    
    if (methodLevel) {
      apply(FindUpper.methodScope(minScope));
    }

    if(found()) {return;}
    
    if (typeLevel) {
      AbstractTypeDeclaration typeScope = FindUpper.abstractTypeScope(minScope);
      applyInFields(typeScope);

      if(found()) {return;}
      
      for (TypeDeclaration superClass : superClasses(typeScope)) {
        if(found()) {return;}
        applyInFields(superClass);
      }
    }
  }
  
  private boolean found() {
    return declSN != null;
  }

  private void apply(ASTNode scope) {
    if (scope == null) {
      throw new NullPointerException();
    }
    scope.accept(visitor);
  }

  private void applyInFields(AbstractTypeDeclaration typeScope) {
    for (Object bd : typeScope.bodyDeclarations()) {
      if (bd instanceof FieldDeclaration) {
        apply((ASTNode) bd);
      }
    }
  }
  
  private List superClasses(AbstractTypeDeclaration atd) {
    if (atd instanceof TypeDeclaration) {
      return AstUtils.superClasses((TypeDeclaration) atd);
    }
    else {
      return Collections.EMPTY_LIST;
    }
  }
}

它依賴(lài)的AstUtils, FindUpper, SourcePathCollector設(shè)施都在Exia里面,配合使用即可。https://github.com/sorra/exia

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64351.html

相關(guān)文章

  • 深入理解Java內(nèi)存模型()——鎖

    摘要:前情提要深入理解內(nèi)存模型四鎖的釋放獲取建立的關(guān)系鎖是并發(fā)編程中最重要的同步機(jī)制。鎖內(nèi)存語(yǔ)義的實(shí)現(xiàn)本文將借助的源代碼,來(lái)分析鎖內(nèi)存語(yǔ)義的具體實(shí)現(xiàn)機(jī)制。請(qǐng)看下篇深入理解內(nèi)存模型六 前情提要 深入理解Java內(nèi)存模型(四)—— volatile 鎖的釋放-獲取建立的happens before 關(guān)系 鎖是java并發(fā)編程中最重要的同步機(jī)制。鎖除了讓臨界區(qū)互斥執(zhí)行外,還可以讓釋放鎖的線(xiàn)程向...

    caige 評(píng)論0 收藏0
  • 論文簡(jiǎn)介-1

    摘要:論文一本體論在自動(dòng)問(wèn)答系統(tǒng)中的應(yīng)用駱正華基于本體來(lái)組織問(wèn)句的方法,并探討在基礎(chǔ)上分析問(wèn)句的方法,并利用本體向量來(lái)聯(lián)系問(wèn)句實(shí)例和領(lǐng)域知識(shí),達(dá)到問(wèn)題和答案的連接。領(lǐng)域具體事實(shí)知識(shí)的表示采用標(biāo)記規(guī)范,主題操作事件或業(yè)務(wù)實(shí)體描述或?qū)傩浴? 論文 一、本體論在自動(dòng)問(wèn)答系統(tǒng)中的應(yīng)用_駱正華 基于本體來(lái)組織問(wèn)句的方法,并探討在基礎(chǔ)上分析問(wèn)句的方法,并利用本體向量來(lái)聯(lián)系問(wèn)句實(shí)例和領(lǐng)域知識(shí),達(dá)到問(wèn)題和答...

    lyning 評(píng)論0 收藏0
  • JavaWEB開(kāi)發(fā)01——HTML

    摘要:網(wǎng)站信息頁(yè)面需求分析我們公司的需要一個(gè)對(duì)外宣傳的網(wǎng)站介紹介紹公司的主要業(yè)務(wù)公司的發(fā)展歷史公司的口號(hào)等等信息技術(shù)分析概述超文本標(biāo)記語(yǔ)言超文本比普通文本功能更加強(qiáng)大可以添加各種樣式標(biāo)記語(yǔ)言通過(guò)一組標(biāo)簽來(lái)對(duì)內(nèi)容進(jìn)行描述關(guān)鍵字是由瀏覽器來(lái)解釋執(zhí)行靜 1.網(wǎng)站信息頁(yè)面 1.1需求分析: 我們公司的需要一個(gè)對(duì)外宣傳的網(wǎng)站介紹,介紹公司的主要業(yè)務(wù),公司的發(fā)展歷史,公司的口號(hào)等等信息 1.2技術(shù)分析:...

    IntMain 評(píng)論0 收藏0
  • Java并發(fā)編程,3分分鐘深入分析volatile的實(shí)現(xiàn)原理

    摘要:一言以蔽之,被修飾的變量能夠保證每個(gè)線(xiàn)程能夠獲取該變量的最新值,從而避免出現(xiàn)數(shù)據(jù)臟讀的現(xiàn)象。為了實(shí)現(xiàn)內(nèi)存語(yǔ)義時(shí),編譯器在生成字節(jié)碼時(shí),會(huì)在指令序列中插入內(nèi)存屏障來(lái)禁止特定類(lèi)型的處理器重排序。volatile原理volatile簡(jiǎn)介Java內(nèi)存模型告訴我們,各個(gè)線(xiàn)程會(huì)將共享變量從主內(nèi)存中拷貝到工作內(nèi)存,然后執(zhí)行引擎會(huì)基于工作內(nèi)存中的數(shù)據(jù)進(jìn)行操作處理。 線(xiàn)程在工作內(nèi)存進(jìn)行操作后何時(shí)會(huì)寫(xiě)到主內(nèi)存中...

    番茄西紅柿 評(píng)論0 收藏0
  • Java并發(fā)編程,3分分鐘深入分析volatile的實(shí)現(xiàn)原理

    摘要:一言以蔽之,被修飾的變量能夠保證每個(gè)線(xiàn)程能夠獲取該變量的最新值,從而避免出現(xiàn)數(shù)據(jù)臟讀的現(xiàn)象。為了實(shí)現(xiàn)內(nèi)存語(yǔ)義時(shí),編譯器在生成字節(jié)碼時(shí),會(huì)在指令序列中插入內(nèi)存屏障來(lái)禁止特定類(lèi)型的處理器重排序。volatile原理volatile簡(jiǎn)介Java內(nèi)存模型告訴我們,各個(gè)線(xiàn)程會(huì)將共享變量從主內(nèi)存中拷貝到工作內(nèi)存,然后執(zhí)行引擎會(huì)基于工作內(nèi)存中的數(shù)據(jù)進(jìn)行操作處理。 線(xiàn)程在工作內(nèi)存進(jìn)行操作后何時(shí)會(huì)寫(xiě)到主內(nèi)存中...

    番茄西紅柿 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<