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. 深度学习Python代码小知识点(备忘,因为没有脑子)

    现在是2024年4月24日16:58,今天摸鱼有点多,备忘一下,都写到一篇内容里面,免得分散. 1. np.concatenate()函数'np.concatenate'是NumPy库中用来合并两个或 ...

  2. EF Core – Owned Entity Types & Complex Types

    前言 EF Core 8.0 推出了 Complex Types,这篇要来介绍一下. 由于它和 Owned Entity Types 傻傻分不清楚,加上我之前也没有写过 Owned Entity Ty ...

  3. C# – class, filed, property, const, readonly, get, set, init, required 使用基础

    前言 心血来潮,这篇讲点基础的东西. Field 比起 Property,Field 很不起眼,你若问 JavaScript,它甚至都没有 Field. 但在 C#,class 里头真正装 value ...

  4. 【QT界面美化】QT界面美化效果截图QSS+QML

    贴几个QT做的界面美化效果截图. 先来一张动图,有一些画面是QT Widgets + QSS实现的:另外一些画面是QT QML实现的. QT界面美化效果图QT QSS QML 补天云QT技术培训专家 ...

  5. Java 动态编译工具 Janino 和 Liquor 差别

    如果你只要 Java7 及以下的语法支持,建议 Janino.如果要你想更全的 Java8.Java11.Java17.Java21 等语法,可以选 Liquor. 1.它们相同的地方 提供的相似的能 ...

  6. CentOS 7.9安装ElasticSearch7.14.0、ElasticSearch-Head、Kibana、Node14.18.2

    CentOS 7.9安装ElasticSearch7.14.0.ElasticSearch-Head.Kibana.Node14.18.2   1.安装文件 1. elasticsearch-7.14 ...

  7. TS体操类型学习记录

    Easy 1. Easy - 4 - Pick 从类型 T 中选出符合 K 的属性,构造一个新的类型 type MyPick<T, K extends keyof T> = { [key ...

  8. Electron.Net + Linux + Blazor 初尝备忘录

    Electron 是使用 JavaScript,HTML 和 CSS 构建跨平台的桌面应用程序的一个框架, Electron.NET 是.net 下对 Electron 的封装实现, 通过它可以比较容 ...

  9. 【ZZ】Linux 安装 edge 浏览器

    For Debain/Ubuntu/Deepin etc.## Setupcurl https://packages.microsoft.com/keys/microsoft.asc | gpg -- ...

  10. Eigen矩阵除法

    看了网上很多帖子,很多都没有说Eigen如何做矩阵除法.我这里补充一下.其他运算一般都可以查到: 对于Matrix来说,我们需要先将其转换成数组,因为Eigen矩阵不能做除法(很烦). 比如我们一个2 ...