TOPDIR = ../..

USE_PROJECT_LIB = true
MEMBERS               += local.a($(OBJ))

GENERATED_STD         = grammartest.l grammartest.y grammartest.ebnf include/grammartest.h

# These types are meant to be cut off the tree and turned into hand coded flex
# regexes
#TRIM_SYMBOLS          = blah
TRIM_SYMBOLS          = 
GENERATE_LOG_LEVEL   ?= notice
FIX_EXTENSIONS       ?= discard
CHECK_SYMBOLS        ?= --check-symbols=all


GRAMMAR_INPUT        ?= grammartest-input.ebnf
GENERATED             = grammartest-dense.ebnf $(GENERATED_STD)
GENERATE_PY           = ./generate.py
GENERATE              = python ./$(GENERATE_PY) --log-level $(GENERATE_LOG_LEVEL) create \
				--fix-extensions $(FIX_EXTENSIONS) \
				--unroll-lists \
				--unroll-options \
				--unroll-alternatives \
				--replace-whitespace \
				$(CHECK_SYMBOLS) \
				--trim-symbols=$(shell echo $(TRIM_SYMBOLS) | sed 's/  */,/g') \
				$(CREATE_EXTRA_ARGS)
CHECK_SYMBOLS         ?= special_character

FB_NAME_PREFIX       ?= grammartest_
FB_HDRDIR            ?= include
FB_BISON_OUT_EXT     ?= cpp
FB_FLEX_OUT_EXT      ?= cpp
FB_CASE_INSENSITIVE  ?= true
FB_SRC               ?= $(filter %.y %.l,$(GENERATED))

include $(TOPDIR)/make/proj.mk
include $(MODDIR)/make/flex-bison.mk
include $(MODDIR)/make/py-defs.mk

all:
debug-all:
	GENERATE_LOG_LEVEL=debug make all 2>&1 | tee run.out

generate: $(GENERATED)

grammartest.y: include/grammartest.h
lex.grammartest.c: grammartest.l

check: $(GRAMMAR_INPUT) $(GENERATE_PY) Makefile
	python ./$(GENERATE_PY) --log-level info check --fix-extensions unroll --unroll-lists --unroll-options --check-symbols='$(CHECK_SYMBOLS)' $<

grammartest-dense.ebnf: $(GRAMMAR_INPUT) $(GENERATE_PY)
	python ./$(GENERATE_PY) --log-level $(GENERATE_LOG_LEVEL) create --fix-extensions keep $< grammartest.ebnf > $@.tmp
	mv $@.tmp $@

define generate_rule
$(1): $$(GRAMMAR_INPUT) $$(GENERATE_PY) Makefile
	$$(GENERATE) $$< $$(patsubst grammartest.%,grammartest.%,$$@) > $$@.tmp
	mv $$@.tmp $$@
endef
$(foreach target,$(GENERATED_STD),$(eval $(call generate_rule,$(target))))

clean.generated:
	rm -f $(GENERATED)
clean: clean.generated
echo-generated:
	@echo GENERATED = $(GENERATED)

help:
	$(GENERATE) --help

expand-macros:
	make 2>/dev/null | sed '/g++/ !d; s/g++\|gcc//; s/-o .*//' | xargs g++ -E -C | indent
