• <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)解題技巧
    天美传媒精品一区二区| 99国产精品一区二区蜜桃av| 男人和女人高潮做爰伦理| 如何舔出高潮| 黄色一级大片看看| 日韩中字成人| 女人十人毛片免费观看3o分钟| 午夜激情福利司机影院| 看黄色毛片网站| 1000部很黄的大片| 色综合站精品国产| 热99re8久久精品国产| 亚洲三级黄色毛片| 中文字幕av成人在线电影| 久久中文看片网| 亚洲五月天丁香| 亚洲av不卡在线观看| 欧美+日韩+精品| 人人妻人人澡欧美一区二区| 少妇裸体淫交视频免费看高清| 在线免费观看不下载黄p国产| 大又大粗又爽又黄少妇毛片口| 久久久久国产网址| 插逼视频在线观看| 亚洲电影在线观看av| 日韩,欧美,国产一区二区三区 | 久久久精品欧美日韩精品| 亚洲av一区综合| 国内精品宾馆在线| 国产高清视频在线观看网站| 欧美日韩精品成人综合77777| 中文字幕av成人在线电影| 美女大奶头视频| 美女国产视频在线观看| 久久久久久伊人网av| 26uuu在线亚洲综合色| 2021天堂中文幕一二区在线观| 亚洲欧美精品专区久久| 一区二区三区高清视频在线| 亚洲中文字幕日韩| 22中文网久久字幕| 变态另类成人亚洲欧美熟女| 国产av麻豆久久久久久久| 国产成人精品一,二区 | 免费观看a级毛片全部| 久久精品久久久久久噜噜老黄 | 成人毛片60女人毛片免费| 全区人妻精品视频| 欧美高清成人免费视频www| 99精品在免费线老司机午夜| 精品久久久噜噜| 欧美极品一区二区三区四区| 久久草成人影院| 男人狂女人下面高潮的视频| 99热这里只有是精品在线观看| 国产单亲对白刺激| 1024手机看黄色片| 最近手机中文字幕大全| 深爱激情五月婷婷| 久久精品国产亚洲av香蕉五月| 国产探花极品一区二区| 日韩视频在线欧美| 麻豆av噜噜一区二区三区| 一区二区三区四区激情视频 | 欧美成人免费av一区二区三区| 亚洲国产精品成人久久小说 | 亚洲在久久综合| h日本视频在线播放| 内射极品少妇av片p| 波野结衣二区三区在线| 欧美激情久久久久久爽电影| 国产精品国产高清国产av| 国产精品99久久久久久久久| www.av在线官网国产| 岛国毛片在线播放| 波野结衣二区三区在线| 亚洲av中文av极速乱| 男女边吃奶边做爰视频| 国产精品一二三区在线看| 欧美高清成人免费视频www| 久久欧美精品欧美久久欧美| 嫩草影院新地址| 女的被弄到高潮叫床怎么办| 亚洲中文字幕日韩| 综合色av麻豆| 亚洲人成网站在线播| 黄色一级大片看看| 一本—道久久a久久精品蜜桃钙片 精品乱码久久久久久99久播 | 一卡2卡三卡四卡精品乱码亚洲| 久久久久久久久久成人| 精品国产三级普通话版| 亚洲国产精品成人久久小说 | av在线播放精品| 欧美极品一区二区三区四区| 寂寞人妻少妇视频99o| 国产成人精品婷婷| 免费看日本二区| 黄色一级大片看看| 国产一区亚洲一区在线观看| 午夜激情欧美在线| 国产精品.久久久| 午夜a级毛片| 美女内射精品一级片tv| 久久这里有精品视频免费| 亚洲激情五月婷婷啪啪| 91久久精品国产一区二区成人| 亚洲第一电影网av| 国语自产精品视频在线第100页| 亚洲av中文av极速乱| 亚洲无线在线观看| 亚洲美女搞黄在线观看| 国产爱豆传媒在线观看| 观看美女的网站| 晚上一个人看的免费电影| 亚洲欧美日韩东京热| 深夜a级毛片| 欧美一区二区国产精品久久精品| 欧美日韩国产亚洲二区| 国产乱人偷精品视频| 99热精品在线国产| 少妇的逼水好多| 亚洲三级黄色毛片| 波多野结衣巨乳人妻| 午夜福利在线在线| 久久久久久久久久黄片| 国产成人精品婷婷| 六月丁香七月| av卡一久久| 一本一本综合久久| 一级黄片播放器| 国产欧美日韩精品一区二区| 少妇丰满av| 国产黄片视频在线免费观看| 舔av片在线| 青春草亚洲视频在线观看| 日本三级黄在线观看| 日本一二三区视频观看| 成人二区视频| 在线播放国产精品三级| 国产av麻豆久久久久久久| 久久久久久久久久成人| 男人舔奶头视频| 久久久久久伊人网av| 校园人妻丝袜中文字幕| 久99久视频精品免费| 99热这里只有精品一区| 亚洲欧美日韩东京热| 日韩一本色道免费dvd| 97超视频在线观看视频| 欧美在线一区亚洲| 干丝袜人妻中文字幕| 国产伦精品一区二区三区四那| 欧美日韩一区二区视频在线观看视频在线 | 久久精品夜色国产| 中文资源天堂在线| 亚洲av免费在线观看| 午夜激情欧美在线| 熟女电影av网| 日韩成人av中文字幕在线观看| 成人二区视频| 欧美精品一区二区大全| 一夜夜www| 老师上课跳d突然被开到最大视频| 男的添女的下面高潮视频| 青青草视频在线视频观看| 亚洲人成网站在线播| 亚洲中文字幕一区二区三区有码在线看| 久久久精品94久久精品| 国产av一区在线观看免费| 国产免费一级a男人的天堂| 一级二级三级毛片免费看| 人妻久久中文字幕网| 女同久久另类99精品国产91| 免费看美女性在线毛片视频| 国内久久婷婷六月综合欲色啪| 国产精品综合久久久久久久免费| 天天躁日日操中文字幕| 午夜精品一区二区三区免费看| 男的添女的下面高潮视频| 午夜亚洲福利在线播放| 国产在视频线在精品| 精品人妻偷拍中文字幕| 亚洲高清免费不卡视频| 18+在线观看网站| 国产一区二区在线观看日韩| 可以在线观看的亚洲视频| 精品少妇黑人巨大在线播放 | 插阴视频在线观看视频| 中国美白少妇内射xxxbb| 日韩精品有码人妻一区| 久久午夜亚洲精品久久| 精品少妇黑人巨大在线播放 | 禁无遮挡网站| 天天一区二区日本电影三级| 成年女人永久免费观看视频| 色尼玛亚洲综合影院| 日韩一本色道免费dvd| 女人十人毛片免费观看3o分钟| 亚洲在线观看片| 91aial.com中文字幕在线观看| 亚洲精品久久国产高清桃花| 特级一级黄色大片| 亚洲国产欧美人成| 亚洲av电影不卡..在线观看| 99久久久亚洲精品蜜臀av| av在线播放精品| 国内精品久久久久精免费| 村上凉子中文字幕在线| 人妻少妇偷人精品九色| 成人高潮视频无遮挡免费网站| 波多野结衣高清作品| 国产v大片淫在线免费观看| 身体一侧抽搐| 亚洲五月天丁香| 久久久久久久久中文| 久久婷婷人人爽人人干人人爱| 熟女人妻精品中文字幕| 亚洲第一区二区三区不卡| 我要搜黄色片| 日韩大尺度精品在线看网址| 精品一区二区免费观看| 麻豆乱淫一区二区| 免费观看在线日韩| 亚洲精品影视一区二区三区av| 看片在线看免费视频| 婷婷六月久久综合丁香| 最近的中文字幕免费完整| 国产高清不卡午夜福利| 黄色视频,在线免费观看| 国产高清三级在线| 哪个播放器可以免费观看大片| 老司机影院成人| 成人高潮视频无遮挡免费网站| 亚洲内射少妇av| 日本三级黄在线观看| 国产三级中文精品| 男人的好看免费观看在线视频| 搞女人的毛片| 我要看日韩黄色一级片| 丝袜喷水一区| 男人舔女人下体高潮全视频| 婷婷色av中文字幕| 日韩精品青青久久久久久| 国产成人影院久久av| 麻豆成人av视频| 亚洲国产欧美在线一区| 精品日产1卡2卡| 大型黄色视频在线免费观看| 毛片女人毛片| 人体艺术视频欧美日本| 超碰av人人做人人爽久久| 国产色婷婷99| 美女黄网站色视频| 特大巨黑吊av在线直播| 久久99精品国语久久久| 亚洲最大成人手机在线| 老熟妇乱子伦视频在线观看| av在线天堂中文字幕| 久久久精品大字幕| 少妇丰满av| 久久人人爽人人片av| 你懂的网址亚洲精品在线观看 | 成熟少妇高潮喷水视频| 22中文网久久字幕| 一本久久精品| 夫妻性生交免费视频一级片| 色播亚洲综合网| 成人午夜精彩视频在线观看| 久久精品影院6| 欧洲精品卡2卡3卡4卡5卡区| av在线蜜桃| 一级毛片久久久久久久久女| 久久精品国产亚洲av天美| 久久99蜜桃精品久久| 国产精品久久久久久精品电影小说 | 免费观看在线日韩| 丝袜美腿在线中文| 中国美白少妇内射xxxbb| 久久中文看片网| 久久久久性生活片| 黑人高潮一二区| 久久久久久久久久黄片| 一个人观看的视频www高清免费观看| 日本在线视频免费播放| 黄色配什么色好看| av在线观看视频网站免费| 欧美一区二区国产精品久久精品| 欧美丝袜亚洲另类| 男女那种视频在线观看| 一个人看的www免费观看视频| 身体一侧抽搐| 国产高清激情床上av| 精品免费久久久久久久清纯| 日韩一区二区三区影片| 在线国产一区二区在线| 亚洲精品自拍成人| 色综合亚洲欧美另类图片| 美女内射精品一级片tv| 乱码一卡2卡4卡精品| 寂寞人妻少妇视频99o| 哪里可以看免费的av片| 国产淫片久久久久久久久| 人人妻人人看人人澡| 日韩中字成人| 男人和女人高潮做爰伦理| 色5月婷婷丁香| 午夜a级毛片| 禁无遮挡网站| 可以在线观看毛片的网站| 日韩欧美 国产精品| 精品久久久久久久久av| 韩国av在线不卡| 久久鲁丝午夜福利片| 一本—道久久a久久精品蜜桃钙片 精品乱码久久久久久99久播 | 九九热线精品视视频播放| 免费黄网站久久成人精品| 国产午夜精品论理片| 精品午夜福利在线看| 成人亚洲精品av一区二区| 村上凉子中文字幕在线| 99热6这里只有精品| 一进一出抽搐gif免费好疼| 性色avwww在线观看| 国产精品.久久久| 一区二区三区四区激情视频 | 一本久久中文字幕| 国产精品.久久久| 日本av手机在线免费观看| 日韩在线高清观看一区二区三区| 淫秽高清视频在线观看| 啦啦啦韩国在线观看视频| 亚洲18禁久久av| 丝袜喷水一区| 亚洲18禁久久av| 久久久a久久爽久久v久久| 日韩欧美一区二区三区在线观看| 中文字幕人妻熟人妻熟丝袜美| 国产精品av视频在线免费观看| 欧美成人免费av一区二区三区| 亚洲自拍偷在线| 日韩一区二区三区影片| 此物有八面人人有两片| 国产精品美女特级片免费视频播放器| 男的添女的下面高潮视频| 老司机影院成人| 国产午夜福利久久久久久| 久久久久九九精品影院| 国产老妇女一区| 国模一区二区三区四区视频| 亚洲中文字幕日韩| 高清毛片免费观看视频网站| 国产老妇女一区| 97热精品久久久久久| 国产白丝娇喘喷水9色精品| 最近中文字幕高清免费大全6| 熟妇人妻久久中文字幕3abv| 日日干狠狠操夜夜爽| 免费看光身美女| 校园人妻丝袜中文字幕| 欧美+日韩+精品| 日本免费a在线| av在线亚洲专区| 噜噜噜噜噜久久久久久91| 午夜免费男女啪啪视频观看| 欧美性猛交╳xxx乱大交人| 日韩在线高清观看一区二区三区| 超碰av人人做人人爽久久| 国产成人一区二区在线| av在线天堂中文字幕| 久久久久免费精品人妻一区二区| 我要搜黄色片| 色综合色国产| 能在线免费看毛片的网站| 欧美区成人在线视频| 亚洲精品久久国产高清桃花| 亚洲第一区二区三区不卡| 99久国产av精品国产电影| 日本黄大片高清| 国产淫片久久久久久久久| 成人毛片a级毛片在线播放| av女优亚洲男人天堂| 91久久精品电影网| 亚洲成人久久爱视频| 91午夜精品亚洲一区二区三区| 久久精品夜色国产| 欧美又色又爽又黄视频| 99热全是精品| av在线观看视频网站免费| 久久精品久久久久久久性| 自拍偷自拍亚洲精品老妇| 欧美3d第一页| 精品国产三级普通话版| 国产乱人偷精品视频| 99久久精品热视频| 天堂影院成人在线观看| 99热只有精品国产| 日韩大尺度精品在线看网址| av免费在线看不卡| 久久久a久久爽久久v久久| 亚洲18禁久久av| 精品国内亚洲2022精品成人| 激情 狠狠 欧美| 欧美高清成人免费视频www| av在线天堂中文字幕| 国产免费男女视频| 欧美在线一区亚洲| 国产高清不卡午夜福利| 99riav亚洲国产免费| 成人特级黄色片久久久久久久| 国产精品嫩草影院av在线观看| 边亲边吃奶的免费视频| 51国产日韩欧美| 亚洲真实伦在线观看| 欧美3d第一页| 菩萨蛮人人尽说江南好唐韦庄 | 国产成人午夜福利电影在线观看| 天美传媒精品一区二区| 免费看光身美女| 男女视频在线观看网站免费| 国产极品精品免费视频能看的| 在线免费十八禁| 日韩一本色道免费dvd| 青春草国产在线视频 | 国产精品美女特级片免费视频播放器| 波多野结衣高清无吗| 日本黄色片子视频| 色噜噜av男人的天堂激情| 亚洲国产精品久久男人天堂| 国产精品一区二区三区四区久久| 欧美高清成人免费视频www| 日本免费a在线| 国语自产精品视频在线第100页| 最近手机中文字幕大全| 91久久精品电影网| 亚洲成a人片在线一区二区| 亚洲成人中文字幕在线播放| 日韩欧美国产在线观看| 长腿黑丝高跟| 91狼人影院| 亚洲国产精品成人综合色| 九九在线视频观看精品| 国产精品嫩草影院av在线观看| 日韩一本色道免费dvd| 欧美3d第一页| 国产成人91sexporn| 精品久久久久久久久久免费视频| 亚洲最大成人av| 人妻制服诱惑在线中文字幕| 99riav亚洲国产免费| 91久久精品电影网| 桃色一区二区三区在线观看| av在线老鸭窝| 在线观看一区二区三区| 国产成人a区在线观看| 97在线视频观看| 欧美激情国产日韩精品一区| 成人无遮挡网站| 寂寞人妻少妇视频99o| 中文字幕精品亚洲无线码一区| 国产精品无大码| 亚洲图色成人| 亚洲精品粉嫩美女一区| 亚洲在久久综合| 国模一区二区三区四区视频| 久久热精品热| 精品日产1卡2卡| 国产精品免费一区二区三区在线| 国产午夜精品一二区理论片| 亚洲av熟女| 亚洲第一区二区三区不卡| 最近的中文字幕免费完整| 18禁黄网站禁片免费观看直播| 尤物成人国产欧美一区二区三区| 成年女人永久免费观看视频| 亚洲国产精品合色在线| 一本一本综合久久| 亚洲成人精品中文字幕电影| 老师上课跳d突然被开到最大视频| 亚洲欧洲日产国产| www.av在线官网国产| 国产精华一区二区三区| av在线观看视频网站免费| 国产精品蜜桃在线观看 | 美女高潮的动态| 一区福利在线观看| 一级毛片aaaaaa免费看小| 欧美性感艳星| 亚洲人成网站在线播放欧美日韩| 少妇熟女欧美另类| 一区福利在线观看| 可以在线观看毛片的网站| 搡老妇女老女人老熟妇| 亚洲国产高清在线一区二区三| 非洲黑人性xxxx精品又粗又长| 日韩欧美精品v在线| 亚洲国产精品国产精品| 九九热线精品视视频播放| 国产精品一区二区三区四区免费观看| 免费观看的影片在线观看| 国产av在哪里看| 亚洲国产精品国产精品| 亚洲精品国产成人久久av| 看免费成人av毛片| 精品一区二区三区视频在线| av国产免费在线观看| 国产日韩欧美在线精品| 校园人妻丝袜中文字幕| 一个人看视频在线观看www免费| 搡老妇女老女人老熟妇| 日本熟妇午夜| 亚洲七黄色美女视频| 亚洲国产精品合色在线| 我的女老师完整版在线观看| 久久精品国产清高在天天线| 国产在视频线在精品| 国产成人91sexporn| 尤物成人国产欧美一区二区三区| 日韩制服骚丝袜av| 亚洲不卡免费看| 日本色播在线视频| 成年av动漫网址| 在线观看一区二区三区| 又爽又黄a免费视频| 亚洲国产欧美在线一区| 亚洲av中文字字幕乱码综合| or卡值多少钱| 成人永久免费在线观看视频| 少妇裸体淫交视频免费看高清| 久久亚洲国产成人精品v| 亚洲七黄色美女视频| 岛国毛片在线播放| 一个人观看的视频www高清免费观看| 国产高清不卡午夜福利| 欧美xxxx黑人xx丫x性爽| 成年版毛片免费区| 91在线精品国自产拍蜜月| 亚洲最大成人中文| 床上黄色一级片| 天堂网av新在线| 长腿黑丝高跟| 国产激情偷乱视频一区二区| 国产黄a三级三级三级人| 欧美高清成人免费视频www| 丰满乱子伦码专区| a级一级毛片免费在线观看| a级毛片a级免费在线| 免费一级毛片在线播放高清视频| 天堂√8在线中文| 国产av麻豆久久久久久久| 国产精品爽爽va在线观看网站| 亚洲人成网站在线观看播放| 久久久精品94久久精品| 亚洲成av人片在线播放无| 欧美xxxx黑人xx丫x性爽| 国产精品久久久久久亚洲av鲁大| 中文字幕人妻熟人妻熟丝袜美| av在线天堂中文字幕| 成年女人看的毛片在线观看| 成人鲁丝片一二三区免费| 国产高清视频在线观看网站| 亚洲国产精品合色在线| 欧美xxxx性猛交bbbb| 精品一区二区免费观看| av在线亚洲专区| 午夜精品在线福利| 26uuu在线亚洲综合色| 欧美潮喷喷水| 久久午夜福利片| 日本五十路高清| 日本一本二区三区精品| 69人妻影院| 日韩欧美 国产精品| 亚洲国产精品久久男人天堂| 噜噜噜噜噜久久久久久91| 欧美日韩一区二区视频在线观看视频在线 | 直男gayav资源| 激情 狠狠 欧美| 久久精品91蜜桃| 免费看日本二区| 国产一区二区在线av高清观看| 波野结衣二区三区在线| 成年免费大片在线观看| 欧美精品国产亚洲| 久久久久久久久久久免费av| 最近的中文字幕免费完整| av免费在线看不卡| 日本熟妇午夜| 狂野欧美白嫩少妇大欣赏| 国产精品,欧美在线| 国产免费男女视频| 久99久视频精品免费| 久久久久久久久大av| 日韩国内少妇激情av| 日韩 亚洲 欧美在线| av免费在线看不卡| 看免费成人av毛片| 精品无人区乱码1区二区| 免费不卡的大黄色大毛片视频在线观看 | 又爽又黄无遮挡网站| 亚洲内射少妇av| 欧美区成人在线视频| 晚上一个人看的免费电影| 亚洲无线在线观看| 国产极品精品免费视频能看的| 精品99又大又爽又粗少妇毛片| 嫩草影院精品99| 国产免费一级a男人的天堂| 色尼玛亚洲综合影院| 校园人妻丝袜中文字幕| 中文字幕av成人在线电影| 国产色爽女视频免费观看| 日韩av在线大香蕉| 日本与韩国留学比较| 成人一区二区视频在线观看| 最后的刺客免费高清国语|