zoukankan      html  css  js  c++  java
  • 基于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);
    	}
    
    }
    

  • 相关阅读:
    IntelliJ IDEA Java编译打包
    java 播放mp3文件
    cool edit录音声卡
    VB调用VB脚本VBS向Http请求的三种方式
    asp.net 各种下载方式汇总
    Action拦截器接口-- IActionFilter,IExceptionFilter, IResultFilter
    Centos 常用命令
    医院信息集成平台ESB技术框架
    【划重点】医疗软件行业关键概念扫盲
    互联网医院安全架构
  • 原文地址:https://www.cnblogs.com/daichangya/p/12959163.html
Copyright © 2011-2022 走看看