自定義語言的實現——解釋器模式(一) – JAVA編程語言程序開發技術文章

雖然目前計算機編程語言有好幾百種,但有時候我們還是希望能用一些簡單的語言來實現一些特定的操作,我們隻要向計算機輸入一個句子或文件,它就能夠按照預先定義的文法規則來對句子或文件進行解釋,從而實現相應的功能。例如提供一個簡單的加法/減法解釋器,隻要輸入一個加法/減法表達式,它就能夠計算出表達式結果,如圖18-1所示,當輸入字符串表達式為“1 + 2 + 3 – 4 + 1”時,將輸出計算結果為3。

圖18-1  加法/減法解釋器示意圖
       我們知道,像C++、Java和C#等語言無法直接解釋類似“1+ 2 + 3 – 4 + 1”這樣的字符串(如果直接作為數值表達式時可以解釋),我們必須自己定義一套文法規則來實現對這些語句的解釋,即設計一個自定義語言。在實際開發中,這些簡單的自定義語言可以基於現有的編程語言來設計,如果所基於的編程語言是面向對象語言,此時可以使用解釋器模式來實現自定義語言。
18.1 機器人控制程序
       Sunny軟件公司欲為某玩具公司開發一套機器人控制程序,在該機器人控制程序中包含一些簡單的英文控制指令,每一個指令對應一個表達式(expression),該表達式可以是簡單表達式也可以是復合表達式,每一個簡單表達式由移動方向(direction),移動方式(action)和移動距離(distance)三部分組成,其中移動方向包括上(up)、下(down)、左(left)、右(right);移動方式包括移動(move)和快速移動(run);移動距離為一個正整數。兩個表達式之間可以通過與(and)連接,形成復合(composite)表達式。
       用戶通過對圖形化的設置界面進行操作可以創建一個機器人控制指令,機器人在收到指令後將按照指令的設置進行移動,例如輸入控制指令:up move 5,則“向上移動5個單位”;輸入控制指令:down  run 10 and left move 20,則“向下快速移動10個單位再向左移動20個單位”。
       Sunny軟件公司開發人員決定自定義一個簡單的語言來解釋機器人控制指令,根據上述需求描述,用形式化語言來表示該簡單語言的文法規則如下: www.aiwalls.com
expression ::= direction action distance | composite //表達式
composite ::= expression 'and' expression //復合表達式
direction ::= 'up' | 'down' | 'left' | 'right' //移動方向
action ::= 'move' | 'run' //移動方式
distance ::= an integer //移動距離
       上述語言一共定義瞭五條文法規則,對應五個語言單位,這些語言單位可以分為兩類,一類為終結符(也稱為終結符表達式),例如direction、action和distance,它們是語言的最小組成單位,不能再進行拆分;另一類為非終結符(也稱為非終結符表達式),例如expression和composite,它們都是一個完整的句子,包含一系列終結符或非終結符。
       我們根據上述規則定義出的語言可以構成很多語句,計算機程序將根據這些語句進行某種操作。為瞭實現對語句的解釋,可以使用解釋器模式,在解釋器模式中每一個文法規則都將對應一個類,擴展、改變文法以及增加新的文法規則都很方便,下面就讓我們正式進入解釋器模式的學習,看看使用解釋器模式如何來實現對機器人控制指令的處理。

作者:劉偉

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。