U9 研发(Expression 使用手册) 文件编号:U9-SE-××-SPEC-×× 版本号: V1.0 修改状态: 编写人: 熊悦悦 审核人: 刘小东 适用对象 该规范适用于底层开发程序员。 版本记录 【此部分要记录该文档形成过程中的历次版本变更过程及变更的内容】 版本 修改与参与人 修改时间 修改原因 修改概述 审批人1.0 熊悦悦 2008/07/10 原始文档建立 刘小东 1.概述 UFIDA Expression 是一套表达式解析套件,它解析执行表达式,并返回执行结果。 2.构架原理 2.1 基础构架 在 U9 平台中,提供 ExpressionParser 对象对表达式进行解析,产生 AST(抽象语法树)。然后通过 Translator 对 AST 进行翻译,执行表达式树。主要内容包括: 1. 抽象语法树(Abstract Syntax Tree, AST)框架, 包括一组可以重用的表达式对象 2. 一组相关的小语言的词法,语法分析器(包括通用表达式,OQL, 报表表达式,MVC 公式), 相关语言的 Lex 风格的词法规范,Yacc 风格的语法规范 3. 一个通用栈式求值器 4. 一组 Streamer, 将 AST 展开成文本形式,即语法分析器的’逆操作’ 5. 自定义函数的扩展定义和执行机制, 可以用 C#语言为你设计的语言提供’系统函数’定义。 6. 一个简单的带控制流的栈式解释器 2.2 设计理念: 1. 用户可以自定义各种’小’语言,但各种语言都共享同样的抽象语法树结构。这样,自定义语言的词法,语法与它们的对象表达方式解耦。在语言设计的早期, 词法,语法的变动比较大,但由于所有的代码都针对 AST, 所以对文法形式的改动不会影响代码。 2. 基于 GoF(95)的 Visitor 设计模式, 表达式的所有操作被委托给 Visitor 接口。这样,我们可以对同样的表达式进行不同的操作,如求值,转换文本表达,类型检查等,并且可以随意增加新的操作类型,这也是 Visitor 模式的本质。 3. GoF(95)的 Strategy 模式,使得 Parser 可以替换。基于 AST 使得我们可以用多个 Parser 分析同样的语言,返回同样的 AST。目前的各 Parser 都是由一个 C#版的 Lex/Yacc 兼容工具生成的,以后还可以手写递归下降的 Parser,只需配置一下即可。所有的代码都不用改。Streamer, Evaluator 等工具类也是一样。 4. 多语言支持与表达式类型的关系: 各种语言都建立在表达式的基础上,因此它们都共享一套公共的表达式类型,但每个语言还扩展定义了各自的类型,如 OQL 对象查询语言引入了 OPath表达式,MVC Formula 引入了 If 表达式和 return 表达式, 都放在各自的名空间中。 IExpression: 表示任意一个语法树节点 框架的接口和核心表达式类型都在UFSoft.UBF.Util.Expression.Framework 中。 常用的,各应用语言模块共享的表达式类型在UFSoft.UBF.Util.Expression.Core 中。 OQL 对象查询语言表达式类型,和 SQLBuilder/SQL 语言共享的类型放在UFSoft.UBF.Util.Expression.Query 中。 MVC 公式表达式类型放在 UFSoft.UBF.Util.Expression.Program 中 IExpressionParser: 5. 多语言与工具类的关系 所有客户使用的工具类都是接口,提供以下服务 IExpressionParser: 将一段文本解析成 IExpression 树 IExpressionStreamer: 将一个 IExpression 树转换成文本形式 IExpressionEvaluator: 在给定上下文中对 IExpression 树求值 IIntEvalutor IRealEvalutor ILogicEvalutor 每个语言模块都有上述接口对应的(或共享的)实现类,但使用者只需关心接口,并用下列方法从工厂取得接口即可: 如报表模块使用表达式框架工具,采用下列代码: IExpressionParser parser = ParserFactory.CreateParser(“report”); IExpressionStreamer streamer = StreamerFactory.CreateStreamer(“report”); 获取相应于报表表达式语言的工具接口 如 MVC 模块使用表达式框架工具,采用下列代码: IExpressionParser parser = ParserFactory.CreateParser(“Gui”); IExpressionStreamer streamer = StreamerFactory.CreateStreamer(“gui”); 获取相应于 MVC 表达式语言...