基于antlr的表达式解析器——函数生成(通过freemarker)
第一步.新建一个模板文件以.ftl结尾。
Max.ftl
/*
* Copyright 2002-2007 Robert Breidecker.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package daicy.formula.freemarker;
import daicy.formula.ActiveOperand;
/**
* This class is a function that executes within Evaluator. The function returns
* the greater of two Integer values. See the Math.${function_name}(Integer) method in the
* JDK for a complete description of how this function works.
*/
public class ${class_name} implements Function {
/**
*
* @return The name of this function class.
*/
public String getName() {
return "${function_name}";
}
@Override
public ActiveOperand execute(ActiveOperand[] arguments)
throws FunctionException {
// TODO Auto-generated method stub
Object result = null;
if (null == arguments || arguments.length != 2) {
throw new FunctionException("Two numeric arguments are required.");
}
try {
if ((arguments[0].getValue() instanceof Double)) {
Double argumentOne = ((Double) arguments[0].getValue());
Double argumentTwo = ((Double) arguments[1].getValue());
result = new Double(Math.${function_name}(argumentOne, argumentTwo));
} else if ((arguments[0].getValue() instanceof Float)) {
Float argumentOne = ((Float) arguments[0].getValue());
Float argumentTwo = ((Float) arguments[1].getValue());
result = new Float(Math.${function_name}(argumentOne, argumentTwo));
} else if ((arguments[0].getValue() instanceof Integer)) {
Integer argumentOne = ((Integer) arguments[0].getValue());
Integer argumentTwo = ((Integer) arguments[1].getValue());
result = new Integer(Math.${function_name}(argumentOne, argumentTwo));
} else if ((arguments[0].getValue() instanceof Long)) {
Long argumentOne = ((Long) arguments[0].getValue());
Long argumentTwo = ((Long) arguments[1].getValue());
result = new Long(Math.${function_name}(argumentOne, argumentTwo));
} else if ((arguments[0].getValue() instanceof Short)) {
Short argumentOne = ((Short) arguments[0].getValue());
Short argumentTwo = ((Short) arguments[1].getValue());
result = new Integer(Math.${function_name}(argumentOne, argumentTwo));
}
} catch (Exception e) {
throw new FunctionException("Two numeric arguments are required.",
e);
}
return new ActiveOperand(result.getClass(), result);
}
}
第二步.写一个freemaker的工具类用于生成代码。
FreeMarkerUtil.java
注意:工程必须引入freemaker.jar
package daicy.formula.freemarker;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class FreeMarkerUtil {
private Configuration cfg;
public void init() throws Exception {
// 初始化FreeMarker配置
// 创建一个Configuration实例
cfg = new Configuration();
// 设置FreeMarker的模版文件位置
cfg.setDirectoryForTemplateLoading(new File(
"src/daicy/formula/function"));
}
public void process(FreeMarkerUtil hf) throws Exception {
Map root = new HashMap();
String savePath = "src/daicy/formula/function/";
Template template = cfg.getTemplate("Max.ftl");
String[] functionNames = new String[] { "Min" };
for (int i = 0; i < functionNames.length; i++) {
String class_name = functionNames[i];
String function_name = functionNames[i].toLowerCase();
root.put("class_name", class_name);
root.put("function_name", function_name);
String fileName = class_name + ".java";
hf.buildTemplate(root, savePath, fileName, template);
}
}
public void buildTemplate(Map root, String savePath, String fileName,
Template template) {
String realFileName = savePath + fileName;
String realSavePath = savePath;
File newsDir = new File(realSavePath);
if (!newsDir.exists()) {
newsDir.mkdirs();
}
try {
// SYSTEM_ENCODING = "UTF-8";
Writer out = new OutputStreamWriter(new FileOutputStream(
realFileName));
template.process(root, out);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
FreeMarkerUtil hf = new FreeMarkerUtil();
hf.init();
hf.process(hf);
}
}
基于antlr的表达式解析器——函数生成(通过freemarker)的更多相关文章
- java字符串应用之表达式解析器
一.表达式的组成 1.数字 2.运算符:+ - / * ^ % = 3.圆括号 4.变量二.运算符优先级 由高到低分别为:+-(正负号).^.*/%.+-.= 优先 ...
- 基于Jquery的XML解析器,返回定制的HTML
依据HTML模板返回解析的XML 依赖jQuery 1.41. [代码]基于Jquery的xml解析器并返回定制的HTML /** * jQuery插件 * Author: pureco ...
- OO第四单元——基于UML的UML解析器总结&OO课程总结
OO第四单元--基于UML的UML解析器总结&OO课程总结 前言:一学期愉快(痛苦)的OO课程学习结束了,OO几个单元作业都各有特色,实验也各有特色,仔细回味起来,不再是单纯的敲代码(但自己还 ...
- 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 程序主要包括:基础结构定义.词法分析.语法分 ...
- 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 ...
- 在.NET Core中使用Irony实现自己的查询语言语法解析器
在之前<在ASP.NET Core中使用Apworks快速开发数据服务>一文的评论部分,.NET大神张善友为我提了个建议,可以使用Compile As a Service的Roslyn为语 ...
随机推荐
- windows server 2019 IIS网站属性上没有asp.net标签 ,aspnet_regiis -i 不能安装
在新的服务器版本已经不能通过 aspnet_regiis -i安装了,可以通过以下语句完成: dism /online /enable-feature /featurename:IIS-ASPNET4 ...
- Google Analytics & Ads 学习笔记
更新: 2021-09-13 Naming conversion for event category, action, label https://support.google.com/analyt ...
- postgre基于行数的外连接及python连接postgre数据库
外连接 左外/右外连接 左外连接:左表全部出现在结果集中,若右表无对应记录,则相应字段为NULL left join ... on 条件 右外连接:右表全部出现在结果集中,若左表无对应记录,则相应字段 ...
- Kubernetes基础(Pod?Label?Namespace?Deployment?Service?)(十二)
上面我们都是在架构层面了解 Kubernetes,但是似乎没有发现关于容器的说明,Kubernetes 作为容器编排引擎,那么他是怎么去对容器进行编排的呢?在 Kubernetes 集群中抽象了很多集 ...
- Linux安装miniforge
miniforge 安装 协议条款:bsd-3-clause 支持conda和mamba命令,两者效果一样,推荐使用mamba # Setup Miniforge wget "https:/ ...
- 【VMware VCF】使用 SFTP 服务器备份 VCF 核心组件的配置文件。
可以定期对 VMware Cloud Foundation 环境中的相关核心组件(如 SDDC Manager.NSX Manager 以及 vCenter Server 等)创建配置备份,以防止当意 ...
- 多Master节点的k8s集群部署-完整版
多Master节点的k8s集群部署 一.准备工作 1.准备五台主机(三台Master节点,一台Node节点,一台普通用户)如下: 角色 IP 内存 核心 磁盘 Master01 192.168.116 ...
- JVM--解析运行期优化与JIT编译器
JVM开发团队一直在努力,缩小Java与C/C++语言在运行效率上的差距. 本篇博客,我们来谈一谈JVM(HotSpot)为了提高Java程序的运行效率,都实现了哪些激动人心的技术- 1 JIT编译器 ...
- 5.6 函数y=Asin(ωx+φ)的图像和性质
\({\color{Red}{欢迎到学科网下载资料学习 }}\) [基础过关系列]2022-2023学年高一数学上学期同步知识点剖析精品讲义(人教A版2019) \({\color{Red}{ 跟贵哥 ...
- Java实用小工具系列1---使用StringUtils分割字符串
经常有这种情况,需要将逗号分割的字符串,比如:aaa, bbb ,ccc,但往往是人工输入的,难免会有多空格逗号情况,比如:aaa, bbb , ccc, ,,这种情况使用split会解析出不正常的结 ...