您好,登錄后才能下訂單哦!
本篇內容主要講解“web解釋器模式的動機是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“web解釋器模式的動機是什么”吧!
意圖
根據語言的語法定義實現一個解釋器,用于解釋執行該語言的語句。
動機
一般來講,軟件解決問題都是通過程序員編寫程序實現的。例如進行計算,通信等。這種方式在大部分情況下是有效的,但是當需求多變的時候,則存在不夠靈活的問題。解決這個問題的方法有很多種,例如為處理增加參數,或通過處理的組合形成新處理等等。在某些情況下,如果可以將問題歸納提煉得出某些簡單的語句,就可以構建一個解釋器來解釋并執行。
數學計算就屬于這種情況,例如下面的表達式:
100.0 * sin(29 + (23 * 6)) + sqrt(cos(34 * 5))
對于不同的表達式,輸入數據的個數、層級的構成都會不同。這時相對現實的解決辦法就是定義一種規則,然后按照這個規則來實現一個解釋器并利用這個解釋器來解釋和執行用戶的輸入。對于復合算式的例子來講,執行就是計算出結果。首先我們來定義表達式的規則:
[1]Expr::= AdditiveExpr
【::=】的含義是【定義為】。因此式[1]可以理解為表達式Expr定義為加法表達式AdditiveExpr。
[2] AdditiveExpr::=MultiplicativeExpr ( ("+" | "-") MultiplicativeExpr )*
【|】的含義是【或者】,【*】的含義是【0到任意多個】。因此式[2]的含義就是加法表達式AdditiveExpr定義為一個乘法表達式MultiplicativeExpr后面跟著0到任意多個前面帶正號或負號的乘法表達式。換一種說法就是若干個被正號或負號連接的乘法表達式。
[3]MultiplicativeExpr::= UnaryExpr ( ("*" | "/" | "%" ) UnaryExpr)*
式[3]的含義是乘法表達式MultiplicativeExpr定義為若干個由乘號或除號或取余符號連接的元表達式UnaryExpr構成。
[4]UnaryExpr::=("-" | "+")?PrimaryExpr
【?】的含義是【有或者沒有】。式[4]的含義是元表達Unary式定義為前面帶或者不帶正負號的基本表達式PrimaryExpr。
[5]PrimaryExpr::= NumericLiteral | ParenthesizedExpr | FunctionCall
式[5]的含義為基本表達式PrimaryExpr可以是數值型字面值NumerLiteral、帶括號表達式ParemthesizedExpr、函數調用中的某一種。
[6]NumericLiteral::=IntegerLiteral | DecimalLiteral
數值型字面值定義為整數型字面值IntergerLiteral或者小數型字面值DecimalLiteral。
[7]ParenthesizedExpr::="(" Expr ")"
帶括號表達式定義為被小括號包圍的表達式。表達式又可以進一步分解為加法表達式、乘法表達式等。
[8]FunctionCall::=FunctionName "(" (Expr(","Expr)*)? ")"
函數調用表達式FunctionCall由函數名FunctionName和包含在括號中的參數列表組成。參數列表由多個用逗號連接的表達式組成。
[9]IntegerLiteral ::=Digits
整數型字面值IntegerLiteral定義為數字Digits。
[10]DecimalLiteral ::=(("." Digits) | (Digits"."Digits))
小數型字面值DecimalLiteral有兩種形式。一種是小數點加數字,另一種是數字加小數點再加數字。
[11]Digits ::=[0-9]+
【+】的含義是【1到多個】,【[0-9]】表示數字0到9之間的某一個。因此式[11]的含義就是數字定義為1到多個字符0到字符9之間的字符。
[12] FunctionName=sin|cos|tan|asin|acos|atan|power|sqrt
式[12]定義可能的函數名。
到此,相信大家對“web解釋器模式的動機是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。