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. 深入理解Argo CD工作原理

    1. ArgoCD 的架构 ArgoCD 是一个 Kubernetes 原生的持续交付工具,它通过监控 Git 仓库中的应用定义来自动部署应用到 Kubernetes 集群.其核心架构由以下几个关键组 ...

  2. MySQL服务无法启动 服务没有报告任何错误

    安装MYSQL后 启动服务 出现错误 在启动MySQL服务时 出现该报错 解决方法: 将原本在MySQL根目录下的my.ini文件移动到bin目录下(my.ini文件参考:这里)    删除根目录下的 ...

  3. IDEA 换了电脑,如何导入和导出配置?

    前言 我们在使用IDEA开发时,经常会设置各种各样的配置,时间一长,就会有很多个性化的东西.用起来也越来越顺手.   不过这里可能会有个问题,那就是哪一天我们要换个电脑了,或者想安装新版本的IDEA时 ...

  4. 解决每次调试flask需要重启本地服务器的方法

    export FLASK_ENV=development export FLASK_APP=hello.py flask run --debug

  5. WPF下使用FreeRedis操作RedisStream实现简单的消息队列

    Redis Stream简介 Redis Stream是随着5.0版本发布的一种新的Redis数据类型: 高效消费者组:允许多个消费者组从同一数据流的不同部分消费数据,每个消费者组都能独立地处理消息, ...

  6. react native 环境搭建遇到问题

    关于pod install 慢的要死的问题 解决方法记录     开始时显示ruby有问题,卸载cocoapods重装的   然后启动不起来,到ios目录下执行 pod install   然后太慢尝 ...

  7. foobar2000 v2.1.6 汉化版

    foobar2000 v2.1.6 汉化版 -----------------------[软件截图]---------------------- -----------------------[软件 ...

  8. Transformer原理+代码详解

    简介 Transformer是一种深度学习模型,它在自然语言处理(NLP)领域中非常流行和有效.它最初由Vaswani等人在2017年的论文<Attention is All You Need& ...

  9. element输入天数,获取当前时间加上天数 【时间获取】

    handleInput (val) { // console.log(this.formModel.ITEM_PM) if (!(/[^\d]/g).test(val)) { // console.l ...

  10. 基于乐鑫 ESP32-C3 的 Matter Light 实践

    背景介绍 最近公司在研究 Matter 协议在智能家居领域的市场机会,考虑到易用性和文档支撑等方面,相比较 Telink,产品部门对乐鑫的 Matter-SDK 更感兴趣,因而开展了一些测试工作,毕竟 ...