package daicy.formula.evaluator;

import java.util.HashMap;
import java.util.Map; import org.antlr.runtime.ANTLRStringStream;
import org.antlr.runtime.CommonTokenStream;
import org.antlr.runtime.tree.BaseTree; import daicy.formula.ActiveOperand;
import daicy.formula.FormulaLexer;
import daicy.formula.FormulaParser;
import daicy.formula.function.Add;
import daicy.formula.function.FunctionException;
import daicy.formula.function.Max;
import daicy.formula.validator.DataTypeProvider;
import daicy.formula.validator.FunctionTypeValidator;
import daicy.formula.validator.TowNOneNDataTypeProvider;
import daicy.formula.validator.ValidatorException; public class ExpressionValidator extends ExpressionEvaluator { public ExpressionValidator(Map variables) { super(variables); // TODO Auto-generated constructor stub
validators.put(new Max().getName(), new TowNOneNDataTypeProvider());
validators.put(new Add().getName(), new TowNOneNDataTypeProvider());
} // Contains all of the validators in use.
private Map<String, DataTypeProvider> validators = new HashMap(); // call has two oprands ,e.g. call max 2
public ActiveOperand eval(String functionName, ActiveOperand[] arguments)
throws ValidatorException, FunctionException {
FunctionTypeValidator functionTypeValidator = new FunctionTypeValidator();
functionTypeValidator.setFunction(this.getFunction(functionName));
functionTypeValidator.setDataTypeProvider(this.validators
.get(functionName));
return functionTypeValidator.validate(arguments); // stack.push(frame);
// asn 赋值 assign 一个操作数 栈顶元素出栈,存储于数据存储器中
} public static void main(String[] args) throws Exception {
String[] testStr = { "max(3,max(1,2))", "2", "a + b + 3", "a - (b + 3)"
// "a + (b * 3",
// "11.1+12b+a*b", }; for (String s : testStr) {
System.out.println("Input expr: " + s);
run(s);
} } public static void run(String expr) throws Exception {
ANTLRStringStream in = new ANTLRStringStream(expr);
// 词法分析器
FormulaLexer lexer = new FormulaLexer(in); CommonTokenStream tokens = new CommonTokenStream(lexer);
// 语法分析器
FormulaParser parser = new FormulaParser(tokens); FormulaParser.prog_return ret = parser.prog(); Map variables = new HashMap();
variables.put("a", Integer.valueOf(2));
variables.put("b", Integer.valueOf(3)); ExpressionValidator evaluator = new ExpressionValidator(variables); System.out.println(evaluator.eval((((BaseTree) ret.getTree()))));
// System.out.println(((BaseTree)ret.getTree()).toStringTree());
// toStringTree(((BaseTree)ret.getTree()));
}
}
package daicy.formula.validator;

import daicy.formula.ActiveOperand;
import daicy.formula.function.Function;
import daicy.formula.function.FunctionException; /**
* A function that can be specified in an expression.
*/
public class FunctionTypeValidator { public Function function; public DataTypeProvider dataTypeProvider; public Function getFunction() { return function;
} public void setFunction(Function function) { this.function = function;
} public DataTypeProvider getDataTypeProvider() { return dataTypeProvider;
} public void setDataTypeProvider(DataTypeProvider dataTypeProvider) { this.dataTypeProvider = dataTypeProvider;
} /**
* @Title: validate
* @Description:TODO(这里用一句话描述这个方法的作用)
* @param arguments
* @return
* @throws ValidatorException
* @throws FunctionException
* ActiveOperand 返回类型
* @throws
* @date 2013-11-2 下午10:51:27
*/ public ActiveOperand validate(ActiveOperand[] arguments)
throws ValidatorException, FunctionException {
ActiveOperand[] argumentsType = this.getDataTypeProvider()
.getArguments();
ActiveOperand resultType = this.getDataTypeProvider().getResult();
if (null == arguments || arguments.length != argumentsType.length) {
throw new ValidatorException(this.getFunction().getName()
+ "参数个数不对!");
}
for (int i = 0; i < argumentsType.length; i++) {
if (!argumentsType[i].getClazz().isAssignableFrom(
arguments[i].getClazz())) {
throw new ValidatorException(this.getFunction().getName()
+ "的第" + (i + 1) + "个参数的类型不对!");
}
}
ActiveOperand result = this.getFunction().execute(arguments);
if (!resultType.getClazz().isAssignableFrom(result.getClazz())) {
throw new ValidatorException(this.getFunction().getName()
+ "的返回值类型不对!");
} return result;
} }

package daicy.formula.validator;

import daicy.formula.ActiveOperand;
import daicy.formula.function.FunctionException; /**
* @Title: DataTypeProvider.java
* @Package daicy.formula.validator
* @Description: TODO(添加描述)
* @author 代长亚
* @date 2013-11-2 下午8:58:24
* @version V1.0
*/
public interface DataTypeProvider {
/**
* @Title: getArguments
* @Description:TODO(这里用一句话描述这个方法的作用)
* @return
* @throws FunctionException
* ActiveOperand[] 返回类型
* @throws
* @date 2013-11-2 下午8:50:15
*/ public ActiveOperand[] getArguments() throws ValidatorException; /**
* @Title: getResult
* @Description:TODO(这里用一句话描述这个方法的作用)
* @return
* @throws ValidatorException
* ActiveOperand 返回类型
* @throws
* @date 2013-11-2 下午9:20:59
*/ public ActiveOperand getResult() throws ValidatorException;
}

基于antlr的表达式解析器——函数类型验证的更多相关文章

  1. java字符串应用之表达式解析器

    一.表达式的组成    1.数字    2.运算符:+ - / * ^ % =    3.圆括号    4.变量二.运算符优先级    由高到低分别为:+-(正负号).^.*/%.+-.=    优先 ...

  2. OO第四单元——基于UML的UML解析器总结&OO课程总结

    OO第四单元--基于UML的UML解析器总结&OO课程总结 前言:一学期愉快(痛苦)的OO课程学习结束了,OO几个单元作业都各有特色,实验也各有特色,仔细回味起来,不再是单纯的敲代码(但自己还 ...

  3. 基于Jquery的XML解析器,返回定制的HTML

    依据HTML模板返回解析的XML 依赖jQuery 1.4​1. [代码]基于Jquery的xml解析器并返回定制的HTML     /** *  jQuery插件 *  Author: pureco ...

  4. OSS.Core基于Dapper封装(表达式解析+Emit)仓储层的构思及实现

    最近趁着不忙,在构思一个搭建一个开源的完整项目,至于原因以及整个项目框架后边文章我再说明.既然要起一个完整的项目,那么数据仓储访问就必不可少,这篇文章我主要介绍这个新项目(OSS.Core)中我对仓储 ...

  5. [LeetCode] Ternary Expression Parser 三元表达式解析器

    Given a string representing arbitrarily nested ternary expressions, calculate the result of the expr ...

  6. C 四则运算表达式解析器

    下载实例:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1074 程序主要包括:基础结构定义.词法分析.语法分 ...

  7. 基于SSH2框架Struts2拦截器的登录验证实现(转)

        大象在这里假设你已经弄清楚了Struts2拦截器的基本概念,可以进入实际运用了.那么我们在之前的基础上只需要做下小小的改变,就可以使用Struts2的拦截器机制实现登录的验证.     修改数 ...

  8. dom4j解析器 基于dom4j的xpath技术 简单工厂设计模式 分层结构设计思想 SAX解析器 DOM编程

    *1 dom4j解析器   1)CRUD的含义:CreateReadUpdateDelete增删查改   2)XML解析器有二类,分别是DOM和SAX(simple Api for xml).     ...

  9. 基于Java的简易表达式解析工具(一)

    最近需要用到相关表达式解析的工具,然后去网上搜索,找到了一个用C#写的表达式解析工具,仔细看了功能后发现,这正是我需要的,如果我能将它改造成基于Java语言的方式,岂不是更好吗,所以花了一段时间,把网 ...

  10. atitit.java解析sql语言解析器解释器的实现

    atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...

随机推荐

  1. 《Effective TypeScript》条款21 - 类型扩展

    本文主要通过一些实际的代码示例,来帮助大家理解什么是类型扩展,本文主要内容如下: 什么是类型扩展 代码示例 总结 什么是类型扩展? TypeScript 需要从你指定的单一值中决定一组可能的值,这个过 ...

  2. sql查询死锁

    --每秒死锁数量 SELECT * FROM sys.dm_os_performance_counters WHERE counter_name LIKE 'Number of Deadlocksc% ...

  3. JavaScript – Object.groupBy & Map.groupBy

    前言 group by 是一个很常见的功能,但 JS 却没有 build-in 的方法,一直到 es2024 才有 Object.groupBy (前生是 Array.prototype.group) ...

  4. QT6 QML编程

    QT6 QML编程 使用AI技术辅助生成 QT界面美化视频课程 QT性能优化视频课程 QT原理与源码分析视频课程 QT QML C++扩展开发视频课程 免费QT视频课程 您可以看免费1000+个QT技 ...

  5. Windows NoiLinux

    在 Windows 下使用 NoiLinux ubuntu-noi-v2.0.iso 下载 ubuntu-noi-v2.0.iso 打开 VMWare,创建新的虚拟机 -> 自定义(高级)-&g ...

  6. UEFI原理与编程(三)

    1 开发UEFI服务 本质Protocol 就是包含属性和函数指针的结构体,功能上来说就是提供者和使用者对服务的一种约定. 2 开发UEFI驱动 一个设备/总线驱动程序在安装时首要找到对应的硬件设备( ...

  7. 数据库日常实操优质文章分享(含Oracle、MySQL等) | 11月刊

    墨天轮社区正持续举办[聊聊故障处理那些事儿]DBA专题征文活动中,每月进行评优发奖,鼓励大家记录工作中遇到的数据库故障处理过程,不仅用于自我复盘与分析,同时也能帮助其他的同仁们避坑. 这里为大家整理出 ...

  8. iOS长按手势列表拖拽功能实现

    项目开发中遇到拖拽功能的需求,具体要求是在编辑状态下,首页底部菜单项可以拖动位置,便于位置切换.遇到问题后的初步想法是添加拖拽手势,拖拽到某个位置,判断拖拽cell的中心点是否在另一个cell内,这样 ...

  9. 前端面试题axaios携带 cookies

    配置 axios.default.widthCredentials = true;

  10. 3.flask 源码解析:路由

    目录 一.flask 源码解析:路由 1.1 构建路由规则 1.2 werkzeug 路由逻辑 1.3 flask 路由实现 1.4 match 实现 Flask 源码分析完整教程目录:https:/ ...