基于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);
}
}
如果你喜欢本文, 请长按二维码,关注公众号 分布式编程.
作者:分布式编程
出处:https://zthinker.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。