# 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/>.

include ../makefile.inc

all:				${SPLINT_PTABLES} ${SPLINT_LTABLES}

b%out:		mkeparser.c b%.c
		${CC} ${BISON_STATE} -DPARSER_FILE=\"$(lastword $^)\" -DYYPARSE_PARAMETERS= -o $@ $<

b%.yy:				bo.x
				${CTANGLE} $<

%yytab.tex:			b%out
				${SPLINT_DRIVER_DIR}/$< --optimize-actions $@

ltab.tex:			ltout
				${SPLINT_DRIVER_DIR}/$< --optimize-actions $@

ltout:				mkscanner.c lo_states.h lo.c
				${CC} -DLEXER_FILE=\"$(lastword $^)\" -o $@ $<

ssffo.ll lo.ll: \
%.ll:				%.x
				${CTANGLE} $< && rm $(patsubst %.x, %.c, $^)

fil.ll:				so.x
				${CTANGLE} $< && rm $(patsubst %.x, %.c, $^)

fip.yy rep.yy rap.yy \
ddp.yy:				fo.x
				${CTANGLE} $< && rm $(patsubst %.x, %.c, $^)

# flex parser

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

fil_out:			mkscanner.c fil_states.h fil.c
				${CC} -DLEXER_FILE=\"$(lastword $^)\" -o $@ $<

fil_states.h:			so.tex lstab.tex byytab.tex
				${PDFTEX} $<

filtab.tex:			fil_out
				${SPLINT_DRIVER_DIR}/$< --optimize-actions --optimize-tables $@

fip.c rep.c rap.c \
ddp.c:%.c:			%.y
				${BISON} -o $@ $<

fip_out rap_out \
ddp_out rep_out:%_out:	mkeparser.c %.c
			${CC} ${BISON_STATE} -DPARSER_FILE=\"$(lastword $^)\" -DYYPARSE_PARAMETERS= -o $@ $<

fiptab.tex raptab.tex \
ddptab.tex reptab.tex:%tab.tex:	%_out
				${SPLINT_DRIVER_DIR}/$< --optimize-actions --optimize-tables $@

so.tex:				so.x
				${CWEAVE} $<

fo.tex:				fo.x
				${CWEAVE} $<

fo.tok:				fo.tex ltab.tex byytab.tex
				${TEX} ${MODEBOOTSTRAP} \\input $<

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

mkscanner.c mkeparser.c: \
%.c:				%.w
				${CTANGLE} $<

# name parser 

smallp_out:	mkeparser.c small_parser.c
		${CC} ${BISON_STATE} -DPARSER_FILE=\"$(lastword $^)\" -DYYPARSE_PARAMETERS= -o $@ $<

smalll_out:			mkscanner.c small_lexer.c
				${CC} -DLEXER_FILE=\"$(lastword $^)\" -o $@ $<

small_tab.tex:			smallp_out
				${SPLINT_DRIVER_DIR}/$< --optimize-actions $@

small_dfa.tex:			smalll_out
				${SPLINT_DRIVER_DIR}/$< --optimize-actions $@

small_parser.yy \
small_lexer.ll:			np.x
				@${CTANGLE} $<

bo.tex:				bo.x
				-${CWEAVE} -x $<

splint.tex \
splint.idx \
splint.scn:			splint.x bo.x lo.x fo.x so.x np.x common.w bs.w \
				fk.w philosophy.w checklists.w references.w alphas.hx
				-${CWEAVE} $<

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

ssffo.tex \
ssffo.idx ssffo.scn:		ssffo.x 
				${CWEAVE} $<

bo.tok:				bo.tex ltab.tex byytab.tex
				${TEX} ${MODEBOOTSTRAP} \\input $<

ssffo.pdf: %.pdf:		${SPLINT_DOC_PREREQS_XREF}
				${PDFTEX} $*.tex

ssffo.dvi: %.dvi:		${SPLINT_DOC_PREREQS_XREF}
				${TEX} $*.tex

splint.gdx: %.gdx:		${SPLINT_DOC_PREREQS_XREF}
				@echo "Making the bison and TeX indices ..."
				${PDFTEX} $*.tex

%.gdy:				%.gdx

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

splint.xxr: %.xxr:		${SPLINT_DOC_PREREQS_XREF}
				@echo "Generating the cross references ..."
				${PDFTEX} $*.tex

splint.pdf: %.pdf:		${SPLINT_DOC_PREREQS_XREF} %.gdy %.xxr
				${PDFTEX} \\input $*.tex && touch $*.gdy && touch $*.pdf

splint.dvi: %.dvi:		${SPLINT_DOC_PREREQS_XREF} %.gdy
				${TEX} $*.tex && touch $*.gdy && touch $*.dvi && rm $*.xxr && rm $*.ftn

${SPLINT_ROOT}tex/btokenset.sty:	# stupid make weirdness
				@

# state parsing

lstabout:			mkscanner.c ssffo.c
				${CC} -DLEXER_FILE=\"$(lastword $^)\" -o $@ $<

lstab.tex:			lstabout
				${SPLINT_DRIVER_DIR}/$< --optimize-actions $@

lo.tex:				lo.x
				${CWEAVE} $<

lo_states.h:			lo.tex lstab.tex byytab.tex
				${PDFTEX} $<

# clean will erase all automatically generated files in the current directory

clean:				clean_core
				-rm -f ctablesout b?out ltout smallp_out \
				smalll_out lstabout fil_out fip_out rep_out rap_out ddp_out

include ${SPLINT_ROOT}makefile.loc

# since bg.yy is not an intermediate file in examples/symbols/Makefile, repeated 'make all'
# remakes bg.yy thereby forcing make to update byytab.tex, etc., which results in remaking
# of bo.tok, lo.tex, eventually leading to remaking of splint.pdf;
# the special target below tells make to treat bg.yy as if it were not an intermediate file

.PRECIOUS:			%.yy bo.tok fo.tok %.ll b%.y splint.gdx splint.xxr

# the files below appear as targets but are really intermediaries for other files

.INTERMEDIATE:			smallp_out smalll_out lstabout ltout fil_out \
				fip_out rep_out rap_out ddp_out splint.gdx
