基于antlr的表达式解析器——函数类型验证
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的表达式解析器——函数类型验证的更多相关文章
- java字符串应用之表达式解析器
一.表达式的组成 1.数字 2.运算符:+ - / * ^ % = 3.圆括号 4.变量二.运算符优先级 由高到低分别为:+-(正负号).^.*/%.+-.= 优先 ...
- OO第四单元——基于UML的UML解析器总结&OO课程总结
OO第四单元--基于UML的UML解析器总结&OO课程总结 前言:一学期愉快(痛苦)的OO课程学习结束了,OO几个单元作业都各有特色,实验也各有特色,仔细回味起来,不再是单纯的敲代码(但自己还 ...
- 基于Jquery的XML解析器,返回定制的HTML
依据HTML模板返回解析的XML 依赖jQuery 1.41. [代码]基于Jquery的xml解析器并返回定制的HTML /** * jQuery插件 * Author: pureco ...
- OSS.Core基于Dapper封装(表达式解析+Emit)仓储层的构思及实现
最近趁着不忙,在构思一个搭建一个开源的完整项目,至于原因以及整个项目框架后边文章我再说明.既然要起一个完整的项目,那么数据仓储访问就必不可少,这篇文章我主要介绍这个新项目(OSS.Core)中我对仓储 ...
- [LeetCode] Ternary Expression Parser 三元表达式解析器
Given a string representing arbitrarily nested ternary expressions, calculate the result of the expr ...
- C 四则运算表达式解析器
下载实例:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1074 程序主要包括:基础结构定义.词法分析.语法分 ...
- 基于SSH2框架Struts2拦截器的登录验证实现(转)
大象在这里假设你已经弄清楚了Struts2拦截器的基本概念,可以进入实际运用了.那么我们在之前的基础上只需要做下小小的改变,就可以使用Struts2的拦截器机制实现登录的验证. 修改数 ...
- dom4j解析器 基于dom4j的xpath技术 简单工厂设计模式 分层结构设计思想 SAX解析器 DOM编程
*1 dom4j解析器 1)CRUD的含义:CreateReadUpdateDelete增删查改 2)XML解析器有二类,分别是DOM和SAX(simple Api for xml). ...
- 基于Java的简易表达式解析工具(一)
最近需要用到相关表达式解析的工具,然后去网上搜索,找到了一个用C#写的表达式解析工具,仔细看了功能后发现,这正是我需要的,如果我能将它改造成基于Java语言的方式,岂不是更好吗,所以花了一段时间,把网 ...
- atitit.java解析sql语言解析器解释器的实现
atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...
随机推荐
- 【Docker学习教程系列】7-如何将本地的Docker镜像发布到阿里云
在上一篇中,我们使用docker commit 命令,创建了一个带有vim的Ubuntu镜像.那么怎么将这个镜像分享出去呢?本文就来讲解如何将本地的docker镜像发布到阿里云上. 本文主要内容: 1 ...
- C语言指针的作业
指针的作业 求Sn = a + aa + aaa + aaaa + aaaaa的前五项和,其中a是一个数字. 例如:2 + 22 + 222 + 2222 + 22222 /* 求Sn = a + a ...
- 高维前缀和 (SOSDP)
算法介绍--高维前缀和 引入 我们都知道二维前缀和有这么一个容斥的写法: for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ s[i][j]=s[i ...
- 【YashanDB数据库】yasql登录有特殊字符@导致无法登录
问题备机 Linux bash shell环境下,使用yasql登录数据库没有使用转义导致登录失败.报错信息如下 问题分析 linux特殊字符转义问题,多加几层转义可以解决问题. 解决办法 su - ...
- 关于.NET在中国为什么工资低的分析
引言 近年来,随着软件开发行业的蓬勃发展,越来越多的编程语言和框架进入了市场,成为了不同类型软件开发项目的首选工具.然而,在中国的开发者社区中,.NET 开发人员的工资水平相比其他技术栈,如 Java ...
- 我对互联网和网站运作的理解 – Domain, DNS, Hosting 介绍
前言 一直没有写过关于互联网和网站运作的原理相关文章. 这篇就稍微介绍一下它们. 1. 电脑文件 网站是由许多网页组成的, 网页就是电脑里的 file. extension 是 .html 类似于 . ...
- Fluent Builder 模式
前言 以前最讨厌设计复杂方法调用, 就是那种需要一堆有逻辑规则的 config 作为参数的方法. 这种 config 通常是一个大对象, 有许多 property, property 之间有存在一些逻 ...
- Vue3.5中解构props,让父子组件通信更加丝滑
前言 在Vue3.5版本中响应式 Props 解构终于正式转正了,这个功能之前一直是试验性的.这篇文章来带你搞清楚,一个String类型的props经过解构后明明应该是一个常量了,为什么还没丢失响应式 ...
- 全面掌握 Jest:从零开始的测试指南(下篇)
在上一篇测试指南中,我们介绍了Jest 的背景.如何初始化项目.常用的匹配器语法以及钩子函数的使用.这一篇篇将继续深入探讨 Jest 的高级特性,包括 Mock 函数.异步请求的处理.Mock 请求的 ...
- 2021 IT运维巡展北京站圆满落幕,北京智和信通荣获IT运维样板工程
10月21日,以"数智转型 运维赋能"为主题的"2021(第十二届)IT运维巡展北京站"圆满落幕.会上行业专家.企业代表以及用户代表等共聚一堂,探讨数智时代下I ...