石功恒,陳建勛
(武漢科技大學 計算機科學與技術學院,湖北 武漢430065)
隨著信息技術與網絡技術的快速發展,以及人們日常生活對網絡信息的需求的不斷增加。掌上電腦、上網本、手機、導航儀器、智能電視、智能家電等對嵌入式系統提出了更多更高的要求。在嵌入式系統中利用嵌入式瀏覽器獲取網絡信息是必不可少的,因此嵌入式瀏覽器技術成為現如今的技術熱點之一。而且Linux操作系統完全開源,可以降低產品開發成本,因此對基于Linux操作系統的嵌入式瀏覽器開發技術的研究有著重要意義。
根據嵌入式瀏覽器的[1-2]特點,分析嵌入式瀏覽器的各個部分功能。下面介紹嵌入式瀏覽器的主要功能:(1)詞法分析,主要是對HTML語言進行詞法分析,并且要求HTML詞法分析可以兼容XML等其他標簽語言,達到只需更換語言的元素名稱就可以進行詞法分析的效果;(2)語法分析與布局,在非嵌入式瀏覽器中語法分析是獨立的一個模塊,但是在嵌入式瀏覽器中不作為一個獨立模塊,簡化系統結構,即實現語法分析與布局同步化,節省了語法分析數據存儲的內存空間;(3)嵌入式瀏覽器的用戶界面,設計高效快捷的用戶界面是應用軟件的重要部分;(4)嵌入式瀏覽器JavaScript支持,JavaScript在瀏覽器里主要是用于操縱界面元素并與瀏覽器內部命令進行結合;(5)I/O端,主要是通過HTTP協議和文本系統來讀取頁面信息;(6)控制機制,負責命令響應和消息處理。嵌入式瀏覽器功能結構如圖1所示。

圖1 嵌入式瀏覽器功能結構圖
HTML詞法分析是嵌入式瀏覽器開發[3]的基礎,是整個嵌入式瀏覽器整體設計的最前端部分,HTML詞法分析的數據結構是語法分析與布局的重要依據。HTML詞法分析的效率、準確率以及容錯率的高低在一定程度上決定了整個嵌入式瀏覽器的工作效率。下面對HTML詞法分析的組成和功能進行解析。
HTML詞法分析的功能主要是負責接收從I/O端讀取到的HTML代碼并進行詞法分析,提取網頁中HTML代碼中的各元素信息,按照定義的數據結構保存元素的屬性和名稱等,實現數據的結構化。
根據HTML詞法分析的功能可以解析為幾個組成部分:(1)初始化。完成對數據結構的初始化,主要是分配內存,變量賦初值;(2)主體的數據流分析,逐字符地進行判斷,確定數據的歸屬類型;(3)元素的分析,提取元素的名稱、屬性和值域;(4)釋放,主要是對數據內存空間的釋放。
根據HTML詞法分析的功能以及組成部分,可以很清晰地得到一個簡單的算法。其算法過程具體如下:
(1)從I/O端讀取的字符串流中,順序讀取一個字符;
(2)如果遇到<,表示將遇到元素,處理該元素(使用元素處理函數來處理該元素),元素處理結束后,指針指向該元素的尾部;
(3)如果遇到空格或回車,則跳過;
(4)如果遇到>,則跳過(因為不可能存在<>這種不包含任何元素的情況,只是為了增強程序的容錯性);
(5)如果遇到的不是上述幾種情況,則遇到的是文字(使用文字處理函數來處理該文字),文字處理結束后,指針指向下一個元素的首部;
(6)循環(1)~(5)步驟,直到 I/O 端讀取的字符串流全部分析完。
根據上述詞法分析算法過程可以得到相應的流程圖,如圖2所示。

圖2 詞法分析算法流程圖
根據上述提出的詞法分析的算法,通過掃描I/O端讀取的字符串,來檢測字符是否為標簽元素、提取標簽元素屬性等。設計詞法分析的基礎要定義數據結構,為詞法分析算法的實現提供基礎。根據功能需要設計基本的數據結構,定義如下:
char token[]; //標簽元素表
char*tokenPointer; //指向標簽元素表的指針
char chText[]; //字符表
char*chPointer; //字符表指針
char text[]; //字符串表
char*textPointer; //字符串表指針
char textRead[]; //存放待識別的源程序字符串
char*textReadPointer; //讀取字符串指針
char ch; //存放最讀取的源程序字符
char strToken[]; //存放構成單詞符號的字符串
bool flag=false; //是否掃描過一次
JavaScript是一種基于對象和事件驅動并具有相對安全性的客戶端腳本語言。它的一個重要功能就是面向對象的功能,通過基于對象的程序設計,可以用更直觀、模塊化和可重復使用的方式進行程序開發。一組包含數據的屬性和對屬性中包含數據進行操作的方法,稱為對象。用戶與網頁交互時產生的操作,稱為事件。事件可以由用戶引發,也可能是頁面發生改變,甚至還有看不見的事件(如Ajax的交互進度改變)。絕大部分事件都由用戶的動作所引發,例如用戶按鼠標的按鍵,就產生click事件,若鼠標的指針在鏈接上移動,就產生MouseOver事件等。在JavaScript中,事件與事件處理程序配套使用。而對事件的處理用addEventListener()函數,它有3個參數:事件、引發的函數以及是否使用事件捕捉。為了保障安全性,將第三個參數始終設置為false。
JavaScript具有幾個特性:能使網頁增加互動性;能使有規律地重復的HTML源代碼簡化,減少下載時間;能及時響應用戶的操作,對提交表單做即時的檢查,無需浪費額外的驗證時間。
JavaScript引擎一般作為共享庫使用,應用程序調用引擎提供的API函數。引擎API函數大致分為以下幾種:數據類型操作、RunTime控制、類與對象的創建和維護、函數與腳本執行、字符串操作、錯誤處理、安全控制、Debug支持。一般情況下,在應用程序中只需使用某幾類函數。例如,在進行JavaScript調用之前必須調用JS_NewRuntime函數來創建并初始化JavaScript引擎。有些類型的函數(像安全控制類)提供可選擇的特征。
JavaScript引擎是系統上的一個共享資源。通過將引擎API調用嵌入到應用程序中,可以請求JavaScript引擎進行操作。引擎處理請求,并將結果或狀態信息返回給應用程序。例如,假定使用JavaScript引擎自動化應用程序,腳本應用程序鑒別用戶并設置權限。首先,應用程序創建JavaScript對象,該對象描述用戶信息,包括姓名、ID、權限和可用的函數列表。在這種情況下,應用程序首先調用JS_NewObject創建對象。當JavaScript引擎創建對象后,返回一個指針給應用程序。應用程序再調用JavaScript引擎執行腳本。在創建用戶對象后,應用程序即刻傳遞腳本給JS_EvaluateScript以便編譯和運行。腳本獲許取得并校驗用戶信息,然后建立用戶存取的權利。
JavaScript引擎收到初始化請求后,給JavaScript Run-Time分配內存,應用程序使用的變量、對象和上下文都保存在RunTime中。一個上下文是腳本的執行狀態(JavaScript引擎使用的)。每個同時存在的腳本或線程都必須有自己的上下文。單個的JavaScript RunTime可以包含多個上下文、對象和變量。幾乎所有的JavaScript引擎調用都需要一個上下文變量,應用程序在創建RunTime后,首先應調用至少一次JS_NewContext來創建一個上下文。上下文的實際數量依賴于程序中同時使用的腳本數。程序中每個同時存在的腳本都需要一個上下文。另一方面,如果某個時刻只有一個腳本編譯和運行,則只需一個上下文給每個腳本重復使用即可。
3.3.1直接加入方式
絕大部分含有JavaScript代碼的網頁都采用直接加入的方式。
<script type="test/javascript">
document.write("This is Javascript!");
</script>
其中,<script> </script>是 JavaScript的標簽。<script type="test/javascript">用來提示瀏覽器該程序采用JavaScript語言編寫,需要調動相應的解釋程序進行解釋。
除此之外,還有一個更高版本的嵌入腳本,使用HTML中的CDATA語法,就是把CDATA中的文本全部當作純文本處理,當遇到CDATA時結束。
<script language="javascript"type="test/javascript">
<!CDATA[[>
<!]]>
</script>
3.3.2引用方式
如果已經存在一個JavaScript源文件(以js為擴展名),則可以采用引用的方式提高程序代碼的利用率。其基本格式如下:
<script src="url"type="test/javascript"></script>
其中url就是程序文件的地址。
同樣地,這樣的JavaScript程序語句可以放在HTML文檔頭部或主體的任何部分。如果要實現直接加入JavaScript程序代碼,可以首先創建一個JavaScript源代碼文件“javascript.js”,其代碼為 document.write("This is Javascript!")。在網頁中調用程序的方法,如:
<script src="javascript.js"type="test/javascript">
</script>
也可以同時在導入文件時指定JavaScript的版本,如:
<script src="javascript.js" type="test/javascript;version=2.0">
</script>
本文對Linux操作系統的嵌入式瀏覽器進行了研究與分析。分析了嵌入式瀏覽器的結構,并對嵌入式瀏覽器的各部分功能進行闡述,其中包括詞法分析、語法分析與布局、瀏覽器JavaScript支持、I/O端等部分。其中,在嵌入式瀏覽器的研究過程中,詞法分析的算法是開發技術的核心。在后續研究工作中,可以對詞法分析算法做進一步的研究,提高詞法分析的效率,完善嵌入式瀏覽器功能實現的效果。
[1]李永,熊光澤,楊玉平.一種嵌入式瀏覽器設計技術[J].微型機及應用,2001,20(12):57-59.
[2]鐘遙,羅克露.基于壓縮XML嵌入式瀏覽器的實現技術[C].中國西部嵌入式系統與單片機技術論壇2005學術年會,成都,2005.
[3]劉崢嶸,張智超,許振山.嵌入式Linux應用開發詳解[M].北京:機械工業出版社,2004:53-166.