第一步.新建一个模板文件以.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)的更多相关文章

  1. java字符串应用之表达式解析器

    一.表达式的组成    1.数字    2.运算符:+ - / * ^ % =    3.圆括号    4.变量二.运算符优先级    由高到低分别为:+-(正负号).^.*/%.+-.=    优先 ...

  2. 基于Jquery的XML解析器,返回定制的HTML

    依据HTML模板返回解析的XML 依赖jQuery 1.4​1. [代码]基于Jquery的xml解析器并返回定制的HTML     /** *  jQuery插件 *  Author: pureco ...

  3. OO第四单元——基于UML的UML解析器总结&OO课程总结

    OO第四单元--基于UML的UML解析器总结&OO课程总结 前言:一学期愉快(痛苦)的OO课程学习结束了,OO几个单元作业都各有特色,实验也各有特色,仔细回味起来,不再是单纯的敲代码(但自己还 ...

  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. dom4j解析器 基于dom4j的xpath技术 简单工厂设计模式 分层结构设计思想 SAX解析器 DOM编程

    *1 dom4j解析器   1)CRUD的含义:CreateReadUpdateDelete增删查改   2)XML解析器有二类,分别是DOM和SAX(simple Api for xml).     ...

  8. 基于Java的简易表达式解析工具(一)

    最近需要用到相关表达式解析的工具,然后去网上搜索,找到了一个用C#写的表达式解析工具,仔细看了功能后发现,这正是我需要的,如果我能将它改造成基于Java语言的方式,岂不是更好吗,所以花了一段时间,把网 ...

  9. atitit.java解析sql语言解析器解释器的实现

    atitit.java解析sql语言解析器解释器的实现 1. 解析sql的本质:实现一个4gl dsl编程语言的编译器 1 2. 解析sql的主要的流程,词法分析,而后进行语法分析,语义分析,构建sq ...

  10. 在.NET Core中使用Irony实现自己的查询语言语法解析器

    在之前<在ASP.NET Core中使用Apworks快速开发数据服务>一文的评论部分,.NET大神张善友为我提了个建议,可以使用Compile As a Service的Roslyn为语 ...

随机推荐

  1. Seata 1.3.0 Oracle 回滚测试验证 报错 ORA-02289: 序列不存在

    使用Seata 1.3.0版本,测试A服务调用B服务,且A方法中,手动写了一个异常,测试是否正常回滚(Mysql已经测试过) 发现报错:ORA-02289: 序列不存在 一看就是undo_log这张表 ...

  2. SmartDeviceControl_FreeRTOS_Hal_F103

    系统框图 ## 显示子设备 框图 我们不想让文件互相调用 遇到的问题:OLED 无响应,I2C无法工作 解决:使用的是软件I2C,问题在于OLED的驱动中已经包含获取从机应答的函数 ### ==更新: ...

  3. c++实现几种常见排序算法

    一.快速排序 int getPivot(vector<int>& arr, int left, int right){ int tmp = arr[left]; while(lef ...

  4. 内网渗透-Windows常用提权方法

    一.前言 将介绍常见的提权方法.从为什么该方法能够提权(原理)到使用方法. 二.系统内核漏洞提权 1.为什么能提权? 内核漏洞通常是指内核溢出漏洞,什么溢出呢?缓冲区溢出. 那什么是缓冲区溢出呢?当应 ...

  5. 搭建ipv6并发代理池

    声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 学习目标 ounter(l ...

  6. 面试官:GROUP BY和DISTINCT有什么区别?

    在 MySQL 中,GROUP BY 和 DISTINCT 都是用来处理查询结果中的重复数据,并且在官方的描述文档中也可以看出:在大多数情况下 DISTINCT 是特殊的 GROUP BY,如下图所示 ...

  7. MyBatisPlus——DQL编程控制——条件查询

    DQL编程控制 条件查询--设置查询条件 格式一:常规格式 //方式一:按条件查询 QueryWrapper qw = new QueryWrapper(); // 10岁到30岁之间的用户 qw.g ...

  8. Maven高级——继承与聚合

    继承与聚合 聚合 聚合:将多个模块组织成一个整体,同时进行项目构建的过程称为聚合 聚合工程:通常是一个不具有业务功能的"空"工程(有且仅有一个pom文件) 作用:使用聚合工程可以将 ...

  9. Spring —— DI入门案例

    DI入门案例   思路分析:     1.基于IoC管理bean     2.Service中使用new形式创建的Dao对象是否保留(否)     3.Service中需要的Dao对象如何进入Serv ...

  10. springboot整合shiro框架详解

    在ShiroRealm 中 对所有 引入的service 加上注解 @Lazy ,防止 事务回滚失败.具体原因看该文章 新增整合swagger2,因为之前整合了shiro,所以再访问swagger的时 ...