<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                27.2 解釋器模式的定義 解釋器模式(Interpreter Pattern)是一種按照規定語法進行解析的方案,在現在項目中使用較少,其定義如下:Given a language, define a representation for its grammar along with an interpreter that uses the representation to interpret sentences in the language.(給定一門語言,定義它的文法的一種表示,并定義一個解釋器,該解釋器使用該表示來解釋語言中的句子。) 解釋器模式的通用類圖如圖27-4所示。 ![](https://box.kancloud.cn/2016-08-14_57b0036bbd72c.jpg) 圖27-4 解釋器模式通用類圖 ● AbstractExpression——抽象解釋器 具體的解釋任務由各個實現類完成,具體的解釋器分別由TerminalExpression和Non-terminalExpression完成。 ● TerminalExpression——終結符表達式 實現與文法中的元素相關聯的解釋操作,通常一個解釋器模式中只有一個終結符表達式,但有多個實例,對應不同的終結符。具體到我們例子就是VarExpression類,表達式中的每個終結符都在棧中產生了一個VarExpression對象。 ● NonterminalExpression——非終結符表達式 文法中的每條規則對應于一個非終結表達式,具體到我們的例子就是加減法規則分別對應到AddExpression和SubExpression兩個類。非終結符表達式根據邏輯的復雜程度而增加,原則上每個文法規則都對應一個非終結符表達式。 ● Context——環境角色 具體到我們的例子中是采用HashMap代替。 解釋器是一個比較少用的模式,以下為其通用源碼,可以作為參考。抽象表達式通常只有一個方法,如代碼清單27-8所示。 代碼清單27-8 抽象表達式 public?abstract?class?Expression?{ ?????//每個表達式必須有一個解析任務 ?????public?abstract?Object?interpreter(Context??ctx); } 抽象表達式是生成語法集合(也叫做語法樹)的關鍵,每個語法集合完成指定語法解析任務,它是通過遞歸調用的方式,最終由最小的語法單元進行解析完成。終結符表達式如代碼清單27-9所示。 代碼清單27-9 終結符表達式 public?class?TerminalExpression?extends?Expression?{ ?????//通常終結符表達式只有一個,但是有多個對象 ?????public?Object?interpreter(Context?ctx)?{ ?????????????return?null; ?????} } 通常,終結符表達式比較簡單,主要是處理場景元素和數據的轉換。 非終結符表達式如代碼清單27-10所示。 代碼清單27-10 非終結符表達式 public?class?NonterminalExpression?extends?Expression?{ ?????//每個非終結符表達式都會對其他表達式產生依賴 ?????public?NonterminalExpression(Expression...?expression){ ?????} ????? ?????public?Object?interpreter(Context?ctx)?{ ?????????????//進行文法處理 ?????????????return?null; ?????} } } 每個非終結符表達式都代表了一個文法規則,并且每個文法規則都只關心自己周邊的文法規則的結果(注意是結果),因此這就產生了每個非終結符表達式調用自己周邊的非終結符表達式,然后最終、最小的文法規則就是終結符表達式,終結符表達式的概念就是如此,不能夠再參與比自己更小的文法運算了。 客戶類如代碼清單27-11所示。 代碼清單27-11 客戶類 public?class?Client?{ ?????public?static?void?main(String[]?args)?{ ??????????Context?ctx?=?new?Context(); ??????????//通常定一個語法容器,容納一個具體的表達式,通常為ListArray、LinkedList、Stack等類型 ??????????Stack&Expression>?stack?=?null;? ??????????for(;;){ ???????????????//進行語法判斷,并產生遞歸調用 ??????????}?????????? ??????????//產生一個完整的語法樹,由各個具體的語法分析進行解析 ??????????Expression?exp?=?stack.pop(); ??????????//具體元素進入場景 ??????????exp.interpreter(ctx); ?????} } 通常Client是一個封裝類,封裝的結果就是傳遞進來一個規范語法文件,解析器分析后產生結果并返回,避免了調用者與語法解析器的耦合關系。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看