all: TestComb TestLambda read_eval_print

TestComb: BNFC_Util.ml
	ocamlyacc ParComb.mly
	ocamllex LexComb.mll
	ocamlc -o TestComb BNFC_Util.ml AbsComb.ml SkelComb.ml ShowComb.ml PrintComb.ml ParComb.mli ParComb.ml LexComb.ml TestComb.ml

TestLambda: BNFC_Util.ml
	ocamlyacc ParLambda.mly
	ocamllex LexLambda.mll
	ocamlc -o TestLambda BNFC_Util.ml AbsLambda.ml SkelLambda.ml ShowLambda.ml PrintLambda.ml ParLambda.mli ParLambda.ml LexLambda.ml TestLambda.ml

read_eval_print: BNFC_Util.ml
	ocamlc -o read_eval_print BNFC_Util.ml \
	AbsLambda.ml SkelLambda.ml ShowLambda.ml PrintLambda.ml ParLambda.mli ParLambda.ml LexLambda.ml \
	AbsComb.ml SkelComb.ml ShowComb.ml PrintComb.ml ParComb.mli ParComb.ml LexComb.ml \
	trans.ml eval.ml \
	Main.ml

BNFC_Util.ml: Comb.cf Lambda.cf
	bnfc -ocaml Lambda.cf
	bnfc -ocaml Comb.cf
	touch $@

clean:
	-rm -f *.cmi *.cmo *.o

distclean: clean
	-rm -f BNFC_Util.ml
	-rm -f LexComb.* ParComb.* LayoutComb.* SkelComb.* PrintComb.* ShowComb.* TestComb.* AbsComb.* TestComb SkelProgram.ml
	-rm -f LexLambda.* ParLambda.* LayoutLambda.* SkelLambda.* PrintLambda.* ShowLambda.* TestLambda.* AbsLambda.* TestLambda SkelProgram.ml
	-rm read_eval_print

test_a:
	./TestLambda ../example/ex01.lambda
	./TestLambda ../example/ex02.lambda
	./TestLambda ../example/ex03.lambda
	./TestLambda ../example/ex04.lambda

# p.212-213 問14.14 (v)
test_v: read_eval_print
	./read_eval_print ../example/factorial.lambda
	./read_eval_print ../example/sum.lambda
