Atitit. 解释器模式框架选型 and应用场景attilax总结 oao

1. 解释器模式结构描述 1

2. 如何实现(简单的解释器模式,仅仅通过词法分析即可实现,而无需token流进行处理。 2

3. 单词流必须识别为保留字,标识符(变量),常量,操作符(运算符 )和界符五大类 2

3.1. 操作符(运算符 )::: 2

3.2. 4.界符:“;”分号,“{}”大括号,单引号,双引号
3

4. TerminalExpression和NonterminalExpression是两个实现。
3

5. 应用场景 3

5.1. 汉字转化为数字 3

5.2. Sql,hql,Criteria 转换hibernate 3

5.3. 表达式解析 4

5.4. 翻译词典 4

6. 解释器框架选型 4

1. 解释器模式结构描述

Context存储的全局上下文环境,AbstractExpression是所有表达式必须继承的接口,TerminalExpression和NonterminalExpression是两个实现。

除了上述用于表示表达式的类以外,通常在解释器模式中还提供了一个环境类Context,用于存储一些全局信息,通常在Context中包含了一个HashMap或ArrayList等类型的集合对象(也可以直接由HashMap等集合类充当环境类),存储一系列公共信息,如变量名与值的映射关系(key/value)等,用于在进行具体的解释操作时从中获取相关信息。其典型代码片段如下:

class Context {

private HashMap map = new HashMap();

public void assign(String key, String value) {

//往环境类中设值

}

public String  lookup(String key) {

//获取存储在环境类中的值

}

}

当系统无须提供全局公共信息时可以省略环境类,可根据实际情况决定是否需要环境类。

作者:: 老哇的爪子 Attilax 艾龙,  EMAIL:1466519819@qq.com

转载请注明来源: http://blog.csdn.net/attilax

2. 如何实现(简单的解释器模式,仅仅通过词法分析即可实现,而无需token流进行处理。

事实上,有些简单的解释器模式,仅仅通过词法分析即可实现,功能可以写在状态改变函数中,而无需对产生的token流进行处理。

3. 单词流必须识别为保留字,标识符(变量),常量,操作符(运算符 )和界符五大类

3.1. 操作符(运算符 ):::

() [] -> .

? :

条件

由右向左

() [] -> .

括号(函数等),数组,两种结构成员访问

由左向右

,

逗号(顺序)

+ -

加,减

由左向右

括号,纺括号,等号

参考

编译器DIY——词法分析 - GodLike - 博客频道 - CSDN.NET.htm

操作符要使用一个状态来描述的...

3.2. 4.界符:“;”分号,“{}”大括号,单引号,双引号

界符在处理的时候儿,林吧过滤...

4. TerminalExpression和NonterminalExpression是两个实现。

通常来说,操作符(运算符 )要使用NonterminalExpression来实现,建立一个class 来实现,

一个op一个class

5. 应用场景

5.1. 汉字转化为数字

的项目中,随着需要解析的汉字数据越来越大,需要解析方法能够随之处理更大级别的数据(万,亿…),通过扩展Express类,产生能够解析新增的级别的处理方法

5.2. Sql,hql,Criteria 转换hibernate

Criteria 2sql  可以使用hb的api

5.3. 表达式解析

5.4. 翻译词典

6.  解释器框架选型

6.0.1.1. 最佳实践

解释器模式在实际的系统开发中使用的非常少,因为它会引起效率、性能以及维护等问题,一般在大中型的框架型项目能够找到它的身影,比如一些数据分析工具、 报表设计工具、科学计算工具等等,若你确实遇到“一种特定类型的问题发生的频率足够高”的情况,准备使用解释器模式时,可以考虑一下 Expression4J、MESP(Math Expression String Parser)、Jep等开源的解析工具包(这三个开源产品都可以百度、Google中搜索到,请读者自行查询),功能都异常强大,而且非常容易使用,效 率也还不错,实现大多数的数学运算完全没有问题,自己没有必要从头开始编写解释器,有人已经建立了一条康庄大道,何必再走自己的泥泞小路呢?

Expression4J   百度28个

MESP  解释器   20个

参考

自定义语言的实现——解释器模式(三) - 刘伟技术博客 - 博客频道 - CSDN.NET.htm

Atitit. 解释器模式框架选型 and应用场景attilax总结 oao的更多相关文章

  1. atitit.自己动手开发编译器and解释器(2) ------语法分析,语义分析,代码生成--attilax总结

    atitit.自己动手开发编译器and解释器(2) ------语法分析,语义分析,代码生成--attilax总结 1. 建立AST 抽象语法树 Abstract Syntax Tree,AST) 1 ...

  2. atitit.html编辑器的设计要点与框架选型 attilax总结

    atitit.html编辑器的设计要点与框架选型 attilax总结 1. html编辑器的设计要求1 1.1. 障碍訪问 1 1.2. 强大Ajax上传 1 1.3. Word完美支持 2 1.4. ...

  3. 设计模式(二十一)——解释器模式(Spring 框架中SpelExpressionParser源码分析)

    1 四则运算问题 通过解释器模式来实现四则运算,如计算 a+b-c 的值,具体要求 1) 先输入表达式的形式,比如 a+b+c-d+e,  要求表达式的字母不能重复 2) 在分别输入 a ,b, c, ...

  4. Atitit.js javascript的rpc框架选型

    Atitit.js javascript的rpc框架选型 1. Dwr1 2. 使用AJAXRPC1 2.2. 数据类型映射表1 3. json-rpc轻量级远程调用协议介绍及使用2 3.1. 2.3 ...

  5. atitit.ajax 最佳实践跟框架选型 o99

    atitit.ajax 最佳实践跟框架选型 1. 选型框架dwr/dwr3 跟jq 1 2. DWR方便的地方分为两个地方. 1 3. dwr 优点: 1 4. 缺点: 2 5. 根jq的区别 2 1 ...

  6. atitit. groupby linq的实现(1)-----linq框架选型 java .net php

    atitit.  groupby linq的实现(1)-----linq框架选型 java .net php 实现方式有如下 1. Dsl/ Java8 Streams AP ,对象化的查询api , ...

  7. atitit.RESTful服务的概览and框架选型

    atitit.RESTful服务的概览and框架选型 1. REST基础概念: 1 2. URL说明: 1 3.  1 4. RESTful框架选型 2 1. spring mvc( recomm) ...

  8. atitit.软件开发--socket框架选型--netty vs mina j

    atitit.软件开发--socket框架选型--netty vs mina j . Netty是由JBOSS提供的一个java开源框架 Apache mina 三.文档比较 mina文档多,,, 好 ...

  9. Atitit.linq java的原理与实现 解释器模式

    Atitit.linq java的原理与实现 解释器模式 1. Linq  from  where 的实现1 2. Where expr 的实现1 3. Attilax的一点变化2 4. 解释器模式的 ...

随机推荐

  1. LaTeX绘图宏包 Pgfplots package

    Pgfplots package The pgfplots package is a powerful tool, based on tikz, dedicated to create scienti ...

  2. [Ubuntu]明明白白安装中文字体

    Ubuntu 6.06 dapper对中文的支持应该说是一向不错的,包括现在默认安装就包含了scim输入法.然而,一般安装的ubuntu虽然能够显示.输入中文了,但总觉 得所显示的中文像歪瓜裂枣,很是 ...

  3. win8自带输入法如何切换全角、半角操作流程

    原文参考:http://jingyan.baidu.com/article/066074d6620c45c3c21cb0d3.html 曾经不知道怎么切换半角全角的时候非常抓狂(原因是不知道是半角全角 ...

  4. JavaWeb学习笔记:ServletConfig()和ServletContext()

    ServletConfig()和ServletContext() 1.ServletConfig() ServletConfig是一个接口,它由server提供商来实现. ServletConfig封 ...

  5. 了解Redis 和 Memcached 的区别

    1.Redis支持服务器端的数据操作:Redis相比Memcached来说,拥有更多的数据结构和并支持更丰富的数据操作,通常在Memcached里,你需要将数据拿到客户端来进行类似的修改再set回去. ...

  6. 公司上线流程 pushonline_alpha

     这是在公司将服务部署上线的一个记录,只是部署很小的python脚本,各公司不同,参考性不是很大 开始吧(版本管理是git) 1.整理好代码后:git add xxx.py git commit -m ...

  7. ftm时钟源

    FTMx_SC中的 CLKS时钟选择位 00 :无 01: System clock 10:Fixed frequency clock 11 External clock 此处的01:System c ...

  8. Understanding the JavaScript Engine—— two phase

    Understanding the JavaScript Engine — Part 1   I have been a Ruby on Rails developer for the last 2 ...

  9. 【pyhon】黑客用字典暴力破解Zip文件密码原理性展示

    基本原理:用程序把字典文件里拟定好的密码一个个提取出来,去测试zip能否打开 字典文件pass.txt内容: 1224 2121 asdf abcd1234 dwsdsd dssds 程序代码: # ...

  10. KineticJS教程(3)

    KineticJS教程(3) 作者: ysm  3.图形对象 3.1.Shape Kinetic提供了一个Shape对象用于在层上绘制图形,我们可以通过Kinetic.Shape()构造方法返回一个S ...