基于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);
	}

}

posted on 2013-11-02 22:03  Java码界探秘  阅读(241)  评论(0编辑  收藏  举报

导航