# CDEFINE : Any symbols used for debugging
#	RULES_DEBUG       : if defined prints the rules reduced
#	RULES_ERROR_DEBUG : if defined prints the error rules reduced
#	TOKENS_DEBUG      : if defined prints the tokens read in the input
#
CXX=gcc

LDFLAGS= -lm -lg++
CDEFINE= 
YACC=bison -y
YFLAGS=-d -v
CXXFLAGS= $(CDEFINE) $(CFLAGS)

DIST=   syntax.y lex.l \
	SymTable.cc SymTable.h \
	Objects.cc Objects.h \
	Expr.cc Expr.h \
	Instr.cc Instr.h \
	tstSymbt.cc tstObj.cc tstExpr.cc\
	Makefile \
	test.log test1.log test2.log test3.log test4.log

SYNTAXOBJ=syntax.o lex.o Objects.o Expr.o Instr.o

.l.cc:
	$(LEX) -t $(LFLAGS) $< > $@

all: syntax

check: test

test: all
	./syntax < test.log 2>&1 > result.out

syntax: $(SYNTAXOBJ)
	$(CXX) -o syntax $(CXXFLAGS) $(SYNTAXOBJ) $(LDFLAGS)

lex.o: lex.cc syntax.h

tstSyntax.o: syntax.cc
	$(CXX) $(CXXFLAGS) -DSYNTAX_ONLY -DRULES_DEBUG -c syntax.cc -o tstSyntax.o

tstLex.o: lex.cc
	$(CXX) $(CXXFLAGS) -DSYNTAX_ONLY -DTOKENS_DEBUG -c lex.cc -o tstLex.o

tstObj: tstObj.o Objects.o
	$(CXX) -o tstOBJ $(CXXFLAGS) $(LDFLAGS) tstObj.o Objects.o

tstSymbt: tstSymbt.o SymTable.o
	$(CXX) -o tstSymbt tstSymbt.o SymTable.o $(CXXFLAGS) $(LDFLAGS)

tstExpr: tstExpr.o Expr.o
	$(CXX) -o tstExpr tstExpr.o Expr.o $(CXXFLAGS) $(LDFLAGS)

tstInstr: tstInstr.o Instr.o Objects.o Expr.o
	$(CXX) -o tstInstr tstInstr.o Instr.o Expr.o Objects.o $(CXXFLAGS) $(LDFLAGS)

tstSyntax: tstSyntax.o tstLex.o
	$(CXX) -o tstSyntax tstSyntax.o tstLex.o $(CXXFLAGS) $(LDFLAGS)

syntax.cc syntax.h: syntax.y
	$(YACC) $(YFLAGS) syntax.y
	mv y.tab.c syntax.cc
	mv y.tab.h syntax.h
	mv y.output syntax.out

clean:
	rm -f syntax.[ch] lex.c *.o syntax.output
	rm -f result.out tst*.o

realclean: clean
	rm -f syntax tst*

dist:
	tar cvf loglan.tar $(DIST)
