摘要:另載于本系列臨近尾聲,科技樹(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 ListsuperClasses(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
摘要:前情提要深入理解內(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)程向...
摘要:論文一本體論在自動(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)題和答...
摘要:網(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ù)分析:...
摘要:一言以蔽之,被修飾的變量能夠保證每個(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)存中...
摘要:一言以蔽之,被修飾的變量能夠保證每個(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)存中...
閱讀 3118·2021-11-18 10:02
閱讀 2627·2021-10-13 09:47
閱讀 3073·2021-09-22 15:07
閱讀 805·2019-08-30 15:43
閱讀 1821·2019-08-30 10:59
閱讀 1702·2019-08-29 15:34
閱讀 1713·2019-08-29 15:06
閱讀 453·2019-08-29 13:28