UNAME_S := $(shell uname -s) ifeq ($(UNAME_S),Linux) PYTHON ?= ../../python endif ifeq ($(UNAME_S),Darwin) PYTHON ?= ../../python.exe endif VENVDIR ?= ./venv VENVPYTHON ?= $(VENVDIR)/bin/python CPYTHON ?= ../../Lib MYPY ?= mypy GRAMMAR = ../../Grammar/python.gram TOKENS = ../../Grammar/Tokens TESTFILE = data/cprog.py TIMEFILE = data/xxl.py TESTDIR = . TESTFLAGS = --short data/xxl.py: $(PYTHON) -m zipfile -e data/xxl.zip data build: peg_extension/parse.c peg_extension/parse.c: $(GRAMMAR) $(TOKENS) pegen/*.py peg_extension/peg_extension.c ../../Parser/pegen/pegen.c ../../Parser/pegen/parse_string.c ../../Parser/pegen/*.h pegen/grammar_parser.py $(PYTHON) -m pegen -q c $(GRAMMAR) $(TOKENS) -o peg_extension/parse.c --compile-extension clean: -rm -f peg_extension/*.o peg_extension/*.so peg_extension/parse.c -rm -f data/xxl.py -rm -rf $(VENVDIR) dump: peg_extension/parse.c cat -n $(TESTFILE) $(PYTHON) -c "from peg_extension import parse; import ast; t = parse.parse_file('$(TESTFILE)', mode=1); print(ast.dump(t))" regen-metaparser: pegen/metagrammar.gram pegen/*.py $(PYTHON) -m pegen -q python pegen/metagrammar.gram -o pegen/grammar_parser.py # Note: These targets really depend on the generated shared object in peg_extension/parse.*.so but # this has different names in different systems so we are abusing the implicit dependency on # parse.c by the use of --compile-extension. .PHONY: test venv: $(PYTHON) -m venv $(VENVDIR) $(VENVPYTHON) -m pip install -U pip setuptools $(VENVPYTHON) -m pip install -r requirements.pip @echo "The venv has been created in the $(VENVDIR) directory" test: run run: peg_extension/parse.c $(PYTHON) -c "from peg_extension import parse; t = parse.parse_file('$(TESTFILE)'); exec(t)" compile: peg_extension/parse.c $(PYTHON) -c "from peg_extension import parse; t = parse.parse_file('$(TESTFILE)', mode=2)" parse: peg_extension/parse.c $(PYTHON) -c "from peg_extension import parse; t = parse.parse_file('$(TESTFILE)', mode=1)" check: peg_extension/parse.c $(PYTHON) -c "from peg_extension import parse; t = parse.parse_file('$(TESTFILE)', mode=0)" stats: peg_extension/parse.c data/xxl.py $(PYTHON) -c "from peg_extension import parse; t = parse.parse_file('$(TIMEFILE)', mode=0); parse.dump_memo_stats()" >@data $(PYTHON) scripts/joinstats.py @data time: time_compile time_compile: venv data/xxl.py $(VENVPYTHON) scripts/benchmark.py --parser=new --target=xxl compile time_parse: venv data/xxl.py $(VENVPYTHON) scripts/benchmark.py --parser=new --target=xxl parse time_old: time_old_compile time_old_compile: venv data/xxl.py $(VENVPYTHON) scripts/benchmark.py --parser=old --target=xxl compile time_old_parse: venv data/xxl.py $(VENVPYTHON) scripts/benchmark.py --parser=old --target=xxl parse time_peg_dir: venv $(VENVPYTHON) scripts/test_parse_directory.py \ -d $(TESTDIR) \ $(TESTFLAGS) \ --exclude "*/failset/*" \ --exclude "*/failset/**" \ --exclude "*/failset/**/*" time_stdlib: $(CPYTHON) venv $(VENVPYTHON) scripts/test_parse_directory.py \ -d $(CPYTHON) \ $(TESTFLAGS) \ --exclude "*/bad*" \ --exclude "*/lib2to3/tests/data/*" mypy: regen-metaparser $(MYPY) # For list of files, see mypy.ini format-python: black pegen scripts format: format-python find_max_nesting: $(PYTHON) scripts/find_max_nesting.py tags: TAGS TAGS: pegen/*.py test/test_pegen.py etags pegen/*.py test/test_pegen.py