##############################################################
# Makefile for Conceptual Graph Processes (pCG) interpreter. #
##############################################################

###############
# Object code #
###############
OBJS = pCG cgp/CGP.class \
	cgp/CGPLexer.class cgp/CGPParser.class cgp/CGPInterpreter.class \
	cgp/CGPTokenTypes.class \
	cgp/runtime/Namespace.class \
	cgp/runtime/Scope.class \
	cgp/runtime/ScopeStack.class \
	cgp/runtime/KBase.class \
	cgp/runtime/KnowledgeBaseStack.class \
	cgp/runtime/Type.class \
	cgp/runtime/BooleanType.class \
	cgp/runtime/NumberType.class \
	cgp/runtime/StringType.class \
	cgp/runtime/ConceptType.class \
	cgp/runtime/GraphType.class \
	cgp/runtime/ListType.class \
	cgp/runtime/LambdaType.class \
	cgp/runtime/ActorType.class \
	cgp/runtime/FunctionType.class \
	cgp/runtime/ProcessType.class \
	cgp/runtime/Rule.class \
	cgp/runtime/FileType.class \
	cgp/runtime/SubActorInfo.class \
	cgp/runtime/FormalParameter.class\
	cgp/runtime/ReturnException.class \
	cgp/runtime/GraphException.class \
	cgp/runtime/ActorException.class \
	cgp/runtime/newtypes/Window.class \
	cgp/runtime/newtypes/Util.class \
	cgp/translators/AntlrCGIFLexer.class \
	cgp/translators/AntlrCGIFParser.class \
	cgp/translators/AntlrCGIFTokenTypes.class \
	cgp/translators/CGIFParser.class \
        cgp/translators/CGIFGenerator.class \
	cgp/translators/SimpleGenerator.class \
	cgp/translators/NumericQuantifier.class \
	cgp/translators/DefinedQuantifier.class \
	cgp/translators/ContextScope.class \
	cgp/translators/ContextScopeStack.class

#############
# Classpath #
#############
JAVA_TOOLS = $(HOME)/java-tools
ANTLR_HOME = $(JAVA_TOOLS)/antlr-2.7.0
NOTIO = $(JAVA_TOOLS)/notio/Notio.jar
CGP_HOME = $(HOME)/cgp
CLASSES = $(CGP_HOME):$(ANTLR_HOME):$(NOTIO)

#################
# Other Targets #
#################
all: $(OBJS)

clean:
	rm -f pcg.tar.gz
	rm -f cgp/*.class
	rm -f cgp/runtime/*.class
	rm -f cgp/runtime/newtypes/*.class
	rm -f cgp/CGPLexer.java
	rm -f cgp/CGPParser.java
	rm -f cgp/CGPInterpreter.java
	rm -f cgp/*TokenTypes.*
	rm -rf docs/*
	rm -f cgp/translators/*.class
	rm -f cgp/translators/AntlrCGIFLexer.java
	rm -f cgp/translators/AntlrCGIFParser.java
	rm -f cgp/translators/*TokenTypes.*

###################################
# Create the distribution archive #
#       *** UPDATE EXAMPLES ***   #
###################################
dist:
	zip -r cgp.zip $(CGP_HOME)

#################
# Documentation #
#################
doc:
	javadoc -classpath $(CLASSES) -private -d docs cgp cgp.runtime cgp.runtime.newtypes cgp.translators

#########################
# Generate EBNF as HTML #
#########################
bnf:
	java -classpath $(CLASSES) antlr.Tool -html -o docs cgp/CGPParser.g

	java -classpath $(CLASSES) antlr.Tool -html -o docs cgp/translators/AntlrCGIFParser.g

###################
# CGP interpreter #
#                 #
# Note: perhaps   #
# cgp.jar should  #
# be the target,  #
# not pCG.        #
###################
pCG: cgp/CGPLexer.class cgp/CGPParser.class cgp/CGPInterpreter.class \
     cgp/CGPTokenTypes.class cgp/CGP.class \
     cgp/runtime/Namespace.class \
     cgp/runtime/Scope.class \
     cgp/runtime/ScopeStack.class \
     cgp/runtime/KBase.class \
     cgp/runtime/KnowledgeBaseStack.class \
     cgp/runtime/Type.class \
     cgp/runtime/NumberType.class \
     cgp/runtime/BooleanType.class \
     cgp/runtime/StringType.class \
     cgp/runtime/ConceptType.class \
     cgp/runtime/GraphType.class \
     cgp/runtime/ListType.class \
     cgp/runtime/LambdaType.class \
     cgp/runtime/ActorType.class \
     cgp/runtime/FunctionType.class \
     cgp/runtime/ProcessType.class \
     cgp/runtime/Rule.class \
     cgp/runtime/FileType.class \
     cgp/runtime/SubActorInfo.class \
     cgp/runtime/FormalParameter.class \
     cgp/runtime/ReturnException.class \
     cgp/runtime/GraphException.class \
     cgp/runtime/ActorException.class \
     cgp/runtime/newtypes/Window.class \
     cgp/runtime/newtypes/Util.class \
     cgp/translators/AntlrCGIFLexer.class \
     cgp/translators/AntlrCGIFParser.class \
     cgp/translators/AntlrCGIFParser.class \
     cgp/translators/AntlrCGIFTokenTypes.class \
     cgp/translators/CGIFParser.class \
     cgp/translators/CGIFGenerator.class \
     cgp/translators/SimpleGenerator.class \
     cgp/translators/NumericQuantifier.class \
     cgp/translators/DefinedQuantifier.class \
     cgp/translators/ContextScope.class \
     cgp/translators/ContextScopeStack.class
	jar -cf lib/cgp.jar cgp/*.class cgp/runtime/*.class cgp/translators/*.class
	touch pCG
	chmod +x pCG

cgp/CGPLexer.class: cgp/CGPLexer.java
	javac -classpath $(CLASSES) cgp/CGPLexer.java

cgp/CGPParser.class: cgp/CGPParser.java
	javac -classpath $(CLASSES) cgp/CGPParser.java

cgp/CGPInterpreter.class: cgp/CGPInterpreter.java
	javac -classpath $(CLASSES) cgp/CGPInterpreter.java

cgp/CGPTokenTypes.class: cgp/CGPTokenTypes.java
	javac -classpath $(CLASSES) cgp/CGPTokenTypes.java

cgp/CGP.class: cgp/CGP.java
	javac -classpath $(CLASSES) cgp/CGP.java

cgp/CGPLexer.java: cgp/CGPParser.g
	java -classpath $(CLASSES) antlr.Tool -o cgp cgp/CGPParser.g

cgp/CGPParser.java: cgp/CGPParser.g
# CGPParser.java is generated by the preceding rule before this one is reached.

cgp/CGPInterpreter.java: cgp/CGPInterpreter.g
	java -classpath $(CLASSES) antlr.Tool -o cgp cgp/CGPInterpreter.g

#################
# Run-time code #
#################
cgp/runtime/Namespace.class: cgp/runtime/Namespace.java
	javac -classpath $(CLASSES) cgp/runtime/Namespace.java

cgp/runtime/Scope.class: cgp/runtime/Scope.java
	javac -classpath $(CLASSES) cgp/runtime/Scope.java

cgp/runtime/ScopeStack.class: cgp/runtime/ScopeStack.java
	javac -classpath $(CLASSES) cgp/runtime/ScopeStack.java

cgp/runtime/KBase.class: cgp/runtime/KBase.java
	javac -classpath $(CLASSES) cgp/runtime/KBase.java

cgp/runtime/KnowledgeBaseStack.class: cgp/runtime/KnowledgeBaseStack.java
	javac -classpath $(CLASSES) cgp/runtime/KnowledgeBaseStack.java

cgp/runtime/Type.class: cgp/runtime/Type.java
	javac -classpath $(CLASSES) cgp/runtime/Type.java

cgp/runtime/NumberType.class: cgp/runtime/NumberType.java
	javac -classpath $(CLASSES) cgp/runtime/NumberType.java

cgp/runtime/BooleanType.class: cgp/runtime/BooleanType.java
	javac -classpath $(CLASSES) cgp/runtime/BooleanType.java

cgp/runtime/StringType.class: cgp/runtime/StringType.java
	javac -classpath $(CLASSES) cgp/runtime/StringType.java

cgp/runtime/ConceptType.class: cgp/runtime/ConceptType.java
	javac -classpath $(CLASSES) cgp/runtime/ConceptType.java

cgp/runtime/GraphType.class: cgp/runtime/GraphType.java
	javac -classpath $(CLASSES) cgp/runtime/GraphType.java

cgp/runtime/ListType.class: cgp/runtime/ListType.java
	javac -classpath $(CLASSES) cgp/runtime/ListType.java

cgp/runtime/LambdaType.class: cgp/runtime/LambdaType.java
	javac -classpath $(CLASSES) cgp/runtime/LambdaType.java

cgp/runtime/ActorType.class: cgp/runtime/ActorType.java
	javac -classpath $(CLASSES) cgp/runtime/ActorType.java

cgp/runtime/SubActorInfo.class: cgp/runtime/SubActorInfo.java
	javac -classpath $(CLASSES) cgp/runtime/SubActorInfo.java

cgp/runtime/FunctionType.class: cgp/runtime/FunctionType.java
	javac -classpath $(CLASSES) cgp/runtime/FunctionType.java

cgp/runtime/ProcessType.class: cgp/runtime/ProcessType.java
	javac -classpath $(CLASSES) cgp/runtime/ProcessType.java

cgp/runtime/Rule.class: cgp/runtime/Rule.java
	javac -classpath $(CLASSES) cgp/runtime/Rule.java

cgp/runtime/FileType.class: cgp/runtime/FileType.java
	javac -classpath $(CLASSES) cgp/runtime/FileType.java

cgp/runtime/FormalParameter.class: cgp/runtime/FormalParameter.java
	javac -classpath $(CLASSES) cgp/runtime/FormalParameter.java

cgp/runtime/ReturnException.class: cgp/runtime/ReturnException.java
	javac -classpath $(CLASSES) cgp/runtime/ReturnException.java

cgp/runtime/GraphException.class: cgp/runtime/GraphException.java
	javac -classpath $(CLASSES) cgp/runtime/GraphException.java

cgp/runtime/ActorException.class: cgp/runtime/ActorException.java
	javac -classpath $(CLASSES) cgp/runtime/ActorException.java

####################################################
# User-defined types.                              #
# Add rules here and add targets in 2 places above #
# (look for newtypes in path).                     #
####################################################
cgp/runtime/newtypes/Window.class: cgp/runtime/newtypes/Window.java
	javac -classpath $(CLASSES) cgp/runtime/newtypes/Window.java

cgp/runtime/newtypes/Util.class: cgp/runtime/newtypes/Util.java
	javac -classpath $(CLASSES) cgp/runtime/newtypes/Util.java

###############
# CGIF Parser #
###############
cgp/translators/AntlrCGIFLexer.class: cgp/translators/AntlrCGIFLexer.java
	javac -classpath $(CLASSES) cgp/translators/AntlrCGIFLexer.java

cgp/translators/AntlrCGIFParser.class: cgp/translators/AntlrCGIFParser.java
	javac -classpath $(CLASSES) cgp/translators/AntlrCGIFParser.java

cgp/translators/AntlrCGIFTokenTypes.class: cgp/translators/AntlrCGIFTokenTypes.java
	javac -classpath $(CLASSES) cgp/translators/AntlrCGIFTokenTypes.java

cgp/translators/AntlrCGIFLexer.java: cgp/translators/AntlrCGIFParser.g
	java -classpath $(CLASSES) antlr.Tool -o cgp/translators cgp/translators/AntlrCGIFParser.g

cgp/translators/AntlrCGIFParser.java: cgp/translators/AntlrCGIFParser.g

cgp/translators/CGIFParser.class: cgp/translators/CGIFParser.java
	javac -classpath $(CLASSES) cgp/translators/CGIFParser.java

cgp/translators/NumericQuantifier.class: cgp/translators/NumericQuantifier.java
	javac -classpath $(CLASSES) cgp/translators/NumericQuantifier.java

cgp/translators/DefinedQuantifier.class: cgp/translators/DefinedQuantifier.java
	javac -classpath $(CLASSES) cgp/translators/DefinedQuantifier.java

cgp/translators/ContextScope.class: cgp/translators/ContextScope.java
	javac -classpath $(CLASSES) cgp/translators/ContextScope.java

cgp/translators/ContextScopeStack.class: cgp/translators/ContextScopeStack.java
	javac -classpath $(CLASSES) cgp/translators/ContextScopeStack.java

##################
# CGIF Generator #
##################
cgp/translators/CGIFGenerator.class: cgp/translators/CGIFGenerator.java
	javac -classpath $(CLASSES) cgp/translators/CGIFGenerator.java

cgp/translators/SimpleGenerator.class: cgp/translators/SimpleGenerator.java
	javac -classpath $(CLASSES) cgp/translators/SimpleGenerator.java