freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

嵌入式瀏覽器開發(fā)畢業(yè)設(shè)計(jì)畢業(yè)論文-文庫吧

2025-06-13 13:06 本頁面


【正文】 負(fù)責(zé)。 第二章 HTML詞法分析器的設(shè)計(jì)及其應(yīng)用HTML詞法分析是瀏覽器設(shè)計(jì)的基礎(chǔ)環(huán)節(jié)之一,也是整個(gè)設(shè)計(jì)過程中重要的前端工作,其數(shù)據(jù)結(jié)構(gòu)的擬定與接下來的語法分析和布局算法密切相關(guān),詞法分析的效率與準(zhǔn)確性、容錯(cuò)性也關(guān)系到整個(gè)瀏覽器設(shè)計(jì)的質(zhì)量。下面將介紹一個(gè)HTML詞法分析器——Bit Token的設(shè)計(jì)思路。Bit Token是Netbit Browser的HTML詞法分析器,使用標(biāo)準(zhǔn)C編程,Netbit Browser是基于Linux/Gtk的瀏覽器,開放源碼項(xiàng)目,網(wǎng)址是。 Bit Token的組成及其功能Bit Token作為Netbit Browser的詞法分析部份,負(fù)責(zé)對(duì)接收的HTML代碼進(jìn)行詞法分析,主要的目的是提取網(wǎng)頁中元素的名稱及其屬性,并以恰當(dāng)?shù)男问剑窗匆欢ǖ臄?shù)據(jù)結(jié)構(gòu))加以保存,也就是完成了將數(shù)據(jù)流離散化、結(jié)構(gòu)化的過程。主要由以下幾個(gè)部分組成: 初始化:完成對(duì)數(shù)據(jù)結(jié)構(gòu)的初始化,主要是分配內(nèi)存,變量賦初值。 主體的數(shù)據(jù)流分析:逐字符的進(jìn)行判斷,確定數(shù)據(jù)的歸屬類型。 元素的分析:提取元素的名稱、屬性和值域。 釋放:主要是對(duì)內(nèi)存的釋放。 數(shù)據(jù)結(jié)構(gòu)typedef struct BitTokenContext{char * strBuffer。 //當(dāng)前正在處理的HTML代碼int bufferLength。int curPosition。char * global_strBuffer。 //全局HTML代碼int global_bufferLength。int global_curPosition。BitTokenList *tokenList。 //元素節(jié)點(diǎn)鏈表BitTokenList *tokenList_tail。BitPTagList pTagList。 //元素名稱表,指向靜態(tài)數(shù)據(jù)}BitTokenContext,*BitPTokenContext。BitTokenContext是用于存儲(chǔ)當(dāng)前待分析網(wǎng)頁全局屬性的數(shù)據(jù)結(jié)構(gòu),其中TokenList是核心的元素節(jié)點(diǎn)鏈表。詞法分析的目的就是生成這樣一個(gè)鏈表。下面給出該鏈表的數(shù)據(jù)結(jié)構(gòu),是很簡單的雙向鏈表。typedef struct TokenList{ BitToken *token。 //元素節(jié)點(diǎn) struct TokenList *priou。 struct TokenList *next。}BitTokenList,*BitPTokenList。以下是元素節(jié)點(diǎn)的數(shù)據(jù)結(jié)構(gòu):typedef struct BitToken{int type。 //節(jié)點(diǎn)類型,如定義的HTML_BODY,HTML_TXT等。char *pData。 //如果是HTML_TXT型元素,則為其內(nèi)容,否則為空BOOL end。 //是否是結(jié)束元素,如/bodyBitTokenAttrList *attrList。 //元素屬性鏈表,因?yàn)榭赡苡卸鄠€(gè)屬性,所以使用鏈表存儲(chǔ)BitTokenAttrList *attrList_tail。}BitToken,*BitPToken。請(qǐng)注意,以上出現(xiàn)tail標(biāo)記的指針變量,如BitTokenList * tokenList_tail等,其作用是用于保存鏈表結(jié)尾節(jié)點(diǎn)指針,便于在釋放內(nèi)存時(shí),直接找到鏈尾,提高了算法的效率。 算法 基本算法:首先介紹基本的算法:(1) 從存儲(chǔ)網(wǎng)頁的字符串中,順序讀入一個(gè)字符(2) 如果遇到 ,認(rèn)為遇到TAG(元素),處理該元素,使用函數(shù)Token_ConsumTag(),處理完畢后,指針移到該元素尾。 (3) 如果遇到回車、空格,則跳過。(4) 如果遇到 ,則跳過(不應(yīng)該出現(xiàn)此情況,為了容錯(cuò))。 (5) 如果非以上情況,則認(rèn)為遇到文字,處理這段文字,使用函數(shù)Token_Consum_PlainText()。處理完畢,指針指向下一個(gè)元素首。(6) 循環(huán)以上操作,直到該網(wǎng)頁分析完畢。 由此看來,主算法十分簡單而清晰,主要是Token_ConsumTag()和Token_Consum_PlainText()這兩個(gè)函數(shù)起關(guān)鍵作用,由于其中涉及到許多細(xì)節(jié)問題,此處不予詳述。 算法效率與改進(jìn):采用以上的基本算法,是可用的,但當(dāng)網(wǎng)頁比較大的時(shí)候,比如600K,該算法的效率成倍下降,這主要是由于要處理的字符串太大,在內(nèi)存中完成查找、替換、復(fù)制、移動(dòng)等操作,響應(yīng)時(shí)間明顯下降。對(duì)此的改進(jìn)辦法就是分段進(jìn)行詞法分析,不僅極大的提高了效率(在某些情況下約提高30倍),也有利于瀏覽器整體設(shè)計(jì),因?yàn)楫?dāng)網(wǎng)頁較大時(shí),若等待全部內(nèi)容傳輸完畢,再一次性完成詞法分析和布局,用戶會(huì)感到等待時(shí)間過長,一般現(xiàn)在成熟的瀏覽器都采用邊傳輸,邊分析,邊顯示。分段進(jìn)行詞法分析的算法復(fù)雜度明顯增加,比如,當(dāng)每段定為1024字節(jié),在第1024字節(jié)處,可能正好將一個(gè)完整元素截?cái)?,按常?guī)分析方法會(huì)造成錯(cuò)誤。解決的辦法是,采用回溯,確認(rèn)要分析的部份至少包含1個(gè)完整元素。具體做法是:判斷1024字節(jié)處是否為元素結(jié)束字符 ‘’,如果不是,則判斷前一個(gè)字節(jié),直到找到元素結(jié)束字符為止,這樣可保證至少包含一個(gè)元素。采用分段進(jìn)行詞法分析,實(shí)際每次分析的代碼會(huì)不足1024字節(jié),余下的部份匯入到下一段的分析過程即可,直到所有內(nèi)容被分析完畢。下面是一段很簡單的HTML代碼。htmlimg src=“” width=200 height=100a HREF=首都在線/a/html分析后,數(shù)據(jù)存儲(chǔ)結(jié)構(gòu)如下:img首都在線100heightdatahrefatext200widthsrc/a可以看到,詞法分析的結(jié)果是一個(gè)元素節(jié)點(diǎn)鏈表,每個(gè)節(jié)點(diǎn)的屬性也形成了一個(gè)鏈表,元素節(jié)點(diǎn)是有先后順序的,元素屬性的先后順序是無所謂的。詞法分析將網(wǎng)頁的文本數(shù)據(jù)流以清晰的結(jié)構(gòu)表現(xiàn)出來,這樣,在后面的應(yīng)用中就可以很容易的遍歷各節(jié)點(diǎn),并輕松地獲得各元素節(jié)點(diǎn)的屬性。 HTML詞法分析的應(yīng)用 應(yīng)用舉例:HTML詞法分析程序通常應(yīng)用于瀏覽器設(shè)計(jì)、網(wǎng)頁制作軟件設(shè)計(jì)等領(lǐng)域,本人以一個(gè)使用VC開發(fā)的軟件“HTML智能分析”來舉例說明,下載網(wǎng)址:?!癏TML智能分析”同樣使用Bit Token詞法分析器,“HTML智能分析”是一個(gè)網(wǎng)頁信息提取、處理軟件。具有以下主要功能:智能提取網(wǎng)頁中的文字信息,智能排版,并可在進(jìn)行編輯后保存。統(tǒng)計(jì)網(wǎng)頁的有關(guān)信息。根據(jù)用戶設(shè)置的版式,將分析和編輯的結(jié)果,自動(dòng)生成新的網(wǎng)頁。用戶可使用該軟件來將HTML轉(zhuǎn)為TXT格式,其對(duì)HTML中文字內(nèi)容的提取準(zhǔn)確、快速、不含冗余信息,版式工整清晰,保持本來面貌。其主要設(shè)計(jì)思路是,在Bit Token詞法分析器的基礎(chǔ)上,結(jié)合瀏覽器布局的基本算法,對(duì)影響到TXT版面效果的元素進(jìn)行處理。比如PRE標(biāo)記,代表所包含的內(nèi)容瀏覽器應(yīng)不予分析,按TXT格式輸出,而如表格TR等元素則意味著需要換行。而在HTML中,在無PRE這種特殊情況時(shí),回車都是忽略不記的。這就造成了矛盾。使用常規(guī)的簡單算法進(jìn)行HTML到TXT的轉(zhuǎn)換無法解決這些問題。造成轉(zhuǎn)換后的版式“失真“。而“HTML智能分析”卻能很好的解決。由于“HTML智能分析”使用了底層的詞法分析技術(shù),還可以很容易的過濾掉SCRIPT與STYLE(樣式表)。并可以對(duì)網(wǎng)頁中的元素進(jìn)行統(tǒng)計(jì)和語法校驗(yàn)。以下是該程序的片斷: pTtokenList=global_cxtokenList。 //取首節(jié)點(diǎn) while(pTtokenList!=NULL) //循環(huán)直至處理完所有節(jié)點(diǎn) { switch(pTtokenListtokentype) {//根據(jù)節(jié)點(diǎn)類型,做不同的處理 case HTML_TITLE: …… case HTML_TEXT: …… default: …… } //switch pTtokenList=pTtokenListnext。 //取下一個(gè)節(jié)點(diǎn) } //while這段程序?qū)嶋H上就是一個(gè)簡單的語法分析和布局的過程。 Bit Token在應(yīng)用中存在的問題及修改意見由于HTML的標(biāo)記多是成對(duì)出現(xiàn)的,并且存在SCRIPT這樣的特殊元素,其內(nèi)容為Javascript程序,函數(shù)的字符串參數(shù)等可能包含其它的元素標(biāo)記。例如語句:Alert(“font is a tag”)。因此,在詞法分析時(shí)要對(duì)SCRIPT標(biāo)記進(jìn)行特殊處理,遇到SCRIPT就應(yīng)逐字符讀入后面的內(nèi)容,直到遇到下一個(gè)/SCRIPT標(biāo)記。目前的Bit Token由于開發(fā)時(shí)間所限,未對(duì)其加以特殊處理,存在一些問題,但由于瀏覽器對(duì)Javascript的支持是較復(fù)雜的工作,目前的Netbit Browser尚不予實(shí)現(xiàn),因而沒有導(dǎo)致明顯問題,而“HTML智能分析”這個(gè)軟件只是需要對(duì)Javascript進(jìn)行刪除操作,也不會(huì)造成影響。盡管如此,對(duì)SCRIPT的特殊處理還是有待完善,盡管這同時(shí)也會(huì)帶來一些問題,需要進(jìn)行大量的測試,來保證新加入代碼的穩(wěn)定性。正如前面所述,HTML詞法分析是瀏覽器設(shè)計(jì)的基礎(chǔ)環(huán)節(jié)之一,但并非最重要和最具難度的環(huán)節(jié),若想開發(fā)出效果較好的瀏覽器產(chǎn)品,還要在布局和GUI設(shè)計(jì)上多下功夫。 第三章 瀏覽器JavaScript支持的實(shí)現(xiàn)本部份主要針對(duì)Mozilla和Netscape瀏覽器源代碼的JavaScript部份進(jìn)行了分析,闡述了瀏覽器Javascript實(shí)現(xiàn)的機(jī)制。 開發(fā)環(huán)境JavaScript Reference與JavaScript API:JavaScript Reference是Mozilla所使用JavaScript開發(fā)環(huán)境,是使用ANSI C的獨(dú)立的開發(fā)包,據(jù)Mozilla文檔介紹,該開發(fā)包涉及到超過160家公司的版權(quán)。而且被廣泛使用,實(shí)際已成為了進(jìn)行JavaScript應(yīng)用開發(fā)的標(biāo)準(zhǔn)平臺(tái)。JavaScript Reference可以用于建立包含JavaScript runtime的Library或 DLL。既可以編譯成小的 shell 程序(像早期的BASIC),又連接Library后生成交互式的JavaScript解釋器, 文件。由于使用了ANSI C編程,可以用VC、GCC等編譯器在不同平臺(tái)下編譯。生成的shell 程序,對(duì)比瀏覽器對(duì)JavaScript的支持,相同之處是使用相同的包含JavaScript runtime的Library 或 DLL,我們把這部份相同的Library或 DLL稱為JavaScript API,我們實(shí)際開發(fā)JavaScript應(yīng)用,也是在JavaScript API基礎(chǔ)上工作,而不用過多考慮其內(nèi)部的實(shí)現(xiàn)。關(guān)于JavaScript API,參見JavaScript API詳解。JavaScript API實(shí)際就是Javscript解釋器的對(duì)外接口函數(shù)庫。 JavaScript EngineJavaScript Engine是瀏覽器開發(fā)者為了利用JavaScript API來實(shí)現(xiàn)實(shí)際應(yīng)用而設(shè)立的中間層,用于初始化JavaScript環(huán)境,提供對(duì)JavaScript解釋、執(zhí)行的接口。瀏覽器主體程序的設(shè)計(jì)者可以通過JavaScript Engine,方便的實(shí)現(xiàn)各種應(yīng)用,畢竟JavaScript API太基礎(chǔ)了,直接使用不太方便。下面介紹JavaScript Engine的主要功能和實(shí)現(xiàn)方法。這也包含了利用JavaScript API進(jìn)行應(yīng)用的基本思路。(1) 初始化:內(nèi)存分配:rt=JS_Init(10000L)。初始化cx:cx = JS_NewContext(rt, STACK_CHUNK_SIZE)。初始化globalObj:globalObj = JS_NewObject(cx, amp。globalClass, 0, 0)。定義標(biāo)準(zhǔn)類:JS_InitStandardClasses(cx, globalObj)。定義系統(tǒng)函數(shù):JS_DefineFunctions(cx, globalObj, g_functions)。定義報(bào)錯(cuò)函數(shù):JS_SetErrorReporter(cx,JS_ErrorReporter)。注冊(cè)其它類:RegisterClassPoint (cx,globalObj)。RegisterClassSize (cx,globalObj)。RegisterClassRect (cx,globalObj)。RegisterClassPolygon (cx,globalObj)。RegisterClassColorKey (cx,globalObj)。RegisterClassTDTimer (cx,globalObj)。初始化定時(shí)器:TDTimerListInit()。(2) 提供對(duì)JavaScript解釋、執(zhí)行的接口函數(shù):TD_EvaluateScript(JSContext *cx,JSObject *obj, const char *bytes, uintN length,const char *filename, uintN lineno,jsval *rval) JavaScript與瀏覽器接合基本概念:JavaScript操作HTML元素的常見方式例:htmlheadscript!function ChangeImage(index){=a+index+.gif。}/script/heada onmouseover=ChangeImage(0)。軍人/abr
點(diǎn)擊復(fù)制文檔內(nèi)容
語文相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1