本篇内容主要讲解“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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。