# Copyright 2012-2020, Alexander Shibakov
# This file is part of SPLinT
#
# SPLinT is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# SPLinT is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with SPLinT.  If not, see <http://www.gnu.org/licenses/>.

# this Makefile uses a flat directory structure for demonstration
# purposes; the main directory (../..) contains a slightly more
# modular organization.

PARSER = ldp
LEXER = ldl
MANUAL = ldman

LD_CORE_PREREQS = ${SPLINT_XTEXSTYLES} ${SPLINT_XPTABLES} ${SPLINT_XLTABLES} ${SPLINT_ROOT}cweb/bo.tok ${SPLINT_ROOT}cweb/fo.tok
LD_DOC_PREREQS = %.tex %.sty ${PARSER}.tok ldunion.sty ldtexlex.sty ldint.sty ldfrontmatter.sty ${LD_CORE_PREREQS}
LD_DOC_PREREQS += ptab.tex ltab.tex ld_small_tab.tex ld_small_dfa.tex ltokenset.sty lstokenset.sty
LD_DOC_PREREQS_XREF = ${LD_DOC_PREREQS} %.scn %.idx

include ../../makefile.inc
include ${SPLINT_ROOT}makefile.loc

# rules specific to this example

ptabout:	${SPLINT_ROOT}cweb/mkeparser.c ${PARSER}.c
		${CC} ${BISON_STATE} -DPARSER_FILE=\"../examples/ld/$(lastword $^)\" -DYYPARSE_PARAMETERS= -o $@ $<

ptab.tex:	ptabout
		$< --optimize-actions --optimize-tables $@

ltabout:	${SPLINT_ROOT}cweb/mkscanner.c ldl_states.h ${LEXER}.c
		${CC} -DLEXER_FILE=\"../examples/ld/$(lastword $^)\" -o $@ $<

ltab.tex:	ltabout
		$< --optimize-actions --optimize-tables $@

${LEXER}.c:	${LEXER}.l
		${FLEX} -o $@ $<

${PARSER}.yy :	ldgram.x
		@${CTANGLE} $<

${LEXER}.ll:	ldlex.x
		@${CTANGLE} $<

${MANUAL}.stx:	${MANUAL}.x ldgram.x ldlex.x ldlexo.x ldgramo.x ldnp.x
		@${CTANGLE} $<

# term name parser for ld grammar

ldsmallp_out:	${SPLINT_ROOT}cweb/mkeparser.c ld_small_parser.c
		${CC} ${BISON_STATE} -DPARSER_FILE=\"../examples/ld/$(lastword $^)\" -DYYPARSE_PARAMETERS= -o $@ $<

ldsmalll_out:	${SPLINT_ROOT}cweb/mkscanner.c ld_small_lexer.c
		${CC} -DLEXER_FILE=\"../examples/ld/$(lastword $^)\" -o $@ $<

ld_small_tab.tex:	ldsmallp_out
			$< --optimize-actions --optimize-tables $@

ld_small_dfa.tex:	ldsmalll_out
			$< --optimize-actions --optimize-tables $@

ld_small_parser.yy \
ld_small_lexer.ll:	ldnp.x
			@${CTANGLE} $<

# numeric parser for ld grammar

ldnump_out:	${SPLINT_ROOT}cweb/mkeparser.c ld_num_parser.c
		${CC} ${BISON_STATE} -DPARSER_FILE=\"../examples/ld/$(lastword $^)\" -DYYPARSE_PARAMETERS= -o $@ $<

ldnuml_out:	${SPLINT_ROOT}cweb/mkscanner.c ld_num_lexer.c
		${CC} -DLEXER_FILE=\"../examples/ld/$(lastword $^)\" -o $@ $<

ld_num_tab.tex:	ldnump_out
			$< --optimize-actions --optimize-tables $@

ld_num_dfa.tex:	ldnuml_out
			$< --optimize-actions --optimize-tables $@

ld_num_parser.yy \
ld_num_lexer.ll:	ldnump.x
			@${CTANGLE} $<

ldexample_%.hx:	ldexample.hw
		echo $(patsubst ldexample_%.hx, "@G(%)", $@) >> $(patsubst %.hx, %.hy, $@)
		cat $< >> $(patsubst %.hx, %.hy, $@)
		echo "@g" >> $(patsubst %.hx, %.hy, $@)
		${BRACK} $(patsubst %.hx, %.hy, $@) $@

alphas.hx:
		${MISCCW} --alpha-list --alpha-length=1 $@

${MANUAL}.tex:	${MANUAL}.x ldgram.x ldlex.x ldlexo.x ldgramo.x ldnp.x ldexample_l.hx ldexample_b.hx alphas.hx
		-${CWEAVE} $<

${MANUAL}.sty:	${MANUAL}.stx
		${UNLINE} $< $@

${MANUAL}.gdx: %.gdx:	${LD_DOC_PREREQS_XREF} ${PARSER}.tok
			@echo "Making the bison and TeX indices ..."
			${TEX} $*.tex

%.gdy:		%.gdx

${MANUAL}.gdy: %.gdy:	%.gdx
			${BINDX} --fine $^ $@

${MANUAL}.xxr: %.xxr:	%.tex
			${PDFTEX} $*.tex

${MANUAL}.pdf: %.pdf:	${LD_DOC_PREREQS_XREF} %.gdy %.xxr
			${PDFTEX} $< && touch $*.gdy && touch $*.pdf

${PARSER}.tok:	ldgram.tex ${MANUAL}.sty ${LD_CORE_PREREQS}
		${TEX} ${MODEBOOTSTRAP} \\input $<

ldl_states.h:	ldlex.tex ${MANUAL}.sty ${LD_CORE_PREREQS}
		${TEX} ${MODEBOOTSTRAP} \\input $<

ldgram.tex ldlex.tex: \
%.tex:		%.x
		-${CWEAVE} -x $<

docs:		${MANUAL}.pdf

mostlyclean:	clean_temp
		-rm -f ptabout ltabout ldsmalll_out ldsmallp_out ldnump_out ldnuml_out ${MANUAL}.c

clean:		clean_core
		-rm -f ptabout ltabout ldsmalll_out ldsmallp_out ldnump_out ldnuml_out *.stx ldman.sty

distclean:	clean
		cd ${SPLINT_ROOT} && ${MAKE} clean
