• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    基于語法和語義結(jié)合的源代碼精確搜索方法

    2017-12-14 05:22:20顧逸圣曾國蓀
    計算機應(yīng)用 2017年10期
    關(guān)鍵詞:語法結(jié)構(gòu)源代碼語義

    顧逸圣,曾國蓀

    (1.同濟大學 計算機科學及技術(shù)系,上海 200092; 2.嵌入式系統(tǒng)與服務(wù)計算教育部重點實驗室,上海 200092) (*通信作者電子郵箱qswy929@163.com)

    基于語法和語義結(jié)合的源代碼精確搜索方法

    顧逸圣1,2*,曾國蓀1

    (1.同濟大學 計算機科學及技術(shù)系,上海 200092; 2.嵌入式系統(tǒng)與服務(wù)計算教育部重點實驗室,上海 200092) (*通信作者電子郵箱qswy929@163.com)

    針對在編寫軟件、復(fù)用源代碼的過程中僅依靠關(guān)鍵詞無法精準搜索到適用源代碼的問題,提出一種將語法和語義結(jié)合的源代碼精準搜索方法。首先依據(jù)源代碼語法語義的客觀和唯一性,增加語法結(jié)構(gòu)和“輸入/輸出”語義作為用戶錄入請求的一部分,并規(guī)范了具體的請求格式;然后在此基礎(chǔ)上分別設(shè)計源代碼語法匹配算法、“輸入/輸出”語義匹配算法、關(guān)鍵詞兼容匹配,以及源代碼搜索結(jié)果可信度計算算法;最后綜合上述算法實現(xiàn)對源代碼的精準搜索。測試結(jié)果表明:與單純的關(guān)鍵詞搜索相比,提出的方法對搜索的平均排序倒數(shù)(MRR)有超過62%的提升,有助于實現(xiàn)源代碼的精準搜索。

    軟件編寫;源代碼復(fù)用;語法語義;匹配搜索

    0 引言

    在信息化時代,社會運作的方方面面都離不開軟件。在軟件編寫的過程中,大量的源代碼無疑是一筆筆寶貴的“財富”。為了盡可能利用這些“財富”,有人試圖將源代碼看作普通的文本,借助通用搜索引擎的技術(shù),建立基于關(guān)鍵詞的源代碼搜索引擎。這種方法技術(shù)成熟,實施成本低,但是基于關(guān)鍵詞的搜索方法最大的問題是結(jié)果不精確,這個問題在目前的源代碼搜索引擎中普遍存在:返回的結(jié)果中往往混雜著聲明、類定義等,造成用戶選擇困難。為此,學者們利用例如語法、語義等其他多種信息,開展開源代碼搜索,以提高搜索精度。

    在基于源代碼語法的搜索方面:Bajracharya等[1]將源代碼搜索從基于關(guān)鍵詞的全文搜索變?yōu)榛谠创a結(jié)構(gòu)的搜索,支持“細節(jié)搜索”,并將其分為“Components”“Component Use”等五類。Farah等[2]對源代碼搜索引擎Open Hub深入研究,總結(jié)出其本質(zhì)就是將搜索需求按函數(shù)、結(jié)構(gòu)體、類、接口等進行分類。以上方法對搜索內(nèi)容進行類別細分,但只是簡單根據(jù)代碼的組成并沒有實質(zhì)涉及語法的研究。Paul等[3]則進一步通過定義一系列的通配符,對C語言的語法集進行抽象形成代碼模式自動機(Code Pattern Automaton, CPA),通過解釋器進行匹配,充分展示了利用語法進行抽象搜索的可行性,然而此方法接收的通配符描述過于復(fù)雜,難以推廣。在基于源代碼語義的搜索方面:Hill等[4]提出的“自然語言源碼定位”可應(yīng)用于海量數(shù)據(jù),將源代碼中的變量名稱進行語義猜測,構(gòu)建一個包含海量源碼變量使用關(guān)系與詞素拓展集的數(shù)據(jù)庫。胡翔等[5]將Hill的方法運用于源代碼搜索,并結(jié)合傳統(tǒng)的程序分析技術(shù),提出一種海量源碼分析的新方法。孟驍[6]通過以語義網(wǎng)絡(luò)為文本關(guān)鍵字建立近義詞索引的方法,改善了代碼搜索問題中近義詞無法被關(guān)鍵字匹配的問題。上述方法增加了源代碼搜索輸入的容錯度,但是只是對其中某些元素的釋義,并沒有提取出源代碼蘊涵的功能語義。劉石等[7]利用“超鏈接引導(dǎo)的主題搜索”(Hyperlink-Induced Topic Search, HITS)算法分析技術(shù)對Java語言的代碼模型進行二次周游,從而實現(xiàn)了對搜索應(yīng)用程序編程接口(Application Programming Interface, API)實現(xiàn)代碼和調(diào)用代碼的區(qū)分、并從搜索結(jié)果摘要等方面進行了優(yōu)化。Keivanloo等[8]利用本體描述語言(Ontology Web Language, OWL)對面向?qū)ο蟮木幊陶Z言的各個屬性進行語義分析并建模,解決了搜索到的源代碼存在外部依賴關(guān)系從而不完整的問題。Stolee等[9-10]則提出了一種全新的基于“輸入/輸出”的源代碼搜索方式,編寫輕量級的需求描述作為輸入和期望的輸出并對其分析,將程序的語義與描述其行為的約束進行映射;因為其分析過程的復(fù)雜性,目前該方法還只是停留在理論階段。

    可見,借助于源代碼的語法或語義信息,搜索源代碼的方式能夠更加豐富,有助提高搜索的準確率。然而,縱觀上述研究,目前的研究多數(shù)只針對語法、語義的其中一個方面展開?,F(xiàn)階段將語法與語義相結(jié)合,共同運用于源代碼的搜索的工作現(xiàn)階段開展較少。本文擬將函數(shù)作為源代碼搜索的粒度,提取并利用函數(shù)源代碼的語法結(jié)構(gòu)和“輸入/輸出”語義信息進行搜索,通過語法和語義相結(jié)合的手段探索豐富源代碼搜索錄入形式、提高搜索精準度的途徑。

    1 源代碼語法和語義的客觀性

    源代碼是一段按照某種程序設(shè)計語言規(guī)范編寫的形式化文本,因此反映了該語言的特征。記源代碼L為三元組:L=(T,G,S)。其中:T是整個源代碼的文本;G是文本的語法規(guī)則;S是文本的語義規(guī)則。本章以C語言為例,說明源代碼的語法和語義的客觀性和唯一性。

    1.1 語法和語義的客觀性

    自然語言中,為了確保某個區(qū)域內(nèi)個體間信息交換的順暢進行,對于用來交流、接收和傳遞信息的字符串,必須遵守相同的一組規(guī)則[11],如漢語規(guī)則、英語規(guī)則等。類似地,為了使計算機能夠識別輸入的源代碼字符串,必須同樣對源代碼字符串的組成制定規(guī)則,這都屬于語法的范疇。

    源代碼的語法是指有一組規(guī)則,用其能夠形成和產(chǎn)生一個計算機程序。這組規(guī)則中包括了單詞符號的形成規(guī)則,以及如何從單詞符號形成表達式、語句、函數(shù)等語言規(guī)則。設(shè)s是程序設(shè)計語言源代碼中的某一句,則語法的客觀性體現(xiàn)在:?s((s∈T) ? ?!f(x)∧(f(s)∈G)),其中f(x)是一個從單詞符號串x到語言規(guī)則的映射。即每一條語句都能找到它對應(yīng)的語言規(guī)則。映射f實際中可以采用巴科斯范式(Backus-Naur Form, BNF)等形式表現(xiàn)。很難想象,僅僅幾十條BNF規(guī)則就可以描述所有C語言源代碼的語法。如C語言的賦值語句就可以表示為以下的BNF,通過它就能客觀確定所有賦值語句的操作。

    〈assignment_exp〉 ::=〈conditional_exp〉 | 〈unary_exp〉

    〈assignment_operator〉〈assignment_exp〉;

    〈assignment_operator〉 ::=′=′ | ′*=′ | ′/=′ | ′%=′ | ′+=′ | ′-=′| ′lt;lt;=′ | ′gt;gt;=′ | ′amp;=′ | ′^=′ | ′|=′

    源代碼的語義是指能夠用其定義源代碼的功能和意義的一組規(guī)則[12]。無論是源代碼執(zhí)行前還是執(zhí)行后的語義,都可以歸類在操作語義、指稱語義、公理語義之中。語義的客觀性可以從源代碼的功能、正確性等方面體現(xiàn)。例如對整型變量Y執(zhí)行“Y=5”這條賦值語句就可用操作語義“〈Y:=5,σ〉→σ′”表示,其中:σ表示的是狀態(tài)函數(shù),σ′表示執(zhí)行完賦值命令后的終態(tài)。執(zhí)行1到100整數(shù)求和的操作的語義正確性可以借助以下公理:“P:=0;I:=1 {P=0∧I=1} (while(I=101) doP:=P+I;I:=I+1)”驗證。

    1.2 語法和語義的唯一性

    每個人在世上都是唯一的個體,在思想、性格、行為等方面的不同造就了其個性。由于個性差異對于同一件事不同人有全然不同的處理方式:到達同一個目的地會選擇不同的出行方式;面對同樣的題目能夠?qū)懗霾煌奈恼碌?。為實現(xiàn)相同的功能,不同的程序員會有全然不同的編寫源代碼的方式。因為每條語句都可能有區(qū)別,源代碼這種近乎的唯一性也會傳遞到其中蘊涵的語法和語義的信息中,成為其相互區(qū)分的特征。如果認為不同的人很容易寫出兩段格式、變量、算法都一樣的源代碼,那就無異于忽略了人的個性因素。

    1.3 語法和語義在源代碼搜索中的用途

    源代碼語法和語義的客觀性和唯一性對于源代碼的搜索有很大的幫助。假設(shè)T1、T2是兩段源代碼文本,G°S(X)是對任意源代碼文本串X進行語法和語義分析后的結(jié)果,那么有:G°S(T1)=G°S(T2)→T1=T2。換而言之,對任意的源代碼都可以分析其蘊涵的語法和語義信息;通過這兩方面的信息,也可以唯一確定所需的源代碼,因而通過語法和語義信息來搜索源代碼理論上是可行的。本文的目的就是設(shè)計一種切實可行的方法以表達和分析這些信息,為搜索作鋪墊。特別說明的是,本文中的源代碼指的是“函數(shù)片段”,即一段完整的函數(shù)源代碼。

    2 用戶搜索錄入需求的描述

    2.1 用戶搜索請求表達的困難性

    雖然源代碼的語法和語義具有客觀性與唯一性,但正如人往往很難僅依靠語言或者文字表達自己的需求,同樣,對于某時某刻需要什么樣的源代碼,搜索者也是很難完全清楚地描述。在描述時,由于交互方式的局限,關(guān)鍵詞是一種為數(shù)不多的對文本信息的檢索手段,因此現(xiàn)今用戶采取錄入關(guān)鍵詞的方式提交搜索請求。單純的關(guān)鍵詞無法對問題精準描述,卻又沒有找到比之更簡單有效的方法,這正是目前用戶表達搜索請求的困難之處。

    2.2 關(guān)鍵詞搜索情況的特性分析

    傳統(tǒng)的利用關(guān)鍵詞對所需源代碼進行搜索,依靠的是關(guān)鍵詞中對語法和語義信息的部分表達,是模糊不完整的。用戶既不能準確地歸結(jié)出與所需源代碼密切相關(guān)的關(guān)鍵詞,依靠關(guān)鍵詞也多半不能獲取相關(guān)的源代碼。例如K={k1,k2,…,kn} 是在搜索某一源代碼時的一組關(guān)鍵詞,Rs為對應(yīng)的結(jié)果,Re為用戶期望的結(jié)果,C為閾值常量,則?K((Input(K)?|Rs|)∧(|Rs|∩|Re|lt;C)),且只是在不區(qū)分輸入順序的情況下返回n個關(guān)鍵詞的并集,這便暴露了傳統(tǒng)關(guān)鍵詞搜索的不精確性。進而,如果能在搜索時考慮到關(guān)鍵詞出現(xiàn)的位置及順序,以區(qū)分關(guān)鍵詞的重要程度,結(jié)合客觀的語法和語義,那么這種改進后的搜索將能大幅提升搜索的精準度。

    2.3 語法和語義搜索請求的表達法

    僅憑關(guān)鍵詞搜索源代碼依然難以表達用戶需求,搜索往往不精確,應(yīng)當增加一些請求表達的方式,以便用戶提供盡可能多的信息。本文提出一種將語法、語義、關(guān)鍵詞三者結(jié)合用于源代碼的搜索的方法。其中,關(guān)鍵詞搜索的形式用戶經(jīng)常接觸,不需要另行設(shè)計,而用戶對語法和語義的搜索表達形式則需特別交代。

    源代碼的語法信息包括多種,本文選擇結(jié)構(gòu)信息用以描述源代碼語法。其中,諸如抽象語法樹信息雖是在源代碼語法分析階段一一對應(yīng)生成,表示的結(jié)構(gòu)信息完備且不存在二義性,但是圖的結(jié)構(gòu)使其注定不滿足方便用戶錄入的要求。因而本文采取一種折中的方法,僅將源代碼中分支和循環(huán)結(jié)構(gòu)的描述作為用戶錄入的語法請求表達。用戶的請求可以分為兩種情形。第一種情形下用戶清楚所需函數(shù)源代碼的語法結(jié)構(gòu)及順序,此時定義符號“c:()”表示一個分支結(jié)構(gòu),“l(fā):()”表示一個循環(huán)結(jié)構(gòu)。用戶錄入這兩個符號的先后及嵌套順序就代表了源代碼中分支和循環(huán)的組成:如請求“l(fā):(c:())”就表示先出現(xiàn)循環(huán)并且其中嵌套一個分支,“l(fā):()c:()”表示先循環(huán),后跟隨一個分支。第二種情形下用戶只能提供每種結(jié)構(gòu)出現(xiàn)的數(shù)目,則可以分別錄入分支、循環(huán)等結(jié)構(gòu)的數(shù)目,來搜索所需的源代碼。這種以分支和循環(huán)結(jié)構(gòu)作為源代碼語法特征的方式,雖然不如語法樹那樣完備,比如無法表示代碼中的遞歸結(jié)構(gòu),但通過確定這兩種結(jié)構(gòu)的數(shù)目或者出現(xiàn)的順序及嵌套關(guān)系,都能輔助過濾過大量無關(guān)代碼,是一種利用語法信息提高搜索精準度的可行之策。

    同樣,源代碼的語義信息有多種,本文將代碼的“輸入/輸出”功能語義作為讓用戶錄入的語義信息。對函數(shù)參數(shù)表中的參數(shù)以及返回的參數(shù)的讀/寫通常反映了函數(shù)源代碼的功能,所以本文中將這些參數(shù)視為源代碼的“輸入/輸出”。在錄入請求的階段,用戶使用文本串對“輸入/輸出”的參數(shù)類型和名稱進行描述。定義語義請求為“itype1iname1,itype2iname2,…;otype oname”的形式,其中分號以左為函數(shù)接收的參數(shù)表,以右為函數(shù)的返回參數(shù)。type是“輸入/輸出”的參數(shù)類型,name是“輸入/輸出”參數(shù)名稱。特別地,當參數(shù)為空時,規(guī)定type和name均為void。這樣定義語義請求,形式上直觀全面地表達了“輸入/輸出”語義,用戶操作時錄入的難度也較低。不過參數(shù)的順序和數(shù)目是“輸入/輸出”語義重要特征,因而用戶在搜索錄入時要注意盡量精確描述請求中的每個參數(shù)及它們的次序,這些都可作為語義匹配的依據(jù)。

    2.4 用戶搜索錄入需求操作界面

    根據(jù)2.3節(jié)的討論,可以設(shè)計出圖1中的界面,等待用戶輸入源代碼搜索請求。按提示錄入了對所需源代碼的描述后,三個輸入框中的文本分別記作kquery、squery和ioquery,它們就構(gòu)成了用戶的請求表達語句,記作query。下一步的工作就將針對用戶在此提交的各項請求表達,分析源代碼中的對應(yīng)的信息,并按特定方法進行匹配。

    圖1 搜索請求錄入界面

    3 源代碼語法和語義的分析

    3.1 語法結(jié)構(gòu)信息分析算法

    在2.3節(jié)中明確了用戶通過“c:()”“l(fā):()”兩種符號的組合表示源代碼的語法結(jié)構(gòu)請求,那么在分析目標源代碼結(jié)構(gòu)時,一種自然而然的思想,就是分析其中表示結(jié)構(gòu)信息的保留字標志,將一段函數(shù)源代碼中分支和循環(huán)結(jié)構(gòu)信息的出現(xiàn)關(guān)系同樣利用上述兩種符號表達,形成語法結(jié)構(gòu)串。這樣在匹配時通過分別統(tǒng)計每一種符號出現(xiàn)的總數(shù),以及符號的先后順序、嵌套關(guān)系,比較所有的特征是否相符,就能夠判定用戶請求是否與當前源代碼相匹配。以分析對象是一段C語言的函數(shù)源代碼文件(用變量one_src_file)為例,算法1描述了對其進行語法結(jié)構(gòu)分析的整個過程。

    算法1 語法結(jié)構(gòu)信息分析匹配算法syntaxStructMatch。

    輸入 語法信息搜索錄入squery, 一段函數(shù)的源代碼文件one_src_file。

    輸出 源代碼文件是否語法結(jié)構(gòu)匹配True/False。

    syntaxStructMatch(squery,one_src_file)

    { if (isEmpty(squery))

    return True;

    //請求為空時直接返回“匹配”

    condition←{"if","else","case",…};

    //分支結(jié)構(gòu)保留字

    loop←{"for","do","while",…};

    //循環(huán)結(jié)構(gòu)保留字

    nest←{"{","}",…};

    //結(jié)構(gòu)嵌套保留字

    text←readSourceCode(one_src_file);

    struct←geneStructString(text,condition,loop,nest);

    //構(gòu)造用3.3節(jié)兩種符號表達的語法結(jié)構(gòu)串

    if (squery=struct)

    //源代碼文件與用戶語法搜索需求相同

    return True;

    //語法結(jié)構(gòu)匹配

    if (sameCount(squery,struct))

    //錄入的分支、循環(huán)的數(shù)目與目標相同

    return True;

    //近似認為語法結(jié)構(gòu)匹配

    else

    return False;

    //語法結(jié)構(gòu)不匹配

    }

    執(zhí)行算法1后,假設(shè)用戶錄入為“l(fā):(l:())”,則有且僅有雙重循環(huán)結(jié)構(gòu)的源代碼的分析結(jié)果為“l(fā):(l:())”,即與搜索匹配。若錄入的只是查找含有“2個循環(huán)”的源代碼,除了雙重循環(huán)的源代碼,單獨循環(huán)兩次的源代碼也會被判定為匹配,這在實際應(yīng)用過程中可能是合理的。

    3.2 “輸入/輸出”語義信息分析算法

    算法2 “輸入/輸出”的語義信息分析匹配算法inoutMatch。

    輸入 語義信息搜索錄入ioquery, 一段函數(shù)的源代碼文件one_src_file。

    輸出 函數(shù)名Fname,參數(shù)名Pname, 匹配度degree。

    inoutMatch(ioquery,one_src_file)。

    {line←readDefineLine(one_src_file);

    //讀取函數(shù)定義行

    Fname←wordSegment(line);

    //分詞后的函數(shù)名

    text←readSourceCode(one_src_file);

    〈Itype,Iname,otype,oname〉←getParaInfo(line,text);

    //獲取函數(shù)“輸入/輸出”參數(shù)的類型和名稱

    if (isEmpty(ioquery))

    degree←0;

    //輸入請求為空,degree為0

    else

    {inout←geneInoutString(Itype,Iname,otype,oname);

    //構(gòu)造同3.3節(jié)用戶語義請求形式的語義串

    //計算匹配度

    }

    Pname←Iname+{oname};

    returnFname,Pname,degree;

    }

    例如,用戶語義請求錄入為“int a, float b; int c”,而某段源代碼的語義串經(jīng)過分析為“byte a, float b; int c”,那么cioquery=cinout=3,u=2(float b和int c),n=3(a、b和c),t=2(float和int),degree為5/9。

    3.3 關(guān)鍵詞匹配及可信度計算

    算法2返回的源代碼三方面的語義信息,將會在關(guān)鍵詞匹配和代碼可信度計算中再次用到。本節(jié)引入3個匹配得分變量:fscore是錄入的關(guān)鍵詞和源代碼函數(shù)名的匹配得分,通過找出分詞后的用戶關(guān)鍵詞和函數(shù)名中的公共單詞,將這些單詞在兩者中的出現(xiàn)位次作為向量每一維的值,構(gòu)造成兩個向量,計算相似度而得。類似地,pscore是錄入的關(guān)鍵詞和源代碼參數(shù)名的匹配得分,利用分詞后的用戶關(guān)鍵詞、“輸入/輸出”參數(shù)名和兩者的公共單詞,構(gòu)造兩個向量,計算相似度而得。score則是總的可信度得分,由fscore、pscore、傳統(tǒng)的“詞頻-逆文檔頻率”(Term Frequency-Inverse Document Frequency, TF-IDF)關(guān)鍵詞全文匹配度[13]和之前求得的語義匹配度degree,四者的加權(quán)和構(gòu)成。這是一種將多方面的有效信息充分合理利用的手段。以一個源代碼文件one_src_file為對象,將關(guān)鍵詞匹配及可信度計算的過程在算法3中展現(xiàn)。

    算法3 可信度計算算法trustedScore。

    輸入 錄入的關(guān)鍵詞請求kquery、one_src_file、Fname、Pname、degree。

    輸出one_src_file的可信度score。

    trustedScore(kquery,one_src_file,Fname,Pname,degree)

    { if (isEmpty(kquery))

    //關(guān)鍵詞搜索請求為空

    {fscore←0,pscore←0;}

    else

    {Words←wordSegment(kquery);

    //析取出多個關(guān)鍵詞

    Fwords←{f|f∈Words∩Fname};

    //求關(guān)鍵詞和函數(shù)名中公共及匹配的單詞集合

    Pwords←{p|p∈Words∩Pname};

    //求關(guān)鍵詞和參數(shù)名中公共及匹配的單詞集合

    if (|Fwords|=1)

    else

    fscore←findSimilarity(Words,Fname,Fwords);

    //根據(jù)錄入關(guān)鍵詞和源代碼函數(shù)名計算匹配得分

    if (|Pwords|=1)

    else

    pscore←findSimilarity(Words,Pname,Pwords);

    //根據(jù)錄入關(guān)鍵詞和函數(shù)參數(shù)名計算匹配得分

    }

    score←a1*fscore+a2*pscore+

    a3*tf_idf(Words,one_scr_file)+a4*degree;

    // tf_idf():計算傳統(tǒng)的關(guān)鍵詞全文匹配度

    returnscore;

    }

    4 語法和語義結(jié)合的精確搜索算法

    4.1 搜索匹配原理及過程

    源代碼搜索的最終目的是滿足用戶需求,既然用戶在搜索時已經(jīng)提供了語法、語義和關(guān)鍵詞三方面的請求,那就應(yīng)該充分利用這些信息,匹配用戶的請求。整個源代碼精準搜索的過程如下:1)提取和過濾用戶的搜索請求,進行預(yù)處理,分別形成對應(yīng)的規(guī)范格式。2)進行語法精確匹配:源代碼語法結(jié)構(gòu)信息可以精確獲取,因此可以精確匹配用戶的語法要求,只有當源代碼的語法結(jié)構(gòu)完全符合用戶搜索時提供的語法要求,這樣的源代碼才是有效的,特別用戶搜索時提供的語法要求為“空”時,則認為任何源代碼都是有效的。如果語法匹配失敗,則此次源代碼搜索失敗、結(jié)束。3)進行語義近似匹配:正如3.2節(jié)所述,源代碼的語義信息很難精確獲取,所以只能用語義匹配度來近似。本文通過分析源代碼隱含的輸入、輸出變量特征,比較匹配用戶搜索時提供的輸入、輸出請求,顯然匹配度高對應(yīng)的源代碼更符合用戶要求。4)進行關(guān)鍵字匹配,獲得本次搜索源代碼的可信度分值,為大量搜索結(jié)果排序提高了依據(jù)。關(guān)鍵字匹配過程一方面利用第2)~3)步的語法、語義匹配的結(jié)果,提高了搜索的精度,另一方面也可兼容傳統(tǒng)搜索引擎的方法。5)重復(fù)第2)~4)步,直至搜索了規(guī)定個數(shù)的源代碼文件,可信度高的源代碼文件排在前面。

    4.2 搜索算法

    用戶通過圖1界面錄入了請求表達式后,根據(jù)4.1節(jié)的匹配原理,利用算法4“搜索精化算法”,即可更精確地返回滿足用戶需求的函數(shù)源代碼。特別地,該算法能夠根據(jù)給定的值設(shè)置限制搜索的代碼數(shù)量,以防搜索時間過長。

    算法4 搜索精化算法searchRefine。

    輸入 用戶錄入搜索請求query, 待搜索的源代碼庫src_code_database, 限制搜索的代碼個數(shù)n_max。

    輸出 符合條件的函數(shù)源代碼文件集合Ok_files。

    searchRefine(query,src_code_database,n_max)

    {Rfiles←?,Rscores←?;

    //記錄待排序文件及得分的有序集

    searchCount←0;

    //已搜索的次數(shù)

    kquery←getKquery(query);

    //獲取預(yù)處理后的關(guān)鍵詞

    squery←getSquery(query);

    //獲取錄入的語法請求表達式

    ioquery←getIOquery(query);

    //獲取錄入的語義請求表達式

    if (isEmpty(query))

    //用戶請求全空

    {Ok_files←random(src_code_database,n_max);

    //隨機返回若干文件

    returnOk_files;

    }

    while (one_src_file←nextFile(src_code_database) and

    searchCount≤n_max)

    { if (syntaxStructMatch(squery,one_src_file))

    //算法1 語法結(jié)構(gòu)分析匹配

    { 〈Fname,Pname,degree〉

    ←inoutMatch(ioquery,one_src_file);

    //算法2 語義信息分析匹配

    Rscores←Rscores+{trustedScore(kquery,one_src_file,

    Fname,Pname,degree)};

    //算法3 可信度計算

    Rfiles←Rfiles+{one_src_file};

    //記錄對應(yīng)的文件

    }

    searchCount←searchCount+1;

    }

    Ok_files←sortByScore(Rfiles,Rscores);

    //根據(jù)可信度的降序,返回結(jié)果文件集合

    returnOk_files;

    }

    5 搜索測試及分析

    5.1 測試環(huán)境

    關(guān)于測試的硬件環(huán)境,使用的計算機的CPU為2.7 GHz Intel Core i5,內(nèi)存為8 GB。在軟件方面,進行測試前編寫了Java程序,接收用戶的語法、語義和關(guān)鍵詞請求,將用戶的關(guān)鍵詞請求轉(zhuǎn)發(fā)到SearchCode源代碼搜索引擎,把前100項結(jié)果對應(yīng)的源文件保存到本地,按函數(shù)為粒度拆分后進一步調(diào)用算法4的Java實現(xiàn)版本進行搜索排序,并在最后以函數(shù)為粒度返回結(jié)果。

    5.2 測試用例

    本文將搜索表1中常見的5種算法的C語言代碼作為測試的用例。測試分為兩組:第一組在SearchCode引擎中錄入表1的關(guān)鍵詞部分進行搜索;第二組使用5.1節(jié)編寫的程序,除了利用相同的關(guān)鍵詞,同時加入每個算法用例可能包含的語法結(jié)構(gòu)和“輸入/輸出”語義的描述信息。程序中進行可信度計算時的權(quán)值(a1,a2,a3,a4)=(0.3, 0.15, 0.25, 0.3),根據(jù)每一項的重要程度按經(jīng)驗設(shè)置;限制搜索的代碼個數(shù)n_max設(shè)置為100。對于兩組的返回結(jié)果,通過統(tǒng)計首條與搜索請求相關(guān)結(jié)果的排名,并對5次搜索的平均排序倒數(shù)(Mean Reciprocal Rank, MRR)[14]進行計算,來衡量搜索的精準程度。

    表1 搜索測試用例

    5.3 結(jié)果分析

    圖2為各個用例的搜索測試結(jié)果??梢钥闯鱿鄬τ诘谝唤M,第二組中有4個用例的首條相關(guān)結(jié)果的排名更靠前,一個用例排名持平。分別記兩組的MRR為MRR1和MRR2,通過圖2的排名計算可得MRR1=0.378 5,MRR2=0.616 7。測試中本文算法對該指標有超過62%的提升。

    圖2 搜索測試的排名結(jié)果

    進一步以用例1為例,列出第二組測試中返回的前10項函數(shù)結(jié)果、對應(yīng)的可信度,以及在SearchCode中的原始排名(通過在其搜索頁面錄入關(guān)鍵詞,并篩選C語言源代碼后獲得),見表2。

    經(jīng)過統(tǒng)計,排名前10的結(jié)果中只有4條結(jié)果同樣在SearchCode中排在前十,其余都是原先排名靠后的結(jié)果。但通過分析這些結(jié)果的源代碼發(fā)現(xiàn),它們又的確都是和用戶搜索需求高度匹配的,反而是在原始排名的前十項中包含了與請求無關(guān)的信息。究其原因,不外乎是在SearchCode引擎中單單錄入關(guān)鍵詞不能利用到源代碼蘊含的語法和語義信息,導(dǎo)致搜索的不精準,而本文結(jié)合了源代碼語法和語義的方法則改善了這一問題。測試結(jié)果說明:利用了源代碼語法、語義信息搜索得到的結(jié)果更準確可信。

    表2 第二組測試中用例1的詳細結(jié)果

    6 結(jié)語

    當前,每天都會產(chǎn)生無數(shù)的源代碼,人們對搜索源代碼的需求愈發(fā)渴望,然而目前基于單純關(guān)鍵詞的搜索卻無法達到精準搜索。本文提出了一種基于語法和語義結(jié)合的源代碼精確搜索方法。該方法通過利用源代碼本身的語法和語義信息,接收經(jīng)過設(shè)計的用戶語法結(jié)構(gòu)信息、“輸入/輸出”語義信息及關(guān)鍵詞搜索請求表達式,分別提出了相應(yīng)的算法將用戶的請求與源代碼進行匹配、計算可信度,并最終按可信度排序。對于相同的測試對象,將本文方法與單純的關(guān)鍵詞搜索比較,MRR指標提升顯著,且排名靠前的那些源代碼確為所需,以此驗證了方法的可行性。當然,源代碼的語法和語義信息類型有很多,本文對于源代碼其他方面的語法語義尚未充分發(fā)掘。下一步的研究工作將是對源代碼中相關(guān)更深層次的信息的挖掘和利用。

    References)

    [1] BAJRACHARYA S, NGO T, LINSTEAD E, et al. Sourcerer: a search engine for open source code supporting structure-based search [C]// OOPSLA 2006: Companion To the 21st ACM SIGPLAN Symposium on Object-Oriented Programming Systems, Languages, and Applications. New York: ACM, 2006: 681-682.

    [2] FARAH G, TEJADA J S, CORREAL D. OpenHub: a scalable architecture for the analysis of software quality attributes [C]// MSR 2014: Proceedings of the 11th Working Conference on Mining Software Repositories. New York: ACM, 2014: 420-423.

    [3] PAUL S, PRAKASH A. A framework for source code search using program patterns[J]. IEEE Transactions on Software Engineering, 1994, 20(6): 463-475.

    [4] HILL E, POLLOCK L, VIJAY-SHANKER K. Improving source code search with natural language phrasal representations of method signatures [C]// ASE 2011: Proceedings of the 2011 26th IEEE/ACM International Conference on Automated Software Engineering. Washington, DC: IEEE Computer Society, 2011: 524-527.

    [5] 胡翔, 舒禮蓮. 基于語義網(wǎng)絡(luò)的海量源代碼搜索引擎[J]. 計算機與現(xiàn)代化, 2014, 30(7): 19-23. (HU X, SHU L L. Search engine of massive source code based on semantic network[J]. Computer and Modernization, 2014, 30(7): 19-23.)

    [6] 孟驍. 基于語義網(wǎng)絡(luò)的智能搜索引擎研究[D]. 長春: 東北師范大學, 2011. (MENG X. Research of intelligent search engine based on semantic Web[D]. Changchun: Northeast Normal University, 2011.)

    [7] 劉石, 李合, 王嘯吟, 等. 基于語法與語義分析的代碼搜索結(jié)果優(yōu)化[J]. 計算機科學, 2009, 32(8): 165-168. (LIU S, LI H, WANG X Y, et al. Enhancement of code search results using syntax and semantic analysis[J]. Computer Science, 2009, 32(8): 165-168.)

    [8] KEIVANLOO I, ROOSTAPOUR L, SCHUGERL P, et al. SE-CodeSearch: a scalable semantic Web-based source code search infrastructure [C]// ICSM 2010: Proceedings of the 2010 26th IEEE International Conference on Software Maintenance. Piscataway, NJ: IEEE, 2010: 1-5.

    [9] STOLEE K T, ELBAUM S, DOBOS D. Solving the search for source code[J]. ACM Transactions on Software Engineering and Methodology, 2014, 23(3): 26-26.

    [10] STOLEE K T, ELBAUM S, DWYER M B, et al. Code search with input/output queries: generalizing, ranking, and assessment[J]. Journal of Systems and Software, 2016, 116(6): 35-48.

    [11] 滿海霞, 梁雅夢. 喬姆斯基層級與自然語言語法——從短語結(jié)構(gòu)語法到非轉(zhuǎn)換語法[J]. 外國語文, 2015, 31(3): 84-89. (MAN H X, LIANG Y M. Chomsky hierarchy and natural language grammars: from phrase structure grammar to non-transformational grammar[J]. Foreign Language and Literature, 2015, 31(3): 84-89.)

    [12] 陳火旺. 程序設(shè)計語言編譯原理[M]. 北京: 國防工業(yè)出版社, 2000. (CHEN H W. Programming Language and Compile Principles[M]. Beijing: National Defense Industry Press, 2000.)

    [13] RAJESHWARKAR A, NAGORI M. Optimizing search results using Wikipedia based ESS and enhanced TF-IDF approach[J]. International Journal of Computer Applications, 2016, 144(12): 23-28.

    [14] FREITAS A, OLIVEIRA J G, ORIAIN S, et al. Querying linked data using semantic relatedness: a vocabulary independent approach [C]// NLDB 2011: Proceedings of the 16th International Conference on Application of Natural Language to Information Systems. Berlin: Springer, 2011: 40-51.

    Accuratesearchmethodforsourcecodebycombiningsyntacticandsemanticqueries

    GU Yisheng1,2*, ZENG Guosun1

    (1.DepartmentofComputerScienceandTechnology,TongjiUniversity,Shanghai200092,China;2.EmbeddedSystemandServiceComputingKeyLaboratoryofMinistryofEducation,Shanghai200092,China)

    In the process of programming and source code reuse, since simple keyword-based code search often leads to inaccurate results, an accurate search method for source code was proposed. Firstly, according to the objectivity and uniqueness of syntax and semantics, the syntactic structure and semantics of I/O of a function in source code were considered as part of a query. Such query should be submitted following a regularized format. Secondly, the syntactic structure, semantics of I/O, keyword-compatible match algorithms along with the reliability calculation algorithm were designed. Finally, the accurate search method by combining syntactic and semantic queries was realized by using the above algorithms. The test result shows that the proposed method can improve Mean Reciprocal Rank (MRR) by more than 62% compared with the common keyword-based search method, and it is effective in improving the accuracy of source code search.

    software programming; source code reuse; syntax and semantics; matching search

    2017- 04- 21;

    2017- 06- 09。

    上海市優(yōu)秀學科帶頭人計劃項目(10XD1404400);同濟大學實驗教改項目(0800104214)。

    顧逸圣(1992—),男,上海人,碩士研究生,主要研究方向:軟件工程、代碼搜索; 曾國蓀(1964—),男,江西吉安人,教授,博士,博士生導(dǎo)師,主要研究方向:并行計算、可信軟件、信息安全。

    1001- 9081(2017)10- 2958- 06

    10.11772/j.issn.1001- 9081.2017.10.2958

    TP311.1

    A

    This work is partially supported by the Program of Shanghai Subject Chief Scientist (10XD1404400), the Experimental Teaching Reform Project of Tongji University (0800104214).

    GUYisheng, born in 1992, M. S. candidate. His research interests include software engineering, source code search.

    ZENGGuosun, born in 1964, Ph. D., professor. His research interests include parallel computing, trusted computing, information security.

    猜你喜歡
    語法結(jié)構(gòu)源代碼語義
    人工智能下復(fù)雜軟件源代碼缺陷精準校正
    計算機仿真(2023年8期)2023-09-20 11:23:42
    基于TXL的源代碼插樁技術(shù)研究
    語言與語義
    軟件源代碼非公知性司法鑒定方法探析
    長沙方言中的特色詞尾
    青春歲月(2016年22期)2016-12-23 23:19:50
    淺析古代漢語的名詞動用
    青春歲月(2016年21期)2016-12-20 11:20:50
    培養(yǎng)閱讀技巧,提高閱讀能力
    考試周刊(2016年34期)2016-05-28 14:39:52
    “上”與“下”語義的不對稱性及其認知闡釋
    揭秘龍湖產(chǎn)品“源代碼”
    大學英語B級等級考試詞匯用法和語法結(jié)構(gòu)解題技巧
    男人操女人黄网站| 亚洲自偷自拍图片 自拍| 超碰97精品在线观看| 精品人妻一区二区三区麻豆| 大型av网站在线播放| 精品国产一区二区久久| 久久人人爽av亚洲精品天堂| 韩国高清视频一区二区三区| 久久久欧美国产精品| 大型av网站在线播放| 亚洲精品乱久久久久久| 一本综合久久免费| 久久久国产欧美日韩av| 国产有黄有色有爽视频| 中文精品一卡2卡3卡4更新| 精品久久久精品久久久| 亚洲精品一区蜜桃| 大香蕉久久网| 老司机午夜十八禁免费视频| 黑人欧美特级aaaaaa片| 丰满饥渴人妻一区二区三| 国产精品久久久人人做人人爽| 亚洲欧美一区二区三区黑人| 桃花免费在线播放| 两性午夜刺激爽爽歪歪视频在线观看 | 嫩草影视91久久| 亚洲成av片中文字幕在线观看| av超薄肉色丝袜交足视频| 久久久久国产一级毛片高清牌| 精品国产国语对白av| 亚洲三区欧美一区| 国产一区二区三区综合在线观看| 久久精品成人免费网站| 丰满迷人的少妇在线观看| 九色亚洲精品在线播放| 1024香蕉在线观看| 亚洲五月婷婷丁香| 久久久久久久精品精品| 激情视频va一区二区三区| 一区二区日韩欧美中文字幕| 又大又爽又粗| 久久久久久久久免费视频了| 午夜精品国产一区二区电影| 久久久国产精品麻豆| 男人操女人黄网站| 久久精品国产综合久久久| 久久久久久久国产电影| 美女脱内裤让男人舔精品视频| 久久久精品国产亚洲av高清涩受| 一本大道久久a久久精品| 久久久国产欧美日韩av| 狠狠狠狠99中文字幕| 国产成人欧美在线观看 | 高潮久久久久久久久久久不卡| 天堂俺去俺来也www色官网| 1024香蕉在线观看| 别揉我奶头~嗯~啊~动态视频 | 丝袜美腿诱惑在线| 一级片'在线观看视频| 亚洲va日本ⅴa欧美va伊人久久 | 欧美黄色淫秽网站| 国产在视频线精品| videos熟女内射| 国产av精品麻豆| 日本wwww免费看| 丝袜美足系列| 精品一区二区三卡| 这个男人来自地球电影免费观看| 午夜免费鲁丝| 久久久久久久国产电影| 免费观看人在逋| 一本色道久久久久久精品综合| 日韩免费高清中文字幕av| 男女午夜视频在线观看| cao死你这个sao货| 亚洲国产精品一区三区| 国产欧美日韩一区二区三区在线| 90打野战视频偷拍视频| 极品人妻少妇av视频| 王馨瑶露胸无遮挡在线观看| 一个人免费看片子| 国产亚洲精品久久久久5区| 国产成人欧美在线观看 | 午夜日韩欧美国产| 美女中出高潮动态图| 亚洲欧美精品自产自拍| 免费久久久久久久精品成人欧美视频| 在线观看www视频免费| 一本一本久久a久久精品综合妖精| 在线观看免费日韩欧美大片| 中文字幕高清在线视频| 极品少妇高潮喷水抽搐| 母亲3免费完整高清在线观看| 男女高潮啪啪啪动态图| 少妇粗大呻吟视频| 久久人妻熟女aⅴ| 亚洲avbb在线观看| 国产无遮挡羞羞视频在线观看| 91精品三级在线观看| 精品熟女少妇八av免费久了| 国产在视频线精品| a级片在线免费高清观看视频| 国产精品偷伦视频观看了| 高清在线国产一区| 999久久久国产精品视频| 国产免费现黄频在线看| 各种免费的搞黄视频| 男人爽女人下面视频在线观看| 久久精品aⅴ一区二区三区四区| a级毛片在线看网站| 亚洲av电影在线观看一区二区三区| 蜜桃国产av成人99| 中文字幕另类日韩欧美亚洲嫩草| 777米奇影视久久| 在线观看免费高清a一片| 亚洲欧美激情在线| 久久影院123| www.精华液| 精品第一国产精品| 9热在线视频观看99| 中文字幕制服av| 国产精品二区激情视频| 国产黄色免费在线视频| 成人三级做爰电影| 午夜日韩欧美国产| 自线自在国产av| 在线天堂中文资源库| 国产黄频视频在线观看| av视频免费观看在线观看| 日本精品一区二区三区蜜桃| 1024视频免费在线观看| 制服诱惑二区| 色94色欧美一区二区| 国产免费福利视频在线观看| 亚洲一码二码三码区别大吗| 亚洲av男天堂| 在线观看舔阴道视频| av在线app专区| 老汉色av国产亚洲站长工具| 电影成人av| 在线av久久热| 亚洲欧美日韩高清在线视频 | av天堂久久9| 在线十欧美十亚洲十日本专区| 无遮挡黄片免费观看| 亚洲av日韩精品久久久久久密| av超薄肉色丝袜交足视频| svipshipincom国产片| 国产日韩欧美视频二区| 亚洲国产看品久久| 美女高潮喷水抽搐中文字幕| 久久人妻福利社区极品人妻图片| 热99re8久久精品国产| 自拍欧美九色日韩亚洲蝌蚪91| 一本大道久久a久久精品| 纯流量卡能插随身wifi吗| 少妇精品久久久久久久| 国产三级黄色录像| 亚洲人成电影免费在线| 两个人看的免费小视频| 亚洲精品第二区| 午夜影院在线不卡| 在线观看一区二区三区激情| 天天操日日干夜夜撸| 女人精品久久久久毛片| 美女福利国产在线| 亚洲欧美精品综合一区二区三区| 在线亚洲精品国产二区图片欧美| 1024香蕉在线观看| 亚洲精品自拍成人| 日韩中文字幕视频在线看片| 女人爽到高潮嗷嗷叫在线视频| 丝瓜视频免费看黄片| 一本一本久久a久久精品综合妖精| 美女大奶头黄色视频| 久久久国产一区二区| 王馨瑶露胸无遮挡在线观看| 午夜两性在线视频| 久久天堂一区二区三区四区| 中国美女看黄片| 国产精品亚洲av一区麻豆| 亚洲av成人一区二区三| 丝袜脚勾引网站| 午夜免费观看性视频| 国产免费现黄频在线看| 中文欧美无线码| av天堂久久9| 午夜福利视频精品| 在线亚洲精品国产二区图片欧美| 欧美午夜高清在线| 欧美精品一区二区免费开放| 午夜久久久在线观看| 99久久综合免费| 老熟女久久久| 精品国产一区二区三区久久久樱花| 啪啪无遮挡十八禁网站| 两性夫妻黄色片| 多毛熟女@视频| 中文字幕高清在线视频| 999久久久精品免费观看国产| 人妻 亚洲 视频| 亚洲黑人精品在线| 大码成人一级视频| 男男h啪啪无遮挡| 性色av一级| 一二三四社区在线视频社区8| 色精品久久人妻99蜜桃| 各种免费的搞黄视频| 久久青草综合色| 蜜桃国产av成人99| 国产av精品麻豆| 最黄视频免费看| 啦啦啦视频在线资源免费观看| 国产亚洲一区二区精品| 久久av网站| 国产av又大| 脱女人内裤的视频| av线在线观看网站| 亚洲精品美女久久av网站| 一区二区三区精品91| www.熟女人妻精品国产| 不卡一级毛片| 国产精品九九99| 别揉我奶头~嗯~啊~动态视频 | av在线老鸭窝| 男女下面插进去视频免费观看| 最新在线观看一区二区三区| 男男h啪啪无遮挡| 无遮挡黄片免费观看| 最近最新中文字幕大全免费视频| 人妻久久中文字幕网| 欧美日韩国产mv在线观看视频| 成人国产一区最新在线观看| videosex国产| 天天操日日干夜夜撸| 国产激情久久老熟女| 五月天丁香电影| 久久精品aⅴ一区二区三区四区| 黄片大片在线免费观看| 搡老乐熟女国产| 国产精品久久久久久精品古装| 色94色欧美一区二区| 在线观看免费午夜福利视频| 天堂8中文在线网| 久久久久久久国产电影| 国产在线免费精品| 视频区图区小说| 99国产精品一区二区三区| 日韩电影二区| 免费人妻精品一区二区三区视频| 视频在线观看一区二区三区| 亚洲精品乱久久久久久| 免费在线观看视频国产中文字幕亚洲 | 久久国产精品男人的天堂亚洲| 久久久久国内视频| 丰满迷人的少妇在线观看| 日韩中文字幕欧美一区二区| 久久精品熟女亚洲av麻豆精品| 欧美精品人与动牲交sv欧美| 夫妻午夜视频| 日韩一区二区三区影片| 亚洲人成77777在线视频| 免费不卡黄色视频| 不卡av一区二区三区| 欧美97在线视频| 又大又爽又粗| 咕卡用的链子| tube8黄色片| 啪啪无遮挡十八禁网站| 伦理电影免费视频| 亚洲午夜精品一区,二区,三区| 午夜福利一区二区在线看| 国产欧美日韩综合在线一区二区| 亚洲欧美清纯卡通| av在线app专区| 99国产精品一区二区蜜桃av | 久久女婷五月综合色啪小说| 99久久国产精品久久久| 中文字幕av电影在线播放| 18禁观看日本| 免费高清在线观看日韩| 久久香蕉激情| 国产精品欧美亚洲77777| 国产一区二区在线观看av| 国产亚洲精品一区二区www | 亚洲精品久久午夜乱码| 嫩草影视91久久| 欧美日韩中文字幕国产精品一区二区三区 | 我的亚洲天堂| 男女午夜视频在线观看| 久久久久久久久久久久大奶| 亚洲情色 制服丝袜| 久久人人97超碰香蕉20202| 最近最新免费中文字幕在线| 久久国产精品人妻蜜桃| 在线亚洲精品国产二区图片欧美| 亚洲一码二码三码区别大吗| 黄色怎么调成土黄色| 飞空精品影院首页| cao死你这个sao货| 午夜福利视频精品| 蜜桃在线观看..| 亚洲av男天堂| 一边摸一边做爽爽视频免费| 免费在线观看完整版高清| 色婷婷av一区二区三区视频| 国产精品一二三区在线看| 国产一区二区三区在线臀色熟女 | 国产精品熟女久久久久浪| 日韩精品免费视频一区二区三区| 这个男人来自地球电影免费观看| 啦啦啦在线免费观看视频4| 久久久国产欧美日韩av| 日韩大码丰满熟妇| 99久久99久久久精品蜜桃| avwww免费| 国产精品成人在线| 9191精品国产免费久久| 午夜福利乱码中文字幕| 免费观看a级毛片全部| 国产精品久久久久成人av| 在线永久观看黄色视频| 久久香蕉激情| 五月天丁香电影| 一二三四社区在线视频社区8| 十分钟在线观看高清视频www| av不卡在线播放| 一二三四社区在线视频社区8| 一本—道久久a久久精品蜜桃钙片| 国产精品熟女久久久久浪| 久久久欧美国产精品| 久久久久久亚洲精品国产蜜桃av| 水蜜桃什么品种好| 国产在线视频一区二区| 极品人妻少妇av视频| 少妇 在线观看| 视频区欧美日本亚洲| 在线av久久热| 国产亚洲av高清不卡| av有码第一页| 91大片在线观看| 日本五十路高清| 亚洲精品日韩在线中文字幕| 美女扒开内裤让男人捅视频| 久久久久久人人人人人| 伊人亚洲综合成人网| 亚洲av电影在线观看一区二区三区| 亚洲精品中文字幕在线视频| 成人免费观看视频高清| 色综合欧美亚洲国产小说| 国产亚洲一区二区精品| 成人免费观看视频高清| 国产片内射在线| 亚洲专区中文字幕在线| a级毛片在线看网站| 久久精品国产综合久久久| 国产亚洲精品第一综合不卡| av超薄肉色丝袜交足视频| 9191精品国产免费久久| 亚洲成人国产一区在线观看| 欧美精品一区二区免费开放| 亚洲中文日韩欧美视频| 日本精品一区二区三区蜜桃| 国产区一区二久久| 日韩中文字幕欧美一区二区| 国产男女超爽视频在线观看| 国产一区二区 视频在线| 成年动漫av网址| 日韩有码中文字幕| 色老头精品视频在线观看| 久久久水蜜桃国产精品网| 精品欧美一区二区三区在线| 999久久久精品免费观看国产| 中文字幕另类日韩欧美亚洲嫩草| 精品第一国产精品| 精品人妻1区二区| 1024视频免费在线观看| 久久国产亚洲av麻豆专区| 欧美在线黄色| 两性夫妻黄色片| 日韩免费高清中文字幕av| 欧美激情 高清一区二区三区| 国产一区有黄有色的免费视频| 性色av乱码一区二区三区2| 男女国产视频网站| 韩国精品一区二区三区| 欧美亚洲 丝袜 人妻 在线| 精品少妇久久久久久888优播| 一级黄色大片毛片| 成人免费观看视频高清| 三级毛片av免费| 美女福利国产在线| 国产不卡av网站在线观看| 在线av久久热| 狠狠精品人妻久久久久久综合| 国产黄色免费在线视频| 无限看片的www在线观看| 十八禁网站免费在线| 亚洲国产中文字幕在线视频| 亚洲全国av大片| 超色免费av| 色婷婷久久久亚洲欧美| 亚洲精品粉嫩美女一区| 久久ye,这里只有精品| 欧美av亚洲av综合av国产av| 欧美日韩一级在线毛片| 国产视频一区二区在线看| 欧美激情高清一区二区三区| 久久青草综合色| 久久毛片免费看一区二区三区| 各种免费的搞黄视频| 女人高潮潮喷娇喘18禁视频| 久久久久国产一级毛片高清牌| 男人添女人高潮全过程视频| 久久午夜综合久久蜜桃| 十八禁网站网址无遮挡| 精品国产国语对白av| 国产伦人伦偷精品视频| 夜夜骑夜夜射夜夜干| 国产福利在线免费观看视频| 久久国产精品影院| 欧美精品一区二区免费开放| 亚洲av成人不卡在线观看播放网 | 青春草视频在线免费观看| 亚洲欧洲日产国产| 久久亚洲国产成人精品v| 精品国内亚洲2022精品成人 | 国产精品99久久99久久久不卡| 国产精品 国内视频| 建设人人有责人人尽责人人享有的| 国产欧美日韩一区二区精品| 乱人伦中国视频| 少妇人妻久久综合中文| 天天躁狠狠躁夜夜躁狠狠躁| 国产精品 欧美亚洲| av视频免费观看在线观看| 中文字幕最新亚洲高清| 美女高潮到喷水免费观看| 咕卡用的链子| 电影成人av| 啦啦啦啦在线视频资源| 精品久久久久久电影网| 国产又爽黄色视频| 欧美精品av麻豆av| 国产亚洲欧美在线一区二区| 夜夜骑夜夜射夜夜干| 交换朋友夫妻互换小说| 国产视频一区二区在线看| 欧美成狂野欧美在线观看| 激情视频va一区二区三区| 久久精品成人免费网站| 亚洲色图综合在线观看| 伦理电影免费视频| 亚洲三区欧美一区| 黑丝袜美女国产一区| 久久久久国产精品人妻一区二区| 国产精品久久久人人做人人爽| 18禁裸乳无遮挡动漫免费视频| 男人舔女人的私密视频| 亚洲五月婷婷丁香| 亚洲精品一卡2卡三卡4卡5卡 | 欧美亚洲 丝袜 人妻 在线| 一边摸一边抽搐一进一出视频| 亚洲九九香蕉| 午夜日韩欧美国产| 国产欧美亚洲国产| 我的亚洲天堂| 欧美老熟妇乱子伦牲交| 美女扒开内裤让男人捅视频| 欧美av亚洲av综合av国产av| 国产成人一区二区三区免费视频网站| 飞空精品影院首页| 午夜精品久久久久久毛片777| 97在线人人人人妻| 丰满人妻熟妇乱又伦精品不卡| 在线精品无人区一区二区三| 午夜91福利影院| 老鸭窝网址在线观看| 亚洲精品国产区一区二| 99热网站在线观看| 国产精品国产av在线观看| 看免费av毛片| 精品免费久久久久久久清纯 | 老熟妇乱子伦视频在线观看 | 亚洲精品一卡2卡三卡4卡5卡 | 国产精品国产三级国产专区5o| 亚洲人成电影免费在线| 精品一区二区三卡| 黄色怎么调成土黄色| 久久中文字幕一级| 麻豆乱淫一区二区| 日本wwww免费看| 精品一品国产午夜福利视频| 一区二区三区四区激情视频| 久久精品国产亚洲av高清一级| 亚洲中文字幕日韩| 国产区一区二久久| 亚洲成人国产一区在线观看| 亚洲欧美一区二区三区久久| 国产黄色免费在线视频| 日韩欧美国产一区二区入口| 国产激情久久老熟女| 国产一区二区三区综合在线观看| 亚洲va日本ⅴa欧美va伊人久久 | 国产成人欧美| 热99re8久久精品国产| 日韩精品免费视频一区二区三区| 青青草视频在线视频观看| 久久中文字幕一级| 韩国高清视频一区二区三区| 最新在线观看一区二区三区| 黄片小视频在线播放| 亚洲成人手机| 色精品久久人妻99蜜桃| 日韩制服丝袜自拍偷拍| 国产男女内射视频| av有码第一页| 欧美精品亚洲一区二区| 午夜老司机福利片| 久久毛片免费看一区二区三区| 男男h啪啪无遮挡| 一级片免费观看大全| 999久久久国产精品视频| 亚洲avbb在线观看| 国产亚洲欧美在线一区二区| 九色亚洲精品在线播放| 精品国产一区二区久久| 国产免费av片在线观看野外av| 丁香六月欧美| 纵有疾风起免费观看全集完整版| 婷婷成人精品国产| 婷婷丁香在线五月| 老汉色av国产亚洲站长工具| 美女国产高潮福利片在线看| 99热国产这里只有精品6| 在线观看免费视频网站a站| 啦啦啦视频在线资源免费观看| 欧美精品一区二区大全| 91字幕亚洲| 国产精品 欧美亚洲| 91成年电影在线观看| 侵犯人妻中文字幕一二三四区| 精品一区二区三区四区五区乱码| 午夜福利一区二区在线看| 亚洲av片天天在线观看| 欧美日韩成人在线一区二区| 少妇精品久久久久久久| xxxhd国产人妻xxx| 亚洲av欧美aⅴ国产| 久久人人97超碰香蕉20202| 男女高潮啪啪啪动态图| 99国产综合亚洲精品| 激情视频va一区二区三区| 少妇的丰满在线观看| 久久久久精品人妻al黑| a 毛片基地| 国产一区二区在线观看av| 欧美老熟妇乱子伦牲交| 超碰成人久久| 欧美日韩福利视频一区二区| av视频免费观看在线观看| 黑人操中国人逼视频| 久久性视频一级片| 国产精品久久久av美女十八| 免费在线观看日本一区| 电影成人av| 亚洲少妇的诱惑av| 我的亚洲天堂| 亚洲黑人精品在线| 亚洲精品一区蜜桃| 黄片播放在线免费| 窝窝影院91人妻| 母亲3免费完整高清在线观看| 黑人巨大精品欧美一区二区蜜桃| 男女高潮啪啪啪动态图| 香蕉丝袜av| 丝袜在线中文字幕| 国产亚洲午夜精品一区二区久久| 国产男女超爽视频在线观看| 激情视频va一区二区三区| 色综合欧美亚洲国产小说| 性高湖久久久久久久久免费观看| 精品少妇一区二区三区视频日本电影| 国产精品亚洲av一区麻豆| 日韩,欧美,国产一区二区三区| 水蜜桃什么品种好| 夜夜夜夜夜久久久久| 久久久久精品人妻al黑| av免费在线观看网站| 少妇人妻久久综合中文| 中文字幕人妻丝袜一区二区| 老熟妇乱子伦视频在线观看 | 欧美 日韩 精品 国产| 欧美国产精品一级二级三级| 欧美日韩亚洲综合一区二区三区_| 老司机靠b影院| www.熟女人妻精品国产| 国产亚洲精品久久久久5区| 老熟妇仑乱视频hdxx| 成人影院久久| 亚洲七黄色美女视频| 欧美+亚洲+日韩+国产| 久久国产精品人妻蜜桃| 69av精品久久久久久 | 中文字幕另类日韩欧美亚洲嫩草| 女人被躁到高潮嗷嗷叫费观| 丰满人妻熟妇乱又伦精品不卡| 肉色欧美久久久久久久蜜桃| 狠狠精品人妻久久久久久综合| 制服人妻中文乱码| 狠狠狠狠99中文字幕| 乱人伦中国视频| 精品国产乱子伦一区二区三区 | 欧美日韩亚洲高清精品| 亚洲欧洲精品一区二区精品久久久|