package com.github.code4craft.helloworld.behavioral.interpreter; import org.apache.commons.lang3.StringUtils; import java.io.PrintStream; import java.util.HashMap; import java.util.Map; /** * Very tiny expression without any error check. * NOT thread safe! * <pre> * statement ::= function "(" single_quote string_parameter single_quote ")" * e.g. * println('Hello World!'); * </pre> * * @author yihua.huang@dianping.com */ public class HelloWorldInterpreter { private Map<String, Function> functions; public HelloWorldInterpreter() { registerFunction("println", new PrintlnFunction()); } public void interpret(String expr) { String functionName = StringUtils.trim(StringUtils.substringBefore(expr, "(")); Function function = functions.get(functionName); String stringParam = StringUtils.strip(StringUtils.substringBeforeLast(StringUtils.substringAfter(expr, "("), ")"), "'"); function.call(stringParam); } public void registerFunction(String name, Function function) { if (functions == null) { functions = new HashMap<String, Function>(); } functions.put(name, function); } public static class PrintlnFunction implements Function { private PrintStream printer = System.out; public void setPrinter(PrintStream printer) { this.printer = printer; } @Override public void call(String paramString) { printer.println(paramString); } } private interface Function { public void call(String paramString); } }