• 沒有找到結果。

五、 系統設計與實作

5.2 改編協調伺服器之設計與實作

5.2.1 描述檔剖析器製作

描述檔剖析器(Script parser)主要功能是擷取描述檔內容資訊,在製作剖 析器之前我們要先瞭解原始多媒體描述格式結構。下面是一個典型的文字多媒體 描述方式:

圖 14: EBS 描述檔範例圖

我們可以由上面的例子看到文字多媒體的所有屬性,包括了有多媒體物件的座 標、文字的字形、文字的大小、以及斷行數另外還有動畫的路徑呈現。

在這裡我們會運用到複雜的編譯器設計的過程(compiler process)及技巧,不 過如果只是單純的要擷取多媒體物件屬性值的話,我們可以採用暴力法直接掃瞄 檔案的關鍵字即可。但是我們選擇利用compiler 的過程技術考量是為了原本的 描述檔不僅僅記錄著多媒體物件屬性值,還記錄著劇情的呈現及它們之間的互動 甚或是動畫呈現。此外如果我們利用暴力法來解譯描述內容的話,這對未來的描 述格式維護相當不易。因此我們會利用到編譯器設計的過程間接產生的剖析樹 (parsing tree)來記錄整個多媒體屬性值及劇情描述過程等等,此外 parsing tree 也比較好維護內容描述檔的結構及未來描述檔的維護工程,甚至在目標模

組(Target module)寫出相對應的 XML 文件也來得比較方便。

下圖15 是運用製作編譯器過程來擷取多媒體物件屬性值的過程:

圖 15:parsing script 運作過程圖

我們看到上圖15 中所示的,原本的描述檔內容會經由詞彙分析器(Lexical Analyzer)產生字元流(tokens stream),然後在交由 parser generator 的 yacc 產生的文法剖析器(Grammar Parser)進行文法比對,之後會產生一個 parsing tree 結構出來。我們以樣板式多媒體試題的內容來說,這裡的 parsing tree 結構會如下圖 16 所示:

圖 16: Parsing Tree

而在描述檔裡的多媒體所有資訊都儲存在這棵樹狀結構裡,例如多媒體物件的屬 性值就記錄在上圖16 中的[actorinfo]節點下的子節點之下,描述劇情的部分則 記錄在[scenario]節點下的子節點之下。要取得他們的資訊可以利用 Tree

Traversal 也就是圖 15 的 walktree routine。

接下來底下我會介紹比較跟compiler相關的細節部分。我們必須借助UNIX上的 工具lexical analyzer generator-lex[25]來完成我們的詞彙分析器(Lexical Analyzer),以及利用UNIX上的工具parser generator-yacc[25]來完成我 們的文法剖析器(Grammar Parser)製作。

z 詞彙分析器(Lexical Analyzer):

首先我們必須先撰寫一份lex 原始碼用來定義我們的描述檔所用的字詞,本 描述檔所用的詞彙比較簡單,只能要夠辨認Identity、Integer number、

Keyword、String 及常見的 operator(+ - =)即可,lex 的寫法是以 Regular expression 來辨認字是屬於哪種型態之 token。四種型態的 Regular

expression 如下:

Integer number : [0-9]+

Identity : [a-zA-Z_][a-zA-Z_0-9]*

String : \"([^"\n]|\\["\n])*\"

Keyword : "CAST"|"MCText"|"Begin"|"End"…

經由lex 會將描述檔的文句產字元流(tokens stream)。

z 文法剖析器(Grammar Parser):

詞彙分析器(Lexical Analyzer)將原來的描述檔內容拆成字元流(tokens stream),交由文法剖析器(Grammar Parser)以驗證描述檔裡的描述文法 合理之外,並會同時產生parsing tree 的資料結構。在製作文法剖析器必須 撰寫一份yacc 程式碼以定義描述檔描述文法,以下是以文字演員為例子:

CastInfo : LBRACK CAST RBRACK MCTEXT _BEGIN Cast_Statement_List _END

Cast_Statement_List : Cast_Statement

| Cast_Statement Cast_Statement_List

Cast_Statement : Cast_Ident ASGN Expression_Right Expression_Right : Cast_Right_List

| Cast_Ident

Cast_Right_List : Cast_Right

| Cast_Right_List Cast_Right Cast_Right : Cast_Integer

| STRING

| LPAREN Cast_Integer COMMA Cast_Integer RPAREN

在比對文法的過程中,除了錯誤處理之外,再來必須在過程中把Parsing Tree 以bottom up 方式建出來,也就是在有用的文法裡撰寫 action code,通常是 創建樹狀結構的節點(Tree Node)以記錄資訊,另外所謂有用的文法是在有需要 的資訊必須在此文法比對將之保留住。

相關文件