| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 3d53d87 commit 5b9f498
8 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -823,7 +823,9 @@ regen-grammar: regen-token | |||
| 823 | 823 | .PHONY: regen-pegen | |
| 824 | 824 | regen-pegen: | |
| 825 | 825 | @$(MKDIR_P) $(srcdir)/Parser/pegen | |
| 826 | - PYTHONPATH=$(srcdir)/Tools/peg_generator $(PYTHON_FOR_REGEN) -m pegen -c -q $(srcdir)/Grammar/python.gram \ | ||
| 826 | + PYTHONPATH=$(srcdir)/Tools/peg_generator $(PYTHON_FOR_REGEN) -m pegen -q c \ | ||
| 827 | + $(srcdir)/Grammar/python.gram \ | ||
| 828 | + $(srcdir)/Grammar/Tokens \ | ||
| 827 | 829 | -o $(srcdir)/Parser/pegen/parse.new.c | |
| 828 | 830 | $(UPDATE_FILE) $(srcdir)/Parser/pegen/parse.c $(srcdir)/Parser/pegen/parse.new.c | |
| 829 | 831 | ||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -168,7 +168,7 @@ | |||
| 168 | 168 | </Target> | |
| 169 | 169 | <Target Name="_RegenPegen" BeforeTargets="Build"> | |
| 170 | 170 | <!-- Regenerate Parser/pegen/parse.c --> | |
| 171 | - <Exec Command=""$PYTHONPATH=$(srcdir)/Tools/peg_generator" "$(PythonExe)" -m pegen -c -q "$(PySourcePath)Grammar\python.gram" -o "$(IntDir)parse.c"" /> | ||
| 171 | + <Exec Command=""$PYTHONPATH=$(srcdir)/Tools/peg_generator" "$(PythonExe)" -m pegen -q c "$(PySourcePath)Grammar\python.gram" "$(PySourcePath)Grammar\Tokens" -o "$(IntDir)parse.c"" /> | ||
| 172 | 172 | <Copy SourceFiles="$(IntDir)parse.c" DestinationFiles="$(PySourcePath)Parser\pegen\parse.c"> | |
| 173 | 173 | <Output TaskParameter="CopiedFiles" ItemName="_UpdatedParse" /> | |
| 174 | 174 | </Copy> | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -10,6 +10,7 @@ CPYTHON ?= ../../Lib | |||
| 10 | 10 | MYPY ?= mypy | |
| 11 | 11 | ||
| 12 | 12 | GRAMMAR = ../../Grammar/python.gram | |
| 13 | + TOKENS = ../../Grammar/Tokens | ||
| 13 | 14 | TESTFILE = data/cprog.py | |
| 14 | 15 | TIMEFILE = data/xxl.py | |
| 15 | 16 | TESTDIR = . | |
@@ -20,8 +21,8 @@ data/xxl.py: | |||
| 20 | 21 | ||
| 21 | 22 | build: peg_extension/parse.c | |
| 22 | 23 | ||
| 23 | - peg_extension/parse.c: $(GRAMMAR) pegen/*.py peg_extension/peg_extension.c ../../Parser/pegen/pegen.c ../../Parser/pegen/parse_string.c ../../Parser/pegen/*.h pegen/grammar_parser.py | ||
| 24 | - $(PYTHON) -m pegen -q -c $(GRAMMAR) -o peg_extension/parse.c --compile-extension | ||
| 24 | + 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 | ||
| 25 | + $(PYTHON) -m pegen -q c $(GRAMMAR) $(TOKENS) -o peg_extension/parse.c --compile-extension | ||
| 25 | 26 | ||
| 26 | 27 | clean: | |
| 27 | 28 | -rm -f peg_extension/*.o peg_extension/*.so peg_extension/parse.c | |
@@ -79,7 +80,8 @@ time_stdlib_parse: data/xxl.py | |||
| 79 | 80 | ||
| 80 | 81 | test_local: | |
| 81 | 82 | $(PYTHON) scripts/test_parse_directory.py \ | |
| 82 | - -g $(GRAMMAR) \ | ||
| 83 | + --grammar-file $(GRAMMAR) \ | ||
| 84 | + --tokens-file $(TOKENS) \ | ||
| 83 | 85 | -d $(TESTDIR) \ | |
| 84 | 86 | $(TESTFLAGS) \ | |
| 85 | 87 | --exclude "*/failset/*" \ | |
@@ -88,7 +90,8 @@ test_local: | |||
| 88 | 90 | ||
| 89 | 91 | test_global: $(CPYTHON) | |
| 90 | 92 | $(PYTHON) scripts/test_parse_directory.py \ | |
| 91 | - -g $(GRAMMAR) \ | ||
| 93 | + --grammar-file $(GRAMMAR) \ | ||
| 94 | + --tokens-file $(TOKENS) \ | ||
| 92 | 95 | -d $(CPYTHON) \ | |
| 93 | 96 | $(TESTFLAGS) \ | |
| 94 | 97 | --exclude "*/test2to3/*" \ | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -11,6 +11,64 @@ | |||
| 11 | 11 | import token | |
| 12 | 12 | import traceback | |
| 13 | 13 | ||
| 14 | + from typing import Tuple | ||
| 15 | + | ||
| 16 | + from pegen.build import Grammar, Parser, Tokenizer, ParserGenerator | ||
| 17 | + | ||
| 18 | + | ||
| 19 | + def generate_c_code( | ||
| 20 | + args: argparse.Namespace, | ||
| 21 | + ) -> Tuple[Grammar, Parser, Tokenizer, ParserGenerator]: | ||
| 22 | + from pegen.build import build_c_parser_and_generator | ||
| 23 | + | ||
| 24 | + verbose = args.verbose | ||
| 25 | + verbose_tokenizer = verbose >= 3 | ||
| 26 | + verbose_parser = verbose == 2 or verbose >= 4 | ||
| 27 | + try: | ||
| 28 | + grammar, parser, tokenizer, gen = build_c_parser_and_generator( | ||
| 29 | + args.grammar_filename, | ||
| 30 | + args.tokens_filename, | ||
| 31 | + args.output, | ||
| 32 | + args.compile_extension, | ||
| 33 | + verbose_tokenizer, | ||
| 34 | + verbose_parser, | ||
| 35 | + args.verbose, | ||
| 36 | + keep_asserts_in_extension=False if args.optimized else True, | ||
| 37 | + skip_actions=args.skip_actions, | ||
| 38 | + ) | ||
| 39 | + return grammar, parser, tokenizer, gen | ||
| 40 | + except Exception as err: | ||
| 41 | + if args.verbose: | ||
| 42 | + raise # Show traceback | ||
| 43 | + traceback.print_exception(err.__class__, err, None) | ||
| 44 | + sys.stderr.write("For full traceback, use -v\n") | ||
| 45 | + sys.exit(1) | ||
| 46 | + | ||
| 47 | + | ||
| 48 | + def generate_python_code( | ||
| 49 | + args: argparse.Namespace, | ||
| 50 | + ) -> Tuple[Grammar, Parser, Tokenizer, ParserGenerator]: | ||
| 51 | + from pegen.build import build_python_parser_and_generator | ||
| 52 | + | ||
| 53 | + verbose = args.verbose | ||
| 54 | + verbose_tokenizer = verbose >= 3 | ||
| 55 | + verbose_parser = verbose == 2 or verbose >= 4 | ||
| 56 | + try: | ||
| 57 | + grammar, parser, tokenizer, gen = build_python_parser_and_generator( | ||
| 58 | + args.grammar_filename, | ||
| 59 | + args.output, | ||
| 60 | + verbose_tokenizer, | ||
| 61 | + verbose_parser, | ||
| 62 | + skip_actions=args.skip_actions, | ||
| 63 | + ) | ||
| 64 | + return grammar, parser, tokenizer, gen | ||
| 65 | + except Exception as err: | ||
| 66 | + if args.verbose: | ||
| 67 | + raise # Show traceback | ||
| 68 | + traceback.print_exception(err.__class__, err, None) | ||
| 69 | + sys.stderr.write("For full traceback, use -v\n") | ||
| 70 | + sys.exit(1) | ||
| 71 | + | ||
| 14 | 72 | ||
| 15 | 73 | argparser = argparse.ArgumentParser( | |
| 16 | 74 | prog="pegen", description="Experimental PEG-like parser generator" | |
@@ -23,63 +81,52 @@ | |||
| 23 | 81 | default=0, | |
| 24 | 82 | help="Print timing stats; repeat for more debug output", | |
| 25 | 83 | ) | |
| 26 | - argparser.add_argument( | ||
| 27 | - "-c", "--cpython", action="store_true", help="Generate C code for inclusion into CPython" | ||
| 84 | + subparsers = argparser.add_subparsers(help="target language for the generated code") | ||
| 85 | + | ||
| 86 | + c_parser = subparsers.add_parser("c", help="Generate C code for inclusion into CPython") | ||
| 87 | + c_parser.set_defaults(func=generate_c_code) | ||
| 88 | + c_parser.add_argument("grammar_filename", help="Grammar description") | ||
| 89 | + c_parser.add_argument("tokens_filename", help="Tokens description") | ||
| 90 | + c_parser.add_argument( | ||
| 91 | + "-o", "--output", metavar="OUT", default="parse.c", help="Where to write the generated parser" | ||
| 28 | 92 | ) | |
| 29 | - argparser.add_argument( | ||
| 93 | + c_parser.add_argument( | ||
| 30 | 94 | "--compile-extension", | |
| 31 | 95 | action="store_true", | |
| 32 | 96 | help="Compile generated C code into an extension module", | |
| 33 | 97 | ) | |
| 34 | - argparser.add_argument( | ||
| 98 | + c_parser.add_argument( | ||
| 99 | + "--optimized", action="store_true", help="Compile the extension in optimized mode" | ||
| 100 | + ) | ||
| 101 | + c_parser.add_argument( | ||
| 102 | + "--skip-actions", action="store_true", help="Suppress code emission for rule actions", | ||
| 103 | + ) | ||
| 104 | + | ||
| 105 | + python_parser = subparsers.add_parser("python", help="Generate Python code") | ||
| 106 | + python_parser.set_defaults(func=generate_python_code) | ||
| 107 | + python_parser.add_argument("grammar_filename", help="Grammar description") | ||
| 108 | + python_parser.add_argument( | ||
| 35 | 109 | "-o", | |
| 36 | 110 | "--output", | |
| 37 | 111 | metavar="OUT", | |
| 38 | - help="Where to write the generated parser (default parse.py or parse.c)", | ||
| 112 | + default="parse.py", | ||
| 113 | + help="Where to write the generated parser", | ||
| 39 | 114 | ) | |
| 40 | - argparser.add_argument("filename", help="Grammar description") | ||
| 41 | - argparser.add_argument( | ||
| 42 | - "--optimized", action="store_true", help="Compile the extension in optimized mode" | ||
| 43 | - ) | ||
| 44 | - argparser.add_argument( | ||
| 115 | + python_parser.add_argument( | ||
| 45 | 116 | "--skip-actions", action="store_true", help="Suppress code emission for rule actions", | |
| 46 | 117 | ) | |
| 47 | 118 | ||
| 48 | 119 | ||
| 49 | 120 | def main() -> None: | |
| 50 | - from pegen.build import build_parser_and_generator | ||
| 51 | 121 | from pegen.testutil import print_memstats | |
| 52 | 122 | ||
| 53 | 123 | args = argparser.parse_args() | |
| 54 | - verbose = args.verbose | ||
| 55 | - verbose_tokenizer = verbose >= 3 | ||
| 56 | - verbose_parser = verbose == 2 or verbose >= 4 | ||
| 57 | - t0 = time.time() | ||
| 58 | - | ||
| 59 | - output_file = args.output | ||
| 60 | - if not output_file: | ||
| 61 | - if args.cpython: | ||
| 62 | - output_file = "parse.c" | ||
| 63 | - else: | ||
| 64 | - output_file = "parse.py" | ||
| 124 | + if "func" not in args: | ||
| 125 | + argparser.error("Must specify the target language mode ('c' or 'python')") | ||
| 65 | 126 | ||
| 66 | - try: | ||
| 67 | - grammar, parser, tokenizer, gen = build_parser_and_generator( | ||
| 68 | - args.filename, | ||
| 69 | - output_file, | ||
| 70 | - args.compile_extension, | ||
| 71 | - verbose_tokenizer, | ||
| 72 | - verbose_parser, | ||
| 73 | - args.verbose, | ||
| 74 | - keep_asserts_in_extension=False if args.optimized else True, | ||
| 75 | - skip_actions=args.skip_actions, | ||
| 76 | - ) | ||
| 77 | - except Exception as err: | ||
| 78 | - if args.verbose: | ||
| 79 | - raise # Show traceback | ||
| 80 | - traceback.print_exception(err.__class__, err, None) | ||
| 81 | - sys.stderr.write("For full traceback, use -v\n") | ||
| 82 | - sys.exit(1) | ||
| 127 | + t0 = time.time() | ||
| 128 | + grammar, parser, tokenizer, gen = args.func(args) | ||
| 129 | + t1 = time.time() | ||
| 83 | 130 | ||
| 84 | 131 | if not args.quiet: | |
| 85 | 132 | if args.verbose: | |
@@ -110,8 +157,6 @@ def main() -> None: | |||
| 110 | 157 | else: | |
| 111 | 158 | print() | |
| 112 | 159 | ||
| 113 | - t1 = time.time() | ||
| 114 | - | ||
| 115 | 160 | if args.verbose: | |
| 116 | 161 | dt = t1 - t0 | |
| 117 | 162 | diag = tokenizer.diagnose() | |
| Back | FazBrowse Home | New Git URL |
0 commit comments