ミニ言語サンプル

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クラスを使って、単なる文字列から実行結果が取得できるので、クロージャを作ってそれを実行する方法をやってみたら、うまくいった。