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. LoRA大模型微调的利器

    LoRA模型是小型的Stable Diffusion模型,它们对checkpoint模型进行微小的调整.它们的体积通常是检查点模型的10到100分之一.因为体积小,效果好,所以lora模型的使用程度比 ...

  2. c程序设计语言 by K&R(一)一些c语言基础知识

    出自<c程序设计语言> by K&R: 一.导言 二.类型.运算符与表达式 三.控制流 1. 字符输入与输出 getchar() 和 putchar(),输入一个字符.输出一个字符 ...

  3. 爬虫案例2-爬取视频的三种方式之一:requests篇(1)

    @ 目录 前言 爬虫步骤 确定网址,发送请求 获取响应数据 对响应数据进行解析 保存数据 完整源码 共勉 博客 前言 本文写了一个爬取视频的案例,使用requests库爬取了好看视频的视频,并进行保存 ...

  4. Angular Material 18+ 高级教程 – Material Form Field

    介绍 Form Field 或 Text Field 是 Material Design 独有的设计风格 .它长这样 注:Material Design 管它叫 Text Field,Angular ...

  5. 使用Navicat Premium 将数据库导入、导出方法

    数据库导出 1.双击要导出的数据库,右键选转储SQL文件-,选择要保存的文件夹. 2.点击开始后,开始导出. 数据库导入 1.新建数据库,数据库的名字必须和导入的数据库文件一致. 2.在新建的数据库右 ...

  6. 冒泡排序和一点优化(php)

    function maopao($arr){ $len = count($arr);//获取数组的长度 //有多少个数组元素就最多就要排n-1次 for ($j=0;$j<$len-1;$j++ ...

  7. 使用SourceTree管理仓库代码

    1.首先我们需要下载sourcetree,你可以去官网下载自己需要的版本. 2.安装完毕之后,我们需要获取ssh密钥与github关联上才能使用 按下面的操作开始执行.确定之后,会出现一个字符界面,输 ...

  8. OCR+PDF解析配套前端工具开源详解!

    面对日常生活和工作中常见的OCR识别.PDF解析.翻译.校对等场景,配套的可视化工具能够极大地提升我们的使用体验和工作效率. 通过可视化界面,我们可以直观地看到文本识别.解析和翻译的结果,便捷评估产品 ...

  9. 如何使用echarts

    官网:https://echarts.apache.org/handbook/zh/get-started/ a 下载js文件并引入 b 初始化实例对象 echarts.init(获取盒子对象)  关 ...

  10. Spring中的事务提交事件

    如果想在spring操作事务结束后执行一些代码,应该怎么办? 为什么要这样?比如我们在事务中给其他系统发了消息,期望事务提交后过一会收到这个系统的回应,然后操作刚刚提交的数据.但是如果回应来的太快就像 ...