ミニ言語サンプル
Pragmatic Programerのミニ言語サンプルをgroovyでやってみた。
MiniLang.groovy
public class MiniLang{ def P(val){ println "${val}のペンを選択する"} def D(){ println "ペンを紙の上に下ろす"} def W(val){ println "西方向へ${val}cm動かす"} def N(val){ println "北方向へ${val}cm動かす"} def E(val){ println "東方向へ${val}cm動かす"} def S(val){ println "南方向へ${val}cm動かす"} def U(){ println "ペンを紙から離す" } def exec(Closure cl){ cl.delegate = this cl.call() } def exec(String str){ // 簡易言語からgroovy scriptを生成 String clStr = "cl = {${str}}" clStr = clStr.replaceAll("D", "D()") // プロパティ扱いにならないよう、置換 clStr = clStr.replaceAll("U", "U()") // groovy scriptの実行 def gs = GroovyShell.newInstance() def cl = gs.evaluate(clStr) exec(cl) } }
MiniLangRunner.groovy
def minilnag = MiniLang.newInstance() scStr = """ P 2 //SyntaxSugerが働くので、このまま P(2)として動作 D //プロパティDとして認識されるので、MiniLang.exec内でD()に置換 W 2 N 1 E 2 S 1 U """ minilnag.exec(scStr)
実行結果
2のペンを選択する ペンを紙の上に下ろす 西方向へ2cm動かす 北方向へ1cm動かす 東方向へ2cm動かす 南方向へ1cm動かす ペンを紙から離す
GroovyShellクラスを使って、単なる文字列から実行結果が取得できるので、クロージャを作ってそれを実行する方法をやってみたら、うまくいった。