jw-python/make/generate-flex-bison.mk
Jan Lindemann 3cba245b77 grammar.py and friends: Improve line numbers and headers
Line numbers of parsed input are now automatically maintained. More
needed data structures are now automatically created in the API header
file.

Signed-off-by: Jan Lindemann <jan@janware.com>
2017-11-03 12:54:19 +01:00

83 lines
2.8 KiB
Makefile

NAMESPACE_IN_GENERATED ?= $(FB_NAME)
# These types are meant to be cut off the tree and turned into hand coded flex
# regexes
TRIM_SYMBOLS ?=
CUT_SYMBOLS ?=
IRRELEVANT_SYMBOLS ?=
GENERATE_LOG_LEVEL ?= notice
FIX_EXTENSIONS ?= discard
CHECK_SYMBOLS ?= all
ifneq ($(CHECK_SYMBOLS),)
OPT_CHECK_SYMBOLS ?= --check-symbols='$(CHECK_SYMBOLS)'
endif
ifneq ($(GENERATE_CONFIG_FILE),)
OPT_CONFIG_FILE ?= --config-file=$(GENERATE_CONFIG_FILE)
endif
GENERATED_STD += $(FB_NAME).l $(FB_NAME).y $(FB_NAME).ebnf $(FB_COMMON_H)
GENERATED += $(FB_NAME)-dense.ebnf $(GENERATED_STD)
GRAMMAR_INPUT ?= $(FB_NAME)-input.ebnf
FB_NAME_PREFIX ?= $(FB_NAME)_
FB_HDRDIR ?= include
FB_BISON_OUT_EXT ?= cpp
FB_FLEX_OUT_EXT ?= cpp
FB_CASE_INSENSITIVE ?= true
FB_SRC ?= $(filter %.y %.l,$(GENERATED))
FB_COMMON_H ?= $(FB_HDRDIR)/$(FB_NAME).h
INCLUDED_BY_GENERATED += $(FB_COMMON_H) include/lex.$(FB_NAME).h include/$(FB_NAME).tab.h
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 \
$(OPT_CHECK_SYMBOLS) \
$(OPT_CONFIG_FILE) \
--trim-symbols=$(shell echo $(TRIM_SYMBOLS) | sed 's/ */,/g') \
--cut-symbols=$(shell echo $(CUT_SYMBOLS) | sed 's/ */,/g') \
--irrelevant-symbols=$(shell echo $(IRRELEVANT_SYMBOLS) | sed 's/ */,/g') \
--namespace=$(NAMESPACE_IN_GENERATED) \
--includes=$(shell echo $(INCLUDED_BY_GENERATED) | sed 's/ */,/g') \
$(CREATE_EXTRA_ARGS)
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)
#$(FB_NAME).y: $(FB_COMMON_H) lex.$(FB_NAME).$(FB_FLEX_OUT_EXT)
#lex.$(FB_NAME).$(FB_FLEX_OUT_EXT): $(FB_NAME).l
check: $(GRAMMAR_INPUT) $(GENERATE_PY) Makefile
python ./$(GENERATE_PY) --log-level info check --fix-extensions unroll --unroll-lists --unroll-options $(OPT_CHECK_SYMBOLS) $<
$(FB_NAME)-dense.ebnf: $(GRAMMAR_INPUT) $(GENERATE_PY)
python ./$(GENERATE_PY) --log-level $(GENERATE_LOG_LEVEL) create --fix-extensions keep $< $(FB_NAME).ebnf > $@.tmp
mv $@.tmp $@
define generate_rule
$(1): $$(GRAMMAR_INPUT) $$(GENERATE_PY) Makefile
$$(GENERATE) $$< $$(patsubst $(FB_NAME).%,$(FB_NAME).%,$$@) > $$@.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