From 7832b5a89d3ad2af928cc2ec0d3308192191f00c Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Tue, 21 Feb 2017 10:04:19 -0800 Subject: [PATCH] next --- .../br-parser-tools-doc/LICENSE.txt | 11 + .../br-parser-tools/br-parser-tools.scrbl | 769 +++++++++++ .../compiled/br-parser-tools_scrbl.dep | 1 + .../compiled/br-parser-tools_scrbl.zo | Bin 0 -> 92384 bytes .../br-parser-tools/compiled/info_rkt.dep | 1 + .../br-parser-tools/compiled/info_rkt.zo | Bin 0 -> 808 bytes .../br-parser-tools/info.rkt | 3 + br-parser-tools/br-parser-tools-doc/info.rkt | 14 + .../br-parser-tools-lib/LICENSE.txt | 11 + .../br-parser-tools/cfg-parser.rkt | 982 ++++++++++++++ .../compiled/cfg-parser_rkt.dep | 1 + .../compiled/cfg-parser_rkt.zo | Bin 0 -> 99237 bytes .../drracket/errortrace/lex-sre_rkt.dep | 1 + .../drracket/errortrace/lex-sre_rkt.zo | Bin 0 -> 11952 bytes .../compiled/drracket/errortrace/lex_rkt.dep | 1 + .../compiled/drracket/errortrace/lex_rkt.zo | Bin 0 -> 79907 bytes .../compiled/drracket/errortrace/yacc_rkt.dep | 1 + .../compiled/drracket/errortrace/yacc_rkt.zo | Bin 0 -> 30983 bytes .../compiled/drracket/lex-sre_rkt.dep | 1 + .../compiled/drracket/lex-sre_rkt.zo | Bin 0 -> 6686 bytes .../compiled/drracket/lex_rkt.dep | 1 + .../compiled/drracket/lex_rkt.zo | Bin 0 -> 60567 bytes .../br-parser-tools/compiled/info_rkt.dep | 1 + .../br-parser-tools/compiled/info_rkt.zo | Bin 0 -> 792 bytes .../compiled/lex-plt-v200_rkt.dep | 1 + .../compiled/lex-plt-v200_rkt.zo | Bin 0 -> 1497 bytes .../br-parser-tools/compiled/lex-sre_rkt.dep | 1 + .../br-parser-tools/compiled/lex-sre_rkt.zo | Bin 0 -> 6984 bytes .../br-parser-tools/compiled/lex_rkt.dep | 1 + .../br-parser-tools/compiled/lex_rkt.zo | Bin 0 -> 66205 bytes .../compiled/yacc-to-scheme_rkt.dep | 1 + .../compiled/yacc-to-scheme_rkt.zo | Bin 0 -> 13459 bytes .../br-parser-tools/compiled/yacc_rkt.dep | 1 + .../br-parser-tools/compiled/yacc_rkt.zo | Bin 0 -> 17703 bytes .../br-parser-tools/examples/calc.rkt | 89 ++ .../examples/compiled/calc_rkt.dep | 1 + .../examples/compiled/calc_rkt.zo | Bin 0 -> 10596 bytes .../examples/compiled/read_rkt.dep | 1 + .../examples/compiled/read_rkt.zo | Bin 0 -> 31605 bytes .../br-parser-tools/examples/read.rkt | 242 ++++ .../br-parser-tools/info.rkt | 3 + .../br-parser-tools/lex-plt-v200.rkt | 24 + .../br-parser-tools/lex-sre.rkt | 119 ++ .../br-parser-tools/lex.rkt | 412 ++++++ .../br-parser-tools/private-lex/actions.rkt | 16 + .../private-lex/compiled/actions_rkt.dep | 1 + .../private-lex/compiled/actions_rkt.zo | Bin 0 -> 1500 bytes .../private-lex/compiled/deriv_rkt.dep | 1 + .../private-lex/compiled/deriv_rkt.zo | Bin 0 -> 19070 bytes .../compiled/drracket/actions_rkt.dep | 1 + .../compiled/drracket/actions_rkt.zo | Bin 0 -> 1267 bytes .../compiled/drracket/deriv_rkt.dep | 1 + .../compiled/drracket/deriv_rkt.zo | Bin 0 -> 8122 bytes .../drracket/errortrace/actions_rkt.dep | 1 + .../drracket/errortrace/actions_rkt.zo | Bin 0 -> 2645 bytes .../drracket/errortrace/deriv_rkt.dep | 1 + .../compiled/drracket/errortrace/deriv_rkt.zo | Bin 0 -> 17391 bytes .../drracket/errortrace/front_rkt.dep | 1 + .../compiled/drracket/errortrace/front_rkt.zo | Bin 0 -> 8138 bytes .../compiled/drracket/errortrace/re_rkt.dep | 1 + .../compiled/drracket/errortrace/re_rkt.zo | Bin 0 -> 24276 bytes .../compiled/drracket/errortrace/stx_rkt.dep | 1 + .../compiled/drracket/errortrace/stx_rkt.zo | Bin 0 -> 26859 bytes .../drracket/errortrace/token-syntax_rkt.dep | 1 + .../drracket/errortrace/token-syntax_rkt.zo | Bin 0 -> 2277 bytes .../drracket/errortrace/token_rkt.dep | 1 + .../compiled/drracket/errortrace/token_rkt.zo | Bin 0 -> 10987 bytes .../drracket/errortrace/unicode-chars_rkt.dep | 1 + .../drracket/errortrace/unicode-chars_rkt.zo | Bin 0 -> 10830 bytes .../compiled/drracket/errortrace/util_rkt.dep | 1 + .../compiled/drracket/errortrace/util_rkt.zo | Bin 0 -> 15126 bytes .../compiled/drracket/front_rkt.dep | 1 + .../compiled/drracket/front_rkt.zo | Bin 0 -> 4002 bytes .../private-lex/compiled/drracket/re_rkt.dep | 1 + .../private-lex/compiled/drracket/re_rkt.zo | Bin 0 -> 13780 bytes .../private-lex/compiled/drracket/stx_rkt.dep | 1 + .../private-lex/compiled/drracket/stx_rkt.zo | Bin 0 -> 12853 bytes .../compiled/drracket/token-syntax_rkt.dep | 1 + .../compiled/drracket/token-syntax_rkt.zo | Bin 0 -> 1447 bytes .../compiled/drracket/token_rkt.dep | 1 + .../compiled/drracket/token_rkt.zo | Bin 0 -> 6679 bytes .../compiled/drracket/unicode-chars_rkt.dep | 1 + .../compiled/drracket/unicode-chars_rkt.zo | Bin 0 -> 3964 bytes .../compiled/drracket/util_rkt.dep | 1 + .../private-lex/compiled/drracket/util_rkt.zo | Bin 0 -> 7395 bytes .../private-lex/compiled/front_rkt.dep | 1 + .../private-lex/compiled/front_rkt.zo | Bin 0 -> 5590 bytes .../private-lex/compiled/re_rkt.dep | 1 + .../private-lex/compiled/re_rkt.zo | Bin 0 -> 28265 bytes .../private-lex/compiled/stx_rkt.dep | 1 + .../private-lex/compiled/stx_rkt.zo | Bin 0 -> 13005 bytes .../private-lex/compiled/token-syntax_rkt.dep | 1 + .../private-lex/compiled/token-syntax_rkt.zo | Bin 0 -> 1447 bytes .../private-lex/compiled/token_rkt.dep | 1 + .../private-lex/compiled/token_rkt.zo | Bin 0 -> 7438 bytes .../compiled/unicode-chars_rkt.dep | 1 + .../private-lex/compiled/unicode-chars_rkt.zo | Bin 0 -> 9810 bytes .../private-lex/compiled/util_rkt.dep | 1 + .../private-lex/compiled/util_rkt.zo | Bin 0 -> 9321 bytes .../br-parser-tools/private-lex/deriv.rkt | 339 +++++ .../private-lex/error-tests.rkt | 81 ++ .../br-parser-tools/private-lex/front.rkt | 179 +++ .../br-parser-tools/private-lex/re.rkt | 385 ++++++ .../br-parser-tools/private-lex/stx.rkt | 220 ++++ .../private-lex/token-syntax.rkt | 9 + .../br-parser-tools/private-lex/token.rkt | 92 ++ .../private-lex/unicode-chars.rkt | 69 + .../br-parser-tools/private-lex/util.rkt | 127 ++ .../drracket/errortrace/grammar_rkt.dep | 1 + .../drracket/errortrace/grammar_rkt.zo | Bin 0 -> 33469 bytes .../drracket/errortrace/graph_rkt.dep | 1 + .../compiled/drracket/errortrace/graph_rkt.zo | Bin 0 -> 3820 bytes .../errortrace/input-file-parser_rkt.dep | 1 + .../errortrace/input-file-parser_rkt.zo | Bin 0 -> 31309 bytes .../compiled/drracket/errortrace/lalr_rkt.dep | 1 + .../compiled/drracket/errortrace/lalr_rkt.zo | Bin 0 -> 19977 bytes .../compiled/drracket/errortrace/lr0_rkt.dep | 1 + .../compiled/drracket/errortrace/lr0_rkt.zo | Bin 0 -> 25149 bytes .../errortrace/parser-actions_rkt.dep | 1 + .../drracket/errortrace/parser-actions_rkt.zo | Bin 0 -> 7441 bytes .../errortrace/parser-builder_rkt.dep | 1 + .../drracket/errortrace/parser-builder_rkt.zo | Bin 0 -> 16345 bytes .../drracket/errortrace/table_rkt.dep | 1 + .../compiled/drracket/errortrace/table_rkt.zo | Bin 0 -> 24162 bytes .../drracket/errortrace/yacc-helper_rkt.dep | 1 + .../drracket/errortrace/yacc-helper_rkt.zo | Bin 0 -> 7278 bytes .../compiled/drracket/grammar_rkt.dep | 1 + .../compiled/drracket/grammar_rkt.zo | Bin 0 -> 18504 bytes .../compiled/drracket/yacc-helper_rkt.dep | 1 + .../compiled/drracket/yacc-helper_rkt.zo | Bin 0 -> 2737 bytes .../private-yacc/compiled/grammar_rkt.dep | 1 + .../private-yacc/compiled/grammar_rkt.zo | Bin 0 -> 23785 bytes .../private-yacc/compiled/graph_rkt.dep | 1 + .../private-yacc/compiled/graph_rkt.zo | Bin 0 -> 1951 bytes .../compiled/input-file-parser_rkt.dep | 1 + .../compiled/input-file-parser_rkt.zo | Bin 0 -> 24572 bytes .../private-yacc/compiled/lalr_rkt.dep | 1 + .../private-yacc/compiled/lalr_rkt.zo | Bin 0 -> 21751 bytes .../private-yacc/compiled/lr0_rkt.dep | 1 + .../private-yacc/compiled/lr0_rkt.zo | Bin 0 -> 22068 bytes .../compiled/parser-actions_rkt.dep | 1 + .../compiled/parser-actions_rkt.zo | Bin 0 -> 4448 bytes .../compiled/parser-builder_rkt.dep | 1 + .../compiled/parser-builder_rkt.zo | Bin 0 -> 14327 bytes .../private-yacc/compiled/table_rkt.dep | 1 + .../private-yacc/compiled/table_rkt.zo | Bin 0 -> 16223 bytes .../private-yacc/compiled/yacc-helper_rkt.dep | 1 + .../private-yacc/compiled/yacc-helper_rkt.zo | Bin 0 -> 6732 bytes .../br-parser-tools/private-yacc/grammar.rkt | 280 ++++ .../br-parser-tools/private-yacc/graph.rkt | 61 + .../private-yacc/input-file-parser.rkt | 374 ++++++ .../br-parser-tools/private-yacc/lalr.rkt | 277 ++++ .../br-parser-tools/private-yacc/lr0.rkt | 372 ++++++ .../private-yacc/parser-actions.rkt | 54 + .../private-yacc/parser-builder.rkt | 113 ++ .../br-parser-tools/private-yacc/table.rkt | 290 +++++ .../private-yacc/yacc-helper.rkt | 118 ++ .../br-parser-tools/yacc-to-scheme.rkt | 135 ++ .../br-parser-tools/yacc.rkt | 412 ++++++ br-parser-tools/br-parser-tools-lib/info.rkt | 11 + br-parser-tools/br-parser-tools/LICENSE.txt | 11 + br-parser-tools/br-parser-tools/info.rkt | 12 + brag/LICENSE | 165 +++ brag/README.md | 4 + brag/brag/Makefile | 12 + brag/brag/brag.scrbl | 1157 +++++++++++++++++ brag/brag/cfg-parser/cfg-parser.rkt | 921 +++++++++++++ .../cfg-parser/compiled/cfg-parser_rkt.dep | 1 + .../cfg-parser/compiled/cfg-parser_rkt.zo | Bin 0 -> 93024 bytes .../drracket/errortrace/cfg-parser_rkt.dep | 1 + .../drracket/errortrace/cfg-parser_rkt.zo | Bin 0 -> 126631 bytes brag/brag/codegen/codegen.rkt | 448 +++++++ brag/brag/codegen/compiled/codegen_rkt.dep | 1 + brag/brag/codegen/compiled/codegen_rkt.zo | Bin 0 -> 35832 bytes .../drracket/errortrace/codegen_rkt.dep | 1 + .../drracket/errortrace/codegen_rkt.zo | Bin 0 -> 41766 bytes .../drracket/errortrace/flatten_rkt.dep | 1 + .../drracket/errortrace/flatten_rkt.zo | Bin 0 -> 20646 bytes .../drracket/errortrace/reader_rkt.dep | 1 + .../drracket/errortrace/reader_rkt.zo | Bin 0 -> 6452 bytes .../drracket/errortrace/runtime_rkt.dep | 1 + .../drracket/errortrace/runtime_rkt.zo | Bin 0 -> 14949 bytes .../drracket/errortrace/satisfaction_rkt.dep | 1 + .../drracket/errortrace/satisfaction_rkt.zo | Bin 0 -> 20024 bytes .../errortrace/sexp-based-lang_rkt.dep | 1 + .../errortrace/sexp-based-lang_rkt.zo | Bin 0 -> 3164 bytes brag/brag/codegen/compiled/flatten_rkt.dep | 1 + brag/brag/codegen/compiled/flatten_rkt.zo | Bin 0 -> 14850 bytes brag/brag/codegen/compiled/reader_rkt.dep | 1 + brag/brag/codegen/compiled/reader_rkt.zo | Bin 0 -> 3898 bytes brag/brag/codegen/compiled/runtime_rkt.dep | 1 + brag/brag/codegen/compiled/runtime_rkt.zo | Bin 0 -> 8912 bytes .../codegen/compiled/satisfaction_rkt.dep | 1 + .../brag/codegen/compiled/satisfaction_rkt.zo | Bin 0 -> 9244 bytes .../codegen/compiled/sexp-based-lang_rkt.dep | 1 + .../codegen/compiled/sexp-based-lang_rkt.zo | Bin 0 -> 1016 bytes brag/brag/codegen/flatten.rkt | 200 +++ brag/brag/codegen/reader.rkt | 68 + brag/brag/codegen/runtime.rkt | 212 +++ brag/brag/codegen/satisfaction.rkt | 207 +++ brag/brag/codegen/sexp-based-lang.rkt | 96 ++ brag/brag/compiled/brag_scrbl.dep | 1 + brag/brag/compiled/brag_scrbl.zo | Bin 0 -> 129573 bytes .../compiled/drracket/errortrace/main_rkt.dep | 1 + .../compiled/drracket/errortrace/main_rkt.zo | Bin 0 -> 5052 bytes .../drracket/errortrace/support_rkt.dep | 1 + .../drracket/errortrace/support_rkt.zo | Bin 0 -> 22400 bytes brag/brag/compiled/info_rkt.dep | 1 + brag/brag/compiled/info_rkt.zo | Bin 0 -> 1492 bytes brag/brag/compiled/main_rkt.dep | 1 + brag/brag/compiled/main_rkt.zo | Bin 0 -> 1392 bytes brag/brag/compiled/support_rkt.dep | 1 + brag/brag/compiled/support_rkt.zo | Bin 0 -> 18838 bytes brag/brag/examples/01-equal.rkt | 12 + brag/brag/examples/0n1.rkt | 3 + brag/brag/examples/0n1n.rkt | 3 + brag/brag/examples/add-mult.rkt | 7 + brag/brag/examples/baby-json-hider.rkt | 18 + brag/brag/examples/baby-json.rkt | 16 + brag/brag/examples/bnf.rkt | 13 + brag/brag/examples/compiled/01-equal_rkt.dep | 1 + brag/brag/examples/compiled/01-equal_rkt.zo | Bin 0 -> 19072 bytes brag/brag/examples/compiled/0n1_rkt.dep | 1 + brag/brag/examples/compiled/0n1_rkt.zo | Bin 0 -> 14346 bytes brag/brag/examples/compiled/0n1n_rkt.dep | 1 + brag/brag/examples/compiled/0n1n_rkt.zo | Bin 0 -> 12799 bytes brag/brag/examples/compiled/add-mult_rkt.dep | 1 + brag/brag/examples/compiled/add-mult_rkt.zo | Bin 0 -> 30302 bytes .../examples/compiled/baby-json-hider_rkt.dep | 1 + .../examples/compiled/baby-json-hider_rkt.zo | Bin 0 -> 32398 bytes brag/brag/examples/compiled/baby-json_rkt.dep | 1 + brag/brag/examples/compiled/baby-json_rkt.zo | Bin 0 -> 31870 bytes brag/brag/examples/compiled/bnf_rkt.dep | 1 + brag/brag/examples/compiled/bnf_rkt.zo | Bin 0 -> 32259 bytes .../drracket/errortrace/add-mult_rkt.dep | 1 + .../drracket/errortrace/add-mult_rkt.zo | Bin 0 -> 50401 bytes .../simple-arithmetic-grammar_rkt.dep | 1 + .../simple-arithmetic-grammar_rkt.zo | Bin 0 -> 29398 bytes .../brag/examples/compiled/lua-parser_rkt.dep | 1 + brag/brag/examples/compiled/lua-parser_rkt.zo | Bin 0 -> 187670 bytes .../compiled/nested-word-list_rkt.dep | 1 + .../examples/compiled/nested-word-list_rkt.zo | Bin 0 -> 16611 bytes .../simple-arithmetic-grammar_rkt.dep | 1 + .../compiled/simple-arithmetic-grammar_rkt.zo | Bin 0 -> 19356 bytes .../compiled/simple-line-drawing_rkt.dep | 1 + .../compiled/simple-line-drawing_rkt.zo | Bin 0 -> 19131 bytes .../compiled/statlist-grammar_rkt.dep | 1 + .../examples/compiled/statlist-grammar_rkt.zo | Bin 0 -> 33486 bytes .../brag/examples/compiled/whitespace_rkt.dep | 1 + brag/brag/examples/compiled/whitespace_rkt.zo | Bin 0 -> 22102 bytes brag/brag/examples/compiled/wordy_rkt.dep | 1 + brag/brag/examples/compiled/wordy_rkt.zo | Bin 0 -> 21909 bytes brag/brag/examples/cutter.rkt | 4 + brag/brag/examples/lua-parser.rkt | 111 ++ brag/brag/examples/nested-word-list.rkt | 3 + .../examples/simple-arithmetic-grammar.rkt | 5 + brag/brag/examples/simple-line-drawing.rkt | 10 + .../compiled/grammar_rkt.dep | 1 + .../compiled/grammar_rkt.zo | Bin 0 -> 19088 bytes .../compiled/interpret_rkt.dep | 1 + .../compiled/interpret_rkt.zo | Bin 0 -> 6809 bytes .../compiled/lexer_rkt.dep | 1 + .../simple-line-drawing/compiled/lexer_rkt.zo | Bin 0 -> 10589 bytes .../compiled/semantics_rkt.dep | 1 + .../compiled/semantics_rkt.zo | Bin 0 -> 6219 bytes .../examples/compiled/letter-i_rkt.dep | 1 + .../examples/compiled/letter-i_rkt.zo | Bin 0 -> 6044 bytes .../simple-line-drawing/examples/letter-i.rkt | 4 + .../examples/simple-line-drawing/grammar.rkt | 10 + .../simple-line-drawing/interpret.rkt | 31 + .../lang/compiled/reader_rkt.dep | 1 + .../lang/compiled/reader_rkt.zo | Bin 0 -> 2389 bytes .../simple-line-drawing/lang/reader.rkt | 22 + .../examples/simple-line-drawing/lexer.rkt | 27 + .../simple-line-drawing/semantics.rkt | 48 + brag/brag/examples/statlist-grammar.rkt | 14 + brag/brag/examples/whitespace.rkt | 6 + brag/brag/examples/wordy.rkt | 7 + brag/brag/info.rkt | 7 + brag/brag/main.rkt | 5 + .../errortrace/internal-support_rkt.dep | 1 + .../errortrace/internal-support_rkt.zo | Bin 0 -> 4053 bytes .../private/compiled/internal-support_rkt.dep | 1 + .../private/compiled/internal-support_rkt.zo | Bin 0 -> 1172 bytes brag/brag/private/internal-support.rkt | 36 + .../drracket/errortrace/lexer_rkt.dep | 1 + .../compiled/drracket/errortrace/lexer_rkt.zo | Bin 0 -> 19254 bytes .../drracket/errortrace/parser_rkt.dep | 1 + .../drracket/errortrace/parser_rkt.zo | Bin 0 -> 27278 bytes .../drracket/errortrace/rule-structs_rkt.dep | 1 + .../drracket/errortrace/rule-structs_rkt.zo | Bin 0 -> 12242 bytes .../drracket/errortrace/stx-types_rkt.dep | 1 + .../drracket/errortrace/stx-types_rkt.zo | Bin 0 -> 3626 bytes .../compiled/drracket/errortrace/stx_rkt.dep | 1 + .../compiled/drracket/errortrace/stx_rkt.zo | Bin 0 -> 9644 bytes brag/brag/rules/compiled/lexer_rkt.dep | 1 + brag/brag/rules/compiled/lexer_rkt.zo | Bin 0 -> 13580 bytes brag/brag/rules/compiled/parser_rkt.dep | 1 + brag/brag/rules/compiled/parser_rkt.zo | Bin 0 -> 17385 bytes brag/brag/rules/compiled/rule-structs_rkt.dep | 1 + brag/brag/rules/compiled/rule-structs_rkt.zo | Bin 0 -> 8677 bytes brag/brag/rules/compiled/runtime_rkt.dep | 1 + brag/brag/rules/compiled/runtime_rkt.zo | Bin 0 -> 5421 bytes brag/brag/rules/compiled/stx-types_rkt.dep | 1 + brag/brag/rules/compiled/stx-types_rkt.zo | Bin 0 -> 1478 bytes brag/brag/rules/compiled/stx_rkt.dep | 1 + brag/brag/rules/compiled/stx_rkt.zo | Bin 0 -> 4842 bytes brag/brag/rules/lexer.rkt | 131 ++ brag/brag/rules/parser.rkt | 281 ++++ brag/brag/rules/rule-structs.rkt | 43 + brag/brag/rules/runtime.rkt | 34 + brag/brag/rules/stx-types.rkt | 16 + brag/brag/rules/stx.rkt | 88 ++ brag/brag/support.rkt | 143 ++ brag/brag/test/compiled/test-01-equal_rkt.dep | 1 + brag/brag/test/compiled/test-01-equal_rkt.zo | Bin 0 -> 2373 bytes brag/brag/test/compiled/test-0n1_rkt.dep | 1 + brag/brag/test/compiled/test-0n1_rkt.zo | Bin 0 -> 4114 bytes brag/brag/test/compiled/test-0n1n_rkt.dep | 1 + brag/brag/test/compiled/test-0n1n_rkt.zo | Bin 0 -> 4050 bytes brag/brag/test/compiled/test-all_rkt.dep | 1 + brag/brag/test/compiled/test-all_rkt.zo | Bin 0 -> 910 bytes .../compiled/test-baby-json-hider_rkt.dep | 1 + .../test/compiled/test-baby-json-hider_rkt.zo | Bin 0 -> 2231 bytes .../brag/test/compiled/test-baby-json_rkt.dep | 1 + brag/brag/test/compiled/test-baby-json_rkt.zo | Bin 0 -> 2069 bytes brag/brag/test/compiled/test-errors_rkt.dep | 1 + brag/brag/test/compiled/test-errors_rkt.zo | Bin 0 -> 11395 bytes brag/brag/test/compiled/test-flatten_rkt.dep | 1 + brag/brag/test/compiled/test-flatten_rkt.zo | Bin 0 -> 19183 bytes brag/brag/test/compiled/test-lexer_rkt.dep | 1 + brag/brag/test/compiled/test-lexer_rkt.zo | Bin 0 -> 5754 bytes .../brag/test/compiled/test-old-token_rkt.dep | 1 + brag/brag/test/compiled/test-old-token_rkt.zo | Bin 0 -> 15504 bytes brag/brag/test/compiled/test-parser_rkt.dep | 1 + brag/brag/test/compiled/test-parser_rkt.zo | Bin 0 -> 9131 bytes .../test-simple-arithmetic-grammar_rkt.dep | 1 + .../test-simple-arithmetic-grammar_rkt.zo | Bin 0 -> 7021 bytes .../compiled/test-simple-line-drawing_rkt.dep | 1 + .../compiled/test-simple-line-drawing_rkt.zo | Bin 0 -> 13833 bytes .../test/compiled/test-weird-grammar_rkt.dep | 1 + .../test/compiled/test-weird-grammar_rkt.zo | Bin 0 -> 1464 bytes .../test/compiled/test-whitespace_rkt.dep | 1 + .../brag/test/compiled/test-whitespace_rkt.zo | Bin 0 -> 1801 bytes brag/brag/test/compiled/test-wordy_rkt.dep | 1 + brag/brag/test/compiled/test-wordy_rkt.zo | Bin 0 -> 1875 bytes brag/brag/test/compiled/weird-grammar_rkt.dep | 1 + brag/brag/test/compiled/weird-grammar_rkt.zo | Bin 0 -> 11106 bytes brag/brag/test/test-01-equal.rkt | 30 + brag/brag/test/test-0n1.rkt | 50 + brag/brag/test/test-0n1n.rkt | 49 + brag/brag/test/test-all.rkt | 18 + brag/brag/test/test-baby-json-hider.rkt | 19 + brag/brag/test/test-baby-json.rkt | 25 + brag/brag/test/test-cutter.rkt | 9 + brag/brag/test/test-errors.rkt | 137 ++ brag/brag/test/test-flatten.rkt | 193 +++ brag/brag/test/test-lexer.rkt | 73 ++ brag/brag/test/test-old-token.rkt | 76 ++ brag/brag/test/test-parser.rkt | 153 +++ .../test/test-simple-arithmetic-grammar.rkt | 72 + brag/brag/test/test-simple-line-drawing.rkt | 72 + brag/brag/test/test-weird-grammar.rkt | 7 + brag/brag/test/test-whitespace.rkt | 12 + brag/brag/test/test-wordy.rkt | 18 + brag/brag/test/weird-grammar.rkt | 6 + brag/compiled/info_rkt.dep | 1 + brag/compiled/info_rkt.zo | Bin 0 -> 1053 bytes brag/info.rkt | 7 + 369 files changed, 12526 insertions(+) create mode 100644 br-parser-tools/br-parser-tools-doc/LICENSE.txt create mode 100644 br-parser-tools/br-parser-tools-doc/br-parser-tools/br-parser-tools.scrbl create mode 100644 br-parser-tools/br-parser-tools-doc/br-parser-tools/compiled/br-parser-tools_scrbl.dep create mode 100644 br-parser-tools/br-parser-tools-doc/br-parser-tools/compiled/br-parser-tools_scrbl.zo create mode 100644 br-parser-tools/br-parser-tools-doc/br-parser-tools/compiled/info_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-doc/br-parser-tools/compiled/info_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-doc/br-parser-tools/info.rkt create mode 100644 br-parser-tools/br-parser-tools-doc/info.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/LICENSE.txt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/cfg-parser.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/cfg-parser_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/cfg-parser_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/errortrace/lex-sre_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/errortrace/lex-sre_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/errortrace/lex_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/errortrace/lex_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/errortrace/yacc_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/errortrace/yacc_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/lex-sre_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/lex-sre_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/lex_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/lex_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/info_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/info_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/lex-plt-v200_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/lex-plt-v200_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/lex-sre_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/lex-sre_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/lex_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/lex_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/yacc-to-scheme_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/yacc-to-scheme_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/yacc_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/yacc_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/examples/calc.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/examples/compiled/calc_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/examples/compiled/calc_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/examples/compiled/read_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/examples/compiled/read_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/examples/read.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/info.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/lex-plt-v200.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/lex-sre.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/lex.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/actions.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/actions_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/actions_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/deriv_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/deriv_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/actions_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/actions_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/deriv_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/deriv_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/actions_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/actions_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/deriv_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/deriv_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/front_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/front_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/re_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/re_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/stx_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/stx_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/token-syntax_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/token-syntax_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/token_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/token_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/unicode-chars_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/unicode-chars_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/util_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/util_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/front_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/front_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/re_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/re_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/stx_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/stx_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/token-syntax_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/token-syntax_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/token_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/token_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/unicode-chars_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/unicode-chars_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/util_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/util_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/front_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/front_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/re_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/re_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/stx_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/stx_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/token-syntax_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/token-syntax_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/token_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/token_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/unicode-chars_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/unicode-chars_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/util_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/util_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/deriv.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/error-tests.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/front.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/re.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/stx.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/token-syntax.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/token.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/unicode-chars.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/util.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/grammar_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/grammar_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/graph_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/graph_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/input-file-parser_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/input-file-parser_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/lalr_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/lalr_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/lr0_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/lr0_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/parser-actions_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/parser-actions_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/parser-builder_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/parser-builder_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/table_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/table_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/yacc-helper_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/yacc-helper_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/grammar_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/grammar_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/yacc-helper_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/yacc-helper_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/grammar_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/grammar_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/graph_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/graph_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/input-file-parser_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/input-file-parser_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/lalr_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/lalr_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/lr0_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/lr0_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/parser-actions_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/parser-actions_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/parser-builder_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/parser-builder_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/table_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/table_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/yacc-helper_rkt.dep create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/yacc-helper_rkt.zo create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/grammar.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/graph.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/input-file-parser.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/lalr.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/lr0.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/parser-actions.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/parser-builder.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/table.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/yacc-helper.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/yacc-to-scheme.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/br-parser-tools/yacc.rkt create mode 100644 br-parser-tools/br-parser-tools-lib/info.rkt create mode 100644 br-parser-tools/br-parser-tools/LICENSE.txt create mode 100644 br-parser-tools/br-parser-tools/info.rkt create mode 100755 brag/LICENSE create mode 100755 brag/README.md create mode 100755 brag/brag/Makefile create mode 100755 brag/brag/brag.scrbl create mode 100755 brag/brag/cfg-parser/cfg-parser.rkt create mode 100644 brag/brag/cfg-parser/compiled/cfg-parser_rkt.dep create mode 100644 brag/brag/cfg-parser/compiled/cfg-parser_rkt.zo create mode 100644 brag/brag/cfg-parser/compiled/drracket/errortrace/cfg-parser_rkt.dep create mode 100644 brag/brag/cfg-parser/compiled/drracket/errortrace/cfg-parser_rkt.zo create mode 100755 brag/brag/codegen/codegen.rkt create mode 100644 brag/brag/codegen/compiled/codegen_rkt.dep create mode 100644 brag/brag/codegen/compiled/codegen_rkt.zo create mode 100644 brag/brag/codegen/compiled/drracket/errortrace/codegen_rkt.dep create mode 100644 brag/brag/codegen/compiled/drracket/errortrace/codegen_rkt.zo create mode 100644 brag/brag/codegen/compiled/drracket/errortrace/flatten_rkt.dep create mode 100644 brag/brag/codegen/compiled/drracket/errortrace/flatten_rkt.zo create mode 100644 brag/brag/codegen/compiled/drracket/errortrace/reader_rkt.dep create mode 100644 brag/brag/codegen/compiled/drracket/errortrace/reader_rkt.zo create mode 100644 brag/brag/codegen/compiled/drracket/errortrace/runtime_rkt.dep create mode 100644 brag/brag/codegen/compiled/drracket/errortrace/runtime_rkt.zo create mode 100644 brag/brag/codegen/compiled/drracket/errortrace/satisfaction_rkt.dep create mode 100644 brag/brag/codegen/compiled/drracket/errortrace/satisfaction_rkt.zo create mode 100644 brag/brag/codegen/compiled/drracket/errortrace/sexp-based-lang_rkt.dep create mode 100644 brag/brag/codegen/compiled/drracket/errortrace/sexp-based-lang_rkt.zo create mode 100644 brag/brag/codegen/compiled/flatten_rkt.dep create mode 100644 brag/brag/codegen/compiled/flatten_rkt.zo create mode 100644 brag/brag/codegen/compiled/reader_rkt.dep create mode 100644 brag/brag/codegen/compiled/reader_rkt.zo create mode 100644 brag/brag/codegen/compiled/runtime_rkt.dep create mode 100644 brag/brag/codegen/compiled/runtime_rkt.zo create mode 100644 brag/brag/codegen/compiled/satisfaction_rkt.dep create mode 100644 brag/brag/codegen/compiled/satisfaction_rkt.zo create mode 100644 brag/brag/codegen/compiled/sexp-based-lang_rkt.dep create mode 100644 brag/brag/codegen/compiled/sexp-based-lang_rkt.zo create mode 100755 brag/brag/codegen/flatten.rkt create mode 100755 brag/brag/codegen/reader.rkt create mode 100755 brag/brag/codegen/runtime.rkt create mode 100755 brag/brag/codegen/satisfaction.rkt create mode 100755 brag/brag/codegen/sexp-based-lang.rkt create mode 100644 brag/brag/compiled/brag_scrbl.dep create mode 100644 brag/brag/compiled/brag_scrbl.zo create mode 100644 brag/brag/compiled/drracket/errortrace/main_rkt.dep create mode 100644 brag/brag/compiled/drracket/errortrace/main_rkt.zo create mode 100644 brag/brag/compiled/drracket/errortrace/support_rkt.dep create mode 100644 brag/brag/compiled/drracket/errortrace/support_rkt.zo create mode 100644 brag/brag/compiled/info_rkt.dep create mode 100644 brag/brag/compiled/info_rkt.zo create mode 100644 brag/brag/compiled/main_rkt.dep create mode 100644 brag/brag/compiled/main_rkt.zo create mode 100644 brag/brag/compiled/support_rkt.dep create mode 100644 brag/brag/compiled/support_rkt.zo create mode 100755 brag/brag/examples/01-equal.rkt create mode 100755 brag/brag/examples/0n1.rkt create mode 100755 brag/brag/examples/0n1n.rkt create mode 100755 brag/brag/examples/add-mult.rkt create mode 100755 brag/brag/examples/baby-json-hider.rkt create mode 100755 brag/brag/examples/baby-json.rkt create mode 100755 brag/brag/examples/bnf.rkt create mode 100644 brag/brag/examples/compiled/01-equal_rkt.dep create mode 100644 brag/brag/examples/compiled/01-equal_rkt.zo create mode 100644 brag/brag/examples/compiled/0n1_rkt.dep create mode 100644 brag/brag/examples/compiled/0n1_rkt.zo create mode 100644 brag/brag/examples/compiled/0n1n_rkt.dep create mode 100644 brag/brag/examples/compiled/0n1n_rkt.zo create mode 100644 brag/brag/examples/compiled/add-mult_rkt.dep create mode 100644 brag/brag/examples/compiled/add-mult_rkt.zo create mode 100644 brag/brag/examples/compiled/baby-json-hider_rkt.dep create mode 100644 brag/brag/examples/compiled/baby-json-hider_rkt.zo create mode 100644 brag/brag/examples/compiled/baby-json_rkt.dep create mode 100644 brag/brag/examples/compiled/baby-json_rkt.zo create mode 100644 brag/brag/examples/compiled/bnf_rkt.dep create mode 100644 brag/brag/examples/compiled/bnf_rkt.zo create mode 100644 brag/brag/examples/compiled/drracket/errortrace/add-mult_rkt.dep create mode 100644 brag/brag/examples/compiled/drracket/errortrace/add-mult_rkt.zo create mode 100644 brag/brag/examples/compiled/drracket/errortrace/simple-arithmetic-grammar_rkt.dep create mode 100644 brag/brag/examples/compiled/drracket/errortrace/simple-arithmetic-grammar_rkt.zo create mode 100644 brag/brag/examples/compiled/lua-parser_rkt.dep create mode 100644 brag/brag/examples/compiled/lua-parser_rkt.zo create mode 100644 brag/brag/examples/compiled/nested-word-list_rkt.dep create mode 100644 brag/brag/examples/compiled/nested-word-list_rkt.zo create mode 100644 brag/brag/examples/compiled/simple-arithmetic-grammar_rkt.dep create mode 100644 brag/brag/examples/compiled/simple-arithmetic-grammar_rkt.zo create mode 100644 brag/brag/examples/compiled/simple-line-drawing_rkt.dep create mode 100644 brag/brag/examples/compiled/simple-line-drawing_rkt.zo create mode 100644 brag/brag/examples/compiled/statlist-grammar_rkt.dep create mode 100644 brag/brag/examples/compiled/statlist-grammar_rkt.zo create mode 100644 brag/brag/examples/compiled/whitespace_rkt.dep create mode 100644 brag/brag/examples/compiled/whitespace_rkt.zo create mode 100644 brag/brag/examples/compiled/wordy_rkt.dep create mode 100644 brag/brag/examples/compiled/wordy_rkt.zo create mode 100755 brag/brag/examples/cutter.rkt create mode 100755 brag/brag/examples/lua-parser.rkt create mode 100755 brag/brag/examples/nested-word-list.rkt create mode 100755 brag/brag/examples/simple-arithmetic-grammar.rkt create mode 100755 brag/brag/examples/simple-line-drawing.rkt create mode 100644 brag/brag/examples/simple-line-drawing/compiled/grammar_rkt.dep create mode 100644 brag/brag/examples/simple-line-drawing/compiled/grammar_rkt.zo create mode 100644 brag/brag/examples/simple-line-drawing/compiled/interpret_rkt.dep create mode 100644 brag/brag/examples/simple-line-drawing/compiled/interpret_rkt.zo create mode 100644 brag/brag/examples/simple-line-drawing/compiled/lexer_rkt.dep create mode 100644 brag/brag/examples/simple-line-drawing/compiled/lexer_rkt.zo create mode 100644 brag/brag/examples/simple-line-drawing/compiled/semantics_rkt.dep create mode 100644 brag/brag/examples/simple-line-drawing/compiled/semantics_rkt.zo create mode 100644 brag/brag/examples/simple-line-drawing/examples/compiled/letter-i_rkt.dep create mode 100644 brag/brag/examples/simple-line-drawing/examples/compiled/letter-i_rkt.zo create mode 100755 brag/brag/examples/simple-line-drawing/examples/letter-i.rkt create mode 100755 brag/brag/examples/simple-line-drawing/grammar.rkt create mode 100755 brag/brag/examples/simple-line-drawing/interpret.rkt create mode 100644 brag/brag/examples/simple-line-drawing/lang/compiled/reader_rkt.dep create mode 100644 brag/brag/examples/simple-line-drawing/lang/compiled/reader_rkt.zo create mode 100755 brag/brag/examples/simple-line-drawing/lang/reader.rkt create mode 100755 brag/brag/examples/simple-line-drawing/lexer.rkt create mode 100755 brag/brag/examples/simple-line-drawing/semantics.rkt create mode 100755 brag/brag/examples/statlist-grammar.rkt create mode 100644 brag/brag/examples/whitespace.rkt create mode 100755 brag/brag/examples/wordy.rkt create mode 100755 brag/brag/info.rkt create mode 100755 brag/brag/main.rkt create mode 100644 brag/brag/private/compiled/drracket/errortrace/internal-support_rkt.dep create mode 100644 brag/brag/private/compiled/drracket/errortrace/internal-support_rkt.zo create mode 100644 brag/brag/private/compiled/internal-support_rkt.dep create mode 100644 brag/brag/private/compiled/internal-support_rkt.zo create mode 100755 brag/brag/private/internal-support.rkt create mode 100644 brag/brag/rules/compiled/drracket/errortrace/lexer_rkt.dep create mode 100644 brag/brag/rules/compiled/drracket/errortrace/lexer_rkt.zo create mode 100644 brag/brag/rules/compiled/drracket/errortrace/parser_rkt.dep create mode 100644 brag/brag/rules/compiled/drracket/errortrace/parser_rkt.zo create mode 100644 brag/brag/rules/compiled/drracket/errortrace/rule-structs_rkt.dep create mode 100644 brag/brag/rules/compiled/drracket/errortrace/rule-structs_rkt.zo create mode 100644 brag/brag/rules/compiled/drracket/errortrace/stx-types_rkt.dep create mode 100644 brag/brag/rules/compiled/drracket/errortrace/stx-types_rkt.zo create mode 100644 brag/brag/rules/compiled/drracket/errortrace/stx_rkt.dep create mode 100644 brag/brag/rules/compiled/drracket/errortrace/stx_rkt.zo create mode 100644 brag/brag/rules/compiled/lexer_rkt.dep create mode 100644 brag/brag/rules/compiled/lexer_rkt.zo create mode 100644 brag/brag/rules/compiled/parser_rkt.dep create mode 100644 brag/brag/rules/compiled/parser_rkt.zo create mode 100644 brag/brag/rules/compiled/rule-structs_rkt.dep create mode 100644 brag/brag/rules/compiled/rule-structs_rkt.zo create mode 100644 brag/brag/rules/compiled/runtime_rkt.dep create mode 100644 brag/brag/rules/compiled/runtime_rkt.zo create mode 100644 brag/brag/rules/compiled/stx-types_rkt.dep create mode 100644 brag/brag/rules/compiled/stx-types_rkt.zo create mode 100644 brag/brag/rules/compiled/stx_rkt.dep create mode 100644 brag/brag/rules/compiled/stx_rkt.zo create mode 100755 brag/brag/rules/lexer.rkt create mode 100755 brag/brag/rules/parser.rkt create mode 100755 brag/brag/rules/rule-structs.rkt create mode 100755 brag/brag/rules/runtime.rkt create mode 100755 brag/brag/rules/stx-types.rkt create mode 100755 brag/brag/rules/stx.rkt create mode 100755 brag/brag/support.rkt create mode 100644 brag/brag/test/compiled/test-01-equal_rkt.dep create mode 100644 brag/brag/test/compiled/test-01-equal_rkt.zo create mode 100644 brag/brag/test/compiled/test-0n1_rkt.dep create mode 100644 brag/brag/test/compiled/test-0n1_rkt.zo create mode 100644 brag/brag/test/compiled/test-0n1n_rkt.dep create mode 100644 brag/brag/test/compiled/test-0n1n_rkt.zo create mode 100644 brag/brag/test/compiled/test-all_rkt.dep create mode 100644 brag/brag/test/compiled/test-all_rkt.zo create mode 100644 brag/brag/test/compiled/test-baby-json-hider_rkt.dep create mode 100644 brag/brag/test/compiled/test-baby-json-hider_rkt.zo create mode 100644 brag/brag/test/compiled/test-baby-json_rkt.dep create mode 100644 brag/brag/test/compiled/test-baby-json_rkt.zo create mode 100644 brag/brag/test/compiled/test-errors_rkt.dep create mode 100644 brag/brag/test/compiled/test-errors_rkt.zo create mode 100644 brag/brag/test/compiled/test-flatten_rkt.dep create mode 100644 brag/brag/test/compiled/test-flatten_rkt.zo create mode 100644 brag/brag/test/compiled/test-lexer_rkt.dep create mode 100644 brag/brag/test/compiled/test-lexer_rkt.zo create mode 100644 brag/brag/test/compiled/test-old-token_rkt.dep create mode 100644 brag/brag/test/compiled/test-old-token_rkt.zo create mode 100644 brag/brag/test/compiled/test-parser_rkt.dep create mode 100644 brag/brag/test/compiled/test-parser_rkt.zo create mode 100644 brag/brag/test/compiled/test-simple-arithmetic-grammar_rkt.dep create mode 100644 brag/brag/test/compiled/test-simple-arithmetic-grammar_rkt.zo create mode 100644 brag/brag/test/compiled/test-simple-line-drawing_rkt.dep create mode 100644 brag/brag/test/compiled/test-simple-line-drawing_rkt.zo create mode 100644 brag/brag/test/compiled/test-weird-grammar_rkt.dep create mode 100644 brag/brag/test/compiled/test-weird-grammar_rkt.zo create mode 100644 brag/brag/test/compiled/test-whitespace_rkt.dep create mode 100644 brag/brag/test/compiled/test-whitespace_rkt.zo create mode 100644 brag/brag/test/compiled/test-wordy_rkt.dep create mode 100644 brag/brag/test/compiled/test-wordy_rkt.zo create mode 100644 brag/brag/test/compiled/weird-grammar_rkt.dep create mode 100644 brag/brag/test/compiled/weird-grammar_rkt.zo create mode 100755 brag/brag/test/test-01-equal.rkt create mode 100755 brag/brag/test/test-0n1.rkt create mode 100755 brag/brag/test/test-0n1n.rkt create mode 100755 brag/brag/test/test-all.rkt create mode 100755 brag/brag/test/test-baby-json-hider.rkt create mode 100755 brag/brag/test/test-baby-json.rkt create mode 100755 brag/brag/test/test-cutter.rkt create mode 100755 brag/brag/test/test-errors.rkt create mode 100755 brag/brag/test/test-flatten.rkt create mode 100755 brag/brag/test/test-lexer.rkt create mode 100755 brag/brag/test/test-old-token.rkt create mode 100755 brag/brag/test/test-parser.rkt create mode 100755 brag/brag/test/test-simple-arithmetic-grammar.rkt create mode 100755 brag/brag/test/test-simple-line-drawing.rkt create mode 100755 brag/brag/test/test-weird-grammar.rkt create mode 100755 brag/brag/test/test-whitespace.rkt create mode 100755 brag/brag/test/test-wordy.rkt create mode 100755 brag/brag/test/weird-grammar.rkt create mode 100644 brag/compiled/info_rkt.dep create mode 100644 brag/compiled/info_rkt.zo create mode 100755 brag/info.rkt diff --git a/br-parser-tools/br-parser-tools-doc/LICENSE.txt b/br-parser-tools/br-parser-tools-doc/LICENSE.txt new file mode 100644 index 0000000..c424668 --- /dev/null +++ b/br-parser-tools/br-parser-tools-doc/LICENSE.txt @@ -0,0 +1,11 @@ +parser-tools-doc +Copyright (c) 2010-2014 PLT Design Inc. + +This package is distributed under the GNU Lesser General Public +License (LGPL). This means that you can link this package into proprietary +applications, provided you follow the rules stated in the LGPL. You +can also modify this package; if you distribute a modified version, +you must distribute it under the terms of the LGPL, which in +particular means that you must release the source code for the +modified software. See http://www.gnu.org/copyleft/lesser.html +for more information. diff --git a/br-parser-tools/br-parser-tools-doc/br-parser-tools/br-parser-tools.scrbl b/br-parser-tools/br-parser-tools-doc/br-parser-tools/br-parser-tools.scrbl new file mode 100644 index 0000000..7e0684c --- /dev/null +++ b/br-parser-tools/br-parser-tools-doc/br-parser-tools/br-parser-tools.scrbl @@ -0,0 +1,769 @@ +#lang scribble/doc +@(require scribble/manual scribble/struct scribble/xref scribble/bnf + (for-label scheme/base + scheme/contract + br-parser-tools/lex + (prefix-in : br-parser-tools/lex-sre) + br-parser-tools/yacc + br-parser-tools/cfg-parser)) + +@title{Parser Tools: @exec{lex} and @exec{yacc}-style Parsing (Beautiful Racket edition)} + +@author["Scott Owens (99%)" "Matthew Butterick (1%)"] + +This documentation assumes familiarity with @exec{lex} and @exec{yacc} +style lexer and parser generators. + +@table-of-contents[] + +@; ---------------------------------------------------------------------- + +@section{Lexers} + +@section-index["lex"] +@section-index["scanning"] +@section-index["scanner"] + +@defmodule[br-parser-tools/lex] + +@; ---------------------------------------- + +@subsection{Creating a Lexer} + +@defform/subs[#:literals (repetition union intersection complement concatenation + char-range char-complement + eof special special-comment) + (lexer [trigger action-expr] ...) + ([trigger re + (eof) + (special) + (special-comment)] + [re id + string + character + (repetition lo hi re) + (union re ...) + (intersection re ...) + (complement re) + (concatenation re ...) + (char-range char char) + (char-complement re) + (id datum ...)])]{ + + Produces a function that takes an input-port, matches the + @racket[re] patterns against the buffer, and returns the result of + executing the corresponding @racket[action-expr]. When multiple + patterns match, a lexer will choose the longest match, breaking + ties in favor of the rule appearing first. + + @margin-note{The implementation of @racketmodname[syntax-color/racket-lexer] + contains a lexer for the @racketmodname[racket] language. + In addition, files in the @filepath{examples} sub-directory + of the @filepath{br-parser-tools} collection contain + simpler example lexers.} + + An @racket[re] is matched as follows: + + @itemize[ + @item{@racket[id] --- expands to the named @deftech{lexer abbreviation}; + abbreviations are defined via @racket[define-lex-abbrev] or supplied by modules + like @racketmodname[br-parser-tools/lex-sre].} + @item{@racket[string] --- matches the sequence of characters in @racket[string].} + @item{@racket[character] --- matches a literal @racket[character].} + @item{@racket[(repetition lo hi re)] --- matches @racket[re] repeated between @racket[lo] + and @racket[hi] times, inclusive; @racket[hi] can be @racket[+inf.0] for unbounded repetitions.} + @item{@racket[(union re ...)] --- matches if any of the sub-expressions match} + @item{@racket[(intersection re ...)] --- matches if all of the @racket[re]s match.} + @item{@racket[(complement re)] --- matches anything that @racket[re] does not.} + @item{@racket[(concatenation re ...)] --- matches each @racket[re] in succession.} + @item{@racket[(char-range char char)] --- matches any character between the two (inclusive); + a single character string can be used as a @racket[char].} + @item{@racket[(char-complement re)] --- matches any character not matched by @racket[re]. + The sub-expression must be a set of characters @racket[re].} + @item{@racket[(id datum ...)] --- expands the @deftech{lexer macro} named @racket[id]; macros + are defined via @racket[define-lex-trans].} + ] + +Note that both @racket[(concatenation)] and @racket[""] match the +empty string, @racket[(union)] matches nothing, +@racket[(intersection)] matches any string, and +@racket[(char-complement (union))] matches any single character. + +The regular expression language is not designed to be used directly, +but rather as a basis for a user-friendly notation written with +regular expression macros. For example, +@racketmodname[br-parser-tools/lex-sre] supplies operators from Olin +Shivers's SREs, and @racketmodname[br-parser-tools/lex-plt-v200] supplies +(deprecated) operators from the previous version of this library. +Since those libraries provide operators whose names match other Racket +bindings, such as @racket[*] and @racket[+], they normally must be +imported using a prefix: + +@racketblock[ +(require (prefix-in : br-parser-tools/lex-sre)) +] + +The suggested prefix is @racket[:], so that @racket[:*] and +@racket[:+] are imported. Of course, a prefix other than @racket[:] +(such as @racket[re-]) will work too. + +Since negation is not a common operator on regular expressions, here +are a few examples, using @racket[:] prefixed SRE syntax: + +@itemize[ + +@item{@racketblock0[(complement "1")] + + Matches all strings except the string @racket["1"], including + @racket["11"], @racket["111"], @racket["0"], @racket["01"], + @racket[""], and so on.} + +@item{@racketblock0[(complement (:* "1"))] + + Matches all strings that are not sequences of @racket["1"], + including @racket["0"], @racket["00"], @racket["11110"], + @racket["0111"], @racket["11001010"] and so on.} + +@item{@racketblock0[(:& (:: any-string "111" any-string) + (complement (:or (:: any-string "01") (:+ "1"))))] + + Matches all strings that have 3 consecutive ones, but not those that + end in @racket["01"] and not those that are ones only. These + include @racket["1110"], @racket["0001000111"] and @racket["0111"] + but not @racket[""], @racket["11"], @racket["11101"], @racket["111"] + and @racket["11111"].} + +@item{@racketblock0[(:: "/*" (complement (:: any-string "*/" any-string)) "*/")] + + Matches Java/C block comments. @racket["/**/"], + @racket["/******/"], @racket["/*////*/"], @racket["/*asg4*/"] and so + on. It does not match @racket["/**/*/"], @racket["/* */ */"] and so + on. @racket[(:: any-string "*/" any-string)] matches any string + that has a @racket["*/"] in is, so @racket[(complement (:: any-string "*/" + any-string))] matches any string without a @racket["*/"] in it.} + +@item{@racketblock0[(:: "/*" (:* (complement "*/")) "*/")] + + Matches any string that starts with @racket["/*"] and ends with + @racket["*/"], including @racket["/* */ */ */"]. + @racket[(complement "*/")] matches any string except @racket["*/"]. + This includes @racket["*"] and @racket["/"] separately. Thus + @racket[(:* (complement "*/"))] matches @racket["*/"] by first + matching @racket["*"] and then matching @racket["/"]. Any other + string is matched directly by @racket[(complement "*/")]. In other + words, @racket[(:* (complement "xx"))] = @racket[any-string]. It is + usually not correct to place a @racket[:*] around a + @racket[complement].} +] + + + The following binding have special meaning inside of a lexer + action: + + @itemize[ + @item{@racket[start-pos] --- a @racket[position] struct for the first character matched.} + @item{@racket[end-pos] --- a @racket[position] struct for the character after the last character in the match.} + @item{@racket[lexeme] --- the matched string.} + @item{@racket[input-port] --- the input-port being + processed (this is useful for matching input with multiple + lexers).} + @item{@racket[(return-without-pos x)] and @racket[(return-without-srcloc x)] are functions (continuations) that + immediately return the value of @racket[x] from the lexer. This useful + in a src-pos or src-loc lexer to prevent the lexer from adding source + information. For example: + + @racketblock[ + (define get-token + (lexer-srcloc + ... + ((comment) (get-token input-port)) + ...)) + ] + + would wrap the source location information for the comment around + the value of the recursive call. Using + @racket[((comment) (return-without-srcloc (get-token input-port)))] + will cause the value of the recursive call to be returned without + wrapping position around it.} + ] + + The lexer raises an @racket[exn:fail:read] exception if none of the + regular expressions match the input. Hint: If @racket[(any-char + _custom-error-behavior)] is the last rule, then there will always + be a match, and @racket[_custom-error-behavior] is executed to + handle the error situation as desired, only consuming the first + character from the input buffer. + + In addition to returning characters, input + ports can return @racket[eof-object]s. Custom input ports can + also return a @racket[special-comment] value to indicate a + non-textual comment, or return another arbitrary value (a + special). The non-@racket[re] @racket[trigger] forms handle these + cases: + + @itemize[ + + @item{The @racket[(eof)] rule is matched when the input port + returns an @racket[eof-object] value. If no @racket[(eof)] + rule is present, the lexer returns the symbol @racket['eof] + when the port returns an @racket[eof-object] value.} + + @item{The @racket[(special-comment)] rule is matched when the + input port returns a @racket[special-comment] structure. If no + @racket[special-comment] rule is present, the lexer + automatically tries to return the next token from the input + port.} + + @item{The @racket[(special)] rule is matched when the input + port returns a value other than a character, + @racket[eof-object], or @racket[special-comment] structure. If + no @racket[(special)] rule is present, the lexer returns + @racket[(void)].}] + + End-of-files, specials, special-comments and special-errors cannot + be parsed via a rule using an ordinary regular expression + (but dropping down and manipulating the port to handle them + is possible in some situations). + + Since the lexer gets its source information from the port, use + @racket[port-count-lines!] to enable the tracking of line and + column information. Otherwise, the line and column information + will return @racket[#f]. + + When peeking from the input port raises an exception (such as by + an embedded XML editor with malformed syntax), the exception can + be raised before all tokens preceding the exception have been + returned. + + Each time the racket code for a lexer is compiled (e.g. when a + @filepath{.rkt} file containing a @racket[lexer] form is loaded), + the lexer generator is run. To avoid this overhead place the + lexer into a module and compile the module to a @filepath{.zo} + bytecode file.} + +@defform[(lexer-src-pos (trigger action-expr) ...)]{ + +Like @racket[lexer], but for each @racket[_action-result] produced by +an @racket[action-expr], returns @racket[(make-position-token +_action-result start-pos end-pos)] instead of simply +@racket[_action-result].} + +@defform[(lexer-srcloc (trigger action-expr) ...)]{ + +Like @racket[lexer], but for each @racket[_action-result] produced by +an @racket[action-expr], returns @racket[(make-srcloc-token +_action-result lexeme-srcloc)] instead of simply +@racket[_action-result].} + +@deftogether[( +@defidform[start-pos] +@defidform[end-pos] +@defidform[lexeme] +@defidform[lexeme-srcloc] +@defidform[input-port] +@defidform[return-without-pos] +@defidform[return-without-srcloc] +)]{ + +Use of these names outside of a @racket[lexer] action is a syntax +error.} + +@defstruct[position ([offset exact-positive-integer?] + [line exact-positive-integer?] + [col exact-nonnegative-integer?])]{ + + Instances of @racket[position] are bound to @racket[start-pos] and + @racket[end-pos]. The @racket[offset] field contains the offset of + the character in the input. The @racket[line] field contains the + line number of the character. The @racket[col] field contains the + offset in the current line.} + +@defstruct[position-token ([token any/c] + [start-pos position?] + [end-pos position?])]{ + + Lexers created with @racket[lexer-src-pos] return instances of @racket[position-token].} + + +@defstruct[srcloc-token ([token any/c] + [srcloc srcloc?])]{ + + Lexers created with @racket[lexer-srcloc] return instances of @racket[srcloc-token].} + +@defparam[file-path source any/c]{ + + A parameter that the lexer uses as the source location if it + raises a @racket[exn:fail:read] error. Setting this parameter allows + DrRacket, for example, to open the file containing the error.} + +@defparam[lexer-file-path source any/c]{ + +Alias for @racket[file-path].} + + +@; ---------------------------------------- + +@subsection{Lexer Abbreviations and Macros} + +@defform[(char-set string)]{ + +A @tech{lexer macro} that matches any character in @racket[string].} + +@defidform[any-char]{A @tech{lexer abbreviation} that matches any character.} + +@defidform[any-string]{A @tech{lexer abbreviation} that matches any string.} + +@defidform[nothing]{A @tech{lexer abbreviation} that matches no string.} + +@deftogether[( +@defidform[alphabetic] +@defidform[lower-case] +@defidform[upper-case] +@defidform[title-case] +@defidform[numeric] +@defidform[symbolic] +@defidform[punctuation] +@defidform[graphic] +@defidform[whitespace] +@defidform[blank] +@defidform[iso-control] +)]{ + +@tech{Lexer abbreviations} that match @racket[char-alphabetic?] +characters, @racket[char-lower-case?] characters, etc.} + +@defform[(define-lex-abbrev id re)]{ + + Defines a @tech{lexer abbreviation} by associating a regular + expression to be used in place of the @racket[id] in other + regular expression. The definition of name has the same scoping + properties as a other syntactic binding (e.g., it can be exported + from a module).} + +@defform[(define-lex-abbrevs (id re) ...)]{ + + Like @racket[define-lex-abbrev], but defines several @tech{lexer + abbreviations}.} + + +@defform[(define-lex-trans id trans-expr)]{ + + Defines a @tech{lexer macro}, where @racket[trans-expr] produces a + transformer procedure that takes one argument. When @racket[(id + _datum ...)] appears as a regular expression, it is replaced with + the result of applying the transformer to the expression.} + + +@; ---------------------------------------- + +@subsection{Lexer SRE Operators} + +@defmodule[br-parser-tools/lex-sre] + +@; Put the docs in a macro, so that we can bound the scope of +@; the import of `*', etc.: +@(define-syntax-rule (lex-sre-doc) + (... + (begin + (require (for-label br-parser-tools/lex-sre)) + +@defform[(* re ...)]{ + +Repetition of @racket[re] sequence 0 or more times.} + +@defform[(+ re ...)]{ + +Repetition of @racket[re] sequence 1 or more times.} + +@defform[(? re ...)]{ + +Zero or one occurrence of @racket[re] sequence.} + +@defform[(= n re ...)]{ + +Exactly @racket[n] occurrences of @racket[re] sequence, where +@racket[n] must be a literal exact, non-negative number.} + +@defform[(>= n re ...)]{ + +At least @racket[n] occurrences of @racket[re] sequence, where +@racket[n] must be a literal exact, non-negative number.} + +@defform[(** n m re ...)]{ + +Between @racket[n] and @racket[m] (inclusive) occurrences of +@racket[re] sequence, where @racket[n] must be a literal exact, +non-negative number, and @racket[m] must be literally either +@racket[#f], @racket[+inf.0], or an exact, non-negative number; a +@racket[#f] value for @racket[m] is the same as @racket[+inf.0].} + +@defform[(or re ...)]{ + +Same as @racket[(union re ...)].} + +@deftogether[( +@defform[(: re ...)] +@defform[(seq re ...)] +)]{ + +Both forms concatenate the @racket[re]s.} + +@defform[(& re ...)]{ + +Intersects the @racket[re]s.} + +@defform[(- re ...)]{ + +The set difference of the @racket[re]s.} + +@defform[(~ re ...)]{ + +Character-set complement, which each @racket[re] must match exactly +one character.} + +@defform[(/ char-or-string ...)]{ + +Character ranges, matching characters between successive pairs of +characters.} + +))) + +@(lex-sre-doc) + +@; ---------------------------------------- + +@subsection{Lexer Legacy Operators} + +@defmodule[br-parser-tools/lex-plt-v200] + +@(define-syntax-rule (lex-v200-doc) + (... + (begin + (require (for-label br-parser-tools/lex-plt-v200)) + +@t{The @racketmodname[br-parser-tools/lex-plt-v200] module re-exports + @racket[*], @racket[+], @racket[?], and @racket[&] from + @racketmodname[br-parser-tools/lex-sre]. It also re-exports + @racket[:or] as @racket[:], @racket[::] as @racket[|@|], @racket[:~] + as @racket[^], and @racket[:/] as @racket[-].} + +@defform[(epsilon)]{ + +A @tech{lexer macro} that matches an empty sequence.} + +@defform[(~ re ...)]{ + +The same as @racket[(complement re ...)].}))) + +@(lex-v200-doc) + +@; ---------------------------------------- + +@subsection{Tokens} + +Each @racket[_action-expr] in a @racket[lexer] form can produce any +kind of value, but for many purposes, producing a @deftech{token} +value is useful. Tokens are usually necessary for inter-operating with +a parser generated by @racket[br-parser-tools/parser], but tokens may not +be the right choice when using @racket[lexer] in other situations. + +@defform[(define-tokens group-id (token-id ...))]{ + + Binds @racket[group-id] to the group of tokens being defined. For + each @racket[token-id], a function + @racketidfont{token-}@racket[token-id] is created that takes any + value and puts it in a token record specific to @racket[token-id]. + The token value is inspected using @racket[token-id] and + @racket[token-value]. + + A token cannot be named @racketidfont{error}, since + @racketidfont{error} it has special use in the parser.} + +@defform[(define-empty-tokens group-id (token-id ...) )]{ + + + Like @racket[define-tokens], except a each token constructor + @racketidfont{token-}@racket[token-id] takes no arguments and returns + @racket[(@#,racket[quote] token-id)].} + + +@defproc[(token-name [t (or/c token? symbol?)]) symbol?]{ + + Returns the name of a token that is represented either by a symbol + or a token structure.} + + +@defproc[(token-value [t (or/c token? symbol?)]) any/c]{ + + Returns the value of a token that is represented either by a symbol + or a token structure, returning @racket[#f] for a symbol token.} + + +@defproc[(token? [v any/c]) boolean?]{ + + Returns @racket[#t] if @racket[val] is a + token structure, @racket[#f] otherwise.} + +@; ---------------------------------------------------------------------- + +@section{LALR(1) Parsers} + +@section-index["yacc"] + +@defmodule[br-parser-tools/yacc] + +@defform/subs[#:literals (grammar tokens start end precs src-pos + suppress debug yacc-output prec) + (parser clause ...) + ([clause (grammar (non-terminal-id + ((grammar-id ...) maybe-prec expr) + ...) + ...) + (tokens group-id ...) + (start non-terminal-id ...) + (end token-id ...) + (@#,racketidfont{error} expr) + (precs (assoc token-id ...) ...) + (src-pos) + (suppress) + (debug filename) + (yacc-output filename)] + [maybe-prec code:blank + (prec token-id)] + [assoc left right nonassoc])]{ + + Creates a parser. The clauses may be in any order, as long as there + are no duplicates and all non-@italic{OPTIONAL} declarations are + present: + + @itemize[ + + @item{@racketblock0[(grammar (non-terminal-id + ((grammar-id ...) maybe-prec expr) + ...) + ...)] + + Declares the grammar to be parsed. Each @racket[grammar-id] can + be a @racket[token-id] from a @racket[group-id] named in a + @racket[tokens] declaration, or it can be a + @racket[non-terminal-id] declared in the @racket[grammar] + declaration. The optional @racket[prec] declaration works with + the @racket[precs] declaration. The @racket[expr] is a + ``semantic action,'' which is evaluated when the input is found + to match its corresponding production. + + Each action is Racket code that has the same scope as its + parser's definition, except that the variables @racket[$1], ..., + @racketidfont{$}@math{i} are bound, where @math{i} is the number + of @racket[grammar-id]s in the corresponding production. Each + @racketidfont{$}@math{k} is bound to the result of the action + for the @math{k}@superscript{th} grammar symbol on the right of + the production, if that grammar symbol is a non-terminal, or the + value stored in the token if the grammar symbol is a terminal. + If the @racket[src-pos] option is present in the parser, then + variables @racket[$1-start-pos], ..., + @racketidfont{$}@math{i}@racketidfont{-start-pos} and + @racket[$1-end-pos], ..., + @racketidfont{$}@math{i}@racketidfont{-end-pos} and are also + available, and they refer to the position structures + corresponding to the start and end of the corresponding + @racket[grammar-symbol]. Grammar symbols defined as empty-tokens + have no @racketidfont{$}@math{k} associated, but do have + @racketidfont{$}@math{k}@racketidfont{-start-pos} and + @racketidfont{$}@math{k}@racketidfont{-end-pos}. + Also @racketidfont{$n-start-pos} and @racketidfont{$n-end-pos} + are bound to the largest start and end positions, (i.e., + @racketidfont{$}@math{i}@racketidfont{-start-pos} and + @racketidfont{$}@math{i}@racketidfont{-end-pos}). + + An @deftech{error production} can be defined by providing + a production of the form @racket[(error α)], where α is a + string of grammar symbols, possibly empty. + + All of the productions for a given non-terminal must be grouped + with it. That is, no @racket[non-terminal-id] may appear twice + on the left hand side in a parser.} + + + @item{@racket[(tokens group-id ...)] + + Declares that all of the tokens defined in each + @racket[group-id]---as bound by @racket[define-tokens] or + @racket[define-empty-tokens]---can be used by the parser in the + @racket[grammar] declaration.} + + + @item{@racket[(start non-terminal-id ...)] + + Declares a list of starting non-terminals for the grammar.} + + + @item{@racket[(end token-id ...)] + + Specifies a set of tokens from which some member must follow any + valid parse. For example, an EOF token would be specified for a + parser that parses entire files and a newline token for a parser + that parses entire lines individually.} + + + @item{@racket[(@#,racketidfont{error} expr)] + + The @racket[expr] should evaluate to a function which will be + executed for its side-effect whenever the parser encounters an + error. + + If the @racket[src-pos] declaration is present, the function + should accept 5 arguments,: + + @racketblock[(lambda (tok-ok? tok-name tok-value _start-pos _end-pos) + ....)] + + Otherwise it should accept 3: + + @racketblock[(lambda (tok-ok? tok-name tok-value) + ....)] + + The first argument will be @racket[#f] if and only if the error + is that an invalid token was received. The second and third + arguments will be the name and the value of the token at which + the error was detected. The fourth and fifth arguments, if + present, provide the source positions of that token.} + + + @item{@racket[(precs (assoc token-id ...) ...)] + @italic{OPTIONAL} + + Precedence declarations to resolve shift/reduce and + reduce/reduce conflicts as in @exec{yacc}/@exec{bison}. An + @racket[assoc] must be one of @racket[left], @racket[right] or + @racket[nonassoc]. States with multiple shift/reduce or + reduce/reduce conflicts (or some combination thereof) are not + resolved with precedence.} + + @item{@racket[(src-pos)] @italic{OPTIONAL} + + Causes the generated parser to expect input in the form + @racket[(make-position-token _token _start-pos _end-pos)] instead + of simply @racket[_token]. Include this option when using the + parser with a lexer generated with @racket[lexer-src-pos].} + + + @item{@racket[(debug filename)] @italic{OPTIONAL} + + Causes the parser generator to write the LALR table to the file + named @racket[filename] (unless the file exists), where + @racket[filename] is a literal string. Additionally, if a debug + file is specified, when a running generated parser encounters a + parse error on some input file, after the user specified error + expression returns, the complete parse stack is printed to + assist in debugging the grammar of that particular parser. The + numbers in the stack printout correspond to the state numbers in + the LALR table file.} + + + @item{@racket[(yacc-output filename)] @italic{OPTIONAL} + + Causes the parser generator to write a grammar file in + approximately the syntax of @exec{yacc}/@exec{bison}. The file + might not be a valid @exec{yacc} file, because the Racket + grammar can use symbols that are invalid in C.} + + + @item{@racket[(suppress)] @italic{OPTIONAL} + + Causes the parser generator not to report shift/reduce or + reduce/reduce conflicts.} + + ] + + The result of a @racket[parser] expression with one @racket[start] + non-terminal is a function, @racket[_parse], that takes one + argument. This argument must be a zero argument function, + @racket[_gen], that produces successive tokens of the input each + time it is called. If desired, the @racket[_gen] may return + symbols instead of tokens, and the parser will treat symbols as + tokens of the corresponding name (with @racket[#f] as a value, so + it is usual to return symbols only in the case of empty tokens). + The @racket[_parse] function returns the value associated with the + parse tree by the semantic actions. If the parser encounters an + error, after invoking the supplied error function, it will try to + use @tech{error production}s to continue parsing. If it cannot, it + raises @racket[exn:fail:read]. + + If multiple non-terminals are provided in @racket[start], the + @racket[parser] expression produces a list of parsing functions, + one for each non-terminal in the same order. Each parsing function + is like the result of a parser expression with only one + @racket[start] non-terminal, + + Each time the Racket code for a @racket[parser] is compiled + (e.g. when a @filepath{.rkt} file containing a @racket[parser] form + is loaded), the parser generator is run. To avoid this overhead + place the parser into a module and compile the module to a + @filepath{.zo} bytecode file.} + + + + +@section{Context-Free Parsers} + +@section-index["cfg-parser"] + +@defmodule[br-parser-tools/cfg-parser]{The @racketmodname[br-parser-tools/cfg-parser] +library provides a parser generator that is an alternative to that of +@racketmodname[br-parser-tools/yacc].} + +@defform/subs[#:literals (grammar tokens start end precs src-pos + suppress debug yacc-output prec) + (cfg-parser clause ...) + ([clause (grammar (non-terminal-id + ((grammar-id ...) maybe-prec expr) + ...) + ...) + (tokens group-id ...) + (start non-terminal-id ...) + (end token-id ...) + (@#,racketidfont{error} expr) + (src-pos)])]{ + + Creates a parser similar to that of @racket[parser]. Unlike @racket[parser], + @racket[cfg-parser], can consume arbitrary and potentially ambiguous context-free + grammars. Its interface is a subset of @racketmodname[br-parser-tools/yacc], with + the following differences: + + @itemize[ + + @item{@racket[(start non-terminal-id)] + + Unlike @racket[parser], @racket[cfg-parser] only allows for + a single non-terminal-id.} + + @item{The @racket[cfg-parser] form does not support the @racket[precs], + @racket[suppress], @racket[debug], or @racket[yacc-output] + options of @racket[parser].} + ] +} + +@; ---------------------------------------------------------------------- + +@section{Converting @exec{yacc} or @exec{bison} Grammars} + +@defmodule[br-parser-tools/yacc-to-scheme] + +@defproc[(trans [file path-string?]) any/c]{ + +Reads a C @exec{yacc}/@exec{bison} grammar from @racket[file] and +produces an s-expression that represents a Racket parser for use with +@racket[parser]. + +This function is intended to assist in the manual conversion of +grammars for use with @racket[parser], and not as a fully automatic +conversion tool. It is not entirely robust. For example, if the C +actions in the original grammar have nested blocks, the tool will fail. + +Annotated examples are in the @filepath{examples} subdirectory of the +@filepath{br-parser-tools} collection.} + +@; ---------------------------------------------------------------------- + +@index-section[] diff --git a/br-parser-tools/br-parser-tools-doc/br-parser-tools/compiled/br-parser-tools_scrbl.dep b/br-parser-tools/br-parser-tools-doc/br-parser-tools/compiled/br-parser-tools_scrbl.dep new file mode 100644 index 0000000..9a39731 --- /dev/null +++ b/br-parser-tools/br-parser-tools-doc/br-parser-tools/compiled/br-parser-tools_scrbl.dep @@ -0,0 +1 @@ +("6.8.0.2" ("e40ef6f4ad8e94b16dd696e0e56aff8797e08366" . "20628650cd070c4f9b3a47399bfc46ffabd56006") (collects #"br-parser-tools" #"cfg-parser.rkt") (collects #"br-parser-tools" #"lex-plt-v200.rkt") (collects #"br-parser-tools" #"lex-sre.rkt") (collects #"br-parser-tools" #"lex.rkt") (collects #"br-parser-tools" #"yacc.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"scheme" #"base.rkt") (collects #"scheme" #"contract.rkt") (collects #"scribble" #"bnf.rkt") (collects #"scribble" #"doc" #"lang" #"reader.rkt") (collects #"scribble" #"doclang.rkt") (collects #"scribble" #"manual.rkt") (collects #"scribble" #"struct.rkt") (collects #"scribble" #"xref.rkt")) diff --git a/br-parser-tools/br-parser-tools-doc/br-parser-tools/compiled/br-parser-tools_scrbl.zo b/br-parser-tools/br-parser-tools-doc/br-parser-tools/compiled/br-parser-tools_scrbl.zo new file mode 100644 index 0000000000000000000000000000000000000000..9dbe4a4cea25b4d8c8d9dc3db3f87f564dd8294d GIT binary patch literal 92384 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 := +;; then it means that there's no successful parse, so everything +;; that's blocked fails. + +;; A cache holds the series of results for a particular non-terminal +;; at a particular starting location. (A series is used, instead of a +;; sinlge result, for backtracking.) Otherwise, the parser uses +;; backtracking search. Backtracking is implemented through explicit +;; success and failure continuations. Multiple results for a +;; particular nonterminal and location are kept only when they have +;; different lengths. (Otherwise, in the spirit of finding one +;; successful parse, only the first result is kept.) + +;; The br-parser-tools's `parse' is used to transform tokens in the +;; grammar to tokens specific to this parser. In other words, this +;; parser uses `parser' so that it doesn't have to know anything about +;; tokens. +;; + + + +(require br-parser-tools/yacc + br-parser-tools/lex) + +(require (for-syntax racket/base + syntax/boundmap + br-parser-tools/private-lex/token-syntax)) + +(provide cfg-parser) + +;; A raw token, wrapped so that we can recognize it: +(define-struct tok (name orig-name val start end)) + +;; Represents the thread scheduler: +(define-struct tasks (active active-back waits multi-waits cache progress?)) + +(define-for-syntax make-token-identifier-mapping make-hasheq) +(define-for-syntax token-identifier-mapping-get + (case-lambda + [(t tok) + (hash-ref t (syntax-e tok))] + [(t tok fail) + (hash-ref t (syntax-e tok) fail)])) +(define-for-syntax token-identifier-mapping-put! + (lambda (t tok v) + (hash-set! t (syntax-e tok) v))) +(define-for-syntax token-identifier-mapping-map + (lambda (t f) + (hash-map t f))) + +;; Used to calculate information on the grammar, such as whether +;; a particular non-terminal is "simple" instead of recursively defined. +(define-for-syntax (nt-fixpoint nts proc nt-ids patss) + (define (ormap-all val f as bs) + (cond + [(null? as) val] + [else (ormap-all (or (f (car as) (car bs)) val) + f + (cdr as) (cdr bs))])) + (let loop () + (when (ormap-all #f + (lambda (nt pats) + (let ([old (bound-identifier-mapping-get nts nt)]) + (let ([new (proc nt pats old)]) + (if (equal? old new) + #f + (begin + (bound-identifier-mapping-put! nts nt new) + #t))))) + nt-ids patss) + (loop)))) + +;; Tries parse-a followed by parse-b. If parse-a is not simple, +;; then after parse-a succeeds once, we parallelize parse-b +;; and trying a second result for parse-a. +(define (parse-and simple-a? parse-a parse-b + stream last-consumed-token depth end success-k fail-k + max-depth tasks) + (letrec ([mk-got-k + (lambda (success-k fail-k) + (lambda (val stream last-consumed-token depth max-depth tasks next1-k) + (if simple-a? + (parse-b val stream last-consumed-token depth end + (mk-got2-k success-k fail-k next1-k) + (mk-fail2-k success-k fail-k next1-k) + max-depth tasks) + (parallel-or + (lambda (success-k fail-k max-depth tasks) + (parse-b val stream last-consumed-token depth end + success-k fail-k + max-depth tasks)) + (lambda (success-k fail-k max-depth tasks) + (next1-k (mk-got-k success-k fail-k) + fail-k max-depth tasks)) + success-k fail-k max-depth tasks))))] + [mk-got2-k + (lambda (success-k fail-k next1-k) + (lambda (val stream last-consumed-token depth max-depth tasks next-k) + (success-k val stream last-consumed-token depth max-depth tasks + (lambda (success-k fail-k max-depth tasks) + (next-k (mk-got2-k success-k fail-k next1-k) + (mk-fail2-k success-k fail-k next1-k) + max-depth tasks)))))] + [mk-fail2-k + (lambda (success-k fail-k next1-k) + (lambda (max-depth tasks) + (next1-k (mk-got-k success-k fail-k) + fail-k + max-depth + tasks)))]) + (parse-a stream last-consumed-token depth end + (mk-got-k success-k fail-k) + fail-k + max-depth tasks))) + +;; Parallel or for non-terminal alternatives +(define (parse-parallel-or parse-a parse-b stream last-consumed-token depth end success-k fail-k max-depth tasks) + (parallel-or (lambda (success-k fail-k max-depth tasks) + (parse-a stream last-consumed-token depth end success-k fail-k max-depth tasks)) + (lambda (success-k fail-k max-depth tasks) + (parse-b stream last-consumed-token depth end success-k fail-k max-depth tasks)) + success-k fail-k max-depth tasks)) + +;; Generic parallel-or +(define (parallel-or parse-a parse-b success-k fail-k max-depth tasks) + (define answer-key (gensym)) + (letrec ([gota-k + (lambda (val stream last-consumed-token depth max-depth tasks next-k) + (report-answer answer-key + max-depth + tasks + (list val stream last-consumed-token depth next-k)))] + [faila-k + (lambda (max-depth tasks) + (report-answer answer-key + max-depth + tasks + null))]) + (let* ([tasks (queue-task + tasks + (lambda (max-depth tasks) + (parse-a gota-k + faila-k + max-depth tasks)))] + [tasks (queue-task + tasks + (lambda (max-depth tasks) + (parse-b gota-k + faila-k + max-depth tasks)))] + [queue-next (lambda (next-k tasks) + (queue-task tasks + (lambda (max-depth tasks) + (next-k gota-k + faila-k + max-depth tasks))))]) + (letrec ([mk-got-one + (lambda (immediate-next? get-nth success-k) + (lambda (val stream last-consumed-token depth max-depth tasks next-k) + (let ([tasks (if immediate-next? + (queue-next next-k tasks) + tasks)]) + (success-k val stream last-consumed-token depth max-depth + tasks + (lambda (success-k fail-k max-depth tasks) + (let ([tasks (if immediate-next? + tasks + (queue-next next-k tasks))]) + (get-nth max-depth tasks success-k fail-k)))))))] + [get-first + (lambda (max-depth tasks success-k fail-k) + (wait-for-answer #f max-depth tasks answer-key + (mk-got-one #t get-first success-k) + (lambda (max-depth tasks) + (get-second max-depth tasks success-k fail-k)) + #f))] + [get-second + (lambda (max-depth tasks success-k fail-k) + (wait-for-answer #f max-depth tasks answer-key + (mk-got-one #f get-second success-k) + fail-k #f))]) + (get-first max-depth tasks success-k fail-k))))) + +;; Non-terminal alternatives where the first is "simple" can be done +;; sequentially, which is simpler +(define (parse-or parse-a parse-b + stream last-consumed-token depth end success-k fail-k max-depth tasks) + (letrec ([mk-got-k + (lambda (success-k fail-k) + (lambda (val stream last-consumed-token depth max-depth tasks next-k) + (success-k val stream last-consumed-token depth + max-depth tasks + (lambda (success-k fail-k max-depth tasks) + (next-k (mk-got-k success-k fail-k) + (mk-fail-k success-k fail-k) + max-depth tasks)))))] + [mk-fail-k + (lambda (success-k fail-k) + (lambda (max-depth tasks) + (parse-b stream last-consumed-token depth end success-k fail-k max-depth tasks)))]) + (parse-a stream last-consumed-token depth end + (mk-got-k success-k fail-k) + (mk-fail-k success-k fail-k) + max-depth tasks))) + +;; Starts a thread +(define queue-task + (lambda (tasks t [progress? #t]) + (make-tasks (tasks-active tasks) + (cons t (tasks-active-back tasks)) + (tasks-waits tasks) + (tasks-multi-waits tasks) + (tasks-cache tasks) + (or progress? (tasks-progress? tasks))))) + +;; Reports an answer to a waiting thread: +(define (report-answer answer-key max-depth tasks val) + (let ([v (hash-ref (tasks-waits tasks) answer-key (lambda () #f))]) + (if v + (let ([tasks (make-tasks (cons (v val) + (tasks-active tasks)) + (tasks-active-back tasks) + (tasks-waits tasks) + (tasks-multi-waits tasks) + (tasks-cache tasks) + #t)]) + (hash-remove! (tasks-waits tasks) answer-key) + (swap-task max-depth tasks)) + ;; We have an answer ready too fast; wait + (swap-task max-depth + (queue-task tasks + (lambda (max-depth tasks) + (report-answer answer-key max-depth tasks val)) + #f))))) + +;; Reports an answer to multiple waiting threads: +(define (report-answer-all answer-key max-depth tasks val k) + (let ([v (hash-ref (tasks-multi-waits tasks) answer-key (lambda () null))]) + (hash-remove! (tasks-multi-waits tasks) answer-key) + (let ([tasks (make-tasks (append (map (lambda (a) (a val)) v) + (tasks-active tasks)) + (tasks-active-back tasks) + (tasks-waits tasks) + (tasks-multi-waits tasks) + (tasks-cache tasks) + #t)]) + (k max-depth tasks)))) + +;; Waits for an answer; if `multi?' is #f, this is sole waiter, otherwise +;; there might be many. Use wither #t or #f (and `report-answer' or +;; `report-answer-all', resptively) consistently for a particular answer key. +(define (wait-for-answer multi? max-depth tasks answer-key success-k fail-k deadlock-k) + (let ([wait (lambda (val) + (lambda (max-depth tasks) + (if val + (if (null? val) + (fail-k max-depth tasks) + (let-values ([(val stream last-consumed-token depth next-k) (apply values val)]) + (success-k val stream last-consumed-token depth max-depth tasks next-k))) + (deadlock-k max-depth tasks))))]) + (if multi? + (hash-set! (tasks-multi-waits tasks) answer-key + (cons wait (hash-ref (tasks-multi-waits tasks) answer-key + (lambda () null)))) + (hash-set! (tasks-waits tasks) answer-key wait)) + (let ([tasks (make-tasks (tasks-active tasks) + (tasks-active-back tasks) + (tasks-waits tasks) + (tasks-multi-waits tasks) + (tasks-cache tasks) + #t)]) + (swap-task max-depth tasks)))) + +;; Swap thread +(define (swap-task max-depth tasks) + ;; Swap in first active: + (if (null? (tasks-active tasks)) + (if (tasks-progress? tasks) + (swap-task max-depth + (make-tasks (reverse (tasks-active-back tasks)) + null + (tasks-waits tasks) + (tasks-multi-waits tasks) + (tasks-cache tasks) + #f)) + ;; No progress, so issue failure for all multi-waits + (if (zero? (hash-count (tasks-multi-waits tasks))) + (error 'swap-task "Deadlock") + (swap-task max-depth + (make-tasks (apply + append + (hash-map (tasks-multi-waits tasks) + (lambda (k l) + (map (lambda (v) (v #f)) l)))) + (tasks-active-back tasks) + (tasks-waits tasks) + (make-hasheq) + (tasks-cache tasks) + #t)))) + (let ([t (car (tasks-active tasks))] + [tasks (make-tasks (cdr (tasks-active tasks)) + (tasks-active-back tasks) + (tasks-waits tasks) + (tasks-multi-waits tasks) + (tasks-cache tasks) + (tasks-progress? tasks))]) + (t max-depth tasks)))) + +;; Finds the symbolic representative of a token class +(define-for-syntax (map-token toks tok) + (car (token-identifier-mapping-get toks tok))) + +(define no-pos-val (make-position #f #f #f)) +(define-for-syntax no-pos + (let ([npv ((syntax-local-certifier) #'no-pos-val)]) + (lambda (stx) npv))) +(define-for-syntax at-tok-pos + (lambda (sel expr) + (lambda (stx) + #`(let ([v #,expr]) (if v (#,sel v) no-pos-val))))) + +;; Builds a matcher for a particular alternative +(define-for-syntax (build-match nts toks pat handle $ctx) + (let loop ([pat pat] + [pos 1]) + (if (null? pat) + #`(success-k #,handle stream last-consumed-token depth max-depth tasks + (lambda (success-k fail-k max-depth tasks) + (fail-k max-depth tasks))) + (let ([id (datum->syntax (car pat) + (string->symbol (format "$~a" pos)))] + [id-start-pos (datum->syntax (car pat) + (string->symbol (format "$~a-start-pos" pos)))] + [id-end-pos (datum->syntax (car pat) + (string->symbol (format "$~a-end-pos" pos)))] + [n-end-pos (and (null? (cdr pat)) + (datum->syntax (car pat) '$n-end-pos))]) + (cond + [(bound-identifier-mapping-get nts (car pat) (lambda () #f)) + ;; Match non-termimal + #`(parse-and + ;; First part is simple? (If so, we don't have to parallelize the `and'.) + #,(let ([l (bound-identifier-mapping-get nts (car pat) (lambda () #f))]) + (or (not l) + (andmap values (caddr l)))) + #,(car pat) + (let ([original-stream stream]) + (lambda (#,id stream last-consumed-token depth end success-k fail-k max-depth tasks) + (let-syntax ([#,id-start-pos (at-tok-pos #'(if (eq? original-stream stream) + tok-end + tok-start) + #'(if (eq? original-stream stream) + last-consumed-token + (and (pair? original-stream) + (car original-stream))))] + [#,id-end-pos (at-tok-pos #'tok-end #'last-consumed-token)] + #,@(if n-end-pos + #`([#,n-end-pos (at-tok-pos #'tok-end #'last-consumed-token)]) + null)) + #,(loop (cdr pat) (add1 pos))))) + stream last-consumed-token depth + #,(let ([cnt (apply + + (map (lambda (item) + (cond + [(bound-identifier-mapping-get nts item (lambda () #f)) + => (lambda (l) (car l))] + [else 1])) + (cdr pat)))]) + #`(- end #,cnt)) + success-k fail-k max-depth tasks)] + [else + ;; Match token + (let ([tok-id (map-token toks (car pat))]) + #`(if (and (pair? stream) + (eq? '#,tok-id (tok-name (car stream)))) + (let* ([stream-a (car stream)] + [#,id (tok-val stream-a)] + [last-consumed-token (car stream)] + [stream (cdr stream)] + [depth (add1 depth)]) + (let ([max-depth (max max-depth depth)]) + (let-syntax ([#,id-start-pos (at-tok-pos #'tok-start #'stream-a)] + [#,id-end-pos (at-tok-pos #'tok-end #'stream-a)] + #,@(if n-end-pos + #`([#,n-end-pos (at-tok-pos #'tok-end #'stream-a)]) + null)) + #,(loop (cdr pat) (add1 pos))))) + (fail-k max-depth tasks)))]))))) + +;; Starts parsing to match a non-terminal. There's a minor +;; optimization that checks for known starting tokens. Otherwise, +;; use the cache, block if someone else is already trying the match, +;; and cache the result if it's computed. +;; The cache maps nontermial+startingpos+iteration to a result, where +;; the iteration is 0 for the first match attempt, 1 for the second, +;; etc. +(define (parse-nt/share key min-cnt init-tokens stream last-consumed-token depth end max-depth tasks success-k fail-k k) + (if (and (positive? min-cnt) + (pair? stream) + (not (memq (tok-name (car stream)) init-tokens))) + ;; No such leading token; give up + (fail-k max-depth tasks) + ;; Run pattern + (let loop ([n 0] + [success-k success-k] + [fail-k fail-k] + [max-depth max-depth] + [tasks tasks] + [k k]) + (let ([answer-key (gensym)] + [table-key (vector key depth n)] + [old-depth depth] + [old-stream stream]) + #;(printf "Loop ~a\n" table-key) + (cond + [(hash-ref (tasks-cache tasks) table-key (lambda () #f)) + => (lambda (result) + #;(printf "Reuse ~a\n" table-key) + (result success-k fail-k max-depth tasks))] + [else + #;(printf "Try ~a ~a\n" table-key (map tok-name stream)) + (hash-set! (tasks-cache tasks) table-key + (lambda (success-k fail-k max-depth tasks) + #;(printf "Wait ~a ~a\n" table-key answer-key) + (wait-for-answer #t max-depth tasks answer-key success-k fail-k + (lambda (max-depth tasks) + #;(printf "Deadlock ~a ~a\n" table-key answer-key) + (fail-k max-depth tasks))))) + (let result-loop ([max-depth max-depth][tasks tasks][k k]) + (letrec ([orig-stream stream] + [new-got-k + (lambda (val stream last-consumed-token depth max-depth tasks next-k) + ;; Check whether we already have a result that consumed the same amount: + (let ([result-key (vector #f key old-depth depth)]) + (cond + [(hash-ref (tasks-cache tasks) result-key (lambda () #f)) + ;; Go for the next-result + (result-loop max-depth + tasks + (lambda (end max-depth tasks success-k fail-k) + (next-k success-k fail-k max-depth tasks)))] + [else + #;(printf "Success ~a ~a\n" table-key + (map tok-name (let loop ([d old-depth][s old-stream]) + (if (= d depth) + null + (cons (car s) (loop (add1 d) (cdr s))))))) + (let ([next-k (lambda (success-k fail-k max-depth tasks) + (loop (add1 n) + success-k + fail-k + max-depth + tasks + (lambda (end max-depth tasks success-k fail-k) + (next-k success-k fail-k max-depth tasks))))]) + (hash-set! (tasks-cache tasks) result-key #t) + (hash-set! (tasks-cache tasks) table-key + (lambda (success-k fail-k max-depth tasks) + (success-k val stream last-consumed-token depth max-depth tasks next-k))) + (report-answer-all answer-key + max-depth + tasks + (list val stream last-consumed-token depth next-k) + (lambda (max-depth tasks) + (success-k val stream last-consumed-token depth max-depth tasks next-k))))])))] + [new-fail-k + (lambda (max-depth tasks) + #;(printf "Failure ~a\n" table-key) + (hash-set! (tasks-cache tasks) table-key + (lambda (success-k fail-k max-depth tasks) + (fail-k max-depth tasks))) + (report-answer-all answer-key + max-depth + tasks + null + (lambda (max-depth tasks) + (fail-k max-depth tasks))))]) + (k end max-depth tasks new-got-k new-fail-k)))]))))) + +(define-syntax (cfg-parser stx) + (syntax-case stx () + [(_ clause ...) + (let ([clauses (syntax->list #'(clause ...))]) + (let-values ([(start grammar cfg-error parser-clauses src-pos?) + (let ([all-toks (apply + append + (map (lambda (clause) + (syntax-case clause (tokens) + [(tokens t ...) + (apply + append + (map (lambda (t) + (let ([v (syntax-local-value t (lambda () #f))]) + (cond + [(terminals-def? v) + (map (lambda (v) + (cons v #f)) + (syntax->list (terminals-def-t v)))] + [(e-terminals-def? v) + (map (lambda (v) + (cons v #t)) + (syntax->list (e-terminals-def-t v)))] + [else null]))) + (syntax->list #'(t ...))))] + [_else null])) + clauses))] + [all-end-toks (apply + append + (map (lambda (clause) + (syntax-case clause (end) + [(end t ...) + (syntax->list #'(t ...))] + [_else null])) + clauses))]) + (let loop ([clauses clauses] + [cfg-start #f] + [cfg-grammar #f] + [cfg-error #f] + [src-pos? #f] + [parser-clauses null]) + (if (null? clauses) + (values cfg-start + cfg-grammar + cfg-error + (reverse parser-clauses) + src-pos?) + (syntax-case (car clauses) (start error grammar src-pos) + [(start tok) + (loop (cdr clauses) #'tok cfg-grammar cfg-error src-pos? parser-clauses)] + [(error expr) + (loop (cdr clauses) cfg-start cfg-grammar #'expr src-pos? parser-clauses)] + [(grammar [nt [pat handle0 handle ...] ...] ...) + (let ([nts (make-bound-identifier-mapping)] + [toks (make-token-identifier-mapping)] + [end-toks (make-token-identifier-mapping)] + [nt-ids (syntax->list #'(nt ...))] + [patss (map (lambda (stx) + (map syntax->list (syntax->list stx))) + (syntax->list #'((pat ...) ...)))]) + (for-each (lambda (nt) + (bound-identifier-mapping-put! nts nt (list 0))) + nt-ids) + (for-each (lambda (t) + (token-identifier-mapping-put! end-toks t #t)) + all-end-toks) + (for-each (lambda (t) + (unless (token-identifier-mapping-get end-toks (car t) (lambda () #f)) + (let ([id (gensym (syntax-e (car t)))]) + (token-identifier-mapping-put! toks (car t) + (cons id (cdr t)))))) + all-toks) + ;; Compute min max size for each non-term: + (nt-fixpoint + nts + (lambda (nt pats old-list) + (let ([new-cnt + (apply + min + (map (lambda (pat) + (apply + + + (map (lambda (elem) + (car + (bound-identifier-mapping-get nts + elem + (lambda () (list 1))))) + pat))) + pats))]) + (if (new-cnt . > . (car old-list)) + (cons new-cnt (cdr old-list)) + old-list))) + nt-ids patss) + ;; Compute set of toks that must appear at the beginning + ;; for a non-terminal + (nt-fixpoint + nts + (lambda (nt pats old-list) + (let ([new-list + (apply + append + (map (lambda (pat) + (let loop ([pat pat]) + (if (pair? pat) + (let ([l (bound-identifier-mapping-get + nts + (car pat) + (lambda () + (list 1 (map-token toks (car pat)))))]) + ;; If the non-terminal can match 0 things, + ;; then it might match something from the + ;; next pattern element. Otherwise, it must + ;; match the first element: + (if (zero? (car l)) + (append (cdr l) (loop (cdr pat))) + (cdr l))) + null))) + pats))]) + (let ([new (filter (lambda (id) + (andmap (lambda (id2) + (not (eq? id id2))) + (cdr old-list))) + new-list)]) + (if (pair? new) + ;; Drop dups in new list: + (let ([new (let loop ([new new]) + (if (null? (cdr new)) + new + (if (ormap (lambda (id) + (eq? (car new) id)) + (cdr new)) + (loop (cdr new)) + (cons (car new) (loop (cdr new))))))]) + (cons (car old-list) (append new (cdr old-list)))) + old-list)))) + nt-ids patss) + ;; Determine left-recursive clauses: + (for-each (lambda (nt pats) + (let ([l (bound-identifier-mapping-get nts nt)]) + (bound-identifier-mapping-put! nts nt (list (car l) + (cdr l) + (map (lambda (x) #f) pats))))) + nt-ids patss) + (nt-fixpoint + nts + (lambda (nt pats old-list) + (list (car old-list) + (cadr old-list) + (map (lambda (pat simple?) + (or simple? + (let ([l (map (lambda (elem) + (bound-identifier-mapping-get + nts + elem + (lambda () #f))) + pat)]) + (andmap (lambda (i) + (or (not i) + (andmap values (caddr i)))) + l)))) + pats (caddr old-list)))) + nt-ids patss) + ;; Build a definition for each non-term: + (loop (cdr clauses) + cfg-start + (map (lambda (nt pats handles $ctxs) + (define info (bound-identifier-mapping-get nts nt)) + (list nt + #`(let ([key (gensym '#,nt)]) + (lambda (stream last-consumed-token depth end success-k fail-k max-depth tasks) + (parse-nt/share + key #,(car info) '#,(cadr info) stream last-consumed-token depth end + max-depth tasks + success-k fail-k + (lambda (end max-depth tasks success-k fail-k) + #,(let loop ([pats pats] + [handles (syntax->list handles)] + [$ctxs (syntax->list $ctxs)] + [simple?s (caddr info)]) + (if (null? pats) + #'(fail-k max-depth tasks) + #`(#,(if (or (null? (cdr pats)) + (car simple?s)) + #'parse-or + #'parse-parallel-or) + (lambda (stream last-consumed-token depth end success-k fail-k max-depth tasks) + #,(build-match nts + toks + (car pats) + (car handles) + (car $ctxs))) + (lambda (stream last-consumed-token depth end success-k fail-k max-depth tasks) + #,(loop (cdr pats) + (cdr handles) + (cdr $ctxs) + (cdr simple?s))) + stream last-consumed-token depth end success-k fail-k max-depth tasks))))))))) + nt-ids + patss + (syntax->list #'(((begin handle0 handle ...) ...) ...)) + (syntax->list #'((handle0 ...) ...))) + cfg-error + src-pos? + (list* + (with-syntax ([((tok tok-id . $e) ...) + (token-identifier-mapping-map toks + (lambda (k v) + (list* k + (car v) + (if (cdr v) + #f + '$1))))] + [(pos ...) + (if src-pos? + #'($1-start-pos $1-end-pos) + #'(#f #f))]) + #`(grammar (start [() null] + [(atok start) (cons $1 $2)]) + (atok [(tok) (make-tok 'tok-id 'tok $e pos ...)] ...))) + #`(start start) + parser-clauses)))] + [(grammar . _) + (raise-syntax-error + #f + "bad grammar clause" + stx + (car clauses))] + [(src-pos) + (loop (cdr clauses) + cfg-start + cfg-grammar + cfg-error + #t + (cons (car clauses) parser-clauses))] + [_else + (loop (cdr clauses) + cfg-start + cfg-grammar + cfg-error + src-pos? + (cons (car clauses) parser-clauses))]))))]) + #`(let ([orig-parse (parser + [error (lambda (a b c) + (error 'cfg-parser "unexpected ~a token: ~a" b c))] + . #,parser-clauses)] + [error-proc #,cfg-error]) + (letrec #,grammar + (lambda (get-tok) + (let ([tok-list (orig-parse get-tok)]) + (letrec ([success-k + (lambda (val stream last-consumed-token depth max-depth tasks next) + (if (null? stream) + val + (next success-k fail-k max-depth tasks)))] + [fail-k (lambda (max-depth tasks) + (define (call-error-proc tok-ok? tok-name tok-value start-pos end-pos) + (cond + [(procedure-arity-includes? error-proc 5) + (error-proc tok-ok? tok-name tok-value start-pos end-pos)] + [else + (error-proc tok-ok? tok-name tok-value)])) + (cond + [(null? tok-list) + (if error-proc + (call-error-proc #t + 'no-tokens + #f + (make-position #f #f #f) + (make-position #f #f #f)) + (error + 'cfg-parse + "no tokens"))] + [else + (let ([bad-tok (list-ref tok-list + (min (sub1 (length tok-list)) + max-depth))]) + (if error-proc + (call-error-proc #t + (tok-orig-name bad-tok) + (tok-val bad-tok) + (tok-start bad-tok) + (tok-end bad-tok)) + (error + 'cfg-parse + "failed at ~a" + (tok-val bad-tok))))]))]) + (#,start tok-list + ;; we simulate a token at the very beginning with zero width + ;; for use with the position-generating code (*-start-pos, *-end-pos). + (if (null? tok-list) + (tok #f #f #f + (position 1 + #,(if src-pos? #'1 #'#f) + #,(if src-pos? #'0 #'#f)) + (position 1 + #,(if src-pos? #'1 #'#f) + #,(if src-pos? #'0 #'#f))) + (tok (tok-name (car tok-list)) + (tok-orig-name (car tok-list)) + (tok-val (car tok-list)) + (tok-start (car tok-list)) + (tok-start (car tok-list)))) + 0 + (length tok-list) + success-k + fail-k + 0 + (make-tasks null null + (make-hasheq) (make-hasheq) + (make-hash) #t)))))))))])) + + +(module* test racket/base + (require (submod "..") + br-parser-tools/lex + racket/block + racket/generator + rackunit) + + ;; Test: parsing regular expressions. + ;; Here is a test case on locations: + (block + (define-tokens regexp-tokens (ANCHOR STAR OR LIT LPAREN RPAREN EOF)) + (define lex (lexer-src-pos ["|" (token-OR lexeme)] + ["^" (token-ANCHOR lexeme)] + ["*" (token-STAR lexeme)] + [(repetition 1 +inf.0 alphabetic) (token-LIT lexeme)] + ["(" (token-LPAREN lexeme)] + [")" (token-RPAREN lexeme)] + [whitespace (return-without-pos (lex input-port))] + [(eof) (token-EOF 'eof)])) + (define -parse (cfg-parser + (tokens regexp-tokens) + (start top) + (end EOF) + (src-pos) + (grammar [top [(maybe-anchor regexp) + (cond [$1 + `(anchored ,$2 ,(pos->sexp $1-start-pos) ,(pos->sexp $2-end-pos))] + [else + `(unanchored ,$2 ,(pos->sexp $1-start-pos) ,(pos->sexp $2-end-pos))])]] + [maybe-anchor [(ANCHOR) #t] + [() #f]] + [regexp [(regexp STAR) `(star ,$1 ,(pos->sexp $1-start-pos) ,(pos->sexp $2-end-pos))] + [(regexp OR regexp) `(or ,$1 ,$3 ,(pos->sexp $1-start-pos) ,(pos->sexp $3-end-pos))] + [(LPAREN regexp RPAREN) `(group ,$2 ,(pos->sexp $1-start-pos) ,(pos->sexp $3-end-pos))] + [(LIT) `(lit ,$1 ,(pos->sexp $1-start-pos) ,(pos->sexp $1-end-pos))]]))) + (define (pos->sexp pos) + (position-offset pos)) + + (define (parse s) + (define ip (open-input-string s)) + (port-count-lines! ip) + (-parse (lambda () (lex ip)))) + + (check-equal? (parse "abc") + '(unanchored (lit "abc" 1 4) 1 4)) + (check-equal? (parse "a | (b*) | c") + '(unanchored (or (or (lit "a" 1 2) + (group (star (lit "b" 6 7) 6 8) 5 9) + 1 9) + (lit "c" 12 13) + 1 13) + 1 13))) + + + ;; Check that cfg-parser can accept error functions of 3 arguments: + (block + (define-tokens non-terminals (ONE ZERO EOF)) + (define parse + (cfg-parser (tokens non-terminals) + (start ones) + (end EOF) + (error (lambda (tok-ok tok-name tok-val) + (error (format "~a ~a ~a" tok-ok tok-name tok-val)))) + (grammar [ones [() null] + [(ONE ones) (cons $1 $2)]]))) + (define (sequence->tokenizer s) + (define-values (more? next) (sequence-generate s)) + (lambda () + (cond [(more?) (next)] + [else (token-EOF 'eof)]))) + (check-exn #rx"#t ZERO zero" + (lambda () (parse (sequence->tokenizer (list (token-ZERO "zero"))))))) + + + + + ;; Check that cfg-parser can accept error functions of 5 arguments: + (block + (define-tokens non-terminals (ONE ZERO EOF)) + (define parse + (cfg-parser (tokens non-terminals) + (start ones) + (src-pos) + (end EOF) + (error (lambda (tok-ok tok-name tok-val start-pos end-pos) + (error (format "~a ~a ~a ~a ~a" + tok-ok tok-name tok-val + (position-offset start-pos) + (position-offset end-pos))))) + (grammar [ones [() null] + [(ONE ones) (cons $1 $2)]]))) + (define (sequence->tokenizer s) + (define-values (more? next) (sequence-generate s)) + (lambda () + (cond [(more?) (next)] + [else (position-token (token-EOF 'eof) + (position #f #f #f) + (position #f #f #f))]))) + (check-exn #rx"#t ZERO zero 2 3" + (lambda () + (parse + (sequence->tokenizer + (list (position-token + (token-ZERO "zero") + (position 2 2 5) + (position 3 2 6)))))))) + + + + + + ;; Tests used during development + (define-tokens non-terminals (PLUS MINUS STAR BAR COLON EOF)) + + (define lex + (lexer + ["+" (token-PLUS '+)] + ["-" (token-MINUS '-)] + ["*" (token-STAR '*)] + ["|" (token-BAR '||)] + [":" (token-COLON '|:|)] + [whitespace (lex input-port)] + [(eof) (token-EOF 'eof)])) + + (define parse + (cfg-parser + (tokens non-terminals) + (start ) + (end EOF) + (error (lambda (a b stx) + (error 'parse "failed at ~s" stx))) + (grammar [ [(PLUS) "plus"] + [( BAR ) (list $1 $2 $3)] + [( COLON) (list $1)]] + [ [(MINUS) "minus"] + [( STAR) (cons $1 $2)]] + [ [( MINUS) "yes"]] + [ [(PLUS) 'plus] + [(MINUS) 'minus]] + [ [() '0] + [( PLUS) (add1 $1)] + [( PLUS) (add1 $1)]]))) + + (let ([p (open-input-string #;"+*|-|-*|+**" #;"-|+*|+**" + #;"+*|+**|-" #;"-|-*|-|-*" + #;"-|-*|-|-**|-|-*|-|-**" + "-|-*|-|-**|-|-*|-|-***|-|-*|-|-**|-|-*|-|-****|-|-*|-|-**|-|-*|-|-*** + |-|-*|-|-**|-|-*|-|-*****|-|-*|-|-**|-|-*|-|-***|-|-*|-|-**|-|-*|-|-****| + -|-*|-|-**|-|-*|-|-***|-|-*|-|-**|-|-*|-|-*****" + ;; This one fails: + #;"+*")]) + (check-equal? (parse (lambda () (lex p))) + '((((((((((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *) || (((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *)) . *) + || + (((((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *) || (((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *)) . *)) + . + *) + || + (((((((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *) || (((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *)) . *) + || + (((((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *) || (((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *)) . *)) + . + *)) + . + *) + || + (((((((((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *) || (((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *)) . *) + || + (((((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *) || (((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *)) . *)) + . + *) + || + (((((((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *) || (((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *)) . *) + || + (((((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *) || (((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *)) . *)) + . + *)) + . + *))))) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/cfg-parser_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/cfg-parser_rkt.dep new file mode 100644 index 0000000..783942b --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/cfg-parser_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("1da87ebbdbd287c3141d81b344c83a22fdcaead1" . "913322440977cfa44185506acee3ea9ca2d4426d") (collects #"br-parser-tools" #"lex.rkt") (collects #"br-parser-tools" #"private-lex" #"token-syntax.rkt") (collects #"br-parser-tools" #"yacc.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"block.rkt") (collects #"racket" #"generator.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"rackunit" #"main.rkt") (collects #"syntax" #"boundmap.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/cfg-parser_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/cfg-parser_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..d7e51c3c071fd23ce0cbf432ca305d68a52b6699 GIT binary patch literal 99237 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

<6>q6-*w7o1wiVu+rRkErLc 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 bo;7BojaL*WDTj(yq+*m)!HjH-C+7bHXz^6* literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/errortrace/lex-sre_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/errortrace/lex-sre_rkt.dep new file mode 100644 index 0000000..1443c49 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/errortrace/lex-sre_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("31789e05e19e6122c7619af755b6438bc1872e9b" . "b19638aea3046717541136642402ab336892a3aa") (collects #"br-parser-tools" #"lex.rkt") (collects #"errortrace" #"errortrace-key.rkt") (collects #"mzscheme" #"main.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/errortrace/lex-sre_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/errortrace/lex-sre_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..ba373985c6a0e36c10ec7650f2363dbaa999018b GIT binary patch literal 11952 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 H>@xo!yzwqp literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/errortrace/lex_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/errortrace/lex_rkt.dep new file mode 100644 index 0000000..22f558e --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/errortrace/lex_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("fa9d915c4fb46de94fa89c9eac68c0a0fe32cd40" . "6eb29578f87766fcd1ee8209b3edc21c1081b8e4") (collects #"br-parser-tools" #"private-lex" #"actions.rkt") (collects #"br-parser-tools" #"private-lex" #"front.rkt") (collects #"br-parser-tools" #"private-lex" #"token.rkt") (collects #"br-parser-tools" #"private-lex" #"unicode-chars.rkt") (collects #"br-parser-tools" #"private-lex" #"util.rkt") (collects #"errortrace" #"errortrace-key.rkt") (collects #"mzlib" #"list.rkt") (collects #"mzlib" #"stxparam.rkt") (collects #"mzscheme" #"main.rkt") (collects #"syntax" #"boundmap.rkt") (collects #"syntax" #"define.rkt") (collects #"syntax" #"readerr.rkt") (collects #"syntax" #"stx.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/errortrace/lex_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/errortrace/lex_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..6b45383e008641a0532fae006859b3be02e89114 GIT binary patch literal 79907 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

!U>8cYW%~x0< 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 VQ+z>v2`5Bba6{sOu&}tW{|7R;ln(#^ literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/errortrace/yacc_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/errortrace/yacc_rkt.dep new file mode 100644 index 0000000..f51c124 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/errortrace/yacc_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("100e497a060ad40147465b34990a741797ddb6c0" . "4a109ffd564a7614c177351282958ab6cc95da13") (collects #"br-parser-tools" #"private-lex" #"token.rkt") (collects #"br-parser-tools" #"private-yacc" #"grammar.rkt") (collects #"br-parser-tools" #"private-yacc" #"parser-actions.rkt") (collects #"br-parser-tools" #"private-yacc" #"parser-builder.rkt") (collects #"br-parser-tools" #"private-yacc" #"yacc-helper.rkt") (collects #"errortrace" #"errortrace-key.rkt") (collects #"mzlib" #"etc.rkt") (collects #"mzlib" #"pretty.rkt") (collects #"scheme" #"base.rkt") (collects #"scheme" #"runtime-config.rkt") (collects #"syntax" #"readerr.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/errortrace/yacc_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/drracket/errortrace/yacc_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..3b7cf313e3f01bacbe64b26f517c483015da2791 GIT binary patch literal 30983 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 If+yks10&bJxc~qF literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/info_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/info_rkt.dep new file mode 100644 index 0000000..5643975 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/info_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("0160a40a20d9e0d2a9dc08e0d3b6407cd43b669f" . "64293529315a4e5ca67bc9da08b943f520e0d704") (collects #"info" #"main.rkt") (collects #"setup" #"infotab.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/info_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/info_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..5e36c79d7b79b4da7c60567d9a9cca7fd01d5cca GIT binary patch literal 792 zcmZ{i&rcIU6vyAbZI^DhKZaV`C=jO>J6l4RiqRC}NfQ%N511H(ht(|Y01dRe+1(oA zp=WOkhJzR5K~G-2o2W?iU+|y_e}Wf;lQTdg9-K*L-h27H?|XSO<-y2Jt6|lxxd-X{ z-S02n)#3-g?tOdy>bQGnk@gAzpa3Kw4Wm$o8?XqEU=8{(fCzTsCA@`?@D&c=5Uwb% zl{bR@gaE1%@ALw%e!J6KbtetOP$65sDxF%}?K+*FRsS2=blr`W-2Kg(^F|+m5dz` zm0=c6FjjJs8_3IO4uMbW5zj~sQE0xF7%Q6rOn-dv`rax^exJ#6OKm@UGWh+bNKglCl+{;YU400!2t*w~n(>t!!*- zcU_Vq3J1ywX&uCk6NrjCH$Wn^af&!_;s7@ea7J*V^u(LBQ;LMwp7*{tpTC*+v-3B_ zrSiFQwS4x~Ctojq1M_eE{_E$n=WYA@uYdTX|7DpFLJ5&boXn6MDUnrDCs)ZPd6Vpu zx5(S%9r7MIAU~4d$e-jdBGCytMd#@Ttu0Og3}ft))pc8Tr=3~bz2P>mS-Td?(9@fa z(QP=cCTWu>qbk=D!cPy{cbz0XOo>kfHI45+L2{SfQ z;AEJ}ghdep0f??%={CH@d|VM~3h+chfCNnE6E#RKB#D}zuK9|n!i)y#0%QTyg&F#x z=EJNq1|d}iI&{PTx}xfLt-H-^flkdLlc~)Ax$AsML^ZK5`xI`iu6^e%meZ;@XU&I7}lb`0)7PIK2ro) zhH1Xa>Gb{ezNYHQBiN|lPl$*Lnw}g04;OR}bq*QFMg8yfzFyLk$22zC*VXca#Jl4R z6vSCL{Q}kwyWVn4eK3Le635MkqYp$xFLBiF*>+`qTOY88`&+m#Wnt>_u&qYd>3CMt z(+7~{&BTA%o#wDVYmS9Jwy`uIxEYI$x@zFmRC->^4rt-ayNw--#|+PDwB0q=b9zm0 zad{wNNy3B-Yx49H(x>4)5o>mjK3MOU4IL|2Rx9xu#FF39fP7NLdo*9-{kyOv zeI_p9W$TLYVzaZ`wehWLd&7HQSe9;!i`d&3#G%B02bvtaaR5|RC{su*b?Sl){3Gx= z%bfu^H;3aZ%edrn+Pbf*BRWw?L01*RzlH3-RAtbYJGq)xg3 literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/lex-sre_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/lex-sre_rkt.dep new file mode 100644 index 0000000..a168d2e --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/lex-sre_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("31789e05e19e6122c7619af755b6438bc1872e9b" . "6c5a05919183e8d1de083eff2db1966f6ae5ccb6") (collects #"br-parser-tools" #"lex.rkt") (collects #"mzscheme" #"main.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/lex-sre_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/lex-sre_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..88a6dfb9164f93252e989319bbf24a12378631d9 GIT binary patch literal 6984 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 literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/lex_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/lex_rkt.dep new file mode 100644 index 0000000..052725f --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/lex_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("340fcc1fd30e6afc450a6027068d0e71ff42234e" . "8cc42f47b45f7984d90feb68df53180d93bdefeb") (collects #"br-parser-tools" #"private-lex" #"actions.rkt") (collects #"br-parser-tools" #"private-lex" #"front.rkt") (collects #"br-parser-tools" #"private-lex" #"token.rkt") (collects #"br-parser-tools" #"private-lex" #"unicode-chars.rkt") (collects #"br-parser-tools" #"private-lex" #"util.rkt") (collects #"mzlib" #"list.rkt") (collects #"mzlib" #"stxparam.rkt") (collects #"mzscheme" #"main.rkt") (collects #"syntax" #"boundmap.rkt") (collects #"syntax" #"define.rkt") (collects #"syntax" #"readerr.rkt") (collects #"syntax" #"stx.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/lex_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/compiled/lex_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..9d9ac1bea624eb39858acc551b335fbed6459ff3 GIT binary patch literal 66205 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 literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/examples/calc.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/examples/calc.rkt new file mode 100644 index 0000000..9ad1218 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/examples/calc.rkt @@ -0,0 +1,89 @@ +#lang scheme + +;; An interactive calculator inspired by the calculator example in the bison manual. + + +;; Import the parser and lexer generators. +(require br-parser-tools/yacc + br-parser-tools/lex + (prefix-in : br-parser-tools/lex-sre)) + +(define-tokens value-tokens (NUM VAR FNCT)) +(define-empty-tokens op-tokens (newline = OP CP + - * / ^ EOF NEG)) + +;; A hash table to store variable values in for the calculator +(define vars (make-hash)) + +(define-lex-abbrevs + (lower-letter (:/ "a" "z")) + + (upper-letter (:/ #\A #\Z)) + + ;; (:/ 0 9) would not work because the lexer does not understand numbers. (:/ #\0 #\9) is ok too. + (digit (:/ "0" "9"))) + +(define calcl + (lexer + [(eof) 'EOF] + ;; recursively call the lexer on the remaining input after a tab or space. Returning the + ;; result of that operation. This effectively skips all whitespace. + [(:or #\tab #\space) (calcl input-port)] + ;; (token-newline) returns 'newline + [#\newline (token-newline)] + ;; Since (token-=) returns '=, just return the symbol directly + [(:or "=" "+" "-" "*" "/" "^") (string->symbol lexeme)] + ["(" 'OP] + [")" 'CP] + ["sin" (token-FNCT sin)] + [(:+ (:or lower-letter upper-letter)) (token-VAR (string->symbol lexeme))] + [(:+ digit) (token-NUM (string->number lexeme))] + [(:: (:+ digit) #\. (:* digit)) (token-NUM (string->number lexeme))])) + + +(define calcp + (parser + + (start start) + (end newline EOF) + (tokens value-tokens op-tokens) + (error (lambda (a b c) (void))) + + (precs (right =) + (left - +) + (left * /) + (left NEG) + (right ^)) + + (grammar + + (start [() #f] + ;; If there is an error, ignore everything before the error + ;; and try to start over right after the error + [(error start) $2] + [(exp) $1]) + + (exp [(NUM) $1] + [(VAR) (hash-ref vars $1 (lambda () 0))] + [(VAR = exp) (begin (hash-set! vars $1 $3) + $3)] + [(FNCT OP exp CP) ($1 $3)] + [(exp + exp) (+ $1 $3)] + [(exp - exp) (- $1 $3)] + [(exp * exp) (* $1 $3)] + [(exp / exp) (/ $1 $3)] + [(- exp) (prec NEG) (- $2)] + [(exp ^ exp) (expt $1 $3)] + [(OP exp CP) $2])))) + +;; run the calculator on the given input-port +(define (calc ip) + (port-count-lines! ip) + (letrec ((one-line + (lambda () + (let ((result (calcp (lambda () (calcl ip))))) + (when result + (printf "~a\n" result) + (one-line)))))) + (one-line))) + +(calc (open-input-string "x=1\n(x + 2 * 3) - (1+2)*3")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/examples/compiled/calc_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/examples/compiled/calc_rkt.dep new file mode 100644 index 0000000..175fda2 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/examples/compiled/calc_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("e3352df1b72626dc220a94ee0bd16f165519bade" . "3c46fc3eda107e037940fbfb68032106839316da") (collects #"br-parser-tools" #"lex-sre.rkt") (collects #"br-parser-tools" #"lex.rkt") (collects #"br-parser-tools" #"yacc.rkt") (collects #"scheme" #"main.rkt") (collects #"scheme" #"runtime-config.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/examples/compiled/calc_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/examples/compiled/calc_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..63ed2de33d5e24bf8ee3fd2242b464bd6c3cba5e GIT binary patch literal 10596 zcmd5?YjjjqmcDn_Bd6*Hax1SQgo0cWs_Is#)GMi15<>{@SK^C7lt4%dh=e321p=)E z1$;XJv3qO%$5x_Di%F1(BcK`2IYbPx3J=-s(@DCHm8+n?^; zlUfa}Srmi@$jsk*l%3v8Nf4^DhORpkdu+s3^2Tpo{=(OJur77W8-d0~3y@$iVXm-1 zh@w52YN1ECSr`=d2}gtnh3^ZeglC19g)_oC!u!I%3ZD!AA$%!(E08FQ zF3~3j#3u1N@dmL+>=kbnkBSeA&xtRIXT&$fx5cyKd*Z){pNJR4FGQmG| zd5+m35x9I_m@JY{*q@}cFomX9o-TE4P;#{Qjs!B*NjY&&g_*-qO^>`U!;+uyg# zQl(TQ1*EvtCase;NFCBO(sj~CX_K^Bx=HGkwn^Ki9%+ZPOS)O=llrAWX-G;-`=tHS zSJJk^Ulqn?Ju_?J?5Ac|7d=xX%eTq@DSs&k9LpTnI&N@mb)+1-9fOX2juFQ_juVc@ z9EXbUEo2y2sa~z5=l-T+8%DD7nPa?L+>- zuA$-7kUu>z&^H`7(AC`yeaU2fUur+p&OB=W@K8!>D}3zUeh;lE3EdV z(&^OD%7H=H-<|3oUakqh&ycl-^cyl@$mSI~uB~IGo>|_$VwIj-v7zlcL%Cu3%1rM1 z^#-Fo!`Rq*jbW^FtM(3rk9&BQv* zi|+KmkiWlcPf9G-$~~za=&I2#Yehv}U0on=PnH{_($c)7y<*|bF_J^%=Yt7)x! z^%h!Fv&QUkuiY|A>pbpta)F1|d#OXEtBGpXTTXgMX@hJgv&TcCp0$i;t>f7O�#* ziC9#JDBDg9$%bS{l8_3KW+BZ+DngQx97x4TB}k=6Wk}^nPNX?V6-aZDDv{YIi%_MOGwJO^5ZkcXX6GXtn017cK}jR~Kl?s|}^fmBpwhS|wX(K5GxLQ#G|J zS206X5oD+Ai#3(aP}K(6=`vkqH&jj^d&j1$Bwdy8u_p>58m~~-M4H(<=Ai1{#G8t+ z26oEgpx&msx9jRU_5+LNQ8CopRdK@e5 z3HGG!cLmggs(VORE9_oN9rt7|)I(YiD)ljK^s%>$QJ$x3!ZG%MSs!n}bW)Cc`Ilxr+!7cQ?n(ql7_ib24>pWXV`5w64 zONU9NJBb3Gn%hOJCOQNIby)CzxkD^5B0_4@H*#|x(sbSuhBi>Q6Jz9;~MRm2GyEevoKeZTQ-`3x_E+G zGm4dvtHdy_*Pl$u%t(S)Hc6G8-4dfB*97-Qd$uKw1}H!y#v`5gfJRo2cgL44XyL9I)^#y**$jM z4-5})nmOa_0lQ&_IfLw|J@QS*aTQahI?s!l>^URj8`t?Vy4rDF?Kw1n{! zL@_NfOi3Kmk-$_WF%6BFf+h@q^TtjvH+EhuFZiGGm+cqJ{mx(0#g5~3aj)~2S|*Xn zBzb1u#qwh&)CW-dU_$9v^iBCYyef#QUyDZO199V4=PyO)`=XT1Th=)hSJL z+IP^jM3ISI{I1%$Sia)?mF!l-m250}Sb6=TWQmOpR0A~Tq6xDr!|HH!9q*oHpm zxk;PkJ6b`x?Vm7@JD~pmaNvq<*upEf)+Ff)wna@Boo7W%=C|cf64q8!b^b!E5;i@| zYCMZ2xgh^{&1f_ksmF6-DZ{znRc{~jz-7K7zb!wVwesFMES~cs%xg{Hxl#VM>FjwP zmHFq-wa>%mv*#~z%{S#gfdb)Hjj5b6eWsGvHL05(_ILv9OMaaw7tjiLb1kc8huzKg zKaoj!i{?4srH!56l%Hg@625VkZ$_5Mth}9%RXZcgY*F6H$67oi%VJf2KA8mv7qbfA zdxiL$q5Ih?9)BJ$aGs;f8jw3o|Ca%|Gau`c19BuE>yiUWo&{I!{3=MfhM00K*_7+Zu3S%&vXKgvzoJ>n4K!Q1k&2WpBr99V zp>$EP(oH2wib|E8RHpP&xw4y_${w1d3{Zt~3(ZxAsZvSPJY_Grlzq6w(r)mTTiJr_ z9llqtpz`_nmaj-A+#!|XBEfu|mMmPLgSt zD*ify;sxA69{2b%sO+wZTa*!yVB`)dBX1!zW!ZE6>k>36Qka{fVd zeoXxTr=s(ZqVqG+`MKyEgHm*UBsxD4F%-NJJO6{sU3A(ZeagG0L@*hRT_{#wq00e> zld%SXe~d_%yPET#|HH9lh%ed75PRKTYX|QivzPWxD4*%n$-)`^>=rZRbfLy#yQq$Z)LI@nz8jZ|q@#Z`#)wRNN} zriK9d{MlVvA5E~c)LKhR*?Ecxrs`ldEn(*z_)&vExMymE)i#GvK#2yz;*Zx;GOF1Q z!FGdTJET%$Ok;LRL( zCS5e@f_ocAdp6BT1V&=HMk2Zq2yO(TK0(|La@-CCw*$fLL|{jxhNMHVa_@89Udn!- zSNoARMi{0%j6dYnewPf3G5nh<<6A^1>2@S%h-roRC`U{0}AgxS?mZX~D~iKyCy zM#09VCMd{pCWOI^<}zcP8OmkGvP|SS6T)D|bS4^%b6Pk<<6g&guOYbC5WH;&ZUMru z5YJjja0`)K3klr<1h)XeEkJM!5Qc?>VWFrx#P?jNVcdinDsDrUNkc{r*8&`3e`Sl1Y@;s+F*>|8-)2&`6@P--7^oAceBk;dnFV}hWOE_CBdHHjB$sj zWi%v1yph%z`>Dp@=k*XyT!#f5qw+s^aPg#Zmg1$bi&fb#R4A`%Pb^>L62w?C%#TBD z&Fm=p#fh(J2SHD5X!>DDB*QU~ma|HBdO@9iOgUp59(~i3VnMy775H_)f*?4rUj`?n zb5=I9(^Z`F#$|9YN4!U?n%QB6bAEamoQTd@-OQfUIByypb@~T$tUej$2iY~u#qM3` zM?*imjD{NYhSoN-=N3l5`Ns@rhKBId7~Y|E&FubazUCyHBAT>Q1V58_>-k|^Azbz? z2kM##dvpL0-)+TD zefBqp?B4xVwN>FNUsXh{@>h97wPDq#y{N%8+gaLt+$-I<)r*_Xv*OpzcSYWkC#E^Y aZy+Z)^=A@9PJ-z;(=DY9vUia%ae0lxe``X;wef#~^K4%{f1$epLH_0FG zBiZZhb=Ll^Veh@pK0|GXu8;I(`LlAeJTnKqGjsdV>aSn={FU$rIsf}FzWVz`fBV-< z?KT_!BimE9KDL3j;kF{%99x5JgKe8_pY4S0qU}xFP1{GdPi?=jeQo<2+c&nqv;8ld z-QL$e(5~52>@K^O`FoA*Rn}{9uf@Gr^nRiDSH1sZ?|a%~Iou2b+_uspJ=Z^KHc>cBsGX?08W*rmam+Evwc?wr!4!MfU2 zrAup<*S3t2r8~!J` z>zBi|mBIQkwe__vwbgZHb-|XFU{h)RnpM!mrEfG!4;TLO#-`x1T3D+Nd}DNu$DsZ( zP1Q?Tz@WY|S@-C~KaTy^Ls5o9_@WbEDc3x*^p`X>Ptbe7g~$Y(CK?sJBc>X)7oMwa z2{t!Y*91p5*DkNO4`^;#>sr>(o`XENKp|UIXXLn%69Y z{pHeQS82s~{h(~r%vqDi8pl&-8b@QMmQT=m<3`OGH?_iOHML@j&Yd=E)Qs`dW=)+r z#(6ZMm`rpTH-u0z!|qhiwd((zNqj$2b(-x6FNY;xy3KJ<-MT#tF=AG1aeltF!E zvhLA|KhahdP8`&%rj;!T5&il#Hq|~~-4f);WlPn3LPU&PRlPE(cl5-@hGz71L%pl6 zwmvw)tkpEsO*ShH%a%0daB-O8Y<{Tjwzw9&qRT0v`XUKtoeWAiKQgx#}ht{4NOuN&@K-c6$l_ z&%pn+_}>*FL`E$N7uT{&0(>GT!e%R7)L7k;FH4^+-Lmv1L^z!olr`1OLA`hS_BE<5 zeGKc|=x99zvSuIHR9&+&*rGy^y{e%pXox!#A|fM!z=C4U=;wk>K|6=5lT!sb0bhPM zr#ylDJQ)htvf8?!k=z(D;PLqaxw#{o$2KEXU~DwEjOHULytbONRI^N9x^S*H;PEEE z8sn&n5!}_nfvdD=70DY!mDnhTZ4_ZC$*rQQU9^dm2^{U zbDRd}g-kj!I)^#E49;$mNpDq1)>8&+dM2I9l0Z)zoTX^ymz>@@C%1r3MPx8ej3KfO zI434aoIX0sOZ}-WGLwb+8bbM*bS*)0o-sIE(QNx9X=ALxItA9YO3CVHu$I80d>13d z8JreaG)i*f4bBBds*(ouH(2MuxHU1kNisN_(CpL%8A;7x9S7^& zT*-RYU@gj|kMg8RLk-UAOnPsm%?ry$}m_95ZzoEf=q)`pGkL$CC6oO zE<18*@1`^c&(c{w4;`UgW@H;OTOhN$$;+%9gXPbpO+)<5aT}cT(EsKF8BCACx+FaG zeiaR1v0Q@}K;I=vU%UqAEE=}WcO~BzJWagxEbWSv_T-6I#ch%NzU1d(uwICeru)Eu zUnJi(3+wVSVxxfxpR-yv5)b)8$Cn$Hm}paU^du_+#j;NI9@a zfWOVb7LPPS(1sA)950oW7_4Jpy*Ed)Mj5PynRFme&Y#f+rxBxIq~w$uoK`fuHcqN9 zGgwE#x;tC4#u%)sOgiqBF(@}U4ViRsgsX3RjA%!4YInvsqM}5rU=o$Q-_eeX(sVIS z%n){UeVab)fP>PK4?3#EA;+*o4qHm{VFxlGE^k%se04kGNEOE&Y2u_q%uE?}#9>E* z6h|G#HqvVVP zYpfFG%2X_<7(-ukVwI_}s=gh#yb_h{*bZ!c6)H~*>Tp6|fEt#|^9fy?H_ew41Gx=DxiYqtm7s4}JLz!Hf2dpS)F~ML<^HCQwQH*=+3~I)m4ZD{9xGLR3)wn&9 zRX$xN+p>MhM;+~$5#pdD`IrMM46e=)(}x{*h<%tAC-iBNDrTr-tT2q@1l&wa=PG8- zEHpjg*w0N<#jJK&irH4?Y{{IRd;$spe$X-Oq{AVXCYXl@r5Y?vX2_*U6;jYNBqL;4 zhrlEk2UtWL=7cqeMp6-NPAnL9+7ZR+I0%`!5JtLmhf-0^{i>Bt&{8g zh{~9u@=Z zMa7~4bRa=pQhk1UEg?4qhZ5-+14XK|?86o7B;!OP7;>fOqhvb!7=?z=(FAq<^X1ak z1WGh4R@UX`(oG4fuCMt%x-Btrk&>AC0lI5K=6mR!1inNsv3Tvr74q;9wnHs1{WO@4 z56J;XtsMQZ?BbAYaH0%cKV{RKLo&fpOCUex(Yr&kz)_1*KNZu5L)41FPw{kU2=V2^ z8uWrZ+Ls9JxKGe6E-0WwiLMyOLhzO<9u1^ZiO?U>ySFxMcyfAnps0An$c2m6tLt6? z4W&zoxMWMO3(y}Y6G<)e3cR#8k$5yNwm2R@Hzl#=fkvwUIyMOon9JG#CD4&1IBB&d zK*Q*C65A3Mmf^}$1_a1Omy?vU0hn_tNtqMKr=3YO+|VC1)D`B@{Uja{SRhEN3;oop z!64SQO!10os|F$PN&@Q@6XDp&T(ipxVd-v7jeBK@YR^(jy=iW0%PIoKa!9E8G~Gv+vpB$N zVL3fO*Rl{!?ggc2Mj>s^W<^S92FA&@Y)FaahUyvYT(%Wx25Gb}TdhuK1ZY!sVT_~N z0z0#iu62N&3D_GF_BjJ~CSY$#Shc>H3D`T?7<;1Dlu4xxIcj3h4A9kV8qiVGtU@}H zV|8E_G#$@j2UZv;v!Lm04m+SU&4Q+jIaW=xD3z|6nq~#)a1LwYsiHzPyO1`yt(s;- z(^fZYT4`vS4Nbe;DwMMW)aLee1esGvuXg~M1CT2cq|N}D1CSdg$eaLOWDsko%`K#D z9=1fqaxOr2daNGKr9ss0v3fWc3Ga|c#d2Ku8LA+fcEDi+gY2;FQm6*6BU#BXmZnR zGCx2!a@A~`o=2CmXkU293|f#&TfD4Q-RUgw(RObJ7-|qKD5Tw9l`$50XtS5s`PSrE z<)!mpj;gw7RQc(W7q(iXR)uu^j?`pI;bL=(#l$M3ORFf2?sr5&zG}-;K2#yBZ+p#z zS(QuYyu^1+*73J6pHAn&BMwx(0lct~&NB}Wf%H7F5P^C7UJE` z4Q>;u?t&L0TfUR0M#e%||7M=bEDL>fDo@@ES_88vkGA*_7^``U0<_b|rl_0bMa8t+ z$0JZZN?3$}ebA?TUQ|Fkd_^5G76<4ZiJ_V-E~Z;Pj-&!z4D0Xvlz)p0=xrZv>C~MsGQGRHWUh1QBezrtq)1?7=-5-*q zgN1b8&x({#5WU=5U`^6N#CBVO6)1=t_gaD3B0%^2AxU}}a#4X5b{Sx=NLZCvmT@kU zu;oUimI3x=ficjF z2dtWwL(}U4rD=J9_69DYTkf z3y|{?L?xtJfLt*_Y6En-FeFK@D5TaR22rtG0g%l_Ru5NT+HWtidbk4FbWf4;a7BPN z7KJ3~m4$R!!mcnnWF=s)c7R<8*c%;SR|5973A-{tml)QXaqEx_i`iP0r0W2?w^&7~ zE3 zM4G$8ZOkOyh$MY&q#7BGu>SH$m022nbYx_wB)vM1Hk2SR)|9n6K$}b06!qM4bun!# zu_o!&7})J4%IDPuw5cQ{NjG5`DKS)%ZYri5B^*fw+63$Glqmn23g~KyO46&nbbq9o zq*eND#*@lX{1B3DRd-h{UOF?1ZB4~JTsl39@2{*L zKc7n@9*wwJ zR|0E`sI`<0Rzhomyt$O4tJczM(QmJnT7lN0U-y)%SgkFjjitpMljpi3y4C@99bj)r zSe07V0rs|pEj0qO4zPDi`C6pb((5RLTFX?d))ms#QX14z(~CuPyv*vri_mncj2%$f z=0#|_SjG-0O)o;zl`^ZQ7oq8GQ`3uubgYauS$pNBBHA&=s_7+Y+BJqXsRZ;AG#wbD z63|P9w0%r|N066sh3)|IGCCnEYnpzwh|Y~=YgLq91?w(%G>gX?lYwqWiLq3d#n7My=yiqYVPr%&}_x zzkmhFXnH+#IlWPM>CiaVtWxzxfmAn+bF~@?8=>jcIOBZ;Z4|k5a2&sE;JB#eSgXjR zTjMyo>M44wD4;vz+#SQ$D)9Ja^LWv zz{4kQwaicm8C=!5nVHSO8czEssIEp;qxK0ZpSK~j_r}ve!z2~EO#*lH6X30NCT)Vo z>(V6k3TujpjJg`)T1`G3Gf^vBi-f3Q&fHY$T+6X($5pPUnGTwx~y)=Qwz-+i*5>P$21^f>fnb+m&nbH=-_ufP`2DhLS?oO2N zMAS>otzhk)#5Y0wU_r%T8$xqwQb-K8p3YZZMsk95NChlulQrf}uvx zz;e->lhsH-HI3ew%-1JnI9MLKIawLL9flvAOvClZi0USL2P|)&0)wn(?htqqwV%1B znP3g3LsOKQsP?CQQ(&g)F<8Ut^c2HmHHN`WrwgG_F1loeN~7}(WgYuymrrkVJ9F%V z6`*&gD34L~(OXlj9)mTK?o3f0?|{d)g&X6Rb44GF6$0>TtR^6=s@|0xOH&oEj1-aPe3;6bcW9tx$Lp z%ur?@qfsG!FjaZH6CNL!O3LPKnE0>5Q!|&R`|d?&*wOW*7?AP}(=$dL0ET zgN{vCHtvDCw&|gZoxRX^vxC09tnaqex55AiE0I3xpbxB}v~h-2A6OZ*eTLGv7y90j z`mCL`5Bko{u==-;^>gd-elp%S!22<*MHfNd^#4uNxL7B4%LtA|-;w(@j0X29JF zIuW{nIfBc{h1qP7S{oeUOUZ0TQbXwojJ`Ho&AKC)UFT=>0*1R$U4V|_V%9c?y-=?n zj$#3`bxz0v<|r><_RnE`kL7UfJj8leGPLIZnVxJ z{;tJ3xQ^j!+BO&3tm*$4+}X-Zd?%()>SNpoJLW16k0Ekf=7wZ!$UI92xS5#>!5U77 z=c-OYRipiL)oSG!;@CR3(`w~7I^x<~1j=gXacF#7nl#)n={PSk-kr;1K&?B#N~90x zs+4sci;TDChOAaj0O;5}_D!`q!9XYH@oGh3gQd}>dCJ`r06IEPtyYesBd^Yts})|C ztTpU8i2&c5$M>SvW$P&j@2%usSId)A==Fn@c&^0m)fkOW@#W`4CC9G%F>5fL=BAPA zS_-KoI$x>6iE4j3UWsl9fl8(;5=uQ+hF}_9lThmM2v{z9%L+A|E?26zmZ#v$o=W-V zi=ovJJ`48F`Rq)iVdPm1pZ57M+jlj)4XR2cJ?SZ~_|NTw20yC6 zVS4B_^bR2TaSFCN8}e;2opBA$9`*!pVxO2GIE=uzCcFxmP`dzxyLou)VXnc2wc zTb{)uKr>i{Lk$&0>6pd(90PS9lfM_X_Ed?IzrvIUA!P( z#rR+%@3O9QQaf8sZDCgKJDf8&Eu;737ivoOJ)Q^0R#08?zA)MN1B}@Vb#y2^dB4uM zhl||BRdmCVd_ZU1$B5ljPXm$<>h%qd0=iL8{gV&r^^K?>#iP*V!+O2dQAFDtA%8@# zx1s)CBMpLaxNoz^;x`{_R=Gy#4!IhZtO(Y$7@mBQA|4;xgD$(hq)a>)B(B; zBJWEPhCad~T*#hjMO?Qu(q!=1FMLF;^Ecru&NHhCAKD@y-&O2M!*@W_FnQGBr}(^Q zF23xUhmU$H@jcIce9E%`U-4Ao1D=KWc4rYj+gbb@OlM!}BMi((746v`9>e(Wa~^k} zp?DM*`Ok6JqaVe&;(sMDJ+pFC<9{I!yy_s24+cMq+w8#kY}9_)q4tINF76(m%E2j# z!3Vz-PUoXIij7@7_drUjkG{oE?QC6t(eKU0hxot7*W2ORo0z+H*cJb2SN6e!KdODP zu~mppx-S(0&E(idBQ7wYi_m=Us+~%;wL`u)t%Hz=9>v{_jQ@fMlS_`PPkB`QNZv;# z{fN5FUjLy&UyjMxld%7>=c75^(fuDpA|1H$(DCYj~9WUnn2s;0N@v~CJ z_J^5F-^J|>LlR5tVmkex24w%(2DpE01M<5tpwkND`^zKq)wufsbuRc3bXNTcIv4&3 zIv4%$I(z-_D$P~j4>)QU>ux^6?YCTJTl3@}W5vO9T;2iLXD`A+2e-IR^8mN`kK$&? zmFLeP*PfoQ-vNIgcOt*Xj>rW+vi@hEp#P7NC%f?98TCEg+H|F>*AJ+RpB#mbq3vZQ#O=84XQ%cm&C8++qI-Pqb{@ zVe1FDU;Yzy7wtynE0*JfKehiB&$FCp_|I_*u+9P7gXUjya}S#92N3*HHTRe-Qd#^%y;FdlWQeLBp^9eHs>bH2b@_1*NOk zG_(Z&K-~WjYI$eeajVxz;9gM#CFYWPv zV#fgKW&nK`SB)OdMh`>k&;FoJ{!byD5ru2R=bsEDz!j!D@z5x<2oH@KlWZ}O-E82H z;|;hy_?iA|cue+gGkp*i{S8HF`@;KGiI?#I;(jsx``Dafnk{x{PVvxGw>!z)7a}Pq zO)R!KhUN?vl{%TLlLb1NuahdBER@7ykK(E9&h_}*^oe+hJ{2$1XMJqgQOYhBmtm8f zU}H-kTa>`NZamRX6ECHT%4~r*ZVTLEevYW}h=sZ075b@c5-sMzE;rldvDoEFgT0QS z?xA9lPS{G+*h&z#5`?V;VJkt{N)WcvJ+zOFk)Iyw0dlScPIBv*9vu^eF+ms;gfT%F z6NE8A7!!msJqD(X78{44v2lM$>=3ChIW+V1b_Pn1LyzWv+Q&v5*{&k`)f3Kr{e*LW z_JnhPE&~~0m5U0y)QWzDLq**gh0}UZ`S^ z!k8e83Bs5ljG1R*`hZ!`0n?{rf-oisV}dXy2xEdUCJ1AKFs9GM%m=1d$IR77cD{}Y z!k8e83Bs5lj0wV+AdCsZnEAl$c2ND5>OVj9<#o{K*Y$z0J`mOi!umj19|-FMVSOO1 z&kucefnQeX(7lHi0NS0SW9R9<6zJF>j19urAdC&d*dUAz!q^~;T`;sCC%bvkc#16+ zMT^DJqB2^{jTQ@{#r$Yd6)hG56$YJT`VA8^AyKwHR?It!T(%!`eMcOTF zP^7(w4T`io*q})J02>r(A7O(c?LIar(l$Coq1NUQMcQVEDAu+*#0YIWJ~P#J;JY4e zCw>{Iy@p?&XuI$gw6+^x5^3%DfuXhsKVZ@JIA)sPdDso92>T!vWAmeYY>$-1rzSYVnM`zsF`49yU^3Zh7XyZ18#KA0oNGzL z(slmNhT>IW_7FkijUE1&oBtW)qa3!_rs~?}pzHD7hufW%aKPl>Um#Pr7AKQ3%OlMVHG*xrdPFMv0N z@CBau;C751@)%0?@zMbO6>w@QFc^UaZ2Xs!;_UVKI3^3PLwjQ^r>5}x^VF2oG&LxP zh^fYIYuMRu6>pB$?82ra*h;_=W7keOoM_pn+m^9%2Lf!-7SdLr?HSpYKX8CnP8KPy zG*SJ~4g*pw28gq)=$sVp+cV+wQaGn)!WX3Qz@78sxGsg0dnWv*6z zN#Un^Cj7P(&g_}+J5sp3XTmq7@aUcizbl1@_DuMe6i(@x@NFp^*E8Ywq%eQ9)PuqQ zz7%%$O!$rzPV1TQT`64JGvN=U@W`GCe<+2MdM5ml6du+y;d@f}nVt#Xm%=eU6W$QU z={lij!W*SzlKOF3bGP&NV(;Q{9yQS)^H8 ziW)w)ettZkt6x)B2kG?BoI}JKd;jXj#=3QY6Vg% z&^s9c+!#Kx;US}Xyyx+G{bFnYp9WuzrYz?}yLKZCk{K*1z73Hq5Mzrxbj_LXd?>WH zx|PFbA7hI>w7nPP9NOF6%kk}IJU(i^)r&Hm55u%~x)TLwdT$!;d>Em_#~PIqqXihZ5bimj!!i zce@qDz9eHQ$wO!RqQ9TgJ}?DC``gF;qj~67UrKR4d|Lakdr9t|XFYV~8J6s=ebl`q z_s`H=Iu%Q)&WADDz3wHse}>^_U;S9Jk9Oab3=O)EyJxtYw#B)e5Bq8x!qouoB*?v! z?51OJ9_Pbnw2j>ha_^+L>Fu~|=fha7wR=JCom3BPiT67n_S4$B7v$babJO{FjPy8d zQ}`f$_D_la^pt)v*G0_07)Oo=pVWH2DDb0+BqkbZ_{JAcbDqU_y!b8FQ2Yo3KN?DA zW(uX?>tOsOA=Lwt25gXYO6PMKl!0HF;0HIE_`(>!K5%g@i?Z+?FLqPQW|17?olWrb z!~oX{sW1Iq(#hJOpEcEK2_6;Tw71;y)gm@K&7Fez$=Qe ze~(NH@Rta>1b+#jOYt`dG>AX!pF+#>0&_8m_S+{ZU;?%kYaDs-rq4&D0En12po3Kp4Lj zW6cG)O^4ltnh|#+(&?1JF1z$l88I@VVhsmSQ*sbSH*aF)p>O~7Ut?@}&KM`!!fYA| z+R1Jj0WKRp3e>R0VmOt6&9;HS0a=9ypd4z*(+I%hkh_81V;09kwu!<)cL5^~ql%bC zV`!*29Bh5(s6!QNdO}+^3?7rwRg$uS1*Y}>7<>ROWw;a2oy3%#;o;A+c`@NQVhgwr z7>&myOEP6i9@~&~#YEtM1$nNpAkPaHWXe!HK}J!zq}3R4ZWEeE`xBwrN`~es!-6~y z8JcMhE+HAx50>CL!V<>BlQajv2TH{~0LBNcq7+Ef;}1V;#xQS^b?(z-)LZmXgCvTP z$X(114$}{LvMiI#Mrx#>)AY9na;&l%l#OD_J-Y-{ss`m=S}G?jbMS>fj}TfcISf4A z;7m7BtH5E@`Jjx-lu;Le>MrZ33k}qKnujxtT4|zAGdR;!hhxBi1*bx$p4pw8WqYQ8vNq16NI5hal&36H?%v5N256xYXXima0n+f+ zlH3@RqovO?W4eT#=k%bTS81WZw6pWX)g`-3jB2)z1t2?D4$97r2W3Ne!n1SZKxK;2 zedH?pIL`F3JjO^qGzRB7d&FtaVn_FRjxQq|?yj>ZgR_03dJ3mfQW+ZXXkyBam7121 zHfI3-4TP>tA8pYkV}Nh~VybIO&7s{nG(8H5%5$x39~;lT^u%6KV^(#mY^nP7 zi7i#UHnJ`bm^@&m_*Vp!N3WXMuk-NLJ>n2?FRnK%=1J4_BvH<(>BTM7^y<2WGVv8i zvV~09z?V(?UXqEPlgRJCBp4H{`>Tvn*ZC5l&U8xs=3ICYrgfFe))^*qX5xUUT-GUL zIc22TyR{JIbjOsF8dE)~u^BA!f+4|_C0;NucTY;Gx_VuPwQ1^;u0jT!p|}y0O=Zfc4W?=J zhD5a?!IX#8Dk-U74H;`G>TKF#WtyAn6w5HpO)E{)YH*G{4uxF;z5!=QtN>-xnDXVf zR-#oSg3rmL7w83AE|2(vaa5mJHB>`KFze8UXU<`sfNb?4K6s3xAF26ukWYph#Ud-g z*Nx%<&VUCL;C=y@EjCA@Y0FNfV27@ttMRU8SNAhvJ2z&JW`T0IGgT9k6|33( zcw(xghkv_8@8qq@fZspOx3DN@0(rob5(f(KNeM@pqGt_8;bDP)-bc6gC8M*fiS%W& zFE}lCpN<)5lLC4bqR>%b%y)U^FgW^fkQ_B0TgwN8X^r~b%u{> zp>u()?5eY5G*yT~!>i|snR2Le&z@%#7Lo_t2Yg^?>)5G!wACc+a;z9y(VVf*DQtPb z*f?Mwdtx22s?X2z$*yJ;=7ydG9*=xAAJ5>F0oieuvALCIuXj0F+1!QZ%s&0tIBNn> z#+_2eRYM(54yK%-kZM$hGP1A%>86v9jq8}S*to@}ab4y9323yJI0!anzisG@IJknv48lzphtJ|bRxe-HO)?u*oF%Asg zCB@_ZkwM8GO4!b6t1Fs8w-sOz{<~A7U!Idtdm>l#gk zX2e4*h2+l>ce77SH$&QYG+5Wqea~V{8J6kKnDP@|ge5v!7ST-g|Mbu^7bo$*mtK$l&3bw+ z-HOkMMzgJGmXez76j^vlxGfxSr#$NI6b+NFry8yAUUJ=DehrWnpga9(9>1R2&X3r; z5#{#)IoR@fAipsX+KwlP@|ys6fG!MTQHQqEDr$Y}1q1k9fX7Wo2FrI;ujxx=Q7a`{~{CDR~RLKZpV*U@PmSW zF%kMmclist lexeme)))] + ["#\\space" (token-DATUM #\space)] + ["#\\newline" (token-DATUM #\newline)] + [(:or (:: initial (:* subsequent)) "+" "-" "...") (token-DATUM (string->symbol lexeme))] + [#\" (token-DATUM (list->string (get-string-token input-port)))] + [#\( 'OP] + [#\) 'CP] + [#\[ 'OP] + [#\] 'CP] + ["#(" 'HASHOP] + [num2 (token-DATUM (string->number lexeme 2))] + [num8 (token-DATUM (string->number lexeme 8))] + [num10 (token-DATUM (string->number lexeme 10))] + [num16 (token-DATUM (string->number lexeme 16))] + ["'" 'QUOTE] + ["`" 'QUASIQUOTE] + ["," 'UNQUOTE] + [",@" 'UNQUOTE-SPLICING] + ["." 'DOT] + [(eof) 'EOF])) + + (define get-string-token + (lexer + [(:~ #\" #\\) (cons (car (string->list lexeme)) + (get-string-token input-port))] + [(:: #\\ #\\) (cons #\\ (get-string-token input-port))] + [(:: #\\ #\") (cons #\" (get-string-token input-port))] + [#\" null])) + + + (define-lex-abbrevs + [letter (:or (:/ "a" "z") (:/ #\A #\Z))] + [digit (:/ #\0 #\9)] + [scheme-whitespace (:or #\newline #\return #\tab #\space #\vtab)] + [initial (:or letter (char-set "!$%&*/:<=>?^_~@"))] + [subsequent (:or initial digit (char-set "+-.@"))] + [comment (:: #\; (:* (:~ #\newline)) #\newline)] + + + ;; See ${PLTHOME}/collects/syntax-color/racket-lexer.rkt for an example of + ;; using regexp macros to avoid the cut and paste. + ; [numR (:: prefixR complexR)] + ; [complexR (:or realR + ; (:: realR "@" realR) + ; (:: realR "+" urealR "i") + ; (:: realR "-" urealR "i") + ; (:: realR "+i") + ; (:: realR "-i") + ; (:: "+" urealR "i") + ; (:: "-" urealR "i") + ; (:: "+i") + ; (:: "-i"))] + ; [realR (:: sign urealR)] + ; [urealR (:or uintegerR (:: uintegerR "/" uintegerR) decimalR)] + ; [uintegerR (:: (:+ digitR) (:* #\#))] + ; [prefixR (:or (:: radixR exactness) + ; (:: exactness radixR))] + + [num2 (:: prefix2 complex2)] + [complex2 (:or real2 + (:: real2 "@" real2) + (:: real2 "+" ureal2 "i") + (:: real2 "-" ureal2 "i") + (:: real2 "+i") + (:: real2 "-i") + (:: "+" ureal2 "i") + (:: "-" ureal2 "i") + (:: "+i") + (:: "-i"))] + [real2 (:: sign ureal2)] + [ureal2 (:or uinteger2 (:: uinteger2 "/" uinteger2))] + [uinteger2 (:: (:+ digit2) (:* #\#))] + [prefix2 (:or (:: radix2 exactness) + (:: exactness radix2))] + [radix2 "#b"] + [digit2 (:or "0" "1")] + [num8 (:: prefix8 complex8)] + [complex8 (:or real8 + (:: real8 "@" real8) + (:: real8 "+" ureal8 "i") + (:: real8 "-" ureal8 "i") + (:: real8 "+i") + (:: real8 "-i") + (:: "+" ureal8 "i") + (:: "-" ureal8 "i") + (:: "+i") + (:: "-i"))] + [real8 (:: sign ureal8)] + [ureal8 (:or uinteger8 (:: uinteger8 "/" uinteger8))] + [uinteger8 (:: (:+ digit8) (:* #\#))] + [prefix8 (:or (:: radix8 exactness) + (:: exactness radix8))] + [radix8 "#o"] + [digit8 (:/ "0" "7")] + + [num10 (:: prefix10 complex10)] + [complex10 (:or real10 + (:: real10 "@" real10) + (:: real10 "+" ureal10 "i") + (:: real10 "-" ureal10 "i") + (:: real10 "+i") + (:: real10 "-i") + (:: "+" ureal10 "i") + (:: "-" ureal10 "i") + (:: "+i") + (:: "-i"))] + [real10 (:: sign ureal10)] + [ureal10 (:or uinteger10 (:: uinteger10 "/" uinteger10) decimal10)] + [uinteger10 (:: (:+ digit10) (:* #\#))] + [prefix10 (:or (:: radix10 exactness) + (:: exactness radix10))] + [radix10 (:? "#d")] + [digit10 digit] + [decimal10 (:or (:: uinteger10 suffix) + (:: #\. (:+ digit10) (:* #\#) suffix) + (:: (:+ digit10) #\. (:* digit10) (:* #\#) suffix) + (:: (:+ digit10) (:+ #\#) #\. (:* #\#) suffix))] + + [num16 (:: prefix16 complex16)] + [complex16 (:or real16 + (:: real16 "@" real16) + (:: real16 "+" ureal16 "i") + (:: real16 "-" ureal16 "i") + (:: real16 "+i") + (:: real16 "-i") + (:: "+" ureal16 "i") + (:: "-" ureal16 "i") + "+i" + "-i")] + [real16 (:: sign ureal16)] + [ureal16 (:or uinteger16 (:: uinteger16 "/" uinteger16))] + [uinteger16 (:: (:+ digit16) (:* #\#))] + [prefix16 (:or (:: radix16 exactness) + (:: exactness radix16))] + [radix16 "#x"] + [digit16 (:or digit (:/ #\a #\f) (:/ #\A #\F))] + + + [suffix (:or "" (:: exponent-marker sign (:+ digit10)))] + [exponent-marker (:or "e" "s" "f" "d" "l")] + [sign (:or "" "+" "-")] + [exactness (:or "" "#i" "#e")]) + + + (define stx-for-original-property (read-syntax #f (open-input-string "original"))) + + ;; A macro to build the syntax object + (define-syntax (build-so stx) + (syntax-case stx () + ((_ value start end) + (with-syntax ((start-pos (datum->syntax-object + (syntax end) + (string->symbol + (format "$~a-start-pos" + (syntax-object->datum (syntax start)))))) + (end-pos (datum->syntax-object + (syntax end) + (string->symbol + (format "$~a-end-pos" + (syntax-object->datum (syntax end)))))) + (source (datum->syntax-object + (syntax end) + 'source-name))) + (syntax + (datum->syntax-object + #f + value + (list source + (position-line start-pos) + (position-col start-pos) + (position-offset start-pos) + (- (position-offset end-pos) + (position-offset start-pos))) + stx-for-original-property)))))) + + (define (scheme-parser source-name) + (parser + (src-pos) + + (start s) + (end EOF) + (error (lambda (a name val start end) + (raise-read-error + "read-error" + source-name + (position-line start) + (position-col start) + (position-offset start) + (- (position-offset end) + (position-offset start))))) + (tokens data delim) + + + (grammar + + (s [(sexp-list) (reverse $1)]) + + (sexp [(DATUM) (build-so $1 1 1)] + [(OP sexp-list CP) (build-so (reverse $2) 1 3)] + [(HASHOP sexp-list CP) (build-so (list->vector (reverse $2)) 1 3)] + [(QUOTE sexp) (build-so (list 'quote $2) 1 2)] + [(QUASIQUOTE sexp) (build-so (list 'quasiquote $2) 1 2)] + [(UNQUOTE sexp) (build-so (list 'unquote $2) 1 2)] + [(UNQUOTE-SPLICING sexp) (build-so (list 'unquote-splicing $2) 1 2)] + [(OP sexp-list DOT sexp CP) (build-so (append (reverse $2) $4) 1 5)]) + + (sexp-list [() null] + [(sexp-list sexp) (cons $2 $1)])))) + + (define (rs sn ip) + (port-count-lines! ip) + ((scheme-parser sn) (lambda () (scheme-lexer ip)))) + + (define readsyntax + (case-lambda ((sn) (rs sn (current-input-port))) + ((sn ip) (rs sn ip)))) + + (provide (rename readsyntax read-syntax)) + + ) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/info.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/info.rkt new file mode 100644 index 0000000..ae66609 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/info.rkt @@ -0,0 +1,3 @@ +#lang info + +(define compile-omit-paths '("private-lex/error-tests.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/lex-plt-v200.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/lex-plt-v200.rkt new file mode 100644 index 0000000..0cbb175 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/lex-plt-v200.rkt @@ -0,0 +1,24 @@ +(module lex-plt-v200 mzscheme + (require br-parser-tools/lex + (prefix : br-parser-tools/lex-sre)) + + (provide epsilon + ~ + (rename :* *) + (rename :+ +) + (rename :? ?) + (rename :or :) + (rename :& &) + (rename :: @) + (rename :~ ^) + (rename :/ -)) + + (define-lex-trans epsilon + (syntax-rules () + ((_) ""))) + + (define-lex-trans ~ + (syntax-rules () + ((_ re) (complement re))))) + + diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/lex-sre.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/lex-sre.rkt new file mode 100644 index 0000000..820d090 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/lex-sre.rkt @@ -0,0 +1,119 @@ +(module lex-sre mzscheme + (require br-parser-tools/lex) + + (provide (rename sre-* *) + (rename sre-+ +) + ? + (rename sre-= =) + (rename sre->= >=) + ** + (rename sre-or or) + : + seq + & + ~ + (rename sre-- -) + (rename sre-/ /) + /-only-chars) + + (define-lex-trans sre-* + (syntax-rules () + ((_ re ...) + (repetition 0 +inf.0 (union re ...))))) + + (define-lex-trans sre-+ + (syntax-rules () + ((_ re ...) + (repetition 1 +inf.0 (union re ...))))) + + (define-lex-trans ? + (syntax-rules () + ((_ re ...) + (repetition 0 1 (union re ...))))) + + (define-lex-trans sre-= + (syntax-rules () + ((_ n re ...) + (repetition n n (union re ...))))) + + (define-lex-trans sre->= + (syntax-rules () + ((_ n re ...) + (repetition n +inf.0 (union re ...))))) + + (define-lex-trans ** + (syntax-rules () + ((_ low #f re ...) + (** low +inf.0 re ...)) + ((_ low high re ...) + (repetition low high (union re ...))))) + + (define-lex-trans sre-or + (syntax-rules () + ((_ re ...) + (union re ...)))) + + (define-lex-trans : + (syntax-rules () + ((_ re ...) + (concatenation re ...)))) + + (define-lex-trans seq + (syntax-rules () + ((_ re ...) + (concatenation re ...)))) + + (define-lex-trans & + (syntax-rules () + ((_ re ...) + (intersection re ...)))) + + (define-lex-trans ~ + (syntax-rules () + ((_ re ...) + (char-complement (union re ...))))) + + ;; set difference + (define-lex-trans (sre-- stx) + (syntax-case stx () + ((_) + (raise-syntax-error #f + "must have at least one argument" + stx)) + ((_ big-re re ...) + (syntax (& big-re (complement (union re ...))))))) + + (define-lex-trans (sre-/ stx) + (syntax-case stx () + ((_ range ...) + (let ((chars + (apply append (map (lambda (r) + (let ((x (syntax-e r))) + (cond + ((char? x) (list x)) + ((string? x) (string->list x)) + (else + (raise-syntax-error + #f + "not a char or string" + stx + r))))) + (syntax->list (syntax (range ...))))))) + (unless (even? (length chars)) + (raise-syntax-error + #f + "not given an even number of characters" + stx)) + #`(/-only-chars #,@chars))))) + + (define-lex-trans /-only-chars + (syntax-rules () + ((_ c1 c2) + (char-range c1 c2)) + ((_ c1 c2 c ...) + (union (char-range c1 c2) + (/-only-chars c ...))))) + + ) + + diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/lex.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/lex.rkt new file mode 100644 index 0000000..c7202ab --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/lex.rkt @@ -0,0 +1,412 @@ +(module lex mzscheme + + ;; Provides the syntax used to create lexers and the functions needed to + ;; create and use the buffer that the lexer reads from. See docs. + + (require-for-syntax mzlib/list + syntax/stx + syntax/define + syntax/boundmap + "private-lex/util.rkt" + "private-lex/actions.rkt" + "private-lex/front.rkt" + "private-lex/unicode-chars.rkt") + + (require mzlib/stxparam + syntax/readerr + "private-lex/token.rkt") + + (provide lexer lexer-src-pos lexer-srcloc define-lex-abbrev define-lex-abbrevs define-lex-trans + + ;; Dealing with tokens and related structures + define-tokens define-empty-tokens token-name token-value token? + (struct position (offset line col)) + (struct position-token (token start-pos end-pos)) + (struct srcloc-token (token srcloc)) + + ;; File path for highlighting errors while lexing + file-path + lexer-file-path ;; alternate name + + ;; Lex abbrevs for unicode char sets. See mzscheme manual section 3.4. + any-char any-string nothing alphabetic lower-case upper-case title-case + numeric symbolic punctuation graphic whitespace blank iso-control + + ;; A regular expression operator + char-set) + + ;; wrap-action: syntax-object src-pos? -> syntax-object + (define-for-syntax (wrap-action action src-loc-style) + (with-syntax ((action-stx + (cond + [(eq? src-loc-style 'lexer-src-pos) + #`(let/ec ret + (syntax-parameterize + ([return-without-pos (make-rename-transformer #'ret)]) + (make-position-token #,action start-pos end-pos)))] + [(eq? src-loc-style 'lexer-srcloc) + #`(let/ec ret + (syntax-parameterize + ([return-without-srcloc (make-rename-transformer #'ret)]) + (make-srcloc-token #,action lexeme-srcloc)))] + [else action]))) + (syntax/loc action + (lambda (start-pos-p end-pos-p lexeme-p input-port-p) + (define lexeme-srcloc-p (make-srcloc (object-name input-port-p) + (position-line start-pos-p) + (position-col start-pos-p) + (position-offset start-pos-p) + (and (number? (position-offset end-pos-p)) + (number? (position-offset start-pos-p)) + (- (position-offset end-pos-p) + (position-offset start-pos-p))))) + (syntax-parameterize + ([start-pos (make-rename-transformer #'start-pos-p)] + [end-pos (make-rename-transformer #'end-pos-p)] + [lexeme (make-rename-transformer #'lexeme-p)] + [input-port (make-rename-transformer #'input-port-p)] + [lexeme-srcloc (make-rename-transformer #'lexeme-srcloc-p)]) + action-stx))))) + + (define-for-syntax (make-lexer-trans src-loc-style) + (lambda (stx) + (syntax-case stx () + ((_ re-act ...) + (begin + (for-each + (lambda (x) + (syntax-case x () + ((re act) (void)) + (_ (raise-syntax-error #f + "not a regular expression / action pair" + stx + x)))) + (syntax->list (syntax (re-act ...)))) + (let* ((spec/re-act-lst + (syntax->list (syntax (re-act ...)))) + (eof-act + (get-special-action spec/re-act-lst #'eof #''eof)) + (spec-act + (get-special-action spec/re-act-lst #'special #'(void))) + (spec-comment-act + (get-special-action spec/re-act-lst #'special-comment #'#f)) + (ids (list #'special #'special-comment #'eof)) + (re-act-lst + (filter + (lambda (spec/re-act) + (syntax-case spec/re-act () + (((special) act) + (not (ormap + (lambda (x) + (and (identifier? #'special) + (module-or-top-identifier=? (syntax special) x))) + ids))) + (_ #t))) + spec/re-act-lst)) + (name-lst (map (lambda (x) (datum->syntax-object #f (gensym))) re-act-lst)) + (act-lst (map (lambda (x) (stx-car (stx-cdr x))) re-act-lst)) + (re-actname-lst (map (lambda (re-act name) + (list (stx-car re-act) + name)) + re-act-lst + name-lst))) + (when (null? spec/re-act-lst) + (raise-syntax-error (or src-loc-style 'lexer) "expected at least one action" stx)) + (let-values (((trans start action-names no-look disappeared-uses) + (build-lexer re-actname-lst))) + (when (vector-ref action-names start) ;; Start state is final + (unless (and + ;; All the successor states are final + (andmap (lambda (x) (vector-ref action-names (vector-ref x 2))) + (vector->list (vector-ref trans start))) + ;; Each character has a successor state + (let loop ((check 0) + (nexts (vector->list (vector-ref trans start)))) + (cond + ((null? nexts) #f) + (else + (let ((next (car nexts))) + (and (= (vector-ref next 0) check) + (let ((next-check (vector-ref next 1))) + (or (>= next-check max-char-num) + (loop (add1 next-check) (cdr nexts)))))))))) + (eprintf "Warning: lexer at ~a can accept the empty string.\n" stx))) + (with-syntax ((start-state-stx start) + (trans-table-stx trans) + (no-lookahead-stx no-look) + ((name ...) name-lst) + ((act ...) (map (lambda (a) + (wrap-action a src-loc-style)) + act-lst)) + ((act-name ...) (vector->list action-names)) + (spec-act-stx + (wrap-action spec-act src-loc-style)) + (has-comment-act?-stx + (if (syntax-e spec-comment-act) #t #f)) + (spec-comment-act-stx + (wrap-action spec-comment-act src-loc-style)) + (eof-act-stx (wrap-action eof-act src-loc-style))) + (syntax-property + (syntax/loc stx + (let ([name act] ...) + (let ([proc + (lexer-body start-state-stx + trans-table-stx + (vector act-name ...) + no-lookahead-stx + spec-act-stx + has-comment-act?-stx + spec-comment-act-stx + eof-act-stx)]) + ;; reverse eta to get named procedures: + (lambda (port) (proc port))))) + 'disappeared-use + disappeared-uses))))))))) + + (define-syntax lexer (make-lexer-trans #f)) + (define-syntax lexer-src-pos (make-lexer-trans 'lexer-src-pos)) + (define-syntax lexer-srcloc (make-lexer-trans 'lexer-srcloc)) + + (define-syntax (define-lex-abbrev stx) + (syntax-case stx () + ((_ name re) + (identifier? (syntax name)) + (syntax/loc stx + (define-syntax name + (make-lex-abbrev (lambda () (quote-syntax re)))))) + (_ + (raise-syntax-error + #f + "form should be (define-lex-abbrev name re)" + stx)))) + + (define-syntax (define-lex-abbrevs stx) + (syntax-case stx () + ((_ x ...) + (with-syntax (((abbrev ...) + (map + (lambda (a) + (syntax-case a () + ((name re) + (identifier? (syntax name)) + (syntax/loc a (define-lex-abbrev name re))) + (_ (raise-syntax-error + #f + "form should be (define-lex-abbrevs (name re) ...)" + stx + a)))) + (syntax->list (syntax (x ...)))))) + (syntax/loc stx (begin abbrev ...)))) + (_ + (raise-syntax-error + #f + "form should be (define-lex-abbrevs (name re) ...)" + stx)))) + + (define-syntax (define-lex-trans stx) + (syntax-case stx () + ((_ name-form body-form) + (let-values (((name body) + (normalize-definition (syntax (define-syntax name-form body-form)) #'lambda))) + + #`(define-syntax #,name + (let ((func #,body)) + (unless (procedure? func) + (raise-syntax-error 'define-lex-trans "expected a procedure as the transformer, got ~e" func)) + (unless (procedure-arity-includes? func 1) + (raise-syntax-error 'define-lex-trans "expected a procedure that accepts 1 argument as the transformer, got ~e" func)) + (make-lex-trans func))))) + (_ + (raise-syntax-error + #f + "form should be (define-lex-trans name transformer)" + stx)))) + + + (define (get-next-state-helper char min max table) + (if (>= min max) + #f + (let* ((try (quotient (+ min max) 2)) + (el (vector-ref table try)) + (r1 (vector-ref el 0)) + (r2 (vector-ref el 1))) + (cond + ((and (>= char r1) (<= char r2)) (vector-ref el 2)) + ((< char r1) (get-next-state-helper char min try table)) + (else (get-next-state-helper char (add1 try) max table)))))) + + + + + (define (get-next-state char table) + (if table + (get-next-state-helper char 0 (vector-length table) table) + #f)) + + (define (lexer-body start-state trans-table actions no-lookahead special-action + has-special-comment-action? special-comment-action eof-action) + (letrec ((lexer + (lambda (ip) + (let ((first-pos (get-position ip)) + (first-char (peek-char-or-special ip 0))) + ;(printf "(peek-char-or-special port 0) = ~e\n" first-char) + (cond + ((eof-object? first-char) + (do-match ip first-pos eof-action (read-char-or-special ip))) + ((special-comment? first-char) + (read-char-or-special ip) + (cond + (has-special-comment-action? + (do-match ip first-pos special-comment-action #f)) + (else (lexer ip)))) + ((not (char? first-char)) + (do-match ip first-pos special-action (read-char-or-special ip))) + (else + (let lexer-loop ( + ;; current-state + (state start-state) + ;; the character to transition on + (char first-char) + ;; action for the longest match seen thus far + ;; including a match at the current state + (longest-match-action + (vector-ref actions start-state)) + ;; how many bytes precede char + (length-bytes 0) + ;; how many characters have been read + ;; including the one just read + (length-chars 1) + ;; how many characters are in the longest match + (longest-match-length 0)) + (let ((next-state + (cond + ((not (char? char)) #f) + (else (get-next-state (char->integer char) + (vector-ref trans-table state)))))) + (cond + ((not next-state) + (check-match ip first-pos longest-match-length + length-chars longest-match-action)) + ((vector-ref no-lookahead next-state) + (let ((act (vector-ref actions next-state))) + (check-match ip + first-pos + (if act length-chars longest-match-length) + length-chars + (if act act longest-match-action)))) + (else + (let* ((act (vector-ref actions next-state)) + (next-length-bytes (+ (char-utf-8-length char) length-bytes)) + (next-char (peek-char-or-special ip next-length-bytes))) + #;(printf "(peek-char-or-special port ~e) = ~e\n" + next-length-bytes next-char) + (lexer-loop next-state + next-char + (if act + act + longest-match-action) + next-length-bytes + (add1 length-chars) + (if act + length-chars + longest-match-length))))))))))))) + (lambda (ip) + (unless (input-port? ip) + (raise-argument-error + 'lexer + "input-port?" + 0 + ip)) + (lexer ip)))) + + (define (check-match lb first-pos longest-match-length length longest-match-action) + (unless longest-match-action + (let* ((match (read-string length lb)) + (end-pos (get-position lb))) + (raise-read-error + (format "lexer: No match found in input starting with: ~a" match) + (file-path) + (position-line first-pos) + (position-col first-pos) + (position-offset first-pos) + (- (position-offset end-pos) (position-offset first-pos))))) + (let ((match (read-string longest-match-length lb))) + ;(printf "(read-string ~e port) = ~e\n" longest-match-length match) + (do-match lb first-pos longest-match-action match))) + + (define file-path (make-parameter #f)) + (define lexer-file-path file-path) + + (define (do-match ip first-pos action value) + #;(printf "(action ~a ~a ~a ~a)\n" + (position-offset first-pos) (position-offset (get-position ip)) value ip) + (action first-pos (get-position ip) value ip)) + + (define (get-position ip) + (let-values (((line col off) (port-next-location ip))) + (make-position off line col))) + + (define-syntax (create-unicode-abbrevs stx) + (syntax-case stx () + ((_ ctxt) + (with-syntax (((ranges ...) (map (lambda (range) + `(union ,@(map (lambda (x) + `(char-range ,(integer->char (car x)) + ,(integer->char (cdr x)))) + range))) + (list (force alphabetic-ranges) + (force lower-case-ranges) + (force upper-case-ranges) + (force title-case-ranges) + (force numeric-ranges) + (force symbolic-ranges) + (force punctuation-ranges) + (force graphic-ranges) + (force whitespace-ranges) + (force blank-ranges) + (force iso-control-ranges)))) + ((names ...) (map (lambda (sym) + (datum->syntax-object (syntax ctxt) sym #f)) + '(alphabetic + lower-case + upper-case + title-case + numeric + symbolic + punctuation + graphic + whitespace + blank + iso-control)))) + (syntax (define-lex-abbrevs (names ranges) ...)))))) + + (define-lex-abbrev any-char (char-complement (union))) + (define-lex-abbrev any-string (intersection)) + (define-lex-abbrev nothing (union)) + (create-unicode-abbrevs #'here) + + (define-lex-trans (char-set stx) + (syntax-case stx () + ((_ str) + (string? (syntax-e (syntax str))) + (with-syntax (((char ...) (string->list (syntax-e (syntax str))))) + (syntax (union char ...)))))) + + (define-syntax provide-lex-keyword + (syntax-rules () + [(_ id ...) + (begin + (define-syntax-parameter id + (make-set!-transformer + (lambda (stx) + (raise-syntax-error + #f + (format "use of a lexer keyword (~a) is not in an appropriate lexer action" + 'id) + stx)))) + ... + (provide id ...))])) + + (provide-lex-keyword start-pos end-pos lexeme lexeme-srcloc input-port return-without-pos return-without-srcloc) + + ) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/actions.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/actions.rkt new file mode 100644 index 0000000..6ec0c7f --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/actions.rkt @@ -0,0 +1,16 @@ +#lang scheme/base + +(provide (all-defined-out)) +(require syntax/stx) + +;; get-special-action: (syntax-object list) syntax-object syntax-object -> syntax-object +;; Returns the first action from a rule of the form ((which-special) action) +(define (get-special-action rules which-special none) + (cond + ((null? rules) none) + (else + (syntax-case (car rules) () + (((special) act) + (and (identifier? #'special) (module-or-top-identifier=? (syntax special) which-special)) + (syntax act)) + (_ (get-special-action (cdr rules) which-special none)))))) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/actions_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/actions_rkt.dep new file mode 100644 index 0000000..367d875 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/actions_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("f095138d7dfc29ae18c12d7daf44f1c9b74ab56d" . "f0c7dd306804eb5e8da06235651b07296b23b36d") (collects #"scheme" #"base.rkt") (collects #"scheme" #"runtime-config.rkt") (collects #"syntax" #"stx.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/actions_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/actions_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..5ab0ff705997777bd7750864bb80a7513dd6756e GIT binary patch literal 1500 zcma)6O>7%Q6rO!vdv`N&JvGKgbsW?tbT=FCItc;=6;%HE;}e#s03mE?aVE_wj_t13 zDCN*296+)oDj@_M5T^>k0g1mNK^q&_>6IH7RFIIkAt51`6K{9DP9Pw$@_ODk?|bjf z_hx72u1F7?tLBoq@-z@alK392HtOs4#kRu@r(JjLEndV~Ng(7Q9K)xC_)RfHgv?D6 zUAV79-d_3j`S*XyZ@d=$?St2?&+eq7$ixVl93v;lDFol+8xf**z13WL=1|2mR@Jo| z^;S-}w^iNXTf8t{iV;xh&VrJ9bq55M36zmkHnCa;s6Ye&A~{MCP<#{x|E3m79aRn4 zvml4~4;Jte{8OZS9rz%>(%tdI-j3VDOPL#~le$fx87a)%b8vf}*M*1g7kn3_vU+?tlQ1lQ_hI&L^O&bvlp$>PKiuBgxK_ z8{FY6Qf7d=NpW9kxx=C=#5H7snjNLTNM#1X%qab0W*2s|chet=sUzJ*wJ=IQoB0m1 zGow;>QPVR$xLfMx7xXM*Q`a*C@H{4Zb^)`zgkTA$`~GxcQTK2jv2cSvSIOKIs2_+k zUa|eaQn!FnJ($Vd{P)ORVH}TH(Dry(?(-DJ1dHzrGhRZ&7_ZSZy{dck#-Es5)jfg3 z+j|I%01Sq=e6>C3g=+Oc?I2LAhiVrCwZ=rPaZs(d?m(^St1TQ-YfRLJfkEr`)gFrc zziRWLTEka6^wpZn`t7|TD$OtJ!&`$L?Vm?m!BdUr8b5^biPk13T4OSZvml+rFVtvS zwsTtV$31K{o4meOm|M^H3F0%JziK&pUqV#$P`zENp~B|z0HSv};h<^%d7nTk!Qh3f^1S|t z{H?^Kv#xX5sPkhL6tv_$XBBtDTyRi LtAGNse;54)ia~}n literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/deriv_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/deriv_rkt.dep new file mode 100644 index 0000000..04c00b6 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/deriv_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("1edbe8de6053f0e8735c4d7777b345672d547c86" . "980e8a36193a9253ed01c61fc421729123f6b314") (collects #"br-parser-tools" #"private-lex" #"re.rkt") (collects #"br-parser-tools" #"private-lex" #"util.rkt") (collects #"mzlib" #"integer-set.rkt") (collects #"mzlib" #"list.rkt") (collects #"mzscheme" #"main.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/deriv_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/deriv_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..4c6615bf5e8efc347f0fcfc7ee413e6769fcb7a0 GIT binary patch literal 19070 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 literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/deriv_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/deriv_rkt.dep new file mode 100644 index 0000000..b10b81a --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/deriv_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("1edbe8de6053f0e8735c4d7777b345672d547c86" . "44623f82f80a88e2fe5683fec412332baf6a8ed3") (collects #"br-parser-tools" #"private-lex" #"re.rkt") (collects #"br-parser-tools" #"private-lex" #"util.rkt") (collects #"mzlib" #"integer-set.rkt") (collects #"mzlib" #"list.rkt") (collects #"mzscheme" #"main.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/deriv_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/deriv_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..0630f6a3d32431c61debb09a8aa7edea83fb4b91 GIT binary patch literal 8122 zcmbVR32RC`pnm zNnDyHl}eS8CN)SarH#@yDJ9({?UnXR-;th?UYAZv|0Mmp^q{IqRQ*5d&U~98=+E&;$+jM)#-fVBP-(=rrzr+5Z{h+ zoClnToX4C$a{j`3%K2;Ozc~NPDY+V4TU|R{x4Cw^zUg|{^@Qt?>qXZeU4L>p_%!b4 zHQeA)zL0nEwY-OKtllieD`5_g?naPTw&7pQr!N^!8FoYN?hao9q}E%8Z0N`;+N`+p82sS&>Mk0)0CZ z=}gt~!QGj@oyozZQnhk$cWPi;C^eADDpl*O$-q!Hxg(hlWRk!+oz8SJn7%d3Y*kLq zN3#PdYqnzB=s>DJ(7!!#jRj?snJi7$^bHS=jAoP8W?e#ofMItMZIIdC~?|F3TgQSTY4W#UAxqVikKr)BfZxb?qb~Gm`96I|Xso6qc11 zOw=v`wgZzM?aRiY=IR`15q8g!dL3>N2nwN1;;Dh{*<^n(JPAf7!RRCytCCC8iN0Ht z*${kjJ3tuRN$5`^MoE}U z+A8wwU@$lpLn_9bnwsJb;VaXcBe8g6V+UE@DZI6E((B}*eAdWiS4y>2Q~X}r=C$>D z8J!YlW9@8dZF?_UGJlDr)h_KF_qsIJp|j-%TgjL@?aEzC-tS;72|9YJkcRY#Z* z9t*)=u*LZEPYRThLmjin_+#fAiK{4wdH`Hc-_t;-;v8x(i}9cI1PC=Phw6&)V`i{+ z9qq)A+FJRGkDH~?qlC4wbp}D+0yMnmpM_W$<9ppr zgz)EfKLmwd>Jyff=TL6~^~CPr{2T4#hL^EGFI;mYy9qA6sh4$>jHJ=Y zUkwiMAWT0YDiGGf|_s%YM7{r95pPc3AU6}oR!n(Ia`$9_k_@T zb`G^P$`2b+Vyeht?gi8Hcfr?o))A_9a#1PBihARIt|San4;KND(3 zgqo2$(k>!&j0E%?DJYO3@eGS+ME8(T;Vc3~I0+ExO@PRF0>r@}K%52w!~r2dM2r9t zSOP>e2@nA$KuEsSz26L)6UXzvm6v=!cKat-_kKe&+*4)-W*58n>ml8Lf?f38d|b@J zG!sxn2i1t`SbNErfVjG#2~0gOry2exF)?6d`~hPK9uqt#=pDL;3u2A8{7>`Bc(I(t0HGDRI-OEFskL*r$9O}rV zS_>&6c5VIt$ZoJ?&xPzGr8(LA^RnXw*$ah>{3oW^yNImvT=K1l2kMMT&j5c~_7q)) zZoJAoHF07Rni2`k=-#gx#uSW^!xZAvv&BClSCSjK-@slVn7o>H#nSwG;ui6%0Axju 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 sUatV(OZ?Vp!QFeF9fcxCj}>vGlow^Q+#{ zjF9eaLnluMH#gVoj$XPqL-(6%^M`jlW50w^k`ls^7Scr&5+?&>FL{hik}Nq(J|$n0 zugE(2j{HD=B7cy-$iJkOcGDbvmDb?4?&0I2o~)5y?tk)u-5pM6tZdH6M+6}Wu>BU0 z5=vT;)WH{5a+ZFiyJtZ+4Si9F(8hdbUSHA^#UQnUVIeYMrZWq=m6%TFbs^&Q`*qXI znHH|<+Je3sHy5l3Z7we+%A~fKoff1TuPoKNWvR{;i;798m+FZe^@}bU8dBf_kQ#g! z6dMAf8+cg;S|FCU=0XG}GEXzo+0lWnQPXRnOs`(-l#T+}iM7uOu6!l?<#n?o2 znGyVj7$11)0#I3`f=B}4x)Jp0sA7KI zxD|ot@zvQ9o3v%QDC%m1YU=Je=@Fh_H zoNj6PWj&KkFKPwgv7>jM9fuuxJilsK>2ry^bxvp}Nsmy3se_;Yk1DUvhn5P;qFB1o z>~=V7J3$MGTR}kiOo@*Ui&L#|B^?M&Y|pTor@jbYehX=CP4K`0t7!N)<77d(gv z1d|t9p(EOALj>BSh)a&PC81qv$HLKp@aQZeqDKJ*K#q1YcyuXvY#?>H8R)wi+zQ2n zk(^UZ0NjX~ZW}1LqBwLh^HNl@p$EP6IMqTbD>AZD5#=a&rKrcL1W~3eJJO0%sAL;A z(P27X~W1_SdXe=I}3`7r2;d;Qn8Kr&I027 z_V~PR>JSdptWB=TF|~2}1#qW8gnIBp1MrXR;a=ys!G9*#R7KqiUI}d8+$hUVjU&8g zQmKQ+%HrZE>NKRr^~JoNhCm7$p`K4AAqYYC;`?LV$8PR@ck5R0bm#`$C|lW$tWT;6b&VxkIMet3wx=;cDV-@XLfNu{w03tSKPxtDtslc4ppux<-i z@o?iq>YX2NBhfdc-rl_RU?bqM`2e`^Cb>If+l@diHv&Zzu-xy`2*8cJ6XmIOQjDez~I&$UHB zfNH2!H?SpfQ0ExH9X-6^(9Yf+Er)`ebv+yuW!Jvr!tAoX6Q~p6)J3jC9nwVK5zAcF z4E>x{zLmmV(%FZ28dA30g}Fzy1R@ CrDF;J literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/deriv_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/deriv_rkt.dep new file mode 100644 index 0000000..b64bcd7 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/deriv_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("1edbe8de6053f0e8735c4d7777b345672d547c86" . "02238d6deec4e15d91f05091ef67f522127eb47b") (collects #"br-parser-tools" #"private-lex" #"re.rkt") (collects #"br-parser-tools" #"private-lex" #"util.rkt") (collects #"errortrace" #"errortrace-key.rkt") (collects #"mzlib" #"integer-set.rkt") (collects #"mzlib" #"list.rkt") (collects #"mzscheme" #"main.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/deriv_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/deriv_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..f781864e6fb0fb76216fb29ced454cfc3299606d GIT binary patch literal 17391 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 WB1OC@1c_9v*eWAjPf1O6r~ZEm0Miiw literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/front_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/front_rkt.dep new file mode 100644 index 0000000..bf19f0d --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/front_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("560290907963aeb1a4cc1e997b45b3113174dcc2" . "8b3fb56340e1383a464e9e09b878c80c8588c8db") (collects #"br-parser-tools" #"private-lex" #"deriv.rkt") (collects #"br-parser-tools" #"private-lex" #"re.rkt") (collects #"br-parser-tools" #"private-lex" #"stx.rkt") (collects #"br-parser-tools" #"private-lex" #"util.rkt") (collects #"errortrace" #"errortrace-key.rkt") (collects #"mzlib" #"integer-set.rkt") (collects #"mzlib" #"list.rkt") (collects #"mzscheme" #"main.rkt") (collects #"syntax" #"stx.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/front_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/front_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..4faf4fc567b64353458fbdd86f2fb1a5a660f5a4 GIT binary patch literal 8138 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℞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 ARR910 literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/stx_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/stx_rkt.dep new file mode 100644 index 0000000..6340545 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/stx_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("c716d0316e7115d4b50b04c3f923b22c43068fb2" . "de91880596de9c821e9e2c4828b024d42f6a199c") (collects #"br-parser-tools" #"private-lex" #"util.rkt") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"main.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"rackunit" #"main.rkt") (collects #"syntax" #"id-table.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/stx_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/stx_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..7101f6ff019cd60f59e7a7836bb675f59e7fabc6 GIT binary patch literal 26859 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 A?EnA( literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/unicode-chars_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/unicode-chars_rkt.dep new file mode 100644 index 0000000..9757e03 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/unicode-chars_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("11fb7e214dfb048796bfcbca53932424123137a2" . "b3606fa90704340e1a962ec5048ec3b01f440e06") (collects #"br-parser-tools" #"private-lex" #"util.rkt") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"main.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"rackunit" #"main.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/unicode-chars_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/errortrace/unicode-chars_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..66780ebee7a538d89a22daec86232340cdb89eb5 GIT binary patch literal 10830 zcmds7d2n0Dd4KQ2wZP*6k|4kfq(H*BND$yDijqi(q9t3RLfK9n+YL#B*nzVH&pK3Er(x%7M$uw=#P9|w5nW^a}?ew?% z9)L%JbmHW{Qd+*{?sx6(x8LsmcDsJpG2A=So9ykMv`UiXL$VgswL;xOE_*7ow4PVv z`Solev!Z?lbsY{#8U@J`lC4PkckPn2u1L~NC@B7Pg7AKK@h?fLN48Srhf#X3y-d|r zGUl!Ce(j@EZ)^O=Q(qsrI5Rl;J8Pb)FFv;il(Hl-sYQxNz0#mGA{~$>rJJRk^xM+i z(u2~sq`#5=UV2sff%HS^XOdfPk;C$&d|dv4~FpIy%t)FWNjoKf>xby@MtjrsJ#8MTlw z`Yf)CSNwLn{ml8^{Fwqd{Pw!KMfFrBtH##~`SpcDvDo1_mCG0ZsIOP^`CPsLd20NO zdXbm=<>qo>qMVH{XXce)ts@+C+rq&*Ycy0pLk+Zm!`Wam7-G7rxdd73q9q55Ep{2*wW4H_o0 zetT{0N)FDmws2ZqQT0|qRk4<_mCV{gMX}4J_l!}Yh254(y=26>6PY%&pHatMOCIx$OGNIJKTovk(YrOL;Y2Q1jF( zHx-L?CN7NgFR9de4E?eWcJxgqORYz<>iKwjb#?h7B$x7W^yvcRH1d*)A*9x6Q@K8@ zMj2fGd@jFOlqffWaC9NJysR!1GP!L0R0gV7(}mLz-mtAsFAlZNz!f!Of)0^q3~>%jd1J2E!xT?g(|EvW5&h#=kndGorR@{=OwRQyN2?+>0R#>e#o%j{# zh@RBKVT07tPBn6UCYve5`Er9mc}~rzm(>IzTCUJDsAh(iOT&K}*6iYPr#JtL2R4y_OGJ9#f$a*1N0^S)aB3mG$4P4Yo`2E+7n?!20hFTiDul4FRhtLmaIWeOon&6^~wu4fkt z>uC`jbd@L8F0RbymP<6#g-iiK!z6Kf9Rj!Lm_C0x16Nz+tFA7^kNINhkY;RkTQ&x~ zy>df&4IWKrv$+Cho!|bZm+r%h>T>$x#BwgTI)P4D93LCcOq|Xvola#=O|FXY&&$^) zdhv5D@5K0p@k8p_am;J<7z7@x)bA=FPUr&s0|)2R#N#}U@mCG^A?7akfa#vc)e>|{f@Ks2(`FpY+WHTd61 zaIZBS!aUy>+=pGpC}PKcBV3F}XfjGiiNc}%JbWC8&_tB3#s1@fjqfE6@~DM%4EqnB z_42H{jjVKtoJcMt1*rM_cDlk8HHsl3rBA55}m+Kc5_J zQfQXKphf|w#eWKc1{L@f;RNkq#XleO53oP2Vs|;(%GwM~sB9l*_f+@2?)`w(_agb8 zr<-Se&&y@PqAj}o4q?hHMGd2P4tsglG0YyXW{*;v?*;jF?~VBHdr9`asLP4+=9L&Z z`5xBCK3BtHub;fs9gBfy)BB7EpPT1=S7hIYN&ObKz$p7{t>B8rVjG-iV@s2Yy#o!M z!|V|^YkJ-L$4=i%B$^}45WUCiSu6X3yMGf6F4l`tFn27-x`x?@>saUioV*m@7klBw zmtNlVe${gI>Xv41djG`Yd&Q(f^t~7y1tP9NTfbbtA0iU_V!oGU-z&23s_gqq;-Y-t zlofMdW6%Vn3yk4m_QeLyr>lNNsCJd9=io52hqLR;%i~l#!M_;yIf~srOWhdxSuEk) zdH6`R8J;i@WlvbygSBm&-rIZ|k06%?XBj5*jtyUdXTee7<=9>x^; z^WqeFK`u_Uc*PX)?Pr&q!q*d+AusDQJ0soWdo zrea*-Ut(wjlrTk{IUaF}5vCMH0_Yixu!tcoee9CLo@MaIzJ0N)ue|W$ruS*j%g>t! zdtjCZDFN4wu^_wLcyQDAoGAj7DF$j#WGnBfz?OBx;QAMGC$+MC$#HL@<(_bn8-6^xOn&>|-IEVXP` z)Fnb#40FT7uH$?5o~Xw&d&@m+PdJGMQEr1W^+KXzTP758eLAP|eVGEc`Mx1no>QDS zMiE)~_9Ji|IRn>|D{zdIz;UVyOi^{<1l0uILbZWuatBUQUEl_)58Ox%ft$z^cq=sq z-c~x>++04}MBMf5)V#~thH6naRo*soXeY8EVIgs~`|S-4#iJXJ%>YRB6Wx??dNaxt zYEiD#VN+0py-5T1EA`l~RAG z1V$tqzh)QZt9I==EfDe!g>?u+S!;pk|I4spIe%-&^Xnwyi|0?z^dZhQT*;+3(saz_ynDfWe`l$YpX9uIu~%@sF)rcVj!S&^BUisS z-`#v?=PMs?|7!D3z3YyDaYTx^M77i*#ib#j5{IShr4!N(z$Rt@nSVgKNBX?&b*o%2C**PYhD4;{bKEM~;BY^e}gQiL&WOoAEImTVAH39AB;w?bC5`Hs4dr|UEKzmsQ z)s~DPcPYCaXfM-&>k=W?Sbt;dtf)9J+K4Nu9s~E+F{5xFue@42X+S9 z1EByA3Akt#DZx%BckN)8OMHR?cE5%@EP!zgBC=-Kox|nD((SN&xel%rG05ObrEFa} zTWgY23A+nPm~Yo;I4${tAsu!PiCe8&!0uIBVRs+`fCi-((d{r5pS47b87%{>Jkgb^m^o}sKMW_>JeX<&W zeY+8d3=D2hgo05D?Eu*~?*`cms|_iLX*Rz7(_#B?d20)1+*a(ewFOMS4Ymj6ud)|? z)3AN@8!wMF+m}brW50N(%_E<9b$H?@|9#^h-S!vnQlGrBygar_0RZ>?(y##Tr=*j( zQJ$0DDcvdECEYJQDt$?MN%{xr->^g~a;qH2@_2*%4q1~QlAn>Emp5fA(8YEfMUw!M z_R|D_zY~u{K)c)j}X0=d3@q{+HEi3)&*K>ugiD72D%jaz722zPLJyCAR{nhxb_|wwyUtP#1fX@JoG# zRSeJd&l1zU*UEj?NStN|5Wf=g|NjZ=AK|AeoE;0l&bGjhy9Is+omkE-h${yODc`$s zrxzD~e!t!6#0B`m8S&?yHy;j64+lB{JRqYI9NS^Kpf*v12fH491SZ*fAJ824lyJdx``Ng~nj^L2kAqG;Umwq@r{fo5)m^FgT?FtT`mQ zOTSDwq#>$|1SiC0f~g{SxLPpavLQi}fgA@d~nli5JWhEsW!|$86JM! z`yT5?-{rwKx)JA-DR5nBeZ79rbS+-fPVKv_uVlj&#I*6~BAZ^p!;Q>^_0=AJLEa%p z&f%Ug&7X7R)l+I-<&Q$f4C1xiI$m`o^leOR!=^wW5_rbcJtm-2cEW5uTjw8tVjGK;qk;E9=XC9sQ*k$t_% zkqwyDB{%7BVMdGFQvQBKUBolABYMT~;Km%MYpx)Os~7ldsX~0C6-I73O>`a;Z+7D6 z(#z}W8heg+8M=Ar&50#26?jYFr17#qCR+qU^-JFt*!cM$ZwojG1yB?~Itl=ddVJbR zE!NEwKivb)YSQo>h?SjejzV*YC1F6iPM)|&M}iXxjeneNWP}WHZoy z{inc_@4NThv)tv}^Um+G;~qy}q(9OT>Dp(NB*}}%nu@Qb%I8*=7ZPXIlksqJeL0m_ zieK_clE)!QgCIGB$Ce@el@>`_tC6G$RAm0C1!1Zx^Cn3ZC~mG!4YNZ*%!ApO1Mkjv#pd6zsQf8X*qmNo0$*0gmLTDL%=MYbiD*H$}@7nnJ+o=Pk> zxLlJ&*Vs5o0}u)AEz_?@fCmGfJuw6rom8$Xj(>ELQIfqk%iX3&sHB_>7=$5L!{ zD<<)!*|;&gCi2o!zI4p%U{mArN^&V2OD0lc{>fo#tg2d#CovjJv1P1~vrwr(s>_vH zSq*P$ao6k*Cu7U=D@)`%GQYAuyBH5IEUqlCFAbCLXnYwA!R<^k9!tfO2O9bArI2**}e7w-b+Y&ncEodch0UQ;lI(JDW-{$!(UGy!V+!ZOEf4J zA&L!lhXdWP8V_WosA-qm;&ftgtFS$tPUoYVv+C|gNmkvm%Pm#;%KD+6-~hK{h1M>o6F*9m zb|S5+2C1cyO67{gav~MxrwknB`FJvRCLY?58>#4E)*EXZlAzo~gk`v};<`d^DHu}S z68{eZ+!Fs+RfEO3vddI<)72A?1l5p}{|Sa%)8yRNqhk5Fs0hZXPSaWR(!eW!Gy2qp z=f3>?r|)|BpPjzJ+n@dG_hrta5~*BLa2jb+moy}umS&_or1R3f(!59lm#*MM z`kwR;(tqGQs**MNcKMuqNq$^@TK=5;lKhYIf65XK(2aBpO;dtaDMfeFyXk%OFny3d zLcc;!(WmIM^jq{L`Z8UiZ_rEh2lQR~Q~E3V5&aYW3;me>jjqv8$!bw7yDj@Ihb_k} zrz{D}Ma%D5{>1XKrPsR0I&Ph_-eG;a^)c(?)=yclSpUrWx7Ht9U$<7;nrxb_+cs{S zvn|;!*e=KeAQWd+kH^ci8W@r|rLBf5QF=`?u`hwZCltk^RT^*X(h} z2OV~H5BpDc&iSPCqb_^#>&0&?MQ~7=J6kg+sq5(cN_Z`?w2G}8zjHlto-b+f?9&&h z>(FBSVmLNCn~a~At8?Y>nRv>mKAfu^KFG^BA(z)gttf>T1P@UjKC~1&7Z1kfM`$KjZ% zM({W!7VPZe%G|joY0}1cFu|RGT$ww!2V=|2D=F;M2K!q+?vLcy@bKXJ+rGih*kWQ$ zKPBq3ho^`@4&}yIu8Tw>`O(Q>Utix~Psi46(a!F{-rjsaMD@c9+$?z5Id~n@Y208p zpYmG;3N0qr%#UV+hw!2Py*S=SQ!yM|2gR(Njjf&Cw-{TRosaFsK#b0=Cl==q@Y--P zzAyr7B71Q@927Nc@szTEPG1Bg{ADCIKi@e5Z!Pg_G;lagV>Ip`v#NpdNjl;`f_UyIy!0`{F`o+3+cdhB zNDUn0j{10zZq(>zM0&?I%G8c1llb8vJnShuHh?#(x35c11mc0>bjawNN_Q)5V57u3ec?KhVh@uj$Td=gvwj&+@3yY1=wjPnObx;nq1H?PTw1 z?#ghmU<&m5l}`5F?ntKIifPGM<;imP>a;^q_60{qIRquSpvA)1FqSf3!`V>bm>w$p z)N^}P=_6rP^q$@_t!%x$5zYIxQT!cH)uNNXYww zjNxik+h6m%tJnqaIUAdA)`MjlObO+WiMYt?5lQx#<&V`06js^k%& zP4(;y1tzB`GD)p7)J`geD1v`$SYUvCrj*_06O^r5sCpJ8yq-0%-!6^3>U|!n<{ERI zYnZx=eYlL(zUH}1-Yc^AMfv&P6@)>~Wro_glxfnOT=XP`@gM%JVg4}tjS}_|dd>3$ zVa&WQP*v5;&5yBWwWrnXkZa+@aZHAB-nM5B(!uWNU}qot?u@d>O4(gSe`&SZEy_E+ z8(b_OGj6BKsh0+(Xpq8F)3j@fmv2Cs1~7g( z0(7Av<28&(mJjVQja_bL&sgfOdT#YTPd80t>0qJfrbdVY;qgB9x#k|M`e3hyg(K*% zm~_jDnWjN5zL%otcA}p>rm)CsSkOHo!4=!AdRA8%&8(3i%C;Qk3S~{+J zCSEM)C>XOk_K}vp{GNJ~!k%n_rV~0_F(Eml1@}{J>~k%wNjLVY=h><&S6;~3k|W+U zLZ{oJx#;Zi=8MoKh&n(kh+KS)z~kG*n(*vPEnS63Zh4# zr|8u**nZ<0qO|s<+4eIDq}z~SJLhPIk)2f{!oeOkLwz1#o z?&A}Yn@fFnpskzT-@{i_rq$TwInmQ}V2bvO%`6sJ@&=afVSTT|h=CAaE8Z80`_ixK z+{H!a_$BQ;*rd7Mv z$sX-xk(?$kyzrv2Y`^;TNBi^g4MR?(Lx?Oq&Q)$Brrb_WWr~WFX>utuRIJQWi84o} z$~=`RadImQRIZ$%3gs+SDhaAm?x1Sr9C?&Q@+wQ1X+2-D+;7TPR3R?eCSO4nnV1Cu zhZ`Y=6M;fGLW5$2a%EJBNQS2u#aD&+hG{q)TSOX7uW?F_HlJc?z zagN%mg^e5$Aq#S++omLyH6^92E9YGh;Myzz>G>T9s8yC?4TSyW6F05>?#_neeT{_DTo5+b2s5U;k}=9@<5(L6o3KGNp8<^64{ ztIp+l5LrUxGF{GBJ)d;BswY*vBRahzzwUAHxb6k+319O(Fo7m%4PWT>9*pngDq9AN0 zPG|+;jLM$V*h7Nj{hY8bL)eNV$0}JlVHF5hRQB6l?0%u&1DtRmI7JRRI7tWda*jtP ze|OI}KV1G71HQ38s+rmMzCQKx-v)Cz$0o@ywMjhy2=8|2jo6^NFI~V$jh?bT5heeHX#rAIqTP~UjQEVOC~&Qg!`K9 zL9r?BZ;`so{4D^^BM^ z%|lK8MuDAiu)tuzix~z@X=)~~zgb{sO$JSIno!&-CB|W^OsfeyGgq6lYCtO93U-#^ zycKqq6G3HJCCHsE=3{3$dhVx8*cn&Jgq`U!socaUhn?jy$zf;ah63ztb7LNMW^UXD zJ2R7P#?C~G2|H8ru`{IrJ5$~OJ5x4eXNn0sQ}VGhWjpLl*#bM$>o#L&P$Ul@%VB5A z*4UX6P>}n=5-lc|zs1Rywtq*F_~REy+D^V;fpuXLQ8cA%fn()r^O3Y%8RTLgA06`jR$;sWUJ;OaTVJ{wm{zUkT_6o z6NLWnkhqdJ%#%}TJ`(rpcRuvRXZr47_r{<4xtkI%|H<)R_s>6&I~6OW8r%(O#@W~^ z_2F#XjkEEnG%1}GC*#jcPe`AXo|QJFKa&1RdIgA_RrbiL+=a7oRNgP2kSFD&{G|M> z{4M#<5o_I_(-2@Zs>hMFM=bkc!VoI{r@py@sQD zq~9)Ld0cUTr^!M2eA9_&zp26Qbc&R>cvauJJ2Krx()L2wnBc|%+1TQ+exqr4%|O%y z>?JTX$=(XkJ<>5U7n@HCz-v?>kRtIsB0gX)4i5zebwJCmUtMqrr;3kJ?nm+E$vrE) zA-}``grJyqA(1x{*d-csE3cRX2u0)y+>oZBH0@4f)9vvO`BeXIuj(HL9JXhY_WJiC zVjF=29fiZB)BNW)!&e?QfH8|2808@y(k1-<)4qBR`Rs=iZ$i)^yBRQw6Nti2kbhUz-X{7PM!88ephXRMv08RGz4+~uF&?Yfs5HkibV-Pb2 zF=G%j1~Fq0GX^nZ5HkibV-Pb2F=G%j1~Fq0GX^nZfiWEE5Fle<$5Dh-nH+&5X`nP1 z;6whS0yI359Uczh9K-M&!|)sn97C5QbUbjJcPkE@!0Ub;36#kiIF+V}NjmDE@T4_N z9>x;mcRX;KA8ZE{+ti9QwSfJ!zHTRJ0!zwRo-|{=+H;-#p>K>Vcs8n^ z@cucw7MKT1vDimdu!OKyv%oo;M+RdDYYVY^%UQdB!2xVBk7mK335VEcIn7yCNORVp ziG$AF57p~nni=AGsM1B#b*7>u0on+gJv|uF8g-*SBnct zRt=JUA@&SNk|l*CNrPm6h+V4Rj_KHH9w;MEZjeWR{{TBJ}sVpSA#~?~*?9q1C z;Rmc#Nc1i;s4j%qFZHp#{`;u9km|k+)x{9|Xp~*D0B#MM(?J8&AHv$Xi|u5;)*s>U z$Md1rK%<2o?a9lyZo1*c9Vt?-&B`PxNV~Quv236@+ha#N9jpzSXf74r z@QDPV>BCwZ6E{-B=VOcO@iq394T+FBL=rlRRUcDdJ68vjv2`r( zR^rMTC83;CmXsCcPGn!#l?zCb{*3Yt<(){UAz5Zb`}nGWGgYXi6;poQ`*+nG-!syZ zxrH~06Kn@-jk3?UyI(~nEEK|zNLCW?Z>=rF@$qn|%9}os4n_Fm1VL-CswR!U2JC0x zylvCeJVoJYiUhT3YIk;YaA&9qXJ~?z@~Jpcl%>mABP51`TD4%%EQ!o?n`=7+x~FHb zyNmZ_&Fpe{PtgxLd>paw(D2jBFE_NRH~7G-P^&t2;*qY-koRkH5fG6gWKla@t~WMF z19;u;Y;T9WuqHhBRt6bVoG8lftuPy;1+Q;VuWnEn20dB z&rp!hP(%~Q%vJ^&RGcWvKD)`Fpmu$O`gDULFzDTtFesRBkd|jqMyo=D-e88NIjA3| z2>#-hK_{Q6p&_W;u8E^@vt4FllyMnA@4)G!?8!=YQeT9?y9i$Rl*$WTo!7Uuf3T|? zOgfmCeY~o-=m$gjwuZ8{7U*E;Txj*s_S0x)VptvIR(ERRuzyol2RVI|Jygw3{LifJ z?a;06g4LHiTg`Cmb*v5!ZEba#+jRe65+OF?$ZqzTx?b+2`nZ$o70G?GC*wpT-RzPt zM-<)KQB9If1@R~@NceV{h6?q(I?6uf3qcUBL*&n5n{E$hP^dWWL2v0sa5Qsq`!pUv zZ4#&O>L`0py$}~I5EssfQ{Iv|8=u+z8V|-ciR0GokFv*gafQ}JGU9B(LhFLtTgSy6 z(0E|CNgTKCK$QLFcGk6L#3^q{oDG>ec2MI%;wEw2x`R>nV8b?Z*O3ut(+aKAwy|!8 z>fl{sQ$cM?)24#diOnXmQ9Y=h;nl&=RIqhQMdc25v!=(TCcSh9vl#}0n9b{ax^dwL zoucenKa2D03;q25j3LUP1nV|W!s)9v3v1)+vW=g0ZQ`tJ>(p)AS{P@6{8_%nZG05E zO$XsOWt@fEj|0D*gomqqnYv61ss7B1VJv87+jJsmbrIKv_&42VvpEeX2_XW_^1=N}UY?<7P!pqu-ck1JQT8Fy zhojo)!>>jKJNRwFtw*G*bFhn#$X&QFb-906(aSbmm(m9^*s=XUc6I69?nbvu1FRM! pc|S(7dO=tNbu|&BnO#d?c37`#QAqe06R&Mn^>zQ}pC$o0{5M(}iKGAk literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/front_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/front_rkt.dep new file mode 100644 index 0000000..061ef75 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/front_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("560290907963aeb1a4cc1e997b45b3113174dcc2" . "53517572cdb75487afeb2fff3000f8f73fc998aa") (collects #"br-parser-tools" #"private-lex" #"deriv.rkt") (collects #"br-parser-tools" #"private-lex" #"re.rkt") (collects #"br-parser-tools" #"private-lex" #"stx.rkt") (collects #"br-parser-tools" #"private-lex" #"util.rkt") (collects #"mzlib" #"integer-set.rkt") (collects #"mzlib" #"list.rkt") (collects #"mzscheme" #"main.rkt") (collects #"syntax" #"stx.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/front_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/front_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..381dd996b648047f3068f25890d62ac65def5372 GIT binary patch literal 4002 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 JuOO(x{{hOV^REB^ literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/re_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/re_rkt.dep new file mode 100644 index 0000000..188b6a8 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/re_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("c35e7c257a2700b22560bd1ef8fa4ec0d85440cf" . "b2bb34be5f7b01ff900aa10ee415738b2a19b0a0") (collects #"br-parser-tools" #"private-lex" #"util.rkt") (collects #"mzlib" #"integer-set.rkt") (collects #"mzlib" #"list.rkt") (collects #"mzscheme" #"main.rkt") (collects #"scheme" #"match.rkt") (indirect collects #"racket" #"match" #"gen-match.rkt") (indirect collects #"racket" #"match" #"parse.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/re_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/re_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..6a38ffb2b740d9b81240057540412c33e8ce9dab GIT binary patch literal 13780 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 F{{e0-kJJDF literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/stx_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/stx_rkt.dep new file mode 100644 index 0000000..60063db --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/stx_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("c716d0316e7115d4b50b04c3f923b22c43068fb2" . "b47d873be742873e79b0099de8845e32143ab4d5") (collects #"br-parser-tools" #"private-lex" #"util.rkt") (collects #"racket" #"main.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"rackunit" #"main.rkt") (collects #"syntax" #"id-table.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/stx_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/stx_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..ddab7d173fee73fee78533c5fcf30b82773542f2 GIT binary patch literal 12853 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 bSf6xk1JWg>WvO7RP*!1DR$&A`T^ITbVGucT literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/token_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/token_rkt.dep new file mode 100644 index 0000000..ad043d4 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/token_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("c47b01af4f27383fafb3cea5d0e14b2b92da094b" . "5a9e9888caac8c6df5e32eab1eb77a9522bb1097") (collects #"br-parser-tools" #"private-lex" #"token-syntax.rkt") (collects #"mzscheme" #"main.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/token_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/token_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..334c9f3dfec98256b9919a8690db31cc1477cecb GIT binary patch literal 6679 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 MhfxGY&1T8`Kjhb4EC2ui literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/unicode-chars_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/unicode-chars_rkt.dep new file mode 100644 index 0000000..295fe56 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/unicode-chars_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("11fb7e214dfb048796bfcbca53932424123137a2" . "d1e63a1cc4d040c9bbc9481d0d8c6d890f9d2952") (collects #"br-parser-tools" #"private-lex" #"util.rkt") (collects #"racket" #"main.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"rackunit" #"main.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/unicode-chars_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/unicode-chars_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..5b8e8af03bbcd324674ebe6322a5a78ae607802d GIT binary patch literal 3964 zcmcInTWlN06`j4y$1YcvRy4(xMNu*>TDx3{4^gx#3w9Jcs*^Yltj2|r6d)OjTuFo| zk|CG29Q2U}eF06da^ch;&9hC577c0?MIS+n7LF;)FQi{afflL#QRFX0^HG#4(4u#i zq)du-`qM7BoS8Fc?wz?abMM`eFWRR<)1gQxI%gq-NcdWGt*rN^3;D(DQl+E?OO?Ey zUDb%4kU@r!8Kf-XYi&{oIYOSr&Ql09pI4EXp^V1k#IjT5%ZT!1I5^&Qudiys~N>zAoKWOHPIDC7t>{)8{fShM+ZF>oYJ1=Gu^ zQrXM&l~U;yO%FHL6RZyq&Ifqc^XGw)MMe;b%hNL*2S@-50IXLKup!{X^Z4fo%p0=Y zWDkMm(QT!HDiMjI$|9jZW56vmYXmho1r=4m4xaXgf@V(>}hMDi*a&-DXcLX?ndDTr8AMqzkLX zijD^&m0!}zCsVoNa%w@-v*{+1E1cCz!E~y;&8eWUc0|wWIoy(aoD=!Vs#e+-@?`nk z>Ovv6-DaG{Nw<#yjE@$z~7E|e_-s20oRDPwwW}Mk_f$p|m zD&!j2Fo|1x+s;R*w4x7gxxZnNu7PwFPA8tl+FV9otY z7Z#_J(gq_{DIQSNDn+X(<7d2d9cm~9i+|0p2dC7{Yu9ho+`ndT-D(qAbN_~wZcnJHdJkzo7<_jL;{su1) zBHEAU3WXw?YG8s}7r1vh;STZbM(&ha=gNVZCKYGujLO^#7S0eU&4o0jAyQVtQPGa8 zadH8fJMZF_C__R=6{eQ(D>rUG|89PO|i+6{k zA$QU8ZC36GRT!9A!sW7yx|Rt=?(H!et37UckJ0T%SECEw#9X*RnWr!^~1qJ<2y|`!zu=6HKMvCW8P3F=u0D>s<`?M zEJLaXS(vxs9`m$176{-UW@6pzV{+8fmjq`Lukh{!xOn;waP#ZYF%@%N2WE&4%trB} zr&Cs6BB_iC$#6{Y^rZ|%F;vxvM2u+Eh{dRyajItAR5Px$tJxlj>UIvL+9zAIVCnHI&@AW^($J~c%;W^#jfc5m?$RhX=lHWv?Mo(=aYu4`#*sY4P2#kZ#`KKA4RNx; zMY+kHlMZZ8Iysk1tuACzap+6H?&LB0otD+|I`mE83fiSopiS%p7L=fQq8VTR15mr+ A?EnA( literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/util_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/util_rkt.dep new file mode 100644 index 0000000..b713025 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/util_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("54744a008c8ffd6704fc954ca59351a6f19774a4" . "04b200a056cd736ad4bd3d7221f381755cf94607") (collects #"racket" #"main.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"rackunit" #"main.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/util_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/drracket/util_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..0ec59f0ce17d6b327ab5d5e4b99581a832a46b72 GIT binary patch literal 7395 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 URWmneg{<2wVj3^@1~X^>A7Hb#c>n+a literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/front_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/front_rkt.dep new file mode 100644 index 0000000..9138969 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/front_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("560290907963aeb1a4cc1e997b45b3113174dcc2" . "11a0fde414e54b53f7c8a690972c091191515617") (collects #"br-parser-tools" #"private-lex" #"deriv.rkt") (collects #"br-parser-tools" #"private-lex" #"re.rkt") (collects #"br-parser-tools" #"private-lex" #"stx.rkt") (collects #"br-parser-tools" #"private-lex" #"util.rkt") (collects #"mzlib" #"integer-set.rkt") (collects #"mzlib" #"list.rkt") (collects #"mzscheme" #"main.rkt") (collects #"syntax" #"stx.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/front_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/front_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..0d2fcac97914d01e9627ea231d033b0e5b3cb86c GIT binary patch literal 5590 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 TaEUZAMo5AGfPu^H_PhTN_J~c> literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/stx_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/stx_rkt.dep new file mode 100644 index 0000000..44a4093 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/stx_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("c716d0316e7115d4b50b04c3f923b22c43068fb2" . "01788f46755b7f7a3e2f5a04be22246525bde728") (collects #"br-parser-tools" #"private-lex" #"util.rkt") (collects #"racket" #"main.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"rackunit" #"main.rkt") (collects #"syntax" #"id-table.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/stx_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/stx_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..8995e2e8682d63c653c7ed6d05535763888aa88e GIT binary patch literal 13005 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 bSf6xk1JWg>WvO7RP*!1DR$&A`T^ITbVGucT literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/token_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/token_rkt.dep new file mode 100644 index 0000000..ad043d4 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/token_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("c47b01af4f27383fafb3cea5d0e14b2b92da094b" . "5a9e9888caac8c6df5e32eab1eb77a9522bb1097") (collects #"br-parser-tools" #"private-lex" #"token-syntax.rkt") (collects #"mzscheme" #"main.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/token_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/token_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..e9ba2d5d4f48ff8479d99c902de0ebab34969641 GIT binary patch literal 7438 zcmbtYYjjiBmA-dNmXCC?eJu;g_^D%rbS3LyTegK|z~LFNftZ94LSv|~WvpULjwBPH z(-aa)$b%Ya(x#b#bP_U6+DWEECXZ&#q6EYvk73f8ACu-s(#bql*P5yz4p;Q=j^lhxA)oS-m~xG2g|#|OT%s9j;;SX_05yV-njqNTdBi~Kl;I2 zZp*ete- z>%}2)LVQ>}ExsmxApWPg04PLZCEN|)fQR8UoP!JS4txmz2A=~lc}%yN222T4#*{Z5 zG#xS>HGO9K($r@jG!L0`=7Z*Mn~#`Jnx8hGG5^T?iuqOZ&&~f}{+0P-^QY$Dnm;#x zVUCpTC_7O0VA(@uot9q9I?MMhr!D6!=Pg$)A6R~6`PA|smd`C;S}f(B@;A$`l)K39 z$REgk*25KVRa~gJUhz*AzpnVa0xG3SN2O93t2|kGw(`|Vsj8`}qiSu{_NvjU3swJE z_3u@`uPT#YkpD(LFJF^Clz$`NUcIq;U-j$Nh3f0oA69=_{oCr_R||HV-C=LCEA}z_ zKKmj2WA-QQXY4Q9&)NUhe#QQQ{Udv2O+$^hrmZGkv!-Tq&GwqzHRClWYhJGrgd_EW zU=qtx>D*-7>U?HzGTkUiQhzR=of^)^`M~;##NK3xvuk+Ux1Rrm(us-W29@2H7@taR z$|duv9G{|_XZw7fHi`||#PHr^J~Ek2?Mvj7k&)zRDxD0e<|IuS(;Mh7QXJT%;hD_j zQu$OSJ-{L9z1wxBZcbt}ui}w`;!Yn%tw>rAM#-4k5nar5$pi;Z#oAjYR4D|c z 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 literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/unicode-chars_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/unicode-chars_rkt.dep new file mode 100644 index 0000000..ec11321 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/unicode-chars_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("11fb7e214dfb048796bfcbca53932424123137a2" . "c85260e8066b06a6c7e3ad05f21848a935912ffc") (collects #"br-parser-tools" #"private-lex" #"util.rkt") (collects #"racket" #"main.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"rackunit" #"main.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/unicode-chars_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/compiled/unicode-chars_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..c73316f31aa178915359b027b8e91ff3ec017290 GIT binary patch literal 9810 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 `(char-complement (union)) (make-cache))) + + ;; get-char-groups : re bool -> (list-of char-setR?) + ;; Collects the char-setRs in r that could be used in + ;; taking the derivative of r. + (define (get-char-groups r found-negation) + (cond + ((or (eq? r e) (eq? r z)) null) + ((char-setR? r) (list r)) + ((concatR? r) + (if (re-nullable? (concatR-re1 r)) + (append (get-char-groups (concatR-re1 r) found-negation) + (get-char-groups (concatR-re2 r) found-negation)) + (get-char-groups (concatR-re1 r) found-negation))) + ((repeatR? r) + (get-char-groups (repeatR-re r) found-negation)) + ((orR? r) + (apply append (map (lambda (x) (get-char-groups x found-negation)) (orR-res r)))) + ((andR? r) + (apply append (map (lambda (x) (get-char-groups x found-negation)) (andR-res r)))) + ((negR? r) + (if found-negation + (get-char-groups (negR-re r) #t) + (cons all-chars (get-char-groups (negR-re r) #t)))))) + + (test-block ((c (make-cache)) + (r1 (->re #\1 c)) + (r2 (->re #\2 c))) + ((get-char-groups e #f) null) + ((get-char-groups z #f) null) + ((get-char-groups r1 #f) (list r1)) + ((get-char-groups (->re `(concatenation ,r1 ,r2) c) #f) + (list r1)) + ((get-char-groups (->re `(concatenation ,e ,r2) c) #f) + (list r2)) + ((get-char-groups (->re `(concatenation (repetition 0 +inf.0 ,r1) ,r2) c) #f) + (list r1 r2)) + ((get-char-groups (->re `(repetition 0 +inf.0 ,r1) c) #f) + (list r1)) + ((get-char-groups + (->re `(union (repetition 0 +inf.0 ,r1) + (concatenation (repetition 0 +inf.0 ,r2) "3") "4") c) #f) + (list r1 r2 (->re "3" c) (->re "4" c))) + ((get-char-groups (->re `(complement ,r1) c) #f) + (list all-chars r1)) + ((get-char-groups + (->re `(intersection (repetition 0 +inf.0 ,r1) + (concatenation (repetition 0 +inf.0 ,r2) "3") "4") c) #f) + (list r1 r2 (->re "3" c) (->re "4" c))) + ) + (define loc:member? is:member?) + + ;; deriveR : re char cache -> re + (define (deriveR r c cache) + (cond + ((or (eq? r e) (eq? r z)) z) + ((char-setR? r) + (if (loc:member? c (char-setR-chars r)) e z)) + ((concatR? r) + (let* ((r1 (concatR-re1 r)) + (r2 (concatR-re2 r)) + (d (build-concat (deriveR r1 c cache) r2 cache))) + (if (re-nullable? r1) + (build-or (list d (deriveR r2 c cache)) cache) + d))) + ((repeatR? r) + (build-concat (deriveR (repeatR-re r) c cache) + (build-repeat (sub1 (repeatR-low r)) + (sub1 (repeatR-high r)) + (repeatR-re r) cache) + cache)) + ((orR? r) + (build-or (map (lambda (x) (deriveR x c cache)) + (orR-res r)) + cache)) + ((andR? r) + (build-and (map (lambda (x) (deriveR x c cache)) + (andR-res r)) + cache)) + ((negR? r) + (build-neg (deriveR (negR-re r) c cache) cache)))) + + (test-block ((c (make-cache)) + (a (char->integer #\a)) + (b (char->integer #\b)) + (r1 (->re #\a c)) + (r2 (->re `(repetition 0 +inf.0 #\a) c)) + (r3 (->re `(repetition 0 +inf.0 ,r2) c)) + (r4 (->re `(concatenation #\a ,r2) c)) + (r5 (->re `(repetition 0 +inf.0 ,r4) c)) + (r6 (->re `(union ,r5 #\a) c)) + (r7 (->re `(concatenation ,r2 ,r2) c)) + (r8 (->re `(complement ,r4) c)) + (r9 (->re `(intersection ,r2 ,r4) c))) + ((deriveR e a c) z) + ((deriveR z a c) z) + ((deriveR r1 b c) z) + ((deriveR r1 a c) e) + ((deriveR r2 a c) r2) + ((deriveR r2 b c) z) + ((deriveR r3 a c) r2) + ((deriveR r3 b c) z) + ((deriveR r4 a c) r2) + ((deriveR r4 b c) z) + ((deriveR r5 a c) (->re `(concatenation ,r2 ,r5) c)) + ((deriveR r5 b c) z) + ((deriveR r6 a c) (->re `(union (concatenation ,r2 ,r5) "") c)) + ((deriveR r6 b c) z) + ((deriveR r7 a c) (->re `(union (concatenation ,r2 ,r2) ,r2) c)) + ((deriveR r7 b c) z) + ((deriveR r8 a c) (->re `(complement, r2) c)) + ((deriveR r8 b c) (->re `(complement ,z) c)) + ((deriveR r9 a c) r2) + ((deriveR r9 b c) z) + ((deriveR (->re `(repetition 1 2 "ab") c) a c) + (->re `(concatenation "b" (repetition 0 1 "ab")) c))) + + ;; An re-action is (cons re action) + + ;; derive : (list-of re-action) char cache -> (union (list-of re-action) #f) + ;; applies deriveR to all the re-actions's re parts. + ;; Returns #f if the derived state is equivalent to z. + (define (derive r c cache) + (let ((new-r (map (lambda (ra) + (cons (deriveR (car ra) c cache) (cdr ra))) + r))) + (if (andmap (lambda (x) (eq? z (car x))) + new-r) + #f + new-r))) + + (test-block ((c (make-cache)) + (r1 (->re #\1 c)) + (r2 (->re #\2 c))) + ((derive null (char->integer #\1) c) #f) + ((derive (list (cons r1 1) (cons r2 2)) (char->integer #\1) c) + (list (cons e 1) (cons z 2))) + ((derive (list (cons r1 1) (cons r2 2)) (char->integer #\3) c) #f)) + + + ;; get-final : (list-of re-action) -> (union #f syntax-object) + ;; An re that accepts e represents a final state. Return the + ;; action from the first final state or #f if there is none. + (define (get-final res) + (cond + ((null? res) #f) + ((re-nullable? (caar res)) (cdar res)) + (else (get-final (cdr res))))) + + (test-block ((c->i char->integer) + (c (make-cache)) + (r1 (->re #\a c)) + (r2 (->re #\b c)) + (b (list (cons z 1) (cons z 2) (cons z 3) (cons e 4) (cons z 5))) + (a (list (cons r1 1) (cons r2 2)))) + ((derive null (c->i #\a) c) #f) + ((derive a (c->i #\a) c) (list (cons e 1) (cons z 2))) + ((derive a (c->i #\b) c) (list (cons z 1) (cons e 2))) + ((derive a (c->i #\c) c) #f) + ((derive (list (cons (->re `(union " " "\n" ",") c) 1) + (cons (->re `(concatenation (repetition 0 1 "-") + (repetition 1 +inf.0 (char-range "0" "9"))) c) 2) + (cons (->re `(concatenation "-" (repetition 1 +inf.0 "-")) c) 3) + (cons (->re "[" c) 4) + (cons (->re "]" c) 5)) (c->i #\[) c) + b) + ((get-final a) #f) + ((get-final (list (cons e 1) (cons e 2))) 1) + ((get-final b) 4)) + + + ;; A state is (make-state (list-of re-action) nat) + (define-struct state (spec index)) + + ;; get->key : re-action -> (list-of nat) + ;; states are indexed by the list of indexes of their res + (define (get-key s) + (map (lambda (x) (re-index (car x))) s)) + + (define loc:partition is:partition) + + ;; compute-chars : (list-of state) -> (list-of char-set) + ;; Computed the sets of equivalent characters for taking the + ;; derivative of the car of st. Only one derivative per set need to be taken. + (define (compute-chars st) + (cond + ((null? st) null) + (else + (loc:partition (map char-setR-chars + (apply append (map (lambda (x) (get-char-groups (car x) #f)) + (state-spec (car st))))))))) + + (test-block ((c (make-cache)) + (c->i char->integer) + (r1 (->re `(char-range #\1 #\4) c)) + (r2 (->re `(char-range #\2 #\3) c))) + ((compute-chars null) null) + ((compute-chars (list (make-state null 1))) null) + ((map is:integer-set-contents + (compute-chars (list (make-state (list (cons r1 1) (cons r2 2)) 2)))) + (list (is:integer-set-contents (is:make-range (c->i #\2) (c->i #\3))) + (is:integer-set-contents (is:union (is:make-range (c->i #\1)) + (is:make-range (c->i #\4))))))) + + + ;; A dfa is (make-dfa int int + ;; (list-of (cons int syntax-object)) + ;; (list-of (cons int (list-of (cons char-set int))))) + ;; Each transitions is a state and a list of chars with the state to transition to. + ;; The finals and transitions are sorted by state number, and duplicate free. + (define-struct dfa (num-states start-state final-states/actions transitions) (make-inspector)) + + (define loc:get-integer is:get-integer) + + ;; build-dfa : (list-of re-action) cache -> dfa + (define (build-dfa rs cache) + (let* ((transitions (make-hash-table)) + (get-state-number (make-counter)) + (start (make-state rs (get-state-number)))) + (cache (cons 'state (get-key rs)) (lambda () start)) + (let loop ((old-states (list start)) + (new-states null) + (all-states (list start)) + (cs (compute-chars (list start)))) + (cond + ((and (null? old-states) (null? new-states)) + (make-dfa (get-state-number) (state-index start) + (sort (filter (lambda (x) (cdr x)) + (map (lambda (state) + (cons (state-index state) (get-final (state-spec state)))) + all-states)) + (lambda (a b) (< (car a) (car b)))) + (sort (hash-table-map transitions + (lambda (state trans) + (cons (state-index state) + (map (lambda (t) + (cons (car t) + (state-index (cdr t)))) + trans)))) + (lambda (a b) (< (car a) (car b)))))) + ((null? old-states) + (loop new-states null all-states (compute-chars new-states))) + ((null? cs) + (loop (cdr old-states) new-states all-states (compute-chars (cdr old-states)))) + (else + (let* ((state (car old-states)) + (c (car cs)) + (new-re (derive (state-spec state) (loc:get-integer c) cache))) + (cond + (new-re + (let* ((new-state? #f) + (new-state (cache (cons 'state (get-key new-re)) + (lambda () + (set! new-state? #t) + (make-state new-re (get-state-number))))) + (new-all-states (if new-state? (cons new-state all-states) all-states))) + (hash-table-put! transitions + state + (cons (cons c new-state) + (hash-table-get transitions state + (lambda () null)))) + (cond + (new-state? + (loop old-states (cons new-state new-states) new-all-states (cdr cs))) + (else + (loop old-states new-states new-all-states (cdr cs)))))) + (else (loop old-states new-states all-states (cdr cs)))))))))) + + (define (print-dfa x) + (printf "number of states: ~a\n" (dfa-num-states x)) + (printf "start state: ~a\n" (dfa-start-state x)) + (printf "final states: ~a\n" (map car (dfa-final-states/actions x))) + (for-each (lambda (trans) + (printf "state: ~a\n" (car trans)) + (for-each (lambda (rule) + (printf " -~a-> ~a\n" + (is:integer-set-contents (car rule)) + (cdr rule))) + (cdr trans))) + (dfa-transitions x))) + + (define (build-test-dfa rs) + (let ((c (make-cache))) + (build-dfa (map (lambda (x) (cons (->re x c) 'action)) + rs) + c))) + + +#| + (define t1 (build-test-dfa null)) + (define t2 (build-test-dfa `(#\a))) + (define t3 (build-test-dfa `(#\a #\b))) + (define t4 (build-test-dfa `((repetition 0 +inf.0 #\a) + (repetition 0 +inf.0 (concatenation #\a #\b))))) + (define t5 (build-test-dfa `((concatenation (repetition 0 +inf.0 (union #\0 #\1)) #\1)))) + (define t6 (build-test-dfa `((repetition 0 +inf.0 (repetition 0 +inf.0 #\a)) + (repetition 0 +inf.0 (concatenation #\b (repetition 1 +inf.0 #\b)))))) + (define t7 (build-test-dfa `((concatenation (repetition 0 +inf.0 #\a) (repetition 0 +inf.0 #\b) + (repetition 0 +inf.0 #\c) (repetition 0 +inf.0 #\d) + (repetition 0 +inf.0 #\e))))) + (define t8 + (build-test-dfa `((concatenation (repetition 0 +inf.0 (union #\a #\b)) #\a (union #\a #\b) + (union #\a #\b) (union #\a #\b) (union #\a #\b))))) + (define t9 (build-test-dfa `((concatenation "/*" + (complement (concatenation (intersection) "*/" (intersection))) + "*/")))) + (define t11 (build-test-dfa `((complement "1")))) + (define t12 (build-test-dfa `((concatenation (intersection (concatenation (repetition 0 +inf.0 "a") "b") + (concatenation "a" (repetition 0 +inf.0 "b"))) + "ab")))) + (define x (build-test-dfa `((union " " "\n" ",") + (concatenation (repetition 0 1 "-") (repetition 1 +inf.0 (char-range "0" "9"))) + (concatenation "-" (repetition 1 +inf.0 "-")) + "[" + "]"))) + (define y (build-test-dfa + `((repetition 1 +inf.0 + (union (concatenation "|" (repetition 0 +inf.0 (char-complement "|")) "|") + (concatenation "|" (repetition 0 +inf.0 (char-complement "|")))))))) + (define t13 (build-test-dfa `((intersection (concatenation (intersection) "111" (intersection)) + (complement (union (concatenation (intersection) "01") + (repetition 1 +inf.0 "1"))))))) + (define t14 (build-test-dfa `((complement "1")))) +|# + ) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/error-tests.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/error-tests.rkt new file mode 100644 index 0000000..bbccbe0 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/error-tests.rkt @@ -0,0 +1,81 @@ +#lang scheme/base +(require (for-syntax scheme/base) + "../lex.rkt" + rackunit) + +(define-syntax (catch-syn-error stx) + (syntax-case stx () + [(_ arg) + (datum->syntax + #'here + (with-handlers ((exn:fail:syntax? exn-message)) + (syntax-local-expand-expression #'arg) + "not-an-error"))])) + +(check-regexp-match #rx"lex-abbrev" (catch-syn-error (define-lex-abbrev))) +(check-regexp-match #rx"lex-abbrev" (catch-syn-error (define-lex-abbrev a))) +(check-regexp-match #rx"lex-abbrev" (catch-syn-error (define-lex-abbrev (a b) v))) +(check-regexp-match #rx"lex-abbrev" (catch-syn-error (define-lex-abbrev 1 1))) +(check-regexp-match #rx"lex-abbrevs" (catch-syn-error (define-lex-abbrevs ()))) + +(check-regexp-match #rx"lex-trans" (catch-syn-error (define-lex-trans))) + +(check-regexp-match #rx"lexer" (catch-syn-error (lexer))) +(check-regexp-match #rx"lexer" (catch-syn-error (lexer ("a" "b" "c")))) +(check-regexp-match #rx"lexer" (catch-syn-error (lexer ()))) +(check-regexp-match #rx"lexer" (catch-syn-error (lexer ("")))) + +(check-regexp-match #rx"regular-expression" (catch-syn-error (lexer (a 1)))) +(check-regexp-match #rx"regular-expression" (catch-syn-error (lexer ((a) 1)))) +(check-regexp-match #rx"regular-expression" (catch-syn-error (let ((a 1)) (lexer ((a) 1))))) + +(check-regexp-match #rx"regular-expression" + (catch-syn-error (let-syntax ((a 1)) + (lexer ((a) 1))))) + +(check-regexp-match #rx"define-lex-trans" + (catch-syn-error + (let () + (define-lex-trans a 1) + (let () + (lexer ((a) 1)))))) + +;; Detecting mutual recursion cycle: +(check-regexp-match #rx"regular-expression" + (catch-syn-error + (let () + (define-lex-abbrev a b) + (define-lex-abbrev b a) + (let () + (lexer (a 1)))))) + +(check-regexp-match #rx"regular-expression" + (catch-syn-error + (let () + (define-lex-abbrev a (repetition 0 1 b)) + (define-lex-abbrev b (repetition 0 1 a)) + (let () + (lexer (a 1)))))) + +;; Detecting cycle within same abbreviation: +(check-regexp-match #rx"regular-expression" + (catch-syn-error + (let () + (define-lex-abbrev balanced + (union (concatenation "(" balanced ")" balanced) + any-char)) + (lexer + [balanced (string-append lexeme (balanced input-port))] + [(eof) ""])))) + + +(check-regexp-match #rx"regular-expression" (catch-syn-error (lexer (1 1)))) +(check-regexp-match #rx"repetition" (catch-syn-error (lexer ((repetition) 1)))) +(check-regexp-match #rx"repetition" (catch-syn-error (lexer ((repetition #\1 #\1 "3") 1)))) +(check-regexp-match #rx"repetition" (catch-syn-error (lexer ((repetition 1 #\1 "3") 1)))) +(check-regexp-match #rx"repetition" (catch-syn-error (lexer ((repetition 1 0 "3") 1)))) +(check-regexp-match #rx"complement" (catch-syn-error (lexer ((complement) 1)))) +(check-regexp-match #rx"char-range" (catch-syn-error (lexer ((char-range) 1)))) +(check-regexp-match #rx"char-range" (catch-syn-error (lexer ((char-range #\9 #\0) 1)))) +(check-regexp-match #rx"char-complement" (catch-syn-error (lexer ((char-complement) 1)))) +(check-regexp-match #rx"char-complement" (catch-syn-error (lexer ((char-complement (concatenation "1" "2")) 1)))) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/front.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/front.rkt new file mode 100644 index 0000000..f74c003 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/front.rkt @@ -0,0 +1,179 @@ +(module front mzscheme + (require (prefix is: mzlib/integer-set) + mzlib/list + syntax/stx + "util.rkt" + "stx.rkt" + "re.rkt" + "deriv.rkt") + + (provide build-lexer) + + (define-syntax time-label + (syntax-rules () + ((_ l e ...) + (begin + (printf "~a: " l) + (time (begin e ...)))))) + + ;; A table is either + ;; - (vector-of (union #f nat)) + ;; - (vector-of (vector-of (vector nat nat nat))) + + (define loc:integer-set-contents is:integer-set-contents) + + ;; dfa->1d-table : dfa -> (same as build-lexer) + (define (dfa->1d-table dfa) + (let ((state-table (make-vector (dfa-num-states dfa) #f)) + (transition-cache (make-hash-table 'equal))) + (for-each + (lambda (trans) + (let* ((from-state (car trans)) + (all-chars/to (cdr trans)) + (flat-all-chars/to + (sort + (apply append + (map (lambda (chars/to) + (let ((char-ranges (loc:integer-set-contents (car chars/to))) + (to (cdr chars/to))) + (map (lambda (char-range) + (let ((entry (vector (car char-range) (cdr char-range) to))) + (hash-table-get transition-cache entry + (lambda () + (hash-table-put! transition-cache + entry + entry) + entry)))) + char-ranges))) + all-chars/to)) + (lambda (a b) + (< (vector-ref a 0) (vector-ref b 0)))))) + (vector-set! state-table from-state (list->vector flat-all-chars/to)))) + (dfa-transitions dfa)) + state-table)) + + + (define loc:foldr is:foldr) + + ;; dfa->2d-table : dfa -> (same as build-lexer) + (define (dfa->2d-table dfa) + (let ( + ;; char-table : (vector-of (union #f nat)) + ;; The lexer table, one entry per state per char. + ;; Each entry specifies a state to transition to. + ;; #f indicates no transition + (char-table (make-vector (* 256 (dfa-num-states dfa)) #f))) + + ;; Fill the char-table vector + (for-each + (lambda (trans) + (let ((from-state (car trans))) + (for-each (lambda (chars/to) + (let ((to-state (cdr chars/to))) + (loc:foldr (lambda (char _) + (vector-set! char-table + (bitwise-ior + char + (arithmetic-shift from-state 8)) + to-state)) + (void) + (car chars/to)))) + (cdr trans)))) + (dfa-transitions dfa)) + char-table)) + + + ;; dfa->actions : dfa -> (vector-of (union #f syntax-object)) + ;; The action for each final state, #f if the state isn't final + (define (dfa->actions dfa) + (let ((actions (make-vector (dfa-num-states dfa) #f))) + (for-each (lambda (state/action) + (vector-set! actions (car state/action) (cdr state/action))) + (dfa-final-states/actions dfa)) + actions)) + + ;; dfa->no-look : dfa -> (vector-of bool) + ;; For each state whether the lexer can ignore the next input. + ;; It can do this only if there are no transitions out of the + ;; current state. + (define (dfa->no-look dfa) + (let ((no-look (make-vector (dfa-num-states dfa) #t))) + (for-each (lambda (trans) + (vector-set! no-look (car trans) #f)) + (dfa-transitions dfa)) + no-look)) + + (test-block ((d1 (make-dfa 1 1 (list) (list))) + (d2 (make-dfa 4 1 (list (cons 2 2) (cons 3 3)) + (list (cons 1 (list (cons (is:make-range 49 50) 1) + (cons (is:make-range 51) 2))) + (cons 2 (list (cons (is:make-range 49) 3)))))) + (d3 (make-dfa 4 1 (list (cons 2 2) (cons 3 3)) + (list (cons 1 (list (cons (is:make-range 100 200) 0) + (cons (is:make-range 49 50) 1) + (cons (is:make-range 51) 2))) + (cons 2 (list (cons (is:make-range 49) 3))))))) + ((dfa->2d-table d1) (make-vector 256 #f)) + ((dfa->2d-table d2) (let ((v (make-vector 1024 #f))) + (vector-set! v 305 1) + (vector-set! v 306 1) + (vector-set! v 307 2) + (vector-set! v 561 3) + v)) + ((dfa->1d-table d1) (make-vector 1 #f)) + ((dfa->1d-table d2) #(#f + #(#(49 50 1) #(51 51 2)) + #(#(49 49 3)) + #f)) + ((dfa->1d-table d3) #(#f + #(#(49 50 1) #(51 51 2) #(100 200 0)) + #(#(49 49 3)) + #f)) + ((dfa->actions d1) (vector #f)) + ((dfa->actions d2) (vector #f #f 2 3)) + ((dfa->no-look d1) (vector #t)) + ((dfa->no-look d2) (vector #t #f #f #t))) + + ;; build-lexer : syntax-object list -> + ;; (values table nat (vector-of (union #f syntax-object)) (vector-of bool) (list-of syntax-object)) + ;; each syntax object has the form (re action) + (define (build-lexer sos) + (let* ((disappeared-uses (box null)) + (s-re-acts (map (lambda (so) + (cons (parse (stx-car so) disappeared-uses) + (stx-car (stx-cdr so)))) + sos)) + + (cache (make-cache)) + + (re-acts (map (lambda (s-re-act) + (cons (->re (car s-re-act) cache) + (cdr s-re-act))) + s-re-acts)) + + (dfa (build-dfa re-acts cache)) + (table (dfa->1d-table dfa))) + ;(print-dfa dfa) + #;(let ((num-states (vector-length table)) + (num-vectors (length (filter values (vector->list table)))) + (num-entries (apply + (map + (lambda (x) (if x (vector-length x) 0)) + (vector->list table)))) + (num-different-entries + (let ((ht (make-hash-table))) + (for-each + (lambda (x) + (when x + (for-each + (lambda (y) + (hash-table-put! ht y #t)) + (vector->list x)))) + (vector->list table)) + (length (hash-table-map ht cons))))) + (printf "~a states, ~aKB\n" + num-states + (/ (* 4.0 (+ 2 num-states (* 2 num-vectors) num-entries + (* 5 num-different-entries))) 1024))) + (values table (dfa-start-state dfa) (dfa->actions dfa) (dfa->no-look dfa) + (unbox disappeared-uses)))) + ) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/re.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/re.rkt new file mode 100644 index 0000000..9da62de --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/re.rkt @@ -0,0 +1,385 @@ +(module re mzscheme + (require mzlib/list + scheme/match + (prefix is: mzlib/integer-set) + "util.rkt") + + (provide ->re build-epsilon build-zero build-char-set build-concat + build-repeat build-or build-and build-neg + epsilonR? zeroR? char-setR? concatR? repeatR? orR? andR? negR? + char-setR-chars concatR-re1 concatR-re2 repeatR-re repeatR-low repeatR-high + orR-res andR-res negR-re + re-nullable? re-index) + + ;; get-index : -> nat + (define get-index (make-counter)) + + ;; An re is either + ;; - (make-epsilonR bool nat) + ;; - (make-zeroR bool nat) + ;; - (make-char-setR bool nat char-set) + ;; - (make-concatR bool nat re re) + ;; - (make-repeatR bool nat nat nat-or-+inf.0 re) + ;; - (make-orR bool nat (list-of re)) Must not directly contain any orRs + ;; - (make-andR bool nat (list-of re)) Must not directly contain any andRs + ;; - (make-negR bool nat re) + ;; + ;; Every re must have an index field globally different from all + ;; other re index fields. + (define-struct re (nullable? index) (make-inspector)) + (define-struct (epsilonR re) () (make-inspector)) + (define-struct (zeroR re) () (make-inspector)) + (define-struct (char-setR re) (chars) (make-inspector)) + (define-struct (concatR re) (re1 re2) (make-inspector)) + (define-struct (repeatR re) (low high re) (make-inspector)) + (define-struct (orR re) (res) (make-inspector)) + (define-struct (andR re) (res) (make-inspector)) + (define-struct (negR re) (re) (make-inspector)) + + ;; e : re + ;; The unique epsilon re + (define e (make-epsilonR #t (get-index))) + + ;; z : re + ;; The unique zero re + (define z (make-zeroR #f (get-index))) + + + ;; s-re = char constant + ;; | string constant (sequence of characters) + ;; | re a precompiled re + ;; | (repetition low high s-re) repetition between low and high times (inclusive) + ;; | (union s-re ...) + ;; | (intersection s-re ...) + ;; | (complement s-re) + ;; | (concatenation s-re ...) + ;; | (char-range rng rng) match any character between two (inclusive) + ;; | (char-complement char-set) match any character not listed + ;; low = natural-number + ;; high = natural-number or +inf.0 + ;; rng = char or string with length 1 + ;; (concatenation) (repetition 0 0 x), and "" match the empty string. + ;; (union) matches no strings. + ;; (intersection) matches any string. + + (define loc:make-range is:make-range) + (define loc:union is:union) + (define loc:split is:split) + (define loc:complement is:complement) + + ;; ->re : s-re cache -> re + (define (->re exp cache) + (match exp + ((? char?) (build-char-set (loc:make-range (char->integer exp)) cache)) + ((? string?) (->re `(concatenation ,@(string->list exp)) cache)) + ((? re?) exp) + (`(repetition ,low ,high ,r) + (build-repeat low high (->re r cache) cache)) + (`(union ,rs ...) + (build-or (flatten-res (map (lambda (r) (->re r cache)) rs) + orR? orR-res loc:union cache) + cache)) + (`(intersection ,rs ...) + (build-and (flatten-res (map (lambda (r) (->re r cache)) rs) + andR? andR-res (lambda (a b) + (let-values (((i _ __) (loc:split a b))) i)) + cache) + cache)) + (`(complement ,r) + (build-neg (->re r cache) cache)) + (`(concatenation ,rs ...) + (foldr (lambda (x y) + (build-concat (->re x cache) y cache)) + e + rs)) + (`(char-range ,c1 ,c2) + (let ((i1 (char->integer (if (string? c1) (string-ref c1 0) c1))) + (i2 (char->integer (if (string? c2) (string-ref c2 0) c2)))) + (if (<= i1 i2) + (build-char-set (loc:make-range i1 i2) cache) + z))) + (`(char-complement ,crs ...) + (let ((cs (->re `(union ,@crs) cache))) + (cond + ((zeroR? cs) (build-char-set (loc:make-range 0 max-char-num) cache)) + ((char-setR? cs) + (build-char-set (loc:complement (char-setR-chars cs) 0 max-char-num) cache)) + (else z)))))) + + + + + ;; flatten-res: (list-of re) (re -> bool) (re -> (list-of re)) + ;; (char-set char-set -> char-set) cache -> (list-of re) + ;; Takes all the char-sets in l and combines them into one char-set using the combine function. + ;; Flattens out the values of type?. get-res only needs to function on things type? returns + ;; true for. + (define (flatten-res l type? get-res combine cache) + (let loop ((res l) + ;; chars : (union #f char-set) + (chars #f) + (no-chars null)) + (cond + ((null? res) + (if chars + (cons (build-char-set chars cache) no-chars) + no-chars)) + ((char-setR? (car res)) + (if chars + (loop (cdr res) (combine (char-setR-chars (car res)) chars) no-chars) + (loop (cdr res) (char-setR-chars (car res)) no-chars))) + ((type? (car res)) + (loop (append (get-res (car res)) (cdr res)) chars no-chars)) + (else (loop (cdr res) chars (cons (car res) no-chars)))))) + + ;; build-epsilon : -> re + (define (build-epsilon) e) + + (define (build-zero) z) + + (define loc:integer-set-contents is:integer-set-contents) + + ;; build-char-set : char-set cache -> re + (define (build-char-set cs cache) + (let ((l (loc:integer-set-contents cs))) + (cond + ((null? l) z) + (else + (cache l + (lambda () + (make-char-setR #f (get-index) cs))))))) + + + + ;; build-concat : re re cache -> re + (define (build-concat r1 r2 cache) + (cond + ((eq? e r1) r2) + ((eq? e r2) r1) + ((or (eq? z r1) (eq? z r2)) z) + (else + (cache (cons 'concat (cons (re-index r1) (re-index r2))) + (lambda () + (make-concatR (and (re-nullable? r1) (re-nullable? r2)) + (get-index) + r1 r2)))))) + + ;; build-repeat : nat nat-or-+inf.0 re cache -> re + (define (build-repeat low high r cache) + (let ((low (if (< low 0) 0 low))) + (cond + ((eq? r e) e) + ((and (= 0 low) (or (= 0 high) (eq? z r))) e) + ((and (= 1 low) (= 1 high)) r) + ((and (repeatR? r) + (eq? (repeatR-high r) +inf.0) + (or (= 0 (repeatR-low r)) + (= 1 (repeatR-low r)))) + (build-repeat (* low (repeatR-low r)) + +inf.0 + (repeatR-re r) + cache)) + (else + (cache (cons 'repeat (cons low (cons high (re-index r)))) + (lambda () + (make-repeatR (or (re-nullable? r) (= 0 low)) (get-index) low high r))))))) + + + ;; build-or : (list-of re) cache -> re + (define (build-or rs cache) + (let ((rs + (filter + (lambda (x) (not (eq? x z))) + (do-simple-equiv (replace rs orR? orR-res null) re-index)))) + (cond + ((null? rs) z) + ((null? (cdr rs)) (car rs)) + ((memq (build-neg z cache) rs) (build-neg z cache)) + (else + (cache (cons 'or (map re-index rs)) + (lambda () + (make-orR (ormap re-nullable? rs) (get-index) rs))))))) + + ;; build-and : (list-of re) cache -> re + (define (build-and rs cache) + (let ((rs (do-simple-equiv (replace rs andR? andR-res null) re-index))) + (cond + ((null? rs) (build-neg z cache)) + ((null? (cdr rs)) (car rs)) + ((memq z rs) z) + (else + (cache (cons 'and (map re-index rs)) + (lambda () + (make-andR (andmap re-nullable? rs) (get-index) rs))))))) + + ;; build-neg : re cache -> re + (define (build-neg r cache) + (cond + ((negR? r) (negR-re r)) + (else + (cache (cons 'neg (re-index r)) + (lambda () + (make-negR (not (re-nullable? r)) (get-index) r)))))) + + ;; Tests for the build-functions + (test-block ((c (make-cache)) + (isc is:integer-set-contents) + (r1 (build-char-set (is:make-range (char->integer #\1)) c)) + (r2 (build-char-set (is:make-range (char->integer #\2)) c)) + (r3 (build-char-set (is:make-range (char->integer #\3)) c)) + (rc (build-concat r1 r2 c)) + (rc2 (build-concat r2 r1 c)) + (rr (build-repeat 0 +inf.0 rc c)) + (ro (build-or `(,rr ,rc ,rr) c)) + (ro2 (build-or `(,rc ,rr ,z) c)) + (ro3 (build-or `(,rr ,rc) c)) + (ro4 (build-or `(,(build-or `(,r1 ,r2) c) + ,(build-or `(,r2 ,r3) c)) c)) + (ra (build-and `(,rr ,rc ,rr) c)) + (ra2 (build-and `(,rc ,rr) c)) + (ra3 (build-and `(,rr ,rc) c)) + (ra4 (build-and `(,(build-and `(,r3 ,r2) c) + ,(build-and `(,r2 ,r1) c)) c)) + (rn (build-neg z c)) + (rn2 (build-neg r1 c))) + + ((isc (char-setR-chars r1)) (isc (is:make-range (char->integer #\1)))) + ((isc (char-setR-chars r2)) (isc (is:make-range (char->integer #\2)))) + ((isc (char-setR-chars r3)) (isc (is:make-range (char->integer #\3)))) + ((build-char-set (is:make-range) c) z) + ((build-concat r1 e c) r1) + ((build-concat e r1 c) r1) + ((build-concat r1 z c) z) + ((build-concat z r1 c) z) + ((build-concat r1 r2 c) rc) + ((concatR-re1 rc) r1) + ((concatR-re2 rc) r2) + ((concatR-re1 rc2) r2) + ((concatR-re2 rc2) r1) + (ro ro2) + (ro ro3) + (ro4 (build-or `(,r1 ,r2 ,r3) c)) + ((orR-res ro) (list rc rr)) + ((orR-res ro4) (list r1 r2 r3)) + ((build-or null c) z) + ((build-or `(,r1 ,z) c) r1) + ((build-repeat 0 +inf.0 rc c) rr) + ((build-repeat 0 1 z c) e) + ((build-repeat 0 0 rc c) e) + ((build-repeat 0 +inf.0 z c) e) + ((build-repeat -1 +inf.0 z c) e) + ((build-repeat 0 +inf.0 (build-repeat 0 +inf.0 rc c) c) + (build-repeat 0 +inf.0 rc c)) + ((build-repeat 20 20 (build-repeat 0 +inf.0 rc c) c) + (build-repeat 0 +inf.0 rc c)) + ((build-repeat 20 20 (build-repeat 1 +inf.0 rc c) c) + (build-repeat 20 +inf.0 rc c)) + ((build-repeat 1 1 rc c) rc) + ((repeatR-re rr) rc) + (ra ra2) + (ra ra3) + (ra4 (build-and `(,r1 ,r2 ,r3) c)) + ((andR-res ra) (list rc rr)) + ((andR-res ra4) (list r1 r2 r3)) + ((build-and null c) (build-neg z c)) + ((build-and `(,r1 ,z) c) z) + ((build-and `(,r1) c) r1) + ((build-neg r1 c) (build-neg r1 c)) + ((build-neg (build-neg r1 c) c) r1) + ((negR-re (build-neg r2 c)) r2) + ((re-nullable? r1) #f) + ((re-nullable? rc) #f) + ((re-nullable? (build-concat rr rr c)) #t) + ((re-nullable? rr) #t) + ((re-nullable? (build-repeat 0 1 rc c)) #t) + ((re-nullable? (build-repeat 1 2 rc c)) #f) + ((re-nullable? (build-repeat 1 2 (build-or (list e r1) c) c)) #t) + ((re-nullable? ro) #t) + ((re-nullable? (build-or `(,r1 ,r2) c)) #f) + ((re-nullable? (build-and `(,r1 ,e) c)) #f) + ((re-nullable? (build-and `(,rr ,e) c)) #t) + ((re-nullable? (build-neg r1 c)) #t) + ((re-nullable? (build-neg rr c)) #f)) + + (test-block ((c (make-cache)) + (isc is:integer-set-contents) + (r1 (->re #\1 c)) + (r2 (->re #\2 c)) + (r3-5 (->re '(char-range #\3 #\5) c)) + (r4 (build-or `(,r1 ,r2) c)) + (r5 (->re `(union ,r3-5 #\7) c)) + (r6 (->re #\6 c))) + ((flatten-res null orR? orR-res is:union c) null) + ((isc (char-setR-chars (car (flatten-res `(,r1) orR? orR-res is:union c)))) + (isc (is:make-range (char->integer #\1)))) + ((isc (char-setR-chars (car (flatten-res `(,r4) orR? orR-res is:union c)))) + (isc (is:make-range (char->integer #\1) (char->integer #\2)))) + ((isc (char-setR-chars (car (flatten-res `(,r6 ,r5 ,r4 ,r3-5 ,r2 ,r1) + orR? orR-res is:union c)))) + (isc (is:make-range (char->integer #\1) (char->integer #\7)))) + ((flatten-res `(,r1 ,r2) andR? andR-res (lambda (x y) + (let-values (((i _ __) + (is:split x y))) + i)) + c) + (list z))) + + ;; ->re + (test-block ((c (make-cache)) + (isc is:integer-set-contents) + (r (->re #\a c)) + (rr (->re `(concatenation ,r ,r) c)) + (rrr (->re `(concatenation ,r ,rr) c)) + (rrr* (->re `(repetition 0 +inf.0 ,rrr) c))) + ((isc (char-setR-chars r)) (isc (is:make-range (char->integer #\a)))) + ((->re "" c) e) + ((->re "asdf" c) (->re `(concatenation #\a #\s #\d #\f) c)) + ((->re r c) r) + ((->re `(repetition 0 +inf.0 ,r) c) (build-repeat 0 +inf.0 r c)) + ((->re `(repetition 1 +inf.0 ,r) c) (build-repeat 1 +inf.0 r c)) + ((->re `(repetition 0 1 ,r) c) (build-repeat 0 1 r c)) + ((->re `(repetition 0 1 ,rrr*) c) rrr*) + ((->re `(union (union (char-range #\a #\c) + (char-complement (char-range #\000 #\110) + (char-range #\112 ,(integer->char max-char-num)))) + (union (repetition 0 +inf.0 #\2))) c) + (build-or (list (build-char-set (is:union (is:make-range 73) + (is:make-range 97 99)) + c) + (build-repeat 0 +inf.0 (build-char-set (is:make-range 50) c) c)) + c)) + ((->re `(union ,rr ,rrr) c) (build-or (list rr rrr) c)) + ((->re `(union ,r) c) r) + ((->re `(union) c) z) + ((->re `(intersection (intersection #\111 + (char-complement (char-range #\000 #\110) + (char-range #\112 ,(integer->char max-char-num)))) + (intersection (repetition 0 +inf.0 #\2))) c) + (build-and (list (build-char-set (is:make-range 73) c) + (build-repeat 0 +inf.0 (build-char-set (is:make-range 50) c) c)) + c)) + ((->re `(intersection (intersection #\000 (char-complement (char-range #\000 #\110) + (char-range #\112 ,(integer->char max-char-num)))) + (intersection (repetition 0 +inf.0 #\2))) c) + z) + ((->re `(intersection ,rr ,rrr) c) (build-and (list rr rrr) c)) + ((->re `(intersection ,r) c) r) + ((->re `(intersection) c) (build-neg z c)) + ((->re `(complement ,r) c) (build-neg r c)) + ((->re `(concatenation) c) e) + ((->re `(concatenation ,rrr*) c) rrr*) + (rr (build-concat r r c)) + ((->re `(concatenation ,r ,rr ,rrr) c) + (build-concat r (build-concat rr rrr c) c)) + ((isc (char-setR-chars (->re `(char-range #\1 #\1) c))) (isc (is:make-range 49))) + ((isc (char-setR-chars (->re `(char-range #\1 #\9) c))) (isc (is:make-range 49 57))) + ((isc (char-setR-chars (->re `(char-range "1" "1") c))) (isc (is:make-range 49))) + ((isc (char-setR-chars (->re `(char-range "1" "9") c))) (isc (is:make-range 49 57))) + ((->re `(char-range "9" "1") c) z) + ((isc (char-setR-chars (->re `(char-complement) c))) + (isc (char-setR-chars (->re `(char-range #\000 ,(integer->char max-char-num)) c)))) + ((isc (char-setR-chars (->re `(char-complement #\001 (char-range #\002 ,(integer->char max-char-num))) c))) + (isc (is:make-range 0))) + ) + + ) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/stx.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/stx.rkt new file mode 100644 index 0000000..1104a87 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/stx.rkt @@ -0,0 +1,220 @@ +#lang racket + +(require "util.rkt" + syntax/id-table) + +(provide parse) + +(define (bad-args stx num) + (raise-syntax-error + #f + (format "incorrect number of arguments (should have ~a)" num) + stx)) + +;; char-range-arg: syntax-object syntax-object -> nat +;; If c contains is a character or length 1 string, returns the integer +;; for the character. Otherwise raises a syntax error. +(define (char-range-arg stx containing-stx) + (let ((c (syntax-e stx))) + (cond + ((char? c) (char->integer c)) + ((and (string? c) (= (string-length c) 1)) + (char->integer (string-ref c 0))) + (else + (raise-syntax-error + #f + "not a char or single-char string" + containing-stx stx))))) +(module+ test + (check-equal? (char-range-arg #'#\1 #'here) (char->integer #\1)) + (check-equal? (char-range-arg #'"1" #'here) (char->integer #\1))) + +(define orig-insp (variable-reference->module-declaration-inspector + (#%variable-reference))) +(define (disarm stx) + (syntax-disarm stx orig-insp)) + + ;; parse : syntax-object (box (list-of syntax-object)) -> s-re (see re.rkt) + ;; checks for errors and generates the plain s-exp form for s + ;; Expands lex-abbrevs and applies lex-trans. + (define (parse stx disappeared-uses) + (let loop ([stx stx] + [disappeared-uses disappeared-uses] + ;; seen-lex-abbrevs: id-table + [seen-lex-abbrevs (make-immutable-free-id-table)]) + (let ([recur (lambda (s) + (loop (syntax-rearm s stx) + disappeared-uses + seen-lex-abbrevs))] + [recur/abbrev (lambda (s id) + (loop (syntax-rearm s stx) + disappeared-uses + (free-id-table-set seen-lex-abbrevs id id)))]) + (syntax-case (disarm stx) (repetition union intersection complement concatenation + char-range char-complement) + (_ + (identifier? stx) + (let ((expansion (syntax-local-value stx (lambda () #f)))) + (unless (lex-abbrev? expansion) + (raise-syntax-error 'regular-expression + "undefined abbreviation" + stx)) + ;; Check for cycles. + (when (free-id-table-ref seen-lex-abbrevs stx (lambda () #f)) + (raise-syntax-error 'regular-expression + "illegal lex-abbrev cycle detected" + stx + #f + (list (free-id-table-ref seen-lex-abbrevs stx)))) + (set-box! disappeared-uses (cons stx (unbox disappeared-uses))) + (recur/abbrev ((lex-abbrev-get-abbrev expansion)) stx))) + (_ + (or (char? (syntax-e stx)) (string? (syntax-e stx))) + (syntax-e stx)) + ((repetition arg ...) + (let ((arg-list (syntax->list (syntax (arg ...))))) + (unless (= 3 (length arg-list)) + (bad-args stx 2)) + (let ((low (syntax-e (car arg-list))) + (high (syntax-e (cadr arg-list))) + (re (caddr arg-list))) + (unless (and (number? low) (exact? low) (integer? low) (>= low 0)) + (raise-syntax-error #f + "not a non-negative exact integer" + stx + (car arg-list))) + (unless (or (and (number? high) (exact? high) (integer? high) (>= high 0)) + (eq? high +inf.0)) + (raise-syntax-error #f + "not a non-negative exact integer or +inf.0" + stx + (cadr arg-list))) + (unless (<= low high) + (raise-syntax-error + #f + "the first argument is not less than or equal to the second argument" + stx)) + `(repetition ,low ,high ,(recur re))))) + ((union re ...) + `(union ,@(map recur (syntax->list (syntax (re ...)))))) + ((intersection re ...) + `(intersection ,@(map recur (syntax->list (syntax (re ...)))))) + ((complement re ...) + (let ((re-list (syntax->list (syntax (re ...))))) + (unless (= 1 (length re-list)) + (bad-args stx 1)) + `(complement ,(recur (car re-list))))) + ((concatenation re ...) + `(concatenation ,@(map recur (syntax->list (syntax (re ...)))))) + ((char-range arg ...) + (let ((arg-list (syntax->list (syntax (arg ...))))) + (unless (= 2 (length arg-list)) + (bad-args stx 2)) + (let ((i1 (char-range-arg (car arg-list) stx)) + (i2 (char-range-arg (cadr arg-list) stx))) + (if (<= i1 i2) + `(char-range ,(integer->char i1) ,(integer->char i2)) + (raise-syntax-error + #f + "the first argument does not precede or equal second argument" + stx))))) + ((char-complement arg ...) + (let ((arg-list (syntax->list (syntax (arg ...))))) + (unless (= 1 (length arg-list)) + (bad-args stx 1)) + (let ((parsed (recur (car arg-list)))) + (unless (char-set? parsed) + (raise-syntax-error #f + "not a character set" + stx + (car arg-list))) + `(char-complement ,parsed)))) + ((op form ...) + (identifier? (syntax op)) + (let* ((o (syntax op)) + (expansion (syntax-local-value o (lambda () #f)))) + (set-box! disappeared-uses (cons o (unbox disappeared-uses))) + (cond + ((lex-trans? expansion) + (recur ((lex-trans-f expansion) (disarm stx)))) + (expansion + (raise-syntax-error 'regular-expression + "not a lex-trans" + stx)) + (else + (raise-syntax-error 'regular-expression + "undefined operator" + stx))))) + (_ + (raise-syntax-error + 'regular-expression + "not a char, string, identifier, or (op args ...)" + stx)))))) + + + + ;; char-set? : s-re -> bool + ;; A char-set is an re that matches only strings of length 1. + ;; char-set? is conservative. + (define (char-set? s-re) + (cond + ((char? s-re) #t) + ((string? s-re) (= (string-length s-re) 1)) + ((list? s-re) + (let ((op (car s-re))) + (case op + ((union intersection) (andmap char-set? (cdr s-re))) + ((char-range char-complement) #t) + ((repetition) + (and (= (cadr s-re) (caddr s-re)) (char-set? (cadddr s-re)))) + ((concatenation) + (and (= 2 (length s-re)) (char-set? (cadr s-re)))) + (else #f)))) + (else #f))) + + (module+ test + (require rackunit)) + (module+ test + (check-equal? (char-set? #\a) #t) + (check-equal? (char-set? "12") #f) + (check-equal? (char-set? "1") #t) + (check-equal? (char-set? '(repetition 1 2 #\1)) #f) + (check-equal? (char-set? '(repetition 1 1 "12")) #f) + (check-equal? (char-set? '(repetition 1 1 "1")) #t) + (check-equal? (char-set? '(union "1" "2" "3")) #t) + (check-equal? (char-set? '(union "1" "" "3")) #f) + (check-equal? (char-set? '(intersection "1" "2" (union "3" "4"))) #t) + (check-equal? (char-set? '(intersection "1" "")) #f) + (check-equal? (char-set? '(complement "1")) #f) + (check-equal? (char-set? '(concatenation "1" "2")) #f) + (check-equal? (char-set? '(concatenation "" "2")) #f) + (check-equal? (char-set? '(concatenation "1")) #t) + (check-equal? (char-set? '(concatenation "12")) #f) + (check-equal? (char-set? '(char-range #\1 #\2)) #t) + (check-equal? (char-set? '(char-complement #\1)) #t)) + + ;; yikes... these test cases all have the wrong arity, now. + ;; and by "now", I mean it's been broken since before we + ;; moved to git. + (module+ test + (check-equal? (parse #'#\a null) #\a) + (check-equal? (parse #'"1" null) "1") + (check-equal? (parse #'(repetition 1 1 #\1) null) + '(repetition 1 1 #\1)) + (check-equal? (parse #'(repetition 0 +inf.0 #\1) null) '(repetition 0 +inf.0 #\1)) + (check-equal? (parse #'(union #\1 (union "2") (union)) null) + '(union #\1 (union "2") (union))) + (check-equal? (parse #'(intersection #\1 (intersection "2") (intersection)) + null) + '(intersection #\1 (intersection "2") (intersection))) + (check-equal? (parse #'(complement (union #\1 #\2)) + null) + '(complement (union #\1 #\2))) + (check-equal? (parse #'(concatenation "1" "2" (concatenation)) null) + '(concatenation "1" "2" (concatenation))) + (check-equal? (parse #'(char-range "1" #\1) null) '(char-range #\1 #\1)) + (check-equal? (parse #'(char-range #\1 "1") null) '(char-range #\1 #\1)) + (check-equal? (parse #'(char-range "1" "3") null) '(char-range #\1 #\3)) + (check-equal? (parse #'(char-complement (union "1" "2")) null) + '(char-complement (union "1" "2")))) +; ) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/token-syntax.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/token-syntax.rkt new file mode 100644 index 0000000..c1f1492 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/token-syntax.rkt @@ -0,0 +1,9 @@ +(module token-syntax mzscheme + + ;; The things needed at compile time to handle definition of tokens + + (provide make-terminals-def terminals-def-t terminals-def? + make-e-terminals-def e-terminals-def-t e-terminals-def?) + (define-struct terminals-def (t)) + (define-struct e-terminals-def (t)) + ) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/token.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/token.rkt new file mode 100644 index 0000000..27b3458 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/token.rkt @@ -0,0 +1,92 @@ +(module token mzscheme + + (require-for-syntax "token-syntax.rkt") + + ;; Defining tokens + + (provide define-tokens define-empty-tokens make-token token? + (protect (rename token-name real-token-name)) + (protect (rename token-value real-token-value)) + (rename token-name* token-name) + (rename token-value* token-value) + (struct position (offset line col)) + (struct position-token (token start-pos end-pos)) + (struct srcloc-token (token srcloc))) + + + ;; A token is either + ;; - symbol + ;; - (make-token symbol any) + (define-struct token (name value) (make-inspector)) + + ;; token-name*: token -> symbol + (define (token-name* t) + (cond + ((symbol? t) t) + ((token? t) (token-name t)) + (else (raise-type-error + 'token-name + "symbol or struct:token" + 0 + t)))) + + ;; token-value*: token -> any + (define (token-value* t) + (cond + ((symbol? t) #f) + ((token? t) (token-value t)) + (else (raise-type-error + 'token-value + "symbol or struct:token" + 0 + t)))) + + (define-for-syntax (make-ctor-name n) + (datum->syntax-object n + (string->symbol (format "token-~a" (syntax-e n))) + n + n)) + + (define-for-syntax (make-define-tokens empty?) + (lambda (stx) + (syntax-case stx () + ((_ name (token ...)) + (andmap identifier? (syntax->list (syntax (token ...)))) + (with-syntax (((marked-token ...) + (map values #;(make-syntax-introducer) + (syntax->list (syntax (token ...)))))) + (quasisyntax/loc stx + (begin + (define-syntax name + #,(if empty? + #'(make-e-terminals-def (quote-syntax (marked-token ...))) + #'(make-terminals-def (quote-syntax (marked-token ...))))) + #,@(map + (lambda (n) + (when (eq? (syntax-e n) 'error) + (raise-syntax-error + #f + "Cannot define a token named error." + stx)) + (if empty? + #`(define (#,(make-ctor-name n)) + '#,n) + #`(define (#,(make-ctor-name n) x) + (make-token '#,n x)))) + (syntax->list (syntax (token ...)))) + #;(define marked-token #f) #;...)))) + ((_ ...) + (raise-syntax-error + #f + "must have the form (define-tokens name (identifier ...)) or (define-empty-tokens name (identifier ...))" + stx))))) + + (define-syntax define-tokens (make-define-tokens #f)) + (define-syntax define-empty-tokens (make-define-tokens #t)) + + (define-struct position (offset line col) #f) + (define-struct position-token (token start-pos end-pos) #f) + + (define-struct srcloc-token (token srcloc) #f) + ) + diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/unicode-chars.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/unicode-chars.rkt new file mode 100644 index 0000000..c21e88c --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/unicode-chars.rkt @@ -0,0 +1,69 @@ +#lang racket + +(require "util.rkt") + +(provide (all-defined-out)) + +;; mapped-chars : (listof (list nat nat bool)) +(define mapped-chars (make-known-char-range-list)) + +;; get-chars-for-x : (nat -> bool) (listof (list nat nat bool)) -> (listof (cons nat nat)) +(define (get-chars-for char-x? mapped-chars) + (cond + ((null? mapped-chars) null) + (else + (let* ((range (car mapped-chars)) + (low (car range)) + (high (cadr range)) + (x (char-x? low))) + (cond + ((caddr range) + (if x + (cons (cons low high) + (get-chars-for char-x? (cdr mapped-chars))) + (get-chars-for char-x? (cdr mapped-chars)))) + (else + (let loop ((range-start low) + (i (car range)) + (parity x)) + (cond + ((> i high) + (if parity + (cons (cons range-start high) (get-chars-for char-x? (cdr mapped-chars))) + (get-chars-for char-x? (cdr mapped-chars)))) + ((eq? parity (char-x? i)) + (loop range-start (add1 i) parity)) + (parity + (cons (cons range-start (sub1 i)) (loop i (add1 i) #f))) + (else + (loop i (add1 i) #t)))))))))) + +(define (compute-ranges x?) + (delay (get-chars-for (lambda (x) (x? (integer->char x))) mapped-chars))) + +(define alphabetic-ranges (compute-ranges char-alphabetic?)) ;; 325 +(define lower-case-ranges (compute-ranges char-lower-case?)) ;; 405 +(define upper-case-ranges (compute-ranges char-upper-case?)) ;; 380 +(define title-case-ranges (compute-ranges char-title-case?)) ;; 10 +(define numeric-ranges (compute-ranges char-numeric?)) ;; 47 +(define symbolic-ranges (compute-ranges char-symbolic?)) ;; 153 +(define punctuation-ranges (compute-ranges char-punctuation?)) ;; 86 +(define graphic-ranges (compute-ranges char-graphic?)) ;; 401 +(define whitespace-ranges (compute-ranges char-whitespace?)) ;; 10 +(define blank-ranges (compute-ranges char-blank?)) ;; 9 +#;(define hexadecimal-ranges (compute-ranges char-hexadecimal?)) +(define iso-control-ranges (compute-ranges char-iso-control?)) ;; 2 + + + +(module+ test + (require rackunit) + (check-equal? (get-chars-for odd? '()) '()) + (check-equal? (get-chars-for odd? '((1 4 #f) (8 13 #f))) + '((1 . 1) (3 . 3) (9 . 9) (11 . 11) (13 . 13))) + (check-equal? (get-chars-for (lambda (x) + (odd? (quotient x 10))) + '((1 5 #t) (17 19 #t) (21 51 #f))) + '((17 . 19) (30 . 39) (50 . 51)))) + + diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/util.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/util.rkt new file mode 100644 index 0000000..a7afc54 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-lex/util.rkt @@ -0,0 +1,127 @@ +#lang racket + +(provide (all-defined-out)) + +(define max-char-num #x10FFFF) + +(define-struct lex-abbrev (get-abbrev)) +(define-struct lex-trans (f)) + +(module+ test + (require rackunit)) + +#;(define-syntax test-block + (syntax-rules () + ((_ defs (code right-ans) ...) + (let* defs + (let ((real-ans code)) + (unless (equal? real-ans right-ans) + (printf "Test failed: ~e gave ~e. Expected ~e\n" + 'code real-ans 'right-ans))) ...)))) + +(define-syntax test-block + (syntax-rules () + ((_ x ...) (void)))) + + +;; A cache is (X ( -> Y) -> Y) +;; make-cache : -> cache +;; table map Xs to Ys. If key is mapped, its value is returned. +;; Otherwise, build is invoked and its result is placed in the table and +;; returned. +;; Xs are compared with equal? +(define (make-cache) + (let ((table (make-hash))) + (lambda (key build) + (hash-ref table key + (lambda () + (let ((new (build))) + (hash-set! table key new) + new)))))) + +(module+ test + (define cache (make-cache)) + (check-equal? (cache '(s 1 2) (lambda () 9)) 9) + (check-equal? (cache '(s 2 1) (lambda () 8)) 8) + (check-equal? (cache '(s 1 2) (lambda () 1)) 9) + (check-equal? (cache (cons 's (cons 0 (cons +inf.0 10))) + (lambda () 22)) 22) + (check-equal? (cache (cons 's (cons 0 (cons +inf.0 10))) + (lambda () 1)) 22)) + + + +;; make-counter : -> -> nat +;; makes a function that returns a higher number by 1, each time +;; it is called. +(define (make-counter) + (let ((counter 0)) + (lambda () + (begin0 + counter + (set! counter (add1 counter)))))) + +(module+ test + (define c (make-counter)) + (define d (make-counter)) + (check-equal? (c) 0) + (check-equal? (d) 0) + (check-equal? (c) 1) + (check-equal? (d) 1) + (check-equal? (c) 2)) + + +;; remove-dups : (list-of X) (X -> number) -> (list-of X) +;; removes the entries from l that have the same index as a +;; previous entry. l must be grouped by indexes. +(define (remove-dups l index acc) + (cond + ((null? l) (reverse acc)) + ((null? acc) (remove-dups (cdr l) index (cons (car l) acc))) + ((= (index (car acc)) (index (car l))) + (remove-dups (cdr l) index acc)) + (else + (remove-dups (cdr l) index (cons (car l) acc))))) + + +(module+ test + (check-equal? (remove-dups '((1 2) (2 2) (1 3) (1 4) + (100 4) (0 5)) cadr null) + '((1 2) (1 3) (1 4) (0 5))) + (check-equal? (remove-dups null error null) null)) + +;; do-simple-equiv : (list-of X) (X -> nat) -> (list-of X) +;; Sorts l according to index and removes the entries with duplicate +;; indexes. +(define (do-simple-equiv l index) + (let ((ordered (sort l (lambda (a b) (< (index a) (index b)))))) + (remove-dups ordered index null))) + +(module+ test + (check-equal? (do-simple-equiv '((2 2) (1 4) (1 2) + (100 4) (1 3) (0 5)) + cadr) + '((2 2) (1 3) (1 4) (0 5))) + (check-equal? (do-simple-equiv null error) null)) + +;; replace : (list-of X) (X -> bool) (X -> (list-of X)) (list-of X) -> +;; (list-of X) +;; If (pred? r) for some r in l, splice (get r) in place of r in the resulting +;; list. +(define (replace l pred? get acc) + (cond + ((null? l) acc) + ((pred? (car l)) (replace (cdr l) pred? get (append (get (car l)) acc))) + (else (replace (cdr l) pred? get (cons (car l) acc))))) + + +(module+ test + (check-equal? (replace null void (lambda () (list 1)) null) null) + (check-equal? (replace '(1 2 3 4 3 5) + (lambda (x) (= x 3)) + (lambda (x) (list 1 2 3)) + null) + '(5 1 2 3 4 1 2 3 2 1))) + + + diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/grammar_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/grammar_rkt.dep new file mode 100644 index 0000000..ee73688 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/grammar_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("468f21e5aa316cce76913f10fb16179eb072183c" . "c0c07e543a2da6a5a900016b86916e67cfc9a89f") (collects #"br-parser-tools" #"private-yacc" #"yacc-helper.rkt") (collects #"errortrace" #"errortrace-key.rkt") (collects #"mzlib" #"class.rkt") (collects #"mzlib" #"list.rkt") (collects #"mzscheme" #"main.rkt") (collects #"racket" #"contract.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/grammar_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/grammar_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..247a41ccfc34f68b9da698bbddcfcb403bcc9e1f GIT binary patch literal 33469 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 H=EVMA?R+oY literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/lalr_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/lalr_rkt.dep new file mode 100644 index 0000000..914517e --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/lalr_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("15ac433d879371638d04ae3ecedf9be56c4c2ae9" . "0b2297c9131f2231ecaa39cf14cfddf70bf7b7e9") (collects #"br-parser-tools" #"private-yacc" #"grammar.rkt") (collects #"br-parser-tools" #"private-yacc" #"lr0.rkt") (collects #"errortrace" #"errortrace-key.rkt") (collects #"mzlib" #"class.rkt") (collects #"mzlib" #"list.rkt") (collects #"mzscheme" #"main.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/lalr_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/lalr_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..8b2ad4b0c44cd2f0d8702a3fe6320592ba4f21fb GIT binary patch literal 19977 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 literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/lr0_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/lr0_rkt.dep new file mode 100644 index 0000000..0c39c8d --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/lr0_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("24f4ec91205bfbab013165350eb9375fea53884c" . "0c6241a969ffc362c3ad9fa66badebcfe2b66f84") (collects #"br-parser-tools" #"private-yacc" #"grammar.rkt") (collects #"br-parser-tools" #"private-yacc" #"graph.rkt") (collects #"errortrace" #"errortrace-key.rkt") (collects #"mzlib" #"class.rkt") (collects #"mzlib" #"list.rkt") (collects #"mzscheme" #"main.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/lr0_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/lr0_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..0229a6faa6778dd852aa1fc25decdd8928f9c5b8 GIT binary patch literal 25149 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 literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/parser-actions_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/parser-actions_rkt.dep new file mode 100644 index 0000000..3418778 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/parser-actions_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("db7e9899c4b17d8ad8283dec50e0e9090f4acb19" . "4a9497eb11d109799b943d433fff01d2c1eb3338") (collects #"br-parser-tools" #"private-yacc" #"grammar.rkt") (collects #"errortrace" #"errortrace-key.rkt") (collects #"mzscheme" #"main.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/parser-actions_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/parser-actions_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..9de2408c13279aba3ddad84671b5a33ae0dcfc14 GIT binary patch literal 7441 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 TjtS`_Aj1&E64=O!5>WmR$QMEd literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/parser-builder_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/parser-builder_rkt.dep new file mode 100644 index 0000000..787c2f7 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/parser-builder_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("4d49b2e9c74b94ec0d402da7ac7ff55643f762cc" . "0ad13697a02d3576409cd6687e363fb6a35897a6") (collects #"br-parser-tools" #"private-yacc" #"grammar.rkt") (collects #"br-parser-tools" #"private-yacc" #"input-file-parser.rkt") (collects #"br-parser-tools" #"private-yacc" #"parser-actions.rkt") (collects #"br-parser-tools" #"private-yacc" #"table.rkt") (collects #"errortrace" #"errortrace-key.rkt") (collects #"mzlib" #"class.rkt") (collects #"mzlib" #"list.rkt") (collects #"mzscheme" #"main.rkt") (collects #"racket" #"contract.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/parser-builder_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/parser-builder_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..db4fa132068e3deb4cda4fec7bd61ab45c1cccec GIT binary patch literal 16345 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 literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/table_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/table_rkt.dep new file mode 100644 index 0000000..33db78e --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/table_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("3e315d6d491b6d88856829733bbe08e6fc2343dc" . "237931ee716cef28ca1dc1284b5405c271c9c9dc") (collects #"br-parser-tools" #"private-yacc" #"grammar.rkt") (collects #"br-parser-tools" #"private-yacc" #"lalr.rkt") (collects #"br-parser-tools" #"private-yacc" #"lr0.rkt") (collects #"br-parser-tools" #"private-yacc" #"parser-actions.rkt") (collects #"errortrace" #"errortrace-key.rkt") (collects #"mzlib" #"class.rkt") (collects #"mzlib" #"list.rkt") (collects #"racket" #"contract.rkt") (collects #"scheme" #"base.rkt") (collects #"scheme" #"runtime-config.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/table_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/drracket/errortrace/table_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..0d7a299363db29bd0ee629600f9813e1d73bad26 GIT binary patch literal 24162 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

8-H`h<^dMYFZ`9DO# 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 Isw?$>0|PEE&Hw-a literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/graph_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/graph_rkt.dep new file mode 100644 index 0000000..d7e5be9 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/graph_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("efcbacc6a2841b29dbaedbc655290598a196a721" . "46a0cffdba2f82aa32f0fd32a5783621a6a78323") (collects #"mzscheme" #"main.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/graph_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/graph_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..bb5f7caac02bbadf1708e6ddaabcaff5336b4433 GIT binary patch literal 1951 zcmb7FOKclO7@i%!W_R6Y(^#IgNuU-LyLSAFQ@5#GgrKG6f@De+m7+e3>*6R+oKT4z zxPd@D#6^V@5&|U7NJ!ipJBjT$X`w2p6@4Kg4qT8p;6xz!W_Ilap&qa;&EtQ6-~W%F zddGJlJ`zvHQ>TiJ`QM+rSNZktkI(*j|H_vmUtHMf-9-pd2w`L=*-b(uLH3g)Jgzi@F(UOh?9 zdQ`cKm&WIwpO~JWA>P5UsY~(X!12lX*?h4uSRq9Hk?NblPigNedB}{kk99>JWiE?OE*0d`LPj#3s`6jisw3IMvgOoZq`9`vySTx-`L3E& zUUD2QcZyn3wv~jOIwdWkBxUp*zpmJLY|p{Q0|{)QfwF~ZLZGqyzfA8+!z2uEBci^U zEytpfm0Cptv83>2g;)QLJV0DStdxjVRd^l6@Cqyi{56X6247L6`5NWx;=(>C9CXwn zfgTuxUK@UJxemP34*X4M+Q+>+PJhInjvdwwAN5iXOFhG`46p^4Zayd<3+)^|FP)*_ zI;FlX$1)z!1S%^OD1EJBKfZm&E1kl#TwJvatOI+(6T;aQeD@+_*(F=%GcW_0aTexC4 z;U*#7;2m)2k){sI0vDSej5qRaIBqbYZ2;Rv>tcKVuWrO>#~UZS2u2if~7 zi|P-F7SbUNZz)DJ6&HhAAdr`|vOOb)@AzCPcezlSEr7*+X?CrLeXv9S#Y3pe?PIDI z>f)=4&5+;+%v{G?VYfy4v2Bq~XNC^I;lYFKtG#Sgd*pR_LWXPvIm6c#41Y2j0q+=K zL;(A8`UU$H5%1r5M)JN7E-|K78zo(EX$7zBEF`nZ`&L0K$k%S z{R?}E0N#v>N5(}x(J)IguHQEwcb_errX_5}+mv9tN2u3&M1CXP_^S-5kPb%L(#Rne tg7jfG326{SZ2_W153@AFxv3`|W}kc6yZ!nD66%JIWu2uAKUFo=e*j}gH6H)~ literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/input-file-parser_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/input-file-parser_rkt.dep new file mode 100644 index 0000000..edd4787 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/input-file-parser_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("4cb386976883e8cd0d891950a469f3b7c8c6d957" . "6d4317182d4a6351759b559a48720b97b01088ae") (collects #"br-parser-tools" #"private-lex" #"token-syntax.rkt") (collects #"br-parser-tools" #"private-yacc" #"grammar.rkt") (collects #"br-parser-tools" #"private-yacc" #"yacc-helper.rkt") (collects #"mzlib" #"class.rkt") (collects #"mzscheme" #"main.rkt") (collects #"racket" #"contract.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/input-file-parser_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/input-file-parser_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..34789309f468a39990948026c720ab34893d1981 GIT binary patch literal 24572 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®(*+Ds|ENG&UpE3~hHJeRH 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 literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/lr0_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/lr0_rkt.dep new file mode 100644 index 0000000..f56295b --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/lr0_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("24f4ec91205bfbab013165350eb9375fea53884c" . "d97ba6be97a513c7169fb71a846459a962705f1c") (collects #"br-parser-tools" #"private-yacc" #"grammar.rkt") (collects #"br-parser-tools" #"private-yacc" #"graph.rkt") (collects #"mzlib" #"class.rkt") (collects #"mzlib" #"list.rkt") (collects #"mzscheme" #"main.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/lr0_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/lr0_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..113fc3680e3d4a087d466c7204cfcd3e3f7215b7 GIT binary patch literal 22068 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 literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/parser-actions_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/parser-actions_rkt.dep new file mode 100644 index 0000000..7979f77 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/parser-actions_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("db7e9899c4b17d8ad8283dec50e0e9090f4acb19" . "96b9fd723bd354b9e93281793a161f7b0285e0da") (collects #"br-parser-tools" #"private-yacc" #"grammar.rkt") (collects #"mzscheme" #"main.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/parser-actions_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/parser-actions_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..52a03238c7b7b9fa87fa2a61835b2ed85e56229d GIT binary patch literal 4448 zcmbtXYitzP6`p%%XXcK_;KA6te%se9J2SgGyNjQAZDYXZjfqoeN@z@C>;)U}qr2-g zp=rvyK&jSLmfA|8O8>M`q^duN)J7p`!=s^5OH{R$`lq2k+Fz|wepCX}7WLdaJIk&$ zNRbNq&YW}ax!?KjojYgcHLojOvGuV;tZm;*>bKKZk3G(Ow)6e#&qm)k`uOOdFP#+x z0SN*T0z$oD37tZ}Fe)4s=7raU3&Qt>9}Cxn_k@pxPlbO98mdKWk&SxLAliZUp$RmP z&Y~Q81N{WuMt?wmMgKw=2XF!p;TLfRpTMW^dAxwXi?8B$@gMPD@B=J~ny8D-Vz+om zJSCnNFNu472Ye~tY2QWP4}5R?uKBL}Zu{=~{_RsFU82xA*Kt0h@`2R%v@sk+*mr3O50=O z*{Ru?Orxf0yE57I{CGC$4DFa6JC@2%Z*hhO8c{=fZ2VX%8=p&0y*!pp#V1mSr)E;N zvr^lcXUI%W9nNm&1l%3sc3=m8Kr*b{lSyUmqL{kX)2WI1@sv~D@wYgSfgR4%o=eY8 zpz3^(o}bB1O{Z)pqgxvaZi=EHv30|YxKa%46;yNz#$d4tRh zY-iTl%P_0)B&2)t%VuWt=eL`$Eri<(-oQ>iaq1LAA@q(vunc zcxvWIcJfL3lk*sIWWa-6wasi|Tj2zToO**?3#yC7V#PO#9YeCKt1H=&@Sf{l*PiU` zY}`71A~QajnoeoW!l+bPdbb(Lu9Ay7$gkjLc99B4>FD^c|AnfR3$|f0YjSIus#?~B z71Zin=+yDU_IP$SZ9_r$7AEqS-=3N|JgeP6zEH0&j_R0wQCP%%qd8qM@CFlavhX0r zMyPKT_Xqn0Be(%wF>`o8_u+QKz{qi1n5#dBBX}eB1EK&5kO4NJ4p0lI21tM!KqFu! zpc$Y7Vt^(<9H0YM0V)7NKp3zVU;+$)1y}Ksg`*&;VtCDu53V05kwr z00`a~8pz=dxG%JE6t>5&7B=%vgulk98QRInyOZQJi84+C zR6CiYx=xwvXs%Q4I#JxqSCd+DfpBenm8XCuE+8Ieb>k5;A4Yj-b1^Y9w3pGXPm=2n z+X^VOmx)>FIu)+7%5`+tS?xNNu9KIyp45>uDwoH3Jmsk>yWC+jbdX8tNs@DAd_@(I z9b^)!UB~Y_dHNopzw9LQ98dbE9)F6JOD4&CWf4{-0OTp=)VNNq>(seUz3b!!BuNc9 zsd2S@m8XEh{$^Og-XwWPORzc(KsLjiM%QU_ojiRn{8)bA(DR(7k({+Ia0@^3pHUx< zEZC&M4BWxoYYf99Mw-mPukl0wIW`?5%@Co6ha)-D4%~#ioEZz;bOze;10Bx5g4tui z2#)aVJ~rw9KwR>_FT$!wf8bZhgqa1C)Il23${QZ~FNz;7`7ily7+OiN)mJ zo%&{R9uJoM=T)FG*z*Rr5W(Gqh+Bv(9$BuEoA3cSnr@m`OttF76^slWX}VBVU(v5( z_D_T^r>QEKvgAn4F!D)Z_;MvIL)RSUT@spOW-i6LX7rW-AD#;RM1%ga0-owaHpnMl2&RX{w8)V?FNB+xN;J3^J#t5U0GGj9nV>zHX{rk$A%W;&VaVj7koRD@~pI;%+G zth(9a_005mot6Exv$8+OStS{5FEf42^fN;OUP5C}6B;WBB{h6`Ew^=y1n*xo%uXGX zlRCLC+!q90ffm-$Z;?04$yrgmC(tabSYJqPBlmx4PWT{?;tsOLBBxiAH+kYbOKjnZ zRSmfof%O41u0duiWJWCVmY;NMpVF6~KJ`^bK{75zukkCGnU$!$~ajAa2JkqqtpF4fTKIEco02 literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/parser-builder_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/parser-builder_rkt.dep new file mode 100644 index 0000000..d689301 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/parser-builder_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("4d49b2e9c74b94ec0d402da7ac7ff55643f762cc" . "873212f5ff8fe2056832ca8c60822e3629397aaf") (collects #"br-parser-tools" #"private-yacc" #"grammar.rkt") (collects #"br-parser-tools" #"private-yacc" #"input-file-parser.rkt") (collects #"br-parser-tools" #"private-yacc" #"parser-actions.rkt") (collects #"br-parser-tools" #"private-yacc" #"table.rkt") (collects #"mzlib" #"class.rkt") (collects #"mzlib" #"list.rkt") (collects #"mzscheme" #"main.rkt") (collects #"racket" #"contract.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/parser-builder_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/parser-builder_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..402846a6f7de5c34b6806aa86f8e9d4fd374500d GIT binary patch literal 14327 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 literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/table_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/table_rkt.dep new file mode 100644 index 0000000..b323791 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/table_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("3e315d6d491b6d88856829733bbe08e6fc2343dc" . "a276a09cfaba1c0260fe8aaa42fe2679cfb8d1f1") (collects #"br-parser-tools" #"private-yacc" #"grammar.rkt") (collects #"br-parser-tools" #"private-yacc" #"lalr.rkt") (collects #"br-parser-tools" #"private-yacc" #"lr0.rkt") (collects #"br-parser-tools" #"private-yacc" #"parser-actions.rkt") (collects #"mzlib" #"class.rkt") (collects #"mzlib" #"list.rkt") (collects #"racket" #"contract.rkt") (collects #"scheme" #"base.rkt") (collects #"scheme" #"runtime-config.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/table_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/table_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..f61e88dfcafae1d8493ae58f4f53eb8c97f1a783 GIT binary patch literal 16223 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 literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/yacc-helper_rkt.dep b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/yacc-helper_rkt.dep new file mode 100644 index 0000000..f9328a6 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/yacc-helper_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("6cd5cc09c96354b229671df88858952e2a9ab7de" . "6aab85a3c56c4a8b434cf6a4421336a3a8a0d39b") (collects #"br-parser-tools" #"private-lex" #"token-syntax.rkt") (collects #"mzlib" #"list.rkt") (collects #"mzscheme" #"main.rkt")) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/yacc-helper_rkt.zo b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/compiled/yacc-helper_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..7e9c11c540c7f2819cf2034ba5f8d29756a3143f GIT binary patch literal 6732 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 literal 0 HcmV?d00001 diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/grammar.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/grammar.rkt new file mode 100644 index 0000000..ebff00d --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/grammar.rkt @@ -0,0 +1,280 @@ +;; Constructs to create and access grammars, the internal +;; representation of the input to the parser generator. + +(module grammar mzscheme + + (require mzlib/class + mzlib/list + "yacc-helper.rkt" + racket/contract) + + ;; Each production has a unique index 0 <= index <= number of productions + (define-struct prod (lhs rhs index prec action) (make-inspector)) + + ;; The dot-pos field is the index of the element in the rhs + ;; of prod that the dot immediately precedes. + ;; Thus 0 <= dot-pos <= (vector-length rhs). + (define-struct item (prod dot-pos) (make-inspector)) + + ;; gram-sym = (union term? non-term?) + ;; Each term has a unique index 0 <= index < number of terms + ;; Each non-term has a unique index 0 <= index < number of non-terms + (define-struct term (sym index prec) (make-inspector)) + (define-struct non-term (sym index) (make-inspector)) + + ;; a precedence declaration. + (define-struct prec (num assoc) (make-inspector)) + + (provide/contract + (make-item (prod? (or/c #f natural-number/c) . -> . item?)) + (make-term (symbol? (or/c #f natural-number/c) (or/c prec? #f) . -> . term?)) + (make-non-term (symbol? (or/c #f natural-number/c) . -> . non-term?)) + (make-prec (natural-number/c (or/c 'left 'right 'nonassoc) . -> . prec?)) + (make-prod (non-term? (vectorof (or/c non-term? term?)) + (or/c #f natural-number/c) (or/c #f prec?) syntax? . -> . prod?))) + + (provide + + + ;; Things that work on items + start-item? item-prod item->string + sym-at-dot move-dot-right itemstring + non-term? term? non-termbit-vector term-index non-term-index + + ;; Things that work on precs + prec-num prec-assoc + + grammar% + + ;; Things that work on productions + prod-index prod-prec prod-rhs prod-lhs prod-action) + + + ;;---------------------- LR items -------------------------- + + ;; item bool + ;; Lexicographic comparison on two items. + (define (item bool + ;; The start production always has index 0 + (define (start-item? i) + (= 0 (non-term-index (prod-lhs (item-prod i))))) + + + ;; move-dot-right: LR-item -> LR-item | #f + ;; moves the dot to the right in the item, unless it is at its + ;; rightmost, then it returns false + (define (move-dot-right i) + (cond + ((= (item-dot-pos i) (vector-length (prod-rhs (item-prod i)))) #f) + (else (make-item (item-prod i) + (add1 (item-dot-pos i)))))) + + ;; sym-at-dot: LR-item -> gram-sym | #f + ;; returns the symbol after the dot in the item or #f if there is none + (define (sym-at-dot i) + (let ((dp (item-dot-pos i)) + (rhs (prod-rhs (item-prod i)))) + (cond + ((= dp (vector-length rhs)) #f) + (else (vector-ref rhs dp))))) + + + ;; print-item: LR-item -> + (define (item->string it) + (let ((print-sym (lambda (i) + (let ((gs (vector-ref (prod-rhs (item-prod it)) i))) + (cond + ((term? gs) (format "~a " (term-sym gs))) + (else (format "~a " (non-term-sym gs)))))))) + (string-append + (format "~a -> " (non-term-sym (prod-lhs (item-prod it)))) + (let loop ((i 0)) + (cond + ((= i (vector-length (prod-rhs (item-prod it)))) + (if (= i (item-dot-pos it)) + ". " + "")) + ((= i (item-dot-pos it)) + (string-append ". " (print-sym i) (loop (add1 i)))) + (else (string-append (print-sym i) (loop (add1 i))))))))) + + ;; --------------------- Grammar Symbols -------------------------- + + (define (non-termstring gs) + (symbol->string (gram-sym-symbol gs))) + + ;; term-list->bit-vector: term list -> int + ;; Creates a number where the nth bit is 1 if the term with index n is in + ;; the list, and whose nth bit is 0 otherwise + (define (term-list->bit-vector terms) + (cond + ((null? terms) 0) + (else + (bitwise-ior (arithmetic-shift 1 (term-index (car terms))) (term-list->bit-vector (cdr terms)))))) + + + ;; ------------------------- Grammar ------------------------------ + + (define grammar% + (class object% + (super-instantiate ()) + ;; prods: production list list + ;; where there is one production list per non-term + (init prods) + ;; init-prods: production list + ;; The productions parsing can start from + ;; nullable-non-terms is indexed by the non-term-index and is true iff non-term is nullable + (init-field init-prods terms non-terms end-terms) + + ;; list of all productions + (define all-prods (apply append prods)) + (define num-prods (length all-prods)) + (define num-terms (length terms)) + (define num-non-terms (length non-terms)) + + (let ((count 0)) + (for-each + (lambda (nt) + (set-non-term-index! nt count) + (set! count (add1 count))) + non-terms)) + + (let ((count 0)) + (for-each + (lambda (t) + (set-term-index! t count) + (set! count (add1 count))) + terms)) + + (let ((count 0)) + (for-each + (lambda (prod) + (set-prod-index! prod count) + (set! count (add1 count))) + all-prods)) + + ;; indexed by the index of the non-term - contains the list of productions for that non-term + (define nt->prods + (let ((v (make-vector (length prods) #f))) + (for-each (lambda (prods) + (vector-set! v (non-term-index (prod-lhs (car prods))) prods)) + prods) + v)) + + (define nullable-non-terms + (nullable all-prods num-non-terms)) + + (define/public (get-num-terms) num-terms) + (define/public (get-num-non-terms) num-non-terms) + + (define/public (get-prods-for-non-term nt) + (vector-ref nt->prods (non-term-index nt))) + (define/public (get-prods) all-prods) + (define/public (get-init-prods) init-prods) + + (define/public (get-terms) terms) + (define/public (get-non-terms) non-terms) + + (define/public (get-num-prods) num-prods) + (define/public (get-end-terms) end-terms) + + (define/public (nullable-non-term? nt) + (vector-ref nullable-non-terms (non-term-index nt))) + + (define/public (nullable-after-dot? item) + (let* ((rhs (prod-rhs (item-prod item))) + (prod-length (vector-length rhs))) + (let loop ((i (item-dot-pos item))) + (cond + ((< i prod-length) + (if (and (non-term? (vector-ref rhs i)) (nullable-non-term? (vector-ref rhs i))) + (loop (add1 i)) + #f)) + ((= i prod-length) #t))))) + + (define/public (nullable-non-term-thunk) + (lambda (nt) + (nullable-non-term? nt))) + (define/public (nullable-after-dot?-thunk) + (lambda (item) + (nullable-after-dot? item))))) + + + ;; nullable: production list * int -> non-term set + ;; determines which non-terminals can derive epsilon + (define (nullable prods num-nts) + (letrec ((nullable (make-vector num-nts #f)) + (added #f) + + ;; possible-nullable: producion list -> production list + ;; Removes all productions that have a terminal + (possible-nullable + (lambda (prods) + (filter (lambda (prod) + (vector-andmap non-term? (prod-rhs prod))) + prods))) + + ;; set-nullables: production list -> production list + ;; makes one pass through the productions, adding the ones + ;; known to be nullable now to nullable and returning a list + ;; of productions that we don't know about yet. + (set-nullables + (lambda (prods) + (cond + ((null? prods) null) + ((vector-ref nullable + (gram-sym-index (prod-lhs (car prods)))) + (set-nullables (cdr prods))) + ((vector-andmap (lambda (nt) + (vector-ref nullable (gram-sym-index nt))) + (prod-rhs (car prods))) + (vector-set! nullable + (gram-sym-index (prod-lhs (car prods))) + #t) + (set! added #t) + (set-nullables (cdr prods))) + (else + (cons (car prods) + (set-nullables (cdr prods)))))))) + + (let loop ((P (possible-nullable prods))) + (cond + ((null? P) nullable) + (else + (set! added #f) + (let ((new-P (set-nullables P))) + (if added + (loop new-P) + nullable))))))) + + +) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/graph.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/graph.rkt new file mode 100644 index 0000000..958acc1 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/graph.rkt @@ -0,0 +1,61 @@ +(module graph mzscheme + + (provide digraph) + + (define (zero-thunk) 0) + + ;; digraph: + ;; ('a list) * ('a -> 'a list) * ('a -> 'b) * ('b * 'b -> 'b) * (-> 'b) + ;; -> ('a -> 'b) + ;; DeRemer and Pennello 1982 + ;; Computes (f x) = (f- x) union Union{(f y) | y in (edges x)} + ;; We use a hash-table to represent the result function 'a -> 'b set, so + ;; the values of type 'a must be comparable with eq?. + (define (digraph nodes edges f- union fail) + (letrec [ + ;; Will map elements of 'a to 'b sets + (results (make-hash-table)) + (f (lambda (x) (hash-table-get results x fail))) + + ;; Maps elements of 'a to integers. + (N (make-hash-table)) + (get-N (lambda (x) (hash-table-get N x zero-thunk))) + (set-N (lambda (x d) (hash-table-put! N x d))) + + (stack null) + (push (lambda (x) + (set! stack (cons x stack)))) + (pop (lambda () + (begin0 + (car stack) + (set! stack (cdr stack))))) + (depth (lambda () (length stack))) + + ;; traverse: 'a -> + (traverse + (lambda (x) + (push x) + (let ((d (depth))) + (set-N x d) + (hash-table-put! results x (f- x)) + (for-each (lambda (y) + (if (= 0 (get-N y)) + (traverse y)) + (hash-table-put! results + x + (union (f x) (f y))) + (set-N x (min (get-N x) (get-N y)))) + (edges x)) + (if (= d (get-N x)) + (let loop ((p (pop))) + (set-N p +inf.0) + (hash-table-put! results p (f x)) + (if (not (eq? x p)) + (loop (pop))))))))] + (for-each (lambda (x) + (if (= 0 (get-N x)) + (traverse x))) + nodes) + f)) + +) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/input-file-parser.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/input-file-parser.rkt new file mode 100644 index 0000000..7309f51 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/input-file-parser.rkt @@ -0,0 +1,374 @@ +(module input-file-parser mzscheme + + ;; routines for parsing the input to the parser generator and producing a + ;; grammar (See grammar.rkt) + + (require "yacc-helper.rkt" + "../private-lex/token-syntax.rkt" + "grammar.rkt" + mzlib/class + racket/contract) + (require-for-template mzscheme) + +(define (is-a-grammar%? x) (is-a? x grammar%)) + (provide/contract + (parse-input ((listof identifier?) (listof identifier?) (listof identifier?) + (or/c #f syntax?) syntax? any/c . -> . is-a-grammar%?)) + (get-term-list ((listof identifier?) . -> . (listof identifier?)))) + + (define stx-for-original-property (read-syntax #f (open-input-string "original"))) + + ;; get-args: ??? -> (values (listof syntax) (or/c #f (cons integer? stx))) + (define (get-args i rhs src-pos term-defs) + (let ((empty-table (make-hash-table)) + (biggest-pos #f)) + (hash-table-put! empty-table 'error #t) + (for-each (lambda (td) + (let ((v (syntax-local-value td))) + (if (e-terminals-def? v) + (for-each (lambda (s) + (hash-table-put! empty-table (syntax-object->datum s) #t)) + (syntax->list (e-terminals-def-t v)))))) + term-defs) + (let ([args + (let get-args ((i i) + (rhs rhs)) + (cond + ((null? rhs) null) + (else + (let ((b (car rhs)) + (name (if (hash-table-get empty-table (syntax-object->datum (car rhs)) (lambda () #f)) + (gensym) + (string->symbol (format "$~a" i))))) + (cond + (src-pos + (let ([start-pos-id + (datum->syntax-object b (string->symbol (format "$~a-start-pos" i)) b stx-for-original-property)] + [end-pos-id + (datum->syntax-object b (string->symbol (format "$~a-end-pos" i)) b stx-for-original-property)]) + (set! biggest-pos (cons start-pos-id end-pos-id)) + `(,(datum->syntax-object b name b stx-for-original-property) + ,start-pos-id + ,end-pos-id + ,@(get-args (add1 i) (cdr rhs))))) + (else + `(,(datum->syntax-object b name b stx-for-original-property) + ,@(get-args (add1 i) (cdr rhs)))))))))]) + (values args biggest-pos)))) + + ;; Given the list of terminal symbols and the precedence/associativity definitions, + ;; builds terminal structures (See grammar.rkt) + ;; build-terms: symbol list * symbol list list -> term list + (define (build-terms term-list precs) + (let ((counter 0) + + ;;(term-list (cons (gensym) term-list)) + + ;; Will map a terminal symbol to its precedence/associativity + (prec-table (make-hash-table))) + + ;; Fill the prec table + (for-each + (lambda (p-decl) + (begin0 + (let ((assoc (car p-decl))) + (for-each + (lambda (term-sym) + (hash-table-put! prec-table term-sym (make-prec counter assoc))) + (cdr p-decl))) + (set! counter (add1 counter)))) + precs) + + ;; Build the terminal structures + (map + (lambda (term-sym) + (make-term term-sym + #f + (hash-table-get prec-table term-sym (lambda () #f)))) + term-list))) + + ;; Retrieves the terminal symbols from a terminals-def (See terminal-syntax.rkt) + ;; get-terms-from-def: identifier? -> (listof identifier?) + (define (get-terms-from-def term-syn) + (let ((t (syntax-local-value term-syn (lambda () #f)))) + (cond + ((terminals-def? t) (syntax->list (terminals-def-t t))) + ((e-terminals-def? t) (syntax->list (e-terminals-def-t t))) + (else + (raise-syntax-error + 'parser-tokens + "undefined token group" + term-syn))))) + + (define (get-term-list term-group-names) + (remove-duplicates + (cons (datum->syntax-object #f 'error) + (apply append + (map get-terms-from-def term-group-names))))) + + (define (parse-input term-defs start ends prec-decls prods src-pos) + (let* ((start-syms (map syntax-e start)) + + (list-of-terms (map syntax-e (get-term-list term-defs))) + + (end-terms + (map + (lambda (end) + (unless (memq (syntax-e end) list-of-terms) + (raise-syntax-error + 'parser-end-tokens + (format "End token ~a not defined as a token" + (syntax-e end)) + end)) + (syntax-e end)) + ends)) + + ;; Get the list of terminals out of input-terms + + (list-of-non-terms + (syntax-case prods () + (((non-term production ...) ...) + (begin + (for-each + (lambda (nts) + (if (memq (syntax-object->datum nts) list-of-terms) + (raise-syntax-error + 'parser-non-terminals + (format "~a used as both token and non-terminal" + (syntax-object->datum nts)) + nts))) + (syntax->list (syntax (non-term ...)))) + + (let ((dup (duplicate-list? (syntax-object->datum + (syntax (non-term ...)))))) + (if dup + (raise-syntax-error + 'parser-non-terminals + (format "non-terminal ~a defined multiple times" + dup) + prods))) + + (syntax-object->datum (syntax (non-term ...))))) + (_ + (raise-syntax-error + 'parser-grammar + "Grammar must be of the form (grammar (non-terminal productions ...) ...)" + prods)))) + + ;; Check the precedence declarations for errors and turn them into data + (precs + (syntax-case prec-decls () + (((type term ...) ...) + (let ((p-terms + (syntax-object->datum (syntax (term ... ...))))) + (cond + ((duplicate-list? p-terms) => + (lambda (d) + (raise-syntax-error + 'parser-precedences + (format "duplicate precedence declaration for token ~a" + d) + prec-decls))) + (else + (for-each + (lambda (a) + (for-each + (lambda (t) + (if (not (memq (syntax-object->datum t) + list-of-terms)) + (raise-syntax-error + 'parser-precedences + (format + "Precedence declared for non-token ~a" + (syntax-object->datum t)) + t))) + (syntax->list a))) + (syntax->list (syntax ((term ...) ...)))) + (for-each + (lambda (type) + (if (not (memq (syntax-object->datum type) + `(left right nonassoc))) + (raise-syntax-error + 'parser-precedences + "Associativity must be left, right or nonassoc" + type))) + (syntax->list (syntax (type ...)))) + (syntax-object->datum prec-decls))))) + (#f null) + (_ + (raise-syntax-error + 'parser-precedences + "Precedence declaration must be of the form (precs (assoc term ...) ...) where assoc is left, right or nonassoc" + prec-decls)))) + + (terms (build-terms list-of-terms precs)) + + (non-terms (map (lambda (non-term) (make-non-term non-term #f)) + list-of-non-terms)) + (term-table (make-hash-table)) + (non-term-table (make-hash-table))) + + (for-each (lambda (t) + (hash-table-put! term-table (gram-sym-symbol t) t)) + terms) + + (for-each (lambda (nt) + (hash-table-put! non-term-table (gram-sym-symbol nt) nt)) + non-terms) + + (let* ( + ;; parse-prod: syntax-object -> gram-sym vector + (parse-prod + (lambda (prod-so) + (syntax-case prod-so () + ((prod-rhs-sym ...) + (andmap identifier? (syntax->list prod-so)) + (begin + (for-each (lambda (t) + (if (memq (syntax-object->datum t) end-terms) + (raise-syntax-error + 'parser-production-rhs + (format "~a is an end token and cannot be used in a production" + (syntax-object->datum t)) + t))) + (syntax->list prod-so)) + (list->vector + (map (lambda (s) + (hash-table-get + term-table + (syntax-object->datum s) + (lambda () + (hash-table-get + non-term-table + (syntax-object->datum s) + (lambda () + (raise-syntax-error + 'parser-production-rhs + (format + "~a is not declared as a terminal or non-terminal" + (syntax-object->datum s)) + s)))))) + (syntax->list prod-so))))) + (_ + (raise-syntax-error + 'parser-production-rhs + "production right-hand-side must have form (symbol ...)" + prod-so))))) + + ;; parse-action: syntax-object * syntax-object -> syntax-object + (parse-action + (lambda (rhs act) + (let-values ([(args biggest) (get-args 1 (syntax->list rhs) src-pos term-defs)]) + (let ([act + (if biggest + (with-syntax ([$n-start-pos (datum->syntax-object (car biggest) '$n-start-pos)] + [$n-end-pos (datum->syntax-object (cdr biggest) '$n-end-pos)]) + #`(let ([$n-start-pos #,(car biggest)] + [$n-end-pos #,(cdr biggest)]) + #,act)) + act)]) + (quasisyntax/loc act + (lambda #,args + #,act)))))) + + ;; parse-prod+action: non-term * syntax-object -> production + (parse-prod+action + (lambda (nt prod-so) + (syntax-case prod-so () + ((prod-rhs action) + (let ((p (parse-prod (syntax prod-rhs)))) + (make-prod + nt + p + #f + (let loop ((i (sub1 (vector-length p)))) + (if (>= i 0) + (let ((gs (vector-ref p i))) + (if (term? gs) + (term-prec gs) + (loop (sub1 i)))) + #f)) + (parse-action (syntax prod-rhs) (syntax action))))) + ((prod-rhs (prec term) action) + (identifier? (syntax term)) + (let ((p (parse-prod (syntax prod-rhs)))) + (make-prod + nt + p + #f + (term-prec + (hash-table-get + term-table + (syntax-object->datum (syntax term)) + (lambda () + (raise-syntax-error + 'parser-production-rhs + (format + "unrecognized terminal ~a in precedence declaration" + (syntax-object->datum (syntax term))) + (syntax term))))) + (parse-action (syntax prod-rhs) (syntax action))))) + (_ + (raise-syntax-error + 'parser-production-rhs + "production must have form [(symbol ...) expression] or [(symbol ...) (prec symbol) expression]" + prod-so))))) + + ;; parse-prod-for-nt: syntax-object -> production list + (parse-prods-for-nt + (lambda (prods-so) + (syntax-case prods-so () + ((nt productions ...) + (> (length (syntax->list (syntax (productions ...)))) 0) + (let ((nt (hash-table-get non-term-table + (syntax-object->datum (syntax nt))))) + (map (lambda (p) (parse-prod+action nt p)) + (syntax->list (syntax (productions ...)))))) + (_ + (raise-syntax-error + 'parser-productions + "A production for a non-terminal must be (non-term right-hand-side ...) with at least 1 right hand side" + prods-so)))))) + + (for-each + (lambda (sstx ssym) + (unless (memq ssym list-of-non-terms) + (raise-syntax-error + 'parser-start + (format "Start symbol ~a not defined as a non-terminal" ssym) + sstx))) + start start-syms) + + (let* ((starts (map (lambda (x) (make-non-term (gensym) #f)) start-syms)) + (end-non-terms (map (lambda (x) (make-non-term (gensym) #f)) start-syms)) + (parsed-prods (map parse-prods-for-nt (syntax->list prods))) + (start-prods + (map (lambda (start end-non-term) + (list (make-prod start (vector end-non-term) #f #f + (syntax (lambda (x) x))))) + starts end-non-terms)) + (prods + `(,@start-prods + ,@(map + (lambda (end-nt start-sym) + (map + (lambda (end) + (make-prod end-nt + (vector + (hash-table-get non-term-table start-sym) + (hash-table-get term-table end)) + #f + #f + (syntax (lambda (x) x)))) + end-terms)) + end-non-terms start-syms) + ,@parsed-prods))) + + (make-object grammar% + prods + (map car start-prods) + terms + (append starts (append end-non-terms non-terms)) + (map (lambda (term-name) + (hash-table-get term-table term-name)) + end-terms))))))) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/lalr.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/lalr.rkt new file mode 100644 index 0000000..e9b4d3b --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/lalr.rkt @@ -0,0 +1,277 @@ +(module lalr mzscheme + + ;; Compute LALR lookaheads from DeRemer and Pennello 1982 + + (require "lr0.rkt" + "grammar.rkt" + mzlib/list + mzlib/class) + + (provide compute-LA) + + ;; compute-DR: LR0-automaton * grammar -> (trans-key -> term set) + ;; computes for each state, non-term transition pair, the terminals + ;; which can transition out of the resulting state + ;; output term set is represented in bit-vector form + (define (compute-DR a g) + (lambda (tk) + (let ((r (send a run-automaton (trans-key-st tk) (trans-key-gs tk)))) + (term-list->bit-vector + (filter + (lambda (term) + (send a run-automaton r term)) + (send g get-terms)))))) + + ;; compute-reads: + ;; LR0-automaton * grammar -> (trans-key -> trans-key list) + (define (compute-reads a g) + (let ((nullable-non-terms + (filter (lambda (nt) (send g nullable-non-term? nt)) + (send g get-non-terms)))) + (lambda (tk) + (let ((r (send a run-automaton (trans-key-st tk) (trans-key-gs tk)))) + (map (lambda (x) (make-trans-key r x)) + (filter (lambda (non-term) (send a run-automaton r non-term)) + nullable-non-terms)))))) + + ;; compute-read: LR0-automaton * grammar -> (trans-key -> term set) + ;; output term set is represented in bit-vector form + (define (compute-read a g) + (let* ((dr (compute-DR a g)) + (reads (compute-reads a g))) + (digraph-tk->terml (send a get-mapped-non-term-keys) + reads + dr + (send a get-num-states)))) + ;; returns the list of all k such that state k transitions to state start on the + ;; transitions in rhs (in order) + (define (run-lr0-backward a rhs dot-pos start num-states) + (let loop ((states (list start)) + (i (sub1 dot-pos))) + (cond + ((< i 0) states) + (else (loop (send a run-automaton-back states (vector-ref rhs i)) + (sub1 i)))))) + + ;; prod->items-for-include: grammar * prod * non-term -> lr0-item list + ;; returns the list of all (B -> beta . nt gamma) such that prod = (B -> beta nt gamma) + ;; and gamma =>* epsilon + (define (prod->items-for-include g prod nt) + (let* ((rhs (prod-rhs prod)) + (rhs-l (vector-length rhs))) + (append (if (and (> rhs-l 0) (eq? nt (vector-ref rhs (sub1 rhs-l)))) + (list (make-item prod (sub1 rhs-l))) + null) + (let loop ((i (sub1 rhs-l))) + (cond + ((and (> i 0) + (non-term? (vector-ref rhs i)) + (send g nullable-non-term? (vector-ref rhs i))) + (if (eq? nt (vector-ref rhs (sub1 i))) + (cons (make-item prod (sub1 i)) + (loop (sub1 i))) + (loop (sub1 i)))) + (else null)))))) + + ;; prod-list->items-for-include: grammar * prod list * non-term -> lr0-item list + ;; return the list of all (B -> beta . nt gamma) such that (B -> beta nt gamma) in prod-list + ;; and gamma =>* epsilon + (define (prod-list->items-for-include g prod-list nt) + (apply append (map (lambda (prod) (prod->items-for-include g prod nt)) prod-list))) + + ;; comput-includes: lr0-automaton * grammar -> (trans-key -> trans-key list) + (define (compute-includes a g) + (let ((num-states (send a get-num-states)) + (items-for-input-nt (make-vector (send g get-num-non-terms) null))) + (for-each + (lambda (input-nt) + (vector-set! items-for-input-nt (non-term-index input-nt) + (prod-list->items-for-include g (send g get-prods) input-nt))) + (send g get-non-terms)) + (lambda (tk) + (let* ((goal-state (trans-key-st tk)) + (non-term (trans-key-gs tk)) + (items (vector-ref items-for-input-nt (non-term-index non-term)))) + (trans-key-list-remove-dups + (apply append + (map (lambda (item) + (let* ((prod (item-prod item)) + (rhs (prod-rhs prod)) + (lhs (prod-lhs prod))) + (map (lambda (state) + (make-trans-key state lhs)) + (run-lr0-backward a + rhs + (item-dot-pos item) + goal-state + num-states)))) + items))))))) + + ;; compute-lookback: lr0-automaton * grammar -> (kernel * proc -> trans-key list) + (define (compute-lookback a g) + (let ((num-states (send a get-num-states))) + (lambda (state prod) + (map (lambda (k) (make-trans-key k (prod-lhs prod))) + (run-lr0-backward a (prod-rhs prod) (vector-length (prod-rhs prod)) state num-states))))) + + ;; compute-follow: LR0-automaton * grammar -> (trans-key -> term set) + ;; output term set is represented in bit-vector form + (define (compute-follow a g includes) + (let ((read (compute-read a g))) + (digraph-tk->terml (send a get-mapped-non-term-keys) + includes + read + (send a get-num-states)))) + + ;; compute-LA: LR0-automaton * grammar -> kernel * prod -> term set + ;; output term set is represented in bit-vector form + (define (compute-LA a g) + (let* ((includes (compute-includes a g)) + (lookback (compute-lookback a g)) + (follow (compute-follow a g includes))) + (lambda (k p) + (let* ((l (lookback k p)) + (f (map follow l))) + (apply bitwise-ior (cons 0 f)))))) + + (define (print-DR dr a g) + (print-input-st-sym dr "DR" a g print-output-terms)) + (define (print-Read Read a g) + (print-input-st-sym Read "Read" a g print-output-terms)) + (define (print-includes i a g) + (print-input-st-sym i "includes" a g print-output-st-nt)) + (define (print-lookback l a g) + (print-input-st-prod l "lookback" a g print-output-st-nt)) + (define (print-follow f a g) + (print-input-st-sym f "follow" a g print-output-terms)) + (define (print-LA l a g) + (print-input-st-prod l "LA" a g print-output-terms)) + + (define (print-input-st-sym f name a g print-output) + (printf "~a:\n" name) + (send a for-each-state + (lambda (state) + (for-each + (lambda (non-term) + (let ((res (f (make-trans-key state non-term)))) + (if (not (null? res)) + (printf "~a(~a, ~a) = ~a\n" + name + state + (gram-sym-symbol non-term) + (print-output res))))) + (send g get-non-terms)))) + (newline)) + + (define (print-input-st-prod f name a g print-output) + (printf "~a:\n" name) + (send a for-each-state + (lambda (state) + (for-each + (lambda (non-term) + (for-each + (lambda (prod) + (let ((res (f state prod))) + (if (not (null? res)) + (printf "~a(~a, ~a) = ~a\n" + name + (kernel-index state) + (prod-index prod) + (print-output res))))) + (send g get-prods-for-non-term non-term))) + (send g get-non-terms))))) + + (define (print-output-terms r) + (map + (lambda (p) + (gram-sym-symbol p)) + r)) + + (define (print-output-st-nt r) + (map + (lambda (p) + (list + (kernel-index (trans-key-st p)) + (gram-sym-symbol (trans-key-gs p)))) + r)) + + ;; init-tk-map : int -> (vectorof hashtable?) + (define (init-tk-map n) + (let ((v (make-vector n #f))) + (let loop ((i (sub1 (vector-length v)))) + (when (>= i 0) + (vector-set! v i (make-hash-table)) + (loop (sub1 i)))) + v)) + + ;; lookup-tk-map : (vectorof (symbol? int hashtable)) -> trans-key? -> int + (define (lookup-tk-map map) + (lambda (tk) + (let ((st (trans-key-st tk)) + (gs (trans-key-gs tk))) + (hash-table-get (vector-ref map (kernel-index st)) + (gram-sym-symbol gs) + (lambda () 0))))) + + ;; add-tk-map : (vectorof (symbol? int hashtable)) -> trans-key int -> + (define (add-tk-map map) + (lambda (tk v) + (let ((st (trans-key-st tk)) + (gs (trans-key-gs tk))) + (hash-table-put! (vector-ref map (kernel-index st)) + (gram-sym-symbol gs) + v)))) + + ;; digraph-tk->terml: + ;; (trans-key list) * (trans-key -> trans-key list) * (trans-key -> term list) * int * int * int + ;; -> (trans-key -> term list) + ;; DeRemer and Pennello 1982 + ;; Computes (f x) = (f- x) union Union{(f y) | y in (edges x)} + ;; A specialization of digraph in the file graph.rkt + (define (digraph-tk->terml nodes edges f- num-states) + (letrec [ + ;; Will map elements of trans-key to term sets represented as bit vectors + (results (init-tk-map num-states)) + + ;; Maps elements of trans-keys to integers. + (N (init-tk-map num-states)) + + (get-N (lookup-tk-map N)) + (set-N (add-tk-map N)) + (get-f (lookup-tk-map results)) + (set-f (add-tk-map results)) + + (stack null) + (push (lambda (x) + (set! stack (cons x stack)))) + (pop (lambda () + (begin0 + (car stack) + (set! stack (cdr stack))))) + (depth (lambda () (length stack))) + + ;; traverse: 'a -> + (traverse + (lambda (x) + (push x) + (let ((d (depth))) + (set-N x d) + (set-f x (f- x)) + (for-each (lambda (y) + (when (= 0 (get-N y)) + (traverse y)) + (set-f x (bitwise-ior (get-f x) (get-f y))) + (set-N x (min (get-N x) (get-N y)))) + (edges x)) + (when (= d (get-N x)) + (let loop ((p (pop))) + (set-N p +inf.0) + (set-f p (get-f x)) + (unless (equal? x p) + (loop (pop))))))))] + (for-each (lambda (x) + (when (= 0 (get-N x)) + (traverse x))) + nodes) + get-f)) +) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/lr0.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/lr0.rkt new file mode 100644 index 0000000..f237735 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/lr0.rkt @@ -0,0 +1,372 @@ +(module lr0 mzscheme + + ;; Handle the LR0 automaton + + (require "grammar.rkt" + "graph.rkt" + mzlib/list + mzlib/class) + + (provide build-lr0-automaton lr0% + (struct trans-key (st gs)) trans-key-list-remove-dups + kernel-items kernel-index) + + ;; kernel = (make-kernel (LR1-item list) index) + ;; the list must be kept sorted according to item + ;; (vectorof (symbol X hashtable)) + (define (build-transition-table num-states assoc) + (let ((transitions (make-vector num-states #f))) + (let loop ((i (sub1 (vector-length transitions)))) + (when (>= i 0) + (vector-set! transitions i (make-hash-table)) + (loop (sub1 i)))) + (for-each + (lambda (trans-key/kernel) + (let ((tk (car trans-key/kernel))) + (hash-table-put! (vector-ref transitions (kernel-index (trans-key-st tk))) + (gram-sym-symbol (trans-key-gs tk)) + (cdr trans-key/kernel)))) + assoc) + transitions)) + + ;; reverse-assoc : (listof (cons/c trans-key? kernel?)) -> + ;; (listof (cons/c trans-key? (listof kernel?))) + (define (reverse-assoc assoc) + (let ((reverse-hash (make-hash-table 'equal)) + (hash-table-add! + (lambda (ht k v) + (hash-table-put! ht k (cons v (hash-table-get ht k (lambda () null))))))) + (for-each + (lambda (trans-key/kernel) + (let ((tk (car trans-key/kernel))) + (hash-table-add! reverse-hash + (make-trans-key (cdr trans-key/kernel) + (trans-key-gs tk)) + (trans-key-st tk)))) + assoc) + (hash-table-map reverse-hash cons))) + + + ;; kernel-list-remove-duplicates + ;; LR0-automaton = object of class lr0% + (define lr0% + (class object% + (super-instantiate ()) + ;; term-assoc : (listof (cons/c trans-key? kernel?)) + ;; non-term-assoc : (listof (cons/c trans-key? kernel?)) + ;; states : (vectorof kernel?) + ;; epsilons : ??? + (init-field term-assoc non-term-assoc states epsilons) + + (define transitions (build-transition-table (vector-length states) + (append term-assoc non-term-assoc))) + + (define reverse-term-assoc (reverse-assoc term-assoc)) + (define reverse-non-term-assoc (reverse-assoc non-term-assoc)) + (define reverse-transitions + (build-transition-table (vector-length states) + (append reverse-term-assoc reverse-non-term-assoc))) + + (define mapped-non-terms (map car non-term-assoc)) + + (define/public (get-mapped-non-term-keys) + mapped-non-terms) + + (define/public (get-num-states) + (vector-length states)) + + (define/public (get-epsilon-trans) + epsilons) + + (define/public (get-transitions) + (append term-assoc non-term-assoc)) + + ;; for-each-state : (state ->) -> + ;; Iteration over the states in an automaton + (define/public (for-each-state f) + (let ((num-states (vector-length states))) + (let loop ((i 0)) + (if (< i num-states) + (begin + (f (vector-ref states i)) + (loop (add1 i))))))) + + ;; run-automaton: kernel? gram-sym? -> (union kernel #f) + ;; returns the state reached from state k on input s, or #f when k + ;; has no transition on s + (define/public (run-automaton k s) + (hash-table-get (vector-ref transitions (kernel-index k)) + (gram-sym-symbol s) + (lambda () #f))) + + ;; run-automaton-back : (listof kernel?) gram-sym? -> (listof kernel) + ;; returns the list of states that can reach k by transitioning on s. + (define/public (run-automaton-back k s) + (apply append + (map + (lambda (k) + (hash-table-get (vector-ref reverse-transitions (kernel-index k)) + (gram-sym-symbol s) + (lambda () null))) + k))))) + + (define (union comp (eq? a b) + (define (kernel->string k) + (apply string-append + `("{" ,@(map (lambda (i) (string-append (item->string i) ", ")) + (kernel-items k)) + "}"))) + + ;; build-LR0-automaton: grammar -> LR0-automaton + ;; Constructs the kernels of the sets of LR(0) items of g + (define (build-lr0-automaton grammar) +; (printf "LR(0) automaton:\n") + (letrec ( + (epsilons (make-hash-table 'equal)) + (grammar-symbols (append (send grammar get-non-terms) + (send grammar get-terms))) + ;; first-non-term: non-term -> non-term list + ;; given a non-terminal symbol C, return those non-terminal + ;; symbols A s.t. C -> An for some string of terminals and + ;; non-terminals n where -> means a rightmost derivation in many + ;; steps. Assumes that each non-term can be reduced to a string + ;; of terms. + (first-non-term + (digraph (send grammar get-non-terms) + (lambda (nt) + (filter non-term? + (map (lambda (prod) + (sym-at-dot (make-item prod 0))) + (send grammar get-prods-for-non-term nt)))) + (lambda (nt) (list nt)) + (union non-term LR1-item list + ;; Creates a set of items containing i s.t. if A -> n.Xm is in it, + ;; X -> .o is in it too. + (LR0-closure + (lambda (i) + (cond + ((null? i) null) + (else + (let ((next-gsym (sym-at-dot (car i)))) + (cond + ((non-term? next-gsym) + (cons (car i) + (append + (apply append + (map (lambda (non-term) + (map (lambda (x) + (make-item x 0)) + (send grammar + get-prods-for-non-term + non-term))) + (first-non-term next-gsym))) + (LR0-closure (cdr i))))) + (else + (cons (car i) (LR0-closure (cdr i)))))))))) + + + ;; maps trans-keys to kernels + (automaton-term null) + (automaton-non-term null) + + ;; keeps the kernels we have seen, so we can have a unique + ;; list for each kernel + (kernels (make-hash-table 'equal)) + + (counter 0) + + ;; goto: LR1-item list -> LR1-item list list + ;; creates new kernels by moving the dot in each item in the + ;; LR0-closure of kernel to the right, and grouping them by + ;; the term/non-term moved over. Returns the kernels not + ;; yet seen, and places the trans-keys into automaton + (goto + (lambda (kernel) + (let ( + ;; maps a gram-syms to a list of items + (table (make-hash-table)) + + ;; add-item!: + ;; (symbol (listof item) hashtable) item? -> + ;; adds i into the table grouped with the grammar + ;; symbol following its dot + (add-item! + (lambda (table i) + (let ((gs (sym-at-dot i))) + (cond + (gs + (let ((already + (hash-table-get table + (gram-sym-symbol gs) + (lambda () null)))) + (unless (member i already) + (hash-table-put! table + (gram-sym-symbol gs) + (cons i already))))) + ((= 0 (vector-length (prod-rhs (item-prod i)))) + (let ((current (hash-table-get epsilons + kernel + (lambda () null)))) + (hash-table-put! epsilons + kernel + (cons i current))))))))) + + ;; Group the items of the LR0 closure of the kernel + ;; by the character after the dot + (for-each (lambda (item) + (add-item! table item)) + (LR0-closure (kernel-items kernel))) + + ;; each group is a new kernel, with the dot advanced. + ;; sorts the items in a kernel so kernels can be compared + ;; with equal? for using the table kernels to make sure + ;; only one representitive of each kernel is created + (filter + (lambda (x) x) + (map + (lambda (i) + (let* ((gs (car i)) + (items (cadr i)) + (new #f) + (new-kernel (sort + (filter (lambda (x) x) + (map move-dot-right items)) + item ~a on ~a\n" + (kernel->string kernel) + (kernel->string unique-kernel) + (gram-sym-symbol gs)) + (if new + unique-kernel + #f))) + (let loop ((gsyms grammar-symbols)) + (cond + ((null? gsyms) null) + (else + (let ((items (hash-table-get table + (gram-sym-symbol (car gsyms)) + (lambda () null)))) + (cond + ((null? items) (loop (cdr gsyms))) + (else + (cons (list (car gsyms) items) + (loop (cdr gsyms)))))))))))))) + + (starts + (map (lambda (init-prod) (list (make-item init-prod 0))) + (send grammar get-init-prods))) + (startk + (map (lambda (start) + (let ((k (make-kernel start counter))) + (hash-table-put! kernels start k) + (set! counter (add1 counter)) + k)) + starts)) + (new-kernels (make-queue))) + + (let loop ((old-kernels startk) + (seen-kernels null)) + (cond + ((and (empty-queue? new-kernels) (null? old-kernels)) + (make-object lr0% + automaton-term + automaton-non-term + (list->vector (reverse seen-kernels)) + epsilons)) + ((null? old-kernels) + (loop (deq! new-kernels) seen-kernels)) + (else + (enq! new-kernels (goto (car old-kernels))) + (loop (cdr old-kernels) (cons (car old-kernels) seen-kernels))))))) + + (define-struct q (f l) (make-inspector)) + (define (empty-queue? q) + (null? (q-f q))) + (define (make-queue) + (make-q null null)) + (define (enq! q i) + (if (empty-queue? q) + (let ((i (mcons i null))) + (set-q-l! q i) + (set-q-f! q i)) + (begin + (set-mcdr! (q-l q) (mcons i null)) + (set-q-l! q (mcdr (q-l q)))))) + (define (deq! q) + (begin0 + (mcar (q-f q)) + (set-q-f! q (mcdr (q-f q))))) + +) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/parser-actions.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/parser-actions.rkt new file mode 100644 index 0000000..2a39b36 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/parser-actions.rkt @@ -0,0 +1,54 @@ +(module parser-actions mzscheme + (require "grammar.rkt") + (provide (all-defined-except make-reduce make-reduce*) + (rename make-reduce* make-reduce)) + + ;; An action is + ;; - (make-shift int) + ;; - (make-reduce prod runtime-action) + ;; - (make-accept) + ;; - (make-goto int) + ;; - (no-action) + ;; A reduce contains a runtime-reduce so that sharing of the reduces can + ;; be easily transferred to sharing of runtime-reduces. + + (define-struct action () (make-inspector)) + (define-struct (shift action) (state) (make-inspector)) + (define-struct (reduce action) (prod runtime-reduce) (make-inspector)) + (define-struct (accept action) () (make-inspector)) + (define-struct (goto action) (state) (make-inspector)) + (define-struct (no-action action) () (make-inspector)) + + (define (make-reduce* p) + (make-reduce p + (vector (prod-index p) + (gram-sym-symbol (prod-lhs p)) + (vector-length (prod-rhs p))))) + + ;; A runtime-action is + ;; non-negative-int (shift) + ;; (vector int symbol int) (reduce) + ;; 'accept (accept) + ;; negative-int (goto) + ;; #f (no-action) + + (define (action->runtime-action a) + (cond + ((shift? a) (shift-state a)) + ((reduce? a) (reduce-runtime-reduce a)) + ((accept? a) 'accept) + ((goto? a) (- (+ (goto-state a) 1))) + ((no-action? a) #f))) + + (define (runtime-shift? x) (and (integer? x) (>= x 0))) + (define runtime-reduce? vector?) + (define (runtime-accept? x) (eq? x 'accept)) + (define (runtime-goto? x) (and (integer? x) (< x 0))) + + (define runtime-shift-state values) + (define (runtime-reduce-prod-num x) (vector-ref x 0)) + (define (runtime-reduce-lhs x) (vector-ref x 1)) + (define (runtime-reduce-rhs-length x) (vector-ref x 2)) + (define (runtime-goto-state x) (- (+ x 1))) + + ) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/parser-builder.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/parser-builder.rkt new file mode 100644 index 0000000..1be421c --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/parser-builder.rkt @@ -0,0 +1,113 @@ +(module parser-builder mzscheme + + (require "input-file-parser.rkt" + "grammar.rkt" + "table.rkt" + mzlib/class + racket/contract) + (require-for-template mzscheme) + + (provide/contract + (build-parser (-> string? any/c any/c + (listof identifier?) + (listof identifier?) + (listof identifier?) + (or/c syntax? #f) + syntax? + (values any/c any/c any/c any/c)))) + + ;; fix-check-syntax : (listof identifier?) (listof identifier?) (listof identifier?) + ;; (union syntax? false/c) syntax?) -> syntax? + (define (fix-check-syntax input-terms start ends assocs prods) + (let* ((term-binders (get-term-list input-terms)) + (get-term-binder + (let ((t (make-hash-table))) + (for-each + (lambda (term) + (hash-table-put! t (syntax-e term) term)) + term-binders) + (lambda (x) + (let ((r (hash-table-get t (syntax-e x) (lambda () #f)))) + (if r + (syntax-local-introduce (datum->syntax-object r (syntax-e x) x x)) + x))))) + (rhs-list + (syntax-case prods () + (((_ rhs ...) ...) + (syntax->list (syntax (rhs ... ...))))))) + (with-syntax (((tmp ...) (map syntax-local-introduce term-binders)) + ((term-group ...) + (map (lambda (tg) + (syntax-property + (datum->syntax-object tg #f) + 'disappeared-use + tg)) + input-terms)) + ((end ...) + (map get-term-binder ends)) + ((start ...) + (map get-term-binder start)) + ((bind ...) + (syntax-case prods () + (((bind _ ...) ...) + (syntax->list (syntax (bind ...)))))) + (((bound ...) ...) + (map + (lambda (rhs) + (syntax-case rhs () + (((bound ...) (_ pbound) __) + (map get-term-binder + (cons (syntax pbound) + (syntax->list (syntax (bound ...)))))) + (((bound ...) _) + (map get-term-binder + (syntax->list (syntax (bound ...))))))) + rhs-list)) + ((prec ...) + (if assocs + (map get-term-binder + (syntax-case assocs () + (((__ term ...) ...) + (syntax->list (syntax (term ... ...)))))) + null))) + #`(when #f + (let ((bind void) ... (tmp void) ...) + (void bound ... ... term-group ... start ... end ... prec ...)))))) + (require mzlib/list "parser-actions.rkt") + (define (build-parser filename src-pos suppress input-terms start end assocs prods) + (let* ((grammar (parse-input input-terms start end assocs prods src-pos)) + (table (build-table grammar filename suppress)) + (all-tokens (make-hash-table)) + (actions-code + `(vector ,@(map prod-action (send grammar get-prods))))) + (for-each (lambda (term) + (hash-table-put! all-tokens (gram-sym-symbol term) #t)) + (send grammar get-terms)) + #;(let ((num-states (vector-length table)) + (num-gram-syms (+ (send grammar get-num-terms) + (send grammar get-num-non-terms))) + (num-ht-entries (apply + (map length (vector->list table)))) + (num-reduces + (let ((ht (make-hash-table))) + (for-each + (lambda (x) + (when (reduce? x) + (hash-table-put! ht x #t))) + (map cdr (apply append (vector->list table)))) + (length (hash-table-map ht void))))) + (printf "~a states, ~a grammar symbols, ~a hash-table entries, ~a reduces\n" + num-states num-gram-syms num-ht-entries num-reduces) + (printf "~a -- ~aKB, previously ~aKB\n" + (/ (+ 2 num-states + (* 4 num-states) (* 2 1.5 num-ht-entries) + (* 5 num-reduces)) 256.0) + (/ (+ 2 num-states + (* 4 num-states) (* 2 2.3 num-ht-entries) + (* 5 num-reduces)) 256.0) + (/ (+ 2 (* num-states num-gram-syms) (* 5 num-reduces)) 256.0))) + (values table + all-tokens + actions-code + (fix-check-syntax input-terms start end assocs prods)))) + + ) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/table.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/table.rkt new file mode 100644 index 0000000..f97e4d2 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/table.rkt @@ -0,0 +1,290 @@ +#lang scheme/base + + ;; Routine to build the LALR table + + (require "grammar.rkt" + "lr0.rkt" + "lalr.rkt" + "parser-actions.rkt" + racket/contract + mzlib/list + mzlib/class) + + (define (is-a-grammar%? x) (is-a? x grammar%)) + (provide/contract + (build-table (-> is-a-grammar%? string? any/c + (vectorof (listof (cons/c (or/c term? non-term?) action?)))))) + + ;; A parse-table is (vectorof (listof (cons/c gram-sym? action))) + ;; A grouped-parse-table is (vectorof (listof (cons/c gram-sym? (listof action)))) + + ;; make-parse-table : int -> parse-table + (define (make-parse-table num-states) + (make-vector num-states null)) + + ;; table-add!: parse-table nat symbol action -> + (define (table-add! table state-index symbol val) + (vector-set! table state-index (cons (cons symbol val) + (vector-ref table state-index)))) + + ;; group-table : parse-table -> grouped-parse-table + (define (group-table table) + (list->vector + (map + (lambda (state-entry) + (let ((ht (make-hash))) + (for-each + (lambda (gs/actions) + (let ((group (hash-ref ht (car gs/actions) (lambda () null)))) + (unless (member (cdr gs/actions) group) + (hash-set! ht (car gs/actions) (cons (cdr gs/actions) group))))) + state-entry) + (hash-map ht cons))) + (vector->list table)))) + + ;; table-map : (vectorof (listof (cons/c gram-sym? X))) (gram-sym? X -> Y) -> + ;; (vectorof (listof (cons/c gram-sym? Y))) + (define (table-map f table) + (list->vector + (map + (lambda (state-entry) + (map + (lambda (gs/X) + (cons (car gs/X) (f (car gs/X) (cdr gs/X)))) + state-entry)) + (vector->list table)))) + + + (define (bit-vector-for-each f bv) + (letrec ((for-each + (lambda (bv number) + (cond + ((= 0 bv) (void)) + ((= 1 (bitwise-and 1 bv)) + (f number) + (for-each (arithmetic-shift bv -1) (add1 number))) + (else (for-each (arithmetic-shift bv -1) (add1 number))))))) + (for-each bv 0))) + + + ;; print-entry: symbol action output-port -> + ;; prints the action a for lookahead sym to the given port + (define (print-entry sym a port) + (let ((s "\t~a\t\t\t\t\t~a\t~a\n")) + (cond + ((shift? a) + (fprintf port s sym "shift" (shift-state a))) + ((reduce? a) + (fprintf port s sym "reduce" (prod-index (reduce-prod a)))) + ((accept? a) + (fprintf port s sym "accept" "")) + ((goto? a) + (fprintf port s sym "goto" (goto-state a)))))) + + + ;; count: ('a -> bool) * 'a list -> num + ;; counts the number of elements in list that satisfy pred + (define (count pred list) + (cond + ((null? list) 0) + ((pred (car list)) (+ 1 (count pred (cdr list)))) + (else (count pred (cdr list))))) + + ;; display-parser: LR0-automaton grouped-parse-table (listof prod?) output-port -> + ;; Prints out the parser given by table. + (define (display-parser a grouped-table prods port) + (let* ((SR-conflicts 0) + (RR-conflicts 0)) + (for-each + (lambda (prod) + (fprintf port + "~a\t~a\t=\t~a\n" + (prod-index prod) + (gram-sym-symbol (prod-lhs prod)) + (map gram-sym-symbol (vector->list (prod-rhs prod))))) + prods) + (send a for-each-state + (lambda (state) + (fprintf port "State ~a\n" (kernel-index state)) + (for-each (lambda (item) + (fprintf port "\t~a\n" (item->string item))) + (kernel-items state)) + (newline port) + (for-each + (lambda (gs/action) + (let ((sym (gram-sym-symbol (car gs/action))) + (act (cdr gs/action))) + (cond + ((null? act) (void)) + ((null? (cdr act)) + (print-entry sym (car act) port)) + (else + (fprintf port "begin conflict:\n") + (when (> (count reduce? act) 1) + (set! RR-conflicts (add1 RR-conflicts))) + (when (> (count shift? act) 0) + (set! SR-conflicts (add1 SR-conflicts))) + (map (lambda (x) (print-entry sym x port)) act) + (fprintf port "end conflict\n"))))) + (vector-ref grouped-table (kernel-index state))) + (newline port))) + + (when (> SR-conflicts 0) + (fprintf port "~a shift/reduce conflict~a\n" + SR-conflicts + (if (= SR-conflicts 1) "" "s"))) + (when (> RR-conflicts 0) + (fprintf port "~a reduce/reduce conflict~a\n" + RR-conflicts + (if (= RR-conflicts 1) "" "s"))))) + + ;; resolve-conflict : (listof action?) -> action? bool bool + (define (resolve-conflict actions) + (cond + ((null? actions) (values (make-no-action) #f #f)) + ((null? (cdr actions)) + (values (car actions) #f #f)) + (else + (let ((SR-conflict? (> (count shift? actions) 0)) + (RR-conflict? (> (count reduce? actions) 1))) + (let loop ((current-guess #f) + (rest actions)) + (cond + ((null? rest) (values current-guess SR-conflict? RR-conflict?)) + ((shift? (car rest)) (values (car rest) SR-conflict? RR-conflict?)) + ((not current-guess) + (loop (car rest) (cdr rest))) + ((and (reduce? (car rest)) + (< (prod-index (reduce-prod (car rest))) + (prod-index (reduce-prod current-guess)))) + (loop (car rest) (cdr rest))) + ((accept? (car rest)) + (eprintf "accept/reduce or accept/shift conflicts. Check the grammar for useless cycles of productions\n") + (loop current-guess (cdr rest))) + (else (loop current-guess (cdr rest))))))))) + + ;; resolve-conflicts : grouped-parse-table bool -> parse-table + (define (resolve-conflicts grouped-table suppress) + (let* ((SR-conflicts 0) + (RR-conflicts 0) + (table (table-map + (lambda (gs actions) + (let-values (((action SR? RR?) + (resolve-conflict actions))) + (when SR? + (set! SR-conflicts (add1 SR-conflicts))) + (when RR? + (set! RR-conflicts (add1 RR-conflicts))) + action)) + grouped-table))) + (unless suppress + (when (> SR-conflicts 0) + (eprintf "~a shift/reduce conflict~a\n" + SR-conflicts + (if (= SR-conflicts 1) "" "s"))) + (when (> RR-conflicts 0) + (eprintf "~a reduce/reduce conflict~a\n" + RR-conflicts + (if (= RR-conflicts 1) "" "s")))) + table)) + + + ;; resolve-sr-conflict : (listof action) (union int #f) -> (listof action) + ;; Resolves a single shift-reduce conflict, if precedences are in place. + (define (resolve-sr-conflict/prec actions shift-prec) + (let* ((shift (if (shift? (car actions)) + (car actions) + (cadr actions))) + (reduce (if (shift? (car actions)) + (cadr actions) + (car actions))) + (reduce-prec (prod-prec (reduce-prod reduce)))) + (cond + ((and shift-prec reduce-prec) + (cond + ((< (prec-num shift-prec) (prec-num reduce-prec)) + (list reduce)) + ((> (prec-num shift-prec) (prec-num reduce-prec)) + (list shift)) + ((eq? 'left (prec-assoc shift-prec)) + (list reduce)) + ((eq? 'right (prec-assoc shift-prec)) + (list shift)) + (else null))) + (else actions)))) + + + ;; resolve-prec-conflicts : parse-table -> grouped-parse-table + (define (resolve-prec-conflicts table) + (table-map + (lambda (gs actions) + (cond + ((and (term? gs) + (= 2 (length actions)) + (or (shift? (car actions)) + (shift? (cadr actions)))) + (resolve-sr-conflict/prec actions (term-prec gs))) + (else actions))) + (group-table table))) + + ;; build-table: grammar string bool -> parse-table + (define (build-table g file suppress) + (let* ((a (build-lr0-automaton g)) + (term-vector (list->vector (send g get-terms))) + (end-terms (send g get-end-terms)) + (table (make-parse-table (send a get-num-states))) + (get-lookahead (compute-LA a g)) + (reduce-cache (make-hash))) + + (for-each + (lambda (trans-key/state) + (let ((from-state-index (kernel-index (trans-key-st (car trans-key/state)))) + (gs (trans-key-gs (car trans-key/state))) + (to-state (cdr trans-key/state))) + (table-add! table from-state-index gs + (cond + ((non-term? gs) + (make-goto (kernel-index to-state))) + ((member gs end-terms) + (make-accept)) + (else + (make-shift + (kernel-index to-state))))))) + (send a get-transitions)) + + (send a for-each-state + (lambda (state) + (for-each + (lambda (item) + (let ((item-prod (item-prod item))) + (bit-vector-for-each + (lambda (term-index) + (unless (start-item? item) + (let ((r (hash-ref reduce-cache item-prod + (lambda () + (let ((r (make-reduce item-prod))) + (hash-set! reduce-cache item-prod r) + r))))) + (table-add! table + (kernel-index state) + (vector-ref term-vector term-index) + r)))) + (get-lookahead state item-prod)))) + (append (hash-ref (send a get-epsilon-trans) state (lambda () null)) + (filter (lambda (item) + (not (move-dot-right item))) + (kernel-items state)))))) + + (let ((grouped-table (resolve-prec-conflicts table))) + (unless (string=? file "") + (with-handlers [(exn:fail:filesystem? + (lambda (e) + (eprintf + "Cannot write debug output to file \"~a\": ~a\n" + file + (exn-message e))))] + (call-with-output-file file + (lambda (port) + (display-parser a grouped-table (send g get-prods) port)) + #:exists 'truncate))) + (resolve-conflicts grouped-table suppress)))) diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/yacc-helper.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/yacc-helper.rkt new file mode 100644 index 0000000..31b3cc6 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/private-yacc/yacc-helper.rkt @@ -0,0 +1,118 @@ +(module yacc-helper mzscheme + + (require mzlib/list + "../private-lex/token-syntax.rkt") + + ;; General helper routines + + (provide duplicate-list? remove-duplicates overlap? vector-andmap display-yacc) + + (define (vector-andmap f v) + (let loop ((i 0)) + (cond + ((= i (vector-length v)) #t) + (else (if (f (vector-ref v i)) + (loop (add1 i)) + #f))))) + + ;; duplicate-list?: symbol list -> #f | symbol + ;; returns a symbol that exists twice in l, or false if no such symbol + ;; exists + (define (duplicate-list? l) + (letrec ((t (make-hash-table)) + (dl? (lambda (l) + (cond + ((null? l) #f) + ((hash-table-get t (car l) (lambda () #f)) => + (lambda (x) x)) + (else + (hash-table-put! t (car l) (car l)) + (dl? (cdr l))))))) + (dl? l))) + + ;; remove-duplicates: syntax-object list -> syntax-object list + ;; removes the duplicates from the lists + (define (remove-duplicates sl) + (let ((t (make-hash-table))) + (letrec ((x + (lambda (sl) + (cond + ((null? sl) sl) + ((hash-table-get t (syntax-object->datum (car sl)) (lambda () #f)) + (x (cdr sl))) + (else + (hash-table-put! t (syntax-object->datum (car sl)) #t) + (cons (car sl) (x (cdr sl)))))))) + (x sl)))) + + ;; overlap?: symbol list * symbol list -> #f | symbol + ;; Returns an symbol in l1 intersect l2, or #f is no such symbol exists + (define (overlap? l1 l2) + (let/ec ret + (let ((t (make-hash-table))) + (for-each (lambda (s1) + (hash-table-put! t s1 s1)) + l1) + (for-each (lambda (s2) + (cond + ((hash-table-get t s2 (lambda () #f)) => + (lambda (o) (ret o))))) + l2) + #f))) + + + (define (display-yacc grammar tokens start precs port) + (let-syntax ((p (syntax-rules () + ((_ args ...) (fprintf port args ...))))) + (let* ((tokens (map syntax-local-value tokens)) + (eterms (filter e-terminals-def? tokens)) + (terms (filter terminals-def? tokens)) + (term-table (make-hash-table)) + (display-rhs + (lambda (rhs) + (for-each (lambda (sym) (p "~a " (hash-table-get term-table sym (lambda () sym)))) + (car rhs)) + (if (= 3 (length rhs)) + (p "%prec ~a" (cadadr rhs))) + (p "\n")))) + (for-each + (lambda (t) + (for-each + (lambda (t) + (hash-table-put! term-table t (format "'~a'" t))) + (syntax-object->datum (e-terminals-def-t t)))) + eterms) + (for-each + (lambda (t) + (for-each + (lambda (t) + (p "%token ~a\n" t) + (hash-table-put! term-table t (format "~a" t))) + (syntax-object->datum (terminals-def-t t)))) + terms) + (if precs + (for-each (lambda (prec) + (p "%~a " (car prec)) + (for-each (lambda (tok) + (p " ~a" (hash-table-get term-table tok))) + (cdr prec)) + (p "\n")) + precs)) + (p "%start ~a\n" start) + (p "%%\n") + + (for-each (lambda (prod) + (let ((nt (car prod))) + (p "~a: " nt) + (display-rhs (cadr prod)) + (for-each (lambda (rhs) + (p "| ") + (display-rhs rhs)) + (cddr prod)) + (p ";\n"))) + grammar) + (p "%%\n")))) + + +) + diff --git a/br-parser-tools/br-parser-tools-lib/br-parser-tools/yacc-to-scheme.rkt b/br-parser-tools/br-parser-tools-lib/br-parser-tools/yacc-to-scheme.rkt new file mode 100644 index 0000000..7f766eb --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/br-parser-tools/yacc-to-scheme.rkt @@ -0,0 +1,135 @@ +(module yacc-to-scheme mzscheme + (require br-parser-tools/lex + (prefix : br-parser-tools/lex-sre) + br-parser-tools/yacc + syntax/readerr + mzlib/list) + (provide trans) + + (define match-double-string + (lexer + ((:+ (:~ #\" #\\)) (append (string->list lexeme) + (match-double-string input-port))) + ((:: #\\ any-char) (cons (string-ref lexeme 1) (match-double-string input-port))) + (#\" null))) + + (define match-single-string + (lexer + ((:+ (:~ #\' #\\)) (append (string->list lexeme) + (match-single-string input-port))) + ((:: #\\ any-char) (cons (string-ref lexeme 1) (match-single-string input-port))) + (#\' null))) + + (define-lex-abbrevs + (letter (:or (:/ "a" "z") (:/ "A" "Z"))) + (digit (:/ "0" "9")) + (initial (:or letter (char-set "!$%&*/<=>?^_~@"))) + (subsequent (:or initial digit (char-set "+-.@"))) + (comment (:: "/*" (complement (:: any-string "*/" any-string)) "*/"))) + + (define-empty-tokens x + (EOF PIPE |:| SEMI |%%| %prec)) + (define-tokens y + (SYM STRING)) + + (define get-token-grammar + (lexer-src-pos + ("%%" '|%%|) + (":" (string->symbol lexeme)) + ("%prec" (string->symbol lexeme)) + (#\| 'PIPE) + ((:+ (:or #\newline #\tab " " comment (:: "{" (:* (:~ "}")) "}"))) + (return-without-pos (get-token-grammar input-port))) + (#\; 'SEMI) + (#\' (token-STRING (string->symbol (list->string (match-single-string input-port))))) + (#\" (token-STRING (string->symbol (list->string (match-double-string input-port))))) + ((:: initial (:* subsequent)) (token-SYM (string->symbol lexeme))))) + + (define (parse-grammar enter-term enter-empty-term enter-non-term) + (parser + (tokens x y) + (src-pos) + (error (lambda (tok-ok tok-name tok-value start-pos end-pos) + (raise-read-error + (format "Error Parsing YACC grammar at token: ~a with value: ~a" tok-name tok-value) + (file-path) + (position-line start-pos) + (position-col start-pos) + (position-offset start-pos) + (- (position-offset end-pos) (position-offset start-pos))))) + + (end |%%|) + (start gram) + (grammar + (gram + ((production) (list $1)) + ((production gram) (cons $1 $2))) + (production + ((SYM |:| prods SEMI) + (begin + (enter-non-term $1) + (cons $1 $3)))) + (prods + ((rhs) (list `(,$1 #f))) + ((rhs prec) (list `(,$1 ,$2 #f))) + ((rhs PIPE prods) (cons `(,$1 #f) $3)) + ((rhs prec PIPE prods) (cons `(,$1 ,$2 #f) $4))) + (prec + ((%prec SYM) + (begin + (enter-term $2) + (list 'prec $2))) + ((%prec STRING) + (begin + (enter-empty-term $2) + (list 'prec $2)))) + (rhs + (() null) + ((SYM rhs) + (begin + (enter-term $1) + (cons $1 $2))) + ((STRING rhs) + (begin + (enter-empty-term $1) + (cons $1 $2))))))) + + (define (symbolstring a) (symbol->string b))) + + (define (trans filename) + (let* ((i (open-input-file filename)) + (terms (make-hash-table)) + (eterms (make-hash-table)) + (nterms (make-hash-table)) + (enter-term + (lambda (s) + (if (not (hash-table-get nterms s (lambda () #f))) + (hash-table-put! terms s #t)))) + (enter-empty-term + (lambda (s) + (if (not (hash-table-get nterms s (lambda () #f))) + (hash-table-put! eterms s #t)))) + (enter-non-term + (lambda (s) + (hash-table-remove! terms s) + (hash-table-remove! eterms s) + (hash-table-put! nterms s #t)))) + (port-count-lines! i) + (file-path filename) + (regexp-match "%%" i) + (begin0 + (let ((gram ((parse-grammar enter-term enter-empty-term enter-non-term) + (lambda () + (let ((t (get-token-grammar i))) + t))))) + `(begin + (define-tokens t ,(sort (hash-table-map terms (lambda (k v) k)) symbol +;; (vectorof (symbol runtime-action hashtable)) +(define-for-syntax (convert-parse-table table) + (list->vector + (map + (lambda (state-entry) + (let ((ht (make-hasheq))) + (for-each + (lambda (gs/action) + (hash-set! ht + (gram-sym-symbol (car gs/action)) + (action->runtime-action (cdr gs/action)))) + state-entry) + ht)) + (vector->list table)))) + +(define-syntax (parser stx) + (syntax-case stx () + ((_ args ...) + (let ((arg-list (syntax->list (syntax (args ...)))) + (src-pos #f) + (debug #f) + (error #f) + (tokens #f) + (start #f) + (end #f) + (precs #f) + (suppress #f) + (grammar #f) + (yacc-output #f)) + (for-each + (lambda (arg) + (syntax-case* arg (debug error tokens start end precs grammar + suppress src-pos yacc-output) + (lambda (a b) + (eq? (syntax-e a) (syntax-e b))) + ((debug filename) + (cond + ((not (string? (syntax-e (syntax filename)))) + (raise-syntax-error + #f + "Debugging filename must be a string" + stx + (syntax filename))) + (debug + (raise-syntax-error #f "Multiple debug declarations" stx)) + (else + (set! debug (syntax-e (syntax filename)))))) + ((suppress) + (set! suppress #t)) + ((src-pos) + (set! src-pos #t)) + ((error expression) + (if error + (raise-syntax-error #f "Multiple error declarations" stx) + (set! error (syntax expression)))) + ((tokens def ...) + (begin + (when tokens + (raise-syntax-error #f "Multiple tokens declarations" stx)) + (let ((defs (syntax->list (syntax (def ...))))) + (for-each + (lambda (d) + (unless (identifier? d) + (raise-syntax-error + #f + "Token-group name must be an identifier" + stx + d))) + defs) + (set! tokens defs)))) + ((start symbol ...) + (let ((symbols (syntax->list (syntax (symbol ...))))) + (for-each + (lambda (sym) + (unless (identifier? sym) + (raise-syntax-error #f + "Start symbol must be a symbol" + stx + sym))) + symbols) + (when start + (raise-syntax-error #f "Multiple start declarations" stx)) + (when (null? symbols) + (raise-syntax-error #f + "Missing start symbol" + stx + arg)) + (set! start symbols))) + ((end symbols ...) + (let ((symbols (syntax->list (syntax (symbols ...))))) + (for-each + (lambda (sym) + (unless (identifier? sym) + (raise-syntax-error #f + "End token must be a symbol" + stx + sym))) + symbols) + (let ((d (duplicate-list? (map syntax-e symbols)))) + (when d + (raise-syntax-error + #f + (format "Duplicate end token definition for ~a" d) + stx + arg)) + (when (null? symbols) + (raise-syntax-error + #f + "end declaration must contain at least 1 token" + stx + arg)) + (when end + (raise-syntax-error #f "Multiple end declarations" stx)) + (set! end symbols)))) + ((precs decls ...) + (if precs + (raise-syntax-error #f "Multiple precs declarations" stx) + (set! precs (syntax/loc arg (decls ...))))) + ((grammar prods ...) + (if grammar + (raise-syntax-error #f "Multiple grammar declarations" stx) + (set! grammar (syntax/loc arg (prods ...))))) + ((yacc-output filename) + (cond + ((not (string? (syntax-e (syntax filename)))) + (raise-syntax-error #f + "Yacc-output filename must be a string" + stx + (syntax filename))) + (yacc-output + (raise-syntax-error #f "Multiple yacc-output declarations" stx)) + (else + (set! yacc-output (syntax-e (syntax filename)))))) + (_ (raise-syntax-error #f "argument must match (debug filename), (error expression), (tokens def ...), (start non-term), (end tokens ...), (precs decls ...), or (grammar prods ...)" stx arg)))) + (syntax->list (syntax (args ...)))) + (unless tokens + (raise-syntax-error #f "missing tokens declaration" stx)) + (unless error + (raise-syntax-error #f "missing error declaration" stx)) + (unless grammar + (raise-syntax-error #f "missing grammar declaration" stx)) + (unless end + (raise-syntax-error #f "missing end declaration" stx)) + (unless start + (raise-syntax-error #f "missing start declaration" stx)) + (let-values (((table all-term-syms actions check-syntax-fix) + (build-parser (if debug debug "") + src-pos + suppress + tokens + start + end + precs + grammar))) + (when (and yacc-output (not (string=? yacc-output ""))) + (with-handlers [(exn:fail:filesystem? + (lambda (e) + (eprintf + "Cannot write yacc-output to file \"~a\"\n" + yacc-output)))] + (call-with-output-file yacc-output + (lambda (port) + (display-yacc (syntax->datum grammar) + tokens + (map syntax->datum start) + (if precs + (syntax->datum precs) + #f) + port)) + #:exists 'truncate))) + (with-syntax ((check-syntax-fix check-syntax-fix) + (err error) + (ends end) + (starts start) + (debug debug) + (table (convert-parse-table table)) + (all-term-syms all-term-syms) + (actions actions) + (src-pos src-pos)) + (syntax + (begin + check-syntax-fix + (parser-body debug err (quote starts) (quote ends) table all-term-syms actions src-pos))))))) + (_ + (raise-syntax-error #f + "parser must have the form (parser args ...)" + stx)))) + +(define (reduce-stack stack num ret-vals src-pos) + (cond + ((> num 0) + (let* ((top-frame (car stack)) + (ret-vals + (if src-pos + (cons (stack-frame-value top-frame) + (cons (stack-frame-start-pos top-frame) + (cons (stack-frame-end-pos top-frame) + ret-vals))) + (cons (stack-frame-value top-frame) ret-vals)))) + (reduce-stack (cdr stack) (sub1 num) ret-vals src-pos))) + (else (values stack ret-vals)))) + +;; extract-helper : (symbol or make-token) any any -> symbol any any any +(define (extract-helper tok v1 v2) + (cond + ((symbol? tok) + (values tok #f v1 v2)) + ((token? tok) + (values (real-token-name tok) (real-token-value tok) v1 v2)) + (else (raise-argument-error 'parser + "(or/c symbol? token?)" + 0 + tok)))) + +;; well-formed-position-token?: any -> boolean +;; Returns true if pt is a position token whose position-token-token +;; is itself a token or a symbol. +;; This is meant to help raise more precise error messages when +;; a tokenizer produces an erroneous position-token wrapped twice. +;; (as often happens when omitting return-without-pos). +(define (well-formed-token-field? t) + (or (symbol? t) + (token? t))) + +(define (well-formed-position-token? pt) + (and (position-token? pt) + (well-formed-token-field? (position-token-token pt)))) + +(define (well-formed-srcloc-token? st) + (and (srcloc-token? st) + (well-formed-token-field? (srcloc-token-token st)))) + +;; extract-src-pos : position-token -> symbol any any any +(define (extract-src-pos ip) + (unless (well-formed-position-token? ip) + (raise-argument-error 'parser + "well-formed-position-token?" + 0 + ip)) + (extract-helper (position-token-token ip) + (position-token-start-pos ip) + (position-token-end-pos ip))) + +(define (extract-srcloc ip) + (unless (well-formed-srcloc-token? ip) + (raise-argument-error 'parser + "well-formed-srcloc-token?" + 0 + ip)) + (let ([loc (srcloc-token-srcloc ip)]) + (extract-helper (srcloc-token-token ip) + (position-token (srcloc-position loc) (srcloc-line loc) (srcloc-column loc)) + (position-token (+ (srcloc-position loc) (srcloc-span loc)) #f #f)))) + + +;; extract-no-src-pos : (symbol or make-token) -> symbol any any any +(define (extract-no-src-pos ip) + (extract-helper ip #f #f)) + +(define-struct stack-frame (state value start-pos end-pos) #:inspector (make-inspector)) + +(define (make-empty-stack i) (list (make-stack-frame i #f #f #f))) + + +;; The table is a vector that maps each state to a hash-table that maps a +;; terminal symbol to either an accept, shift, reduce, or goto structure. +; We encode the structures according to the runtime-action data definition in +;; parser-actions.rkt +(define (parser-body debug? err starts ends table all-term-syms actions src-pos) + (local ((define extract + (if src-pos + extract-src-pos + extract-no-src-pos)) + + (define (fix-error stack tok val start-pos end-pos get-token) + (when debug? (pretty-print stack)) + (local ((define (remove-input tok val start-pos end-pos) + (if (memq tok ends) + (raise-read-error "parser: Cannot continue after error" + #f #f #f #f #f) + (let ((a (find-action stack tok val start-pos end-pos))) + (cond + ((runtime-shift? a) + ;; (printf "shift:~a\n" (runtime-shift-state a)) + (cons (make-stack-frame (runtime-shift-state a) + val + start-pos + end-pos) + stack)) + (else + ;; (printf "discard input:~a\n" tok) + (let-values (((tok val start-pos end-pos) + (extract (get-token)))) + (remove-input tok val start-pos end-pos)))))))) + (let remove-states () + (let ((a (find-action stack 'error #f start-pos end-pos))) + (cond + ((runtime-shift? a) + ;; (printf "shift:~a\n" (runtime-shift-state a)) + (set! stack + (cons + (make-stack-frame (runtime-shift-state a) + #f + start-pos + end-pos) + stack)) + (remove-input tok val start-pos end-pos)) + (else + ;; (printf "discard state:~a\n" (car stack)) + (cond + ((< (length stack) 2) + (raise-read-error "parser: Cannot continue after error" + #f #f #f #f #f)) + (else + (set! stack (cdr stack)) + (remove-states))))))))) + + (define (find-action stack tok val start-pos end-pos) + (unless (hash-ref all-term-syms + tok + #f) + (if src-pos + (err #f tok val start-pos end-pos) + (err #f tok val)) + (raise-read-error (format "parser: got token of unknown type ~a" tok) + #f #f #f #f #f)) + (hash-ref (vector-ref table (stack-frame-state (car stack))) + tok + #f)) + + (define (make-parser start-number) + (lambda (get-token) + (unless (and (procedure? get-token) + (procedure-arity-includes? get-token 0)) + (error 'get-token "expected a nullary procedure, got ~e" get-token)) + (let parsing-loop ((stack (make-empty-stack start-number)) + (ip (get-token))) + (let-values (((tok val start-pos end-pos) + (extract ip))) + (let ((action (find-action stack tok val start-pos end-pos))) + (cond + ((runtime-shift? action) + ;; (printf "shift:~a\n" (runtime-shift-state action)) + (parsing-loop (cons (make-stack-frame (runtime-shift-state action) + val + start-pos + end-pos) + stack) + (get-token))) + ((runtime-reduce? action) + ;; (printf "reduce:~a\n" (runtime-reduce-prod-num action)) + (let-values (((new-stack args) + (reduce-stack stack + (runtime-reduce-rhs-length action) + null + src-pos))) + (let ((goto + (runtime-goto-state + (hash-ref + (vector-ref table (stack-frame-state (car new-stack))) + (runtime-reduce-lhs action))))) + (parsing-loop + (cons + (if src-pos + (make-stack-frame + goto + (apply (vector-ref actions (runtime-reduce-prod-num action)) args) + (if (null? args) start-pos (cadr args)) + (if (null? args) + end-pos + (list-ref args (- (* (runtime-reduce-rhs-length action) 3) 1)))) + (make-stack-frame + goto + (apply (vector-ref actions (runtime-reduce-prod-num action)) args) + #f + #f)) + new-stack) + ip)))) + ((runtime-accept? action) + ;; (printf "accept\n") + (stack-frame-value (car stack))) + (else + (if src-pos + (err #t tok val start-pos end-pos) + (err #t tok val)) + (parsing-loop (fix-error stack tok val start-pos end-pos get-token) + (get-token)))))))))) + (cond + ((null? (cdr starts)) (make-parser 0)) + (else + (let loop ((l starts) + (i 0)) + (cond + ((null? l) null) + (else (cons (make-parser i) (loop (cdr l) (add1 i)))))))))) diff --git a/br-parser-tools/br-parser-tools-lib/info.rkt b/br-parser-tools/br-parser-tools-lib/info.rkt new file mode 100644 index 0000000..f9f9e11 --- /dev/null +++ b/br-parser-tools/br-parser-tools-lib/info.rkt @@ -0,0 +1,11 @@ +#lang info + +(define collection 'multi) +(define deps '("scheme-lib" + "base" + "compatibility-lib")) +(define build-deps '("rackunit-lib")) + +(define pkg-desc "implementation (no documentation) part of \"br-parser-tools\"") + +(define pkg-authors '(mflatt)) diff --git a/br-parser-tools/br-parser-tools/LICENSE.txt b/br-parser-tools/br-parser-tools/LICENSE.txt new file mode 100644 index 0000000..d012f58 --- /dev/null +++ b/br-parser-tools/br-parser-tools/LICENSE.txt @@ -0,0 +1,11 @@ +parser-tools +Copyright (c) 2010-2014 PLT Design Inc. + +This package is distributed under the GNU Lesser General Public +License (LGPL). This means that you can link this package into proprietary +applications, provided you follow the rules stated in the LGPL. You +can also modify this package; if you distribute a modified version, +you must distribute it under the terms of the LGPL, which in +particular means that you must release the source code for the +modified software. See http://www.gnu.org/copyleft/lesser.html +for more information. diff --git a/br-parser-tools/br-parser-tools/info.rkt b/br-parser-tools/br-parser-tools/info.rkt new file mode 100644 index 0000000..6a692a8 --- /dev/null +++ b/br-parser-tools/br-parser-tools/info.rkt @@ -0,0 +1,12 @@ +#lang info + +(define collection 'multi) + +(define deps '("br-parser-tools-lib" + "br-parser-tools-doc")) +(define implies '("br-parser-tools-lib" + "br-parser-tools-doc")) + +(define pkg-desc "Lex- and Yacc-style parsing tools") + +(define pkg-authors '(mflatt)) diff --git a/brag/LICENSE b/brag/LICENSE new file mode 100755 index 0000000..65c5ca8 --- /dev/null +++ b/brag/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/brag/README.md b/brag/README.md new file mode 100755 index 0000000..623c425 --- /dev/null +++ b/brag/README.md @@ -0,0 +1,4 @@ +This repo contains a fork of Danny Yoo's RAGG, a Racket AST Generator Generator, +also known as a parser generator. + +Licensed under the LGPL. diff --git a/brag/brag/Makefile b/brag/brag/Makefile new file mode 100755 index 0000000..579d424 --- /dev/null +++ b/brag/brag/Makefile @@ -0,0 +1,12 @@ +doc: + scribble ++xref-in setup/xref load-collections-xref --redirect-main http://docs.racket-lang.org/ --dest-name index.html manual.scrbl + +clean: + git clean -fdx . + +web: clean plt doc + scp -r * hashcollision.org:webapps/htdocs/ragg/ + + +plt: + raco pack --collect ragg.plt ragg diff --git a/brag/brag/brag.scrbl b/brag/brag/brag.scrbl new file mode 100755 index 0000000..9017342 --- /dev/null +++ b/brag/brag/brag.scrbl @@ -0,0 +1,1157 @@ +#lang scribble/manual +@(require scribble/eval + racket/date + file/md5 + (for-label racket + brag/support + brag/examples/nested-word-list + (only-in br-parser-tools/lex lexer-src-pos) + (only-in syntax/parse syntax-parse ~literal))) + + +@(define (lookup-date filename [default ""]) + (cond + [(file-exists? filename) + (define modify-seconds (file-or-directory-modify-seconds filename)) + (define a-date (seconds->date modify-seconds)) + (date->string a-date)] + [else + default])) + +@(define (compute-md5sum filename [default ""]) + (cond [(file-exists? filename) + (bytes->string/utf-8 (call-with-input-file filename md5 #:mode 'binary))] + [else + default])) + + + +@title{brag: the Beautiful Racket AST Generator} +@author["Danny Yoo (95%)" "Matthew Butterick (5%)"] + +@defmodulelang[brag] + +@section{Quick start} + +@(define my-eval (make-base-eval)) +@(my-eval '(require brag/examples/nested-word-list + racket/list + racket/match)) + +Suppose we're given the +following string: +@racketblock["(radiant (humble))"] + + +How would we turn this string into a structured value? That is, how would we @emph{parse} it? (Let's also suppose we've never heard of @racket[read].) + +First, we need to consider the structure of the things we'd like to parse. The +string above looks like a nested list of words. Good start. + +Second, how might we describe this formally — meaning, in a way that a computer could understand? A common notation to describe the structure of these things is @link["http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form"]{Backus-Naur Form} (BNF). So let's try to notate the structure of nested word lists in BNF. + +@nested[#:style 'code-inset]{ + @verbatim{ + nested-word-list: WORD + | LEFT-PAREN nested-word-list* RIGHT-PAREN +}} + +What we intend by this notation is this: @racket[nested-word-list] is either a @racket[WORD], or a parenthesized list of @racket[nested-word-list]s. We use the character @litchar{*} to represent zero or more repetitions of the previous thing. We treat the uppercased @racket[LEFT-PAREN], @racket[RIGHT-PAREN], and @racket[WORD] as placeholders for @emph{tokens} (a @tech{token} being the smallest meaningful item in the parsed string): + +Here are a few examples of tokens: +@interaction[#:eval my-eval + (require brag/support) + (token 'LEFT-PAREN) + (token 'WORD "crunchy" #:span 7) + (token 'RIGHT-PAREN)] + +This BNF description is also known as a @deftech{grammar}. Just as it does in a natural language like English or French, a grammar describes something in terms of what elements can fit where. + +Have we made progress? We have a valid grammar. But we're still missing a @emph{parser}: a function that can use that description to make structures out of a sequence of tokens. + +Meanwhile, it's clear that we don't yet have a valid program because there's no @litchar{#lang} line. Let's add one: put @litchar{#lang brag} at the top of the grammar, and save it as a file called @filepath{nested-word-list.rkt}. + +@filebox["nested-word-list.rkt"]{ + @verbatim{ + #lang brag + nested-word-list: WORD + | LEFT-PAREN nested-word-list* RIGHT-PAREN +}} + +Now it's a proper program. But what does it do? + +@interaction[#:eval my-eval + @eval:alts[(require "nested-word-list.rkt") (void)] + parse + ] + +It gives us a @racket[parse] function. Let's investigate what @racket[parse] +does. What happens if we pass it a sequence of tokens? + +@interaction[#:eval my-eval + (define a-parsed-value + (parse (list (token 'LEFT-PAREN "(") + (token 'WORD "some") + (token 'LEFT-PAREN "[") + (token 'WORD "pig") + (token 'RIGHT-PAREN "]") + (token 'RIGHT-PAREN ")")))) + a-parsed-value] + +Those who have messed around with macros will recognize this as a @seclink["stx-obj" #:doc '(lib "scribblings/guide/guide.scrbl")]{syntax object}. + +@interaction[#:eval my-eval + (syntax->datum a-parsed-value) + ] + +That's @racket[(some [pig])], essentially. + +What happens if we pass our @racket[parse] function a bigger source of tokens? + +@interaction[#:eval my-eval + @code:comment{tokenize: string -> (sequenceof token-struct?)} + @code:comment{Generate tokens from a string:} + (define (tokenize s) + (for/list ([str (regexp-match* #px"\\(|\\)|\\w+" s)]) + (match str + ["(" + (token 'LEFT-PAREN str)] + [")" + (token 'RIGHT-PAREN str)] + [else + (token 'WORD str)]))) + + @code:comment{For example:} + (define token-source (tokenize "(welcome (to (((brag)) ())))")) + (define v (parse token-source)) + (syntax->datum v) + ] + +Welcome to @tt{brag}. + + + + +@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +@section{Introduction} + +@tt{brag} is a parser generator designed to be easy +to use: + +@itemize[ + + @item{It provides a @litchar{#lang} for writing BNF grammars. + A module written in @litchar{#lang brag} automatically generates a + parser. The grammar controls the structure of the @tech{syntax objects} it generates.} + + @item{The language uses a few conventions to simplify the expression of + grammars. The first rule in the grammar is assumed to be the + starting production. Identifiers in @tt{UPPERCASE} are treated as + terminal tokens. All other identifiers are treated as nonterminals.} + + @item{Tokenizers can be developed independently of parsers. + @tt{brag} takes a liberal view on tokens: they can be strings, + symbols, or instances constructed with @racket[token]. Tokens can optionally provide source location, in which case a syntax object generated by the parser will too.} + + @item{The parser can usually handle ambiguous grammars.} + + @item{It integrates with the rest of the Racket + @link["http://docs.racket-lang.org/guide/languages.html"]{language toolchain}.} + + ] + + + +@subsection{Example: a small DSL for ASCII diagrams} + +Suppose we'd like to define a language for +drawing simple ASCII diagrams. So if we write something like this: + +@nested[#:style 'inset]{ + @verbatim|{ + 3 9 X; + 6 3 b 3 X 3 b; + 3 9 X; + }|} + +It should generate the following picture: + +@nested[#:style 'inset]{ +@verbatim|{ +XXXXXXXXX +XXXXXXXXX +XXXXXXXXX + XXX + XXX + XXX + XXX + XXX + XXX +XXXXXXXXX +XXXXXXXXX +XXXXXXXXX +}|} + + +This makes sense in a casual way. But let's be more precise about how the language works. + +Each line of the program has a semicolon at the end, and describes the output of several @emph{rows} of the line drawing. Let's look at two of the lines in the example: + +@itemize[ + @item{@litchar{3 9 X;}: ``Repeat the following 3 times: print @racket["X"] nine times, followed by + a newline.''} + + @item{@litchar{6 3 b 3 X 3 b;}: ``Repeat the following 6 times: print @racket[" "] three times, + followed by @racket["X"] three times, followed by @racket[" "] three times, followed by a newline.''} + ] + +Then each line consists of a @emph{repeat} number, followed by pairs of +(number, character) @emph{chunks}. We'll assume here that the intent of the lowercased character @litchar{b} is to represent the printing of a 1-character whitespace @racket[" "], and for other uppercase letters to represent the printing of themselves. + +By understanding the pieces of each line, we can more easily capture that meaning in a grammar. Once we have each instruction of our ASCII DSL in a structured format, we should be able to parse it. + +Here's a first pass at expressing the structure of these line-drawing programs. + +@subsection{Parsing the concrete syntax} + +@filebox["simple-line-drawing.rkt"]{ + @verbatim|{ + #lang brag + drawing: rows* + rows: repeat chunk+ ";" + repeat: INTEGER + chunk: INTEGER STRING + }| +} + +@margin-note{@secref{brag-syntax} describes @tt{brag}'s syntax in more detail.} +We write a @tt{brag} program as an BNF grammar, where patterns can be: +@itemize[ + @item{the names of other rules (e.g. @racket[chunk])} + @item{literal and symbolic token names (e.g. @racket[";"], @racket[INTEGER])} + @item{quantified patterns (e.g. @litchar{+} to represent one-or-more repetitions)} + ] +The result of a @tt{brag} program is a module with a @racket[parse] function +that can parse tokens and produce a syntax object as a result. + +Let's try this function: + +@interaction[#:eval my-eval + (require brag/support) + @eval:alts[(require "simple-line-drawing.rkt") + (require brag/examples/simple-line-drawing)] + (define stx + (parse (list (token 'INTEGER 6) + (token 'INTEGER 2) + (token 'STRING " ") + (token 'INTEGER 3) + (token 'STRING "X") + ";"))) + (syntax->datum stx) + ] + +A @emph{token} is the smallest meaningful element of a source program. Tokens can be strings, symbols, or instances of the @racket[token] data structure. (Plus a few other special cases, which we'll discuss later.) Usually, a token holds a single character from the source program. But sometimes it makes sense to package a sequence of characters into a single token, if the sequence has an indivisible meaning. + +If possible, we also want to attach source location information to each token. Why? Because this informatino will be incorporated into the syntax objects produced by @racket[parse]. + +A parser often works in conjunction with a helper function called a @emph{lexer} that converts the raw code of the source program into tokens. The @racketmodname[br-parser-tools/lex] library can help us write a position-sensitive +tokenizer: + +@interaction[#:eval my-eval + (require br-parser-tools/lex) + (define (tokenize ip) + (port-count-lines! ip) + (define my-lexer + (lexer-src-pos + [(repetition 1 +inf.0 numeric) + (token 'INTEGER (string->number lexeme))] + [upper-case + (token 'STRING lexeme)] + ["b" + (token 'STRING " ")] + [";" + (token ";" lexeme)] + [whitespace + (token 'WHITESPACE lexeme #:skip? #t)] + [(eof) + (void)])) + (define (next-token) (my-lexer ip)) + next-token) + + (define a-sample-input-port (open-input-string "6 2 b 3 X;")) + (define token-thunk (tokenize a-sample-input-port)) + @code:comment{Now we can pass token-thunk to the parser:} + (define another-stx (parse token-thunk)) + (syntax->datum another-stx) + @code:comment{The syntax object has location information:} + (syntax-line another-stx) + (syntax-column another-stx) + (syntax-span another-stx) + ] + + +Note also from this lexer example: + +@itemize[ + + @item{@racket[parse] accepts as input either a sequence of tokens, or a + function that produces tokens (which @racket[parse] will call repeatedly to get the next token).} + + @item{As an alternative to the basic @racket[token] structure, a token can also be an instance of the @racket[position-token] structure (also found in @racketmodname[br-parser-tools/lex]). In that case, the token will try to derive its position from that of the position-token.} + + @item{@racket[parse] will stop if it gets @racket[void] (or @racket['eof]) as a token.} + + @item{@racket[parse] will skip any token that has + @racket[#:skip?] attribute set to @racket[#t]. For instance, tokens representing comments often use @racket[#:skip?].} + + ] + + +@subsection{From parsing to interpretation} + +We now have a parser for programs written in this simple-line-drawing language. +Our parser will return syntax objects: + +@interaction[#:eval my-eval + (define parsed-program + (parse (tokenize (open-input-string "3 9 X; 6 3 b 3 X 3 b; 3 9 X;")))) + (syntax->datum parsed-program) + ] + +Better still, these syntax objects will have a predictable +structure that follows the grammar: + +@racketblock[ + (drawing (rows (repeat ) + (chunk ) ... ";") + ...) + ] + +where @racket[drawing], @racket[rows], @racket[repeat], and @racket[chunk] +should be treated literally, and everything else will be numbers or strings. + + +Still, these syntax-object values are just inert structures. How do we +interpret them, and make them @emph{print}? We claimed at the beginning of +this section that these syntax objects should be easy to interpret. So let's do it. + +@margin-note{This is a very quick-and-dirty treatment of @racket[syntax-parse]. + See the @racketmodname[syntax/parse] documentation for a gentler guide to its + features.} Racket provides a special form called @racket[syntax-parse] in the +@racketmodname[syntax/parse] library. @racket[syntax-parse] lets us do a +structural case-analysis on syntax objects: we provide it a set of patterns to +parse and actions to perform when those patterns match. + + +As a simple example, we can write a function that looks at a syntax object and +says @racket[#t] if it's the literal @racket[yes], and @racket[#f] otherwise: + +@interaction[#:eval my-eval + (require syntax/parse) + @code:comment{yes-syntax-object?: syntax-object -> boolean} + @code:comment{Returns true if the syntax-object is yes.} + (define (yes-syntax-object? stx) + (syntax-parse stx + [(~literal yes) + #t] + [else + #f])) + (yes-syntax-object? #'yes) + (yes-syntax-object? #'nooooooooooo) + ] + +Here, we use @racket[~literal] to let @racket[syntax-parse] know that +@racket[yes] should show up literally in the syntax object. The patterns can +also have some structure to them, such as: +@racketblock[({~literal drawing} rows-stxs ...)] +which matches on syntax objects that begin, literally, with @racket[drawing], +followed by any number of rows (which are syntax objects too). + + +Now that we know a little bit more about @racket[syntax-parse], +we can use it to do a case analysis on the syntax +objects that our @racket[parse] function gives us. +We start by defining a function on syntax objects of the form @racket[(drawing + rows-stx ...)]. +@interaction[#:eval my-eval + (define (interpret-drawing drawing-stx) + (syntax-parse drawing-stx + [({~literal drawing} rows-stxs ...) + + (for ([rows-stx (syntax->list #'(rows-stxs ...))]) + (interpret-rows rows-stx))]))] + +When we encounter a syntax object with @racket[(drawing rows-stx + ...)], then @racket[interpret-rows] each @racket[rows-stx]. + +@;The pattern we +@;express in @racket[syntax-parse] above marks what things should be treated +@;literally, and the @racket[...] is a a part of the pattern matching language +@;known by @racket[syntax-parse] that lets us match multiple instances of the +@;last pattern. + + +Let's define @racket[interpret-rows] now: +@interaction[#:eval my-eval + (define (interpret-rows rows-stx) + (syntax-parse rows-stx + [({~literal rows} + ({~literal repeat} repeat-number) + chunks ... ";") + + (for ([i (syntax-e #'repeat-number)]) + (for ([chunk-stx (syntax->list #'(chunks ...))]) + (interpret-chunk chunk-stx)) + (newline))]))] + +For a @racket[rows], we extract out the @racket[repeat-number] out of the +syntax object and use it as the range of the @racket[for] loop. The inner loop +walks across each @racket[chunk-stx] and calls @racket[interpret-chunk] on it. + + +Finally, we need to write a definition for @racket[interpret-chunk]. We want +it to extract out the @racket[chunk-size] and @racket[chunk-string] portions, +and print to standard output: + +@interaction[#:eval my-eval + (define (interpret-chunk chunk-stx) + (syntax-parse chunk-stx + [({~literal chunk} chunk-size chunk-string) + + (for ([k (syntax-e #'chunk-size)]) + (display (syntax-e #'chunk-string)))])) + ] + + +@margin-note{Here are the definitions in a single file: + @link["examples/simple-line-drawing/interpret.rkt"]{interpret.rkt}.} +With these definitions in hand, now we can pass it syntax objects +that we construct directly by hand: + +@interaction[#:eval my-eval + (interpret-chunk #'(chunk 3 "X")) + (interpret-drawing #'(drawing (rows (repeat 5) (chunk 3 "X") ";"))) + ] + +or we can pass it the result generated by our parser: +@interaction[#:eval my-eval + (define parsed-program + (parse (tokenize (open-input-string "3 9 X; 6 3 b 3 X 3 b; 3 9 X;")))) + (interpret-drawing parsed-program)] + +And now we've got an interpreter! + + +@subsection{From interpretation to compilation} + +@margin-note{For a gentler tutorial on writing @litchar{#lang}-based languages, see + @link["http://beautifulracket.com"]{Beautiful Racket}.} (Just as a +warning: the following material is slightly more advanced, but shows how +writing a compiler for the line-drawing language reuses the ideas for the +interpreter.) + +Wouldn't it be nice to be able to write something like: + +@nested[#:style 'inset]{ + @verbatim|{ + 3 9 X; + 6 3 b 3 X 3 b; + 3 9 X; + }|} + +and have Racket automatically compile this down to something like this? +@racketblock[ + (for ([i 3]) + (for ([k 9]) (displayln "X")) + (newline)) + + (for ([i 6]) + (for ([k 3]) (displayln " ")) + (for ([k 3]) (displayln "X")) + (for ([k 3]) (displayln " ")) + (newline)) + + (for ([i 3]) + (for ([k 9]) (displayln "X")) + (newline)) + ] + +Well, of course it won't work: we don't have a @litchar{#lang} line. + +Let's add one. + +@filebox["letter-i.rkt"]{ + @verbatim|{ + #lang brag/examples/simple-line-drawing + 3 9 X; + 6 3 b 3 X 3 b; + 3 9 X; + }| +} + +Now @filepath{letter-i.rkt} is a program. + + +How does this work? From the previous sections, we've seen how to take the +contents of a file and interpret it. What we want to do now is teach Racket +how to compile programs labeled with this @litchar{#lang} line. We'll do two +things: + +@itemize[ + @item{Tell Racket to use the @tt{brag}-generated parser and lexer we defined + earlier whenever it sees a program written with + @litchar{#lang brag/examples/simple-line-drawing}.} + + @item{Define transformation rules for @racket[drawing], @racket[rows], and + @racket[chunk] to rewrite these into standard Racket forms.} + ] + +The second part, the writing of the transformation rules, will look very +similar to the definitions we wrote for the interpreter, but the transformation +will happen at compile-time. (We @emph{could} just resort to simply calling +into the interpreter we just wrote up, but this section is meant to show that +compilation is also viable.) + + +We do the first part by defining a @emph{module reader}: a +@link["http://docs.racket-lang.org/guide/syntax_module-reader.html"]{module + reader} tells Racket how to parse and compile a file. Whenever Racket sees a +@litchar{#lang }, it looks for a corresponding module reader in +@filepath{/lang/reader}. + +Here's the definition for +@filepath{brag/examples/simple-line-drawing/lang/reader.rkt}: + +@filebox["brag/examples/simple-line-drawing/lang/reader.rkt"]{ + @codeblock|{ + #lang s-exp syntax/module-reader + brag/examples/simple-line-drawing/semantics + #:read my-read + #:read-syntax my-read-syntax + #:whole-body-readers? #t + + (require brag/examples/simple-line-drawing/lexer + brag/examples/simple-line-drawing/grammar) + + (define (my-read in) + (syntax->datum (my-read-syntax #f in))) + + (define (my-read-syntax src ip) + (list (parse src (tokenize ip)))) + }| +} + +We use a helper module @racketmodname[syntax/module-reader], which provides +utilities for creating a module reader. It uses the lexer and +@tt{brag}-generated parser we defined earlier, and also tells Racket that it should compile the forms in the syntax +object using a module called @filepath{semantics.rkt}. + +Let's look into @filepath{semantics.rkt} and see what's involved in +compilation: +@filebox["brag/examples/simple-line-drawing/semantics.rkt"]{ + @codeblock|{ + #lang racket/base + (require (for-syntax racket/base syntax/parse)) + + (provide #%module-begin + ;; We reuse Racket's treatment of raw datums, specifically + ;; for strings and numbers: + #%datum + + ;; And otherwise, we provide definitions of these three forms. + ;; During compiliation, Racket uses these definitions to + ;; rewrite into for loops, displays, and newlines. + drawing rows chunk) + + ;; Define a few compile-time functions to do the syntax rewriting: + (begin-for-syntax + (define (compile-drawing drawing-stx) + (syntax-parse drawing-stx + [({~literal drawing} rows-stxs ...) + + (syntax/loc drawing-stx + (begin rows-stxs ...))])) + + (define (compile-rows rows-stx) + (syntax-parse rows-stx + [({~literal rows} + ({~literal repeat} repeat-number) + chunks ... + ";") + + (syntax/loc rows-stx + (for ([i repeat-number]) + chunks ... + (newline)))])) + + (define (compile-chunk chunk-stx) + (syntax-parse chunk-stx + [({~literal chunk} chunk-size chunk-string) + + (syntax/loc chunk-stx + (for ([k chunk-size]) + (display chunk-string)))]))) + + + ;; Wire up the use of "drawing", "rows", and "chunk" to these + ;; transformers: + (define-syntax drawing compile-drawing) + (define-syntax rows compile-rows) + (define-syntax chunk compile-chunk) + }| +} + +The semantics hold definitions for @racket[compile-drawing], +@racket[compile-rows], and @racket[compile-chunk], similar to what we had for +interpretation with @racket[interpret-drawing], @racket[interpret-rows], and +@racket[interpret-chunk]. However, compilation is not the same as +interpretation: each definition does not immediately execute the act of +drawing, but rather returns a syntax object whose evaluation will do the actual +work. + +There are a few things to note: + +@margin-note{By the way, we can just as easily rewrite the semantics so that + @racket[compile-rows] does explicitly call @racket[compile-chunk]. Often, + though, it's easier to write the transformation functions in this piecemeal way + and depend on the Racket macro expansion system to do the rewriting as it + encounters each of the forms.} + + +@itemize[ + + @item{@tt{brag}'s native data structure is the syntax object because the + majority of Racket's language-processing infrastructure knows how to read and + write this structured value.} + + + @item{Unlike in interpretation, @racket[compile-rows] doesn't + compile each chunk by directly calling @racket[compile-chunk]. Rather, it + depends on the Racket macro expander to call each @racket[compile-XXX] function + as it encounters a @racket[drawing], @racket[rows], or @racket[chunk] in the + parsed value. The three statements at the bottom of @filepath{semantics.rkt} inform + the macro expansion system to do this: + + @racketblock[ + (define-syntax drawing compile-drawing) + (define-syntax rows compile-rows) + (define-syntax chunk compile-chunk) + ]} + ] + + +Altogether, @tt{brag}'s intent is to be a parser generator for Racket +that's easy and fun to use. It's meant to fit naturally with the other tools +in the Racket language toolchain. Hopefully, it will reduce the friction in +making new languages with alternative concrete syntaxes. + +The rest of this document describes the @tt{brag} language and the parsers it +generates. + + +@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +@;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +@section{The language} + +@subsection[#:tag "brag-syntax"]{Syntax and terminology} +A program in the @tt{brag} language consists of the language line +@litchar{#lang brag}, followed by a collection of @tech{rule}s and +@tech{line comment}s. + +A @deftech{rule} is a sequence consisting of: a @tech{rule identifier}, a colon +@litchar{":"}, and a @tech{pattern}. + +A @deftech{rule identifier} is an @tech{identifier} that is not in upper case. + +A @deftech{symbolic token identifier} is an @tech{identifier} that is in upper case. + +An @deftech{identifier} is a character sequence of letters, numbers, and +characters in @racket["-.!$%&/<=>?^_~@"]. It must not contain +@litchar{*} or @litchar{+}, as those characters are used to denote +quantification. + + +A @deftech{pattern} is one of the following: +@itemize[ + @item{an implicit sequence of @tech{pattern}s separated by whitespace} + @item{a terminal: either a literal string or a @tech{symbolic token identifier}. + + When used in a pattern, both these terminals will match the same set of inputs. A literal string can match the string itself, or a @racket[token] whose type field contains that string (or its symbol form). So @racket["FOO"] would match @racket["FOO"], @racket[(token "FOO" "bar")], or @racket[(token 'FOO "bar")]. A symbolic token identifier can also match the string version of the identifier, or a @racket[token] whose type field is the symbol or string form of the identifier. So @racket[FOO] would also match @racket["FOO"], @racket[(token 'FOO "bar")], or @racket[(token "FOO" "bar")]. (In every case, the value of a token, like @racket["bar"], can be anything, and may or may not be the same as its type.) + + Because their underlying meanings are the same, the symbolic token identifier ends up being a notational convenience for readability inside a grammar pattern. Typically, the literal string @racket["FOO"] is used to connote ``match the string @racket["FOO"] exactly'' and the symbolic token identifier @racket[FOO] specially connotes ``match any token of type @racket['FOO]''.} + + @item{a @tech{rule identifier}} + @item{a @deftech{choice pattern}: a sequence of @tech{pattern}s delimited with @litchar{|} characters.} + @item{a @deftech{quantifed pattern}: a @tech{pattern} followed by either @litchar{*} (``zero or more'') or @litchar{+} (``one or more'')} + @item{an @deftech{optional pattern}: a @tech{pattern} surrounded by @litchar{[} and @litchar{]}} + @item{an explicit sequence: a @tech{pattern} surrounded by @litchar{(} and @litchar{)}}] + +A @deftech{line comment} begins with either @litchar{#} or @litchar{;} and +continues till the end of the line. + + +For example, in the following program: +@nested[#:style 'inset + @verbatim|{ + #lang brag + ;; A parser for a silly language + sentence: verb optional-adjective object + verb: greeting + optional-adjective: ["happy" | "frumpy"] + greeting: "hello" | "hola" | "aloha" + object: "world" | WORLD + }|] + +the elements @tt{sentence}, @tt{verb}, @tt{greeting}, and @tt{object} are rule +identifiers. The first rule, @litchar{sentence: verb optional-adjective + object}, is a rule whose right side is an implicit pattern sequence of three +sub-patterns. The uppercased @tt{WORLD} is a symbolic token identifier. The fourth rule in the program associates @tt{greeting} with a @tech{choice pattern}. + + + +More examples: +@itemize[ + + @item{A + BNF for binary + strings that contain an equal number of zeros and ones. + @verbatim|{ + #lang brag + equal: [zero one | one zero] ;; equal number of "0"s and "1"s. + zero: "0" equal | equal "0" ;; has an extra "0" in it. + one: "1" equal | equal "1" ;; has an extra "1" in it. + }| + } + + @item{A BNF for + @link["http://www.json.org/"]{JSON}-like structures. + @verbatim|{ + #lang brag + json: number | string + | array | object + number: NUMBER + string: STRING + array: "[" [json ("," json)*] "]" + object: "{" [kvpair ("," kvpair)*] "}" + kvpair: ID ":" json + }| + } + ] + +@subsection{Cuts & splices} + +By default, every matched token shows up in the parse tree. But sometimes that means that the parse tree ends up holding a bunch of tokens that were only needed to complete the parsing. Once they've served their purpose, it's sometimes useful to filter them out (for instance, to simplify the implementation of a language expander). To help with this kind of housekeeping, @racket[brag] supports @emph{cuts} and @emph{splices}. + +A @deftech{cut} in a grammar will delete an item from the parse tree. A cut is notated by prefixing either the left-hand rule name or a right-hand pattern element with a slash @litchar{/}. + +If the cut is applied to a left-hand rule name, the rule name is omitted from the parse tree, but its node and its matched elements remain. + +If the cut is applied to a right-hand pattern element, then that element is omitted from every node matching that rule. + +For instance, consider this simple grammar for arithmetic expressions: + +@verbatim|{ +#lang brag +expr : term ('+' term)* +term : factor ('*' factor)* +factor : ("0" | "1" | "2" | "3" + | "4" | "5" | "6" | "7" + | "8" | "9")+ +}| + +If we use it to parse this string: + +@verbatim|{1+2*3}| + +We get this parse tree: + +@racketblock['(expr (term (factor "1")) "+" (term (factor "2") "*" (factor "3")))] + +Suppose we felt the @litchar{+} and @litchar{*} characters were superfluous. We can add cuts to the grammar by prefixing these pattern elements with @litchar{/}: + +@verbatim|{ +#lang brag +expr : term (/'+' term)* +term : factor (/'*' factor)* +factor : ("0" | "1" | "2" | "3" + | "4" | "5" | "6" | "7" + | "8" | "9")+ +}| + +Our parse tree changes accordingly: + +@racketblock['(expr (term (factor "1")) (term (factor "2") (factor "3")))] + +Now suppose we apply a cut on the rule name, @racket[factor]: + +@verbatim|{ +#lang brag +expr : term (/'+' term)* +term : factor (/'*' factor)* +/factor : ("0" | "1" | "2" | "3" + | "4" | "5" | "6" | "7" + | "8" | "9")+ +}| + +This time, the rule name disppears from the parse tree, but its nodes and elements remain: + +@racketblock['(expr (term ("1")) (term ("2") ("3")))] + +A @deftech{splice} in a grammar will merge the elements of a node into the surrounding node. A splice is notated by prefixing either the left-hand rule name or a right-hand pattern element with an at sign @litchar|{@}|. + +If the splice is applied to a left-hand rule name, then the splice is applied every time the rule is used in the parse tree. + +If the splice is applied to a right-hand pattern element, that element is spliced only when it appears as part of the production for that rule. + +Suppose we remove the cut from the @racket[factor] rule name and instead splice the second appearance of @racket[factor] in the pattern for the @racket[term] rule: + +@verbatim|{ +#lang brag +expr : term (/'+' term)* +term : factor (/'*' @factor)* +factor : ("0" | "1" | "2" | "3" + | "4" | "5" | "6" | "7" + | "8" | "9")+ +}| + +The @racket[factor] elements matching the first position of the @racket[term] pattern remain as they were, but the @racket[factor] element matching the second position is spliced into the surrounding node: + +@racketblock['(expr (term (factor "1")) (term (factor "2") "3"))] + +Finally, suppose we add a splice to the @racket[term] rule name: + +@verbatim|{ +#lang brag +expr : term (/'+' term)* +@term : factor (/'*' @factor)* +factor : ("0" | "1" | "2" | "3" + | "4" | "5" | "6" | "7" + | "8" | "9")+ +}| + +This time, all the appearances of @racket[term] nodes in the parse tree will have their elements spliced into the surrounding nodes: + +@racketblock['(expr (factor "1") (factor "2") "3")] + + +As a convenience, when a grammar element is spliced, or a rule name is cut, @racket[brag] preserves the rule name by adding it as a syntax property to the residual elements, using the rule name as a key, and the original syntax object representing the rule name as the value. + + +@subsection{Syntax errors} + +Besides the basic syntax errors that can occur with a malformed grammar, there +are a few other classes of situations that @litchar{#lang brag} will consider +as syntax errors. + +@tt{brag} will raise a syntax error if the grammar: +@itemize[ + @item{doesn't have any rules.} + + @item{has a rule with the same left hand side as any other rule.} + + @item{refers to rules that have not been defined. e.g. the + following program: + @nested[#:style 'code-inset + @verbatim|{ + #lang brag + foo: [bar] + }| + ] + should raise an error because @tt{bar} has not been defined, even though + @tt{foo} refers to it in an @tech{optional pattern}.} + + + @item{uses the token name @racket[EOF]; the end-of-file token type is reserved + for internal use by @tt{brag}.} + + + @item{contains a rule that has no finite derivation. e.g. the following + program: + @nested[#:style 'code-inset + @verbatim|{ + #lang brag + infinite-a: "a" infinite-a + }| + ] + should raise an error because no finite sequence of tokens will satisfy + @tt{infinite-a}.} + + ] + +Otherwise, @tt{brag} should be fairly tolerant and permit even ambiguous +grammars. + +@subsection{Semantics} +@declare-exporting[brag/examples/nested-word-list] + +A program written in @litchar{#lang brag} produces a module that provides a few +bindings. The most important of these is @racket[parse]: + +@defproc[(parse [source any/c #f] + [token-source (or/c (sequenceof token) + (-> token))]) + syntax?]{ + + Parses the sequence of @tech{tokens} according to the rules in the grammar, using the + first rule as the start production. The parse must completely consume + @racket[token-source]. + + The @deftech{token source} can either be a sequence, or a 0-arity function that + produces @tech{tokens}. + + A @deftech{token} in @tt{brag} can be any of the following values: + @itemize[ + @item{a string} + @item{a symbol} + @item{an instance produced by @racket[token]} + @item{an instance produced by the token constructors of @racketmodname[br-parser-tools/lex]} + @item{an instance of @racketmodname[br-parser-tools/lex]'s @racket[position-token] whose + @racket[position-token-token] is a @tech{token}.} + ] + + A token whose type is either @racket[void] or @racket['EOF] terminates the + source. + + + If @racket[parse] succeeds, it will return a structured syntax object. The + structure of the syntax object follows the overall structure of the rules in + the BNF grammar. For each rule @racket[r] and its associated pattern @racket[p], + @racket[parse] generates a syntax object @racket[#'(r p-value)] where + @racket[p-value]'s structure follows a case analysis on @racket[p]: + + @itemize[ + @item{For implicit and explicit sequences of @tech{pattern}s @racket[p1], + @racket[p2], ..., the corresponding values, spliced into the + structure.} + @item{For terminals, the value of the token.} + @item{For @tech{rule identifier}s: the associated parse value for the rule.} + @item{For @tech{choice pattern}s: the associated parse value for one of the matching subpatterns.} + @item{For @tech{quantifed pattern}s and @tech{optional pattern}s: the corresponding values, spliced into the structure.} + ] + + Consequently, it's only the presence of @tech{rule identifier}s in a rule's + pattern that informs the parser to introduces nested structure into the syntax + object. + + + If the grammar is ambiguous, @tt{brag} will choose one of the possible parse results, though it doesn't guarantee which. + + + If the parse cannot be performed successfully, or if a token in the + @racket[token-source] uses a type that isn't mentioned in the grammar, then + @racket[parse] raises an instance of @racket[exn:fail:parsing].} + + +@defproc[(parse-to-datum [source any/c #f] + [token-source (or/c (sequenceof token) + (-> token))]) + list?]{ + Same as @racket[parse], but the result is converted into a plain datum. Useful for testing or debugging a parser. +} + + +@defform[#:id make-rule-parser + (make-rule-parser name)]{ + Constructs a parser for the @racket[name] of one of the non-terminals + in the grammar. + + For example, given the @tt{brag} program + @filepath{simple-arithmetic-grammar.rkt}: + @filebox["simple-arithmetic-grammar.rkt"]{ + @verbatim|{ + #lang brag + expr : term ('+' term)* + term : factor ('*' factor)* + factor : INT + }| + } + the following interaction shows how to extract a parser for @racket[term]s. + @interaction[#:eval my-eval + @eval:alts[(require "simple-arithmetic-grammar.rkt") + (require brag/examples/simple-arithmetic-grammar)] + (define term-parse (make-rule-parser term)) + (define tokens (list (token 'INT 3) + "*" + (token 'INT 4))) + (syntax->datum (parse tokens)) + (syntax->datum (term-parse tokens)) + + (define another-token-sequence + (list (token 'INT 1) "+" (token 'INT 2) + "*" (token 'INT 3))) + (syntax->datum (parse another-token-sequence)) + @code:comment{Note that term-parse will break on another-token-sequence} + @code:comment{as it does not know what to do with the "+"} + (term-parse another-token-sequence) + ] + +} + + +@defthing[all-token-types (setof symbol?)]{ + A set of all the token types used in a grammar. + + For example: + @interaction[#:eval my-eval + @eval:alts[(require "simple-arithmetic-grammar.rkt") + (require brag/examples/simple-arithmetic-grammar)] + all-token-types + ] + +} + + + +@section{Support API} + +@defmodule[brag/support] + +The @racketmodname[brag/support] module provides functions to interact with +@tt{brag} programs. The most useful is the @racket[token] function, which +produces tokens to be parsed. + +In addition to the exports shown below, the @racketmodname[brag/support] module also provides everything from @racketmodname[brag/support], and everything from @racketmodname[br-parser-tools/lex]. + + +@defproc[(token [type (or/c string? symbol?)] + [val any/c #f] + [#:line line (or/c positive-integer? #f) #f] + [#:column column (or/c natural-number? #f) #f] + [#:position position (or/c positive-integer? #f) #f] + [#:span span (or/c natural-number? #f) #f] + [#:skip? skip? boolean? #f] + ) + token-struct?]{ + Creates instances of @racket[token-struct]s. + + The syntax objects produced by a parse will inject the value @racket[val] in + place of the token name in the grammar. + + If @racket[#:skip?] is true, then the parser will skip over it during a + parse.} + + +@defstruct[token-struct ([type symbol?] + [val any/c] + [position (or/c positive-integer? #f)] + [line (or/c natural-number? #f)] + [column (or/c positive-integer? #f)] + [span (or/c natural-number? #f)] + [skip? boolean?]) + #:transparent]{ + The token structure type. + + Rather than directly using the @racket[token-struct] constructor, please use + the helper function @racket[token] to construct instances. +} + + + + +@defstruct[(exn:fail:parsing exn:fail) + ([message string?] + [continuation-marks continuation-mark-set?] + [srclocs (listof srcloc?)])]{ + The exception raised when parsing fails. + + @racket[exn:fail:parsing] implements Racket's @racket[prop:exn:srcloc] + property, so if this exception reaches DrRacket's default error handler, + DrRacket should highlight the offending locations in the source.} + + + +@defproc[(apply-tokenizer-maker [tokenizer-maker procedure?] + [source (or/c string? + input-port?)]) + list?]{ + Repeatedly apply @racket[tokenizer-maker] to @racket[source], gathering the resulting tokens into a list. @racket[source] can be a string or an input port. Useful for testing or debugging a tokenizer. +} + +@defproc[(apply-lexer [lexer procedure?] + [source (or/c string? + input-port?)]) + list?]{ + Repeatedly apply @racket[lexer] to @racket[source], gathering the resulting tokens into a list. @racket[source] can be a string or an input port. Useful for testing or debugging a lexer. +} + + +@defproc[(trim-ends [left-str string?] + [str string?] + [right-str string?]) + string?]{ + Remove @racket[left-str] from the left side of @racket[str], and @racket[right-str] from its right side. Intended as a helper function for @racket[from/to]. +} + + +@defform[(:* re ...)]{ + + Repetition of @racket[re] sequence 0 or more times.} + +@defform[(:+ re ...)]{ + + Repetition of @racket[re] sequence 1 or more times.} + +@defform[(:? re ...)]{ + + Zero or one occurrence of @racket[re] sequence.} + +@defform[(:= n re ...)]{ + + Exactly @racket[n] occurrences of @racket[re] sequence, where + @racket[n] must be a literal exact, non-negative number.} + +@defform[(:>= n re ...)]{ + + At least @racket[n] occurrences of @racket[re] sequence, where + @racket[n] must be a literal exact, non-negative number.} + +@defform[(:** n m re ...)]{ + + Between @racket[n] and @racket[m] (inclusive) occurrences of + @racket[re] sequence, where @racket[n] must be a literal exact, + non-negative number, and @racket[m] must be literally either + @racket[#f], @racket[+inf.0], or an exact, non-negative number; a + @racket[#f] value for @racket[m] is the same as @racket[+inf.0].} + +@defform[(:or re ...)]{ + + Same as @racket[(union re ...)].} + +@deftogether[( + @defform[(:: re ...)] + @defform[(:seq re ...)] + )]{ + + Both forms concatenate the @racket[re]s.} + +@defform[(:& re ...)]{ + + Intersects the @racket[re]s.} + +@defform[(:- re ...)]{ + + The set difference of the @racket[re]s.} + +@defform[(:~ re ...)]{ + + Character-set complement, which each @racket[re] must match exactly + one character.} + +@defform[(:/ char-or-string ...)]{ + + Character ranges, matching characters between successive pairs of + characters.} + +@defform[(from/to open close)]{ + + A string that is bounded by @racket[open] and @racket[close]. Matching is non-greedy (meaning, it stops at the first occurence of @racket[close]). The resulting lexeme includes @racket[open] and @racket[close]. To remove them, see @racket[trim-ends].} + +@defform[(from/stop-before open close)]{ + + Like @racket[from/to], a string that is bounded by @racket[open] and @racket[close], except that @racket[close] is not included in the resulting lexeme. Matching is non-greedy (meaning, it stops at the first occurence of @racket[close]).} + + +@close-eval[my-eval] diff --git a/brag/brag/cfg-parser/cfg-parser.rkt b/brag/brag/cfg-parser/cfg-parser.rkt new file mode 100755 index 0000000..1bc717b --- /dev/null +++ b/brag/brag/cfg-parser/cfg-parser.rkt @@ -0,0 +1,921 @@ +#lang racket/base +;; This module implements a parser form like the br-parser-tools's +;; `parser', except that it works on an arbitrary CFG (returning +;; the first sucecssful parse). + +;; I'm pretty sure that this is an implementation of Earley's +;; algorithm. + +;; To a first approximation, it's a backtracking parser. Alternative +;; for a non-terminal are computed in parallel, and multiple attempts +;; to compute the same result block until the first one completes. If +;; you get into deadlock, such as when trying to match +;; := +;; then it means that there's no successful parse, so everything +;; that's blocked fails. + +;; A cache holds the series of results for a particular non-terminal +;; at a particular starting location. (A series is used, instead of a +;; sinlge result, for backtracking.) Otherwise, the parser uses +;; backtracking search. Backtracking is implemented through explicit +;; success and failure continuations. Multiple results for a +;; particular nonterminal and location are kept only when they have +;; different lengths. (Otherwise, in the spirit of finding one +;; successful parse, only the first result is kept.) + +;; The br-parser-tools's `parse' is used to transform tokens in the +;; grammar to tokens specific to this parser. In other words, this +;; parser uses `parser' so that it doesn't have to know anything about +;; tokens. +;; + + + +(require br-parser-tools/yacc + br-parser-tools/lex) + +(require (for-syntax racket/base + syntax/boundmap + br-parser-tools/private-lex/token-syntax)) + +(provide cfg-parser) + +;; A raw token, wrapped so that we can recognize it: +(define-struct tok (name orig-name val start end)) + +;; Represents the thread scheduler: +(define-struct tasks (active active-back waits multi-waits cache progress?)) + +(define-for-syntax make-token-identifier-mapping make-hasheq) +(define-for-syntax token-identifier-mapping-get + (case-lambda + [(t tok) + (hash-ref t (syntax-e tok))] + [(t tok fail) + (hash-ref t (syntax-e tok) fail)])) +(define-for-syntax token-identifier-mapping-put! + (lambda (t tok v) + (hash-set! t (syntax-e tok) v))) +(define-for-syntax token-identifier-mapping-map + (lambda (t f) + (hash-map t f))) + +;; Used to calculate information on the grammar, such as whether +;; a particular non-terminal is "simple" instead of recursively defined. +(define-for-syntax (nt-fixpoint nts proc nt-ids patss) + (define (ormap-all val f as bs) + (cond + [(null? as) val] + [else (ormap-all (or (f (car as) (car bs)) val) + f + (cdr as) (cdr bs))])) + (let loop () + (when (ormap-all #f + (lambda (nt pats) + (let ([old (bound-identifier-mapping-get nts nt)]) + (let ([new (proc nt pats old)]) + (if (equal? old new) + #f + (begin + (bound-identifier-mapping-put! nts nt new) + #t))))) + nt-ids patss) + (loop)))) + +;; Tries parse-a followed by parse-b. If parse-a is not simple, +;; then after parse-a succeeds once, we parallelize parse-b +;; and trying a second result for parse-a. +(define (parse-and simple-a? parse-a parse-b + stream last-consumed-token depth end success-k fail-k + max-depth tasks) + (letrec ([mk-got-k + (lambda (success-k fail-k) + (lambda (val stream last-consumed-token depth max-depth tasks next1-k) + (if simple-a? + (parse-b val stream last-consumed-token depth end + (mk-got2-k success-k fail-k next1-k) + (mk-fail2-k success-k fail-k next1-k) + max-depth tasks) + (parallel-or + (lambda (success-k fail-k max-depth tasks) + (parse-b val stream last-consumed-token depth end + success-k fail-k + max-depth tasks)) + (lambda (success-k fail-k max-depth tasks) + (next1-k (mk-got-k success-k fail-k) + fail-k max-depth tasks)) + success-k fail-k max-depth tasks))))] + [mk-got2-k + (lambda (success-k fail-k next1-k) + (lambda (val stream last-consumed-token depth max-depth tasks next-k) + (success-k val stream last-consumed-token depth max-depth tasks + (lambda (success-k fail-k max-depth tasks) + (next-k (mk-got2-k success-k fail-k next1-k) + (mk-fail2-k success-k fail-k next1-k) + max-depth tasks)))))] + [mk-fail2-k + (lambda (success-k fail-k next1-k) + (lambda (max-depth tasks) + (next1-k (mk-got-k success-k fail-k) + fail-k + max-depth + tasks)))]) + (parse-a stream last-consumed-token depth end + (mk-got-k success-k fail-k) + fail-k + max-depth tasks))) + +;; Parallel or for non-terminal alternatives +(define (parse-parallel-or parse-a parse-b stream last-consumed-token depth end success-k fail-k max-depth tasks) + (parallel-or (lambda (success-k fail-k max-depth tasks) + (parse-a stream last-consumed-token depth end success-k fail-k max-depth tasks)) + (lambda (success-k fail-k max-depth tasks) + (parse-b stream last-consumed-token depth end success-k fail-k max-depth tasks)) + success-k fail-k max-depth tasks)) + +;; Generic parallel-or +(define (parallel-or parse-a parse-b success-k fail-k max-depth tasks) + (define answer-key (gensym)) + (letrec ([gota-k + (lambda (val stream last-consumed-token depth max-depth tasks next-k) + (report-answer answer-key + max-depth + tasks + (list val stream last-consumed-token depth next-k)))] + [faila-k + (lambda (max-depth tasks) + (report-answer answer-key + max-depth + tasks + null))]) + (let* ([tasks (queue-task + tasks + (lambda (max-depth tasks) + (parse-a gota-k + faila-k + max-depth tasks)))] + [tasks (queue-task + tasks + (lambda (max-depth tasks) + (parse-b gota-k + faila-k + max-depth tasks)))] + [queue-next (lambda (next-k tasks) + (queue-task tasks + (lambda (max-depth tasks) + (next-k gota-k + faila-k + max-depth tasks))))]) + (letrec ([mk-got-one + (lambda (immediate-next? get-nth success-k) + (lambda (val stream last-consumed-token depth max-depth tasks next-k) + (let ([tasks (if immediate-next? + (queue-next next-k tasks) + tasks)]) + (success-k val stream last-consumed-token depth max-depth + tasks + (lambda (success-k fail-k max-depth tasks) + (let ([tasks (if immediate-next? + tasks + (queue-next next-k tasks))]) + (get-nth max-depth tasks success-k fail-k)))))))] + [get-first + (lambda (max-depth tasks success-k fail-k) + (wait-for-answer #f max-depth tasks answer-key + (mk-got-one #t get-first success-k) + (lambda (max-depth tasks) + (get-second max-depth tasks success-k fail-k)) + #f))] + [get-second + (lambda (max-depth tasks success-k fail-k) + (wait-for-answer #f max-depth tasks answer-key + (mk-got-one #f get-second success-k) + fail-k #f))]) + (get-first max-depth tasks success-k fail-k))))) + +;; Non-terminal alternatives where the first is "simple" can be done +;; sequentially, which is simpler +(define (parse-or parse-a parse-b + stream last-consumed-token depth end success-k fail-k max-depth tasks) + (letrec ([mk-got-k + (lambda (success-k fail-k) + (lambda (val stream last-consumed-token depth max-depth tasks next-k) + (success-k val stream last-consumed-token depth + max-depth tasks + (lambda (success-k fail-k max-depth tasks) + (next-k (mk-got-k success-k fail-k) + (mk-fail-k success-k fail-k) + max-depth tasks)))))] + [mk-fail-k + (lambda (success-k fail-k) + (lambda (max-depth tasks) + (parse-b stream last-consumed-token depth end success-k fail-k max-depth tasks)))]) + (parse-a stream last-consumed-token depth end + (mk-got-k success-k fail-k) + (mk-fail-k success-k fail-k) + max-depth tasks))) + +;; Starts a thread +(define queue-task + (lambda (tasks t [progress? #t]) + (make-tasks (tasks-active tasks) + (cons t (tasks-active-back tasks)) + (tasks-waits tasks) + (tasks-multi-waits tasks) + (tasks-cache tasks) + (or progress? (tasks-progress? tasks))))) + +;; Reports an answer to a waiting thread: +(define (report-answer answer-key max-depth tasks val) + (let ([v (hash-ref (tasks-waits tasks) answer-key (lambda () #f))]) + (if v + (let ([tasks (make-tasks (cons (v val) + (tasks-active tasks)) + (tasks-active-back tasks) + (tasks-waits tasks) + (tasks-multi-waits tasks) + (tasks-cache tasks) + #t)]) + (hash-remove! (tasks-waits tasks) answer-key) + (swap-task max-depth tasks)) + ;; We have an answer ready too fast; wait + (swap-task max-depth + (queue-task tasks + (lambda (max-depth tasks) + (report-answer answer-key max-depth tasks val)) + #f))))) + +;; Reports an answer to multiple waiting threads: +(define (report-answer-all answer-key max-depth tasks val k) + (let ([v (hash-ref (tasks-multi-waits tasks) answer-key (lambda () null))]) + (hash-remove! (tasks-multi-waits tasks) answer-key) + (let ([tasks (make-tasks (append (map (lambda (a) (a val)) v) + (tasks-active tasks)) + (tasks-active-back tasks) + (tasks-waits tasks) + (tasks-multi-waits tasks) + (tasks-cache tasks) + #t)]) + (k max-depth tasks)))) + +;; Waits for an answer; if `multi?' is #f, this is sole waiter, otherwise +;; there might be many. Use wither #t or #f (and `report-answer' or +;; `report-answer-all', resptively) consistently for a particular answer key. +(define (wait-for-answer multi? max-depth tasks answer-key success-k fail-k deadlock-k) + (let ([wait (lambda (val) + (lambda (max-depth tasks) + (if val + (if (null? val) + (fail-k max-depth tasks) + (let-values ([(val stream last-consumed-token depth next-k) (apply values val)]) + (success-k val stream last-consumed-token depth max-depth tasks next-k))) + (deadlock-k max-depth tasks))))]) + (if multi? + (hash-set! (tasks-multi-waits tasks) answer-key + (cons wait (hash-ref (tasks-multi-waits tasks) answer-key + (lambda () null)))) + (hash-set! (tasks-waits tasks) answer-key wait)) + (let ([tasks (make-tasks (tasks-active tasks) + (tasks-active-back tasks) + (tasks-waits tasks) + (tasks-multi-waits tasks) + (tasks-cache tasks) + #t)]) + (swap-task max-depth tasks)))) + +;; Swap thread +(define (swap-task max-depth tasks) + ;; Swap in first active: + (if (null? (tasks-active tasks)) + (if (tasks-progress? tasks) + (swap-task max-depth + (make-tasks (reverse (tasks-active-back tasks)) + null + (tasks-waits tasks) + (tasks-multi-waits tasks) + (tasks-cache tasks) + #f)) + ;; No progress, so issue failure for all multi-waits + (if (zero? (hash-count (tasks-multi-waits tasks))) + (error 'swap-task "Deadlock") + (swap-task max-depth + (make-tasks (apply + append + (hash-map (tasks-multi-waits tasks) + (lambda (k l) + (map (lambda (v) (v #f)) l)))) + (tasks-active-back tasks) + (tasks-waits tasks) + (make-hasheq) + (tasks-cache tasks) + #t)))) + (let ([t (car (tasks-active tasks))] + [tasks (make-tasks (cdr (tasks-active tasks)) + (tasks-active-back tasks) + (tasks-waits tasks) + (tasks-multi-waits tasks) + (tasks-cache tasks) + (tasks-progress? tasks))]) + (t max-depth tasks)))) + +;; Finds the symbolic representative of a token class +(define-for-syntax (map-token toks tok) + (car (token-identifier-mapping-get toks tok))) + +(define no-pos-val (make-position #f #f #f)) +(define-for-syntax no-pos + (let ([npv ((syntax-local-certifier) #'no-pos-val)]) + (lambda (stx) npv))) +(define-for-syntax at-tok-pos + (lambda (sel expr) + (lambda (stx) + #`(let ([v #,expr]) (if v (#,sel v) no-pos-val))))) + +;; Builds a matcher for a particular alternative +(define-for-syntax (build-match nts toks pat handle $ctx) + (let loop ([pat pat] + [pos 1]) + (if (null? pat) + #`(success-k #,handle stream last-consumed-token depth max-depth tasks + (lambda (success-k fail-k max-depth tasks) + (fail-k max-depth tasks))) + (let ([id (datum->syntax (car pat) + (string->symbol (format "$~a" pos)))] + [id-start-pos (datum->syntax (car pat) + (string->symbol (format "$~a-start-pos" pos)))] + [id-end-pos (datum->syntax (car pat) + (string->symbol (format "$~a-end-pos" pos)))] + [n-end-pos (and (null? (cdr pat)) + (datum->syntax (car pat) '$n-end-pos))]) + (cond + [(bound-identifier-mapping-get nts (car pat) (lambda () #f)) + ;; Match non-termimal + #`(parse-and + ;; First part is simple? (If so, we don't have to parallelize the `and'.) + #,(let ([l (bound-identifier-mapping-get nts (car pat) (lambda () #f))]) + (or (not l) + (andmap values (caddr l)))) + #,(car pat) + (let ([original-stream stream]) + (lambda (#,id stream last-consumed-token depth end success-k fail-k max-depth tasks) + (let-syntax ([#,id-start-pos (at-tok-pos #'(if (eq? original-stream stream) + tok-end + tok-start) + #'(if (eq? original-stream stream) + last-consumed-token + (and (pair? original-stream) + (car original-stream))))] + [#,id-end-pos (at-tok-pos #'tok-end #'last-consumed-token)] + #,@(if n-end-pos + #`([#,n-end-pos (at-tok-pos #'tok-end #'last-consumed-token)]) + null)) + #,(loop (cdr pat) (add1 pos))))) + stream last-consumed-token depth + #,(let ([cnt (apply + + (map (lambda (item) + (cond + [(bound-identifier-mapping-get nts item (lambda () #f)) + => (lambda (l) (car l))] + [else 1])) + (cdr pat)))]) + #`(- end #,cnt)) + success-k fail-k max-depth tasks)] + [else + ;; Match token + (let ([tok-id (map-token toks (car pat))]) + #`(if (and (pair? stream) + (eq? '#,tok-id (tok-name (car stream)))) + (let* ([stream-a (car stream)] + [#,id (tok-val stream-a)] + [last-consumed-token (car stream)] + [stream (cdr stream)] + [depth (add1 depth)]) + (let ([max-depth (max max-depth depth)]) + (let-syntax ([#,id-start-pos (at-tok-pos #'tok-start #'stream-a)] + [#,id-end-pos (at-tok-pos #'tok-end #'stream-a)] + #,@(if n-end-pos + #`([#,n-end-pos (at-tok-pos #'tok-end #'stream-a)]) + null)) + #,(loop (cdr pat) (add1 pos))))) + (fail-k max-depth tasks)))]))))) + +;; Starts parsing to match a non-terminal. There's a minor +;; optimization that checks for known starting tokens. Otherwise, +;; use the cache, block if someone else is already trying the match, +;; and cache the result if it's computed. +;; The cache maps nontermial+startingpos+iteration to a result, where +;; the iteration is 0 for the first match attempt, 1 for the second, +;; etc. +(define (parse-nt/share key min-cnt init-tokens stream last-consumed-token depth end max-depth tasks success-k fail-k k) + (if (and (positive? min-cnt) + (pair? stream) + (not (memq (tok-name (car stream)) init-tokens))) + ;; No such leading token; give up + (fail-k max-depth tasks) + ;; Run pattern + (let loop ([n 0] + [success-k success-k] + [fail-k fail-k] + [max-depth max-depth] + [tasks tasks] + [k k]) + (let ([answer-key (gensym)] + [table-key (vector key depth n)] + [old-depth depth] + [old-stream stream]) + #;(printf "Loop ~a\n" table-key) + (cond + [(hash-ref (tasks-cache tasks) table-key (lambda () #f)) + => (lambda (result) + #;(printf "Reuse ~a\n" table-key) + (result success-k fail-k max-depth tasks))] + [else + #;(printf "Try ~a ~a\n" table-key (map tok-name stream)) + (hash-set! (tasks-cache tasks) table-key + (lambda (success-k fail-k max-depth tasks) + #;(printf "Wait ~a ~a\n" table-key answer-key) + (wait-for-answer #t max-depth tasks answer-key success-k fail-k + (lambda (max-depth tasks) + #;(printf "Deadlock ~a ~a\n" table-key answer-key) + (fail-k max-depth tasks))))) + (let result-loop ([max-depth max-depth][tasks tasks][k k]) + (letrec ([orig-stream stream] + [new-got-k + (lambda (val stream last-consumed-token depth max-depth tasks next-k) + ;; Check whether we already have a result that consumed the same amount: + (let ([result-key (vector #f key old-depth depth)]) + (cond + [(hash-ref (tasks-cache tasks) result-key (lambda () #f)) + ;; Go for the next-result + (result-loop max-depth + tasks + (lambda (end max-depth tasks success-k fail-k) + (next-k success-k fail-k max-depth tasks)))] + [else + #;(printf "Success ~a ~a\n" table-key + (map tok-name (let loop ([d old-depth][s old-stream]) + (if (= d depth) + null + (cons (car s) (loop (add1 d) (cdr s))))))) + (let ([next-k (lambda (success-k fail-k max-depth tasks) + (loop (add1 n) + success-k + fail-k + max-depth + tasks + (lambda (end max-depth tasks success-k fail-k) + (next-k success-k fail-k max-depth tasks))))]) + (hash-set! (tasks-cache tasks) result-key #t) + (hash-set! (tasks-cache tasks) table-key + (lambda (success-k fail-k max-depth tasks) + (success-k val stream last-consumed-token depth max-depth tasks next-k))) + (report-answer-all answer-key + max-depth + tasks + (list val stream last-consumed-token depth next-k) + (lambda (max-depth tasks) + (success-k val stream last-consumed-token depth max-depth tasks next-k))))])))] + [new-fail-k + (lambda (max-depth tasks) + #;(printf "Failure ~a\n" table-key) + (hash-set! (tasks-cache tasks) table-key + (lambda (success-k fail-k max-depth tasks) + (fail-k max-depth tasks))) + (report-answer-all answer-key + max-depth + tasks + null + (lambda (max-depth tasks) + (fail-k max-depth tasks))))]) + (k end max-depth tasks new-got-k new-fail-k)))]))))) + +(define-syntax (cfg-parser stx) + (syntax-case stx () + [(_ clause ...) + (let ([clauses (syntax->list #'(clause ...))]) + (let-values ([(start grammar cfg-error parser-clauses src-pos?) + (let ([all-toks (apply + append + (map (lambda (clause) + (syntax-case clause (tokens) + [(tokens t ...) + (apply + append + (map (lambda (t) + (let ([v (syntax-local-value t (lambda () #f))]) + (cond + [(terminals-def? v) + (map (lambda (v) + (cons v #f)) + (syntax->list (terminals-def-t v)))] + [(e-terminals-def? v) + (map (lambda (v) + (cons v #t)) + (syntax->list (e-terminals-def-t v)))] + [else null]))) + (syntax->list #'(t ...))))] + [_else null])) + clauses))] + [all-end-toks (apply + append + (map (lambda (clause) + (syntax-case clause (end) + [(end t ...) + (syntax->list #'(t ...))] + [_else null])) + clauses))]) + (let loop ([clauses clauses] + [cfg-start #f] + [cfg-grammar #f] + [cfg-error #f] + [src-pos? #f] + [parser-clauses null]) + (if (null? clauses) + (values cfg-start + cfg-grammar + cfg-error + (reverse parser-clauses) + src-pos?) + (syntax-case (car clauses) (start error grammar src-pos) + [(start tok) + (loop (cdr clauses) #'tok cfg-grammar cfg-error src-pos? parser-clauses)] + [(error expr) + (loop (cdr clauses) cfg-start cfg-grammar #'expr src-pos? parser-clauses)] + [(grammar [nt [pat handle0 handle ...] ...] ...) + (let ([nts (make-bound-identifier-mapping)] + [toks (make-token-identifier-mapping)] + [end-toks (make-token-identifier-mapping)] + [nt-ids (syntax->list #'(nt ...))] + [patss (map (lambda (stx) + (map syntax->list (syntax->list stx))) + (syntax->list #'((pat ...) ...)))]) + (for-each (lambda (nt) + (bound-identifier-mapping-put! nts nt (list 0))) + nt-ids) + (for-each (lambda (t) + (token-identifier-mapping-put! end-toks t #t)) + all-end-toks) + (for-each (lambda (t) + (unless (token-identifier-mapping-get end-toks (car t) (lambda () #f)) + (let ([id (gensym (syntax-e (car t)))]) + (token-identifier-mapping-put! toks (car t) + (cons id (cdr t)))))) + all-toks) + ;; Compute min max size for each non-term: + (nt-fixpoint + nts + (lambda (nt pats old-list) + (let ([new-cnt + (apply + min + (map (lambda (pat) + (apply + + + (map (lambda (elem) + (car + (bound-identifier-mapping-get nts + elem + (lambda () (list 1))))) + pat))) + pats))]) + (if (new-cnt . > . (car old-list)) + (cons new-cnt (cdr old-list)) + old-list))) + nt-ids patss) + ;; Compute set of toks that must appear at the beginning + ;; for a non-terminal + (nt-fixpoint + nts + (lambda (nt pats old-list) + (let ([new-list + (apply + append + (map (lambda (pat) + (let loop ([pat pat]) + (if (pair? pat) + (let ([l (bound-identifier-mapping-get + nts + (car pat) + (lambda () + (list 1 (map-token toks (car pat)))))]) + ;; If the non-terminal can match 0 things, + ;; then it might match something from the + ;; next pattern element. Otherwise, it must + ;; match the first element: + (if (zero? (car l)) + (append (cdr l) (loop (cdr pat))) + (cdr l))) + null))) + pats))]) + (let ([new (filter (lambda (id) + (andmap (lambda (id2) + (not (eq? id id2))) + (cdr old-list))) + new-list)]) + (if (pair? new) + ;; Drop dups in new list: + (let ([new (let loop ([new new]) + (if (null? (cdr new)) + new + (if (ormap (lambda (id) + (eq? (car new) id)) + (cdr new)) + (loop (cdr new)) + (cons (car new) (loop (cdr new))))))]) + (cons (car old-list) (append new (cdr old-list)))) + old-list)))) + nt-ids patss) + ;; Determine left-recursive clauses: + (for-each (lambda (nt pats) + (let ([l (bound-identifier-mapping-get nts nt)]) + (bound-identifier-mapping-put! nts nt (list (car l) + (cdr l) + (map (lambda (x) #f) pats))))) + nt-ids patss) + (nt-fixpoint + nts + (lambda (nt pats old-list) + (list (car old-list) + (cadr old-list) + (map (lambda (pat simple?) + (or simple? + (let ([l (map (lambda (elem) + (bound-identifier-mapping-get + nts + elem + (lambda () #f))) + pat)]) + (andmap (lambda (i) + (or (not i) + (andmap values (caddr i)))) + l)))) + pats (caddr old-list)))) + nt-ids patss) + ;; Build a definition for each non-term: + (loop (cdr clauses) + cfg-start + (map (lambda (nt pats handles $ctxs) + (define info (bound-identifier-mapping-get nts nt)) + (list nt + #`(let ([key (gensym '#,nt)]) + (lambda (stream last-consumed-token depth end success-k fail-k max-depth tasks) + (parse-nt/share + key #,(car info) '#,(cadr info) stream last-consumed-token depth end + max-depth tasks + success-k fail-k + (lambda (end max-depth tasks success-k fail-k) + #,(let loop ([pats pats] + [handles (syntax->list handles)] + [$ctxs (syntax->list $ctxs)] + [simple?s (caddr info)]) + (if (null? pats) + #'(fail-k max-depth tasks) + #`(#,(if (or (null? (cdr pats)) + (car simple?s)) + #'parse-or + #'parse-parallel-or) + (lambda (stream last-consumed-token depth end success-k fail-k max-depth tasks) + #,(build-match nts + toks + (car pats) + (car handles) + (car $ctxs))) + (lambda (stream last-consumed-token depth end success-k fail-k max-depth tasks) + #,(loop (cdr pats) + (cdr handles) + (cdr $ctxs) + (cdr simple?s))) + stream last-consumed-token depth end success-k fail-k max-depth tasks))))))))) + nt-ids + patss + (syntax->list #'(((begin handle0 handle ...) ...) ...)) + (syntax->list #'((handle0 ...) ...))) + cfg-error + src-pos? + (list* + (with-syntax ([((tok tok-id . $e) ...) + (token-identifier-mapping-map toks + (lambda (k v) + (list* k + (car v) + (if (cdr v) + #f + '$1))))] + [(pos ...) + (if src-pos? + #'($1-start-pos $1-end-pos) + #'(#f #f))]) + #`(grammar (start [() null] + [(atok start) (cons $1 $2)]) + (atok [(tok) (make-tok 'tok-id 'tok $e pos ...)] ...))) + #`(start start) + parser-clauses)))] + [(grammar . _) + (raise-syntax-error + #f + "bad grammar clause" + stx + (car clauses))] + [(src-pos) + (loop (cdr clauses) + cfg-start + cfg-grammar + cfg-error + #t + (cons (car clauses) parser-clauses))] + [_else + (loop (cdr clauses) + cfg-start + cfg-grammar + cfg-error + src-pos? + (cons (car clauses) parser-clauses))]))))]) + #`(let ([orig-parse (parser + [error (lambda (a b c) + (error 'cfg-parser "unexpected ~a token: ~a" b c))] + . #,parser-clauses)] + [error-proc #,cfg-error]) + (letrec #,grammar + (lambda (get-tok) + (let ([tok-list (orig-parse get-tok)]) + (letrec ([success-k + (lambda (val stream last-consumed-token depth max-depth tasks next) + (if (null? stream) + val + (next success-k fail-k max-depth tasks)))] + [fail-k (lambda (max-depth tasks) + (cond + [(null? tok-list) + (if error-proc + (error-proc #t + 'no-tokens + #f + (make-position #f #f #f) + (make-position #f #f #f)) + (error + 'cfg-parse + "no tokens"))] + [else + (let ([bad-tok (list-ref tok-list + (min (sub1 (length tok-list)) + max-depth))]) + (if error-proc + (error-proc #t + (tok-orig-name bad-tok) + (tok-val bad-tok) + (tok-start bad-tok) + (tok-end bad-tok)) + (error + 'cfg-parse + "failed at ~a" + (tok-val bad-tok))))]))]) + (#,start tok-list + ;; we simulate a token at the very beginning with zero width + ;; for use with the position-generating code (*-start-pos, *-end-pos). + (if (null? tok-list) + (tok #f #f #f + (position 1 + #,(if src-pos? #'1 #'#f) + #,(if src-pos? #'0 #'#f)) + (position 1 + #,(if src-pos? #'1 #'#f) + #,(if src-pos? #'0 #'#f))) + (tok (tok-name (car tok-list)) + (tok-orig-name (car tok-list)) + (tok-val (car tok-list)) + (tok-start (car tok-list)) + (tok-start (car tok-list)))) + 0 + (length tok-list) + success-k + fail-k + 0 + (make-tasks null null + (make-hasheq) (make-hasheq) + (make-hash) #t)))))))))])) + + +(module* test racket/base + (require (submod "..") + br-parser-tools/lex + racket/block + rackunit) + + ;; Test: parsing regular expressions. + ;; Here is a test case on locations: + (block + (define-tokens regexp-tokens (ANCHOR STAR OR LIT LPAREN RPAREN EOF)) + (define lex (lexer-src-pos ["|" (token-OR lexeme)] + ["^" (token-ANCHOR lexeme)] + ["*" (token-STAR lexeme)] + [(repetition 1 +inf.0 alphabetic) (token-LIT lexeme)] + ["(" (token-LPAREN lexeme)] + [")" (token-RPAREN lexeme)] + [whitespace (return-without-pos (lex input-port))] + [(eof) (token-EOF 'eof)])) + (define -parse (cfg-parser + (tokens regexp-tokens) + (start top) + (end EOF) + (src-pos) + (grammar [top [(maybe-anchor regexp) + (cond [$1 + `(anchored ,$2 ,(pos->sexp $1-start-pos) ,(pos->sexp $2-end-pos))] + [else + `(unanchored ,$2 ,(pos->sexp $1-start-pos) ,(pos->sexp $2-end-pos))])]] + [maybe-anchor [(ANCHOR) #t] + [() #f]] + [regexp [(regexp STAR) `(star ,$1 ,(pos->sexp $1-start-pos) ,(pos->sexp $2-end-pos))] + [(regexp OR regexp) `(or ,$1 ,$3 ,(pos->sexp $1-start-pos) ,(pos->sexp $3-end-pos))] + [(LPAREN regexp RPAREN) `(group ,$2 ,(pos->sexp $1-start-pos) ,(pos->sexp $3-end-pos))] + [(LIT) `(lit ,$1 ,(pos->sexp $1-start-pos) ,(pos->sexp $1-end-pos))]]))) + (define (pos->sexp pos) + (position-offset pos)) + + (define (parse s) + (define ip (open-input-string s)) + (port-count-lines! ip) + (-parse (lambda () (lex ip)))) + + (check-equal? (parse "abc") + '(unanchored (lit "abc" 1 4) 1 4)) + (check-equal? (parse "a | (b*) | c") + '(unanchored (or (or (lit "a" 1 2) + (group (star (lit "b" 6 7) 6 8) 5 9) + 1 9) + (lit "c" 12 13) + 1 13) + 1 13))) + + + + + + ;; Tests used during development + (define-tokens non-terminals (PLUS MINUS STAR BAR COLON EOF)) + + (define lex + (lexer + ["+" (token-PLUS '+)] + ["-" (token-MINUS '-)] + ["*" (token-STAR '*)] + ["|" (token-BAR '||)] + [":" (token-COLON '|:|)] + [whitespace (lex input-port)] + [(eof) (token-EOF 'eof)])) + + (define parse + (cfg-parser + (tokens non-terminals) + (start ) + (end EOF) + (error (lambda (a b stx) + (error 'parse "failed at ~s" stx))) + (grammar [ [(PLUS) "plus"] + [( BAR ) (list $1 $2 $3)] + [( COLON) (list $1)]] + [ [(MINUS) "minus"] + [( STAR) (cons $1 $2)]] + [ [( MINUS) "yes"]] + [ [(PLUS) 'plus] + [(MINUS) 'minus]] + [ [() '0] + [( PLUS) (add1 $1)] + [( PLUS) (add1 $1)]]))) + + (let ([p (open-input-string #;"+*|-|-*|+**" #;"-|+*|+**" + #;"+*|+**|-" #;"-|-*|-|-*" + #;"-|-*|-|-**|-|-*|-|-**" + "-|-*|-|-**|-|-*|-|-***|-|-*|-|-**|-|-*|-|-****|-|-*|-|-**|-|-*|-|-*** + |-|-*|-|-**|-|-*|-|-*****|-|-*|-|-**|-|-*|-|-***|-|-*|-|-**|-|-*|-|-****| + -|-*|-|-**|-|-*|-|-***|-|-*|-|-**|-|-*|-|-*****" + ;; This one fails: + #;"+*")]) + (check-equal? (parse (lambda () (lex p))) + '((((((((((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *) || (((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *)) . *) + || + (((((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *) || (((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *)) . *)) + . + *) + || + (((((((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *) || (((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *)) . *) + || + (((((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *) || (((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *)) . *)) + . + *)) + . + *) + || + (((((((((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *) || (((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *)) . *) + || + (((((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *) || (((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *)) . *)) + . + *) + || + (((((((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *) || (((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *)) . *) + || + (((((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *) || (((("minus" || "minus") . *) || (("minus" || "minus") . *)) . *)) . *)) + . + *)) + . + *))))) diff --git a/brag/brag/cfg-parser/compiled/cfg-parser_rkt.dep b/brag/brag/cfg-parser/compiled/cfg-parser_rkt.dep new file mode 100644 index 0000000..01a846a --- /dev/null +++ b/brag/brag/cfg-parser/compiled/cfg-parser_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("da5744da22ed2aa3d983ac0392f263db7c827a39" . "f4e5b37aa4da6827509a70806f182e5614e3fc7a") (collects #"br-parser-tools" #"lex.rkt") (collects #"br-parser-tools" #"private-lex" #"token-syntax.rkt") (collects #"br-parser-tools" #"yacc.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"block.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"rackunit" #"main.rkt") (collects #"syntax" #"boundmap.rkt")) diff --git a/brag/brag/cfg-parser/compiled/cfg-parser_rkt.zo b/brag/brag/cfg-parser/compiled/cfg-parser_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..cbb4a43d43d803996dd003f06ec9bbdfbc259abb GIT binary patch literal 93024 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 literal 0 HcmV?d00001 diff --git a/brag/brag/codegen/codegen.rkt b/brag/brag/codegen/codegen.rkt new file mode 100755 index 0000000..f8f76cd --- /dev/null +++ b/brag/brag/codegen/codegen.rkt @@ -0,0 +1,448 @@ +#lang racket/base + +(require (for-template racket/base) + racket/list + racket/set + racket/syntax + syntax/srcloc + brag/rules/stx-types + "flatten.rkt" + syntax/id-table + (prefix-in sat: "satisfaction.rkt") + (prefix-in support: brag/support) + (prefix-in stxparse: syntax/parse)) + +(provide rules-codegen) + + +;; Generates the body of the module. +;; FIXME: abstract this so we can just call (rules ...) without +;; generating the whole module body. +(define (rules-codegen stx + #:parser-provider-module [parser-provider-module 'br-parser-tools/yacc] + #:parser-provider-form [parser-provider-form 'parser]) + (syntax-case stx () + [(_ r ...) + (begin + ;; (listof stx) + (define rules (syntax->list #'(r ...))) + + (when (empty? rules) + (raise-syntax-error 'brag + (format "The grammar does not appear to have any rules") + stx)) + + (check-all-rules-defined! rules) + (check-all-rules-no-duplicates! rules) + (check-all-rules-satisfiable! rules) + + ;; We flatten the rules so we can use the yacc-style ruleset that br-parser-tools + ;; supports. + (define flattened-rules (flatten-rules rules)) + + (define generated-rule-codes (map flat-rule->yacc-rule flattened-rules)) + + ;; The first rule, by default, is the start rule. + (define rule-ids (for/list ([a-rule (in-list rules)]) + (rule-id a-rule))) + (define start-id (first rule-ids)) + + + (define-values (implicit-tokens ;; (listof identifier) + explicit-tokens) ;; (listof identifier) + (rules-collect-token-types rules)) + + ;; (listof symbol) + (define implicit-token-types + (map string->symbol + (set->list (list->set (map syntax-e implicit-tokens))))) + + ;; (listof symbol) + (define explicit-token-types + (set->list (list->set (map syntax-e explicit-tokens)))) + + ;; (listof symbol) + (define token-types + (set->list (list->set (append (map (lambda (x) (string->symbol (syntax-e x))) + implicit-tokens) + (map syntax-e explicit-tokens))))) + + (with-syntax ([start-id start-id] + + [(token-type ...) token-types] + + [(token-type-constructor ...) + (map (lambda (x) (string->symbol (format "token-~a" x))) + token-types)] + + [(explicit-token-types ...) explicit-token-types] + [(implicit-token-types ...) implicit-token-types] + [(implicit-token-types-str ...) (map symbol->string implicit-token-types)] + [(implicit-token-type-constructor ...) + (map (lambda (x) (string->symbol (format "token-~a" x))) + implicit-token-types)] + [generated-grammar #`(grammar #,@generated-rule-codes)] + [parser-module parser-provider-module] + [parser-form parser-provider-form]) + (quasisyntax/loc stx + (begin + (require br-parser-tools/lex + parser-module + brag/codegen/runtime + brag/support + brag/private/internal-support + racket/set + (for-syntax syntax/parse racket/base)) + + (provide parse + make-rule-parser + all-token-types + #;current-source + #;current-parser-error-handler + #;current-tokenizer-error-handler + #;[struct-out exn:fail:parsing] + ) + + (define-tokens enumerated-tokens (token-type ...)) + + ;; all-token-types lists all the tokens (except for EOF) + (define all-token-types + (set-remove (set 'token-type ...) 'EOF)) + + ;; For internal use by the permissive tokenizer only: + (define all-tokens-hash/mutable + (make-hash (list ;; Note: we also allow the eof object here, to make + ;; the permissive tokenizer even nicer to work with. + (cons eof token-EOF) + (cons 'token-type token-type-constructor) ...))) + + + #;(define default-lex/1 + (lexer-src-pos [implicit-token-types-str + (token 'implicit-token-types lexeme)] + ... + [(eof) (token eof)])) + + (define-syntax (make-rule-parser stx-2) + (syntax-parse stx-2 + [(_ start-rule:id) + (begin + ;; HACK HACK HACK + ;; The cfg-parser depends on the start-rule provided in (start ...) to have the same + ;; context as the rest of this body, so I need to hack this. I don't like this, but + ;; I don't know what else to do. Hence recolored-start-rule. + (unless (member (syntax-e #'start-rule) + '#,(map syntax-e rule-ids)) + (raise-syntax-error #f + (format "Rule ~a is not defined in the grammar" (syntax-e #'start-rule)) + stx-2)) + + (define recolored-start-rule (datum->syntax (syntax #,stx) (syntax-e #'start-rule))) + #`(let ([THE-GRAMMAR (parser-form (tokens enumerated-tokens) + (src-pos) + (start #,recolored-start-rule) + (end EOF) + (error THE-ERROR-HANDLER) + generated-grammar)]) + (case-lambda [(tokenizer) + (define next-token + (make-permissive-tokenizer tokenizer all-tokens-hash/mutable)) + (THE-GRAMMAR next-token)] + [(source tokenizer) + (parameterize ([current-source source]) + (parse tokenizer))])))])) + + (define parse (make-rule-parser start-id)) + (provide parse-to-datum parse-tree) + + (define (parse-to-datum x) + (let loop ([x (syntax->datum (parse x))]) + (cond + [(list? x) (map loop x)] + [(char? x) (string x)] + [else x]))) + + (define parse-tree parse-to-datum)))))])) + + +;; Given a flattened rule, returns a syntax for the code that +;; preserves as much source location as possible. +;; +;; Each rule is defined to return a list with the following structure: +;; +;; stx :== (name (U tokens rule-stx) ...) +;; +(define (flat-rule->yacc-rule a-flat-rule) + (syntax-case a-flat-rule () + [(rule-type origin name clauses ...) + (begin + (define translated-clauses + (map (lambda (clause) (translate-clause clause #'name #'origin)) + (syntax->list #'(clauses ...)))) + (with-syntax ([(translated-clause ...) translated-clauses]) + #`[name translated-clause ...]))])) + + + +;; translates a single primitive rule clause. +;; A clause is a simple list of ids, lit, vals, and inferred-id elements. +;; The action taken depends on the pattern type. +(define (translate-clause a-clause rule-name/false origin) + (define translated-patterns + (let loop ([primitive-patterns (syntax->list a-clause)]) + (cond + [(empty? primitive-patterns) + '()] + [else + (cons (syntax-case (first primitive-patterns) (id lit token inferred-id) + [(id val) + #'val] + [(lit val) + (datum->syntax #f (string->symbol (syntax-e #'val)) #'val)] + [(token val) + #'val] + [(inferred-id val reason) + #'val]) + (loop (rest primitive-patterns)))]))) + + (define translated-actions + (for/list ([translated-pattern (in-list translated-patterns)] + [primitive-pattern (syntax->list a-clause)] + [pos (in-naturals 1)]) + (if (eq? (syntax-property primitive-pattern 'hide) 'hide) + #'null + (with-syntax ([$X + (format-id translated-pattern "$~a" pos)] + [$X-start-pos + (format-id translated-pattern "$~a-start-pos" pos)] + [$X-end-pos + (format-id translated-pattern "$~a-end-pos" pos)]) + (syntax-case primitive-pattern (id lit token inferred-id) + + ;; When a rule usage is inferred, the value of $X is a syntax object + ;; whose head is the name of the inferred rule . We strip that out, + ;; leaving the residue to be absorbed. + [(inferred-id val reason) + #'(syntax-case $X () + [(inferred-rule-name . rest) + (syntax->list #'rest)])] + [(id val) + ;; at this point, the 'hide property is either #f or "splice" + ;; ('hide value is handled at the top of this conditional + ;; we need to use boolean because a symbol is treated as an identifier. + ;; also we'll separate it into its own property for clarity and test for it in "runtime.rkt" + #`(list (syntax-property $X 'splice-rh-id #,(and (syntax-property primitive-pattern 'hide) #t)))] + [(lit val) + #'(list (atomic-datum->syntax $X $X-start-pos $X-end-pos))] + [(token val) + #'(list (atomic-datum->syntax $X $X-start-pos $X-end-pos))]))))) + + (define whole-rule-loc + (if (empty? translated-patterns) + #'(list (current-source) #f #f #f #f) + (with-syntax ([$1-start-pos (datum->syntax (first translated-patterns) '$1-start-pos)] + [$n-end-pos (format-id (last translated-patterns) "$~a-end-pos" (length translated-patterns))]) + #`(positions->srcloc $1-start-pos $n-end-pos)))) + + ;; move 'hide-or-splice-lhs-id property into function because name is datum-ized + (with-syntax ([(translated-pattern ...) translated-patterns] + [(translated-action ...) translated-actions]) + #`[(translated-pattern ...) + (rule-components->syntax '#,rule-name/false translated-action ... + #:srcloc #,whole-rule-loc + #:hide-or-splice? #,(syntax-property rule-name/false 'hide-or-splice-lhs-id))])) + + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; collect-token-types: (listof rule-syntax) -> (values (listof identifier) (listof identifier)) +;; +;; Given a rule, automatically derive the list of implicit and +;; explicit token types we need to generate. +;; +;; Note: EOF is reserved, and will always be included in the list +;; of explicit token types, though the user is not allow to express it themselves. +(define (rules-collect-token-types rules) + (define-values (implicit explicit) + (for/fold ([implicit '()] + [explicit (list (datum->syntax (first rules) 'EOF))]) + ([r (in-list rules)]) + (rule-collect-token-types r implicit explicit))) + (values (reverse implicit) (reverse explicit))) + +(define (rule-collect-token-types a-rule implicit explicit) + (syntax-case a-rule (rule) + [(rule id a-pattern) + (pattern-collect-implicit-token-types #'a-pattern implicit explicit)])) + +(define (pattern-collect-implicit-token-types a-pattern implicit explicit) + (let loop ([a-pattern a-pattern] + [implicit implicit] + [explicit explicit]) + (syntax-case a-pattern (id lit token choice repeat maybe seq) + [(id val) + (values implicit explicit)] + [(lit val) + (values (cons #'val implicit) explicit)] + [(token val) + (begin + (when (eq? (syntax-e #'val) 'EOF) + (raise-syntax-error #f "Token EOF is reserved and can not be used in a grammar" #'val)) + (values implicit (cons #'val explicit)))] + [(choice vals ...) + (for/fold ([implicit implicit] + [explicit explicit]) + ([v (in-list (syntax->list #'(vals ...)))]) + (loop v implicit explicit))] + [(repeat min val) + (loop #'val implicit explicit)] + [(maybe val) + (loop #'val implicit explicit)] + [(seq vals ...) + (for/fold ([implicit implicit] + [explicit explicit]) + ([v (in-list (syntax->list #'(vals ...)))]) + (loop v implicit explicit))]))) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; rule-id: rule -> identifier-stx +;; Get the binding id of a rule. +(define (rule-id a-rule) + (syntax-case a-rule (rule) + [(rule id a-pattern) + #'id])) + +(define (rule-pattern a-rule) + (syntax-case a-rule (rule) + [(rule id a-pattern) + #'a-pattern])) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; check-all-rules-defined!: (listof rule-stx) -> void +(define (check-all-rules-defined! rules) + (define table (make-free-id-table)) + ;; Pass one: collect all the defined rule names. + (for ([a-rule (in-list rules)]) + (free-id-table-set! table (rule-id a-rule) #t)) + ;; Pass two: check each referenced id, and make sure it's been defined. + (for ([a-rule (in-list rules)]) + (for ([referenced-id (in-list (rule-collect-used-ids a-rule))]) + (unless (free-id-table-ref table referenced-id (lambda () #f)) + (raise-syntax-error #f (format "Rule ~a has no definition" (syntax-e referenced-id)) + referenced-id))))) + +;; check-all-rules-no-duplicates!: (listof rule-stx) -> void +(define (check-all-rules-no-duplicates! rules) + (define table (make-free-id-table)) + ;; Pass one: collect all the defined rule names. + (for ([a-rule (in-list rules)]) + (define maybe-other-rule-id (free-id-table-ref table (rule-id a-rule) (lambda () #f))) + (when maybe-other-rule-id + (raise-syntax-error #f (format "Rule ~a has a duplicate definition" (syntax-e (rule-id a-rule))) + (rule-id a-rule) + #f + (list (rule-id a-rule) maybe-other-rule-id))) + (free-id-table-set! table (rule-id a-rule) (rule-id a-rule)))) + + + +;; rule-collect-used-ids: rule-stx -> (listof identifier) +;; Given a rule, extracts a list of identifiers +(define (rule-collect-used-ids a-rule) + (syntax-case a-rule (rule) + [(rule id a-pattern) + (pattern-collect-used-ids #'a-pattern '())])) + +;; pattern-collect-used-ids: pattern-stx (listof identifier) -> (listof identifier) +;; Returns a flat list of rule identifiers referenced in the pattern. +(define (pattern-collect-used-ids a-pattern acc) + (let loop ([a-pattern a-pattern] + [acc acc]) + (syntax-case a-pattern (id lit token choice repeat maybe seq) + [(id val) + (cons #'val acc)] + [(lit val) + acc] + [(token val) + acc] + [(choice vals ...) + (for/fold ([acc acc]) + ([v (in-list (syntax->list #'(vals ...)))]) + (loop v acc))] + [(repeat min val) + (loop #'val acc)] + [(maybe val) + (loop #'val acc)] + [(seq vals ...) + (for/fold ([acc acc]) + ([v (in-list (syntax->list #'(vals ...)))]) + (loop v acc))]))) + + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; check-all-rules-satisfiable: (listof rule-stx) -> void +;; Does a simple graph traversal / topological sort-like thing to make sure that, for +;; any rule, there's some finite sequence of tokens that +;; satisfies it. If this is not the case, then something horrible +;; has happened, and we need to tell the user about it. +;; +;; NOTE: Assumes all referenced rules have definitions. +(define (check-all-rules-satisfiable! rules) + (define toplevel-rule-table (make-free-id-table)) + (for ([a-rule (in-list rules)]) + (free-id-table-set! toplevel-rule-table + (rule-id a-rule) + (sat:make-and))) + (define leaves '()) + + (define (make-leaf) + (define a-leaf (sat:make-and)) + (set! leaves (cons a-leaf leaves)) + a-leaf) + + (define (process-pattern a-pattern) + (syntax-case a-pattern (id lit token choice repeat maybe seq) + [(id val) + (free-id-table-ref toplevel-rule-table #'val)] + [(lit val) + (make-leaf)] + [(token val) + (make-leaf)] + [(choice vals ...) + (begin + (define an-or-node (sat:make-or)) + (for ([v (in-list (syntax->list #'(vals ...)))]) + (define a-child (process-pattern v)) + (sat:add-child! an-or-node a-child)) + an-or-node)] + [(repeat min val) + (syntax-case #'min () + [0 + (make-leaf)] + [else + (process-pattern #'val)])] + [(maybe val) + (make-leaf)] + [(seq vals ...) + (begin + (define an-and-node (sat:make-and)) + (for ([v (in-list (syntax->list #'(vals ...)))]) + (define a-child (process-pattern v)) + (sat:add-child! an-and-node a-child)) + an-and-node)])) + + (for ([a-rule (in-list rules)]) + (define rule-node (free-id-table-ref toplevel-rule-table (rule-id a-rule))) + (sat:add-child! rule-node (process-pattern (rule-pattern a-rule)))) + + (for ([a-leaf leaves]) + (sat:visit! a-leaf)) + + (for ([a-rule (in-list rules)]) + (define rule-node (free-id-table-ref toplevel-rule-table (rule-id a-rule))) + (unless (sat:node-yes? rule-node) + (raise-syntax-error #f (format "Rule ~a has no finite derivation" (syntax-e (rule-id a-rule))) + (rule-id a-rule))))) diff --git a/brag/brag/codegen/compiled/codegen_rkt.dep b/brag/brag/codegen/compiled/codegen_rkt.dep new file mode 100644 index 0000000..eb3a1d5 --- /dev/null +++ b/brag/brag/codegen/compiled/codegen_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("4c5beaa97680e66117fd170df42efc9b3b073674" . "07aa1cb4610cb4096348a120760d9e4c95390927") (collects #"brag" #"codegen" #"flatten.rkt") (collects #"brag" #"codegen" #"satisfaction.rkt") (collects #"brag" #"rules" #"stx-types.rkt") (collects #"brag" #"support.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"list.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"racket" #"set.rkt") (collects #"racket" #"syntax.rkt") (collects #"syntax" #"id-table.rkt") (collects #"syntax" #"parse.rkt") (collects #"syntax" #"srcloc.rkt")) diff --git a/brag/brag/codegen/compiled/codegen_rkt.zo b/brag/brag/codegen/compiled/codegen_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..b197416c0bcafd266068f6de18dd0b2b1a517672 GIT binary patch literal 35832 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 literal 0 HcmV?d00001 diff --git a/brag/brag/codegen/compiled/drracket/errortrace/codegen_rkt.dep b/brag/brag/codegen/compiled/drracket/errortrace/codegen_rkt.dep new file mode 100644 index 0000000..4bd6851 --- /dev/null +++ b/brag/brag/codegen/compiled/drracket/errortrace/codegen_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("4c5beaa97680e66117fd170df42efc9b3b073674" . "99da3e7cc99d3a0b7dda6934254dd845b69099ec") (collects #"brag" #"codegen" #"flatten.rkt") (collects #"brag" #"codegen" #"satisfaction.rkt") (collects #"brag" #"rules" #"stx-types.rkt") (collects #"brag" #"support.rkt") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"list.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"racket" #"set.rkt") (collects #"racket" #"syntax.rkt") (collects #"syntax" #"id-table.rkt") (collects #"syntax" #"parse.rkt") (collects #"syntax" #"srcloc.rkt")) diff --git a/brag/brag/codegen/compiled/drracket/errortrace/codegen_rkt.zo b/brag/brag/codegen/compiled/drracket/errortrace/codegen_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..21d4b0bacc523ca1913c4ac295cd2bfb2af4c5dd GIT binary patch literal 41766 zcmc(|34Bz?kv~4ubG0|f0Et&gT3D5|E=zR#|*;3yZhN+Vn*+E zRdrWaS5;S6_j_;P>z;~&s)C||l99}2v-QNk9`&s)QyZtvjD&-cnJw*&&Ec^q?Qq*{ z<@l@r@29wbY^#1}vkf#Vdh$y4@>d^t@9{r;Gwpw``Hv4yj2bv<+Qm#@+HE#&>t`Ea z%dr*MN^BLj`)uQFjkcM#WwuSW@7TU?`;qOZwx8Sn-u63NqCMHJ+3&NDvj5!iYsX8@ z|K(im9PP5%2BB4l-PPClM`qTy z>%|_=)Ygc8)3awd5^0UJqrPzP#qcaDPq+6q3k%K5U{m81Z&r7YKg;LxXZ3LAX7`-L zdS&&p`LmOK4nMoMmN^*9x|grY>0rHmPL|;JGrPP@q)VSIyLSh>w}W+ODcLC_&#Zp-?ZD})aJaZkcX#jJ+=_9J)=v*Nhh?wOln&** zxiMOQTXABdl#Bv&_Ww>C@(PcvA0ur1OEU2d6HquONMEERb?&7rogDhW4F39Hey zpx<*3sg6|-Vt_5Jk>+41(%3G>pLs06eyEwW+mbX7l|l_0ez(DnxD5BH>VbIKooxee@zpM3oW!v@lD3 z2y&STa>%B!g{3~&5`H-tYHMqng_@1)AY@vPdhVr?+lG*(jN`IlQG4SJ3C zK0vIgZ*6J{*S9yewgjg(qUp9!`*c*^D-I@$vr{KQ6+0Mbo~$&s0V?Xsp zGN+@1Ww4&8&zpm)eYTz*KGu=wbKnniF(>_Tlh45g{b6o-0iVQN9Uy}@NlI#iolOZv zg_WhdeLg7YOBlaGqin45N>t#5KvJR|K)A^;&xC}8Rk;btudZTtzt8UV*^*PcSAjiI1Kf@iTzeA|@T2w5 z9pB;iD^y1YyT{(Mv8Ay+*dC6y!%@Bzj)bO#1D*B^miVCIkaIh20y72)YB;skd!6}g zIRU@VM*pD!pN;g`yc=D+KJqkzd8TY1}`Q%F&&}nYBCyb8*O{iR%ffXMQw9!TWkkx7i}Ng zerWs5_K%p5zOen-#_c)w(e~%yK$5qFBj!zsvcKog5caA?e z{^apHPzMZn(JEV>Tqpy?Q)%WU3cAZ{lN7T z*Kb{aaDD0WxbJbNyYt-H*7(yI*k6cCU9IbzgAbaDVLn#QjtEKe~V8 z{-Zm=)7z8nDfNu?Jm+cmyyjWq+2z^qIqEs%x#+p#x#sy>&+k1Rp2Y9rDLjJ*c@_T# ze}>ocdcKCg$@lWN_nBt4z>lji+o$<*ePzBOzR|vkzB*r{?_0jbz7@WWzN5bLzK?ys_x;6}&?CRcgFUA7 znB8M@k3&7K^!S?|f9&Dw8R$8(XKl}ydoJ&}w&%8-g3u_9;7fvmFt#EGP_QKR&v#`0?T? z#RVk~l{{DStCGKz_)0gHhRR+pTVA%U?4QcMDC=IHRbE{_u6%NNpNi6ou@#S19Iv=m z@j=C}D*jyIs?4nPR}Qb7RQXEfn#u!}rz@{i{!Qf{D}7bjRmD|9szy}RR)wo(S1qjC zRdt}Mv+9>sUsT;&omX8^J*@iq>X)n6RUfUsP~BO5qxv`1o|-{5BWj+nnN}02Sy{88 z=1k2GYyP?BPc>|CkHLKg_a8ic@PWa996W5uGec$#360q`<`-jrJ?0N%vc}pT`L}U@ z9{0k;|98?;wJYjQO->EX4UM0EY5JkY%`e=1abMHGX5O;2tzyQ+$o|OZk)OWuz^pB^ zGG5*J>M!QJHTUG)1M@D-pR%B2k7UhQr!$W?T`y>AjJA8nD2E;mx2Lm2Z~DXfy@-WyFXz(2Xr#WWwH|S4@)S5%M5Sn| zkbc(`o4 zkyz2}$;7D;R`9-Aq567pY0tu3k4U8j^M?oxf{o2oATjFm z@+u~2DDAz>B}7fArKPnUjHSE3_R8ZCvl?2dm|;~{u?XYT0+ga2v4}NBFQp({m5XSp zES;6Ga(l0aQ2Wg0;C;GAPY<<)M~0i*+GpJ#ANw%WVJ@PoM>V!!WfW~6F|{!gZGRB9 z61os5_3#J+l(DF+1)M}eP0?XRHO0f5 zLQ&IVU}Uh9))w#Z>ETFtcmoJVO^bw@n?sQib*Q~~gou(yVUaPjF%q`-ni4^yFp&uK zw6!T(*c5(6AeM}xMMz^qc!U5y)*O0~*3Kf8nPN%P6_OZsg1sD0+0X z9E)Ihq`VjtZ4X7HZHgwUM~Xfd*^?t-*d>;M4Or^xC=bUBs6;IuJ7Z=j+9<0Vh6UW% zC&!EmKKR72M;{&bghVMFJ+no^<$a0#QzrkE%Rd#$(J3w0m*M14%~d;l+OlGYjzvgM zqs=4>%W5_95SIUlP2o=e@GV6MLIl1ka_GpskTHX7M<~TQw+m^+038u%^cL5dsGm zF%`WQj&yj-%%-NXN)%+-6xu7O(B76%b6Cv{(g@XDL+eAVW7}sv6eS*^>(k+v?a86` z*5<}~DHPrI$F;Ra8_CL|C=nBzJw;Sr-`d>P+5({xKn#b|EfK6;kaL*5r=?fQ?uSz? zBkQNPf`O5da2poCBbr0Ari6z@!!w3K_np0!u`1(?1m)V7v@O<-X=ZXJ$77RP49CzF z+#eZ@>mUv6$dIt>M=);4B@pAyQ(BwcoXY`tJ!J0-0?I)ZT6}g*RaH%K@d#o#I{fA7 z;g;bv6}yAMC#Q!qmB-0!Xbnd*;m$MR-NKTM1>EcE76MnHHA;XNkt2r zrxZ?WL>5dX!{i?|MMw2weVHl~VL>gl_>FFprH%DVsMU{<| zf9*ZNd^42sC6R=n$s;-p0=4(Um=)?BLyu@Ct0}E0t0^lQ7M^kcxZB8vPlvOAAZy}- zq$3D$5L#qSRNfN$J_a}FV-S~aha>Ct&@j5{)(uxC5++W%S9td1+cmtnY$SQI;_|UZ zGsVSYjO*$yX(}a6Rad~0A^|KZ9vxD?!QSikW}^>f6`O31$!gJgd{m4v3A=DACe*O~ zUJ?T`E5++!^4r6!VNHjhRpghzY9uyTeg+o&xqOe@tp?@P$@)Art6eQ52l!C*otqbT8LJc**r%!Ke zYS6}nT1f6K2wq2FEU9cPiYNg_Wf<1hwk8N!E>xsc9;PY?8k`l5-v6K+Ox(INGp&q6 zDoArTwuiyCNJ+tWk0H{R8sW&buS~vVFLLTxFp&&%GZ&Ip$ceexVkcYf%wFv5U`w2A zsWWSdv!_3MsdExr=FD2=bojHEJCVy;;S~8RewD3q`q?^X4tvYVm_K`k)8|292MSlC za4!n8I-K{4R9uIwbEOlRHO{Zf%=k(at`ZHca=L-WV!&CeoxQf8aE+ireinIkdCjlp z7&j{6E&!B)){!U$tzT0XS--x=ay`g$?Xz5G`#b!sr$K_;9WwpKZ3^A?L27>hbFz(2 z)|YIuc^^pin9{plx@el+?SKtDMaqHWHV%#QqCE(=&n zcdF7nHjoIi=qKL-->u-m>@{dxwZGPxy%u-tgpAiYog~h+7IDgJB~Edp#3`Yj^pi?IY4np$KNb7)A_aTcPsnoY~ue@}`q*cV@lm^jwbz+UTSEKf00|Wr*N{z)P&ixm zK2)(6|6rc`o!R?w1=E9}zU6cg>3$2TxHd_9`j9bZFntdz;PYL@eAmx;A1~T3Oe9cW z9kd#tRlnvLCa9kdTI??7H-`_$24R{BP1T{tSTR5O(qIY6J|YtAF6JQD0uR%(gCV8O zPz>HDk>Hm*sogZ4e7&=nU+m;rX3gn3=m1#Sa?8qXh7MXqR9CH_{yJzEsE+^Z5VO8a z9dZstTYp+$LNpz636KjvE7c*SSyEy{iup=jCd+fP&%%MKt_TG=C*0;a^lOLcR1Q0f zox%%NEa-*6qCN-M1!pc@4Ak3QOx?J|`|1rlpvY>dE<>#Qzg1~M@-1ycn?$X-*_TPd z;h6PZ4zMS^x!h7pC~7^`>cNuI}dmvBP~^m|j} z1{Y89LHuCp(3tin@PT|!S!@>;G6-eKM4l3Zxs36L`PxZ=?A0zI&1cH_{0hFqnY~8d zFK0Z!x7PA??(DU)WMV1bQ_fdVgBuFL^Fw-PCYJHN<@u6BpJR0Zu!nWnGZlP6h1t(X zjB*lTMU76x9tD7b6)6f_8HkE69dj~J9@BxL3jW4mv-WXDIci@r*kFl`*8x)i*f&@y zFlu^S2h;_X*c_=?STruf$fMg71yCUIc?5gRsEmeHO zh+>_V)DFwrb^{9Tc8>_?U^amO#9a$d^zBW6jt)}Be*}du(_Nc9nQz=^~OkKMg@O!lqr#C^onK-<$Fi*6rBcq%3zt& zTslsqiZ35sq@%3LMPHsZVCeS7(TY1EQudq4KR7mQVnnuTfn(ik->fs5w}K*EpkRK8&}pJ&X8MnSBEB9(mEXueV@q+acea=vX8 zpY76n2*K(3Lb>YI5nr$1>&F=?OJiyn#_QOH+dIxQj7bI!FXU&(DN`~F)A^op`b;Op zre}RbPDIE179>Aj&0uKFsPtQCZS#1;KEVkwQ>&BBW`p^u@rHsuY$g?J8XHWcq5RBv z)f=<0hMyd77#}$c!%fXWts5RU8Wnm_rxPwpZ=juT0_+r>8@>#%mG2igCGFD3|;VZFON(b?!PsgabX_D~q zgZRRUhR9ew(UEE?2sZ*Jqaaqbz)L!x`!ugJ*c6hcDi*LI{NejF~c)q%1P(@o;UQLs0@n&u#{hVK1MqY5dt`zFP&u8IZf{#Aj9~QN#(kj^n0DN zm|+6&alUy{*TV$hvwZiYE`|w^=lR}Aal@qWP78D&ZHO=W!FvGD!B# z=lPRXZVk7!9KeOO20uby8}$k?J@?^DY7GxGNt)0L7I+3Sok5NxNG46@r zm|>5Nd}NdnRRHrozP>(A+$co@^?FPWi8P~XjHTXy8Lh?k6y@o>qn7V>d!7@^D+@sy zUs22Vy7ducEd(Qb2T=-NT+8R&W5HG>@zs-x^11iK7SCZdeEsA6jM5Ihmf5VDpBT@# zq{i{`EzD};`5d*5)3IMK=j+Dt3#wF3%|?K3_LpOa07phoaAG1^cATWbu19wJMs?DZ7SZg9~mvx9AP zu}vS$wU39)H!pd3HJg*hW+UQEk&EDji#5TLKHoI`bbBoJJcDej)t1E|X zca2i}sQ#?2F8ewxxwpAcS3A-kQFT4ja{ZEdon9+8$1qoinqQ^Nio#dr*nta84O`1` z`Yhbk)YujcN5!UXglK%d+5PNImpvJqqV>~*5}`3F_s9SkA@;g(!7B0d7|s-iBW*$2 zZbJsVemcq?Qf2!6BkDeCU?2m3+omlDA2qjdk$7%xqeepbQ3oP|v^Nz9pdfo2#J`n9 zpZ%r_7C^UA7RlP~VrwC=9VD=sIL!wEi0hZk>vZfK$QVF&*$Q#H)v4BqS<2e!8bkXs z+S%b+L+#|SmpjC7_6{_RMmN!NHUzbpq3ii`Ft)9g#-zx4>44_}SXgC5Pxf?i8bjZ7 z5Rz&MVJ}l2&(Ntb_3(pLJYA|F8cNh5wSc@?ZLAD1`_j&U+Dg%p>M*U$t}&2UZxb+( zFRd}SVIC7u#5dNciN-8U;a95pAZ0%5A#GzFFG8Oe5LRA%K$#*$LWXKtU}${5Wr6Vu zRZE_!g%iM7LaAHX2r8j~!ie5y!q|_FHKO;J24?aB{M1-8TAHOdAOS`L>ei6ut0rC= zKQfl*>iwMw|3UW#E0_-{`241hu!!dCwHQVLQ9I-h+0wm^Zd}WU57&ehWY7d4Zh5% z6_9EC?6Yy(147imMZuLJcn-y$1TxN>gStdsLW;gS|V9K z)ff);x?UL|g?#N)!*0-+y|37(!LB!sz(;8ZQG{G{TtKH&>7(=5}v!5u&&`L1b3 zNWqL1FCdTc!_(qLisD?pa2k&bb-5?WpFrviu)S)BO4H=mo0;G&zm>xIC zDE0Hh)Afa)-VX>Zn{Nv9!wxmG3q_-rzNMpV5G^&DqBD95NFhJn7&i_mMN5r_y+EK3 ziRmhgNdz*~>)lB8?t8)TOBiBmcQ&&iRPr+~lYGJgFTcEPE5}>}oLvnM7nZ^(HlSu*Ga@uF(`g+5AF_a>)8nyop%uK#QRQ z6Xf>QanAD?&`((hP#16#%d~<8e ziqsfz01NnmR&&5(8Ytt(^af0Zamx9v);K*tH5q(UtFBcR^t`DuN& zR2uyzYLZtkfmi`|Bq_EQcPg$JN*(#!vypfRDqAtS;n(1R+U{KJO<%ORb>C0NRtMgO*uA4*|40ho?!Z6seO?% z#!^#9RQiy0&ecuIlC2;%EwVmGvKFF4V<~*&H?b2WcixD<4q&Tnq+>AOH_r@V*-8Vn z2%ydLm7NpSDg(3xpm__G@eydX0a^yo#f2)kAkZ2Ew9YYv&sm|ApFoB{HaPeIzN~}i z#FTEL(gmw{?9Sd6DqXmS7g_paHowz>+3~<8)qeIow~)au2aId;X8tDdpR@DDhZI)A`~pJXN<|RLRyG)$O6`-q>nHLIgDur~u~ij;#haW?O&+`KqmP zZ7KY?*a)TRe9l(2jcws8jW625#~F^!$aySq%bW+B=ceH_b!{(=%}Je~n4v!CK;(ON zH!sOvB1a4bnSAwb{ZH2 zeS5izQ;BKQ@{bVH=l3bo&t55+K1xjQ+J8IK0HpG5`|rRspc>!3KaOeCshAd5g6Wlp zq>ZLxnMQFxzIDHa=_#ni*zr5*DCPSP7;Mm*&|EE?bX4;r2jZr)la4BW_<)f%G?wls z$^E=@z%VK+U=W{uuuDJ=pW8Jck1x;x`ly_Al<<8A^jMpuZ@9@*4s7@wJ;4km z|G)Gwe>{7g9E~%MGJfa?&jS|C^_vYPIpZkjhmWXn1w^O#59i6L zY&>2Q!@>mzRzmAf#PW5~foSmP$%+`vOAaJAuAC~5DSXF)W!4*KcvbdR*@L$o1^mPb zzLd_gkV~TtYX+Ef-dl_gU33)jH7E5|ah#E(eT^SFX&O0cl9&z@q*@obelNR=_Ke)q zMMoiDeUcw=n5e2CR{acyl{=*F(eV|L_IewYoIIhgpR>10^S~Bo5kK;Q zG8B@O=@YjBwBy4rV~*_r?fl3RbL=ph+yl_ukJY@DeZ(!KzTb%;tK<7BfYk?t9TAg~ zI9enxcN*0kKsC#LpsFE)T?Xh7KubTdG``ya9RXjKzbcNyIp!F#${lf_?xf7*y94mzuk^uj=&LD5nuH0U5>ypfKL2-mm_cjpcP+Q zgkX-qDS(cAsgJ-Mj~Ib7E(l@qpW}rv$72kJyfjDP9I840=PpO!0ze1;VrkqQfr|j$ zy!Qc{O&^4Xvi*0c{hKWS#Ivx_WC54vIG7UJ=tiAGN7`&%3TZPz=K|WLoVF75EkG^Y znxcA>px*;jmsW@5cBdPj@#e@;w{zQJaw{)Qf$gQregYa@W@cY3%1cP~qht6nrFVp& zO90iSw_fsdT=4T}0OF;$-sES!=kwm4({Fy-JYx*{$A<++nVUh4q9a4D5u);>sar!d}|LDI0-Y1u@ z_VT^cQa|s#+X>e4{k$gS2HKz@2?Q{r6KZeu_TVm<7oc&at9-g5j9@U3@-DrOAy|M5 z;^?Z~>rG3!3M$-7CCHZ}wH}R!6iaA0Z3sV_#QWUpeb6bG4@xX624bB{NkyNJUs+g4 zQY*~iHMl7jH^sT&^L_h-kRTRK)S+*+tO^~S%)W^YP<8^hud$OP4m6liz&CW`$61<5 zA+ZTo#i*w?ZMMPR|+~gW`dhKc8X1^oy1NvA=5Ju z=UMza$Jlu`IrfpUGRWIYGKW%~2F`ip@Rq!sPszuV#C>Dz3xD8-P##mq^@!QkvyOe0dtzfLl5^kn(|Itkmcd`L3b0>^{-I$?Ou5Yp_H+oWTP?s~jrPDh&=)qcxD@xeT6xR;$tK z9%sr2s`F*HHT@28c^{_VOwn|?YFhEAH!ZOS^V6B4Y;V!;AR-0ep?4OIcWn=R)L%g=34WU@$+4L=sgHC#Bn|X~KaL z$5nuiyfc7bWS{qz4yRfdvgBGetmY~)(!()5%pb^`AoRhcyo2F+0x2KK3B{n+dpHu< zn+6F%0h@;ChQt(ds$;Vq;aWBan=OvoS|-z!Z_uSkW|Ht~Av|JRl*;VqQU(N>BV9t5 z$fQcg4~qt-F$vVMxejgkhl->7kkSy6(hzGkK)40_A0-Vwj!pTlQ3X#aQg!eYy%Ot?n(T_Io){{g z3!s|%62Fw>0>d904D&w4dVPJUzFIcDmW`<$r$6&9pNqtU!uDjGlTnZOi|6j>;b8K5 zPh!859y8EIz*9@m=}+x&p4jUU;R8=A74gGZa)(M%yl)xMerDeHE0^~)P4j-3r*Dw+ z83sI~OL%_+-aig5G>K=( zu@Q>ez#f`{=MNrvSVlhT5pJBf=>?^o4AmWn6Jd|n;UNDvNYN?ud0Z&1gKT$Bd6(_fa=7wfFrej@q`5p{6J}-e`kt%KqW-|Sq|Q3$OvHo?-P)>_SAm7 z_oS4c+f#mQPx+BOV_^jK#u#0#1(Cvj#Q| zM>?BvZm*TKecro15_i#Ujvi9m>#)!?>wL&}d>@blgbRhIEnETBrh5GCc< zDH0{05>7+Pr!1fTe8TcXeM5Q8t==v0B7Ph3D353iXJPWdd0 z-rbn;6MM?{?QjIJP=sPKNF{CP&-+rmMt^}mHRZE`0v$5=UOYN9m?$z7MFui^H4~<# zd^SK(d}@bj#Wes5xnMwuC7Ve{-mzxF^pwvuK?FHN$gx~WB1ELrSel|s!&S|M#+1)8 z1s%o&<8uc(#I;14sz_7OIFbHRjOLBMM%GV}^+QK%CWK&nilM7^iXpvho&zC0OsV(y zYoGT%mB996D9$Ed_ok*@#Y*6MQfk_}w|YN$y)!lK8vefj9#&c7uYHLqB`5H~hiTV= z^M2Cx@1}j;dx7&>fa-bn-2~j7N&uu&)OIfUT~zgKJZLW(B9IsECBXXyIW@Yh~N3-yHC?z*juxBE-3POM&P|p%hHRMA!9>$C!u=TPeN@-K3`04 zEMlNv;9v`pYJ+`>)yX11zij$^XwLB6s5yCCvt7q{R>Oe&xIk|S? zT7OQdkLB^3wg+rBpGUl+;I`LF6j$M$Hf4gooNt)L2Pgi$$KllWd(dMsoFe4Dt+g|> zar`RJFjiw~IfK=h&JcD!)A+GhE5MLifnk+H># zA@(fUA}G&v2*RQ63;0>Ey7-&CK_6yH5!Apq#I#Zf(O;uks}Q2UMw8aNa?-N)B(}bD z40)^9cn0d5L^k$5t*%R@k1fS|l9t!-u`nX2iAq6Cs3S~a;Dypq3lTBbh|#r}r)X5< zCF*b_1AVGuOVFRE6CfjK@pGi{wQPtv$<(rWGN3Ksa~whb_8h*~BNv}4yFnG8|8F3( zz4#4I>YIb*=QWmqq=;#I^{U<_P#YwzkU(9E#No(k?>iDEmx8R0u|&i(>j*B>PZch1-rKLgdZebj-3`u-; zWj?Y4IexEjBp)+e=inOo&yVfM8stLpk@-paK30vMchf*YKD^k=mN`CS3EDvq5$8d* z5t*lahf#3!u^kP3fZGol+DWwJVkWaQa5Bpsb+iM%g8UBaFn&Wgc|nWBI(PvTu98;1 z+CiS6maU;%krrGbN~H0x#RlQ2Wqfa{bV(}V(`5tD$F)%GbIW)+#T3FdsRWFL8G(g> z@zOG$`+4uflw|;m_)q%RcPWAlV((Bo7}cKQc{1^geW$e!whkRw4L>Fe*2{u5M!^Q^ z47o%IA=V$pJ2>eeyIArT@b&1;#ufZZUwzssLb6HnB`lE=Uv*d}ZzQJhcaxCxT1V}q z5qSQoxB^Vlco^xh&5jV;LO3b~rabUuw%I{-Y$BfHlVSZ5kdEPlkPf5&K~K>6TfLu8 z`MI$+EygB+WU5#$NF-BR6;s;;Q|oo6s=p3XsAJomn5r?E`W|EJ1yjE;m@2_(63LXv zhUt=eQ!%w&FttH3RZ{YGm_i-f@5Iz#ld139*#^PXFJIFl!RXjs>%7=>q7{N#=BWH~R~^Igp%lJ(zv`Ii6&C*J*kIYQ!Psd0s*XYb^n8aU z>X7@Gn7wJ&&VvaY0;5f^_w9+~>8r5P2~gSx*$HGde#|I&@>81dZ_(8!*av;bfkaUb zUYn8tGJT&z>~c=Vv3M*ckj;f^<3QjJL;<(0Kx*-1l<-uu9eMoXY`kI{^2aj>D$-E_ zk)X!t&ZdJzo9FNpTJb^mWTYXGXjcV+1SUT0s_aCI6m1B)S}{2f&xwmgguhhrh#rZ= zS=3R)40w+ud zyU@$2G!d}fDsIBefb&#BrYA_IZ}Dv|=?GNVNVP$hCvfKH%3GZDJrC=*PD-5xu$MNu(z z3JR<*=IRplR_s`RQV5_{DhiyDL8}_^}Kl*#;e+!XVbNZFCv)hDrH; z(kRVH3Ue~s0<{u*qd*r5b>5N7k00a9-MZ9+99dYbIP`n$!pVEFG)5u>%MPrOkq8kR z|JN+pdrFfCD5XiPP;(G1%+yO}Fgvn6hyq1Vwi+961^jKO`mqyyxuI>vct1dmWy_=l z&*6*hpD)F{V9ck(V&+qtCHDv|-%A>YqiSX1*q>M#{MgR+Iw)lfNBR-DUL(jDE?n;f zWWis7ho};%r7BFq$U?V6Hz-a0K5fE@71xIppA3fz+#_+?WZoTa0dB`Z}S3V zLxbEe&$qxCp^G2V=1q{FV}Wa(*M)P(f>3H->;|*SwZ27)wU2~{+|qvheHOMSVi~Mv z=mdq_@1Bg;(^=YI>dfQwFZ1)5b%d*w+ui}O?JY92Xdn6D=Y>{S9S7~4KaE!)6!2wE zWLYm?<^yi`8{*&r;COq$l`?1|xs4l)O~fdQ3f0tc0NfsQ21$26d zTv47}a|&ktPVBgN?ELgUUQcfS9D z5tPsZ0!fR%qQiKw?yxDOw{XI7|Mz)6p|Iy!7g~Iw3oZWo?VLb6`#$}ucHZuy9U%;n zJe^7_xkHY6Gb4&qcQ`ADlW@C@#a$i4VO}x(uqUy)qY@P;!LHOA4?7UbxS&6%=7?Az zvbWSa5w&)iMA!^_+y6e_dXK44W51q4J#+_!B4wd14RcYHFGG59@T#lasLYL%R}oHC z#NMQwYFQ@tM`$L=x2kjyZ-|qzcRo~FF3TvVE7g^h+2kN7IUv36a#=>P?lnZQI3)N4 zt=zu9pg|gIdTRRdS@UQV9AU7R3+x z9+q)VPdQVS+E$Z~aN+R1`>}lk2Z0$!PY_JTTEyxy_TrH8mXG;0j z5ja$FX^ef8O8XGWoj41<&7BJokr+;HCFRsNJij57vs@@=InM3GDJK@Gq@1OAr$yl7 zl?WwOfr%h1f`#%~a#cl!p_27`Y3t3}X zg6^*T8$R0X?$ckdyA%KKboZQP$4iBIn5{f4tCtZP9S@9g(Y}t z9-`xIC!uQM$m0o;$Z}UHKlLjdwv?F;wIYe76li$#_gB0E3$P$B$)(@C-1jjxW!fgL z%r2?fX0l!rAImTP6P-R6r(xmSVb^*55(`{^R|GPD>g^Fh zt&l1ffY%Y<2qO{+IqZ7Sw0J^Ji~Vr|xsF-ns}5t5faw4_tWq$x4A1K9{|CH+*OF|j z#oNWjvk}W&;ClYAa0G*_wpa$<`ecWQjHWwU%ZVc`l2eMe2>BvR{BF3O%ubU6$Yau! z-d+rb=6%KsFo^lQ2!oi9L6p8i?fHx|2ay5r5y=v;JAJ-P9bJyA6NjwF(IN! z>

X0#_wp{fogM%;kk>Ar~!7sJl&)`VsEiSX|`F<=cMAC#W@Tr;tM~8ZzZ$9UQ$%>sV2kkCCcVmO#nAZ_0ekQnWMsANV5Iof?9W??Tdb-EVm{1YRJl28Y~pKQQN7;{-b}@p!~9R+^QlTBWXzGj`T7MH&4$W%RN|s44A%fqDZ}V#7c4txh_XVN%DCNg732$DUPO zpQZ8Mi08B3{%3yP@g<#W6BVeP;@6mHQy~*3&JV5n9Um*q^qe$PHSgjagwi}RtZu>z^HuXzwxj+CqMJ`=HzGpZ_LS}pK7W# zdz1iS?RDkz#eWo!vE=bmk)^qoV8nse*;~vrmdT+`t+dXQWu1j(?ff&vpLzU>O3Wa) zh%+iwGTR{p-f6#Tx~H$K?lL_{xd0~#?^NR)qegQG?=tK19E~Uz)aNN$7kL+Xxk?;B zL+RH^vmAEi@i)G}S7S|mc<$@z!}E902U@3my)+9l&riJj-d$%`CaH%1>)93ibGc{xrP`EI1Mj5|37%6w2-dz40sMXgJ1X$ z%Tn(4JOgm@`9fhzdY)l&Or9YG{fY~{kZF*i7oM?$VIZ$B&ZDaA*4?BVrYI5pkEROx#3PQy0gQ_e%89e=5W2f+>|`4qSeY>J8JLsZx9Cht(My7u3YcL2j`LqUvN zJi~9(L@OA^gLHC^v1Z5aCIQi)nElTtAnr<4FM-dS0eDwkTf0s?;HmWtezTVF%*5F3 zxd))(aq%YQto8ImI41ot^>&@5U2?HpD8cz-dPs?MwvKey^4P)cc?kGym4^@}`SlYJ z2Qh)q|D3N%fLVFSz`^SZ>_P5Sgk(C zE;(=kiZyPWf8PQMJ^*JYa}&uQ|1jy>V$OR{?bW@HrJ7|Dt!3{xC|!wTO>UC*3_L+! zgVabqpX&&`_r6#&DEo?>BWPsgU#C#2qb4&i|uvhtL!u`;d5gB{ZzLu_d9_FI);9 zmm#UkQNZBsBQ5$DlH!Ycj9!551P*i%PUJSRpoFDtPpE^C{8I2j3Ti`QV7) z50v>#R%Zlbq9AkGeCMp5$Q#m(sS-x-xbcAN&G*Kj165EfOCsFVe=G6>{O0d~Oxd3T zB$(c}B-oIZtYveZY@Sn3%g;wUl$JLtxJ*jo8H>g)sQqa%MJO`Z(Pei9zuBD-VaeND zp4l-T*7*?6(ujv@@bUmEG#|vVJG2EH&)Fg^cnht{6QnrCi>CuIKtN4YL8%h<0w)Ed zI3`D<5yfcMfa5$~Nhg;;h9^ZS@%1iZPzXQq&*W?tLjB~E-w46Khv$Jv6>rH$rzbSX zlM-}HOn-zL;W+|IJU1=QP{cr}Y6{;8-Vg)PkNE4MsMrRADjOjwCKqY=q9gIDd{(IP z4GJ^=x+()1s{98acdg2pO6Q4*wH9AY6}ubfNLoo`D8pg3`MiR%Rl-QrMg#e30~a~c zo7sfyhgB7lv;I&zcBNY;VhO)l3B(~7gCb75&veo*pD&`om^NHHjnKU7jU18Q)Gb;$ z!)3(lHTv+Vc>dw5cSe>AALc>OOQJA0N6fydT35(eK`nOj;bI|(03H~$?A^%mv2LF% z5$lC{VCK%LUA4iXr*^yQ(o#19kge3Ex1g9J#<*=K1)Rv8l+=XeULF1klSLQQcASWx z^cE;^n&-4=5N)c&jJeoKI75xDCXISWZ}he!i5MvC-N4FpXQ-B7qCK(bt7W>yU7-4& zBDE;#;uQHMN1u=EFgK*ZQ6~%y@e+*AFd^#_PfciF*&nMrR;R;Y^_Pf;<;25jrxK*K zPZ(01b4UBI#`o+=tAYv1udZTtzt8UV*^*Pc4^3e7KZg$=bJh;vyTjT+e0Nwo9l3AiU;wzA$(oDF>-&Pvm5T|^F#R3P9)IjG42|0$8}us=K0*tME(9gDhPDC zGVryd%KT28PfcJ|fzIxDtyN#vFM|zo*nH|ePx38K6$M4!>!|KFKv_Xi5Ur-WJ)Y)J zoA^FY^>AF3j4Y`stqGRmNL6YEt6_t4JIAn0YG+8Gvlkl(itgR@Pv{_lASk_TXfBvZ zci(%j1r($=5y-C{dD(rrlI#2Vb%=t#41~Tnwbl#zveA(+u0!qNd;v^KdbzQEI=)Nv ziUdCHm8J}-u6z1$jU2#RmHH_VKL zN8?R3Gwa){iaUpqjO$xlqJ;ye=3`{Ca6h)OA>7j5IJGfMW8$C^8k3fpO-;ZGbb6`h z!vdW-kj2BIrD%A@%y3J6IInXe$!9nl(fLpYOLEw{;afoX3=_V2UtCO52PsOEjMD0Y zqMFVms&8bVGo58X2wralAB>Mg!_>`mH|I3GqRXXYLrwHuQUUc|x8cjm8uMqcQRA9h z8}RzBU`wbu9Gu$t%FH$r85?EKc_|cW3{3$j5}q245R1Y46mqn6W~4q`h)+JD0O|wQ zd=8|}8lEXBt|VU9K$G;6a-lPLR;j;PR#rt=c(HSO2Fo5Tb=fXY z_J&KF>(b`AwD~S=flFKH(iXY2#V&1$OIzyFmbtX$E^UQN>u_l+UD_&_w$7#PbZNU> z+HRM&$EEFcY5QE-ewTL8r5$op9dl{NUD`>PcFLulc4=o_+Ig3D!KJ(=JGwS{hNky~5r)|R@pWo~VSTkCLZtK8aZ zx3_Pe#W+}Z)RcF?UI za%+d(+EKT5%&i@FYbV^=Nw;>|t(|deXWiO4w|3sGU2tn}yS0mM?UGx2$E{s)PaN1N->=6SUF9&Ld~TjbFed$c7UZK+3F=FygWv=tt0rAJ%k(N=r3H6CrPM_cF7 zHh8p+p4@=nXY>1f(re(8>}mKIdj<|lWJ1XX;?)^`mdo;3uoAA$XJ-S*yW)>OCx^&v zek!)n|NVY%l6md3<6XA{#H{A`i}%hwHH8hJcLVNawf5fXZ9*{2mtb@e^;#j?mE6bh z29;WSay$l^4owZ>NR{P{ixjg{s*Dv3@$-e8pLpRv5E|svh)n6}xYZSi=0 z`G`ew{DFkz?mmRNJPR)lapvXu`Rq)*to0!6^Xsq3^ZwGNZS{;_>8F?CDfG;oqCA}5 z>03}xaNGMuDk^Hq==CDQk&#|9kOvY$zfI8N^=1Zr@g3oyzSJ#FvP)o?+pip&NR ze+jSSF_cRzf^>RVf}yTn;O!HPrRvP*4DmV9V#Iry-1dV|Z>w($6 zJfal3YdlOyl!pW*9s<;*%=?3IUU$AEkvD)WNMu=P?=skY^ILpJ1yLOqR2h2j0+l{D znFsS18m$bayu$OkSEhb5ebh>SCNRPR|)FAf2!j^>?8euj-G&I<~hT9XuT&BfFPbYqb)szjoqou~OOybATXlBu``3cd?MWQOvn~5E{MKp5# zL9q)I`~Q`92%Wto+A%pR182|-K6|pkm%eLHY`r7Uv4O73%fR1Z;9Is%iR7{%!TzOA zGBjRmXMaYtLT!zmN20tUD6##hQ<9_wbD2btj=mf~Usm7Z^AibwHYa^4mEB**voSJG z;8y}yY{IOfwcljg-fHybd}g<4a|8jh&Z2>Jxp~q8DK}!94U+<)@K-x6+XLo;7nlqhow$O={ke4N~ZtNa5i1}DHOJ*sPP(F$A1b@Q+590__ Ar~m)} literal 0 HcmV?d00001 diff --git a/brag/brag/codegen/compiled/drracket/errortrace/flatten_rkt.dep b/brag/brag/codegen/compiled/drracket/errortrace/flatten_rkt.dep new file mode 100644 index 0000000..9aafe01 --- /dev/null +++ b/brag/brag/codegen/compiled/drracket/errortrace/flatten_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("b059eb349e1c078ba074168cee5a2e4572b986de" . "01717984ba47cc71328752bd03518d0b6b44a2d3") (collects #"brag" #"rules" #"stx-types.rkt") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt")) diff --git a/brag/brag/codegen/compiled/drracket/errortrace/flatten_rkt.zo b/brag/brag/codegen/compiled/drracket/errortrace/flatten_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..400f6287d185a9f8b997157c46f72358a8d34074 GIT binary patch literal 20646 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 K*A)7i)BguB*hkO+ literal 0 HcmV?d00001 diff --git a/brag/brag/codegen/compiled/drracket/errortrace/reader_rkt.dep b/brag/brag/codegen/compiled/drracket/errortrace/reader_rkt.dep new file mode 100644 index 0000000..da813f3 --- /dev/null +++ b/brag/brag/codegen/compiled/drracket/errortrace/reader_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("c6cf0a3fe7420938bebf4eb428b13c3518d05e1f" . "3c8e76d38cae8cb8b28fc0b56809d12cd07057b1") (collects #"brag" #"rules" #"lexer.rkt") (collects #"brag" #"rules" #"parser.rkt") (collects #"brag" #"rules" #"rule-structs.rkt") (collects #"brag" #"rules" #"stx.rkt") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"s-exp" #"lang" #"reader.rkt") (collects #"syntax" #"module-reader.rkt")) diff --git a/brag/brag/codegen/compiled/drracket/errortrace/reader_rkt.zo b/brag/brag/codegen/compiled/drracket/errortrace/reader_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..03b640fd0ba042d07eace3e2509286bf5c546377 GIT binary patch literal 6452 zcmb6-X>1$kl{0TB@*_vGNJ`>JA}LEY#mgE}vL#!lEy;%t%a&s|Zr!AbC{fZ#Cd@+~ zQnnl{g6#GTT7Y)yHbsD5cF@IM1q%0AY=9tjgD7+oJUzXnyP#$SxLG$!iq* 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 literal 0 HcmV?d00001 diff --git a/brag/brag/codegen/compiled/drracket/errortrace/satisfaction_rkt.dep b/brag/brag/codegen/compiled/drracket/errortrace/satisfaction_rkt.dep new file mode 100644 index 0000000..6bf64c7 --- /dev/null +++ b/brag/brag/codegen/compiled/drracket/errortrace/satisfaction_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("1d63342f72da51ee260ad3d02d1efdc362ebd6a9" . "ea4e78d4bbc9044dd272c26055ba0f85c7a53ea1") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"block.rkt") (collects #"racket" #"main.rkt") (collects #"racket" #"match.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"rackunit" #"main.rkt") (indirect collects #"racket" #"match" #"gen-match.rkt") (indirect collects #"racket" #"match" #"parse.rkt")) diff --git a/brag/brag/codegen/compiled/drracket/errortrace/satisfaction_rkt.zo b/brag/brag/codegen/compiled/drracket/errortrace/satisfaction_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..b6764848cf2ad97cf2d79e906c039ca8fbb40216 GIT binary patch literal 20024 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 literal 0 HcmV?d00001 diff --git a/brag/brag/codegen/compiled/drracket/errortrace/sexp-based-lang_rkt.dep b/brag/brag/codegen/compiled/drracket/errortrace/sexp-based-lang_rkt.dep new file mode 100644 index 0000000..5b913c2 --- /dev/null +++ b/brag/brag/codegen/compiled/drracket/errortrace/sexp-based-lang_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("c1fbef7a4ab4031977d43ba847ea0431155e59da" . "befe7d6ee440444d102cdba29b790478737ce1a8") (collects #"brag" #"codegen" #"codegen.rkt") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt")) diff --git a/brag/brag/codegen/compiled/drracket/errortrace/sexp-based-lang_rkt.zo b/brag/brag/codegen/compiled/drracket/errortrace/sexp-based-lang_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..b28fb2b3c4a4f0b436d981542550a66a3da2dbcb GIT binary patch literal 3164 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 literal 0 HcmV?d00001 diff --git a/brag/brag/codegen/compiled/reader_rkt.dep b/brag/brag/codegen/compiled/reader_rkt.dep new file mode 100644 index 0000000..7f719bd --- /dev/null +++ b/brag/brag/codegen/compiled/reader_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("c6cf0a3fe7420938bebf4eb428b13c3518d05e1f" . "5bf2ed04a6262a72f3bcf3661c660327d949bee1") (collects #"brag" #"rules" #"lexer.rkt") (collects #"brag" #"rules" #"parser.rkt") (collects #"brag" #"rules" #"rule-structs.rkt") (collects #"brag" #"rules" #"stx.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"s-exp" #"lang" #"reader.rkt") (collects #"syntax" #"module-reader.rkt")) diff --git a/brag/brag/codegen/compiled/reader_rkt.zo b/brag/brag/codegen/compiled/reader_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..17f27b18e3574b379fbc680801ad22d29395feaf GIT binary patch literal 3898 zcmdT{T}&L;6~6b(?lM1MhQA%mvcLjncGt}Q@NbO$kOmTLCq_!;q_J@_fq`sUcIoU= zV^^}GR+U<*>aHV8wN&My&O;yi63KmNr8Y`nQEkUI1{3?Gb*!qbRP}|2wgT6xdhX2Z z^4Ca>--_6sd(QptIp==o+?{jVE|>L11|qRY*NZ?1sm4#$L^?HwkVqMN|=QpsDWKx7gOt1@B#h?P;sks2)D9!opMGTrq4x>7vv zKmWCF&8M@*NZX+q!%P`T30#68sKO2wuKhcHbLpdxUZ4NoLfgvY?@nbtc=VU!MHVVa z4N*xC86~fi3GyA1BiG3da*sSDe**YCOW5^8N-zPukO$#jRmGUwL_K3E=Yc= z?9i~~S|)4GPh>OFFuG;dPdQH~x@I!&7HzK)b0&)$v_hXV({qNIO&A##zH-6T=P+R0 zZ%R)_nS`^E*p38akoxQ;$?x%aW-c&GeouM%93GB$^o(K2w8kmYIWzHXJ!?eSj5JcD z;sxfH9*jgHlg6}>if+d=*cBh_ig`vxhD|eVwp@5Oku+KuDT&l{%QU*3)yqOI)R%(eilX%nKm_xQ`%rB z1dkBvqLapyKA+6mb0>F6CyElQhF6^Yu{_V~)5gi-z)EvRK<36}z#}K&;cJEVj@EH# zYi}cJNBekAcB^nG2tfd~{Sdtx%t43j0zp-Q+Cy=BC~XhRw}%yMD0_eh6%OF164Z{4 z92|ny4s{%D6!O^9_p1lusN2GMZ(HG*z*3g zPFaDF^HiUDKXgf(-jOYaJgD5I&%Ea(YjO>O&eI03f!es~{XU1LdSYSa0a%g+c>wB` z_hZf)e@=0XKGvyV@zCh9APAcy*D&t7yicRHxhsyh~ zm&$vLO63l97_!NH;J}fwBALBN=K2mY*LRTl&><5^wPRdGGItYT6B*e>WT!=Bv`A!} z5gFA&Z(QZuJ9!`fo+y`r0`kyN{+B%eqiXR9F9f2vFYPN3j4?ki#l1GgZ24{4xaGYe zC`$moGjH3Ki@DtL{?HAL;NQYjFlB-Io{i{_pydgnfg_f==kU4D`qBSleQ1BPDqx?A zovK_7E)m=!ctj`@fe(b>Kp+g2fx}QGLNy*OyM+yOZuhW3xgOtQl}&&xo0Lt@7^%c1 zqc0MZmR-AbJ=oM2xF)EfwN?vbV2_iyq_bv0n=vj*9yX;I3t1yIsqIBbXiTJy6Z58N zq_S)p8#T>fZHo4;o|;TzkG4#jpkf3Y5REk^BX&C$KT`0adYGxP(Qvfgy@dwUzRa}g zsi};S9k$`!g+_FA%IS3+KhiRWUCxmTt4q|5VmQ8;QjV&;+%#-ZnRg8@rG; zaX)5y!kEM>j1xd#PvI?wJGc*^Ap_XHWwnA2`-L*71`kvsb4v z9pBSRh6~qgzzwd_ZGv?ym?dyQ6;x~NX2Icn8F*yQ7V5w|Y8kPcvT*oIuN-1+rEHzE zPQGFPo8}7=(8lsAzR!!WARfn!g<3-Kopb=?9+m%ri$5+QFoHleSj2^_V~e0lkoytj z=5MqzR18r;3)Mp2xT=QZ5@LAPMXCJtPW~sH^f(YlOkc?o3v7dudh$}~GJtlv5Yu16 zX!x4k0K~jn!Z>|8LVFN;qy&xdetu)iTTf`+t{fD*b6n7m3kIwO_yZXn3e!gGaxjs$ zJM4_HFlV*rlN$4e;K7ph&H;Xd-9w=c?F{17F>8wL72icM>6K#J?p%W&2aX|#SAseS NAc6$tP+?v5{sS+IJcs}Q literal 0 HcmV?d00001 diff --git a/brag/brag/codegen/compiled/runtime_rkt.dep b/brag/brag/codegen/compiled/runtime_rkt.dep new file mode 100644 index 0000000..10cf183 --- /dev/null +++ b/brag/brag/codegen/compiled/runtime_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("4660b139e701bdbadf98bfc66b1e659ffe6393ed" . "720ffc1f361e9b200aaa0b4adcda8e4e07779cb0") (collects #"br-parser-tools" #"lex.rkt") (collects #"brag" #"private" #"internal-support.rkt") (collects #"brag" #"support.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"generator.rkt") (collects #"racket" #"list.rkt") (collects #"racket" #"match.rkt") (collects #"racket" #"runtime-config.rkt") (indirect collects #"racket" #"match" #"gen-match.rkt") (indirect collects #"racket" #"match" #"parse.rkt")) diff --git a/brag/brag/codegen/compiled/runtime_rkt.zo b/brag/brag/codegen/compiled/runtime_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..2f767508b7137389cdfaa8003712d557e48f96a4 GIT binary patch literal 8912 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≷z6OQ72QqfvP@1w+*U}6>luDnQ*=U z7fcG6CUu}@x0p#mYEqDy6zp6cuCB7}MoprGx-UuzgUe0oTE!QXQ1?YCp;jbpKwp#- zuEiJ217`#gA29kkK@Y*o*oBuH8ePTE)ngYb60+Ep5&n986~K+=Gh=5ZBuS$;S&SHd zhhfd3tdCrbu=b^`r;K+9Me)5>f;2MYuAO5k|-!NXJ?tiPm32>&<rEe9_qx?0KZSMePh7vG@vk^5--zzX244(Oz@+Mfu|n_=spYLiNT8L z6u?ruj=4do&7Jr}FR?QuOwW)oJ43>~MVnjDSv_S(!HOrOU<^Bn3xhS-%pRMdZVofe zfNv5sfx`HxFmnu;xq`t&{{o>EETRCOh153lR18szLd>F2ytr?uMX|DH{xn!w4IN8S I_+L=|53+-!e*gdg literal 0 HcmV?d00001 diff --git a/brag/brag/codegen/compiled/sexp-based-lang_rkt.dep b/brag/brag/codegen/compiled/sexp-based-lang_rkt.dep new file mode 100644 index 0000000..8170bc9 --- /dev/null +++ b/brag/brag/codegen/compiled/sexp-based-lang_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("c1fbef7a4ab4031977d43ba847ea0431155e59da" . "58d806ee20049838cb29000eb0b709bf9b999209") (collects #"brag" #"codegen" #"codegen.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt")) diff --git a/brag/brag/codegen/compiled/sexp-based-lang_rkt.zo b/brag/brag/codegen/compiled/sexp-based-lang_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..780ed94b4864d1de65953925f0dacfcc073778ac GIT binary patch literal 1016 zcmZuw&rcIU6rP=Jx80p;M+L3mVocNQwsDs#icsUJ1|e#I!~+LgUD~19wCt|atyE(? zc=84$cr-B*6EFS&o~`1+KY-|g5dQ%$CLTEWwzN>GlbzZ3=6!E|eBYbo^T@b4VP?(C zH!(u!B=i#{*IBYF4bBYSaD022&A@D2Kv7k|bP&6I@YBlfzAOTljt^@M=R(h+CX0*R0LwX)UODpBfj`?2M-(e4}$sS+V2 zx6CTc2|&Q2BuUkkwjJG@Tf3-drb|l|!?SpuaYYzfsymbol (format "%rule~a" n))))) + +(define default-fresh-name + (make-fresh-name)) + + +;; Translates rules to lists of primitive rules. + + +(define (flatten-rules rules #:fresh-name [fresh-name default-fresh-name]) + (define ht (make-hash)) + (apply append (map (lambda (a-rule) (flatten-rule a-rule + #:ht ht + #:fresh-name fresh-name)) + rules))) + + +;; flatten-rule: rule -> (listof primitive-rule) +(define (flatten-rule a-rule + #:fresh-name [fresh-name default-fresh-name] + + ;; ht: (hashtableof pattern-hash-key pat) + #:ht [ht (make-hash)]) + + (let recur ([a-rule a-rule] + [inferred? #f]) + + ;; lift-nonprimitive-pattern: pattern -> (values (listof primitive-rule) pattern) + ;; Turns non-primitive patterns into primitive patterns, and produces a set of + ;; derived rules. + (define (lift-nonprimitive-pattern a-pat) + (cond + [(primitive-pattern? a-pat) + (values '() (linearize-primitive-pattern a-pat))] + [(hash-has-key? ht (pattern->hash-key a-pat)) + (values '() (list (hash-ref ht (pattern->hash-key a-pat))))] + [else + (define head (syntax-case a-pat () [(head rest ...) #'head])) + (define new-name (datum->syntax #f (fresh-name) a-pat)) + (define new-inferred-id (datum->syntax #f `(inferred-id ,new-name ,head) a-pat)) + (hash-set! ht (pattern->hash-key a-pat) new-inferred-id) + (values (recur #`(rule #,new-name #,a-pat) head) + (list new-inferred-id))])) + + (define (lift-nonprimitive-patterns pats) + (define-values (rules patterns) + (for/fold ([inferred-ruless '()] + [patternss '()]) + ([p (in-list pats)]) + (define-values (new-rules new-ps) + (lift-nonprimitive-pattern p)) + (values (cons new-rules inferred-ruless) + (cons new-ps patternss)))) + (values (apply append (reverse rules)) + (apply append (reverse patterns)))) + + (with-syntax ([head (if inferred? #'inferred-prim-rule #'prim-rule)] + [origin (syntax-case a-rule (rule) [(rule name (pat-head rest ...)) #'pat-head])]) + (syntax-case a-rule (rule) + [(rule name pat) + (syntax-case #'pat (id inferred-id lit token choice repeat maybe seq) + + ;; The primitive types stay as they are: + [(id val) + (list #'(head origin name [pat]))] + [(inferred-id val reason) + (list #'(head origin name [pat]))] + [(lit val) + (list #'(head origin name [pat]))] + [(token val) + (list #'(head origin name [pat]))] + + + ;; Everything else might need lifting: + [(choice sub-pat ...) + (begin + (define-values (inferred-ruless/rev new-sub-patss/rev) + (for/fold ([rs '()] [ps '()]) + ([p (syntax->list #'(sub-pat ...))]) + (let-values ([(new-r new-p) + (lift-nonprimitive-pattern p)]) + (values (cons new-r rs) (cons new-p ps))))) + (with-syntax ([((sub-pat ...) ...) (reverse new-sub-patss/rev)]) + (append (list #'(head origin name [sub-pat ...] ...)) + (apply append (reverse inferred-ruless/rev)))))] + + [(repeat min sub-pat) + (begin + (define-values (inferred-rules new-sub-pats) + (lift-nonprimitive-pattern #'sub-pat)) + (with-syntax ([(sub-pat ...) new-sub-pats]) + (cons (cond [(= (syntax-e #'min) 0) + #`(head origin name + [(inferred-id name repeat) sub-pat ...] + [])] + [(= (syntax-e #'min) 1) + #`(head origin name + [(inferred-id name repeat) sub-pat ...] + [sub-pat ...])]) + inferred-rules)))] + + [(maybe sub-pat) + (begin + (define-values (inferred-rules new-sub-pats) + (lift-nonprimitive-pattern #'sub-pat)) + (with-syntax ([(sub-pat ...) new-sub-pats]) + (cons #'(head origin name + [sub-pat ...] + []) + inferred-rules)))] + + [(seq sub-pat ...) + (begin + (define-values (inferred-rules new-sub-pats) + (lift-nonprimitive-patterns (syntax->list #'(sub-pat ...)))) + (with-syntax ([(sub-pat ...) new-sub-pats]) + (cons #'(head origin name [sub-pat ...]) + inferred-rules)))])])))) + + +;; Given a pattern, return a key appropriate for a hash. +;; +;; In the `ragg` days this used `syntax->datum` only. +;; The problem is that with cuts & splices in the mix, it creates ambiguity: +;; e.g., the pattern (/"," foo)* and ("," foo)* differ only in the 'hide syntax property +;; so `syntax->datum` does not capture their differences. +;; That means they produced the same hash key, +;; which meant they produced the same inferred pattern. Which is wrong. +;; So we adjust the key to take account of the 'hide property +;; by "lifting" it into the datum with cons. +;; Then the pattern-inference process treats them separately. +(define (pattern->hash-key a-pat) + (let loop ([x a-pat]) + (let ([maybe-stx-list (syntax->list x)]) + (if maybe-stx-list + (cons (syntax-property x 'hide) (map loop maybe-stx-list)) + (syntax->datum x))))) + + +;; Returns true if the pattern looks primitive +(define (primitive-pattern? a-pat) + (syntax-case a-pat (id lit token choice repeat maybe seq) + [(id val) + #t] + [(lit val) + #t] + [(token val) + #t] + [(choice sub-pat ...) + #f] + [(repeat min val) + #f] + [(maybe sub-pat) + #f] + [(seq sub-pat ...) + (andmap primitive-pattern? (syntax->list #'(sub-pat ...)))])) + + +;; Given a primitive pattern (id, lit, token, and seqs only containing +;; primitive patterns), returns a linear sequence of just id, lits, +;; and tokens. +(define (linearize-primitive-pattern a-pat) + (define (traverse a-pat acc) + (syntax-case a-pat (id inferred-id lit token seq) + [(id val) + (cons a-pat acc)] + [(inferred-id val reason) + (cons a-pat acc)] + [(lit val) + (cons a-pat acc)] + [(token val) + (cons a-pat acc)] + [(seq vals ...) + (foldl traverse acc (syntax->list #'(vals ...)))])) + (reverse (traverse a-pat '()))) + + + +(define-syntax (prim-rule stx) + (raise-syntax-error #f "internal error: should not be macro expanded" stx)) + +(define-syntax (inferred-prim-rule stx) + (raise-syntax-error #f "internal error: should not be macro expanded" stx)) + +(define-syntax (inferred-id stx) + (raise-syntax-error #f "internal error: should not be macro expanded" stx)) diff --git a/brag/brag/codegen/reader.rkt b/brag/brag/codegen/reader.rkt new file mode 100755 index 0000000..6413225 --- /dev/null +++ b/brag/brag/codegen/reader.rkt @@ -0,0 +1,68 @@ +#lang s-exp syntax/module-reader +brag/codegen/sexp-based-lang +#:read my-read +#:read-syntax my-read-syntax +#:info my-get-info +#:whole-body-readers? #t + +(require brag/rules/parser + brag/rules/lexer + brag/rules/stx + brag/rules/rule-structs) + +(define (my-read in) + (syntax->datum (my-read-syntax #f in))) + +(define (my-read-syntax src in) + (define-values (first-line first-column first-position) (port-next-location in)) + (define tokenizer (tokenize in)) + (define rules + (parameterize ([current-parser-error-handler + (lambda (tok-ok? tok-name tok-value start-pos end-pos) + (raise-syntax-error + #f + (format "Error while parsing grammar near: ~a [line=~a, column=~a, position=~a]" + tok-value + (pos-line start-pos) + (pos-col start-pos) + (pos-offset start-pos)) + (datum->syntax #f + (string->symbol (format "~a" tok-value)) + (list src + (pos-line start-pos) + (pos-col start-pos) + (pos-offset start-pos) + (if (and (number? (pos-offset end-pos)) + (number? (pos-offset start-pos))) + (- (pos-offset end-pos) + (pos-offset start-pos)) + #f)))))]) + (grammar-parser tokenizer))) + (define-values (last-line last-column last-position) (port-next-location in)) + (list (rules->stx src rules + #:original-stx (datum->syntax #f 'original-stx + (list src + first-line + first-column + first-position + (if (and (number? last-position) + (number? first-position)) + (- last-position first-position) + #f)))))) + + +;; Extension: we'd like to cooperate with DrRacket and tell +;; it to use the default, textual lexer and color scheme when +;; editing bf programs. +;; +;; See: http://docs.racket-lang.org/guide/language-get-info.html +;; for more details, as well as the documentation in +;; syntax/module-reader. +(define (my-get-info key default default-filter) + (case key + [(color-lexer) + (dynamic-require 'syntax-color/default-lexer + 'default-lexer)] + [else + (default-filter key default)])) + diff --git a/brag/brag/codegen/runtime.rkt b/brag/brag/codegen/runtime.rkt new file mode 100755 index 0000000..5acdaf9 --- /dev/null +++ b/brag/brag/codegen/runtime.rkt @@ -0,0 +1,212 @@ +#lang racket/base + +(require racket/match + racket/list + racket/generator + (prefix-in lex: br-parser-tools/lex) + brag/support + brag/private/internal-support) + + +(provide THE-ERROR-HANDLER + make-permissive-tokenizer + atomic-datum->syntax + positions->srcloc + rule-components->syntax) + + + +;; The level of indirection here is necessary since the yacc grammar wants a +;; function value for the error handler up front. We want to delay that decision +;; till parse time. +(define (THE-ERROR-HANDLER tok-ok? tok-name tok-value start-pos end-pos) + (match (positions->srcloc start-pos end-pos) + [(list src line col offset span) + ((current-parser-error-handler) tok-name + tok-value + offset + line + col + span)])) + + + + +(define no-position (lex:position #f #f #f)) +(define (no-position? p) + (not + (or (lex:position-line p) + (lex:position-col p) + (lex:position-offset p)))) + + +;; make-permissive-tokenizer: (U (sequenceof (U token token-struct eof void)) (-> (U token token-struct eof void))) hash -> (-> position-token) +;; Creates a tokenizer from the given value. +;; FIXME: clean up code. +(define (make-permissive-tokenizer tokenizer token-type-hash) + (define tokenizer-thunk (cond + [(sequence? tokenizer) + (sequence->generator tokenizer)] + [(procedure? tokenizer) + tokenizer])) + + ;; lookup: symbol any pos pos -> position-token + (define (lookup type val start-pos end-pos) + (lex:position-token + ((hash-ref token-type-hash type + (lambda () + ((current-tokenizer-error-handler) (format "~a" type) val + (lex:position-offset start-pos) + (lex:position-line start-pos) + (lex:position-col start-pos) + (and (number? (lex:position-offset start-pos)) + (number? (lex:position-offset end-pos)) + (- (lex:position-offset end-pos) + (lex:position-offset start-pos)))))) + val) + start-pos end-pos)) + + (define (permissive-tokenizer) + (define next-token (tokenizer-thunk)) + (let loop ([next-token next-token]) + (match next-token + [(or (? eof-object?) (? void?)) + (lookup 'EOF eof no-position no-position)] + + [(? symbol?) + (lookup next-token next-token no-position no-position)] + + [(? string?) + (lookup (string->symbol next-token) next-token no-position no-position)] + + [(? char?) + (lookup (string->symbol (string next-token)) next-token no-position no-position)] + + ;; Compatibility + [(? lex:token?) + (loop (token (lex:token-name next-token) + (lex:token-value next-token)))] + + [(token-struct type val offset line column span skip?) + (cond [skip? + ;; skip whitespace, and just tokenize again. + (permissive-tokenizer)] + + [(hash-has-key? token-type-hash type) + (define start-pos (lex:position offset line column)) + ;; try to synthesize a consistent end position. + (define end-pos (lex:position (if (and (number? offset) (number? span)) + (+ offset span) + offset) + line + (if (and (number? column) (number? span)) + (+ column span) + column))) + (lookup type val start-pos end-pos)] + [else + ;; We ran into a token of unrecognized type. Let's raise an appropriate error. + ((current-tokenizer-error-handler) type val + offset line column span)])] + + [(lex:position-token t s e) + (define a-position-token (loop t)) + (lex:position-token (lex:position-token-token a-position-token) + (if (no-position? (lex:position-token-start-pos a-position-token)) + s + (lex:position-token-start-pos a-position-token)) + (if (no-position? (lex:position-token-end-pos a-position-token)) + e + (lex:position-token-end-pos a-position-token)))] + + [(lex:srcloc-token t loc) + (define a-position-token (loop t)) + (lex:position-token (lex:position-token-token a-position-token) + (if (no-position? (lex:position-token-start-pos a-position-token)) + (lex:position (srcloc-position loc) (srcloc-line loc) (srcloc-column loc)) + (lex:position-token-start-pos a-position-token)) + (if (no-position? (lex:position-token-start-pos a-position-token)) + (lex:position (+ (srcloc-position loc) (srcloc-span loc)) #f #f) + (lex:position-token-end-pos a-position-token)))] + + [else + ;; Otherwise, we have no idea how to treat this as a token. + ((current-tokenizer-error-handler) 'unknown-type (format "~a" next-token) + #f #f #f #f)]))) + permissive-tokenizer) + + + +;; positions->srcloc: position position -> (list source line column offset span) +;; Given two positions, returns a srcloc-like structure, where srcloc is the value +;; consumed as the third argument to datum->syntax. +(define (positions->srcloc start-pos end-pos) + (list (current-source) + (lex:position-line start-pos) + (lex:position-col start-pos) + (lex:position-offset start-pos) + (if (and (number? (lex:position-offset end-pos)) + (number? (lex:position-offset start-pos))) + (- (lex:position-offset end-pos) + (lex:position-offset start-pos)) + #f))) + +#| +MB: the next three functions control the parse tree output. +This would be the place to check a syntax property for hiding. +|# +;; We create a syntax using read-syntax; by definition, it should have the +;; original? property set to #t, which we then copy over to syntaxes constructed +;; with atomic-datum->syntax and rule-components->syntax. +(define stx-with-original?-property + (read-syntax #f (open-input-string "meaningless-string"))) + + +;; atomic-datum->syntax: datum position position +;; Helper that does the ugly work in wrapping a datum into a syntax +;; with source location. +(define (atomic-datum->syntax d start-pos end-pos) + (datum->syntax #f d (positions->srcloc start-pos end-pos) stx-with-original?-property)) + + +(define (remove-rule-name component-stx [splice #f]) + ;; when removing a rule name, we apply it as a syntax property to the remaining elements + ;; for possible later usage (aka, why throw away information) + (with-syntax ([(name . subcomponents) component-stx]) + (let ([name-datum (syntax->datum #'name)]) + (if splice + ;; when splicing, returned list is a regular list, with each element having the property. + (map (λ(sc) (syntax-property sc name-datum #'name)) (syntax->list #'subcomponents)) + ;; when hiding, returned list should be a syntaxed list with the property + ;; iow, basically the same as `component-stx`, minus the name + (syntax-property (datum->syntax component-stx #'subcomponents component-stx component-stx) name-datum #'name))))) + + +(define (preprocess-component-lists component-lists) + ; "preprocess" means splicing and rule-name-hiding where indicated + (append* + ;; each `component-list` is a list that's either empty, or has a single component-stx object + ;; inside `component-stx` is a name followed by subcomponents + (for*/list ([component-list (in-list component-lists)] + [component-stx (in-list component-list)]) ; this has the effect of omitting any empty `component-list` + (list + (cond + [(eq? (syntax-property component-stx 'hide-or-splice) 'hide) + (list (remove-rule-name component-stx))] ; hidden version still wrapped in a sublist + [(or (eq? (syntax-property component-stx 'hide-or-splice) 'splice) + (syntax-property component-stx 'splice-rh-id)) + (remove-rule-name component-stx #t)] ; spliced version is lifted out of the sublist + [else (list component-stx)]))))) + + +;; rule-components->syntax: (U symbol false) (listof stx) ... #:srcloc (U #f (list src line column offset span)) -> stx +;; Creates an stx out of the rule name and its components. +;; The location information of the rule spans that of its components. +(define (rule-components->syntax rule-name/false #:srcloc [srcloc #f] #:hide-or-splice? [hide-or-splice #f] . component-lists) + (define new-rule-name (datum->syntax #f rule-name/false srcloc stx-with-original?-property)) + (define new-rule-components (append* (preprocess-component-lists component-lists))) + (define rule-result (cons new-rule-name new-rule-components)) + (define syntaxed-rule-result (datum->syntax #f rule-result srcloc stx-with-original?-property)) + ;; not 'hide-or-splice-lhs-id, because this will now become a (right-hand) component in a different (left-hand) rule + ;; actual splicing happens when the parent rule is processed (with procedure above) + (syntax-property syntaxed-rule-result 'hide-or-splice hide-or-splice)) + diff --git a/brag/brag/codegen/satisfaction.rkt b/brag/brag/codegen/satisfaction.rkt new file mode 100755 index 0000000..07f20ac --- /dev/null +++ b/brag/brag/codegen/satisfaction.rkt @@ -0,0 +1,207 @@ +#lang racket/base + +(provide make-and make-or node? node-val node-yes? visit! add-child!) + +(require racket/match) + +;; I can't get no... satisfaction. +;; +;; A small module to make sure a small constraint system can be satisfied. +;; +;; Small variation on topological sort where we need both AND and OR nodes. + + +(struct node (type val yes? parents count-to-satisfy) #:mutable) +;; or nodes are satisfied if any of the children is satisfied. +;; and nodes are satisfied if all of the children are satisfied. + + +;; visit!: node -> void +;; Visit a node, and marking it if it's all satisfied. Propagate +;; satisfaction to parents as appropriate. +(define visit! + (let () + (define (dec! n) + (set-node-count-to-satisfy! n (max 0 (sub1 (node-count-to-satisfy n)))) + (when (and (not (node-yes? n)) + (= (node-count-to-satisfy n) 0)) + (sat! n))) + + (define (sat! n) + (set-node-yes?! n #t) + (for ([p (in-list (node-parents n))]) + (dec! p))) + + (lambda (n) + (unless (node-yes? n) + (when (= (node-count-to-satisfy n) 0) + (sat! n)))))) + + +;; make-or: X -> node +;; Create an or node +(define (make-or [val #f]) + (node 'or val #f '() 1)) + + +;; make-and: X -> node +;; Create an and node +(define (make-and [val #f]) + (node 'and val #f '() 0)) + + +;; add-child!: node node -> void +;; Attach a child c to the parent node p. +(define (add-child! p c) + (set-node-parents! c (cons p (node-parents c))) + (match p + [(node 'or _ _ _ count-to-satisfy) + (void)] + [(node 'and _ _ _ count-to-satisfy) + (set-node-count-to-satisfy! p (add1 count-to-satisfy))])) + + +(module* test racket + (require (submod "..") + racket/block + rackunit) + + ;; a ::= a + (block + ;; Self-looping "a" and-node should not say yes after visiting. + (define a (make-and 'a)) + (add-child! a a) + (visit! a) + (check-false (node-yes? a))) + + + ;; a ::= a + (block + ;; Self-looping "a" or-node should not say yes after visiting. + (define a (make-or 'a)) + (add-child! a a) + (visit! a) + (check-false (node-yes? a))) + + + ;; This case should never happen in my situation, but we should check. + (block + ;; Empty "a" or-node should not say yes after visiting. + (define a (make-or 'a)) + (visit! a) + (check-false (node-yes? a))) + + + ;; a : TOKEN + (block + ;; Empty "a" and-node SHOULD say yes after visiting. + (define a (make-and 'a)) + (visit! a) + (check-true (node-yes? a))) + + + ;; a : a | b + ;; b : TOKEN + (block + (define a (make-or 'a)) + (add-child! a a) + (define b (make-and 'b)) + (add-child! a b) + (visit! b) + (check-true (node-yes? a)) + (check-true (node-yes? b))) + + ;; a : a b + ;; b : TOKEN + (block + (define a (make-and 'a)) + (define b (make-and 'b)) + (define TOKEN (make-and 'TOKEN)) + (add-child! a a) + (add-child! a b) + (add-child! b TOKEN) + (visit! TOKEN) + (check-false (node-yes? a)) + (check-true (node-yes? b)) + (check-true (node-yes? TOKEN))) + + ;; a : b + ;; b : a + (block + (define a (make-and 'a)) + (define b (make-and 'b)) + (add-child! a b) + (add-child! b a) + (check-false (node-yes? a)) + (check-false (node-yes? b))) + + ;; a : "a" b + ;; b : a | b + (block + (define a (make-and 'a)) + (define b (make-or 'b)) + (define lit (make-and "a")) + (add-child! a lit) + (add-child! a b) + (add-child! b a) + (add-child! b b) + (visit! lit) + (check-false (node-yes? a)) + (check-false (node-yes? b)) + (check-true (node-yes? lit))) + + + ;; x : x y + ;; y : LIT + (block + (define x (make-and "x")) + (define y (make-and "y")) + (define lit (make-and "LIT")) + (add-child! x x) + (add-child! x y) + (add-child! y lit) + (visit! lit) + (check-false (node-yes? x)) + (check-true (node-yes? y)) + (check-true (node-yes? lit))) + + + ;; expr: LPAREN expr RPAREN | ATOM + (block + (define LPAREN (make-and)) + (define RPAREN (make-and)) + (define expr (make-or)) + (define expr-1 (make-and)) + (define expr-2 (make-and)) + (define ATOM (make-and)) + (add-child! expr expr-1) + (add-child! expr expr-2) + (add-child! expr-1 LPAREN) + (add-child! expr-1 expr) + (add-child! expr-1 RPAREN) + (add-child! expr-2 ATOM) + (visit! LPAREN) + (visit! RPAREN) + (visit! ATOM) + (check-true (node-yes? expr))) + + + + ;; expr: LPAREN expr RPAREN + (block + (define LPAREN (make-and)) + (define RPAREN (make-and)) + (define expr (make-or)) + (define expr-1 (make-and)) + (define expr-2 (make-and)) + (define ATOM (make-and)) + (add-child! expr expr-1) + (add-child! expr expr-2) + (add-child! expr-1 LPAREN) + (add-child! expr-1 expr) + (add-child! expr-1 RPAREN) + (visit! LPAREN) + (visit! RPAREN) + (check-false (node-yes? expr))) + + ) diff --git a/brag/brag/codegen/sexp-based-lang.rkt b/brag/brag/codegen/sexp-based-lang.rkt new file mode 100755 index 0000000..305966a --- /dev/null +++ b/brag/brag/codegen/sexp-based-lang.rkt @@ -0,0 +1,96 @@ +#lang racket/base + +;; A language level for automatically generating parsers out of BNF grammars. +;; +;; Danny Yoo (dyoo@hashcollision.org) +;; +;; Intent: make it trivial to generate languages for Racket. At the +;; moment, I find it painful to use br-parser-tools. This library is +;; meant to make it less agonizing. +;; +;; The intended use of this language is as follows: +;; +;;;;; s-exp-grammar.rkt ;;;;;;;;; +;; #lang brag +;; s-exp : "(" s-exp* ")" | ATOM +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +;; What this generates is: +;; +;; * parse: a function that consumes a source and a +;; position-aware lexer, and produces a syntax object. +;; +;; * make-rule-parser: a custom parser given a provided start rule. +;; +;; You'll still need to do a little work, by providing a lexer that +;; defines what the uppercased tokens mean. For example, you can +;; use the br-parser-tools/lex lexer tools: +;; +;; (require brag/support +;; br-parser-tools/lex +;; br-parser-tools/lex-sre) +;; +;; (define tokenize +;; (lexer-src-pos +;; [(:+ alphabetic) +;; (token 'ATOM lexeme)] +;; [whitespace +;; (return-without-pos (tokenize/1 input-port))] +;; [(:or "(" ")") +;; (token lexeme lexeme)])) +;; + +;; However, that should be all you need. The output of an +;; generated grammar is an honest-to-goodness syntax +;; object with source locations, fully-labeled by the rules. +;; +;; (parse (tokenize an-input-port)) +;; +;; + +;; The first rule is treated as the start rule; any successful parse +;; must finish with end-of-file. + + +;; Terminology: +;; + + +;; A rule is a rule identifier, followed by a colon ":", followed by a +;; pattern. + +;; A rule identifier is an identifier that is not in upper case. +;; A rule identifier should follow the Racket rules for identifiers, +;; except that it can't contain * or +. +;; +;; A token is a rule identifier that is all in upper case. + + + +;; A pattern may either be +;; +;; * an implicit sequence of patterns, +;; +;; * a literal string, +;; +;; * a rule identifier, +;; +;; * a quanitifed pattern, either with "*" or "+", +;; +;; * an optional pattern: a pattern surrounded by "[" and "]", or +;; +;; * a grouped sequence: a pattern surrounded by "(" and ")". + + +(require (for-syntax racket/base + "codegen.rkt")) + +(provide rules + (rename-out [#%plain-module-begin #%module-begin]) + #%top-interaction) + +(define-syntax (rules stx) + (rules-codegen #:parser-provider-module 'brag/cfg-parser/cfg-parser ;; 'br-parser-tools/yacc + #:parser-provider-form 'cfg-parser ;; 'parser + stx)) diff --git a/brag/brag/compiled/brag_scrbl.dep b/brag/brag/compiled/brag_scrbl.dep new file mode 100644 index 0000000..10ad5de --- /dev/null +++ b/brag/brag/compiled/brag_scrbl.dep @@ -0,0 +1 @@ +("6.8.0.2" ("a1ff51bb55e2900a1af85794564c48f9416f735f" . "4266080729186b06f505910e27df38b5c56d83a1") (collects #"br-parser-tools" #"lex.rkt") (collects #"brag" #"examples" #"nested-word-list.rkt") (collects #"brag" #"support.rkt") (collects #"file" #"md5.rkt") (collects #"racket" #"date.rkt") (collects #"racket" #"main.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"scribble" #"eval.rkt") (collects #"scribble" #"manual" #"lang" #"reader.rkt") (collects #"scribble" #"manual" #"lang.rkt") (collects #"syntax" #"parse.rkt")) diff --git a/brag/brag/compiled/brag_scrbl.zo b/brag/brag/compiled/brag_scrbl.zo new file mode 100644 index 0000000000000000000000000000000000000000..cd9fab47c8469c3237eec37ed0d6ba160ad086be GIT binary patch literal 129573 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

0_RbVrc^%4aq+yq@ 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 NeD=A6vG)^m{{cIKUcmqW literal 0 HcmV?d00001 diff --git a/brag/brag/compiled/drracket/errortrace/support_rkt.dep b/brag/brag/compiled/drracket/errortrace/support_rkt.dep new file mode 100644 index 0000000..147e31d --- /dev/null +++ b/brag/brag/compiled/drracket/errortrace/support_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("a121c5f796282cd367e872ca5befbeb0e0cdea91" . "8db5334793221f8665b9d8b10f326a02bf883911") (collects #"br-parser-tools" #"lex-sre.rkt") (collects #"br-parser-tools" #"lex.rkt") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"racket" #"string.rkt") (collects #"racket" #"struct.rkt")) diff --git a/brag/brag/compiled/drracket/errortrace/support_rkt.zo b/brag/brag/compiled/drracket/errortrace/support_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..fe53d13cf5786e50973db5132a65b0504d57311c GIT binary patch literal 22400 zcmdUXX?PSzmSE+p%&d@70;wcb33Nb$s7tESi9p3635i39(^tE_MnXpcGE$XXRl;Dq zJzx$S8zaDgF&JZmF<>yZ0UsC)wh_MVp5E@6>E8X?-kI&)p6!|bru*w}da?W1eJ?Vz zDoYaXV}6aXq9WqGc=00Mix)3nMCRm&Y_);ufr>y?GgvGZJN{*NMZ&9kRu4o&{^&qB z-qROq!P-IDVwsA+#(zJ?^2udJ$zqwDAavVjM{ljKXzG4u|Aw=zzdyJc{_*>7{%Rs( z3Kk2qjJHg(cq{=+m8I4)+p^5kV;QjQusm(~%<{LEA6b5E`Kjd}Ex)v+3%P?mX6?aZfu~xKN5`>Das0fM5`vMjH?FA!ZD2V0Sxo!uQ;)e{c+WAW%f zSKO$!*;YlOM!{|mMWe_7(hK?5hBi=rkuWY7)D=zx<*u| zr)x8#0|wn$)@H3{sXk>mMgG`^aJ*xEt1*eZl%SlQ-5ZL>;_FB68I%MQkdeq1$%+yU z-P<3HtQ&=;zDRdxXmx_6`Tfxz)aCH%px!5Bnh4o!eI5Oy5efBmhIHwg(8r7+)iLWq z3NRdr_W3)aJ#j97u$h3lx&5Ii&PHEH7&T-KvNWPsMTtlH{V9;F{JH*UN4PuE2L+3| zBLkhiA^)o0NO+*H9tswR!blLQt&WB|;-M%M2>C{p)`*Bv`_&;RScvm7fX#7kdcsgJ zKODNx-_hUSy8$UD@_wAtE~Jx3H6ug_1xro!nppKZRQdZN(QbpHkdKJLu1Ifhs4LzR z3Hw*|VAuT}@ij<1XBbSYb``8ZRU8Bcwvs}43RSd-RMf+j5VJ+H&4zlS&6=q;GxOei z{WwK_V=*RRs5~B$Inl{TW;2snC4ox|fJ;vsbg~y*Yej=li0h`-2*qGWdWr{0 zXIbonSumKMWyK$mK%^g;Yz}7V2V^aSHVLFbY=+h(BcmVJS!YL#ud*UJD+?8L9m=mf zQP-kdC8|(xLWC7MIU6o{eXZM(m0b7WAQ_B&ZZO;{2D5B#81I2XFBH!+dT|dbS=O{P zoZMVoo@r@myS-_-_wNS5oh2w)mfV7|(~&(+0nLtxTq|j5n5YxH%Ld(U9o1S4V+4Co zxF_z9hhlLwlt0KyE$g+5R?ko%aj~!%L=%3r| z$w=lEQ$7oBEZgOA`_kyg<5Sup?WPtL)lY$R9GpANv>mEZ(M4sk7RfBVE&#Easm;#cCoi*~6}S|qKK{zlp>y&zqZ{#N=2>7S&3k$x-vUXtYT za+%y9FPGcp)pAsRNZu+xDL*ZrkT1wrBsQL(MmR%5HTEwtTkyVJJ9 zw$irR)@$px-Di8qw#Bx~cGz~&_II{_wf)BS2b+~Krm!3~iTPM1o5mX00(J}QV)w8x zTgM(`kFx{p1Utjdu{YSe?7y;~v#*&wtt#!dv<+$d(q2ltp7xJvQu?Iy>h#w1uJn7; zH>V#;Kb`(*`p?q8NoUGrr9qjiELUz3WHe?h&-hM8TSjlj){Gq)yEFD@Je~1u#<7f(8D}ysXMB|L z_Zk0`@rR83%$m$une~~=Gw;f5%k0Qpl^M?L&x~iT&wMa*W9FloJ2LlV9>_eAc|P;4 z%y%y z+kb1fCG3V)=b2*>p{O=q~Zf@?x+(2$HcX@7S?%Le@a(CsP${ou6 zD)*b*yu9+f8F?*vx93Ij9?3hDcOvh6-qpNM^Zp_4f9CyL-tY44jsl0 z^g6aWo^`zGc-Qfjqs&?3tamPS-tJuKTArE2MyrN1uyZE04SuPnpAGH`!jZ{Td;qrg7}eC0PPepvllO~cg1 zQ}3F(dTM;?rl~upelhijQ-3}6#?-3XpVxjk?VqQ;KK--013~AEvokD~UoA>HcP3X( zY2_Of8k=79O`>E``Cp2CED~}$qqwz1W1*-&9*OkE%6miWm7-SNh~j3An}13fojCOU zoTD`J$D$#nKG>r5i*!O!Ax|sBBWpw9p8K(rz7BK(8j-1m{gGG?-`=n=r@KEIUlLj$ z4zB9x=?xM?*e~wL!)maLuHHyjZ0T@7{gPGDNMCu3oPf>{?(CttydoZ1K#cT-{Go97 zT>SH6w+r>ESiB<|pU+dOp3{qdYHNZmDm7whaiS)&YE>*0pA+lv2n$Zlj|mQEM99$r ze8{@j+r$ekS`~Mx7Mj6Aj=4k<8|Vu!O{pVhhM{TP2=)}b*xH`{`qZYxZfZ?@Lw{&V zO0#txy{+bo`uQmMKAN*w(?C~gZ0UyM&)#?CEdsdDkfM~NQ(ZzLXL)zlYBM^c7(%`IC=v`@?ZQ& zu_#G~9zjNPEk-&ZFpC^3!wH@}2Xj@;Rl(|@zuNQ^G`mR7%hUZ7KdN3iA2#=rSW>xo zWxbG_&^BIyixO8(tETo^p#ezIy+{a(^V;yTRYJ2G>)4 zeM2PL7z^E7|Iqw|L%Eo*(xijgO3Rbh0$-UzPD)YhX(_KWb09d31{wyb4bc$tht(%m z+I$00zZ4f#qCe7n6-Q^TBE?sQ+>|;^^HrfBrB<6Sy>C@08U>hOKo!P~0_GG{A)i3z z0qO-67yWRE-Xv!f^u@X%Fvcq64Xe;*D`7CqB$_$h`UM@m{cAcpL-C%jc^zR*kP9e- zl+Zplb@q0I*UlsH`jImsM}O!D_4UU$Xw+lIvm^@I-_h9_4XqRGI$E+Sw!~D0kKy5% z@xaOXh|OIc?dV_A)3u-{+&@6_ipE=dViA;AI3A7kHj@_hg<7>AeYTpY6ylXCoTRW=#c~HB;Tht*)5fF%XaV5jqeO6+Vl&kA=c@MLzgHX4x`b0dnhNakQCfrg${b2Z(lU!?u|XKUjX zWsO%+(wG%#TbO6q@3|Vy7!r*}a4O;(mQaT8ZaS#Bx1+DKyMufPBPgVWgo@hW1xUt) zWOH0&5r3Zdcf`@|b;ROxy3sf{QQ~XFuIE$tsFEFP`F_rG!8Q2A?H}kzyKVr3_;}ve z6UJ7_ZJ%piM^{{M8biPbW>iM33i3XM;*kKt=n3oUGjSxmyJuZbH$Gl&@S~>^5hjns z2=k}$^{A%)Xec(&i?SVwv%>YtadzU^EM;imdYYg)q9c zp*4Yy0_#pnf=al;M6zW~&?~0?P;Xz0K2rZANWms;+3sOT-b5@~YY0>)Q7NHTNCH3ud zmM)vSq^W7q(p%>?Yrq9vk-q+3GMy9Il!=77zU);ViJ(Gc&cYR;{<-EwOS**rZo*mQdnRyE?-8qxij zNBl)%p~_Z$`499HBdz+-X5-o$=v!!%$YW?)MD1y_B2DU!+!v+>O#@+6n&y^f|I*uU zBj+L!!kjHQ`5dEV>p-`f+c^r&g`&+oLKl|-9_pBbYc1CB#U=EqaoJN~jH=f)VytPg zZjBA|)uNZlh#8KKW~&Scceuyl2;)id@c?shT5V;pPPhrE3PB|EQCignE9>SVyXC}Q zeS9g}yfA7BZEo5`5YXQniS#$(4%pBWozw?&_2a<1p}hE~NzIoh*&O}zeFV>7PD#VjlA z5MieXdqmd`9x0Q6$IWDnoIN4Bo)9t0g<09PQyhdr5q60sgJPcBwM$$9yTy{-qSfu% zBVyR=Nzo05MAwrdg}e5O9=IZUVWWg0^Sz>DF9r_xi4LCFLuSvAr7Or^Q`_ z2^Ek_pgc+(lsHof<-;pTXk2RLcz6{nDHdw#vJhUw%A(ZDVmODD6NvCcN>oZFQ8Jm5 z5=y2};-bV&iH8y|B|b_@DXBDZeqQIi3d#snZ34ZagKA)^srGHXwif)pdK%~YAfM}lVosUs5W$`i-L7Z&`gsc1&tY6YM?_pdhee6bkDk?p;i2`TX9Tl_7T*t8Z0x!NGW|g^)WAQ~^ zd{MNQxlUm5Brl#6bIV+(h(FR6TtcpwG_%3&0ZI=|$7zI|!M~S9I4hQ%5yuRA(QM%I z18v#KP*L)-nCW$$MYHjg=z7IO0fmSZUNzOAYtET!P)1mD9{aq2f3Nd? zFNloyi;D-eMI%F1$?Kxc>v{u`-W1_2vE)rLog?8g0&V%oP~&(E|gRy0b>lnyh^si zGt&Uz3N!$ZLV)eN#iv2ML@e6?ZG>5D+tN}EhyUijc=7r204?5-GD8 zfVLy(<&^1~V1RZ&B|CJh-ipRB5g~j6_G?p9RKcDZTTKv^Ap5nEPBPlND%oSXWeI+) zXkxVC)mE}|k}g!&K}`%At>lPHh~hzw;uI5gmnrWyXK~PqgA!T(DQdXBBWp&|DR+pK5kc;DMhYi{F@{xEwUaX}l#~+&7 zQHS{rA7%v~W(6N+MVS{XaVRt!el8DPnW;a0$x~Kerj*r}yKAd#oVOb8Bb}@s#mABn zr}MMn7$i?mj{+GzzIAMqH9rzl+zRpFRC2?kGR~B|Ao*0~c5Rbaz$0?WBeKO^@~AA3 zq1`THXU72@%40~5O7uvC-Se8Pw*gK7JSM|Qo}S|AOFTWz(=$AMnWu+&dX}fJ@bp!l zzQ)sYJU!3T3p{p;ccF7Ki_JWj)E(UBf36|)s=<%9I zPEz2fLC7DDV1!mu5YK=xegtA7;F5y+GAuS>Qd}bid^ojB9``U}GAW2>K`0(ZXjt$j z1^pEe^gBn%!xn=sZ)b#bQd+%=XY@DiBsI{J((W}7d^c@3BK(um^c)E4O`94)p_CTq zQzw5|s3-;X0tgd_6E{bRD1emG;Pp|sF*o30rIZ$LfZ+X>E>goZDJ|awVbZs>)I(4y zP2K{*IlPG;hf2Y_2tv_K@U(bU3ijKhV5dZ}Qm`+9kUN|<#jaA2E{~$tM$9V(@tsln zPKku2U|#{jF}!arER%wEbrj{-(1wN0Qd(`aj$C1SD?ON&g1*Tr6b$FZ6kLGA|tQaJ**KN zsa1xhBT)V@P{Ot$P&@820+gwQQtTIj3KN7PgFBDPuuXP7Ci4|KNZ!g(D0y54 z^44}}-Wom&leb1C3SMIf6R&{qkUEc59|ewpPl;QsNM(ooq(;SqWejAX2ffAW+JRjm z)on8RqWqwM9~~MSH(m;fu8jfurV?zmvRQ0AyEq0>xUZC@Ne9midN81gD4NIk7pK}NbDCeUb zVU!}q`|$O$U1g;{Ecz2D0Ytej5K4ffP_uG`UV}pCd%S6R8MUY&Qo_5+9c|9{1xnvD zQiTwCH6M?c#zV}n)R=FBC$#Ju92AWN(>m50V2?JlCLGI(8;&<~o!8-p;|=@~eus?s zeK@>;ryQ?J@3g|8^@ig%=LZ_X2LkW<8^^{B1$J4nK{4#L;uV?ocuA-yTJIamqzXJ^ zT#v^jQQwd)S?tCl<3)=7mrq_*M%NqnS~2Lo-X9+5?ZqnJkWvg!T7`V=S`Z$fpg9iv zV*{NrJdGWQhuC$z16d^FgLu1jd99|P{%xx+k787rp^F?@vDhjJBN z2T6-?2Jm^knKh!8tVBgYIqQnjTg4u4*24e@zzLv7b9^dl!_pH};(?UjS!{o^9+?^kFX9b%6Y)zepJF$SB z6_a{U^=;Pg8?=#RRM6C+;rakDKboD=I&6cdt#A-~KZJkJpw+g*vuJ;hSUC%A@LUS? zdE$tmI)CkO6q_Bj8bmOM4LH;H2iV>gcGYSyUFNCc%3nq{a%6XWv`>+FydPKaD=lme z8tg!+kGBbEZ4CA}lAB#p5TY$BR>zIbvf9|Jcv|@{A^9|!%9|;NgDm=(gURx91RcKiP$E=#Do3vMTbZKvbQufT!gfMWgpNn@A=(dj` z%ZI_wPAt_=DR8!vd-uao#$H@nn?&SAL+ZFq7GV@`uMxg=Y?RYl0jOp7_ zlCH*1D)J`qu|rE)yH<;Him$)n;UArEZG{7jn;Xr4p1BjmMP^sSEDA&-|E_7|;i2957&D<1aN z)v+?Rg|YEpJN7WF=6I;l=g?ISsGH_xyJdEjeeHNl=48AHo`yGUhf_x5Hh4+fv!+dBM`U&y zne4tW;~dknFDw&QiBXs&X3JQ^=}uq(2gzKcq%K)OPWA`5PXJXHd;es#-V@kpQx6xj$-{e3!rkmt@vIw;*GB1mLZb86^v-Lr^9eNckLj8G zGr{>Waq#hI93-0H_zz7OIsPPk3Og|Y$A2C^0LuMZUzUc=uHKfpcRK;4&udTkggHA$fE{qs=|{V7x;I)3c3U2Ni1 zpR?FG!8zVp;B+{hPP;Rw&^Z>lc4lWd$2uoFOPo{iwQG0b*N(@;Yd-whE?z4muI_q2 z4NK?K5O;`=_|4q+-x~p-@r??g(ToZp-U)y`4DaO`9i%9KL>IKy_tD3n&B)kUu0zt&K1!lt;p0yXG%6q(Ut@fGX@i`3_||=#-do1iJCjXhFHdHZZ*UC0o8ieU z)vN66WR|~d&@&U=@*9rBw)ZApmeHJ-_@*kj8NNjxcB7X)F@@c(e5qcMZ;F3nc6i;oq7B}# zw$JSe^Sk{p(2hn>-}exZ?7JYzc*0IThF0%QjH;25BuqAey)=adaI(?PUDuX8AF6>y zIF;=36z06)ctl3y%(rE7<(Shq^nL*iiIsQ)3f`fN^w)o>UXqFR4~DLpyQdqb-ED2q z3>R^;o=a&P%;Saml+FqD#zL4umKL$uY`dTBNH0vXuQf#A66EILikak)vT+`qI5Q5B zMVzIG^K>N}&ymI>l8{1)dPS_|h;^tY$dL+$QzD)a=N80ybt;-#>aLI|y^j-x;!eNe zD0#2o|59L(!`$S5>w?3IQik3(`pHS=67&By4j+nSR8o!?#e! zv9n&ZdB*H(WVt8PHjlsZf$!?Uy@5Gn?Xd`bbFnF@`12>#;}hF%u2&=8~|A9`n0-9 zf=u;c3C5_KB^ax2ksw>$DuG>nM1mZ3y95>L4heGACnU&IcS_(;2PJT-yCfK=?v|iH z-6KJf`lJLC)V&f+RQE}ss!vHUNj)IJWc6tYO4LIVOi`baz@;9Rz^y(jfk!;1;j68t`}|ckfePh%-pKl@ zKt*sUmxhwB9ajWzHip`op?1O>Hv+*QTF>8Y@(&fj1Y)yTk@+0o8ycTnC{0fMcjjz>F~c5!2TouC)=myG~x#Nv=uAyBO=h^=D+nm?H3m6KLb? z6CTCTT9+19fyV&~@S88F@)#@Gi837|SE9(x_KsyM(Ub6bJoGr=4wk|$_{yrjDt+y^ zJ1vdZ`AcCp*5Mh0yVC2|zqSMLnp6yX@JgC?>p^=L5Z}S#yFjSh{8FIuz942P>N!b0 zFR2$K^>s;oLsH+A)VCz{qNKhpsh1@6vZUYuCTY$DKbFzI(-lJPrYO;4ptNClMuELp zctC-D#f*kiP)HBJP}0`-cdUge{;Cr8^&;`7Tn-6X3I%j#xX z-6E?`$m&j69hB8wGKt4gfK%j|#;(#0{B86EvBt|Dp2K!nm9GSKw~XGG7mpg=7kv6` zFjN!RgLh$M*ek<68TQNYlne)CoQ9`m^$@3;H-c(E#((Fr6-4xzzl`W%S$&oh4RE4C zcD3AK^*%2Z(LGk+u%4p9pcf+F;WCP z_ZY{|JuncIjkdz$##adRk9Z-ANZ=(-!1>n`IL!%Yk1pKC{iPh7;RMG1^&Gs+2^9VH z1kNIXvA9a;qhYyYvj7e3L?4FeFHb-%oeXug7$=q3$utFJ{Hlx>t2`b=GsU|80<)fY z@*l4_wkuGg1l$UKHZ89UCF3hC^J5jpL9Ywr(;YSpE>oQKbKx7un_Z2-`1{1WL;KzLixv%nIQcXz>C8d;~j(Tq$r&;l&Ler0K}SP*mCFwAp=S<5khkN3r<`?PSEw^kY5 zy4O}u4^~b4Qavx{j$erh!Af zRP{Pll}^{IE>P7Q^2ptT_sZipiSc4P&r~z@H;GiDLr(oIs`A#Fsb8d#Pot4bnwn}S zE`R>+GE8mkj^h~~w{pXAH-=9fuPMYf89Nm$$;LfSv2y?@;A1_=87BA8IQ1so=(q4_U7xRR~ftgOZtsw7oUd=|&QECem(j zv(qJPJ!!>N8u2V04?~(2S$Gb;aebDpK8A>`=sImKW5+WHb)yYYncJr+8sb)EiEcOB zD7%p?5C0nBGs51)u{}Dr+l$Dhh%6HF7$iN<%{F`3g)G8-nB(Rf+~S%>WRwf4C)>!V z#U-+mM(~E3Z01e83G&q%d5%o+r#szjcOAPT5$+a_Ta+LlBwR0%^&@7Nn;oxbeT2A` wBTg_7y&BPpggF5*cYvGixs`1J!rjJkOFW%mgU3Yl!qXs~oGi@S=sSh~9|U0m^#A|> literal 0 HcmV?d00001 diff --git a/brag/brag/compiled/info_rkt.dep b/brag/brag/compiled/info_rkt.dep new file mode 100644 index 0000000..9bec892 --- /dev/null +++ b/brag/brag/compiled/info_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("55824d94e193a4c24592968a52c0a9a2cc9533a5" . "a41a5bbd17d5ae17e20ba9ef3e0d4b4c31eacaf5") (collects #"setup" #"infotab" #"lang" #"reader.rkt") (collects #"setup" #"infotab.rkt")) diff --git a/brag/brag/compiled/info_rkt.zo b/brag/brag/compiled/info_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..1e362689f59b7dd5b6289c31b8e496d9ebcb0c9d GIT binary patch literal 1492 zcmZ`(&u`mQ9DncYB(>wLal15GyOzC>QYUTVdO=jBJ*{J_rU+EQKtm|NbMl&cb?jg} zTZ^V1IqZ^Es>GceCng~zG$byRN#nqQKVaPW7hp(8d>uDgIgset-_Q5w`@HYhuXHrA zW~>{gQNKOa%%!(K{pI?X59sE@x%S;BYft`IB!o~xWO9K_krH`>Y?21qA@37TJ|l77UAN@WaF2$x?%Ss7bYv{Wm9=YLdTIyE`zdMr9Vw(I%qh!>vH4?dos|0_=l zr|=?gVntn5&zu_#anKX3P_$VfTAtfx-0$?e!VOvIF-tJcdcM~Z?Y=KqxW`e=_eH?4 z#KnfuL{9pM6T%UvQwqpQuU7sn{6uFgJfRFW zF@=3mkIPE#^JAd8MpcdEE@#&jh<=i$K_U%FbSut*T)YfQaURme1yGBxK&E&FCrDB7 zQDo(vfv%q=k=`fvxBp43LYE| z$HEdF+r>;nLq8A(+qUls7u((OdAG}boFH~%>z$ib7HudRf_A@!jmLT5ejxmK7&`H8 zP#$^O}Oe{EbLw>+K>n=`L!0y}O9z!Y)3%tJH63p>h=;*ly@?ReES5R6RokYDZ z4tTfch+s9aqjwE28BuHd{61bbt7D@h!ch1%JGxvjzB-K0&3yvdJ16pDxh_}ftYH}E z@2|*pV8%djO2x&H&AGCrV z6g`RC9C}dDo1U}?9>jx}S`j?;COv46o<#H@Met{KH%Zgh9z=Y*Z{N&&-|o&g^G(k+ z&wx6p#?^zP0s!o$=`QHWlwN3=&KonCbh)6%3T2~|$>~QCU>65)m_S*Yo(=Fh9-xhm z&(KzFED-cr&7n0wbNfdtv?~y@HhSs-O)hjiTs>4ueTydU-TCSTp6QyA%0?8$RoLA#t3q4h2(TrFZET4#2lPl=@nbARFG2`Co^c>;~&%z z6UZYXACzTsWE!GK52^R0sVFsc7YgI`fAuZ{gGf|iVBLge#O8s*x_fsc$E z4g77kmB?07BJn}uV-JT-q=C)fMh{wWqMFaCWKpO5Y!2Dz?;rZQv^KEXzTP)KH~w5) zxxehLh3toJ2*WVB?;8RibtL!i^-EZ#JCB03pg^4M4U706tLXYaRdj7l$?MqlUwr4{ z=}(_;tv)@z>^+t{rCIG@E7=dNq~sVqeLupz+`AjjHkuv zCKSj-7rHfjM@E+NLtZgu#*3n6?OTSpUDF$libB1--7P!on(-QX zotyDINNK$k%NR3xHO_-Pn>5lxR%R?OQ1@cRIir-kti~CSUh87~Sna(L3qD~zs;Fpm N$9{(dy3uQk;x`HD6ixsD literal 0 HcmV?d00001 diff --git a/brag/brag/compiled/support_rkt.dep b/brag/brag/compiled/support_rkt.dep new file mode 100644 index 0000000..74595eb --- /dev/null +++ b/brag/brag/compiled/support_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("6f20548d2bc718e2b6fcfbc0977f3e00806a2660" . "51dcd333f44ba69550238530613b350e93443152") (collects #"br-parser-tools" #"lex-sre.rkt") (collects #"br-parser-tools" #"lex.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"racket" #"string.rkt") (collects #"racket" #"struct.rkt")) diff --git a/brag/brag/compiled/support_rkt.zo b/brag/brag/compiled/support_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..de3113161ff27c4db28fc8e4fc9380f88573a66c GIT binary patch literal 18838 zcmeHv33O9OmbPBKC+SHK+p;kh-~~T0+HBdD4F(H{Sq+2`9LUz`Kq71b4z}c$WC%%j zh9&F-n(Z8`7Dc|GV|xll5f5 zWKN&|KQrevB&Di*Z{4c8_tvdj^{Np}VS7BbqH|?$A{tEe z#!{W#(fNSd1&d`OevLnED7VftN*2qwG^1j$59zyli>H@~P$T zE#F!cVYpBsc!Wk_nlMvn6Rs6Hgic|ja6ouiI3c_wd?fsh@EgI#MzR2#!sfFj><6rq zt!Mk$G4=v`o4wDzWPi>6H~S5f#nGZytPvZ<7V#$WHgUbUTYOwRB|a~{D4rDu#P`Jy z#V^HQiN6u;(kLk;Es(C0R!VnDd!%QiPo%$>n6=beZ=G(v!P;d_TJN%MweGbZv_58i z$@;$audV-R{exAs<=aNvR9l^GqHUI~&GtiEyKS{CW!q%yvmLg*YJ1Q2x$UoPe`os_ z+iz_bZQt2O+9%i-*q7LUU~jkIX7915>_4{ewm)b;X@A!KqWu;7Ir~@kf3W|n-6~he zSID=@o8`ykm*k(y|0owaY8@?(8ys=RPaJ)Y z@67MXUzfi*|6u-;`ETccmH!X<|DHd*U`#=4LWk zJ}>yEf`2Xeu0VE;bTzo9x@NfMxvp_VTz9(eb{%k?bPc$E?)oR!l)~1+YYJ~JTv?bX z{7K=q!hMB@3QrWCDtxQ(-NH`_#iIP8QAJfnbwwMCwioR#8dnx9n_9NJ>|oisvcE0+ zec2z&zApcD`M;OvSCm)OS1hjBTG3Z=sN$K5o5oD3oK?BFGE(_P<*zE|sMo7!)Uv9o zs&G|X)v~JYs$W(8bJcIF3dh%uAL;RWCVA$1TD(iVE4_Dm`@Dy}FL(pKwZ7~8w^sji zbx&|poipSOtqt85Iuv?6G`8VH!{){#jjvDmUla420!|osc6uUXaxIAT^mMJm z4DO02qKWeP`pjM)Nk)}&VfgYyuqTp8MiaqQJl>V8>x$m4lrPYUlBq;zY^AB(+nz!- zcaCboWFo4xgy(DRflo9cjL-_H`08k^^A0r99l^|26VJ21*Olkobxf$!Kb3vL_M~+z<^!5zg+2 zFkDCQAqTa>EMAzefqEd))RmcNVR&YVaH1* zTGtc3+Ei^#q-#MYpk*!;-%T=0&gyNi?rI-nS!z}E)uA@AIwe|)vq#=gUt2E}4TXx9 zf=t$-+Imw{A<^RC_|T-<`Z;ASP*sva~q-n_Ha+}@W9qHld=9$Pf%x(xbhJ%geHk)nrS`A)q8!7KDw|@!oKh zZO{rhutg|Nn*|48_Q1p!X!fZUT7;s^q6RFt$#Pd`GR3)0Zt+YH1g@+L#$z-?SHbLC zT4p4pKWe#a?uyQ?C}w7A)j~d#g6Z-CnnGl+eD(;#O+~GdMI4sdxKLtL&?rc?#6uXF z1y9e0xdx(T5sW_F9$BY~fn|coI8~w81k zp)v=k7gS8lY>ZxIcnP!~1Ip3Cfk*=Oqk>$};XM1ZTrfG2= zWxxqOY}WFwNNja0={AU-3Bx<0DUPOP^(n!sQUnO$XMw9(A(>5a9gdL!i8g`z|> z)tiU~*LJ2>#d)ui2rbPpO{Q07incYmu6udB3xi2@rZ5et{dovY^{&iYyQ(u4gWQ!L!n)D)gjpBpzR)EJ&PvD{Wzs7rFN9&46tnje-V zGH*#XMk!gjkCi0ytB83OBb*)@oZ6gDjWPA)sz{;}8jqylSt7~Q%no?0S(F53z-P`S zzX{DpR`aEe=fbNZv6aEz9$|PI8BRqL-JLPiYBe0~;8Msn9cfPqZUYxKKw;jvP%#ui z6rC|$U6n)e9i3}BJK#vy1+jX^g>geEVpzggblwiL2qvP*-ma7|dMMEvbRe?43u{;! zM-DByE}4pU3!`!X!_h<{7SG@{NRLGq9yBS8%~h?tGfA;Sushz-i}p%$(X5FgzKF*L z1CCfUwKkquEtI6Gb%@@JK{#1)d_}N3+8s}P1{PTbo(JC~Z-QcC84u zr!c{J{1WVpt%%!3)6}UmmQmVT4bFs_D=?pD-GY^_o1*Adh?boOncWTuFTKEKu8Jn2yrqVjUGaF& zeDWPZy|v=v<(;t(sJF5^l4@U7Nzr1oV^(hr+MIzg(CP}&wR2w0HpcE+Ba8w(H8?oF z)Q2ZEg~H93LNx$I63J1kIUH(kMR*ycuFZgoJ$H*Pk!=>)7LjceJ)6a)E=FE~iJmRu zQnppB+A4}(&o*&sAKQ-1cF|?`vK^w29T5HOe(ap9c8Jn`Umx2ky0GW-dYPc-Z5erc zMqbXyJFrn;PA0gfGKuXHnL^1hO7hU)PBE{)j|oidWBKeJ(aQ=5MZ)`u!?GjJr^1K=n#a5UQoV5u2c#_k0Wb|A6}O2$x9Nr_6ySW3oGQboylN<5T! zDe+O_rzAj0H6=AjJUcO#9VBhfE)ppfF+R^dnil%lZe0^qyT#!(o<0NIZ-D#7!Wz#W z1H9J&?-gA&o_z**zX9Ga7S(v}HNf{7;QPelnyLe$bq~~bP*aIf$+u zpc+;8i?)7WUmt0E3#ayh+GQz%;YbYjV`V}4#*q9>^8^AZ255Rnexa&?K*J1BYe?Sj zn_2`z$umIPSgm|wallV>1qN_Enb_3}dnjf5FPm{VH+D~+0-ki4U~22GHu zYMpKh$J|pkR$a^#LzKpzI&wF0iH1P(6`zF`K8=}lL5h6{z z0ZjmGXrjLAP0`MK8Dg(%LkJj*Hb`8h8zr_`B8_g8oSaW1@d0#`q-nFkvq|b>cS~Se zb+_d3dp1i;QKX?avJH~ovsGiX&0w@m8pat-Bu0Q5jJWAeWLqWPp=$Jln{|6g-Z;IU z*wq-IHDUSqyqcKdGGy2eJW2nPm4KaPJZxw$yM zKj`&Q>f@>3_eTz#5TN3OYM$2cG|1Chp4RcSo`~VA>5r3|)vbZDx|%7g3zf3EGAXO; zlCruPP*%4B%IZcySzW)B)zx0q$4F@xOYG>TpO3)r^8rdy#}7#|=kUJe!>i}RtLMY3 zukithA&?Y;K59g_cgpG$p0fJ0>;7oTrC*dW5G(d3ube$9eh$PfzglB&EU#8g;Zw3$4>}J=Ub-m|KwCP8!yH zornT`6KXfRG6NMb;rbYtD0m}IG-3ML)p{+8Ao(uAgvZhR$ZP^*8(|{c%Y@NG2-BMj z6X`y-FoTjJE)#mcxk-M0XKXu6g!eL`B8ySh{=`In9~1OL{=qXggD{?8<4&d9w zB^xpCWlZ%BG9hrudP8zsu<3 zc#avS*V6ZkrbeD%LTPqiGIo(B+7mfsMw?3$(Mh&I=cjEsO~@yiepG2b2Z1M@%QvRv zAyJr@E(B0&8Du&OI)Ta2MkWdO zCq(1DBpb8E5-oP`IKnm*5YFJI`wSu)VJ6bO1Yt^ZVl=;y18?#KgfBAJr`by2L2Ket zGG==Yj;8rd_+m3hZPF1U%Q$k*VWP{jGV`n@0`2rBEwYSxO4zIs(aZ#RKJS$_7g1zS zQrzM>j)4D|#EwXwCnP>Yv7x45tm=fsC|WzIMQhl_QnW@TI>*U4F5-tP+ZiXoCh;i- zE+?gZ8W$hR2oMqHKE*sI(G<8Iq5T9u3*)EJ#=?znfr-^gh8Wb!o@Vkid9?i2m}wxL zk7443Et!n0jHc070DY>GZ-)^B>f4KE0AEq-5HQm&wDe-hVF^)iz+3A+FO-&DXhSyO zKF6+KcA>eB-{IBjssq5* z6C2@e<@#mrvjU~>2uj)87fTkOJFAxzs=(3c-O>vsXNukD*@cpq@FV;I>}vw(aILR) z#4`3QW2b<+*8Q$V@UFlaep|ABn8Kc8s8GRPWcXfrJH88bCRzdmc?6h4fc8itFkl}n zcAzNpBHU22ZrqBR0bYAP5yyJFx&R6cC>6M~AdJ+$(c**;PBIou_AXE2*u6IumCp}Y zD#~re#hKs4dQ+WU+yZQxL&hhBApacEs+mY=(tr$oyhJ+kyiB?c%3UG(&}?~z=M}vu ztMZGp<*`upt=NqGg`v%^2KkZM)qp?}*kq%!xXdNaYmayLbm3?*mP!*&lTXeLW!IL+ z$}jQiku;s`m0u%52$ndaeUW8gC(FC$gfv9D%2fHpY`HF7c`SjcnRCWtwlU7->K|VT{RE7p1C)6dCvAYa$Ca1}#=K3|@ zdLrTWki@iofxx<6-sD2&sfM2_KRdTcV_3P~dgFe%%HOQ8m)S4X4c4*?B{yN7I!bA( z3@}W#3&xas4^tM%0Udc>L%y#~r}uLrKQfRP*?Oz{V*#_Qa-*rmP5UD^}ras}0S!F|r4(gpm1A;Uqc_lHt_ zY*2AYe?pSJSi;~w!Osvt(9b)MgN>5SgPn)w{tI;;O3UgztrNi-T2Lqxq$L5K`y7@6 z_ViA#}1wzLyhf&SX0$#A8xu3gMt$FYmn$2(=W{O|$_7l6Dj3wZ~SXXZC> z)%dZ%52Pc602cZ4JQ@g42*8(miXpTJf#L@}LZBI_MF_z(y4DmS)ba?S?)yauFdTnP z0Q0sQ2J$Y=2Q5}e`!2)^_1rw_z4f`xgMtq*2-Nw|u@TE=&7U2dfAwsni>|xY)2~To zBdd{LUDV{+qZK!yxVuem@$5Cqa-;lu8y&&I%gEgx=^`GM>nLUQm17LcD^ zB;SH@<6~B~6w0Ypcr?Z9RJ+$LeyiWUtKLWEXgt_<=yqd&sh8qWMs8 zfA~FUK4BNx{rZvv?=S%W`?8G~(TCCq7E(5LoKlK2@wWaZe*j5MrV7w~)ueQ%;}(|B$&qB>0Cq{5c)|0R`t+_CFxx2RiaJkW~IyP~7j+dR)>5A91nd zw1eFZo(SIGWi-sQC@evK81mcep1BQUMY+}z&(tbl=>uHkzs0P5fZ#SH#HQ%8AP9W?i0=Wqtx z3%I}0wZcoN_%p%%6;1uG(o_GNDy<4u0`4)gR|CVpU`5bKvsMKIkCh>f=c|M6j?ycH zL5Nj?6H+%cnm?}=v{3#jCP6F0e>5j`Te$qp1fyERm_Fo&KV>!)=m7m^1DbRYl| z`dBj`9zdk?FpYE`+W(j||B;|vh97V5LR+6N4Bu3FObh*{DlR+QC?dw3;g|0jFE3So zsUEkMUO)_iFatjQVLO&v2LdwM8egEDJ`Vx2z#kx_$wB=wL&THCf8>Z5Bhjuq~nu6af4gkN;(37EHL|h-_0DsCLt1N2X4IU|${+^mZXV9|j z_MyOYBPpi=N2P(IDF=aYX74yJlvKTA$maLdBhDq5<`R_CT!ON}B`9B(3kJZs)Tg=B z4|1tbbE&@!7xX_QR|Q}c5Y+&kH6e_p^Am`f2XeH<1Hn5t_17pr*jwXOxJ1!1k0013 z5xU3VxRS5$&|*hTL9hbta0V=ba+x1?iVfo8?@Df_)d+TtkP0CzP9;7TGPpwnpIwSO z54(qQZzS#rS#xv$Ad~x-%>C7+xbr1*DEDTK`?qcVQ{?dh_Xu~1*3O3?ef-I%ALg*k zjKRRz=?sg<;5kIaB@D4=imDdPIdTuhk-_;hK3{TkhM4$~U>4^I-(O5$G4~gj>Nmvn zm$YBV;vP(`W}-+L!=$EwoWV7oBOKlfYyXp9(Oh4bsJuH$|9DwLH!T z#TvPHg*{WUUUE)z;1MUDak^TWq&|Rai0Xs5c&I*vo22T)xLT+l!et`$QQRF;AHyv` z^%yP`smF2CPkjP+`_vP-KB}G+nOl8QWTVulL{_RkEwXa;8C*wFpT*rO^*LPsRG-J4 zI`uT}SE(=H;*|O#u1u*f;j)x^2Dhu!mvOI3eFe9q)K_t9N_|aa_3B%=fu*jOScAGn zViVNu6025sNUTQPDX}K?9tq>+4^GwH(v(0o(jJ zR&Wn^7;LYIUC9=(tJp$zHLi7!#tG9R*2bo@7IqC=j0efrvg_FO>;`rto+g*Go7hZ7 zcKbtiGh52W=#LQTcrAblQH3et!K9!G63`zd;xS+^kjrrEdiE^5=?n(g9R6F)(;!dl zSSxe#+%!Behz75i#^&-&Ji+GSUGy#NR(xq&&f3w%4i;rA*h;pFmEb<&aNGp$WVf-^ ztPACC9Js|;ob_NJKVk`%#Bfrqm#txI+3jo{uy?RKacz7oE|C71{ls+}cY6x6;qMjS z=dYp>4gP2ha6=!}73R3iUur}9OD!2WOkAyb18MvYl9rv46T!=kX_C zK~ieAPIY~AosvqYhdu1B8R0-+dKmfO^l;sRaOV5N>EZD7@U$7>E2d2kx6BAbn}31V z?HTIKyNo(VK%H(~ouhPhmR?Ssa=m<;Z^%CbV0!vL42P#<5i$h4KKc&m4g1*!_O+9N2^lYT6wL?bQq3ZE!~&?Z|xoqMQ{Zm!kGd>K;km zE2;Y=b-$$EE2;NM>H$eTD5>{jMU)hDr1IYofl)`i-a3EoHzLgqq41>ouWjmslFzR= zM&NTZW1AVZPe)Mt3R#ibagZ<2h5VYl)O!)|4jU%qdq zyh~KR7Sv}Yif8e$;;azRM`UNGB=(%do|o8ZiM=4P7bW(RgrS^~)K@vn;X_#V_~oOm z*Z_g!YySz3uS@D%oMR2=h(rA|!;N09^~=xBlV6jF=iS!pmm#vN#|FZu@DF4wZFBL~ zt|!`_igw^xetMCwOs$HfDkJUf(VkSYGE^B!ti(IV7(hv&qLmq+B5EpE##5DdMG>!) z4C+Y+HM$I(X&I!0j|w)cm98+vlhKgE?_}^R9P|jd#Xo=mLBG>+1wjG>R)`JJ!LVW4 zyC?l!)M<8g#yhAWT~G=PaPivI%~o}bRo!Y;cUaYXtmEG|La$2;f7*=8YTtIzB8>&+8#KSz$pjl7p5N99J| z$B}utkq0=EzH8@b^B|CU#RV=#jwB$DlwY^QkW?0I^2#Ty@)HgPQhLzZ){lRk1Y}Bj z<1kt&*{-m$O08GHKX)>s-RtuQs%wG(;ZWebFxpvSPw&gVE!nBKf6BZw>E*p%@Xdfv z*7N?^+H+~W7+|CHT=i`25vpFSVdYv*z#>d9{n4#@ACeFy4V3sP2~ZNGq?(c%N@^*= zy9Yj0ZxcT7u6JRijhNRSue_mH-am|n`VbAZ(IBgpgBsbSEV74*Yyv0yuC2eODNt$Q zw=|lR++MM%adNm}(l6CR*5c8(y6nP8Jg-}xh^(y3_%{W@psCMj#|aY-;G6Jz7ki6+ zZB-w^>4~>S4iI3y2*9HRsKy;105%ZdG3!u&%iBW$kugk~8ck`oj}w=`ok&BqW+~rQa&(vv`}mTZu|X?&P9eT^@~`RN+rbd&-QkcSPHYZ0(io@UpICWy ztbBv>>*4BAE9_^fS79!0Ie&oRU{8o0?Rx^(_D6zuj&_MJiJnX%Jx->inUb)sD%_C4 zM{TrSiMA0c2Ic8q`N=AIJtM6?L1UPbCiP8rNswB_BrjkEnWB#} : | + : "<" ">" "::=" + + : " " | "" ## "" is empty string, i.e. no whitespace + : | "|" + : | + : | + : | "<" ">" + : '"' '"' | "'" "'" ## actually, the original BNF did not use quotes diff --git a/brag/brag/examples/compiled/01-equal_rkt.dep b/brag/brag/examples/compiled/01-equal_rkt.dep new file mode 100644 index 0000000..57d690c --- /dev/null +++ b/brag/brag/examples/compiled/01-equal_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("b0fb22188c4ee33d5132034695cd58da84fc6460" . "a76c5ca59f0d97f05f835e217e9883ecbd4d7447") (collects #"br-parser-tools" #"lex.rkt") (collects #"brag" #"cfg-parser" #"cfg-parser.rkt") (collects #"brag" #"codegen" #"runtime.rkt") (collects #"brag" #"codegen" #"sexp-based-lang.rkt") (collects #"brag" #"main.rkt") (collects #"brag" #"private" #"internal-support.rkt") (collects #"brag" #"support.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"set.rkt") (collects #"syntax" #"parse.rkt") (indirect collects #"syntax" #"parse" #"private" #"parse-aux.rkt")) diff --git a/brag/brag/examples/compiled/01-equal_rkt.zo b/brag/brag/examples/compiled/01-equal_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..87757117985aaa1dc852877dfc7c2b674a0a5025 GIT binary patch literal 19072 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 LYN*iR@H_qw8@77* literal 0 HcmV?d00001 diff --git a/brag/brag/examples/compiled/0n1_rkt.dep b/brag/brag/examples/compiled/0n1_rkt.dep new file mode 100644 index 0000000..7ee303b --- /dev/null +++ b/brag/brag/examples/compiled/0n1_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("45135f2605111b9bf5da084e5a070c0ef6ea6f8b" . "a76c5ca59f0d97f05f835e217e9883ecbd4d7447") (collects #"br-parser-tools" #"lex.rkt") (collects #"brag" #"cfg-parser" #"cfg-parser.rkt") (collects #"brag" #"codegen" #"runtime.rkt") (collects #"brag" #"codegen" #"sexp-based-lang.rkt") (collects #"brag" #"main.rkt") (collects #"brag" #"private" #"internal-support.rkt") (collects #"brag" #"support.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"set.rkt") (collects #"syntax" #"parse.rkt") (indirect collects #"syntax" #"parse" #"private" #"parse-aux.rkt")) diff --git a/brag/brag/examples/compiled/0n1_rkt.zo b/brag/brag/examples/compiled/0n1_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..583004c63129efeae03fc14d71add20224dc6445 GIT binary patch literal 14346 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 literal 0 HcmV?d00001 diff --git a/brag/brag/examples/compiled/0n1n_rkt.dep b/brag/brag/examples/compiled/0n1n_rkt.dep new file mode 100644 index 0000000..01ecd2f --- /dev/null +++ b/brag/brag/examples/compiled/0n1n_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("72691af1fa81f16c36663c5858f0378b518723c2" . "a76c5ca59f0d97f05f835e217e9883ecbd4d7447") (collects #"br-parser-tools" #"lex.rkt") (collects #"brag" #"cfg-parser" #"cfg-parser.rkt") (collects #"brag" #"codegen" #"runtime.rkt") (collects #"brag" #"codegen" #"sexp-based-lang.rkt") (collects #"brag" #"main.rkt") (collects #"brag" #"private" #"internal-support.rkt") (collects #"brag" #"support.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"set.rkt") (collects #"syntax" #"parse.rkt") (indirect collects #"syntax" #"parse" #"private" #"parse-aux.rkt")) diff --git a/brag/brag/examples/compiled/0n1n_rkt.zo b/brag/brag/examples/compiled/0n1n_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..5ab3606c79b9d5c17eb98363771876346fcfe02e GIT binary patch literal 12799 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 Aw*UYD literal 0 HcmV?d00001 diff --git a/brag/brag/examples/compiled/add-mult_rkt.dep b/brag/brag/examples/compiled/add-mult_rkt.dep new file mode 100644 index 0000000..a648fd8 --- /dev/null +++ b/brag/brag/examples/compiled/add-mult_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("659c615263fdf73ed763dfe9b9399108b9d602ff" . "a76c5ca59f0d97f05f835e217e9883ecbd4d7447") (collects #"br-parser-tools" #"lex.rkt") (collects #"brag" #"cfg-parser" #"cfg-parser.rkt") (collects #"brag" #"codegen" #"runtime.rkt") (collects #"brag" #"codegen" #"sexp-based-lang.rkt") (collects #"brag" #"main.rkt") (collects #"brag" #"private" #"internal-support.rkt") (collects #"brag" #"support.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"set.rkt") (collects #"syntax" #"parse.rkt") (indirect collects #"syntax" #"parse" #"private" #"parse-aux.rkt")) diff --git a/brag/brag/examples/compiled/add-mult_rkt.zo b/brag/brag/examples/compiled/add-mult_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..29e175f45827dd5c9307196223f44e2582692f90 GIT binary patch literal 30302 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 literal 0 HcmV?d00001 diff --git a/brag/brag/examples/compiled/baby-json-hider_rkt.dep b/brag/brag/examples/compiled/baby-json-hider_rkt.dep new file mode 100644 index 0000000..1e3e73c --- /dev/null +++ b/brag/brag/examples/compiled/baby-json-hider_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("12f2e61ef09373777e7345fbcd9ad48e20368dd7" . "a76c5ca59f0d97f05f835e217e9883ecbd4d7447") (collects #"br-parser-tools" #"lex.rkt") (collects #"brag" #"cfg-parser" #"cfg-parser.rkt") (collects #"brag" #"codegen" #"runtime.rkt") (collects #"brag" #"codegen" #"sexp-based-lang.rkt") (collects #"brag" #"main.rkt") (collects #"brag" #"private" #"internal-support.rkt") (collects #"brag" #"support.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"set.rkt") (collects #"syntax" #"parse.rkt") (indirect collects #"syntax" #"parse" #"private" #"parse-aux.rkt")) diff --git a/brag/brag/examples/compiled/baby-json-hider_rkt.zo b/brag/brag/examples/compiled/baby-json-hider_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..4d78a192c2fc00a0a0cf647e630089be2408bfa3 GIT binary patch literal 32398 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 mg9+HprDG^!`C;Wfdd8)Ah literal 0 HcmV?d00001 diff --git a/brag/brag/examples/compiled/bnf_rkt.dep b/brag/brag/examples/compiled/bnf_rkt.dep new file mode 100644 index 0000000..666b3d0 --- /dev/null +++ b/brag/brag/examples/compiled/bnf_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("c276c4b6284e3a5bfcf71928b0dfe29f6410b5a1" . "a76c5ca59f0d97f05f835e217e9883ecbd4d7447") (collects #"br-parser-tools" #"lex.rkt") (collects #"brag" #"cfg-parser" #"cfg-parser.rkt") (collects #"brag" #"codegen" #"runtime.rkt") (collects #"brag" #"codegen" #"sexp-based-lang.rkt") (collects #"brag" #"main.rkt") (collects #"brag" #"private" #"internal-support.rkt") (collects #"brag" #"support.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"set.rkt") (collects #"syntax" #"parse.rkt") (indirect collects #"syntax" #"parse" #"private" #"parse-aux.rkt")) diff --git a/brag/brag/examples/compiled/bnf_rkt.zo b/brag/brag/examples/compiled/bnf_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..b2c4a280aeca38f6873290f8611d131c6c16d347 GIT binary patch literal 32259 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 b{Y}itTxtj literal 0 HcmV?d00001 diff --git a/brag/brag/examples/compiled/drracket/errortrace/add-mult_rkt.dep b/brag/brag/examples/compiled/drracket/errortrace/add-mult_rkt.dep new file mode 100644 index 0000000..5ecd823 --- /dev/null +++ b/brag/brag/examples/compiled/drracket/errortrace/add-mult_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("659c615263fdf73ed763dfe9b9399108b9d602ff" . "c8f3a5864b3b3f847e54677f6cc1e760d95ea1c4") (collects #"br-parser-tools" #"lex.rkt") (collects #"brag" #"cfg-parser" #"cfg-parser.rkt") (collects #"brag" #"codegen" #"runtime.rkt") (collects #"brag" #"codegen" #"sexp-based-lang.rkt") (collects #"brag" #"main.rkt") (collects #"brag" #"private" #"internal-support.rkt") (collects #"brag" #"support.rkt") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"set.rkt") (collects #"syntax" #"parse.rkt") (indirect collects #"syntax" #"parse" #"private" #"parse-aux.rkt")) diff --git a/brag/brag/examples/compiled/drracket/errortrace/add-mult_rkt.zo b/brag/brag/examples/compiled/drracket/errortrace/add-mult_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..bded55234455383cd1d3c02fc7afc3bb897bc00e GIT binary patch literal 50401 zcmeHw31E~}mTuMkt135Dfdt6H7Lt-sRjH)1??AIiBH#jT+iI%>ill&&Y*bZ%AS%cX zfrMQa*%w(9MGys-R^!&)qpf!Lym|BN>7M<)Szcy(=CwLYzwg}p|9}0J1cer7941Qc za_+h3oO|!N=k9-vek`smuOhD?ujrm_Jcf5J}g~8i@`t}D|vn~ux-#ECCnM`Jr ziJJzQQcT&VO4E4LBvZ91U|MW?%=Cn5t!anpjOl&TuT9;iLFQ5Ba`X4h0rMl~cJpEL zN%QmOADTZg|I++-=6^PuSv*T&=`5QSvhl2%eV6@!1z00%V=LKawv!!Zr`SdIDtn)O z#6D$z#r~ODl)=g^N|7>MxnFr$c~p5q*`(}L&M6-%f2SyxY|E{dS(b=pxn+Z8x8=O$ zEz6HBe_{E;;NNBj@s1Mv&um&dP+-x9wweoy@2 z_;c|WhZcn%8*~i+a+iUGj_T~09_HFjP_9OOl_RIDk+ka~R#QsbB zU)cZF{u}$h+nK}eNOGh(oQ_;av15i~yW^bW$Bv&le&P5N$6q`C!SRJdNk~XYNf?#j zPAEtyP55rY0||8rk01n}NR@7@wGw zn36a;u_AGN;%$i!CDtV_NPHymw@KDPV+Iuunl#8isCm%+g9C$`2j4#=Fl5b;?L!U^ zd1J_jL;i8dzYfVrE=r!3JU4lH@~-6Pl7F217sBBGGlwjiHw&sev!e}Ku=DO_q z$n{sQe{&6SXS*l3?{l}hUvyt_zv+J0{lDECJv%%{J;~Xlvh%ZRvLDJ`l)Wzdsq8D+ zKg|9p`%kk!&mQD;dMmtldgpqVc-y^4yf1k_@cy~?3vXObN={DBq@4S6nsXvKkL0Y# zapvaaR^^__y_jpCoH%)Gbxrk*>IbUps++2pR6kL@sd`uS!Rpi1FI2x){ciQg)qh<5 zm(~Bb`ip9%W?)TP%`G)KHDxsuY8KQSs(HWWA8Q`J?b2=Lsotq`r*4{hVd|u5ZPVVG z_P5hgrr$Yz@$^G?y?@tl?jHHQn){mX+w%XR3|TsB>4~K$m!4hv>C%C16WUtZ4!3>WrYtL27Ff1x z*}Ka=TQ=#j_a2-6_{GPkuh_Bb!!>uWeQj;!y44#8ZrZ-d+`gy%&pI-;9o?3+y?y)Q z-M`zt>dB4!;`X=f|6>34r#^jZ;emG!TsZvmW0}YI9Jic!{DjH${U4f4irE@$3bz#0 z`0ML^jjaulbce&Cm6b^(S zL~}zpzag*`;NgJ;{lyD&8FsJFI4*M4P!wd2oTO?$dF1v3Iot&M>YsMpIX z3@fG~yoWRp>AbrfS(Lby#Iy!ELgX)iY`olS2>Z6{JrOw>3rlOY=qL zIMOxkYY2v+A-8J^AaD>@k;9?7hUPk5(Wv3V`QgY?*+U%A@p%pYNF>liI-Y)~nkxt; zAdPX@l9IyyNH9FlUl$2B3#7>aRMn`OS9Kd`34yB2L+cg<>K6J)#RMB)ePCX&DNye; zkLsDy1Vw0VX$aOq-@;Dw$e!tvXOKj2nv+RFsdC?G^VijhpgF6B#11w2>Y5uG0(B8z zu#pG`BSs5g9@-PDmHKzEK5QN;bXdzQ>seS0b4pB#mZ4fegZ0yeuado;B4LOiOo(}y z7L^hih~5rag@HEFZsuW8V16{{YY5JD++m0VKi!s+qS_H33{<`lQW&_zsiGqbz>IsQR{N^& zzI(>qzNwS$nsP_=-L|+mG&LbYXAr7`(G#)3gVmTXjAm>Uz;x)1W~|6M3i<=n*+c1U z7OPEX53<=aTAIT_(y6fTJ5ouhGx!2c_0$1;;fOyJnF>7tns2ecA>Edc&=Lv=11+f4 zrrT_`g-b*@a7SHhC=_Ul_`=Ptp}K%M*&k_c4Ax0&1Nx#<+%Afzu{95q(Lks%7!C&) z2c+Hvmjyz%E^2K?RoAkGHKWHsx&4jH9Oh&Z2teh6%g`g5o2c^5X@RBaJN0A>{f&mi z$qNFZ04hOLrcd%GQ705nD4&osp>jgW1n-232}KjiCKOC4oP^Fkp;QcF>d2N})3{7l zr{h*Z;|?KhU8FhWYXT>;G`g~fsRsLw(PJ8$>&Y_D4a^TVWsJ-JKE|SOe&gKy`9X|Q z0e@>GIIk7GQysQw^otpO4B9s_IB!a0pmA;>R3oML1*VBM5xuW+G6u`gWK>4u6fzCX zp{Wgl2(?pdAZ#8S@(05KwbVYLev_f(c~j;!hZ_A6+n6zTL(0s@{F%XUCiFT}H58e_ zrp(BKK<0eZWurfIyBI69)|)OGMJ0Nx=xCG4ofHl%Qp|Bn!X@R!g_V>1q4~GYM(->X zZjo?{ZFYOG9_kUC7Yu|jn5tGz*sXj`PeXxlu)fvbfPp_bSsjRdEurT5NC*oxdy0XO ztQ3k%bxsFN$}eEH#KgvC=xMYsuz-1}zon(24N4*{R=9O;I1-GsMgleANT{_gQe2#2 znq^JUW-~-+Vz7QnD9{q{Mf95vip+z9P4hq< zCR0!)&6|wsh^Rx6?>j_vip&(FzOwHugnbU6LebwZF&au5X>f>EO**^6kfQdq)~2w3 z9)_HRgg`?>uqBKM94f+`j6tGqfltDMVX05I3f(XdiBXaK@B)8J;4U#cYVl!C=YzJ@ zEtswXMC1-N5|(M^!Mz*h&S?9<3^li?L#dA{#p{LD3D=Qe(}_VOfKdl_xmvY>7MrwX z)3XYt2_yS8HLHm18U-zh3!sTU^kP}<6DBvcHZ)AkDxR8Etl`L(ESe%QWDMzrT6#=H zqiT04q8@iCa^^r5Y-$tik~9lbRFgOy9WZ2=dr}dqic1QriV8C(U%REy=dL|Snfs() zR#9A4UVN3b@^YjpW?Ml?c}YR}gvHbu0{%vyAFx7#RUlAAfl>sD(Z4GRQbLd-1WGAT zi9i_z$`B|g9D-C3qy&LV3KUMpaIjEF;hPuKXRe|Kipt8Wib;wb!Yn|*OM$D&4D7Ok zzROcwR!~(~F*y`&h)iklH_om1!!peE*JsM^F)6TUf_X@TKO8~lYzkwttxmM>Yz_rs zu4y(e%0ESVx9QzH{c58-1|Wy)6(vdONMg*!gcrwb9Z43(85a1=ObH2$lQ)1R%o4Ey z9qd)5gT02owHCI)($T>-S=?|Bk((69-(c%4Znn$fVFxYjdmeV!lJ%;R?#_BmN!yv- z!CqHDKhf<5bs0`Fga;YIgAL&!hHx^4lRV5iiwJZwGmB#umSTvdvNS_%C>v&o4QC?^ zv5_p@5F5oZ46#h+G{kOUqYbevHpUQhF}ES+VcCY5m*p5@xy)yX<*|H2tbi37VnwXj z5G!G&hFBRZH^eGfr6E@3dR=Xu6&AMIlC{E;+UevbI<< zwxabqsMg1NM1K_FffP#np+>R{XuDux*yCt(Kvbx6_bUgtffefVmxi z(50Q0tnC)ZK45PXdIBAEXkq?_M~{p%Bv3Vj zxY?~b!NC-rqDRM4v>NI?oYk-$7IqssQ^}b|&UA8aC+7}w?j+|fa%PY-lbr98b2l8< z4hwoBmEFO(YbX3&qMz)tSg8Cv4ds_%wfrKYmS2R`@{6!qei2s7FT!g1DNN-bAj>S0 z)bh)u$w<=5FH)oB7txsV@22v@nM%$ya;B4WJ2`idb0;}>ku!swndE$zoV($;c2oJO z+zvJ%>q$!{>Bt_bBObE%B0SK8F!XB=@SemUtiWE2YcE3k@CW_cZ^_zc8Af^c8uE&; zmUllepTZyX>wqQeDN6!j@0ax}R7!+VG>>Rnlj{JGF&x2Y9kf^p`G5gggbm1tgxOjF zv$YjwYah&(>o7_t#Qn(0gsH+{;C0whO)py5B@08MBT0#mM&-5HEX?fpgU`WHIatAjaC@V6%2ju@uZnpMu?p%A13pWHgz@4Hd$|v zSzZIcf^f`3V)hXvI^Z(|SWf?SAP%oKS!=XC2ZX05WiiIH(;*}fID?S^SpW3 z&IRZW9VE5_05PY=g0!UpB@OM7BvMP@(}TEB=L8xq|~ z)CR{usQ?0;90Qic5D6n<5(Fnra*>|iN4hS)z!=sChM*%-hf=Ds1=NU0OzV}XXS|b= zq&T$1CG@+ZAhD}Ku<1t9RQ@4GfXYkOi`aElNeaRM-)_XFO1)FA{;RZlrK~AEV7exO znb<3+GEzZ~=_**`f@4xZr$$SI*tBTO8;y!`5e1nlqLe&E#7RKcM)a}`R<_RS+C;N; ziayRB%WAhKZ9^y8tac&~dt8rT?x9A~SqpoNqUdQ)Fy!8B-A=hZh;>Mht%`xKlJHf` zwHb`siEq{x>mc-3Ok^k~`YcAD$CFGj(7_J22qvq8g@hXxZbZ1P!d)!fCBj`Q+&1AZ z6Ye9zT`t^5;r6wRdW_uk@hwl@x{!}T#r}V zaS?k~08`56NXhmh^jT_<;-4Yz^`><(K{Y4GgRFVEp3hS=95Xu$ay*FnvI+NH^N5k3 zr5?7Vy@RaB$V2wg_tpy7yUc;anQ3n^0>pu6ex4U7BR)&Ll$_ROCN>56-YAhSNu-M* z%V9f# zKflbrNL`WO5Lv5;VXrKNyn*4m!Q~(Dsh_8A<7}(clW{%d1JVQh^aHAV@3OR?n@0$` z6_V~Y2(g{bVLMQ(I~l67mhGbY60uF9_C&CqfQE9nGhWEAJjBaLvy%sQR=LMT#f`_5!wwJMeEbSe$0D8v>FK67nv(a2> zZw_NbsLo}p#jD?vFP?&70Vw0%*SI_GumS3w0lZ@h~2R21Y>K?hV&IWJXb@~(qX zkUHmf9a2H#`Pe))<6#NP_3&zbj|w{yg=zGUs-QxC7r$LaJ7$1QmoSV@b5Qd;7~5)P zsCH#GV(2W0p~4liKM10tMFP4HVyI+gww)alrU`LWu}D2GQc=B%o6smg)MO@9F=aZz zY-V!~l0^f1OZjlMc4JBIu@Z$Rg}Yn0JB3R!MI}UoC}bXiigqwCLldYHqHiM=^>2_6 zRWBu^KvY6hzb>IylQ5@(m-UcPk~}2jIVju%!rd=ik|`=78cTuoCK=F11{u&i3Ko4< zMuGWB%9OeV%{bg32wF*(qd=1*w}{X1$|j4Z7V4=L{QJF9i}X}1;~wmlTpUeK=l)*F zC0eqth&T62E!9&icx$iJGCdWXAL*4`9!*Z?D_O7f3N1aakZ9gI)ptNdeKC#@pBnHIPkYWd26K--#~q)fuuAR*Ht8;L{t z##&vvSxHJQh@E5xgi*Y+Ry7z&%J!TN_OwVPL^(I5sh&oyf}gHcdnf4VD|7Ifz@M*G z?Uez)oS&-Y!?iXC`)W+6X=$V3Y+<~DUzx2M1_QL5U!Gl{Wh9|b=|ZClkY|o+tB`~- zBU(GiIERnYC;?XjG*UFWsK}7o%lFsvoi+_S3X$jrcslQ>~k~MdoA+vH1zpUi*^Uv$U#90Zw zq7?A$=e6At*E1TFJNcRO9+knfG0;jCdQL)5D|`gsd{i3`p3|XDzWu0X#h=%qCH%xu zjqZ6JTFOrz)yAC{bSUALsN62-&`iGVD8EkyU(~_FdHYdbtAbyY;3Fj4zP;M;bxDVM z`RTpcD(*`XdQ`!l&&GXP>0Z{M#r)ttt#p@lXgc4pkB?AET#?{oMB<74T0vgXp*g%` zzsBxW9qQv-_iKb-)1ic`jaRShP}qe1<5X@dY@$IS@JPOXAD^MBkZYw4dhmozu5#o7 zQ3qRPW2(F)5wB zMkmf9Jt-BJiP;7ldtJCI6bi2t?i0dYCEV4*T_fDJ!hKQTucNSQJ!)$m)sSn04gHX! zC^ZU;GVFlln@IA@4C`Q$T*O{6#?skALN}zRv-L_W1SJ>gsQnEJm~66bmrOi}cMvXo z*CwzAQ%KTo6LuK7JDl&`%O7)XmhG(rR5jQl!LKOjs~29#SD_sedQmCmXP?pLdz~7v zgr9kaYdW`8LSH2U&tA}QxAmn(+f^;f+HQ-_cI}W7URLt>^Uw257S~P*xB?Ti?L0rF zxOPd>IzSa}w*>1MHO+le=D);>dFOII(zQq8X>kp0uLSQ@#_^R~v{LMo!1GEmKY2<6 z?$>~o{FzhQyzwawSi#SpQulUU2Q(nRg}-`A>!b&D=or4@v<5w-Lp^+z4n3?xbNE^v zdPIX3@e`-`Xte^4QbCWh9Gc*|j>$+a%|@rYj>`;Z$z+{8t`+2j4t4Tpj*nHzoYbM2 z{OobAZaKT2*1^O1iQ`;t(X3Op5!tTO=(uNWS!Zm6-C1XCL#SImqj$^Q&_fY>QbFI+ zV|!v^)GhTS(Ji%@=$5-Avh0@6if#!P-4ZUkC0uk%xagK}(JkSkTf#-Rgo|zo7v1t% zo9h{LhO;(y+U9zex+O(-W6rE(owFrVw|tHye^NoWA`wJvk1-~?<*rx=x@8PRcFWz0 z)-9hyw-iidw*)SA%jdxQ97%%75N5ELH%!7^5N)*Xq=`f4TzxvkXg^9AXQYhdJG2x7 zw48U$jhTj=)~6v`1+}{9G~@v-A5y-v_yKW%{Ull4`LR`&WdRWrVV1ow~*2>TZqyk z0453ondm(u@G(gcYpG{N>^W=$gc_ab>Xgn z`r24KP3agcu_(67Kq8bJt(!qNIE3S(ia05Qp<1uKnkIEpbxRbXj@PD1w6ec?`<+7jZ6&%?GuPgJLJFaZ*Io6o@}P&R zJqP2Og5JsIlO+3vZeRdYMAyKeB?B0zWB@~x3>+4i7=5m)d0(P)Qio{UAZiz)n+0r} zQ0$|E!&jD5qot`BEhYQyLLYjC4WNZ=yU_S+w+>oUh&olRLlnjqYt}(*)j${Y{h4dA z4jLh?>26xuHuU#rPzw$-De{uAd6u^pwaj=S@QOv|(? zOH$_P)woQvwqiq?RQfANM~#f8|5TaL(GhDwG0$8;$tP$DLX$Bu!6Z*F$w|@Kuzvh)o;;!#koMGX!U8VU3n-2SZo(2Sik6U0Hg3WawrV95hch=}0Uy;1Nass8 zVFBCp0*WKDo3MnTXbHtB-%VJ=C0Y^XLFG+Y!iZi%an^eCl#oiI?Ltvl-OId(=kTLN z+^KCd_C812rLaS|tD{8k+U>%=EWJ}YMSG|6mn&98E7;i*{cf&1P|XAP`6YK+1z|@OtvZVIj7d?C4r;|idKHo7<-Bp)6Zx3tvcG4N|`uWjKSA#4_o5GLG*SB}0chHe?7e6~+ zJ7+Zz%jWCmbM;D$28IA`-ae1FX*EtW!{{0NE)xBj1$v#ZsOU&4;V&;xMc3#7>gHz` zXlK6~7**%udjkBdq8_m5tGfMqUF;UTg3)S<);yB(`GsJQngV>LI27+b$!oxgGEsOzP%3pXm z+F(?f`px`3)SNFajPAKd%ZH=_{>s80AE*dlq&Oa$LjVWB82q`|^b zSXhHaqOgbtYmLHMHQ3@PY_SGg5``_%U`wO0r5da)3Tx9~%c8Jl8tjoM>=6yNJPKQ` z!5)pm9(@bfEZ>yZ3fkQv`eVBEdW{UO8F4n<|5GnR8U@&HE##~IkzZo}j+?JSygaQ; zxbS%e2dv^eb;Q4>J|t30D0LQk2~y81<#dkuTUw4a)BgP2e9{=U`HtM(3y+WVAh@8YoG_L-f9e3+Nq$-=$WoAwhkUFiM5EZL`h zWTs1%pIk=;|MzaeZAxD)IQ2iE1*eG?oPGmZ@S3~GH{R5<$rQZR+j2Z%tKi*yDzvzB zpu8wx*o7hL9p&FhJ1tHa?nn`=<%YR}@&pUML%EFty$5fWi;Q zNeVs#1tfcT_mfB-_j&3T3+#^eroo71uza6L7Q(iv? zAA@=)^|HrrhbI4C={G6;CZ*q`d@D@K?3=@+ob5L${U)W~qQ7XP`XD@ zdiVxVx?50McvVV$Ki)X#!26u;;*+@OS@=+)%%RIP(dMz2wDlBqc8O|td z$#rEouCS%omEnYfM@6FC*I0&g3JYIXhUXNv__{KjR#@n|GCZxYN3ScxNrkmuSB6sx zYrC!thZVL=&wvk(<3Wsip+3iOW8QEV{$r^?MOtdiDZGQ#OG1JNIgq8?~$aw9uRr7Tj5U{KEaM}scGOBl-gQ$0pBuX`1HECSPuxk z#SVbDLk|Y{2<0&GRZ8uv>*a1IpO5t7k%72Vp6&&pl8>SvI1s-C@Gb*j z9M8Zf(;0p+z%erI4f-tr^-{LD(_YIiGW-~5xUQtUw5)>4gDLDFN$JZB3FANpnW{P$Nl(A(KiHr-j6TW?#Gu)R`PT7 zM?|jK#OEc2y^L?rp{m5k={0snIRxS8_5Xan_wRY$h>`SKB<-gR7v}Lo3YGDp{Go*p z@skYreT5I1{6&D6yJ< z|6}nSPk%i2Gc$h5U}k3#|BigEV0>M3*jmOn{En~97>=LHDB;7sj-fv>CnwLoe}}t( zk4duR@NQE#EOrLR_bAURe>PxXVp4*$ozv?y@iI<6O%r9)pP@k9SFPiD_l(<2rjpN7 z@%xECH@nk>70Ez}h3_=)IU}RyKVL4&XF^-*8(moOj{|O`Ve`rqo zAJnj@(d6X0sHj{%T#EVsWJSfX=aoNCOd2$JK!USF)D@&d6+ozu%wOB0ic%FD`*nzrPsYcPG2>T-7{7iBdpJi79Ilx0E1t%$L4$`RCpour zveB@eFoz$Q#gqXN^&PpGG|+3x-ow}*VGx1Q{Ub8^X@6|KH$X4v@Vhja{_F4M#n0Y| z>NB=M%yT*Iad$7Qn9|767(yk>VeppdAapQ+ub|>!9CSFhags(Gj0Mdv8Hs;p&c5Dp z(B0QKC`C{Q!tI8EaLU&o2;C{O*tu&R?PywXa3Ei?!7$wIxZ%T{HY|Lr77*Fr$O59g ztg?Rr@!xI%f$!+bk6(j`Q7@A0k=qji-fMEAsrCR213u`6Z*k9p}=*{&P6iqIqx z3yIw^a(tB#H*O&zg-}iClLix7^Yu;Wja^H0Py8VoF1no9bHnYcsP%7bIpO_AmJ=0a z#b0SCwQ-}*<%GTW#*t{r`~*ik>p4!{Jkg;qdmaKOEAE;<;;BQADK~ z$R}2~4MX06|6)U4&NnjTRhAcg<&YPhKxwBVF*}1_^Ux&s8(H&IRuo=ax%#*GZoVzP z_Ag!W+|heT?zQ5v#~hj%M+u%Oh6#CWawuk@@y#rFqWeXol5}g9fgdUrf(ZM5_&V)7 zK6#@ZX#9c>4zTB?es<0HVKu{1?1yqCm#>|9#2m#6^HA^&9UK(-h@2M5La!9j^U zI4JFTa8Plzg9CAh96dOwC@3zyHuF#@%Vqe$nDH$0Mx3b@YiFu4i=`WPruv~cV)}@Q zPxgHvk5fNTcSF?8FZr#vzRyOla-1r1*7lvnc(|#a>tbUT$D5_%IJHzgP8Gj!PiLtm z+V{~!4Se}o>QCkFy1?x7EVYErQa=K-VtJNY9z9EKN8!b%(Zm^_dam~|1jy%iN}FI* z{}`K4jE!ir31SyIQ}#o7iaL=`B!lp)gaOW@Tt82Uu73O8cm4$X&f+Xlo+}FU80I~{ zCt4&9FKOR6pO1{S1K@v1`4vttkI@v1j)m{?QsMNo4a|%+UV@Qv&%TdSQraDsjM8Hn z!QiNqxg%t7G^}9~OCC~A#IdrQ9aMgmXm=hLQ@(G(A*wK&B;P^$f#*XIFuL<`qUSVF zRFUyKrB@ZQ6dw8KCB4RvDdftH_rR=UegA7CQnacv6>%q5y1#=_Xd4aaEFEnF;UJ&emN@z=Q3BtiH zE4KLfre=9vF5Ih3mqeKkody1j1LO{nu||^tK&bdEbq<|vz1Ld>E<5n)@9slH z$oZb-*xY1&q>NYIwMuTTy3O$%mF1!qyBTeOg6L8d>nJ&H-)?1 zNFMtcDZknSjVQ+*sIu=8fzzcAbY?pqoFgw$8%0^2fX{OlLK40qbvPdi`~G8DtHz_j zbqV;@?QZAuz&e&7y4+8CBdt%Mui@TLNQZ1_$I9_~rx2f1R7b2033N|%Goc-3=se@l zc|0Dss3Rj@yTH5md|!A***XN<5ibDm6m?#(?L`YX;F(D{!_eSWI0P3sRocW83Jsh> z-t7fWDShwP_=!hV@=ig;PgF(;Dn9vv;XY8e3e=N?I#i%$UlnzmK>aI19WGFBxhm>* zftr1xH>#{YW3}uQO|}NOqJP4kif^y?M%*J1M_&ZdT@2rRt>Sr}`1oGcvp0dday`&W zew(^kw!X3YkPdAPT{V55$bTB?MZZmLXLigu@~U!f3%AzQ1;Sz9!e3iWX6I=RaCQZq zU$0<%?R)Mi)Qx-#e`RIPGrWhX!(suy`QQ;h?tuG{IXvHsPJlp_)N;Km0TDmX;1WO2 zAi7G=uhaqozb@bszb+sO?&bv^sHT?}dOlChz=gM504VOw);g-VnO}=vIl!+OAU}Sy zz(c=T@R`Ujt@{WyA)9{vU}lGBY_HJ_84s}vzP5!gMX!2Lv()DF-qv= z#kl)PAGrr|XS^Isjkre$ch{oA&r*-Yz4fLniKgKob&!?uP0joQd!WFHa%btK6MGxuLnaO5v)!=1-1Y?Skag=IQVTG&YE z(-wA%^OS{UIZs=d%X!AaJkGNg=5;<}VY$v{EiBJ@&cX_u&skWJ^LYy^ah|uZGUp2x zR^hy0VO7qH7L3L5@o=0kTlk2X9d5S}hUX`hjbitj2M3#i5nm(_j`-@D7Y9QA`2la2 zndKsl-RJ2tjbit+A2<|N!m?Ne%VW2&GUjDP%!OZ(uVMwvGAiAcnAj2uF7`(P`Qbn$ zFSIbilBXi%3k4cMGN&sUI4LOx9ABiZB@mXFlYq(J>>9{Y*~n4p=H$5{AAY_g90*~) z(cBQuZ}ZpHIi{(gxy|)$EUBi^zc4^k5{G#d8^j(cBvF&@5O}_(NPc*MKNR3Y zyR3vOq0OPOBI|83>Tjwa-(^8&#WW(++7Lkb8(W&20!@*y?>phPrig!OVR2r8<8AvW zHs`i*WGUndh9-Es1|VKt*W47&A3ZO(3+(4qQ)-<*HRF|pnATYaGFEG`7&D?KvQLd_`?gsgffUdoZE#GHn2tq+N*&zIiT54 zgt)jye~W1Pz+{AqrW92bSNV#&7|Rs;7^8~5VAH&2)KpTO^Hq!UHH-6gi*tq5`GnQE z%IaKg&Gx#JOztGoom-%vq?2Bj3oR{xhL%86D_B)2R3ATSg3bhKGTHDXD*ysyg}q8= z8EjZiu7}8&+ypn#|8BPN*y(X+XR95Wu{G9F>8yp_Zyqem9|$!D zoBR!7AAbEuZJxsNE+xtA?68s?!^uX_{NZ=M%QTsX=jG)E<_DVc>zeDyr+TR>EGnxi zEdCRdv(xHP`J@mZ_7t1Z)EsK`Hw2fFwl+o3x_MomQS1P#X$kuRjV+P3+^&2=G$%_9 zhR#MJflyP}M`MS#t0uNZMzQhc)VkJC2wLw`bEt$xyB}avLD*kkFSUCNvC<*+p-F{R zMO`jbz=N!ITCg5Og7bm_>LUt(2N?^nb!-wEm^vqZunFe-Z3;qO5(gUW%^}S^z@`Nx z8-Jv^F-M|IS3!{l!KV3z)Kd>I^I#Q-F3@4V15Ns)$)dUI9D8y2etotj^ZW90`{-EQ(wqEME^S9}-^Cuqg5> zVdeF}aw6e14T~bL6IOl?tWqSbh*Qf*k(F`4D(Hcgjf5vOEQ+imtim2xg-BSfVNqla zVHNej8iRzj8Wu&?5ms>zEH@I?YgiQ7Kv*R`uqu(TQNyChCc-N1ft8Phb`6Unn+dB- zVhzC4Rs9(wrVveKeAlh`6%VWiD|+mhQz{?9kK8(L_yAmXuk^A-EX2Yr!dmfj+e_F| z*2b3Mmr|FrN7-^vE$^E{sEoJQ@J_sDX=lR+rapvMW~mpfcn(qOMUX8*$Rk1_gmOeE zj8Lu!MG*3dP%A=tBD5Hxd=XlLP=N?7MW|4O+7K!dp=Agai_jwom531JRQW!NP#Ly% z+*Lwss6-f6`9QPM`$o`~&Pu1XZJCbB~XVd;5WZxq&rs)`(?0W@#x(0mu0_z41RWrNMPN2L*hF2G8eNkig9k=A!y6s`Q5h z&P)wQ&wE(FzpKGx@+PTyj|iN*H5@(fQ33y+29L=rwr^4PV*=+M4M)#=T)@At!Hs#l zO}KuivOXcu?$yxr>?Z~MJ`HZj?)J#$dRk!IuVLspPYL)BG`KNmj?8&lU_78<=sC{_ z_=6hUn6q5wJS#9B(lGR#&j|P|4Q|ZIC(5kP3Y1z6MbCOpz-Mdln5-)-GVgN&XO4!W z=Y3wl{Te(rui7Ke3!J$+j;7Tw2zZ?ik7{+aPhJo>^?l>4m%4vZ-~{@_>0UwiEJYW2 zQJ~H18!dB%hIUDy%{QW{Tf`Xo)ZX@zz**22PB!|oVE3}X3HE`5cVyt^&QTFB3&e-} zLR_)Jov&hD5m*cR#L9G+t5~lHtOkMAYjwPtjprL``O1NEn?YY!V{7OsM-lISEG*rFWPn$I3BV{OGOl*^VBvPd3VZb}?oFn+YBC^H=Kha#B; z*@}4p%}E2PUho5 zrU7iRY2fHWFs{JHW%I(!!fX~cDWeNVvt`nIM0!i5w@7-e(tA{TZPE)#Z;A9G(pxS( z$tZDj5f~K~#&9ZTuX z7RCaCo3Iwr7hDk+T;U6@@C8@+f-8K%6~5pKUvPylxWX4)3!{YXEO&FsUIQdh-inlM~sd3+8rT=?eUY{)oV6qi&~ zl~nxlhhK$OR#a6|s-d}aCAHpzPeDahS?MpGuf<7vz7hv}R{5p#by}i%OL6Xp`5hpC zGTga>Hr!)DD|>^U=nY!c8??GNXiaa>+TNgby+P}HgEsUAZR`!&#O2YUzNL-f`-r0i z=f(74lC$Lxbo%T+*yeFdEdAmUuy)w#*!0s5pk49FIe@r)q#phtc{1<*Yb4`%=q|QV ztkbmj-oHgAJbaG>_)p_aOmTK{F!6j{CTC)p{4OIuW#xHh4dhVIU8QzV;%#3twK7N=b+j$lK@(Qjw8Q+cd5 z=SgCe`*j)ZkmVU6?nop=??~)Weid(Wo+91!hy^&VuJCSKn3hy0*{`|D<~+-jhtFms z2%`w=Y@7v)Iqy|AM@z~vm!yN0XNYEY338NULGQf^dTAj|J1dGqE?d1VR)`Hv=571tD(7MI@{v%k4@+wp>HpIJ_vJ^5a{`CC7HXvY<^$%KF0 zlyCBy#+l}t=9%s=-D7&lwAR#Z+G5&nI%0ao^jD^TG%<6&xzs${95O#--eBHiK5M>g ze$)Js`4{G1^KZ>bES+UDFDqk{*lczWTf|~)4co#_vMcPn>?iE!?0>Rfv!P0vGEWI9 z&nSnL*Oc!oKURLJ+)y$s1(twirseCFF3TRvWlN9c`<9ul>$68~ZY@K7h z%evSawXU;nw;r*+Zhgo4J?k&67MtCcW6QIRwz+LS+ZbD=ZIbO4+nu&0wufxzZI^7X z+1|B%V*3l*k8QuO_1Y{+_N3ILnxq*?cO>1HRG-w8)SA?p^kC9AlO9j%N_sizy`&!| znRzyM^BH_LpU>~)jeHqj&L85B@@;%KKgnO>*Z8~qJ^mB^bN;{ib^aN**wgG;_9A<^ zeX@O?J!D^IUuEBD-(x>zf8G9}{U`Rnv;VXGU+mW8wB+36;^cA36O(5r&rg0JxgmLR za$9mN`O)Nc$=%5(lY5g>96m>dW2|GMW16GEvBa_5vB7c7@uK6r;|<5#j=ysJ((w!WNGR{sgI>D9s1DFZ9@+aJv;Q{p+6gHNgJG2mNq@@fwWlKvuQ7+y^;2#v|pzU zP0vanmF`Ioq)$wrm3~k9%Ji=EE$O?`52PPUe>weP`fKSu>F=d~kp5Yw&6)0Obw22P z);Th(BxhbuQ_hNF99?Tsvs$|rZ zQGc6vJku63@xuJf+fcXYGVOzDGp8?~wP#Mw+$ZLKHaBbDj(Nl8e`9{{ z{1JD}zUMplRNi~)-haNg>AtJ?ZTkAbhQDuUXzXd65Hy);I!q?TYz?#ih6Pfe@blXU=Jg z1Q(YyceI2ShuTY`p@%yIO~GiWCD0mdU+l=WIUH(Uab#JH*)=|N0<$B*=4GK+2^DhW zn$w#ifzDtg8j664j@D>NYv^HsN61MgPhqlziLAFR0a_O{@%P$04b!ywzLn9}-!ic6=7JjIkGK8s6l6`vp+ zXbHwvv?-?4L_l%rEENz5fz6b7qPX-HIih~WWLIN4tVo9y6_?JGxwp)lp_m+cT!+uT z{Z1W@cyVd&oaoB-Sn%NzQJEuG8_m{m6g@sy>rjD%w2B;!G`Ds%>jOs}5iNDgbpe)RC;430i`oI&)U@ zl2G%q01cU_CeRXE6mAc-xXdH_=Cq?@S9G?9n=yV-mpP|zzN|A$EV#@W#GxF*i7SK6 z%_3@ccM{u?_CRw-Yip=E79d#*H-}?Ji85#P#acn~5^jl_v&5Xx3d{Z%QfMBQkfRm2 zML@$XbHt}gb}l8NU_pqadAOF892tn-9*YFqqi9Dc(A*jX&0EwmHm9?=xL6lzg8-Y; zLy-ui2?HCd3%0j+#85idmX;O=2bP6aig7a!j{{5M(Ligs$#JV84g6f&uwklP1|aYy zf=Qt;hRhOzAprC4oOMg!mIVvuEeOn-a{KgKZ&_eVO2SYRBIXQY%}^pDm6oQa0#OWO zn*iow-e|&4+D6bHoXh6qvbpTmT(}dr&Fk!lhG|Yk0~6&WCBX@V+FM940?}A75}Sp2 z0<^$`!PZ<`N=j!WBov;Yc5AN9W?S}4L=x?^CtXAC^BvNiVk#jJ-cs4egP(TuEK@h_nS`wt|8M;4<&gU|u+yhk2Z*Du%pp zdtPiwC{Hzta}x${ju-@$=rkc%Qz@Jh4J}v9Ne@NK%c?5MrUWC4r!_zt%S2c%!U|h* za<~NpA6^s=MPQ6nttRwTi8e1Ip=h{eMX(iyGb2MaWP#2|$6{ne#k6{yfspJJO3Ue+ z3z+0zz-&W?v~^%!#^*k}!<-fD>}*|$Ng*{+ig=8%!(W2X<~?`i7uaBK;2VjcG3q_Qd?(7 zJNkgcOGv|1G8C$Ur*?LRBC(Z|-DPv4q&HzBmq0JhRtKM?d$POSoEC0h1nSV4f+|hL zspy}WYKsCBiRg4$C}BQJ;aLU+9YPO7;CC~!C2eFK;(e9N_A%tBqPC(v8e9aMladl@ zZ4Gxu;Sr%D%o(r}%}W9j7LLjZHcdj?nY+-PEr8VuX)KF6(AC~ zs)?w~GpF?*rQ6~I20hf#soK&2b&B5)wG(Y7#^z83u@KA-6!R^r613Q)GMnQrlRAtP z*erKBDK?5)hAhF<3_z@9w@;dbJSk|%o$Rid<*v|h<%pKg0x7k0LKmY`FEi1Dmzi`X zNO{d_hf0zfV!G6O<`Iy^h{25`=IbgdOY6$ZMosW~SQOU1Ho&5JmhHsk})gz^*DC zIIp6rw63gXY9!hko8B61YibEXs+)o>d2%LC2`!&wPHzoHW00fvC>%}I$-J#25{9ZJ zPgbxyU4G2eB{KJBmKesu;dxF;Rk~6cvoZ0J#B5!u7RFgJb1*Yyq%ck&gILN!ks8#+ zwkcg~JO1`5?4Z)s#SSZ8gjXm`P2#V!1B#cutoYbvg-!9XtBQM@lIwMESDaf5yVwo| z^oMx8pf2O7hWJoJJk1bKH^eh2o|?(53yDBCGqWUSVZ#imOy)GCve*{QHSihHM$+3o9MyQtlE!Mn+`3mC}V zt$21T3)%CE`*~%U*Ru!Ey|Q2TEAG9@AS$M#R;z5pi{FMBF$wN5$AE>ey&0IW}5Kj*XU*W22?y*k~y^Hd;!Kjh2#Qqow57 zXel{1TFU1+idL&F-=Vl)P)2P;{~e=t7y87U6!F0nPc?at0s95nPsbI{al}sGZ@a=y zD((|X7L`42C@bPx*^|ILg+EBiON#rH;@Ac3lVYSW3mjUUzwXl$enSRzrG`{wh>tPE z1Mzq+D`q^NWF_%Qf>p8?6*iWFDhjG8sG*>if;tMu zQ81o@2^37EU=jtB5qMryAPdxX2jiZX@cFWssV^%QYX3`y_RF~1evweyFXC$ZMOL?gT!FUQL zP%x2#Nfb;*;5kk0r*=EoAom$1kLJi(IY)e?^F(~G4{^+|v%oupKgi)Z#d8j^^Z3L3 zx}dnvE5oVmIYU_y*UDZ1=0*HreqB=B7nKykz99QoOeqmZ(|lrRO`c0YhDwIoxU5(S z`H}%y#0|(-gyPr<#c=|P<2)3H=PFtz^!r}u_fyEZNcuf3Rbf^JGm^xn^0o>5!qh4U zdSF^IWen3YmQUb^Z{f~(j#JB7%5(X#$u;qu;abk4d?Y_SuR5NStL5xr+{ur(kBw)I z(y|V-34B|mES{6CPBxde&OR5J6q9 zvq*b~7Q)`80k10=?R?6@)>;@c9jS`lj!c+DirGESSVXoon(HlW1EIOsTXG6L8!QVk z)L>yDd&V;0$4EAv-Qw#pxi?!z6neG*f2+m4)iT)Ye$Fz46#q606jun-z9n@&98a;i z5rF#_Td6L{*mld@gcTY9*f-y9F{dXiJtaEe^8{Erj5?6bM9vItnTq%vElyh z11IG1ibX!L?jmYw2~cW)0B0nCWiv!Zc0z`zN#k7P=MIpsvoA1)4}c-)h}z7C`+zJ2xqz(G z`jv_f>jTqg5-JnR%{n6$l$fJ}wOVkpv)wW)-Wa52$5Z}zQZ$PQ$Xt=6?CBy+{CT!P zdY`kfEf&vq3q+HWEv(tS!;-oQBD7PAkdL)!aoBz}p3CZ4GbJHqi&1o^Wiu7^vBg~? zWJ`>|B?7p_vlA8Up!(dqEJGos@ck%7k_xrol4^oxZ0uqUP&HkwQG`JeHX$6y8*gSa zP^}r-h!$I{St^swL{w@cgwRH$ouR)hKGa@FbuRLzT5ZFJ(`Md)+iQFhAJ3l{Rhu!W zdw#dq>mSy{!fYx3b`@VgpFft9eIxUr#o>I5Wq&%qdyLPoEwII&1;CVZ1386$#I9$C zDSaJjzu(!z1kIu%ABq-_@!iNA<(S`HTI542P)NA%n6q=PXYRK+-$v0x^nv2}ch?Kp zJIsO1`OY^P0g^zpq}UIX?CY5qGn_qUs;0EWA1BfyiS#fO$(MBBLRsgZnt_ea9y6jU zNf5aJB18_ZnSUWZ$8dwMGWXl&$eXt|k(!e72MivE_#TMc; zGll_pl8xh6@8*{+IdKyG%L_!F!&l$K8!!yDWqyHOOBIT$B!Zhia}Re4{(9IjwQlhL zkvSz!U2@=PU@M4`2Sssg`SJTzZr)+e@0qg&R*fY0P(6FNk*#cCkFbt<_6-)JSSNagK9{qY z)~fZ4m+`A#=T$U8GX{6pdB?}OG9b<4I~J;yy=6956j@lmkbSd(QH5-wIU^E+Ex?vp zi@NPW8%r1%!ul5Bi5SMFo-Gptv;hP3R6SokScnKX80Q<03GvzdZtg7iBh8(K%XigaG zcm643kFjJ&@^$C?ggFjH-c{%JcZDR~kNS~OS>-20;C+XZV}bXMIxB(ywh^_o%0F!3 zlwkWx!WQ+HX;eLX;I*he5PiT0B3H(pi7WMKZ?Ak8KuyN z@X^%>Q4&Saja1|rW;2_MkSoT}KbDVBSx6vw#6sl{i|~*L4~UT1(Ro9cE3$rcbeuPI zvC7+WB7*KU@P?k1yir8w4V|m==GS;Ds^*n_coPIq2~JLm@Pr7DiICXQdBZ>`&>E;8 z{ZF(P!Q>+KvOs-NgnKQtN?AyD*NWv!7vq!p>fkufS&K+-pmoN&dj8m8plvKnRi@yG zfskpfgUl@cbiK~s!c?Um#MUzd!bsj-uTJ7rWphy%+aPiYQ93A519A;NUa!s%(9su2 zsAm#CU9YZ?4EWXjSUn#hXHTkv>TiKlMeePJ^DN^v{Axq7L@_|C`IUxJtspV|tj;vL z0A(80WfHO;rE+TLpj;y#sSyII1Zb3??NnUw?B~1d`Bs~T9ET)w19&d)s^=(Wqwj7o{Kc&r}8UG z2|sh1XQ_oQN$6Fjly5$x>#oZhl)LzeGd>mfN&>W2gR z7sZ}ebZ8|%a!{lDstz5?j~>+Y#%ns1a5Xiw$|_oc+Vc3OgZv(qiN|#C2)_OxuUEm3 zOYi~WZP!jsp{~}Uetvvsp^CdkLJulfct5>MYuyt%w1V&5rM2!!9h%G6?b7w_QxbfL zNIbqew?_DB9ZI;GzI;Z9=JLmOk5?I9FQH&Khp*km=c!Z3 zv%yMp+A95Ixl`T6x~#0*$~IX&$PmWt3pc!JCwwcSrD@JNcuY9df*NfI1C!O7JxWvU=`pi3;5%q34yc{NyQB zdwOHEOXh$UYBuVwr!&)QEOy zby#z5UeKX={N!P-IZ(%R@Cbh7FxMJ=T!POi75wNijqnK#Sj$fxQ+M4wCpBOVKY2`Z z=T2!rKAOLBOq28%b!Y)!bzFnKq(gmtwGMq*hZgZCb?9jgTF#FgKYUtJBmp99oFp z0}KikE}6i6-YOfl$IA8zQu{@CK!gWHcu0g$YO)>L7zjquIP%@&Fzk(?1BClVYZT;( z(Zj+7^?u=yX>DiM7fN-7c3VcK5QmzjoYacvfo51?xfu^I3pEd-uFs`~43gQ8`+_`##=3AUdo#i2NIp(;U~iUdDe$1bp3F?KEz*%@2&RT zExV@fbBG<7dn@>%vHaNyI8iF}`&ffKYZB2nRaj#j)~LaPaad4;HN{~~Z{is84S6u< zEtIFvk12es6`St+{)uPZz^N3DtZ;yJcN2Yz<5hVwCJyrqW%ecWS-kg~Tks826vJUH z4u0RGgWoSl{>$Pu&|#W-lxV1Zv$c$`{s(@M{VR@s1#87>bC&X}*cuW$LD`>WeqH2M zQr<#LwWa)wQcZg&zs9*8A6RnS@xfsW!=sX&2%*R@t5z{|DwZoalm04 z|L;9)6U4Ah{QZZmfkf@ieuDY9t%mpVS(q)|gXPTxgA6=w8_#=FDD!Uho<-l;w%P_; z+FM5`-W!=`?QD%APzvLs50paQJDX6PxNG6(qkQ6$#@oyRS$?M5H+>1`XEx6fpSyBw0QXFOOUw@7<2v@i#J`wLqw~>oNu;gG%{W z(idt&+|P-tl@I9Psh1U=P}q|SuAQ(alzR3xTv}MrKSR520_Sm*aQbjp zr)%L~tpS=}&*oFVKnFfeb;Qik-6ZFx5TV5D4Hi7d>Zc!8~~xwxEwR4(#O^* ztWg$0%fAHv(+X3o_;UDbuv*jU_?J`ay8TF1ZWZ~q`8q{%Xka! z7~Y4?VT2CMMI7sn634oqW}YP7fE-n|i6ZI*|CV-l3A@B9XoFH;&z@Bn4>#TF{7`!|_s98>tQ}9+`NX}qcNo&+C*Z0P!|gan zj`MZ8_@+)CA#(L>C&M=%qs`@I)wMNX9|ylVbU=GO^SFgB>%AfFjIk~SCPj+sSn3s{ zsDj&i)=i9WM4;*{dDDutLtLac>I!WD!L8N=w_4H{SGJy@5)DLrlfpJDs6fzF>xfrO z^x~SRgzx+nFV4;(Bjx;nL4@J|pyBV!8-(xUt|2ZCzR%=UIHOD_);3>i#J>9Nb)()G zu!K?FNiN`deGDNc;inLK1s4n($#lRudtFroV&;qHs||#Li?>Qw+Mme!1tRG{pcpG8 zr2-Z6J?O1!sa?j!wM)khXqWedd#!tgpO|rvZ+>?<$IUmoNNTX>`>j=c-EaAmqekHN zXJw7wk@a13Mn=QETfC*bAk|XDFHPdTrbd&=%hoG@GidOT)D+kAHu5=zvnw4=K~%GT z;Pe&i1l~JurpZ)!BlA@Sb$gwH1*kda52WOMAq(|_g^|R<6$1-D8#Fk@wI_jrFR1+! z)c&zqXFy;Ze1(1V}`vNIawbd`Rlhv_UDZeWE8&KU#=tKQu%4A%!udaUR%P`9x-F<7L!+qLeEB z@@}QB#dN>rD`~MBAGFx}Qj67STC7%RvARB5Y{E^nm?{Oj7OSbH8?T?M#WWSJO4?m< z6%0xG(oPqS?njB^csN~kZ?Cgr%NCX=y#0MoUS^}??@mzpi)RA zI)G9bM@m5~{XW9nB+77<<$_k#fUsrfKhKtZ-(br`kw3f1Zb$?Vq!&O*p~PdW&lbFju4a;tdQIp5DJ)F&B}h3p#R#@ zpriY)9p9GB88G^-9oNaVqrv~`vvwS#tsTFk4v~Rc|7D{=mG)US;#&biZy9PzTsDs3 z+OiQ}P56$AZP1NE?1&p9DG{Ug~NZrK}>pCns`y1WAgxUKGv-2;-6!>rE zyF;|(zy)*o?fOQYxW6v?&d~J<>kMsssV`DOYlPbXhBBnh&ZpM&e%b{~w^}p^HrwGk zXrsBPISqoIW`X)M|B1QqtJ!QmGSO(qt5=QoA%oGb`F)MH7e;&CmowVEpS~~pp~hge z4-a6p{}U`&3jfdxmh#flvM)0AVj}%>%v68P(|^ITY8B6mFISEx ztQMeBzd-qX#pOz}STQ9oS5yYXV&#Q|>c61wKfq!|)U9g0V+O4U@B9DeQUz=@8g$4P15(V z!NbH>sk%KX*N7Pzjbf8D3+qlFPOxaV8qEJSZC1NZ+i2%Qte&woDi*(@Qp1Axr~~_a zy?^@x)@e^LdNBYC^8SXlSmh#GtdFth)FYirLsL#TIL@{|q5@A2 z7gX^kK?B{5dA%R*DF>Z5*B%FMH_w^h?HenVo`Kwp4t#y0H%2HgS#YQp80$}-iHAY9Vs@m|l1z@gg^CEV@9Fz^V~Q z*p2Fs^r}GW0aBen!U0l$q}K#e+DjTGZ1}2IE)0yXN+HJY01|&p`BWXSl$1q5JdD_q z7mVTbR&Z!I1X-Pen|i(MWl1+c`(^4KDg)g^4ooR0iOJzAIj#l`aL9o#=Jk4!JMKD7 zay+O&ClCgV!wz)S*QogMvG;cuIv!}0*9{D8tVzKUcNw_g>oQ01ENoxCCp*)yQ}k2{ zzPH-zIt`>lDMGHk+Ye`L3f&sHmvHvkFm$z*`s_Dsn5|2p^X?6VwVy#q#zRPaKCj^0 zfVN(s-F;>tGy`8w0gQpS7zKp9In zVvM&pBto~K5hNNT1r4{nf72gxqrf~$m{|fd?`D{r1m=Gy%n<@}_{}gk3(UfE{V`>? z8Twv)0BZtvSKJ5xwrTYy#h>&y*uzzyAo zY|PEb&9Zli(#Mfq{_D*3EE(paxUOhsbVYMBUhNGm`D_tJwre(qCWOKZlW&bxNhpB>!#O5ajCYm zCA^UCtFF#-QRbc`tO(C8eVBLUb<1$5)2&S(E4Gt5UsFTRS>Be`+?lF4;Ev>=}=2WM*%w z8BcI#WDl8OXY`+fFM(QI*A$lNdPQMbu2&T{!u6WMM!Hs6Sf1-K3(IjmZegQct1Zm! zT4P}z*Ao`zb3JK+wY1w2xSqDu&hPSi1^JrP0N#6}=Z)#Xcsyu~2g)AA&j~CJ`FqUF zr@aL?5|2U6bSTWtMl%nyjLgMz&)WOZc)dNP2cKd_G9XaIHb z(+&c23ex~qw|C4IPd-HgO&u*Ot9xuCS?Ub&OdR|J zhj}C$%4U`Im;hCOqo6%TuO3H2Jgdh_xS}-P7ak{y&Xmbud&`6#3koZy?3+9fT~<+C z>Ub-8B)grS^ao$z$RvNyAf)kBeS5Sdf6@kI^Xo1vF0JUXk7Re6v(&fA@Luji9T7a49O-BdwXBF}PiI$E z_B0UQ@O}sZynBq7&SQa|Y*ac=HXI>doDQ{$4gtfdGtiCVMRi9eQsT*ZJY(hE1zCoS5X(J=wU2R%)W$)7r;~79q6f4i|bj7tIOi*wzxK03jN+x z6P^~slo^d_=wZGwn9E3G!lTMOHX_vufB;#cNpjgJHoRzzj|!Q*1UJ$DUauo19#3T; zK&Hg!qX(3H-oipv=os6CS4 zZ-1L-60a?bUnem52GOJX}pLEypl~#XXR| z)oey59{Q%Y702|H5TZFleVJT+t~(kaeeUm>k=X4cS&=zYfA(Lzd#(`{gSwi{0^wjw zi=4s*RFw{CiA*W0EAR2317@>ZXUCtAhae~b;?adWSnCuFA_*YA1@k21Z&4KN5;vHo z{vw)vtJ!S)Dg@O+KTA*~QRb+i*phJj;xdxP)y$lx0_A(`Lh6c0gdS&#X;d>kmaa8M ztpGoe(%#Y(xM zrmSbOM95ST3|y5#M2W#dXHwI%jcRwYpxhI#THgH=oyU&lr-*GIF|TLX?&; zF9!Tot0D246%XI}e2G~3z*-ga2t_YLPJ`?CT>_4s!9HAf3;1{q zUZQi&VeSRr8wJJ$9Yf=LlYmdu;auHJSd}F?-z@ScY56)QTLgTv2FC(W9Dc9D;kTc! znk*~bDv+k=NLr=O3HVe2@8ddcz=M9`RV(RpY7Q4p%Aa?X^WJMm;GnJ^pFM)(%ODkg z$Guy4p1-na;AiWrD=O(6e}loiz8z9Kv9BMKRHJMq{bhsj+&e%|sO((77m*#8a z2=_ZfO%@h34bCq^ja68Vb}Y*)D`br(CBG~mtcZ^W@u6Xs1G6##vs_~0gD}hUHOvZN zj!nR>xG5Yq)MRDBWY(C>nvxk_AnRhu|C+hlo@YXrx_tqM=+b__ zDNs>aQ&(B@<3IT#w5syD%CQ=ncZ{Ug??)A?OKa+?#{Sr~-6rV;DjjUC@?+Ny(n@&z zZOtkqe=^jyvrl?gpY(2<+@R3hYs{7dj!JAo(UtC#)%SOgNxpBB&)aVoV@opa$@~a& zmR}9X30D%oxQN`Ty!Y>rizVsptb^1F-HgOCX%&^wZzXp8H8(NEwcmzHe7|2M-9mX8 zYKdQ?=w`B-BUDY{?^jJ{|F(!@%T82bvARxB75z7TzEXExyje?VhxH=01r@za6&3w{ zZCNhblC6!4z7e|or`+T^BkUWgLyQ`>N3lt|8euIi^|GHOnXIn!wu})CEE_a@<+Q>| z_43KyoA_mw)let2?z%u!3o8j9E3!4Vn-v&aM*7F>x=8x2T(eoSBDs`fxv(jhg*q%0 l`DDck$;9y@UkkIdtqL20HNjAp22VSqfzpL+u-)#p{~IXjE?)ou literal 0 HcmV?d00001 diff --git a/brag/brag/examples/compiled/lua-parser_rkt.dep b/brag/brag/examples/compiled/lua-parser_rkt.dep new file mode 100644 index 0000000..89e43ba --- /dev/null +++ b/brag/brag/examples/compiled/lua-parser_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("5f013fb473cfe3e4828d9eab2da368b4b34f3a83" . "a76c5ca59f0d97f05f835e217e9883ecbd4d7447") (collects #"br-parser-tools" #"lex.rkt") (collects #"brag" #"cfg-parser" #"cfg-parser.rkt") (collects #"brag" #"codegen" #"runtime.rkt") (collects #"brag" #"codegen" #"sexp-based-lang.rkt") (collects #"brag" #"main.rkt") (collects #"brag" #"private" #"internal-support.rkt") (collects #"brag" #"support.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"set.rkt") (collects #"syntax" #"parse.rkt") (indirect collects #"syntax" #"parse" #"private" #"parse-aux.rkt")) diff --git a/brag/brag/examples/compiled/lua-parser_rkt.zo b/brag/brag/examples/compiled/lua-parser_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..095e333f1c8d890e8c2481adf305622d0111043d GIT binary patch literal 187670 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 ZA>p)edN?Bt4b7hqt3qfx_0+ag|38>(LZ$!! literal 0 HcmV?d00001 diff --git a/brag/brag/examples/compiled/nested-word-list_rkt.dep b/brag/brag/examples/compiled/nested-word-list_rkt.dep new file mode 100644 index 0000000..b7d3fec --- /dev/null +++ b/brag/brag/examples/compiled/nested-word-list_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("60883511dc50f547d2ffc9684baf72eef099400f" . "a76c5ca59f0d97f05f835e217e9883ecbd4d7447") (collects #"br-parser-tools" #"lex.rkt") (collects #"brag" #"cfg-parser" #"cfg-parser.rkt") (collects #"brag" #"codegen" #"runtime.rkt") (collects #"brag" #"codegen" #"sexp-based-lang.rkt") (collects #"brag" #"main.rkt") (collects #"brag" #"private" #"internal-support.rkt") (collects #"brag" #"support.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"set.rkt") (collects #"syntax" #"parse.rkt") (indirect collects #"syntax" #"parse" #"private" #"parse-aux.rkt")) diff --git a/brag/brag/examples/compiled/nested-word-list_rkt.zo b/brag/brag/examples/compiled/nested-word-list_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..b0fa3eec39520e5d17369718055420c26ca8025c GIT binary patch literal 16611 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 UWg!t5gM`AhlxZx};qW^CH{zDWtpET3 literal 0 HcmV?d00001 diff --git a/brag/brag/examples/compiled/simple-line-drawing_rkt.dep b/brag/brag/examples/compiled/simple-line-drawing_rkt.dep new file mode 100644 index 0000000..c64a161 --- /dev/null +++ b/brag/brag/examples/compiled/simple-line-drawing_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("fcfac72351476e73408d6f03bab8f9c10fdb40c7" . "a76c5ca59f0d97f05f835e217e9883ecbd4d7447") (collects #"br-parser-tools" #"lex.rkt") (collects #"brag" #"cfg-parser" #"cfg-parser.rkt") (collects #"brag" #"codegen" #"runtime.rkt") (collects #"brag" #"codegen" #"sexp-based-lang.rkt") (collects #"brag" #"main.rkt") (collects #"brag" #"private" #"internal-support.rkt") (collects #"brag" #"support.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"set.rkt") (collects #"syntax" #"parse.rkt") (indirect collects #"syntax" #"parse" #"private" #"parse-aux.rkt")) diff --git a/brag/brag/examples/compiled/simple-line-drawing_rkt.zo b/brag/brag/examples/compiled/simple-line-drawing_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..663b35cea7345ce3d395e95c7cd264ea7ad054f4 GIT binary patch literal 19131 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 C7DuoE literal 0 HcmV?d00001 diff --git a/brag/brag/examples/cutter.rkt b/brag/brag/examples/cutter.rkt new file mode 100755 index 0000000..7cd7023 --- /dev/null +++ b/brag/brag/examples/cutter.rkt @@ -0,0 +1,4 @@ +#lang brag +top : expr (/"," expr)* +expr : "x" | list +list : "(" expr ("," expr)* ")" \ No newline at end of file diff --git a/brag/brag/examples/lua-parser.rkt b/brag/brag/examples/lua-parser.rkt new file mode 100755 index 0000000..75781e9 --- /dev/null +++ b/brag/brag/examples/lua-parser.rkt @@ -0,0 +1,111 @@ +#lang brag + +;; Lua parser, adapted from: +;; http://www.lua.org/manual/5.1/manual.html#8 +;; + + +chunk : (stat ["; "])* [laststat ["; "]] + +block : chunk + +stat : varlist "=" explist | + functioncall | + DO block END | + WHILE exp DO block END | + REPEAT block UNTIL exp | + IF exp THEN block (ELSEIF exp THEN block)* [ELSE block] END | + FOR NAME "=" exp "," exp ["," exp] DO block END | + FOR namelist IN explist DO block END | + FUNCTION funcname funcbody | + LOCAL FUNCTION NAME funcbody | + LOCAL namelist ["=" explist] + +laststat : RETURN [explist] | BREAK + +funcname : NAME ("." NAME)* [":" NAME] + +varlist : var ("," var)* + +var : NAME | prefixexp "[" exp "]" | prefixexp "." NAME + +namelist : NAME ("," NAME)* + +explist : (exp ",")* exp + + +;; Note by dyoo: The parsing of exp deviates from Lua in that we have these administrative +;; rules to explicitly represent the precedence rules. +;; +;; See: http://www.lua.org/manual/5.1/manual.html#2.5.6 +;; +;; Ragg doesn't yet automatically desugar operator precedence rules. +;; I'm doing it by hand at the moment, which is not ideal, so a future version of +;; ragg will have a story about describing precedence. +;; +;; Operator precedence in Lua follows the table below, from lower to higher priority: +;; +;; or exp_1 +;; and exp_2 +;; < > <= >= ~= == exp_3 +;; .. exp_4 +;; + - exp_5 +;; * / % exp_6 +;; not # - (unary) exp_7 +;; ^ exp_8 +;; +;; As usual, you can use parentheses to change the precedences of an expression. +;; The concatenation ('..') and exponentiation ('^') operators are right associative. +;; All other binary operators are left associative. +;; +;; The original grammar rule before encoding precedence was: +;; +;; exp : NIL | FALSE | TRUE | NUMBER | STRING | "..." | function | +;; prefixexp | tableconstructor | exp binop exp | unop exp + +exp : exp_1 +exp_1: exp_1 binop_1 exp_2 | exp_2 +exp_2: exp_2 binop_2 exp_3 | exp_3 +exp_3: exp_3 binop_3 exp_4 | exp_4 +exp_4: exp_5 binop_4 exp_4 | exp_5 ;; right associative +exp_5: exp_5 binop_5 exp_6 | exp_6 +exp_6: exp_6 binop_6 exp_7 | exp_7 +exp_7: unop exp_8 +exp_8: exp_9 binop_8 exp_8 | exp_9 ;; right associative +exp_9: NIL | FALSE | TRUE | NUMBER | STRING | "..." | function | + prefixexp | tableconstructor +binop_1: OR +binop_2: AND +binop_3: "<" | ">" | "<=" | ">=" | "~=" | "==" +binop_4: ".." +binop_5: "+" | "-" +binop_6: "*" | "/" | "%" +binop_8: "^" +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + +prefixexp : var | functioncall | "(" exp ")" + +functioncall : prefixexp args | prefixexp ":" NAME args + +args : "(" [explist] ")" | tableconstructor | STRING + +function : FUNCTION funcbody + +funcbody : "(" [parlist] ")" block END + +parlist : namelist ["," "..."] | "..." + +tableconstructor : "{" [fieldlist] "}" + +fieldlist : field (fieldsep field)* [fieldsep] + +field : "[" exp "]" "=" exp | NAME "=" exp | exp + +fieldsep : "," | ";" + +binop : "+" | "-" | "*" | "/" | "^" | "%" | ".." | + "<" | "<=" | ">" | ">=" | "==" | "~=" | + AND | OR + +unop : "-" | NOT | "#" \ No newline at end of file diff --git a/brag/brag/examples/nested-word-list.rkt b/brag/brag/examples/nested-word-list.rkt new file mode 100755 index 0000000..b7489c4 --- /dev/null +++ b/brag/brag/examples/nested-word-list.rkt @@ -0,0 +1,3 @@ +#lang brag +nested-word-list: WORD + | LEFT-PAREN nested-word-list* RIGHT-PAREN diff --git a/brag/brag/examples/simple-arithmetic-grammar.rkt b/brag/brag/examples/simple-arithmetic-grammar.rkt new file mode 100755 index 0000000..69a5f2c --- /dev/null +++ b/brag/brag/examples/simple-arithmetic-grammar.rkt @@ -0,0 +1,5 @@ +#lang brag + +expr : term ('+' term)* +term : factor ('*' factor)* +factor : INT diff --git a/brag/brag/examples/simple-line-drawing.rkt b/brag/brag/examples/simple-line-drawing.rkt new file mode 100755 index 0000000..b97bdf5 --- /dev/null +++ b/brag/brag/examples/simple-line-drawing.rkt @@ -0,0 +1,10 @@ +#lang brag + +;; +;; See: http://stackoverflow.com/questions/12345647/rewrite-this-script-by-designing-an-interpreter-in-racket +;; + +drawing: rows* +rows: repeat chunk+ ";" +repeat: INTEGER +chunk: INTEGER STRING diff --git a/brag/brag/examples/simple-line-drawing/compiled/grammar_rkt.dep b/brag/brag/examples/simple-line-drawing/compiled/grammar_rkt.dep new file mode 100644 index 0000000..c64a161 --- /dev/null +++ b/brag/brag/examples/simple-line-drawing/compiled/grammar_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("fcfac72351476e73408d6f03bab8f9c10fdb40c7" . "a76c5ca59f0d97f05f835e217e9883ecbd4d7447") (collects #"br-parser-tools" #"lex.rkt") (collects #"brag" #"cfg-parser" #"cfg-parser.rkt") (collects #"brag" #"codegen" #"runtime.rkt") (collects #"brag" #"codegen" #"sexp-based-lang.rkt") (collects #"brag" #"main.rkt") (collects #"brag" #"private" #"internal-support.rkt") (collects #"brag" #"support.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"set.rkt") (collects #"syntax" #"parse.rkt") (indirect collects #"syntax" #"parse" #"private" #"parse-aux.rkt")) diff --git a/brag/brag/examples/simple-line-drawing/compiled/grammar_rkt.zo b/brag/brag/examples/simple-line-drawing/compiled/grammar_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..06d46a82e871231676f8bd2987f310c3d10db1f2 GIT binary patch literal 19088 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 literal 0 HcmV?d00001 diff --git a/brag/brag/examples/simple-line-drawing/compiled/interpret_rkt.dep b/brag/brag/examples/simple-line-drawing/compiled/interpret_rkt.dep new file mode 100644 index 0000000..f1ca0b9 --- /dev/null +++ b/brag/brag/examples/simple-line-drawing/compiled/interpret_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("2be7b8f9073e403bfc5794c6d86bf89dd1589e9b" . "871c9e6fe1b14a02cedd5cb931351fa9a4d5c217") (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"syntax" #"parse.rkt") (indirect collects #"syntax" #"parse" #"private" #"parse-aux.rkt")) diff --git a/brag/brag/examples/simple-line-drawing/compiled/interpret_rkt.zo b/brag/brag/examples/simple-line-drawing/compiled/interpret_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..f5f7f0c15323075a7bdd876acb9d595d1aaf3c9a GIT binary patch literal 6809 zcmc&(du&@*8NcVmv5$Sz#!X${B({^dY2#OH$9X@RzT2!DurQ%$tCXy6eA}8hPG&n@ z+doiw3T=XZ(eJKy=uuEITh&+r~U&2OgW5%BhE&cTT98w3?Es$!fLwtR;cC{pH6_-(9?z{Mk#-R2@A3 z)$d8a{O+HJj6l>#PRTDFk;bJN>6_9s(odz=rQb>m(!0`Mq>rS(OP?TMR?eoGadMJOkf+GAgl++~e`AikWu1A&wKoEcQUrgv`|AUo5_jpPETe9M0x4Gvm3Ajzflh_m`R{ zH%g{C?gf!qqFu(A8qhcFQvW~_bB!3@JPNL z4djAgQAW z<7OWo?NZD3StxS1G}|j_b+niLm_};s6?7AI(dL$&oET#}*^er^IMoj7&J_pPUakytVhxC)mM|yoVgdGZONSvy40F*%zM_eiIOMfp4@IFPnVT>s$8cw*D^kpMe5?jhoAEKV=~?L0jcnI$sk<^ z-y&6(h;oBq+Eu(>qhPd+j4cn(g*t;!0s3Xoq46>u8B;D3E)$ck@R0?KK>lT+=q89< z(L#wLi?^FAx(U8FsAe;!E#mb?QBib#MVKTMEnx=aYl?2`ik3pB@pD0hf*n<&2{$}OV2L6n=B;~=LXt?+eQxo{leMY znPuloCeWDD5ri_P_*or)tTX|733>>g^WDPx6LJD1F-}1;Q@$ad_j0XkKzF%ZA=Mn8>6*! zlg*IOR!%|`5`@?ya$rAh05AGCfERt`@d9CqF=Prn$F@Oiup_aNZew@hOYE*foU~;A z-?Mgwdq`1a7*I!tt{WVs=1aiC=+XD zup~daMLu+gMRxRxm);0+<4uYn^ztB-OO216-?2d7DwwTj!*lJ-A2fm{&ZK~H(PM7?`OSqX`<5;4k38!synt*oFxXt5{_k5N{xtyfkS z3K8LDr5z!-u9cPcRb{0sRJN?>I*sJi`VqalVJS3>=T(Sj`Z`OZ6*$8ZEHfGwxo9FeSS2eS35;!tXptxA(s)JnFU)nbF{ zb&_pInL|WGp@cD7p=4g<(Y zmxu+{+9eoVtm4ci$~bdHi*=m2%F3&Uy!V8>Q&su$pbgjO6M)zyYl2-SXx2SeRS>|78S=C}k zQK)bTpwaXf+Ktk|k_MoZj77(~6?!jK+b(*dYa?QVX~&+mO$P=`B*Tb;KrOe8!Ht%Q z|M!U^wozQv@mk;_0&3tQ&eZEbe@QpgQwA0b@-$2o2PKFS=OjQcB0JBs2P=ic(C4dQ zidI!N2E9Pa%d6Te)+G9?31JTJue6-}jMj?77&-&yS^?D@3fDq)5ej*mT?!h5tHF7& z9AxYQWB`(ZBV()JvwQXY?sB-*h52a6Fu(kvti6bP|Lvh{YXS5=`%relzxt-uic4Bt z)8dj$zo7LOE@(scI%;a5l@F$;GL!LC@|?;qd~@oVTqN&rpytEV*)W>P+}YNA6l}zy z-S*)|E{BV_bT)hRrK-U-TGx| z_EdaYZOv0^<1ywj#QlFTly~9v3##U#e$^SubH7QAPQ?}Pw3>mz$xI0TaQzwew2G@? z?y$$qSSp##>CVSfxv)Me&r4K>pd-4Rcy4Mkl$Q{Y3aN2Co=Sy{u zm^War^6v1qczs^KH|TBkM!ZpPn>Xg|@OJ7y8sKLJY6~Ed?Sz{6PZ9X?``7*Tz~ZR3 z^CNnMHQ}VtB$>2EAlAw*QZ_8VFL`^1=X|(r(fRzG?{wo`Gx$ujI_zWjv2RsyzCQ5z z`~`8fcIso_I`}|{+(aqv#lz#)Mdysbk literal 0 HcmV?d00001 diff --git a/brag/brag/examples/simple-line-drawing/compiled/lexer_rkt.dep b/brag/brag/examples/simple-line-drawing/compiled/lexer_rkt.dep new file mode 100644 index 0000000..b24f2a2 --- /dev/null +++ b/brag/brag/examples/simple-line-drawing/compiled/lexer_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("da50291e26298b21ae69135a48c43d16ef91db56" . "6b9cc7b42db2b58f41c65fd908091c074caf6397") (collects #"br-parser-tools" #"lex.rkt") (collects #"brag" #"support.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt")) diff --git a/brag/brag/examples/simple-line-drawing/compiled/lexer_rkt.zo b/brag/brag/examples/simple-line-drawing/compiled/lexer_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..60dcd44df3febc8640b597ee507056288b8ddca7 GIT binary patch literal 10589 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 bzpT*eTzJ!-=O4zp!lLJ0K9~3U<$(VI&k>Qw literal 0 HcmV?d00001 diff --git a/brag/brag/examples/simple-line-drawing/compiled/semantics_rkt.dep b/brag/brag/examples/simple-line-drawing/compiled/semantics_rkt.dep new file mode 100644 index 0000000..a785d09 --- /dev/null +++ b/brag/brag/examples/simple-line-drawing/compiled/semantics_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("6b91087b0a6eeac473dec615af66fc7cbbcd2210" . "871c9e6fe1b14a02cedd5cb931351fa9a4d5c217") (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"syntax" #"parse.rkt") (indirect collects #"syntax" #"parse" #"private" #"parse-aux.rkt")) diff --git a/brag/brag/examples/simple-line-drawing/compiled/semantics_rkt.zo b/brag/brag/examples/simple-line-drawing/compiled/semantics_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..15eb3a62723c3bbb5b7fa84b559decdefbf3ee6d GIT binary patch literal 6219 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 literal 0 HcmV?d00001 diff --git a/brag/brag/examples/simple-line-drawing/examples/letter-i.rkt b/brag/brag/examples/simple-line-drawing/examples/letter-i.rkt new file mode 100755 index 0000000..41f6570 --- /dev/null +++ b/brag/brag/examples/simple-line-drawing/examples/letter-i.rkt @@ -0,0 +1,4 @@ +#lang brag/examples/simple-line-drawing +3 9 X; +6 3 b 3 X 3 b; +3 9 X; diff --git a/brag/brag/examples/simple-line-drawing/grammar.rkt b/brag/brag/examples/simple-line-drawing/grammar.rkt new file mode 100755 index 0000000..b97bdf5 --- /dev/null +++ b/brag/brag/examples/simple-line-drawing/grammar.rkt @@ -0,0 +1,10 @@ +#lang brag + +;; +;; See: http://stackoverflow.com/questions/12345647/rewrite-this-script-by-designing-an-interpreter-in-racket +;; + +drawing: rows* +rows: repeat chunk+ ";" +repeat: INTEGER +chunk: INTEGER STRING diff --git a/brag/brag/examples/simple-line-drawing/interpret.rkt b/brag/brag/examples/simple-line-drawing/interpret.rkt new file mode 100755 index 0000000..e6cec0c --- /dev/null +++ b/brag/brag/examples/simple-line-drawing/interpret.rkt @@ -0,0 +1,31 @@ +#lang racket/base +(require syntax/parse) + +(provide interpret-drawing) + +(define (interpret-drawing drawing-stx) + (syntax-parse drawing-stx + [({~literal drawing} row-stxs ...) + + (for ([row-stx (syntax->list #'(row-stxs ...))]) + (interpret-row row-stx))])) + + +(define (interpret-row row-stx) + (syntax-parse row-stx + [({~literal rows} + ({~literal repeat} repeat-number) + chunks ... ";") + + (for ([i (syntax-e #'repeat-number)]) + (for ([chunk-stx (syntax->list #'(chunks ...))]) + (interpret-chunk chunk-stx)) + (newline))])) + + +(define (interpret-chunk chunk-stx) + (syntax-parse chunk-stx + [({~literal chunk} chunk-size chunk-string) + + (for ([k (syntax-e #'chunk-size)]) + (display (syntax-e #'chunk-string)))])) diff --git a/brag/brag/examples/simple-line-drawing/lang/compiled/reader_rkt.dep b/brag/brag/examples/simple-line-drawing/lang/compiled/reader_rkt.dep new file mode 100644 index 0000000..8b97560 --- /dev/null +++ b/brag/brag/examples/simple-line-drawing/lang/compiled/reader_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("c8b67b7201b23c3e04cb7c403946a85353dfc61f" . "4566c23431d2a1b416e2baaacb9f264fe8af413f") (collects #"brag" #"examples" #"simple-line-drawing" #"grammar.rkt") (collects #"brag" #"examples" #"simple-line-drawing" #"lexer.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"s-exp" #"lang" #"reader.rkt") (collects #"syntax" #"module-reader.rkt")) diff --git a/brag/brag/examples/simple-line-drawing/lang/compiled/reader_rkt.zo b/brag/brag/examples/simple-line-drawing/lang/compiled/reader_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..8521ab85ae10a3be233fed36925e02baffb09515 GIT binary patch literal 2389 zcmbVOO>7%g5PolVZSPOgY@Ec8_$R4Jn)OfolccGls;Wc_DIv6t1e6L$z)iN1iDQSg zqozed^hO26X;l>@4nUFM!T|{`T%b*y{{N7+&;wFiA#s5V5*G(?VBW6nCM~5Bme)Ho z`^|hav+uoe$6KyV@qu_U-uomFLfm*Yj_0!b)04BN5i@7Ah4i#BgjOddq#y6q&u-M6 zQdJ|QqZa7-m-OYA|8Q@)NiIaY+J1RmS^ntGaN+_%->>u3HzQ*SDR^J{@0pVR&$CW3>wnq>1QcBN-wul5z4T`JCJ! zKa=0c3aO_$P11h)1RbSQbdJ75Ptq^wm-H+8J^hpZMIGRUC~Se9un!Kx`|vTGg*Ks2 zcvtvDXcare5%H+_fmjlM7YQl2?)A9ZQLIuRjgv+pmd@_a#ZV|1W;`hnrE24fJCn*z zZsso`mOq#+q~^F$tr_FVq3MI%*9sD#%{C}8otv1=;Igq^o*JO~J~K6$Fy>OzGZ`bF z$fx-|mPu!g*o2unkj_pfGRB-?A~gJH=%ksNo=%zSQ^?IJo~_&~DYlbQhhkI5&8Y%b zY2`m-=4K4DkT&wX26n(q&0yA8bT*Yqa1EcvlY`Y_wsEJS@mwZn#;n|^*Dem19@-KU z#{Sf7reHrCUZXuz)p%!jR(ipEHk+C>hO2_rvaVK57}Wrms)~!&3;r(eDEK;kMDOyC z7Bz_Wj|1SqDK@}Wy@4$*D1R}+09Clm^X6NGOv)WVq#bB zC-dz+A$5lO`oMix5QC8l_oifo^I`NWR8bYqvCL`MkCgrNpJdgVkO>pNuQH#XEx{^6 zN3a_^tFL19vt{(7cH!6T!mm-D3#PzxspNr~S*fsF)av{qu+s}ZOI(7cYTqk5J5#cx z1^c!HXgH0{nU5vH>^x-`D7#46CCV;Sp74UzlW>m;o;x%cw_eL4&pOjfI;G_12CceYG#5r) z*Q-lMMQN*ghXgl_%;SLLh-QD$em#8%s)u#`2y#fEf(-V=JHM@3%= zPY_)??vxG->g`|%AyEs$gLF$?>2TeS+UUUGVFYy705QoYy;rxZ2B@6oh>IdFUc<$u zfONEuwybG#^#Dh74AC(QjT<@C6QR*ZPn5hdox*=O<9YN=)R?*lq_;(A#F$C6_gZ#d fEpGUvy0bbcDx>puun$3fp;ti$1#lhVzkq)Lf!<`> literal 0 HcmV?d00001 diff --git a/brag/brag/examples/simple-line-drawing/lang/reader.rkt b/brag/brag/examples/simple-line-drawing/lang/reader.rkt new file mode 100755 index 0000000..d900f99 --- /dev/null +++ b/brag/brag/examples/simple-line-drawing/lang/reader.rkt @@ -0,0 +1,22 @@ +#lang s-exp syntax/module-reader +brag/examples/simple-line-drawing/semantics +#:read my-read +#:read-syntax my-read-syntax +#:info my-get-info +#:whole-body-readers? #t + +(require brag/examples/simple-line-drawing/lexer + brag/examples/simple-line-drawing/grammar) + +(define (my-read in) + (syntax->datum (my-read-syntax #f in))) + +(define (my-read-syntax src ip) + (list (parse src (tokenize ip)))) + +(define (my-get-info key default default-filter) + (case key + [(color-lexer) + (dynamic-require 'syntax-color/default-lexer 'default-lexer)] + [else + (default-filter key default)])) diff --git a/brag/brag/examples/simple-line-drawing/lexer.rkt b/brag/brag/examples/simple-line-drawing/lexer.rkt new file mode 100755 index 0000000..3e0e810 --- /dev/null +++ b/brag/brag/examples/simple-line-drawing/lexer.rkt @@ -0,0 +1,27 @@ +#lang racket/base + +(provide tokenize) + +;; A simple lexer for simple-line-drawing. +(require brag/support + br-parser-tools/lex) + +(define (tokenize ip) + (port-count-lines! ip) + (define my-lexer + (lexer-src-pos + [(repetition 1 +inf.0 numeric) + (token 'INTEGER (string->number lexeme))] + [upper-case + (token 'STRING lexeme)] + ["b" + (token 'STRING " ")] + [";" + (token ";" lexeme)] + [whitespace + (token 'WHITESPACE lexeme #:skip? #t)] + [(eof) + (void)])) + (define (next-token) (my-lexer ip)) + next-token) + diff --git a/brag/brag/examples/simple-line-drawing/semantics.rkt b/brag/brag/examples/simple-line-drawing/semantics.rkt new file mode 100755 index 0000000..028662d --- /dev/null +++ b/brag/brag/examples/simple-line-drawing/semantics.rkt @@ -0,0 +1,48 @@ +#lang racket/base +(require (for-syntax racket/base syntax/parse)) + +(provide #%module-begin + ;; We reuse Racket's treatment of raw datums, specifically + ;; for strings and numbers: + #%datum + + ;; And otherwise, we provide definitions of these three forms. + ;; During compiliation, Racket uses these definitions to + ;; rewrite into for loops, displays, and newlines. + drawing rows chunk) + +;; Define a few compile-time functions to do the syntax rewriting: +(begin-for-syntax + (define (compile-drawing drawing-stx) + (syntax-parse drawing-stx + [({~literal drawing} row-stxs ...) + + (syntax/loc drawing-stx + (begin row-stxs ...))])) + + (define (compile-rows row-stx) + (syntax-parse row-stx + [({~literal rows} + ({~literal repeat} repeat-number) + chunks ... + ";") + + (syntax/loc row-stx + (for ([i repeat-number]) + chunks ... + (newline)))])) + + (define (compile-chunk chunk-stx) + (syntax-parse chunk-stx + [({~literal chunk} chunk-size chunk-string) + + (syntax/loc chunk-stx + (for ([k chunk-size]) + (display chunk-string)))]))) + + +;; Wire up the use of "drawing", "rows", and "chunk" to these +;; transformers: +(define-syntax drawing compile-drawing) +(define-syntax rows compile-rows) +(define-syntax chunk compile-chunk) diff --git a/brag/brag/examples/statlist-grammar.rkt b/brag/brag/examples/statlist-grammar.rkt new file mode 100755 index 0000000..18b2561 --- /dev/null +++ b/brag/brag/examples/statlist-grammar.rkt @@ -0,0 +1,14 @@ +#lang brag + +## Statlist grammar + +statlist : stat+ +stat: ID '=' expr + | 'print' expr + +expr: multExpr ('+' multExpr)* +multExpr: primary (('*'|'.') primary)* +primary : + INT + | ID + | '[' expr ("," expr)* ']' diff --git a/brag/brag/examples/whitespace.rkt b/brag/brag/examples/whitespace.rkt new file mode 100644 index 0000000..b76ebf4 --- /dev/null +++ b/brag/brag/examples/whitespace.rkt @@ -0,0 +1,6 @@ +#lang brag +start: (tab | space | newline | letter)* +tab: '\t' +space: " " +newline: "\n" +letter: "x" | "y" | "z" \ No newline at end of file diff --git a/brag/brag/examples/wordy.rkt b/brag/brag/examples/wordy.rkt new file mode 100755 index 0000000..66c9042 --- /dev/null +++ b/brag/brag/examples/wordy.rkt @@ -0,0 +1,7 @@ +#lang brag +;; A parser for a silly language +sentence: verb optional-adjective object +verb: greeting +optional-adjective: ["happy" | "frumpy"] +greeting: "hello" | "hola" | "aloha" +object: "world" | WORLD diff --git a/brag/brag/info.rkt b/brag/brag/info.rkt new file mode 100755 index 0000000..0477e13 --- /dev/null +++ b/brag/brag/info.rkt @@ -0,0 +1,7 @@ +#lang setup/infotab +(define name "brag") +(define version "1.0") +(define scribblings '(("brag.scrbl"))) +(define blurb '("brag: the Beautiful Racket AST Generator. A fork of Danny Yoo's ragg. A design goal is to be easy for beginners to use. Given a grammar in EBNF, brag produces a parser that generates Racket's native syntax objects with full source location.")) +(define deps (list)) +(define test-omit-paths '("examples/simple-line-drawing/examples/letter-i.rkt")) \ No newline at end of file diff --git a/brag/brag/main.rkt b/brag/brag/main.rkt new file mode 100755 index 0000000..6ae6606 --- /dev/null +++ b/brag/brag/main.rkt @@ -0,0 +1,5 @@ +#lang racket/base + +(module+ reader + (require "codegen/reader.rkt") + (provide (all-from-out "codegen/reader.rkt"))) diff --git a/brag/brag/private/compiled/drracket/errortrace/internal-support_rkt.dep b/brag/brag/private/compiled/drracket/errortrace/internal-support_rkt.dep new file mode 100644 index 0000000..9d52233 --- /dev/null +++ b/brag/brag/private/compiled/drracket/errortrace/internal-support_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("8619edb19f30b9ac617b7960383e516134ff3a3e" . "3fc85bf5c92e338c8dec52b3279d24ac13297fef") (collects #"brag" #"support.rkt") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt")) diff --git a/brag/brag/private/compiled/drracket/errortrace/internal-support_rkt.zo b/brag/brag/private/compiled/drracket/errortrace/internal-support_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..854566a7eaa9399d703fdacb03a571a9cadad065 GIT binary patch literal 4053 zcmbVPYi!%r6~6aSqOL?gXj!&w%d+KK5h>Y}A9*-)7Zgq07|qf+DHdSEqPVn7JDMd@ zp{Trmq(Ikge~QsbJM0k*1G=n0Q4GWSZ|TtOM>gzF+7!bEtiUi71NtKa1{5gTpvZ=u zOFjMCx>=TZcaqMc|X|Mx2R{4Gw8w)gp)(`$0##cmth_m z7rVPl78XDyf59jjwWmT?ja9}Y6;-%AG2U`|R%PwiUU2wephd|q6BvLkP%tlE!u|h6jNISer zl4F&%Ei3ZCQ<|-tt5ykOCs(cNO3~2Pik4X|Jpr+23=<8awRPLju@4|d2O6xJ5;w;6 z*A0lBz`RsZ9dlDKA+~55mo>dyE?z~;O%?A3-v zI)H-nd8=47@=n1rwY37eF6+((G~T;yt;SBpa#)HkFbE`v;d@x3abBXTSAN+`)oz8cwH73Wf=?f z67JtrllOETl{iDfgwR~wTmW0X-s@ouC8D@42aEv^FqE7t2NW1mVK@yV#~WT0SCWNb z5R)6h_6!DtH`2k#wHrVcnMyK=#JUe-c%B7>9Un$51%voAHkv-|DoR~c7=bPtE|>*J zbBv0EKzYfq^>rh2mySSav5Cy-yTp^+B7|kQW=X#VnWz~>Cj1{A$b^3sMeS(OQX4J9 z!_%9pk_qyQnvs?vxF@1w`AHDMhf{)WbLsM8AGR*}2AC z8YFRVCLJSZ$aBOZo8)!!Hu(srR)ETMh>p<|PNXS%kRGSc&}ZqJ^d0&K`ab;|eL#=G zGOWSZ!Ga2W8(xNA!SCQ6d;(PH5R$@#a6~vO6oqdJKNtSto52Zo4(DcL4DB|vBs!e0 z+O~n+TGs7~VQb#B&@NzI7Y&=2lK0(G81WM;xC2x5$tRs`Sg2T41O+5E%TGtJ?(9cs(IZsEeDG;F8qbKL9v`W6;_?Lqp{5wFeT{oOa$TQHpx0{2^vGH; zNapBJBZXMrI68tXTu@TU9PCT(!{bB>K|uPh!hR3ASsq&YC*sKO%#CmAPY5qzLQ5WgYNQfU`Za2ztJj0+R!W`c6fOiPoK zEzL>PoJ7sZ)Fc8A>QE3<8j@&;f{@JmJuJ;~n^T?<)jQTqxfos!orrD3W*l2wL@wkQ80?!|&k>{_8l1dFF zBb}S4H) zD%VBD)vbyVz{4I_)wwD+74g*fvljyFj{mdMn-deNXJCRG*r^TD7v|XQ0J|;xtN$j0 zq3Am_dXIVa6dEX=Up1TPkB7=)#BNfz68$B zo;}jX;*;zpnSEpT{IzM0?#SOL&mW8LXD`d_tz8qiRULzM?6_C_s(2}~aby)A=m z?2GJn?|;c48$ZC_i2R2XVzgcglk@CWADh`Ng-I4;Kk3^gg*)eT5RVZ60`JYS83>Ne zLTGG%b6y{4pVxsA=-gvoLlD?im$X8xr2@UI64$uJ{Ank9CeDclD9Gc$`(p-kUD6%_Z z=&y9_AiB-$;TEgeb34l4*tWZ6u{8U27rXhn{LUWce%Ww_-Rx#>dyWsG<4JWHPmFuL MMS5o*=AC)|4MHrjBme*a literal 0 HcmV?d00001 diff --git a/brag/brag/private/compiled/internal-support_rkt.dep b/brag/brag/private/compiled/internal-support_rkt.dep new file mode 100644 index 0000000..71b3677 --- /dev/null +++ b/brag/brag/private/compiled/internal-support_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("8619edb19f30b9ac617b7960383e516134ff3a3e" . "727d83b38cce050723aa91077974dacc8ff78de4") (collects #"brag" #"support.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt")) diff --git a/brag/brag/private/compiled/internal-support_rkt.zo b/brag/brag/private/compiled/internal-support_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..a50c6acd59a3feaf099c9c69a59e3197a6a509f1 GIT binary patch literal 1172 zcmbVLO=uHA6rP#an&3@g#T^#G^EbiZ3x+V}qa$JG<}O`QE&bH{bNkbqpwj zN?b_}6NJznn7ea^p4TQVMq|vLTv!e0?1bQHe!xCHpP!$t`8Y;ANweO6h%Ih0s_ zPLC-|PaxVG#==@^yL#GlXP`gAn2f3IYHD2G7IG6G_j9!#2B{I8SfY zjl4u6lA~b})gR!BfFTOYJATDNODy7=|EbrL4Q7X~S%yhRdJY#rFf9ti$@6@eZ|TQf zT!}7Sei8jpdGhgg=u!3l+Y_3{?#F&4qY*TQuA_OR;8)P2Z*UNHXWII3HfJ$Lbu(5r zES96V%f=;@l_`r+#taslQuT=w0qJCwsm$B zmjn6ejGoG?S~1n^ZZfXKg#>YLb1Cp4$1OVQmTiJ)^pB=>_`D*i`ImMH=_+{JMi=jJ zhhkiyPwc?^6h&#hclFaxB?eMQNXM}#cgxMKxIORjK@Rfezs^q%*7LcpD7Wb4o;Nn& VVS}ig4URT%^|)H50&z92&JV(5Ieq{D literal 0 HcmV?d00001 diff --git a/brag/brag/private/internal-support.rkt b/brag/brag/private/internal-support.rkt new file mode 100755 index 0000000..0beec3e --- /dev/null +++ b/brag/brag/private/internal-support.rkt @@ -0,0 +1,36 @@ +#lang racket/base + +(require brag/support) + +(provide current-source + current-parser-error-handler + current-tokenizer-error-handler) + +;; During parsing, we should define the source of the input. +(define current-source (make-parameter #f)) + + +;; When an parse error happens, we call the current-parser-error-handler: +(define current-parser-error-handler + (make-parameter + (lambda (tok-name tok-value offset line col span) + (raise (exn:fail:parsing + (format "Encountered parsing error near ~e (token ~e) while parsing ~e [line=~a, column=~a, offset=~a]" + tok-value tok-name + (current-source) + line col offset) + (current-continuation-marks) + (list (srcloc (current-source) line col offset span))))))) + +;; When a tokenization error happens, we call the current-tokenizer-error-handler. +(define current-tokenizer-error-handler + (make-parameter + (lambda (tok-type tok-value offset line column span) + (raise (exn:fail:parsing + (format "Encountered unexpected token ~e (~e) while parsing ~e [line=~a, column=~a, offset=~a]" + tok-type + tok-value + (current-source) + line column offset) + (current-continuation-marks) + (list (srcloc (current-source) line column offset span))))))) diff --git a/brag/brag/rules/compiled/drracket/errortrace/lexer_rkt.dep b/brag/brag/rules/compiled/drracket/errortrace/lexer_rkt.dep new file mode 100644 index 0000000..3eec1d3 --- /dev/null +++ b/brag/brag/rules/compiled/drracket/errortrace/lexer_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("630617306ce8f15ed7cd29825fa4262ce2e6d82c" . "39b27ae3d173229df5e4d93c536e2c3f6e9b96aa") (collects #"br-parser-tools" #"lex-sre.rkt") (collects #"br-parser-tools" #"lex.rkt") (collects #"brag" #"rules" #"parser.rkt") (collects #"brag" #"rules" #"rule-structs.rkt") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"racket" #"string.rkt")) diff --git a/brag/brag/rules/compiled/drracket/errortrace/lexer_rkt.zo b/brag/brag/rules/compiled/drracket/errortrace/lexer_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..68b750daadca4414f47443c8999029b0b9055196 GIT binary patch literal 19254 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 Vu+)Nwuw`skALY!fl>UE_{|BlK6}|uf literal 0 HcmV?d00001 diff --git a/brag/brag/rules/compiled/drracket/errortrace/parser_rkt.dep b/brag/brag/rules/compiled/drracket/errortrace/parser_rkt.dep new file mode 100644 index 0000000..592d07a --- /dev/null +++ b/brag/brag/rules/compiled/drracket/errortrace/parser_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("ddb2689b1fb8a26f0df5eebaa60891ee3e8d651e" . "262425f23a22dd416b35fafee443e5f442307857") (collects #"br-parser-tools" #"lex.rkt") (collects #"br-parser-tools" #"yacc.rkt") (collects #"brag" #"rules" #"rule-structs.rkt") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"list.rkt") (collects #"racket" #"match.rkt") (collects #"racket" #"runtime-config.rkt") (indirect collects #"racket" #"match" #"gen-match.rkt") (indirect collects #"racket" #"match" #"parse.rkt")) diff --git a/brag/brag/rules/compiled/drracket/errortrace/parser_rkt.zo b/brag/brag/rules/compiled/drracket/errortrace/parser_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..48f280267d0268890ba7bf7e617d3ac8fd7d228a GIT binary patch literal 27278 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 literal 0 HcmV?d00001 diff --git a/brag/brag/rules/compiled/drracket/errortrace/rule-structs_rkt.dep b/brag/brag/rules/compiled/drracket/errortrace/rule-structs_rkt.dep new file mode 100644 index 0000000..6b9d587 --- /dev/null +++ b/brag/brag/rules/compiled/drracket/errortrace/rule-structs_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("0b577b4daab1368df053c63e7ce67b932447ae91" . "6ab49f18354cfd81572a57ba4235967eae50f58e") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt")) diff --git a/brag/brag/rules/compiled/drracket/errortrace/rule-structs_rkt.zo b/brag/brag/rules/compiled/drracket/errortrace/rule-structs_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..598550990dadea90e18647e13eb08c83a52588c1 GIT binary patch literal 12242 zcmc&)d2|%VneX|!d(<;Mw?-o&5V-I#hhTI7;t*g3a~}@)P8cr19}r&{$M#EX=i1nBlYP!h-ix0T=WTYgN&ZN7lU+N>W`9-Hb4VJp zB>rQ8s`-zob`@Z_Bx|>Vys+iF*tD&i3>OxW!C4>@O*Oyt}-L)y3PGvV`2D^LH z%h0;tsVFV@&Hwoj*S}BXuN39d!a&zN{=qkMJ6scQx_mC3{rK09-+I;R>p!^!nhr%V zlv*XOq?BpOOl6L;K)F`QD7Pznl_Sdcl@F93D<3K!E5A^Fr}!OX95KfN$8yKV>TlFL zv~Ai!ZH2BV^*~h}dUs}^ziHJdp3AeFdeW(Z!R)4Wg9CM@*-libO-N?`*19zdHg4)0 zOfSB4(uQ<4lkPF=997wlbsN%yjrN>Va&)uK>2z+`+>qTcNELO?V6Zd2zB`i#$v0P2 ztnbU_FG8VoHrtmS#CYk{hV*T`z0NVF*w|PUQ$5{l&8WX39u4U6Xi!VWLhV!;tyJQ% za6pYy)f!TXqE*J;M2;c>ja>0KIi%?3VnB&Sa#WQgKUK%7b5xU~K#qbmCR*d<_f!|} z;bQ)tF*&NGP_))@6gp#U9Yct9PQSmm56&N0cT2iAEoTL&e6L~jb`Pu@)$Ddl%h(;c zctBk!TUOa7gNafDw`B%9Ze5W#qPQxI91QlP2L}dkEssoQfdqL9Vx7}8v+0ff**>cb zrQW{Iwdt+`r6v8@ZUl6utJTINZ^=Lv6}=t(*g1_NTWu57wvFrB5bj+%UvyonFS@9#>}*yXSbUn#IncZS9;$)q=@ zI{N#2Zo|k0IR%@p!#GvEWt0nP?5dJ>=~lZ9A-}mV+nFEHQ3J)+b$vZO>2-tMeVNqy zZb0{U4BmplD@XLn=GfSFgkp{is)&xGg9y<&9-;{mgb?eT6%~jRX|3w3%Yy(2=B>B7g4a*>T)y=>t?(%jMde zbcJu#`lXSxSdgXw`mBuXot z?dVF^zvCEB?j?n+oP0+Sn!}V3hU@#xcPXGG>f-^0{{uik;eX@tgr_K*C31lNd-YHv zUhm>RiF)%Ua$PW^BK%BpV{&m<$(}UvNS9~DqCG9+kNoh_mcOi=y!@lDpV^2FN$g2g z${6JmC8{Kp8OnTRm2#ufrSvJAm3x#&mD9?r$~TlBC_htvqkN*c9kq_Qqs6hrah)UW zxXrQ0aoBOvao+JQ#|Ms|JO0bzq8ef}iBdF!=F?(YLDx__eVI1V9kiPc(F^o-`hb2# zq(;;!>P&Tkxpnna9l2<}2pg=KJQ)%wLpf{tzvm9m zkmq5~anCu=+n(=xe&YG9=TndF9pjC9r+VjkmwMa1>%AMjJG?{QBi@tVH@)BT{=oa8 z_qX0ZdELG$-zB~l-(|jKzBRrsU)Hz7H{?6)d&c*o?@ix7`+nm4SKp^T-5>JT`4j$W z{>%JV`)~Aj`Lq5z{k!}R`j7Ze`d{+D<^Qh#1OHF`fAKd3W(6J#oCur=oDaMcct7x? zz(;}VAPY_owglUP%Ys)2+k>6K$ATw&NH*H`veZmZl=d8qPi<+;k=SN^5a z6|M}|h2!Db;f3K<;jVBdd_4So_+0oK;qQe%4F6mBKf<1>%Bs~>H&k_2WvXti+E%r{ z>S)!es<*4YTct$Yk#J;uBoS$iEQ+j-bVvFlCn9Ge=Ogb#-jDn=@~g-nBEIUXYDM|w zq~fV*k>3C}e1Yv?--dJvlDHI;EzCeRmCiu4v@Nz7 zx6SYG8(4&beBQH||MuXVyOaxk>(>vY2QP=%b~!&`FBZpaI7bTbxC|*LI++8qwO_=?INzg8Lld5pBXNqlU~oXM{5BIcfl5l%;va zzJX=7$R}dQ_B2&-$*D|hXexM8#`i2$3Fbq3eLrBW~z!W z-^njaMi=vHZYmkwZYj}`vz%R`W4AOk72*U_Zf;f;e;!6$H#8N(SWJJ0ss!>1vZ0|V zA12dP#clUZZ)oB%f#IC|r=dxBd#b8baAQqvXquq3>j66$#3LC$N;xWvPd}|4nM~gx z&O3F^zxknQWpNn(khM_yX`vmfJa*?JkTnyJVR%^V$fh%cj@pKXhLMkNtutoKXr10v zzHespwAPlE1!AquN5IdA-{)fuEtE;{a-N1R$MwK`EcCy6B8h!Dpwb5Fq5jwgc|sHi zMJMSv(BZu3jP>NGmom}bG4WWYo%*7Ecn0jp$!;S*%;|C3l%U6Oc8te1@~dou9>G;K zTZ@w@4e;|Mo-iDNT|^pf#zAp2xlr6FCd%j9F;bQz+&V-K9PZ|m2hCm-ABrF4@`B1g zNRM5_!3-A6V8IL)%wWL`7R+G53|7p-GYSmgz`EEB5mrIa#%|5gZ8^G~?ug!I z$NO=poQahPabfMDL}_Wb8iZ+>f${>)nr6Ivf`P zPcqbqi3VXk)w54Kzn!A~;mopf#V zVbYV)M`)~gOnwBqz4R!F7*2?HR*#|y*(?)9#p8Qe=V1y|&~?+BjBR?##IV=9`D3<* z$Ed@Uj2)$bp6})D2HKBOl8dgQ=q`$;6l2E;DflVQ1!2^VFzS!t3e3Grm4CtH^y~czlW4EWJ*zH62DRe(8*xKEkqaPj5qT~4z zHg~ooTKhTp<@CG+57=sF#r+bT-yTH!S=|1jfSuE19I0q7qK44>B6?pIcgbFUS0&nC zmIH^S7&}*jzXi{zSPO!|LOLfEt8B&B_ErP z5`cREfR!i!meNiMFwR!IR{~6IGIn}Pyj6$pdoj-a57 zH4Ciel#_~=*oylkR*9dPHEfDRDGy@_`!J%eC#KPy|EQt1UoDI=lEv*m{%v@m(L_6%} zLPS*X)_D+Zr(FioHdY%%J_Tel{`wIaj-N6MZ~8XMH+_GO+!*!^rQ%6mCq$i0ekvN9 z>iK2UWKmDyjd&H{9#3DOFDCE`uk1&Ui+OiR6^@C$9UJf=A>Fe+wQdlv|M5iu-&i{B zPc-sf;5Qr^&wO%5T#^C8CFxTx$>89Uj14Zy&Xi>y0 z_!cr}j&ZUgzgy>sZ)%^Jv|N51Po`Ba$(+a~nNhhU6Kd>Sku*|if%Lf|>4IpJHfoG& z%FBs>%Wq2cxa?VXvj3l3CSZAm*ioHOY-y-+fyWYSCQkMBFBQ5=QshzJ>)5p z{yW{j!^}c$BHZqVxDCTal6xBWXX?Re?LpP<8emvsKh0C zdCvc&nQ!1CE5%Yv9^nVf5E4HQZ8==>Bo+O&jP7rz6(?ni&lE}wS6ZzS5L<`spL;-e&D9FA_6k;zCRkBxz!t7O| zMeH@ADt4YI!oEgS&E6!cVQ&#FVOy~z**3U^-3>pmdsJG+cELAnH$scuhX`VO5K!y^ zl~%AJ1R2{4>#zr54)%~rSFnRH5j%uT$R0*|VviypvBOA3?1)OM*yBi4>>2E*>?F2Qc1oqI*|XSk*>l(i*$dd?*ja3O?5o%T*^Aid*h?y1%U;3O z$X->cg`HDr2767Vne03gI(uEE+3ag7wX!!yL_-m-Kco)H6B~28Z zF7WL#DZgEsKwbcpCAf11?pg)xtLfUQm}X!$__(k$o7lzuKnj9K7<{UMJ_ab`1m-1( z=S#sh26hSXo{V{>Fkd;dX_#dTW;7FXnGJq(z-=BZ(uOmF7x^)SlwOP6!@oGzQ)6H@ zKhpeNfBrw{8V$zm#Hdfe!#?|(c;2fIdxusJ#pCr=Yj36-sQxDU65WUs_!_#dA#Utc zjp?7R9;#0yzOdhj#%D~Xn?6$6-5O3fE|+LZO{SYaQnA6rQ^}P537cq#M)zoe3bs>Y zyEL|2WA|$8K8@Y4u{|0`Z5)o;cr$g-T3QFQ1GhPDyrCL%N^oaN+y~0yHjKhGSWaU@ z8r!R}eHwdEWBWDskj4%OXl*#OCZRhi&7r5qjq{o@cQo|Di-ta=v4=JGh{hh(*kc+y ztg#~+J1U^P!=b%v#H;~3D{dTf8dFPPTjY!%FAFyc0vG# zihvz(ZioQcN$dGc=fsTz73F67bXmy8QIIb7jK)rC?3Bh%YwTH#J+HABG>i!%)Om3GhJ*Xa+fH5F=Eelf+cV7Q z_KMo2ms?TgB73*a?$z0SI=f$I59lnXvmu@B6}WZ7aqIY`Z-Ku#^2E6DmdEHHJ?VXA zk;}RJL7nZ_*+V)zptFNIdst_W=j8Q^;C|1cBw2P!0ih6^Xq8-}KsU)(n(Zq}NS-6qwW^>Gvb@2Bdfcp{0*>(*4i z>-ck|qWW8o>Tf%$zvK8ca-UiK9=5D6*;0aTl#(M!?MT*%1ga#j>UlMpS5tVEN`R0t zoKV@^I)YN8IayM=8IhDTU?}Jl^VDdh;)3vsgq;*nq)RPw^8ab0D zUN!S-DzB#TYC5l4%1|tugGW%*Mo`rLHj14EifNFT!I{kD)hu4k=2a`N=J0ARr|2AR z#ZkF>1U;{rlonhQPnhHtN-)67xjcPM9QV|5lkkHWHRZZnOq`pnW!g< z`chFx%P=XI*GDjkjARnIXeN^cZcNm1QHzCVBsmkk7$4j@qm%py9zM<^A!DRHZjw*X z_#;B(U5AVk5hDNSh*KALh*;T%SlWhI+lE-&C1J^7%jNhHz;z=HPA!y^=ya*ZHN_ZOf6%8(FuP9kJ=FisJ*ZO1h_~UhR7L4iy$(i4D9H9KLVDGfMpkk d6?PX{!4PQy=Vxw(*2EgBpze0+=KtyOe*uEez7_xg literal 0 HcmV?d00001 diff --git a/brag/brag/rules/compiled/drracket/errortrace/stx-types_rkt.dep b/brag/brag/rules/compiled/drracket/errortrace/stx-types_rkt.dep new file mode 100644 index 0000000..94321df --- /dev/null +++ b/brag/brag/rules/compiled/drracket/errortrace/stx-types_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("04c0dfaac34e0f545a22ed58f0b88448e57f3237" . "6ab49f18354cfd81572a57ba4235967eae50f58e") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt")) diff --git a/brag/brag/rules/compiled/drracket/errortrace/stx-types_rkt.zo b/brag/brag/rules/compiled/drracket/errortrace/stx-types_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..bd2ba136ffb1ad0ce446bb81ce68372756b10920 GIT binary patch literal 3626 zcmb7HTWlj&89wJ9dwj;@%fxZ6juX$u>zQPC55_ z{dpIkS0n8wLMA&zpZJH}|B^9yc)$6v#h;4b{^B#q*PebShe%2YBcmiwrb&@pB1_~N z`8e4o_sF-%_sH+bAIKlcyW|1+Gx-~d(Lp*%uhA9yK=_NW7y44@#n2OBLNv50&~Vji z)Qh)H>~p2z?iucW-E3rKc@3a*l~I!0>$116?>24Me0=i!w&_^rj+~_fPPwvey0fhp zHUernD~jUwy%}fQg-BNH>)S9ltCndrT&G!a+v-SU({|bqsg&tBw&Nn7X>6POT%V;Q zUFB?7GN2ZKroBuxVvh*2&o zq%i2gfCot!Dhzor?1ADzAB^OOMZRXJyM~MHH6tF3LMlH>zmJ%a7KZs^R!k;qHhR8M zxntJM;H}V9dzP_UwNW{tjz)u%X-#;VBHRcxw^~PrM`SeiEw{Y)(e@$wPaWpIz8%x$ z{yWt&$em3uJyH66&%;kGJR#L4*jEfX>y!EOioLUA zR@|y>8Jkr!T`#+Lki7rcT%ayw)-V)3U=YcV!AlsTSstRgAA~4o#YhC>BsjGmZ9Kla zYv2(X?PToCVeshO=bR_j72{n|?qGQW_}&X%x@!eYZ8P#T!z&o7OP{Pt(O~qmSsgn!2rFB{+sRSo@`Ym zu8{FS=vs>|f+^q1^%QO;t$7|V7{h+S(AGR9qQR&RV^c8xc-xBR$%-IJc(`dyPf3yv zr=;{34uNV4l@*fCB$se|J_DAW5bj!*B)q5-Q>&h)wV=W{BxtH?Rb9h18!i^gyQWj# zGN zmo3Y7G0L*y|J|x+$|+YH*c<%HZTO_(*w`l<=0?tLx;c9@hyHiXJzs2X%iSvsw)4VI z4-vu`#+W4{3_-?kTfAWjT47`jM)RZC{W2KSV?2z*8sv01518H5BB#KJigk(GjwpA7p&VUioj`;5BZpYtAWe!mqFl`ab*aRD9GU8>r9eGbV!vS1U3D~2FQPhrv8$E?^+JjL zFxJBz3)ICD`;K^_i;f5C*%JF&xQ8SWs4th;my!sTN7yT|vp|bi*_-jRK$owu7m~f8lO^N6^343Pw7USq$Kf_+>vqM$6|KH`Cu%ZMl*LnJ`Ctg+V;!A_SDQPOYY?~#Z7kHR~u-%tMwyBPD{ literal 0 HcmV?d00001 diff --git a/brag/brag/rules/compiled/drracket/errortrace/stx_rkt.dep b/brag/brag/rules/compiled/drracket/errortrace/stx_rkt.dep new file mode 100644 index 0000000..174139a --- /dev/null +++ b/brag/brag/rules/compiled/drracket/errortrace/stx_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("8688436c031186fe3078355e044ddf5a407ad406" . "28045863c1e3f6ea48c70da1eadb8c329bb5a833") (collects #"br-parser-tools" #"lex.rkt") (collects #"brag" #"rules" #"rule-structs.rkt") (collects #"errortrace" #"errortrace-key.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"match.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"syntax" #"strip-context.rkt") (indirect collects #"racket" #"match" #"gen-match.rkt") (indirect collects #"racket" #"match" #"parse.rkt")) diff --git a/brag/brag/rules/compiled/drracket/errortrace/stx_rkt.zo b/brag/brag/rules/compiled/drracket/errortrace/stx_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..c1cd504e262107a847875e6c5099ba65422def6f GIT binary patch literal 9644 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 literal 0 HcmV?d00001 diff --git a/brag/brag/rules/compiled/lexer_rkt.dep b/brag/brag/rules/compiled/lexer_rkt.dep new file mode 100644 index 0000000..da432ca --- /dev/null +++ b/brag/brag/rules/compiled/lexer_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("630617306ce8f15ed7cd29825fa4262ce2e6d82c" . "5140653a66a64815f56c272ec59609ec542605b2") (collects #"br-parser-tools" #"lex-sre.rkt") (collects #"br-parser-tools" #"lex.rkt") (collects #"brag" #"rules" #"parser.rkt") (collects #"brag" #"rules" #"rule-structs.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"racket" #"string.rkt")) diff --git a/brag/brag/rules/compiled/lexer_rkt.zo b/brag/brag/rules/compiled/lexer_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..41c156fd6dc63324d8683e5cb7039c2ecb483414 GIT binary patch literal 13580 zcmdU032+CQjYhv0cZCCD3;4ByKX(w9__W(oQCw=}afn$s|;crvLwT zap+={iDgYGF5i3q``-V*|9}7c_uqZ1=Hs?VAQ}h;LIX??gbKWt45yO&M-NP;6aMs6 zGBbK8u?eXbQ4qSY%>7)4?Ke7eEkS6`Guj^P`=#?ok&l1xZ+`mUzt3zhzdvhzA!0!! zjsT%XXcT&|@qN5ZqGdEWIT5`60*PzK6Gsy1I5B! zO0wYelt+gc+rvzZF;kr+VMD?nyB+^Hw80rw&7td=c|%^9mK9{d+os9_{UTPzHr7;c zNue$k)n#$P^=i3ePu-riw@#%piS^CP#uDjdVq9WoyWOtZi;VE=TJ0a7dMo_v-@pH4 zdgM2u}%L5xyq8BAi0w{FCrA;g@K# z3eh8~Vwbp9+#>E06XLDnQSl-1aq)HW9r0hpUx_lSW_7HId6}O@ST9?}`q=>6%m&#Q zJIS77ue0y6AFv;?|77E)Nz-xDYo<3%KQ#T^bk-!9Ys~?3pLwf!#C)6iKJ%x|&zoO2 zzi<9m^Z%HCWBy;W$s$?YmVhN<*KyUlUN@dL*{JAUk#k@`yBC|Onddg+R?SIQ#gFO~=8jqGh(*8^;H9pynK80lW zMacfiG>))396COb9?LM3RhH9J;|c#{COtKrnIvKzv!jDuYskTl(c}SX?a1hX(aeT} zqaz9b@WFU`OTOmMq~poSzR{6&qa(a)U_6n@B+}R8O#I1I^6eD zNKKArMpH@uDy(fzCvfh!CG??_nMKt99%!^|R)pjf9quA37$9HGx2&c*O`9>*$We zLeV;_(^)KiDlNMYt+%*A4{dz?4L>wuiZNl&vdLgm`Eqq)1vq%6B#RG$K!pm z_P$taU(9E=PNt^P!-@XQo3@M97n2(9jD^A%@9GK0BHfqh3dOp+co#;k@dS6fL|RuP z)DsJ}MrG5G%rHzz7_fR+Z)?vGi?zfAwY7I>Mz*PJg_o_?a33?ZWrg^dcZRK$&CH^z zOw_B^Le-|usH|vZ$AD@+%g!8JGPmroWRhhAB9Mbm)4e_$-8UDAm zZ-%XAJuUsFS?|mYD%nF^yvRisDr6H*GAdhGO=mB>WY&mKq7$IX2h*j?iBf7%YJBiU zS&%4YIwcl^&)FkHC^sPWz3?fSvylx-wGTd38X(LPgW~qVV>art%I`3KEpo3wzJ-rk630jv|a5Gn&%^I>nxd%d0My5ux&$ZMawp`*1CO&Z6m(5 zY*1_6!N=an$KGh;W9w<`jk&RP1g&Q~w3eH#yt|RQZ_af$PEGZ?K()2o`hGJw>+`lD0RL7FF`qjt*4J4jX)<$UI3JfPDvYLoa`<54 zkP)pMj*-Ov(WKETFF%yRU{(OIX0a+hF)@A=?-N z9{JHAK-OKZs}Y52coLwqb(riB4Z{pTANKD-h~I#8!7Q|68#QOcbe*TPb{3Up0b4ui zsp@)ahMq;DV$cH*I>6m}fJDW>52x(Va;~fx1Yp{c6LtWF9k_%rZq!Q)>xEu;R)Xr* zF%s4b?eM4st>+5sg&;g8<%Er)urUPeEw~D}JK?DkbQPkt>(&5w6#lA2<9-p(k$T~C z1VisRmLs8;eW|1^*XoAnN;=Qu1NHC%F|zgNP@uqz#K*QXPgw>p7q~zje6^%A*B64% zlmP9N;@MS&;NDVV8Z=;4UGP9D@$AVFdf=0#xrtSEz{%21h?JHOB*?WA& zDq~93upCa6_U2nn@KPx>a7J7BjdD13Xkr}qL^6}dtcAzRB6QcvM>~|Y9llW3m4|GD z&zE)QTWjF4GHA*->)~%pVMDIj3D1&!=2IrBx$<#wPye0?oGCJX9Ip<3C;D#q;z5Z`s?*p z%uqDPzZj@@>{)Qxe&_m%W5MNje@9#xoDF!r?r$@yXt_!oRcaSp_n45}j;;63X}!zN zy569!Aa;F+hEnA{d@gc2hcI@u`MjRmv#yuy?su8hY*u$CRowjVh*pzHb*Sg`WC}fY z6(MH_XZ@ghS*QDq=$;eZZ;4l7!cDuAO}Pm-Ihu+l+_XDW=&?6l%?YEWmZPNxHV^i1 zU3Z=P+aIpE4C(7Pui4ta_S$vZuaf+Mtyfk1tyfq3H5)e#th-v4-!`~;)7q;gea+ye z!K)>EVC%ZUb^Qg8$AIVec^7aU76xb9RSa45JBNV_)5CM47muSH zNR);D9g}&BGR;VQR>T0>_;GgAqtN1wN^8bbsfiyecTpJM=|0Wuo(0!-_Zf`iTNhmG z7hEqpaS-pz8hvxceeW#Vx4=HmP$1eN;PdX-gW>WOS#UQ`9BJCq9P2GqIxxlg!9{l zb2n5#^S&vP9^Y_YLJ>rq$ssPTj*ciY!rP3L;XL0K&$^gvJ+eR<+fW1+qo^jT_jh)8 zmTknh5&K7v_)}9EWOJJCq@fiWR`|s51}QN#AwER7TnAE_#;N33GIcoFIF>kiIF%l0 zJRV2Q5IQGH3+{Kxb%NY=-oEgjcSXD=PF@2wvKf=T=Y9dxWhx8*2Re}1qTJ0r2yedJ ziO%)lE0!=AHDzQE$se>| z=99;rvzm1C!n0_H51hww(;#_#; zoqQUE-uofBZb>dt{qRIeIguYqGH>k7{&m-{&+p0wjC2?qub_!3I=&-H`d@saq1zhW zRj-)JmlAkImX!i2e`*qU>?Nb3rcw#&dL_K}VzS7tS3(vA1w*fMm(MB)xO|4&&_g0L zv?11qPmXWVARp#MdIcXt-x8grvxBo5C|-mvhbHe?SA&EJ1`?>+HF(BT`zGG~=Sn=ar?KLH zdod9v!K(Zv!~Ec+`Ai$;S(K=pw)1=ed1P6L@`}@MN>_XmPyVTT`p+z;mnbmhDfSSo zIqzI_r5%q%@laH5VrFFxD^b?6Qe}XZDeG9dvYyGx2DU`m$SRagY^ib$b1K)eN@X*1 zDO;FZxsFvS*E5fD1FKVRVhzepdZn-IG7eUi-LR(UXtj+kt!GVz6RdH3kt$h`bWQ$H zYdAG7nUS(3Pf6|HkLNOy6^Y_f{_Zs2#gCRGv7Ui`Qsu{E8ZFz2?Q3|KUw^39vSB1` zHb};^o|X+2aQfq?mW>v0xo1Kx8$semeK0+!Y1v?5pngx+vMUN0dZf{^T?LH(oS|jA z@g1|xb|^lfpKGnbT4*2?>x}t3v-nC!G705I#*Al%heCM%Ce2k|NDl>qv8=P6wTM;v ziB`MGIQCpG)D`uMK@GF>(R13gm;}sHj*+e8>3$L`MpM}q-A@tTR*n+ zZyM0D9gIt_%}dvhZh11{KNwGrj3?64oWRgL){Xp7)4wk@ax|K4Mm~m*;N4Hlw%5}! zE#Ov1XX*$94U2_)vfT_#vP^XHv&ICz!XG^r=f|yRL~_Dqq8p8uNRH6Car{sbg8bIH zVgD!|2jk2CgEWr@R!0laz}+@AL44xl{tK4FkRI*G_T#*iI?;Ll`Sa2E@UXOzv*EUq zOt?I2@OU^O&EYYNw0Sg1rwz!QKW#}_n=EMhR|^(AvvM*IegV+193Rtge=cQJGQQ-~ zYhKMu-!_P>+DpC0*A3@<(NKb~?9CXZy=oghhpK*!wa$z9P7=R@&~jf*upwDg_DHft za+b>sUlHQlW!n1QJfK<@9LTBCLys(7Aq?$ptR||#Jpk8A^P;jBMQB3)cyC6@(F5>&n{Xo{evmj#_5sOz$zw-U7cvY=^#R{b7dj;LO`yR>Wk z_&w8}JGIx(>0>>ij#zha-l|M`RmqO0O`$+;6yL|AH2i(%USvk5WxCg=AK6s)Q8C#TNi($h-#P;~$o3+H)s@%RP zxC6nxKKNo?Oq#bTA6pa~LhMQ(JXDX90OgKFv7Lxr?Srq^BVW66d{Jx|vHd=HrUCgn zlsgft`eJxaR9LhyE!uz&o^1qGnwOLlw8RLy_!5U{(XR2qBQ5ZnRhlnR?kRXgJxt@< z4TcF}-Xp@aYB%7?{Bo$0=1Y~6i=%1XZuG%ZerS;9%anT;N7KUHjHf&SXq4v5mHQS& zchS=A^1+ksQE6UQ?$^O9Wrk-%(-TEg?xJPei)$Q&lV)jtiShvR)WF~@)IeRES}Ch? zP&TRUc#akf>1-z{(p5#w--TDQaP)cP2F49^$g4!DC_$Kg2j-3fOyYTm=}m$W&_ z;2BPNmcg@}@*IOxHxp)hC;k%V#7;PMC#Ouq1Jgu#a2mcaO_VQA! zjT?v8xKVhG8$-vD5wMoiycTCbno~)dQ%Rb8jG0lJG^dg@r;;?Mk~FW)bE-iKaiWqq zQAwPtu_PN(n>bNPoTwyDR1&8e*@EsLgeuw8(LqP3A^bQ*Hig40X)o{v!>z9Wa40DF zp$YAX7#7X2i(2TYE3g>S@x3~ZKB%Hi(v5`|c2Ns)Jq278a~~28e;g^BbY8?H2}vq4 zkck@OFJneD9_LJx#qm_&czvQlXf4tm>)|jgD=6P;7)S@NOLMl^Goq1I%%$8Nt#o8@qLxkoH*;6Q%%>L*SO|X(>14>t~u3o z%{h*1-t_-1LP;`yOm<#K&4o;UAK~HbgA9d#_Dvu+WwLtCCvt19Pnmi?fVIpCBFD~c zyWFcuL(SgjWZ&!Pec^i!XN68mx$gMCqf{e+;&;0XH93w#9qrv(w|VVxjh zYNp?I9QqF)cRKLWY4n%3sLdZ?pq_Qj*C-FNd^3X0zrbT${rRR|)pJ>~3co47;1l3z zXN*$oZJ4b3dK@_L6F5-ywo7d3yr6uN4bp?R@w|k|bXOt4?BNObAs?LVriTbonW0ql zd<>=8DIa`|W0*3l=b#}y1vSf+l!9V%7z|_LhAAlJiRfaK#VMG@QImTZ5qK6y6z*w6 z;aMC}c$gvz&*C_R!WB_?7Dp5wwur*BIHK_IMHHUJ5ru~_qVOz^^PzA?loLi4=cPcQ zwqw$Y)1}mv=1C==9##0PsKO^h6+Q>5aM4uZ5~;!kQ6Ww#4 z1pz@ogl<4Z@r~kJ6eAH4F{7w4N=!17tgK{~=H{-fmAfYEUhiEq5saC+-@nf}b*lQI z&YE@ax))*pd;kBp|NZ~_@t=M6KBa%Vqp7N;s-~*0gKRci9{%O_3=XXAT{j$yMq@3)Nn53Xb za(iqA({fr?5#2;G5y_=)Hwte2aXOK>!d)Z5pouOcWnr?l@I{-)7ODt(Z2T8k56Z{| zLz!0Ios#!Rm%Xp&xNa)FY5w{N; zeMj0X?UD{k_em$Em!$L3`_iwZ|0;bZ*=P#Y(lxY*R>I}2bd(;UXX#aXi+)1Cq~Fm$ z)1OI_r^;n=Sgw<=lIO@>@=fvv`BwQ3`F{Cv`IP*Y{73n7*`X9Dex+JzQx+-TR&G(& zD+y({a#VRzc~yB&`Hk}5l`j=f#*BV#_u!! zoRMjtVxMjg+MDci?aS@owSUjP(Z1Wh-~N#O3Hx*QAK1^^|K9#%`z8B7+CQ=X54+@0 z9I7MJ;c-lH_#I(Ki({E1=Gf@i?%3@(>Nw$e+VP^}wBrrOCCBd_|Lpjy!>cx_H>lgx z2h>yQ2kIYGr!(MecCK`;a}GQAIv;hui-RFA6 z_4ls#T$fz`%Vl?Gx%1r9+!bznrYCb+rayCj=JL$dnHw|j%6uU6WajD2w=;j2`G?Fu zW&UfXlvR)w%$l9GG^;ynFl$fN(X3~)Udy_a_1mofnf32kh1ve>*6fAZtFkv_@5~;_ zej@v|?4M-+D*F%FpJo4hwkv09PI*p!&NVs9b8g64mlMm`nR9o}gE>#-oXPo7&c`{w z$@yKjpH-fD#rG%Q zzxr&NQ!CI)wUAb;U9EL$UD|iFHCn&6S=*@{)Q)MdYZtV)wDuYA&sgby)$b`kQ~vw% zz|8As?wNUNrY~?y@YkW=hyE1G4Ht*6gl)DTw_9t}T#;BMQc2HnEEXL|MD$e}iN<1s zvB>)Ffi-mo70> z^>-(F*1JpX9#3qzFB*v_V#7U&cvWmef@CQ#X-zD;ws&)6a5%BdWW@)EV?9yH8{It6 zwzj*suT5ASSr_Z>@9&ODWfSuw@mNpaU{72snpobx%urxBws3v#nrNhFeRpi>&|thb z(K|R0xdyovu_)AZC!)Y55(pHF<3oMDJvvk>)!k^DxQ&I0!41)YNaxB0i}c*0#T}gs z^z7n}WqM}WyldyqU)p({0baKFx+R97Ywoq3D~y_5i@Q3F3fCGH4A`}uU7d5yI@gLi z%XJ0UetTKx&5Jtcc1YeajGJLdN9PKuXe|F*UCS2F@9Z#C>m|dm-ZkwV0v?}kTb1F` zrwtFEY@0f<`*FZ6jC$Ylu_QhsZ4D+JC_3=pWnn-kD z%~B()&-o>0DbXEEm?${Xsq-x*sF`dWig;-y+d~;ul1{=FAy49&0l-SrAmIyhq&$+0Zm9{2vzZn`I4aso>egAPv%sj+zCZ*g*so{c*b>1p zhPlZh(&z3XgN><>oE@+$*}cM^WF6g(BoOT62kE39R9`F_>quYvP&IoHOErt=#<}B`*i@-V;kr+Emx4CC6 zUC_TZ-m^a1A9c?cb}bX3peKPR;XrqPRLT?OHFzWq7!e{~YR}9Z!nT^9jAAvyCnL60 zn>@-$ZAIT^mfl2nk+s)c)*b6jY>9Ly5Rkg#iFs=fo91&;F&DvfAqUjev1s>(mC0Ni zp3Unb!$VTO#lrIlivYD2FpnRO0xzDD*dZqnClVFln19)!Y2|h5~ABjcd!+i;*r zU6GUxL=&3^V;fSo90td*!rF>ppAs2d8|jbs55~4EO)9|1t+7UeOKs7?wJG`pi@S<9 z9LtmS^ktDUFgl}cj2G6H#*hyWtR5U5SR)lAH4P8Mhlhp+V|c<^W)0(YtV7=yNmIqt zjz{~}MtTx4V>=e<9auYPFD|aCs;V|8HNPC`F@vYOh0qoxL^!UJoZVDxC26IJl_)U@Zx79T@wbj>Sk!|k|-T19p;Tz)> zZRPX$3DTiIgzPhBEFR#ESa+XKY+8Mr)<*|?#x@OO?b{xA1zsbMyvjqo4)I2LmgpP> z&eAG+oyuP)M=)@XR*ldb6b!sUo{S)!rx5MHn`ilXQtu6o(3|8@C?gmo$;jJN@{W|e znv!>>LQcG#6mc?zlc}5(b25#S z5>84vDdS{1Cq7OzPG)f8=cJsInMeX}(g++yX9O;=_iqwjHv?~hDUn>hLv|j9<2z;H zc!(Vrd1nxLk1eoM9^oE3OL-m{UZH<8D4_0DYSg`VsU^&Go6HMxje2lTEAui<-g)pI z+ua!0Ba3>wxZd8`d1x#P5ZWV$IiGFh1N&r;>>Q!}@+!JZ#@Lnbm%Srl4^e2<2(w3+ zeLx;%(U`82GB!!BNT=)tC#^pj>v9-sbI_z3sWI5U;uNEoGCD~7;}$>nI$k_0CS(5B`}qY zxzEB>3Je&)+%IPfOoTD_TbPKzfC0>LIY(fs7<1ghR0#|iz&s>-1g4rX4_TOMfdK=U zN90_AsbS0`7N$mEzyRhkIZt3}8S|KhsTCM7fH@)O3rrnjPFR>afdS*37@|D0>tB^? z)hBi|@NndtynDerHq^|#0+V-jjrvki9Z!-%uz11*p3&!0t2#y9UsSa$1JCJ_ z8c0s%&0qREa^RdUi9j-%D*oG7Sa3w$g&F9$B@l151GC=`9EvE+gr z*nuM?cy^huU0_K0X&k*O_$&2?oHz+cGN}=g1u3=ZDln*xlU5|l zOi{9iRf*$iJ{vG6uFEO<*&RkQ#3sSKknyk_zgUAV6-5^7hbnAf;DCbXnnL@Oz}*TS z&|KU_w3EsYDj7$xTn-t_B?NY|6yn9Bmr5xHv|wOe?cs;~A?2v9BZM*@>DcG&A-Z#n z=uSg)Cj}0n(SvM5`G{i28Xch#E{Sy-;)Xpo1cUD(9>h5`AOgyi;2dIqFvMv{q~XvPf>~3+#hO_ntz;&4oD7SEIA$8pD$W}F z9L^fs63!Ysp1^(Zk)7B_rS|OX^gTE2CEB0j*FN}#?awjGFYI6+fL{+Oi>#W#z%c~e z`<3$h6+c z!y-K*(xW21N2K?P^gfXu6Y2dTeL$qgMf#vf9}?-qB7H=pkBam$kv=Zc6C!;=q)&?U zq)49<>C+;8Mx@VjDi!KiIrNSJX4l4$^AfhdaJW8%aM=NUL{@q>4%F zjXP&Zt9n04+N4#@(}%Pg52Sa#=rZdZAq{$*B;Q!&7F0hYNUQMR1lFWh5a$qx8e2uVd_s~86!X}Cv8DxCy3fzyvofKEFuNz?r}Nd;qd z^C3wZ=)?rm+B{rI13oc9+i6EGY3L_O@{Vm=KUhhFot$9uPk26)R_mz=R#^I}O&a`Z zlBSKdCFLw94g1Ulea1&TX`p9msi9Bb$)pLNBV*^Bej15Lx=`$#IYOeK-;jvYNt6}{ z5n>(k`hjUO?tvqDO|c#d%}B?hDPu&**ao4#r)N#P^wJfj#V;0>Bo(EJ^svtW|0ICa z^G(LhoCKF1l^7YC1UW7aF?jkUU^DVC#_EhQv4(|Z=?YSV1)qaX&_*gm#1qB@CsmUk zK^W_s6l=r`1{J1*j3~j9X%kBHxG;e{EfTO?KWaC}zl~Qbv#r@AddXbv6KG6Z-z+ak zw@6=fEEqF6CS1de8#Bw&S1kkdGt{KbDeIJ_V?5%O3HD-PmA)2Hr000w5;%@s_X7&H zbb$wX=g&p#R`%iOMj_s}J*@BBu(juX8<$G$IXU{fh&Z%0Hg5ueW3uOYga0u0{z6L# zFO8h9AGq4gNQ(~A>n{vIcJ=#QJk*oHV^JDNc+kUCo}R^OVAb2@o3+{8I|Jl?%7 zniO9H@ykA(%EpHVT(6x z@-|w$jV5oC#oJ`^He0;SCU1+y+hX#zTD+|$?^cU`wsg@SKFBSb*D*8aW+%*zW%ZffUGapG;yw|?{uJihvi{6t^ zbJ`c)J92Gq|Ip?cH;QBN8Q|M(w!d_ZR;tr0jOrhdk+~#6P^0=-Pz$}6=!>q=dR42q z;(b%T+%?*y&IlF#f-ZYcI*L9Z>#h2DNMxBm}%`#+=5BnA}ny&1lY`Widt{NJ(TjId)hI)+CLqw+2f zObKicsWU5zKHx5{Py^iMv(V-5^H6f;r#zG>UhzIySoES=>S;jQ%lO&zX;;Abd?h z&-!X~2Ck2Gd09-}4<$ExX(XgZiryhnt!jd5u*ofi)sqOX@8My^O4LX8 zqA;C@vxX~-8BX9P#*b8}wR+Euseuj=s~8>f7gkrRulO+?jhUVTG~IfSnJ^2p?H!Ev z1^2wwvF>%albYW>5KQ>+Xz}TnV^$w->P@Wo85^v=N&NnZS2&#^eU7zMp!=qY8Tu}T z^~`%x1?ooBYRqj3OORc7*O>3kUxBZh0N?Z#_{s_JSWiiN#H^l$g~h#qAu`uoV+v-h z&9f%Z*^q)abk>a3iM2Mi-LQp0FvQGwM@(wmSp1NZ{qYU^ucYWh63YjH9`wWiaEDH= z;2ZYvL<)pO`aJmmr{6hzUH0x)-+9~0iO8y9#Uhg7`SKn=&Svq0&B)=w_8!Nzka`V9 z5u+(W)Mf9vtS@*~Ui~E=Z1x2UI{9-*+$`gE+Q*-|@x8JU!h8eK?pPawl<&KI20wdy zccl+U^uzrFB5NMoqp%8b9L?9N?G<>!ik0;<3L7-|xp&%S?~Px2Uvz!Wm{wiza|#K- z&kf+uDOhsZyN4gx_3GRTJg`MkV17YC1Or**|4~9750`(Cf^Z7Y?vEw6`>74J1kR$ zc2uTW+PyMWYR6=XXb;F#r9CK9wf3+~HQJ*x)oPE+RHr>5Q=axDuJp8%xWm()!bzz1 zH16lLXK@v$J&#*A?L}O$X)noCtewWSnf3#jO0+XFm1?iaRHnTy({$|(+-7NS%A{#; z;f_k%sgPg0L!okQw?Z?uJqnIm#pmJLor+qT@`d<33R4BmqDqQT6;)FWzO}BSX=OMc zZgfL2ZuUxXBk0E+dKvD^G~9np!OglC7s3VPDI+^RW8x1IBC7}2Y-zq|$9;ER8M$Pe zgTH&ItE!=Ixafcmnh&RPIMaa)cP@1zlf{_@$V}nPLS$U{gusns^dJt+v%%zh zy9h5kBPOi>;K%}uhA|HNG4xxhSReM)6|Xb@?aV-qQ$g?meMjzqpN8-t)P|Y z&Mx{Jbn~_7{BO~9==r&rTi>SZ>2J~JH_&(J@94X9BR-NTz;6<6rdz0+R#OkHp(w4T zbyyxnSSC}kP^Mwwlw#>jHx`ed)>AKik2X*r_0s?i(hz;0W_lK3f#Ulc*MH`}39Ade z$z&q+7{344x&trMi$ddmrjqv46n=r8iAWy`R^SdP6byxvzj@)iy$0h%nTsTIRmog+ zGFKyV1tlXl+!GAds5^W#?Ngg}LP;w=p}>aPameXFK4~Gjc#@IzG!E&9=miVO#TOabJPug`(J2eb#g`b_G7eb= z(aRQ+i>DdcIu7ZB=oJge#UC)TZ5&dA=v52J#WRe&Y8-L~L_f5UTzrj@SC2zZf#|G- zSWQs^{l$zF6do)vnQMwWPw0 z$yM3np`iMi?G~HO;}FYId`MYs{g|SyuBN4}wg#W)jN&Vs*EXo9$@QtKT~G>F(Tjv+ z2NimJxi%FUo5x=>+aGH1>0e{|YQl7DCEXUGZB?@5)OFU@wy1B@_tke%TYZO4k$N!~ zKM%A?sNaDf@kECbdch-y0SV>W?5tV#*Z7mlM0M2sNv_RBo0@5RD-Ac%?QIlqq|Gh# z5~)9>mr4DIdesluS(Yg5?BY=14>ZxrtP>fk)guJzMx zI@u;juFb*FTz?&)t=P(o-|+Zq!?a~KZ3LvwPYIoHb(FX|2v@K3=h{46z1&}q>b14L zNk4F9jbplI3pCXGMI#{G2naU}MaNA92+nC19 zXuBzG8aL}TK)6P;1#JPeIStyPLqQnY0_fK*(od4ZBBpjLdtUPuQyWW*J#5uI1Yy@e z*fkJ#4TM{7MeA8SbIbg-9GYtDCYrj?x5=ge!M&=}VT0ao(6~Xj7<8jS69&E2ptl)x zn?X10lqXg~En~7#ooq%MQzL2K{o9{>=5>V3VT3>J)puKP+zZFbEUugR|B0`DD8pN%)*p@@6ppGDL+w6ry}eDb5OgEiH)H8h&A zifT8#LS`w_AWGU>imoJB>Bc5x3ch|Dw+U%(X=}n3WJN^1v!ufHiMAsHo0o_>&7<({ zrC6Z;Wi7l zBh$d`nE=<4g7X=;JICWHT2pXy4BTEesG`x5d}jNd&1MMq32QAgf+5|%{bTuIoqree zBbGTqgMVNQAD#JFvXQ$pT)bS zHg$pf6K%xk*3d-4QK3eE1%nBpI$=Ut5Nh(E=2fUUzC+#QhK+{>v`qMX+51$sn+?!k zCz3_+&XDnUqm}OO9H|Vti{0M+Zp!kW%nSwHI6=kDn)ft!PNwM>0l$YfRHqjB_ttf@UcDs zMP5q6Qv?*`p*$5)P~_!$9Nl4Lj(e7~XJ==Rv%8+zb9;u8(BjYB4qA00o-sX<>Wvvgb?uv!GR=3AnSH`Ac zt5a2!GW?tPcOTY!M<;5El9wd9_tPT#HxWbuU;ymj$MzW$bzuaz$q zP*c@hHLTXEv(-j*mAXOQt-hk3Q?IEv)L*Lqsj6VYaL9qN5P>SV3ns!$xDS@XO6Z1l z&3`5~>3^r(N=dP0+x)hut=cxpHrsZ;EoOVl z_Oxx2t=G2C_Nwiy?TYPV+h5r}vwdaz#zyUKdzRg2kJu~i_4fJp4tw1GgngrZxBZa) zl>LJJBm3v}FYI61zp*>CbZxX2)n;k)wT0R;Ev`MKZP9jX$FvW$kF`&=UuyrN{g3vY z=FtoFV!c{#(C6rl`f|Nne^TG3pVH6j7xfSIoBEgfZ}jhU-I3v7jzUL;quw#!(cy?Y zo^Wh(>~tSQ&T%eqHak~3XR)i=HPJQGb)RdI>mgUCYmMuW z>xAo^>yqn3*A3TAm)D)`&T|*K%iMRlXSsjuZgO|IA9Y`Fzwf^8zUltV{e}CtZq;LW zMtR11mU`MeYdmW`TRgiwM?7ad?|6Rd`P5@GJ!Y24%zU%btT$(xi_MsM*gS1sFyA+? zn>WqR&3`w4YdXAM?-cJm??P|P+u?oEyUDx5d(3;<`%m6~^Zv%Gq&iZEr{<-GQ)^Qv z<97dtoW6Z{`>w;CFsW^Mceu4BXPUMDmNs?AjH$9Q9BXfxVZrXsw$|p@^h7P*)D=(k zTGQ0lAlqvjI-BBg+$b}xzv1TP9r!VI*zNT&ex!TW?QONw5_MFan!v3s$!@JJ;pMF@ zu_QItktX@6)|Nhow$}LU1OsC6xg-y7zzA{Nt=^bZ^Q{OjfupY%4~u_D$_NmRvP zlOvE#{YM~LYA0JB*Vc7*bT^>kf!j8j|7~k+k4@#EW7)FqSiBx#Z9PA$CyN6c7e@kI zaT!b&(^Ts`NB<^rSUW?W?bR|gW?D6?x0-%?-3pXB16o^K)YJh@xO{5bfHtuzgD4Y= zGoUlh=O6+xDN_?2JG!S?kPjqRX-qM#!HHxQ=~@vdiY~`h5{X*DUqTdbA`WEOW7177 zxz$1xSE5gAOIak^FMP|0;!ZrnK~_Yf$q?Yxe(Ykn#nFE3R!hG=a`09C`dBSQ@g!7m zCW?zA(PTJ@I#JBTb1^IBk!Uj9Wdl(hR*%w1G!aOpM6qG0ARUjGVxrjjl#Po-MKFw0 zvm=p6Y#GLumGb!{R+pETSC>YIepXRjQe9RyQ3QM)MqM2SaXmi(>JfDNA2bOx;!R+Q zzp>E-yb2gV{EHf4v2U>w@GoiXF;fE26oeLlfUimI4feoNlR`=$0IJyq6q>;jtEg!7_tq?7Y7C|dQi=q{yjYBIzD@7|qD@Ut9t3<0pt46Cq8;>>t zn*B?Apa~ZFn;UWHJ)i>dwE)gT56;OVF%?0a3dJ8YQ{b-BsJ1>OoQlm99)wtkBU=*L zlSoSJ=oOV%XOjFx6&T+w>LslDlXgIutM-V zB*QAMUm4X-+9F)lz}8hEe>ZQ{a--U2XBlsHVsp3nm`fo48X^2}BRqn_52p&@dM^BM z4>noCb-qWu_#p!Iutt2?ouu(doyWOOO;mf?Ud&}oY<*nx^d?cNK>oEL6xU(ctq0Ux z2Tmb6iHoj-9^PunPV}t@L+DO|wIJw*Ns@!+I z|6!?g1eK0*r6Z6flxA|JBdCO}meLI0QOFcZGvTmgVSR*S5Mp>9mzr4^pSqaRJZwKM zd;9v}SPA{7rTiI`f1S&p0k@E!&E?OaJhoc$vwW|EOUTcL(~{6{vAii+&LPWNoaG!i z1j}5`at>Lr)nb|Bdkb{IG8f*IECFOe&o2niBT=n~X(5E_4!==GOA;%r9RJh1&C0e50@l&p~bS6@C{HL)i%%qE+5ABwY)FI^DYUC z`e3vV7E9=VmWZ9Wku<_4f}U(7HsQ&=+>?!@hqqdu+~eCsQiLb>!n0ClTpwWxLV4De zB3dQ9C_^L8XpuGTe8@mNu!4N}xGE1One5{|Vk3pd9*y71x^!!O<~R$30XwlC{2K2Rw? zG^PI>$splKt|Lb>S~!xy!jX)X)E?mLKIFK5C&pDQ##JoFRb0qNR~!!FBOIOK;6!r1 zIFbRvkz6>AWK3`*1BD|QJsim}K_~c<{}3lccyLCM6FCqmivy7nIS^@(1CcE`5GfMX zG0hDr{>1WLH($1vRJ;jZx;)t~N~Oheoac?IG~-d#A7cOm~(%Qd|5Bwf3jbS;4r zu7$>H>rCz$zYJ}!9Pl=Ff{rg@@l~w334pR?U}Fz~oh=8AwSvz63~E^iI9MkbtP7kh z4lcGD>e!>;W{-h~{W+NI3GlKfA(cG^6WP-M!`L$bY3x~mbhZ&7gCTJPdk!FzJr9t@ zdH{yAUVtfV7eF@K4KRYe05Fp61;}A90!(8s0gPfV1LU$p0HfI}05jMz0LESg7{guz z$YUn}eC#B^Sau3v7JCE0&&~qOVQ=HNMRpz_$ld`6v3CLT*+qZ?_8!1Ib`_wIT>}WS zb(nA1dQ3m;Y0O6K8B98C1A%+kW=vCT3xN{0l|U(bjzAfE9#2}fjX(wKAyCPB2~@G| z1ghB%0yS(W=2^B2GalPbF#CyD*=!G~?DsOe3N!IM%)AAdX+xMA@4-}9j0vv@6JZI| zVph^H{pgsKN?{HrjWKvSm*Y#~VR(9b@hjmhJTS-NQCR^EcpPQmK~x5Hxb0o|wQ(A5 zu#vd6Dq#vn@o@YSIRisxw5f#T>v9A6>yWDfpHIVQvru6k+%pbcHLFn7j@mkU;6gqR zs->c8I%;GhSGHgtg@MP=Cm;IYNAE&7iUJ&s^uHL#Qi6V$p~n^IMHPBbgX5imN!P$L z%EY5I3y*_bJpO|aHmmp*;ZOSa|KY9{(W-)jes#F*mj(k|1TO}=nWe6Ly5Kql6tJ>{Y^EBkZ^!rGrUN+!^Uf!cGx(ny@p3y-wI0gq@C9HChR<67YKWYuy+NW*^kZ|_{AaVif*UV*?WXtBJ46@ zR|vaG*jmcgQMR74rzxM%yurNB(4m%S5bp-co~3LfWt%A5Oxae-o}=t}%C-sKw86YR zcgEXG*>=iyP_~n@U6k#i>;=m9Qud;z?}C_7Er8OmN4yjlHtEoa{tl6R1^XDNG= zvU8NZMcH}EE>QLkW$y~o+`*(5?~L?4$}UlMnX)UCU88Jm3R{=L)~6Vzk>)Y&5A+rq z3w9I+jBF!gvjIUPKVabRkLim8!4Ot|v?%i@>bDv8%#YQ~zf?1Ss@}@jYGmGkz$E!X z-Kqxb`HOa0QA2h3_I++I{vL@%kQX6dAG!$yHrUV_T`284z5?@?Ol zW?q-lKgToo$3p1mc!J(&Zzm{0d2Lm<2TqweeB3?v!QOt{RyeJvU13JJ1`bT*H z3ljR1FcPunY(B_JAv?!S<#|$NuHb^M#j)n3BtxuF=Md=qMzQ6F8DFYVADTIP@ff@st z(S^?MaD9HF$|Vx(^D{L73;BGB=+{K}Ya;$Nd`U2P(MJp#z=-c1Kpp-ZCxZYNWdRo{ z6b_4k*F?l?BILE`P(#QXIE1Y4AA(>Pn?@76Mk^6Yr9<)N4&=@KeqJ#(Vq0ipUua@u OXqCZ6ND==(!v6w-Q*(v@ literal 0 HcmV?d00001 diff --git a/brag/brag/rules/compiled/runtime_rkt.dep b/brag/brag/rules/compiled/runtime_rkt.dep new file mode 100644 index 0000000..0ee8171 --- /dev/null +++ b/brag/brag/rules/compiled/runtime_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("0d83924b9d995d1fb6cbdc3b89ca29f5bec77bd9" . "98cc41d41b06c0ff1d2755eadb1cd3e7a3331091") (collects #"br-parser-tools" #"lex.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt")) diff --git a/brag/brag/rules/compiled/runtime_rkt.zo b/brag/brag/rules/compiled/runtime_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..9c80c877108b15f27603e3b6fed8005ffc4bc550 GIT binary patch literal 5421 zcmaJ_eQXow8Nc_rJLjAW@#V{gBn~z)zH`VqA&?LZDYOtEe5Md66ijE53%GI4>D`$E z+fX&F)99o+>DV-N(cX`ARaG;JM>N|W}-#x(6i+8@)jO)9X`?RoEP zpU+Ne<$3eo^ZefD{d_*&xA$tpNOCkem>k*-48yb{wM^&r+3fj(p{Yhex3crv1acb) z!wlp9@^2Eqf8SRAVwm2FqN&2@)vsxPdITRo{OrwJpZ(#dKl$O`9`T6876Q}BtYfy} z$9qUD;j_BAFnFY{$MI6nVbWn_rsp(kpu|uesJN8yw_jNTB1=S+nD(x~Xd2)wumHe@ zMG-$l{Q3P@G$tmCvRp>@0Jpc&UE-&V#3+5T#Lz#)O8AX6S!r_XVpUxt_k-ULG@cEg z-Su1{Z)tma*UxE&uH{7F{C>aeuUdv1KWU$N{n#I~&;8@nzqmJUyy|=B+H2|ZGT@k* zA!aA@6f?_QWxmRMkNGY0R|ZHI86juL$H)b8g_fJL8{&3x`?!PLG42`eI`?Jn zP3{NWyWAhRzjOcLKIB9`&iC;{{C0j1f0|$7U*%utzs`S${~yo!1mCUZUpN1*IUI-u z4h5bKd?N6vz)OLg#4r!=gp{|fvPrmbq}#%+BDC7aKhW)|0N zK0i~y{<@aKT+|E`=X3e)yfIgGZcCifDBSa$FIZ}RR-M=8^Ty=^6$Q9+Gwx2% zuauUbt4F%BbDGYi))O7en!E?>}RNP9(7K{pEv3wguR zX53*F(42QW#zof5XXZ53)N-@xv}LG{L8)1NHt*}~OeT{991Q<@jj22wUa&R*9D(rN9_KEX6G;Mc5{Bz{@far|P3ssR=mP4h={G zk{_uNNrdh3ZAD1INPIi0!zuwbHpVY1#Ug4Pu{9~!oN1L<)G#dZ(6nVx_)3G&O*st? zCpjowhvE26DjgaWUgE}Dv84dRuronxe!CXmC9(b@>`uctjK+316cZ9aa~gZvU4-#8 zq!wxKuqrn0!&WRb!!EmZV?~eX)QS=mky#W`pC3kP>3}5cE#&xQ8lH?j$;h#zgl^O^)Y^u-(`r}4zQ)EGZ8odhP7YeAKzbXX z9j2fIDTow8T8*>@sS~LSsT(Pb)PuAZDS{M5T8Gq&6hm5%6i1Sg6r==FAJPV-ek2ts zi8O#Th_n%=NQV=j9p_c?oOnu(E#j=(pnakQpl;M^#h+LEd$&aokyljijR0<&wWM#wHgz$>gv?|3P7ak{}T6ie{xfq#*SHL(y%0(*m zNKe>ukqOdXtCI#Q7tmLKG|R!w1#PJB&lB!kWIqYk_U8mN7oyf5-eqH=+ag(S8Qv)A zLI+4!ZU0qq)5Q(euL}*OE@0zyhLHqc74Tp6I1_k&&cgJ(Vnexvby zl*tK13?cLmg$^OqsUY+Ybl(rY$Rc|ae%sye$4bm zScRFfAGjU}94Jp$rAs05$l70F;i8BXbg06~&(4~fCHf>L;XD};SfyZ3k`M0`4XCpb zwF{CDS#{igRjGSq@;)r#p%5NUF80aF$?HN)9!U^-p|UgS(mjhFz0}CaNNV%oJvO@k zLGX;m1dAgr(+||?G9gWs*b&Qlkk!d zJrF$@Jrq40eJXk~dMf%fUR~M)65J2I*(^>j;F@cm&HyocnudM_(qc= zi+ETb1dj&4C7!%4D+61k2C@dHhqr69{Iq9J4@bOd1e!JrG2xrMFx_~sEqYoMJJK>L zI&n7iGxFbH1D2tmlh7^lF!(t!^h+X-m!5ub2#SJ5f);(Wz}r%3d~~7uh1J4~4cPVS iWxF0tZGxt)eZtFvu+-dmk3`R)hJNKN@Zhr__x=z3_bH74 literal 0 HcmV?d00001 diff --git a/brag/brag/rules/compiled/stx-types_rkt.dep b/brag/brag/rules/compiled/stx-types_rkt.dep new file mode 100644 index 0000000..c634b1a --- /dev/null +++ b/brag/brag/rules/compiled/stx-types_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("04c0dfaac34e0f545a22ed58f0b88448e57f3237" . "45edc5268ccfc8f2ffdbecc5ce55bf87097999a1") (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt")) diff --git a/brag/brag/rules/compiled/stx-types_rkt.zo b/brag/brag/rules/compiled/stx-types_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..09625cb2f1f06ea23ae26822ae190b73dc53f9d0 GIT binary patch literal 1478 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 K;5`lhJM$l^<5C#_ literal 0 HcmV?d00001 diff --git a/brag/brag/rules/lexer.rkt b/brag/brag/rules/lexer.rkt new file mode 100755 index 0000000..e55991b --- /dev/null +++ b/brag/brag/rules/lexer.rkt @@ -0,0 +1,131 @@ +#lang racket/base +(require (for-syntax racket/base "parser.rkt")) +(require br-parser-tools/lex + (prefix-in : br-parser-tools/lex-sre) + "parser.rkt" + "rule-structs.rkt" + racket/string) + +(provide lex/1 tokenize) + +;; A newline can be any one of the following. +(define-lex-abbrev NL (:or "\r\n" "\r" "\n")) + +;; chars used for quantifiers & parse-tree filtering +(define-for-syntax quantifiers "+:*") ; colon is reserved to separate rules and productions +(define-lex-trans reserved-chars + (λ(stx) #`(char-set #,(format "~a~a~a" quantifiers hide-char splice-char)))) + +(define-lex-trans hide-char-trans (λ(stx) #`(char-set #,(format "~a" hide-char)))) +(define-lex-trans splice-char-trans (λ(stx) #`(char-set #,(format "~a" splice-char)))) + +(define-lex-abbrevs + [letter (:or (:/ "a" "z") (:/ #\A #\Z))] + [digit (:/ #\0 #\9)] + [id-char (:or letter digit (:& (char-set "+:*@!-.$%&/=?^_~<>") (char-complement (reserved-chars))))] + [hide-char (hide-char-trans)] + [splice-char (splice-char-trans)] + ) + +(define-lex-abbrev id (:& (complement (:+ digit)) (:+ id-char))) + +(define lex/1 + (lexer-src-pos + ;; handle whitespace chars within quotes as literal tokens: "\n" "\t" '\n' '\t' + ;; by matching the escaped version, and then unescaping them before they become token-LITs + [(:: "'" + (:* (:or "\\'" "\\n" "\\t" (:~ "'" "\\"))) + "'") + (token-LIT (case lexeme + [("'\\n'") "'\n'"] + [("'\\t'") "'\t'"] + [else lexeme]))] + [(:: "\"" + (:* (:or "\\\"" "\\n" "\\t" (:~ "\"" "\\"))) + "\"") + (token-LIT (case lexeme + [("\"\\n\"") "\"\n\""] + [("\"\\t\"") "\"\t\""] + [else lexeme]))] + ["(" + (token-LPAREN lexeme)] + ["[" + (token-LBRACKET lexeme)] + [")" + (token-RPAREN lexeme)] + ["]" + (token-RBRACKET lexeme)] + [hide-char + (token-HIDE lexeme)] + [splice-char + (token-SPLICE lexeme)] + ["|" + (token-PIPE lexeme)] + [(:or "+" "*") + (token-REPEAT lexeme)] + [whitespace + ;; Skip whitespace + (return-without-pos (lex/1 input-port))] + ;; Skip comments up to end of line + ;; but detect possble kwargs. + [(:: (:or "#" ";") ; remove # as comment char + (complement (:: (:* any-char) NL (:* any-char))) + (:or NL "")) + (let ([maybe-kwarg-match (regexp-match #px"^#:(.*?)\\s*(.*?)$" lexeme)]) + (when maybe-kwarg-match + (let* ([parts (map string->symbol (string-split (string-trim lexeme "#:" #:right? #f)))] + [kw (car parts)][val (cadr parts)]) + (case kw + [(prefix-out) (current-prefix-out val)] + [else (error 'lexer (format "got unknown keyword ~a" kw))]))) + (return-without-pos (lex/1 input-port)))] + [(eof) + (token-EOF lexeme)] + [(:: id (:* whitespace) ":") + (token-RULE_HEAD lexeme)] + [(:: hide-char id (:* whitespace) ":") + (token-RULE_HEAD_HIDDEN lexeme)] + [(:: splice-char id (:* whitespace) ":") + (token-RULE_HEAD_SPLICED lexeme)] + [id + (token-ID lexeme)] + + ;; We call the error handler for everything else: + [(:: any-char) + (let-values ([(rest-of-text end-pos-2) + (lex-nonwhitespace input-port)]) + ((current-parser-error-handler) + #f + 'error + (string-append lexeme rest-of-text) + (position->pos start-pos) + (position->pos end-pos-2)))])) + + +;; This is the helper for the error production. +(define lex-nonwhitespace + (lexer + [(:+ (char-complement whitespace)) + (values lexeme end-pos)] + [any-char + (values lexeme end-pos)] + [(eof) + (values "" end-pos)])) + + + +;; position->pos: position -> pos +;; Coerses position structures from br-parser-tools/lex to our own pos structures. +(define (position->pos a-pos) + (pos (position-offset a-pos) + (position-line a-pos) + (position-col a-pos))) + + + +;; tokenize: input-port -> (-> token) +(define (tokenize ip + #:source [source (object-name ip)]) + (lambda () + (parameterize ([file-path source]) + (lex/1 ip)))) diff --git a/brag/brag/rules/parser.rkt b/brag/brag/rules/parser.rkt new file mode 100755 index 0000000..4cf9608 --- /dev/null +++ b/brag/brag/rules/parser.rkt @@ -0,0 +1,281 @@ +#lang racket/base +(require br-parser-tools/yacc + br-parser-tools/lex + racket/list + racket/match + "rule-structs.rkt") + +;; A parser for grammars. + +(provide hide-char + splice-char + tokens + token-LPAREN + token-RPAREN + token-HIDE ; for hider + token-SPLICE ; for splicer + token-LBRACKET + token-RBRACKET + token-PIPE + token-REPEAT + token-RULE_HEAD + token-RULE_HEAD_HIDDEN + token-RULE_HEAD_SPLICED + token-ID + token-LIT + token-EOF + grammar-parser + + current-source + current-parser-error-handler + current-prefix-out + + [struct-out rule] + [struct-out lhs-id] + [struct-out pattern] + [struct-out pattern-id] + [struct-out pattern-lit] + [struct-out pattern-token] + [struct-out pattern-choice] + [struct-out pattern-repeat] + [struct-out pattern-maybe] + [struct-out pattern-seq]) + +(define-tokens tokens (LPAREN + RPAREN + LBRACKET + RBRACKET + HIDE + SPLICE + PIPE + REPEAT + RULE_HEAD + RULE_HEAD_HIDDEN + RULE_HEAD_SPLICED + ID + LIT + EOF)) + +(define hide-char #\/) +(define splice-char #\@) + +;; grammar-parser: (-> token) -> (listof rule) +(define grammar-parser + (parser + (tokens tokens) + (src-pos) + (start rules) + (end EOF) + + (grammar + [rules + [(rules*) $1]] + + [rules* + [(rule rules*) + (cons $1 $2)] + [() + '()]] + + ;; I have a separate token type for rule identifiers to avoid the + ;; shift/reduce conflict that happens with the implicit sequencing + ;; of top-level rules. i.e. the parser can't currently tell, when + ;; it sees an ID, if it should shift or reduce to a new rule. + [rule + [(RULE_HEAD pattern) + (begin + (define trimmed (regexp-replace #px"\\s*:$" $1 "")) + (rule (position->pos $1-start-pos) + (position->pos $2-end-pos) + (lhs-id (position->pos $1-start-pos) + (pos (+ (position-offset $1-start-pos) + (string-length trimmed)) + (position-line $1-start-pos) + (position-col $1-start-pos)) + trimmed + #f) + $2))] + + [(RULE_HEAD_HIDDEN pattern) ; slash indicates hiding + (begin + (define trimmed (cadr (regexp-match (pregexp (format "~a(\\S+)\\s*:$" hide-char)) $1))) + (rule (position->pos $1-start-pos) + (position->pos $2-end-pos) + (lhs-id (position->pos $1-start-pos) + (pos (+ (position-offset $1-start-pos) + (string-length trimmed) + (string-length "!")) + (position-line $1-start-pos) + (position-col $1-start-pos)) + trimmed + ''hide) ; symbol needs to be double quoted in this case + $2))] + + [(RULE_HEAD_SPLICED pattern) ; atsign indicates splicing + (begin + (define trimmed (cadr (regexp-match (pregexp (format "~a(\\S+)\\s*:$" splice-char)) $1))) + (rule (position->pos $1-start-pos) + (position->pos $2-end-pos) + (lhs-id (position->pos $1-start-pos) + (pos (+ (position-offset $1-start-pos) + (string-length trimmed) + (string-length "@")) + (position-line $1-start-pos) + (position-col $1-start-pos)) + trimmed + ''splice) ; symbol needs to be double quoted in this case + $2))]] + + [pattern + [(implicit-pattern-sequence PIPE pattern) + (if (pattern-choice? $3) + (pattern-choice (position->pos $1-start-pos) + (position->pos $3-end-pos) + (cons $1 (pattern-choice-vals $3))) + (pattern-choice (position->pos $1-start-pos) + (position->pos $3-end-pos) + (list $1 $3)))] + [(implicit-pattern-sequence) + $1]] + + [implicit-pattern-sequence + [(repeatable-pattern implicit-pattern-sequence) + (if (pattern-seq? $2) + (pattern-seq (position->pos $1-start-pos) + (position->pos $2-end-pos) + (cons $1 (pattern-seq-vals $2))) + (pattern-seq (position->pos $1-start-pos) + (position->pos $2-end-pos) + (list $1 $2)))] + [(repeatable-pattern) + $1]] + + [repeatable-pattern + [(atomic-pattern REPEAT) + (cond [(string=? $2 "*") + (pattern-repeat (position->pos $1-start-pos) + (position->pos $2-end-pos) + 0 $1)] + [(string=? $2 "+") + (pattern-repeat (position->pos $1-start-pos) + (position->pos $2-end-pos) + 1 $1)] + [else + (error 'grammar-parse "unknown repetition operator ~e" $2)])] + [(atomic-pattern) + $1]] + + [atomic-pattern + [(LIT) + (pattern-lit (position->pos $1-start-pos) + (position->pos $1-end-pos) + (substring $1 1 (sub1 (string-length $1))) + #f)] + + [(ID) + (if (token-id? $1) + (pattern-token (position->pos $1-start-pos) + (position->pos $1-end-pos) + $1 + #f) + (pattern-id (position->pos $1-start-pos) + (position->pos $1-end-pos) + $1 + #f))] + + [(LBRACKET pattern RBRACKET) + (pattern-maybe (position->pos $1-start-pos) + (position->pos $3-end-pos) + $2)] + + [(LPAREN pattern RPAREN) + (relocate-pattern $2 (position->pos $1-start-pos) (position->pos $3-end-pos))] + + [(HIDE atomic-pattern) + (relocate-pattern $2 (position->pos $1-start-pos) (position->pos $2-end-pos) 'hide)] + + [(SPLICE ID) + ;; only works for nonterminals on the right side + ;; (meaningless with terminals) + (if (token-id? $2) + (error 'brag "Can't use splice operator with terminal") + (pattern-id (position->pos $1-start-pos) + (position->pos $2-end-pos) + $2 + 'splice))]]) + + + (error (lambda (tok-ok? tok-name tok-value start-pos end-pos) + ((current-parser-error-handler) tok-ok? tok-name tok-value (position->pos start-pos) (position->pos end-pos)))))) + +;; relocate-pattern: pattern -> pattern +;; Rewrites the pattern's start and end pos accordingly. +(define (relocate-pattern a-pat start-pos end-pos [hide? #f]) + (match a-pat + [(pattern-id _ _ v h) + (pattern-id start-pos end-pos v (or hide? h))] + [(pattern-token _ _ v h) + (pattern-token start-pos end-pos v (or hide? h))] + [(pattern-lit _ _ v h) + (pattern-lit start-pos end-pos v (or hide? h))] + [(pattern-choice _ _ vs) + (pattern-choice start-pos end-pos vs)] + [(pattern-repeat _ _ m v) + (pattern-repeat start-pos end-pos m v)] + [(pattern-maybe _ _ v) + (pattern-maybe start-pos end-pos v)] + [(pattern-seq _ _ vs) + (pattern-seq start-pos end-pos vs)] + [else + (error 'relocate-pattern "Internal error when relocating ~s\n" a-pat)])) + + +; token-id: string -> boolean +;; Produces true if the id we see should be treated as the name of a token. +;; By convention, tokens are all upper-cased. +(define (token-id? id) + (string=? (string-upcase id) + id)) + + + +;; position->pos: position -> pos +;; Coerses position structures from br-parser-tools/lex to our own pos structures. +(define (position->pos a-pos) + (pos (position-offset a-pos) + (position-line a-pos) + (position-col a-pos))) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + +;; During parsing, we should define the source of the input. +(define current-source (make-parameter #f)) + +(define current-prefix-out (make-parameter #f)) + + +;; When bad things happen, we need to emit errors with source location. +(struct exn:fail:parse-grammar exn:fail (srclocs) + #:transparent + #:property prop:exn:srclocs (lambda (instance) + (exn:fail:parse-grammar-srclocs instance))) + +(define current-parser-error-handler + (make-parameter + (lambda (tok-ok? tok-name tok-value start-pos end-pos) + (raise (exn:fail:parse-grammar + (format "Error while parsing grammar near: ~e [line=~a, column=~a, position=~a]" + tok-value + (pos-line start-pos) + (pos-col start-pos) + (pos-offset start-pos)) + (current-continuation-marks) + (list (srcloc (current-source) + (pos-line start-pos) + (pos-col start-pos) + (pos-offset start-pos) + (if (and (number? (pos-offset end-pos)) + (number? (pos-offset start-pos))) + (- (pos-offset end-pos) + (pos-offset start-pos)) + #f)))))))) diff --git a/brag/brag/rules/rule-structs.rkt b/brag/brag/rules/rule-structs.rkt new file mode 100755 index 0000000..5b5968e --- /dev/null +++ b/brag/brag/rules/rule-structs.rkt @@ -0,0 +1,43 @@ +#lang racket/base +(provide (all-defined-out)) + + +;; We keep our own position structure because br-parser-tools/lex's position +;; structure is non-transparent, hence highly resistant to unit testing. +(struct pos (offset line col) + #:transparent) + +(struct rule (start end lhs pattern) + #:transparent) + +(struct lhs-id (start end val splice) + #:transparent) + +;; A pattern can be one of the following: +(struct pattern (start end) + #:transparent) + +(struct pattern-id pattern (val hide) + #:transparent) + +;; Token structure to be defined by the user +(struct pattern-token pattern (val hide) + #:transparent) + +;; Token structure defined as the literal string to be matched. +(struct pattern-lit pattern (val hide) + #:transparent) + +(struct pattern-choice pattern (vals) + #:transparent) + +(struct pattern-repeat pattern (min ;; either 0 or 1 + val) + #:transparent) + +(struct pattern-maybe pattern (val) + #:transparent) + +(struct pattern-seq pattern (vals) + #:transparent) + diff --git a/brag/brag/rules/runtime.rkt b/brag/brag/rules/runtime.rkt new file mode 100755 index 0000000..e34df13 --- /dev/null +++ b/brag/brag/rules/runtime.rkt @@ -0,0 +1,34 @@ +#lang racket/base +(require br-parser-tools/lex) + +(provide (all-defined-out)) + +;; During parsing, we should define the source of the input. +(define current-source (make-parameter #f)) + + +;; When bad things happen, we need to emit errors with source location. +(struct exn:fail:parse-grammar exn:fail (srclocs) + #:transparent + #:property prop:exn:srclocs (lambda (instance) + (exn:fail:parse-grammar-srclocs instance))) + +(define current-parser-error-handler + (make-parameter + (lambda (tok-ok? tok-name tok-value start-pos end-pos) + (raise (exn:fail:parse-grammar + (format "Error while parsing grammar near: ~e [line=~a, column~a, position=~a]" + tok-value + (position-line start-pos) + (position-col start-pos) + (position-offset start-pos)) + (current-continuation-marks) + (list (srcloc (current-source) + (position-line start-pos) + (position-col start-pos) + (position-offset start-pos) + (if (and (number? (position-offset end-pos)) + (number? (position-offset start-pos))) + (- (position-offset end-pos) + (position-offset start-pos)) + #f)))))))) diff --git a/brag/brag/rules/stx-types.rkt b/brag/brag/rules/stx-types.rkt new file mode 100755 index 0000000..e0ac70a --- /dev/null +++ b/brag/brag/rules/stx-types.rkt @@ -0,0 +1,16 @@ +#lang racket/base +(provide (all-defined-out)) + +;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +;; These are just here to provide bindings for Check Syntax. +;; Otherwise, we should never hit these, as the toplevel rules-codegen +;; should eliminate all uses of these if it does the right thing. +(define (rules stx) (raise-syntax-error #f "Used out of context of rules" stx)) +(define (rule stx) (raise-syntax-error #f "Used out of context of rules" stx)) +(define (id stx) (raise-syntax-error #f "Used out of context of rules" stx)) +(define (lit stx) (raise-syntax-error #f "Used out of context of rules" stx)) +(define (token stx) (raise-syntax-error #f "Used out of context of rules" stx)) +(define (choice stx) (raise-syntax-error #f "Used out of context of rules" stx)) +(define (repeat stx) (raise-syntax-error #f "Used out of context of rules" stx)) +(define (maybe stx) (raise-syntax-error #f "Used out of context of rules" stx)) +(define (seq stx) (raise-syntax-error #f "Used out of context of rules" stx)) \ No newline at end of file diff --git a/brag/brag/rules/stx.rkt b/brag/brag/rules/stx.rkt new file mode 100755 index 0000000..9c66685 --- /dev/null +++ b/brag/brag/rules/stx.rkt @@ -0,0 +1,88 @@ +#lang racket/base + +(require "rule-structs.rkt" + br-parser-tools/lex + racket/match + syntax/strip-context) + +(provide rules->stx) + +;; Given a sequence of rules, we translate these to syntax objects. + +;; rules->stx: (listof rule) -> syntax +(define (rules->stx source rules #:original-stx [original-stx #f]) + (define rule-stxs + (map (lambda (stx) (rule->stx source stx)) + rules)) + (datum->syntax #f + `(rules ,@rule-stxs) + original-stx)) + + +(define (rule->stx source a-rule) + (define id-stx + (syntax-property + (datum->syntax #f + (string->symbol (lhs-id-val (rule-lhs a-rule))) + (list source + (pos-line (lhs-id-start (rule-lhs a-rule))) + (pos-col (lhs-id-start (rule-lhs a-rule))) + (pos-offset (lhs-id-start (rule-lhs a-rule))) + (if (and (number? (pos-offset (lhs-id-start (rule-lhs a-rule)))) + (number? (pos-offset (lhs-id-end (rule-lhs a-rule))))) + (- (pos-offset (lhs-id-end (rule-lhs a-rule))) + (pos-offset (lhs-id-start (rule-lhs a-rule)))) + #f))) + 'hide-or-splice-lhs-id (lhs-id-splice (rule-lhs a-rule)))) + (define pattern-stx (pattern->stx source (rule-pattern a-rule))) + (define line (pos-line (rule-start a-rule))) + (define column (pos-col (rule-start a-rule))) + (define position (pos-offset (rule-start a-rule))) + (define span (if (and (number? (pos-offset (rule-start a-rule))) + (number? (pos-offset (rule-end a-rule)))) + (- (pos-offset (rule-end a-rule)) + (pos-offset (rule-start a-rule))) + #f)) + (datum->syntax #f + `(rule ,id-stx ,pattern-stx) + (list source line column position span))) + +(define (pattern->stx source a-pattern) + (define recur (lambda (s) (pattern->stx source s))) + + (define line (pos-line (pattern-start a-pattern))) + (define column (pos-col (pattern-start a-pattern))) + (define position (pos-offset (pattern-start a-pattern))) + (define span (if (and (number? (pos-offset (pattern-start a-pattern))) + (number? (pos-offset (pattern-end a-pattern)))) + (- (pos-offset (pattern-end a-pattern)) + (pos-offset (pattern-start a-pattern))) + #f)) + (define source-location (list source line column position span)) + (match a-pattern + [(struct pattern-id (start end val hide)) + (syntax-property + (datum->syntax #f + `(id ,(datum->syntax #f (string->symbol val) source-location)) + source-location) + 'hide hide)] + [(struct pattern-lit (start end val hide)) + (syntax-property + (datum->syntax #f + `(lit ,(datum->syntax #f val source-location)) + source-location) + 'hide hide)] + [(struct pattern-token (start end val hide)) + (syntax-property + (datum->syntax #f + `(token ,(datum->syntax #f (string->symbol val) source-location)) + source-location) + 'hide hide)] + [(struct pattern-choice (start end vals)) + (datum->syntax #f`(choice ,@(map recur vals)) source-location)] + [(struct pattern-repeat (start end min val)) + (datum->syntax #f`(repeat ,min ,(recur val)) source-location)] + [(struct pattern-maybe (start end val)) + (datum->syntax #f`(maybe ,(recur val)) source-location)] + [(struct pattern-seq (start end vals)) + (datum->syntax #f`(seq ,@(map recur vals)) source-location)])) diff --git a/brag/brag/support.rkt b/brag/brag/support.rkt new file mode 100755 index 0000000..232fbf4 --- /dev/null +++ b/brag/brag/support.rkt @@ -0,0 +1,143 @@ +#lang racket/base +(require br-parser-tools/lex + racket/string + racket/struct + (prefix-in : br-parser-tools/lex-sre) + (for-syntax racket/base)) +(provide (all-from-out br-parser-tools/lex) + (all-from-out br-parser-tools/lex-sre) + [struct-out token-struct] + token + [struct-out exn:fail:parsing]) + + + +(define (token-print token port mode) + (write-string (format "~a" + (cons 'token-struct + (map (λ(proc) (format "~v" (proc token))) + (list + token-struct-type + token-struct-val + token-struct-line + token-struct-column + token-struct-offset + token-struct-span + token-struct-skip?)))) port)) + + +(struct token-struct (type val offset line column span skip?) + #:auto-value #f + #:transparent) + + +;; Token constructor. +;; This is intended to be a general token structure constructor that's nice +;; to work with. +;; It should cooperate with the tokenizers constructed with make-permissive-tokenizer. +(define (token type ;; (U symbol string) + [val #f] ;; any + [srcloc #f] + #:position [position #f] ;; (U #f number) + #:line [line #f] ;; (U #f number) + #:column [column #f] ;; (U #f number) + #:span [span #f] ;; boolean + #:skip? [skip? #f]) + (token-struct (if (string? type) (string->symbol type) type) + val + ;; keyword values take precedence over srcloc values + (or position (and srcloc (srcloc-position srcloc))) + (or line (and srcloc (srcloc-line srcloc))) + (or column (and srcloc (srcloc-column srcloc))) + (or span (and srcloc (srcloc-span srcloc))) + skip?)) + + +;; When bad things happen, we need to emit errors with source location. +(struct exn:fail:parsing exn:fail (srclocs) + #:transparent + #:property prop:exn:srclocs (lambda (instance) + (exn:fail:parsing-srclocs instance))) + + +(provide apply-lexer) +(define (apply-lexer lexer val) + (for/list ([t (in-port lexer (if (string? val) (open-input-string val) val))]) + t)) + +(provide apply-tokenizer-maker + (rename-out [apply-tokenizer-maker apply-tokenizer])) +(define (apply-tokenizer-maker tokenize in) + (define input-port (if (string? in) + (open-input-string in) + in)) + (define token-producer (tokenize input-port)) + (for/list ([token (in-producer token-producer (λ(tok) + (define val (cond + ;; position-tokens are produced by lexer-src-pos, + [(position-token? tok) + (position-token-token tok)] + ;; and srcloc-tokens by lexer-srcloc + [(srcloc-token? tok) + (srcloc-token-token tok)] + [else tok])) + (or (eof-object? val) (void? val))))]) + token)) + +(provide apply-colorer) +(define (apply-colorer colorer port-or-string) + (define p (if (string? port-or-string) + (open-input-string port-or-string) + port-or-string)) + (let loop ([acc null]) + (define-values (lex cat shape start end) (colorer p)) + (if (or (eq? 'eof cat) (eof-object? lex)) + (reverse acc) + (loop (cons (list lex cat shape start end) acc))))) + +(provide trim-ends) +(define (trim-ends left lexeme right) + (string-trim (string-trim lexeme left #:right? #f) right #:left? #f)) + +(provide from/to) +(define-lex-trans from/to + (λ(stx) + (syntax-case stx () + [(_ OPEN CLOSE) + ;; (:seq any-string CLOSE any-string) pattern makes it non-greedy + #'(:seq OPEN (complement (:seq any-string CLOSE any-string)) CLOSE)]))) + +(provide from/stop-before) +(define-lex-trans from/stop-before + (λ(stx) + (syntax-case stx () + [(_ OPEN CLOSE) + #'(:seq OPEN (:* (:~ CLOSE)))]))) + +(provide uc+lc) +(define-lex-trans uc+lc + (λ(stx) + (syntax-case stx () + [(_ . STRS) + (with-syntax ([(UCSTR ...) (map (compose1 string-upcase syntax->datum) (syntax->list #'STRS))] + [(LCSTR ...) (map (compose1 string-downcase syntax->datum) (syntax->list #'STRS))]) + #'(union (union UCSTR ...) (union LCSTR ...)))]))) + +;; change names of lexer abbreviations to be consistent with Racket srcloc conventions + +(define-syntax-rule (dprt ID-IN ID-OUT) + (begin + (provide ID-IN) + (define-syntax ID-IN (make-rename-transformer (syntax ID-OUT))))) + +(dprt lexeme-start start-pos) +(dprt lexeme-end end-pos) +(dprt line position-line) +(dprt col position-col) +(dprt pos position-offset) + +(provide span) +(define (span lexeme-start lexeme-end) + (abs ; thus same result in reverse order + (- (pos lexeme-end) + (pos lexeme-start)))) \ No newline at end of file diff --git a/brag/brag/test/compiled/test-01-equal_rkt.dep b/brag/brag/test/compiled/test-01-equal_rkt.dep new file mode 100644 index 0000000..79c42a8 --- /dev/null +++ b/brag/brag/test/compiled/test-01-equal_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("6074d0c3498e4d57d1148fd6ef6cc6b5e17f1cc1" . "2a62cf7ac209eb1f0a9246c2c8a1eb527fc90d0a") (collects #"brag" #"examples" #"01-equal.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"rackunit" #"main.rkt")) diff --git a/brag/brag/test/compiled/test-01-equal_rkt.zo b/brag/brag/test/compiled/test-01-equal_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..e5099135b671815b90301170a6bfbefc038fc4bc GIT binary patch literal 2373 zcmb7FOK%%h6u$S2J)ZHT$t2i$x#M&aC-X?g9w%){yC{^PhPJAj1t3^BVPfADE6&&* zkK43TD-{VL1k$+t1Bxoa3L#do0+cMuV?#lx0)Y^0*zj7lt8&MaN$oVP$jJ9`p5M9W zoO?ZXHFh{Vn>Dl3&jLcIkB;7A)m|x|YdFMk8n#Nf zyg|-4tcrw_j#XSGZf+|eBQOxIYkcDJb-;><1ra4uJ+lRXMPLAckpzJf0{wWNPH}C) zQFQkw1*wd=uNXxoeUZvQ7e@kMEI?tG)_k`rU&tHiNM zMSuv;^9tXVj1Rv5m7Bk}`SAAg)qgaY-p_N+-7xylmBpAmRRH$2ylI>(*MWLh8A& z5Q22V*K62iSCCjytU2WimP>MewX)8t3o(i1`QodjxY{B)iS6pD(MIy!`kZ#7kOxtT zW!cq>EsMBxrhdtGt@T``TD079)fSG^-3Tf~dpml<*Jcr#Ycv!C}g5g=0VJlJ0V$pZ{b zM#Ar?9;C$xL=^>auw@@?WByh|6KM}57?~I;z=6yGq)f;KPmC%csW1wlWJaN>Qoo}x z((6ORm`C7MA&KzvJouf*4-T#m+h5mz~Q*~^>XE$gp0v@cpPNV1^T_u+;R-KYjbE-vBqA%o$Kydir#*(i$^pJu<)?IpK zTw^0e!;Ht*s-H)>NYK2|SS zPT5+fB8RLHhuB489NSW^R~t@|7fvMTHHl$@2#t)~q`MEyUHTP)Ed z!o7v2mecPpG<8!?40sEkp7#g8&{T9aG3e1XtEcYv--!4+ss=r&WC6q!wVTp3I_X-X zyE&yyr;zvzWOA z1OA%diK2F(Bq_=+MteXV+(He|LiC-eS_kT2h}vni2h^dRXWiux51(D{h+-&=Vmo2G zI@v>1!(lFVb@Zs*Om;*y97Z+pSSNdkDiuc6>IWJ{%W-GwW9H6^O?5<-+K%e6P971} M5=4Q8SnKcpKc@}-0ssI2 literal 0 HcmV?d00001 diff --git a/brag/brag/test/compiled/test-0n1_rkt.dep b/brag/brag/test/compiled/test-0n1_rkt.dep new file mode 100644 index 0000000..a99b82a --- /dev/null +++ b/brag/brag/test/compiled/test-0n1_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("b77d4737877cd74afdccd09973c4e842cb5ba7ac" . "3b7422272b31655dd5642bf208be0a5f430f8f7e") (collects #"brag" #"examples" #"0n1.rkt") (collects #"brag" #"support.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"rackunit" #"main.rkt")) diff --git a/brag/brag/test/compiled/test-0n1_rkt.zo b/brag/brag/test/compiled/test-0n1_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..1351fb8ee1e7eb4ef2575fe4c7d002ff925e355e GIT binary patch literal 4114 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 Np}02+hC79y=P&J#+|vL6 literal 0 HcmV?d00001 diff --git a/brag/brag/test/compiled/test-baby-json-hider_rkt.dep b/brag/brag/test/compiled/test-baby-json-hider_rkt.dep new file mode 100644 index 0000000..8f9d7f5 --- /dev/null +++ b/brag/brag/test/compiled/test-baby-json-hider_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("43f054080821974693d9ee992027b3c30927517e" . "83bf9effd1ee7f99450a3e92e3766141972d9f95") (collects #"brag" #"examples" #"baby-json-hider.rkt") (collects #"brag" #"support.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"rackunit" #"main.rkt")) diff --git a/brag/brag/test/compiled/test-baby-json-hider_rkt.zo b/brag/brag/test/compiled/test-baby-json-hider_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..73aa6e3028827c16a9ae6740e010ecb5119f0be2 GIT binary patch literal 2231 zcmb_dO>7%g5PolLuXnxq*}Be8oismfT3TA#s3AeL5tNE5wbPCLlDc+m zcXyp8RHaCjkdTn<2qYxL1#U&$5fVcDq*7_25(4!E2aZT^PbCh_?&im&t;B)#{>+>C zX1@34%{=$L=|7YjPYtDpCx8$V#Ai>oTw2I4Rt=^Z)smH8VpFJXqlAp%ck9aF_@aMn zL`dIup!4cG_ijHtIq=ONZ?$&4{U~s2^1`jJeTYO4o^+8RV#oU(9}o5AOJ-&0+!Ks6 zWHHmy=Joki?W$QWX;<<&X2`V7(6a?*4Q@_Ma~;LCxDa|{4X7efQ6iym>v$R<10DeI z$fAe?5idc&S0Fx9Qlv_Jv2sDs?nqLMS7OLMz7Key-mNOcj}Iu6DI1n3pRv8GrMx9hS9HU~5@KexXwf!vwPfilEQecG#Qj7gE1BIS z?dyEnPN$55C3BKgG4jj0#RhGRtpi@>1R;BcWed)*N#>fGDp;xZYA)v*99OvR zc(lkbyHgn~mb1E*FPFp@P~s>(ddjY}X(zbGu2uEoiI-fc_Iysas!Q%BPZX9bdfwoI z!P(i_8#mMGH+hQ1o>;%adTz?-hspeqew=!u2tduk2#OJ49P3Q$+%c0~V< z$lD?U1?YwVbocMCVFbBfPD3OXAxeLD8oi;Xzo!NiJpIvhP4X!aR-qR_iSc4&&&1-4ZwZh^J5xZr$gq3mjS ze!J9~a02<<#SuJG#k*1PJ|p@#PG@{wj6f^xG%cf=wT>3p>h-db(<(+e%W`=7o^cI_ zM%U+T+`cCO8e6fj-7IZAjMEGRmdd$#w&+&*Gm&lwIRsRTOe^V2 zOk2pWR4YkGPt|4J$m{cHGS~vc#>_J9`Ax7{t{Pc3XjbP@ky!VM5Rg34cyu7DZ61|& z`2@h5_%8=07iyJYW2UaE@xR+IVbk5{YMrScOW4kv*U6~~&hKAhrl~J7F(5+l3CP5& z=U|!LG2+dcI-b}z&*PbTd^mw@iIGI8qc&4ZjM|TY08I^b z*6@2U5#DJ3#EU>B9&XFP-ZTWm=$A~!@ukH>E%l^wDBLy&p$xQvkb!m=)Wy%#M^cH7 z?`fdpK0ZItjt5i}o#nOXH`+gSV6u& zRG49{LI9be!+F`%!wu9AD0Com<9h5ht8wUbmXw2i{#l&$<;HIs_WINKOQK=UHf+jI j1*LbVB)&b<%xS0HpwrFF|G@Q(%w7f`aNq~t`D6VDg+==E literal 0 HcmV?d00001 diff --git a/brag/brag/test/compiled/test-baby-json_rkt.dep b/brag/brag/test/compiled/test-baby-json_rkt.dep new file mode 100644 index 0000000..7a46842 --- /dev/null +++ b/brag/brag/test/compiled/test-baby-json_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("87d418a0a4e39f423ff7913177dbe5bfd0fa8bf6" . "39c77f483e938c1bac09c43d96d0e740e2a2ac55") (collects #"brag" #"examples" #"baby-json.rkt") (collects #"brag" #"support.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"rackunit" #"main.rkt")) diff --git a/brag/brag/test/compiled/test-baby-json_rkt.zo b/brag/brag/test/compiled/test-baby-json_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..577819c2dbd54bf525e45bfba176206ad9b27f76 GIT binary patch literal 2069 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 literal 0 HcmV?d00001 diff --git a/brag/brag/test/compiled/test-flatten_rkt.dep b/brag/brag/test/compiled/test-flatten_rkt.dep new file mode 100644 index 0000000..0b21b74 --- /dev/null +++ b/brag/brag/test/compiled/test-flatten_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("44f386de5de9b199efd938a53686d684711b8b59" . "d6abc65a0064c2432f0d6822f10bb12f671f79ea") (collects #"brag" #"codegen" #"flatten.rkt") (collects #"brag" #"rules" #"stx-types.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"rackunit" #"main.rkt")) diff --git a/brag/brag/test/compiled/test-flatten_rkt.zo b/brag/brag/test/compiled/test-flatten_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..b66c5b2e11646777f0aca22d5fca6beb57d43937 GIT binary patch literal 19183 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 literal 0 HcmV?d00001 diff --git a/brag/brag/test/compiled/test-old-token_rkt.dep b/brag/brag/test/compiled/test-old-token_rkt.dep new file mode 100644 index 0000000..e2f6d90 --- /dev/null +++ b/brag/brag/test/compiled/test-old-token_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("244c1422dc988085c698af7241bc7d0586ab2d47" . "de6eefdbba51c512633e84bd45388ecb7059ac24") (collects #"br-parser-tools" #"lex-sre.rkt") (collects #"br-parser-tools" #"lex.rkt") (collects #"brag" #"examples" #"simple-line-drawing.rkt") (collects #"brag" #"support.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"list.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"rackunit" #"main.rkt")) diff --git a/brag/brag/test/compiled/test-old-token_rkt.zo b/brag/brag/test/compiled/test-old-token_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..fdf619072e07ec72ca33540ea89ee998b6cbe8ad GIT binary patch literal 15504 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 literal 0 HcmV?d00001 diff --git a/brag/brag/test/compiled/test-simple-arithmetic-grammar_rkt.dep b/brag/brag/test/compiled/test-simple-arithmetic-grammar_rkt.dep new file mode 100644 index 0000000..5eaeafd --- /dev/null +++ b/brag/brag/test/compiled/test-simple-arithmetic-grammar_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("c075b07edda5003da7b1bfbfac18d232b707d0a9" . "760983ca4b5b8e37f1113bb65808ced980f6bcd4") (collects #"br-parser-tools" #"lex.rkt") (collects #"brag" #"examples" #"simple-arithmetic-grammar.rkt") (collects #"brag" #"support.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"list.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"racket" #"set.rkt") (collects #"rackunit" #"main.rkt")) diff --git a/brag/brag/test/compiled/test-simple-arithmetic-grammar_rkt.zo b/brag/brag/test/compiled/test-simple-arithmetic-grammar_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..d7d14aadaa6459f141b2c0805364d01839a74864 GIT binary patch literal 7021 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 literal 0 HcmV?d00001 diff --git a/brag/brag/test/compiled/test-weird-grammar_rkt.dep b/brag/brag/test/compiled/test-weird-grammar_rkt.dep new file mode 100644 index 0000000..1835f71 --- /dev/null +++ b/brag/brag/test/compiled/test-weird-grammar_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("59d09aeac644aa8b3036579385e967ede43e8f51" . "766b50c856b353075b57cb446de395bdcbe078be") (collects #"brag" #"test" #"weird-grammar.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"rackunit" #"main.rkt")) diff --git a/brag/brag/test/compiled/test-weird-grammar_rkt.zo b/brag/brag/test/compiled/test-weird-grammar_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..a492bc61e7372d8a863d01ad22e6444bc74613ea GIT binary patch literal 1464 zcma)6O>7%Q6rOo&J6>-{#*Xd$7#l*;?ApybPMQ>lLr_&n)kLKhqKAmCqm4ZdEB~ys z-c3@35C;x$VV#O2CnPv<Djb z!=an`V!n`HdIJa{F>KL_*{T`4j>T2WY1u}T-$m;fC1eH1!S@jLhk=1c$jo`7cc#9$ z_xOXAYoE9)$<3|fXP^K2+v!_D^u&lTnId^|2bEv22{dT5I_<*!D=X5N%{#VwzzwUa z?pk`Ysat89u=Glu+Y4vgQu|@jQC5ttHm1< z1VmAk#Y>QU{NO<;`sbSV$Ma2R>2ynb_UTujr3R3^NM0t_$to$4cgY_4hx}Tn-x8 zAeat?LiGbbB9gw>dDOD?!-a-f(QU(QNg+X~ndU8QeGq3^z|As%fabcuG>E!DL70uw z$BGLv7J#5E1MQ2U3vtL38JUZ@5QVY1F%9CgaU#zpG?xWsh$@f-kY|(7RWNT7#{5i* z7lR=ICWsm^NW@$QZiERM10;@w6dHqsE8(;V39lDtCxvW`3AgY7e$XV^gD(*+n7m3@ z@64(aelxsrwERzoibzhRr+3onaa_u0=k&z#C3;F35CxL(0ay8+qc>h(D!y7=T3yT+ zq~qZXgak6w)-41db(-leUYIaO8`Z5Fc=@H{X$btsYQ@!j zq1eN{NOYoOTTaD(te`ue$8@X;U+6eHXvp<~5~I^oXBV16K>0sc8sei2elK;i3%Qe0H&@8T$K8^fTlAV( z>dHAKKH=h+&!tY1Uj{rMC7aOTg;b&pBRF8}d^U?+E*l@|&dW=w#P-JJ5|%gnS3q5> v>bBD?-}Wn5hEYs{y`N<&TXPgAE!<2tcxJM&4#cG6H%q!v{vL5+xNR2G0_w-fs%9oZSX z4{DSt5bdC2J58n}CqujvXf9@m|bMv`EZuSNcLWXdisWhxrbIrAxZo8IauCtrSjZ#9M$8Z061L;S>K1E3S@SxW} zx%$E2N6GY`|33cw)Ax;N{`Yqt@A;Z&!ILqfkp(24;Nob|v|7!=t*1OLJFMmCoA*ro zHjN5P&|%xC)R>b$2ubgmh!0dDw(|g}EKyM+v3PX81W*PJ0JwxGA|c`<2)ISmq9@CJ z?Qsaaa_Cm=5Q!+7ED`@jT?uJKvNCXl#ba2a`{%xnM#_ou!hN^lu*Gz?#%zn#MFJRx$3ZLu8_ESklGca#l!?1U9pX|JlitXn|0R89~D7NEOkXKx7lpij+j{V z4PDDb7?Px>ZEhG2%loCv*)<3FL`V=S_gJOYC51$2V4#Uz<@@nD$Bp_t2qr?IP;Iko zAtshv+m>T&ESs3WtU5NODWqS!g+i?Ob<^l@O)EjXHB2 zW+U8w*KqCLgh*1z zB!iwR0R&2(2gwqoJfOg3QuIT`gNsrCg0c*>2SZ0Nd<1zPN@Vh)hb2o-rc02?WQaVO zEqPKCY$QXW)%Jlj%N?%P7aoUGlf&-|8~lsk?v5X zl(}P5C5}UcBg4njI6MEs{OpyPTtVC$7>5u?r2pqNSI{~z?zcw2#=X`U9PFK9TC0s7 zhvyHQMBqr+tiE{(FD`K}1%XrC&R@wD<~tbF03B^Pwp(#ttg-FQhF#U0cB8_oc*iaF z1efPJcYM9`PbuhZ%fUW(^iCYZj6~KO)fKkZ>(3?ZdCSo^jJnHO{BDPg!*jP#!L2jh zGS->CYHqpB=`Not8-{HfD=4zrDzlkYVfwWL#(FQM3$H6=Fc;WwwnQLZW)Nb%t+oGHT)oGn8P zhRbjcM#?Y>=Y4YQP!NyfvD2!Go2JGF+tc!FeE1GrC_@6IGK@dlA!B^8eQ8P?`Hn_L wzQ^?=9r=NZ;>n;U;={&aP)G4#j3=W|j-r^rC{D3D#qC`PLI}dZcQ5S!0Ph%-vH$=8 literal 0 HcmV?d00001 diff --git a/brag/brag/test/compiled/test-wordy_rkt.dep b/brag/brag/test/compiled/test-wordy_rkt.dep new file mode 100644 index 0000000..e7764e4 --- /dev/null +++ b/brag/brag/test/compiled/test-wordy_rkt.dep @@ -0,0 +1 @@ +("6.8.0.2" ("aecade1992f3c242a6d3a07823e16c221da23733" . "fc08b1b4e1c113e96b12b77c226f97f56e071d98") (collects #"brag" #"examples" #"wordy.rkt") (collects #"brag" #"support.rkt") (collects #"racket" #"base.rkt") (collects #"racket" #"runtime-config.rkt") (collects #"rackunit" #"main.rkt")) diff --git a/brag/brag/test/compiled/test-wordy_rkt.zo b/brag/brag/test/compiled/test-wordy_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..3ba067a9be60f249ddf4b6d9d479be6e8481f2de GIT binary patch literal 1875 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 literal 0 HcmV?d00001 diff --git a/brag/brag/test/test-01-equal.rkt b/brag/brag/test/test-01-equal.rkt new file mode 100755 index 0000000..dcb2138 --- /dev/null +++ b/brag/brag/test/test-01-equal.rkt @@ -0,0 +1,30 @@ +#lang racket/base + +(require brag/examples/01-equal + rackunit) + +(check-equal? (syntax->datum (parse "")) + '(equal)) +(check-equal? (syntax->datum (parse "01")) + '(equal (zero (equal) #\0) + (one (equal) #\1))) +(check-equal? (syntax->datum (parse "10")) + '(equal (one (equal) #\1) + (zero (equal) #\0))) +(check-equal? (syntax->datum (parse "0011")) + '(equal (zero (equal) #\0) + (one (equal (zero (equal) #\0) + (one (equal) #\1)) + #\1))) +(check-equal? (syntax->datum (parse "0110")) + '(equal (one (equal (zero (equal) #\0) + (one (equal) #\1)) + #\1) + (zero (equal) #\0))) + +(check-equal? (syntax->datum (parse "1100")) + '(equal (one (equal) #\1) + (zero (equal (one (equal) #\1) + (zero (equal) #\0)) + #\0))) + diff --git a/brag/brag/test/test-0n1.rkt b/brag/brag/test/test-0n1.rkt new file mode 100755 index 0000000..5611f6e --- /dev/null +++ b/brag/brag/test/test-0n1.rkt @@ -0,0 +1,50 @@ +#lang racket/base + +(require brag/examples/0n1 + brag/support + rackunit) + +(define (lex ip) + (port-count-lines! ip) + (lambda () + (define next-char (read-char ip)) + (cond [(eof-object? next-char) + (token eof)] + [(char=? next-char #\0) + (token "0" "0")] + [(char=? next-char #\1) + (token "1" "1")]))) + + +(check-equal? (syntax->datum (parse #f (lex (open-input-string "1")))) + '(rule "1")) + + +(check-equal? (syntax->datum (parse #f (lex (open-input-string "01")))) + '(rule "0" "1")) + + +(check-equal? (syntax->datum (parse #f (lex (open-input-string "001")))) + '(rule "0" "0" "1")) + + +(check-exn exn:fail:parsing? + (lambda () + (parse #f (lex (open-input-string "0"))))) + +(check-exn exn:fail:parsing? + (lambda () + (parse #f (lex (open-input-string "10"))))) + +(check-exn exn:fail:parsing? + (lambda () + (parse #f (lex (open-input-string "010"))))) + + +;; This should fail predictably because we're passing in tokens +;; that the parser doesn't know. +(check-exn exn:fail:parsing? + (lambda () (parse '("zero" "one" "zero")))) +(check-exn (regexp (regexp-quote + "Encountered unexpected token \"zero\" (\"zero\") while parsing")) + (lambda () (parse '("zero" "one" "zero")))) diff --git a/brag/brag/test/test-0n1n.rkt b/brag/brag/test/test-0n1n.rkt new file mode 100755 index 0000000..f7655d5 --- /dev/null +++ b/brag/brag/test/test-0n1n.rkt @@ -0,0 +1,49 @@ +#lang racket/base +(require brag/examples/0n1n + brag/support + rackunit) + +(define (lex ip) + (port-count-lines! ip) + (lambda () + (define next-char (read-char ip)) + (cond [(eof-object? next-char) + (token eof)] + [(char=? next-char #\0) + (token "0" "0")] + [(char=? next-char #\1) + (token "1" "1")]))) + + +;; The only rule in the grammar is: +;; +;; rule-0n1n: ["0" rule-0n1n "1"] +;; +;; It makes use of the "maybe" pattern. The result type of the +;; grammar rule is: +;; +;; rule-0n1n: (U #f +;; (list "0" rule-0n1n "1")) + +(check-equal? (syntax->datum (parse #f (lex (open-input-string "0011")))) + '(rule-0n1n "0" (rule-0n1n "0" (rule-0n1n) "1") "1")) + +(check-equal? (syntax->datum (parse #f (lex (open-input-string "01")))) + '(rule-0n1n "0" (rule-0n1n) "1")) + +(check-equal? (syntax->datum (parse #f (lex (open-input-string "")))) + '(rule-0n1n)) + +(check-equal? (syntax->datum (parse #f (lex (open-input-string "000111")))) + '(rule-0n1n "0" (rule-0n1n "0" (rule-0n1n "0" (rule-0n1n) "1") "1") "1")) + + + +(check-exn exn:fail:parsing? + (lambda () (parse #f (lex (open-input-string "0001111"))))) + +(check-exn exn:fail:parsing? + (lambda () (parse #f (lex (open-input-string "0001110"))))) + +(check-exn exn:fail:parsing? + (lambda () (parse #f (lex (open-input-string "10001110"))))) diff --git a/brag/brag/test/test-all.rkt b/brag/brag/test/test-all.rkt new file mode 100755 index 0000000..92c3153 --- /dev/null +++ b/brag/brag/test/test-all.rkt @@ -0,0 +1,18 @@ +#lang racket/base + + +(require "test-0n1.rkt" + "test-0n1n.rkt" + "test-01-equal.rkt" + "test-simple-arithmetic-grammar.rkt" + "test-baby-json.rkt" + "test-baby-json-hider.rkt" + "test-wordy.rkt" + "test-simple-line-drawing.rkt" + "test-flatten.rkt" + "test-lexer.rkt" + "test-parser.rkt" + "test-errors.rkt" + "test-old-token.rkt" + "test-weird-grammar.rkt" + (submod brag/codegen/satisfaction test)) diff --git a/brag/brag/test/test-baby-json-hider.rkt b/brag/brag/test/test-baby-json-hider.rkt new file mode 100755 index 0000000..b7580d6 --- /dev/null +++ b/brag/brag/test/test-baby-json-hider.rkt @@ -0,0 +1,19 @@ +#lang racket/base +(require brag/examples/baby-json-hider + brag/support + rackunit) + +(define parse-result (parse (list "{" + (token 'ID "message") + ":" + (token 'STRING "'hello world'") + "}"))) +(check-equal? (syntax->datum parse-result) '(json (":"))) + +(define syntaxed-colon-parens (cadr (syntax->list parse-result))) +(check-equal? (syntax->datum (syntax-property syntaxed-colon-parens 'kvpair)) 'kvpair) + +(check-equal? + (syntax->datum + (parse "[[[{}]],[],[[{}]]]")) + '(json (array #\[ (json (array #\[ (json (array #\[ (json) #\])) #\])) #\, (json (array #\[ #\])) #\, (json (array #\[ (json (array #\[ (json) #\])) #\])) #\]))) diff --git a/brag/brag/test/test-baby-json.rkt b/brag/brag/test/test-baby-json.rkt new file mode 100755 index 0000000..dff09f4 --- /dev/null +++ b/brag/brag/test/test-baby-json.rkt @@ -0,0 +1,25 @@ +#lang racket/base +(require brag/examples/baby-json + brag/support + rackunit) + +(check-equal? + (syntax->datum + (parse (list "{" + (token 'ID "message") + ":" + (token 'STRING "'hello world'") + "}"))) + '(json (object "{" + (kvpair "message" ":" (json (string "'hello world'"))) + "}"))) + + +(check-equal? + (syntax->datum + (parse "[[[{}]],[],[[{}]]]")) + '(json (array #\[ (json (array #\[ (json (array #\[ (json (object #\{ #\})) #\])) #\])) #\, (json (array #\[ #\])) #\, (json (array #\[ (json (array #\[ (json (object #\{ #\})) #\])) #\])) #\]))) + + + + diff --git a/brag/brag/test/test-cutter.rkt b/brag/brag/test/test-cutter.rkt new file mode 100755 index 0000000..f4a14ac --- /dev/null +++ b/brag/brag/test/test-cutter.rkt @@ -0,0 +1,9 @@ +#lang racket/base +(require brag/examples/cutter + brag/support + rackunit) + +;; related to rule-flattening problem +(check-equal? + (parse-to-datum (list "(" "x" "," "x" ")")) + '(top (expr (list "(" (expr "x") "," (expr "x") ")")))) \ No newline at end of file diff --git a/brag/brag/test/test-errors.rkt b/brag/brag/test/test-errors.rkt new file mode 100755 index 0000000..b84ae34 --- /dev/null +++ b/brag/brag/test/test-errors.rkt @@ -0,0 +1,137 @@ +#lang racket/base + +(require rackunit + (for-syntax racket/base)) + +;; The tests in this module make sure we produce proper error messages +;; on weird grammars. + + +(define-namespace-anchor anchor) +(define ns (namespace-anchor->namespace anchor)) +(define (c prog) + (parameterize ([current-namespace ns] + [read-accept-reader #t]) + (define ip (open-input-string prog)) + (port-count-lines! ip) + (compile (read-syntax #f ip)))) + + +;; Helper to let me quickly write compile-error checks. +(define-syntax (check-compile-error stx) + (syntax-case stx () + [(_ prog expected-msg) + (quasisyntax/loc stx + (begin #,(syntax/loc stx + (check-exn (regexp (regexp-quote expected-msg)) + (lambda () + (c prog)))) + #,(syntax/loc stx + (check-exn exn:fail:syntax? + (lambda () + (c prog))))))])) + + + + + +;; errors with position are sensitive to length of lang line +(define lang-line "#lang brag") + +(check-compile-error (format "~a" lang-line) + "The grammar does not appear to have any rules") + +(check-compile-error (format "~a\nfoo" lang-line) + "Error while parsing grammar near: foo [line=2, column=0, position=12]") + +(check-compile-error (format "~a\nnumber : 42" lang-line) + "Error while parsing grammar near: 42 [line=2, column=9, position=21]") + +(check-compile-error (format "~a\nnumber : 1" lang-line) + "Error while parsing grammar near: 1 [line=2, column=9, position=21]") + + + +(check-compile-error "#lang brag\n x: NUMBER\nx:STRING" + "Rule x has a duplicate definition") + +;; Check to see that missing definitions for rules also raise good syntax +;; errors: + +(check-compile-error "#lang brag\nx:y" + "Rule y has no definition") + +(check-compile-error "#lang brag\nnumber : 1flarbl" + "Rule 1flarbl has no definition") + + + + +(check-compile-error "#lang brag\nprogram: EOF" + "Token EOF is reserved and can not be used in a grammar") + + + +;; Nontermination checks: +(check-compile-error "#lang brag\nx : x" + "Rule x has no finite derivation") + + + +(check-compile-error #<symbol (format "r~a" n))))) + + +;; Simple literals +(check-equal? (map syntax->datum (flatten-rule #'(rule expr (lit "hello")))) + '((prim-rule lit expr [(lit "hello")]))) + +(check-equal? (map syntax->datum + (flatten-rule #'(rule expr + (seq (lit "hello") + (lit "world"))))) + '((prim-rule seq expr [(lit "hello") (lit "world")]))) + + +(check-equal? (map syntax->datum (flatten-rule #'(rule expr (token HELLO)))) + '((prim-rule token expr [(token HELLO)]))) + +(check-equal? (map syntax->datum (flatten-rule #'(rule expr (id rule-2)))) + '((prim-rule id expr [(id rule-2)]))) + + +;; Sequences of primitives +(check-equal? (map syntax->datum + (flatten-rule #'(rule expr (seq (lit "1") (seq (lit "2") (lit "3")))))) + '((prim-rule seq expr + [(lit "1") (lit "2") (lit "3")]))) + +(check-equal? (map syntax->datum + (flatten-rule #'(rule expr (seq (seq (lit "1") (lit "2")) (lit "3"))))) + '((prim-rule seq expr + [(lit "1") (lit "2") (lit "3")]))) + + +(check-equal? (map syntax->datum + (flatten-rule #'(rule expr (seq (seq (lit "1")) (seq (lit "2") (lit "3")))))) + '((prim-rule seq expr + [(lit "1") (lit "2") (lit "3")]))) + + + +;; choices +(check-equal? (map syntax->datum + (flatten-rule #'(rule expr (choice (id rule-2) (id rule-3))))) + '((prim-rule choice expr + [(id rule-2)] + [(id rule-3)]))) + +(check-equal? (map syntax->datum + (flatten-rule #'(rule sexp (choice (seq (lit "(") (lit ")")) + (seq))) + #:fresh-name (make-fresh-name))) + '((prim-rule choice sexp + [(lit "(") (lit ")")] []))) + +(check-equal? (map syntax->datum + (flatten-rule #'(rule sexp (choice (seq (seq (lit "(") (token BLAH)) + (lit ")")) + (seq))) + #:fresh-name (make-fresh-name))) + '((prim-rule choice sexp + [(lit "(") (token BLAH) (lit ")")] []))) + + + + +;; maybe +(check-equal? (map syntax->datum + (flatten-rule #'(rule expr (maybe (id rule-2))))) + '((prim-rule maybe expr + [(id rule-2)] + []))) +(check-equal? (map syntax->datum + (flatten-rule #'(rule expr (maybe (token HUH))))) + '((prim-rule maybe expr + [(token HUH)] + []))) +(check-equal? (map syntax->datum + (flatten-rule #'(rule expr (maybe (seq (lit "hello") (lit "world")))))) + '((prim-rule maybe expr + [(lit "hello") (lit "world")] + []))) + + + + +;; repeat +(check-equal? (map syntax->datum + (flatten-rule #'(rule rule-2+ (repeat 0 (id rule-2))))) + '((prim-rule repeat rule-2+ + [(inferred-id rule-2+ repeat) (id rule-2)] + []))) +(check-equal? (map syntax->datum + (flatten-rule #'(rule rule-2+ (repeat 0 (seq (lit "+") (id rule-2)))))) + '((prim-rule repeat rule-2+ + [(inferred-id rule-2+ repeat) (lit "+") (id rule-2)] + []))) + +(check-equal? (map syntax->datum + (flatten-rule #'(rule rule-2+ (repeat 1 (id rule-2))))) + '((prim-rule repeat rule-2+ + [(inferred-id rule-2+ repeat) (id rule-2)] + [(id rule-2)]))) +(check-equal? (map syntax->datum + (flatten-rule #'(rule rule-2+ (repeat 1 (seq (lit "-") (id rule-2)))))) + '((prim-rule repeat rule-2+ + [(inferred-id rule-2+ repeat) (lit "-") (id rule-2)] + [(lit "-") (id rule-2)]))) + + + + + + +;; Mixtures + +;; choice and maybe +(check-equal? (map syntax->datum + (flatten-rule #'(rule sexp (choice (lit "x") + (maybe (lit "y")))) + #:fresh-name (make-fresh-name))) + '((prim-rule choice sexp + [(lit "x")] + [(inferred-id r1 maybe)]) + (inferred-prim-rule maybe r1 + [(lit "y")] + []))) +;; choice, maybe, repeat +(check-equal? (map syntax->datum + (flatten-rule #'(rule sexp (choice (lit "x") + (maybe (repeat 1 (lit "y"))))) + #:fresh-name (make-fresh-name))) + '((prim-rule choice sexp + [(lit "x")] + [(inferred-id r1 maybe)]) + (inferred-prim-rule maybe r1 + [(inferred-id r2 repeat)] + []) + (inferred-prim-rule repeat r2 + [(inferred-id r2 repeat) (lit "y")] + [(lit "y")]))) +;; choice, seq +(check-equal? (map syntax->datum + (flatten-rule #'(rule sexp (choice (seq (lit "x") (lit "y")) + (seq (lit "z") (lit "w")))) + #:fresh-name (make-fresh-name))) + '((prim-rule choice sexp + [(lit "x") (lit "y")] + [(lit "z") (lit "w")]))) + +;; maybe, choice +(check-equal? (map syntax->datum + (flatten-rule #'(rule sexp (maybe (choice (seq (lit "x") (lit "y")) + (seq (lit "z") (lit "w"))))) + #:fresh-name (make-fresh-name))) + '((prim-rule maybe sexp + [(inferred-id r1 choice)] + []) + (inferred-prim-rule choice r1 + [(lit "x") (lit "y")] + [(lit "z") (lit "w")]))) + + +;; seq, repeat +(check-equal? (map syntax->datum + (flatten-rule #'(rule expr (seq (id term) (repeat 0 (seq (lit "+") (id term))))) + #:fresh-name (make-fresh-name))) + '((prim-rule seq expr [(id term) (inferred-id r1 repeat)]) + (inferred-prim-rule repeat r1 [(inferred-id r1 repeat) (lit "+") (id term)] []))) + + +;; larger example: simple arithmetic +(check-equal? (map syntax->datum + (flatten-rules (syntax->list + #'((rule expr (seq (id term) (repeat 0 (seq (lit "+") (id term))))) + (rule term (seq (id factor) (repeat 0 (seq (lit "*") (id factor))))) + (rule factor (token INT)))) + #:fresh-name (make-fresh-name))) + + '((prim-rule seq expr [(id term) (inferred-id r1 repeat)]) + (inferred-prim-rule repeat r1 [(inferred-id r1 repeat) (lit "+") (id term)] []) + (prim-rule seq term [(id factor) (inferred-id r2 repeat)]) + (inferred-prim-rule repeat r2 [(inferred-id r2 repeat) (lit "*") (id factor)] []) + (prim-rule token factor [(token INT)]))) diff --git a/brag/brag/test/test-lexer.rkt b/brag/brag/test/test-lexer.rkt new file mode 100755 index 0000000..49f3774 --- /dev/null +++ b/brag/brag/test/test-lexer.rkt @@ -0,0 +1,73 @@ +#lang racket/base +(require brag/rules/lexer + rackunit + br-parser-tools/lex) + +(define (l s) + (define t (lex/1 (open-input-string s))) + (list (token-name (position-token-token t)) + (token-value (position-token-token t)) + (position-offset (position-token-start-pos t)) + (position-offset (position-token-end-pos t)))) + +;; WARNING: the offsets are not in terms of file positions. So they +;; start counting at 1, not 0. +(check-equal? (l " hi") + '(ID "hi" 2 4)) + +(check-equal? (l " hi") + '(ID "hi" 3 5)) + +(check-equal? (l "hi") + '(ID "hi" 1 3)) + +(check-equal? (l "# foobar\nhi") + '(ID "hi" 10 12)) + +(check-equal? (l "# foobar\rhi") + '(ID "hi" 10 12)) + +(check-equal? (l "# foobar\r\nhi") + '(ID "hi" 11 13)) + +(check-equal? (l "hi:") + '(RULE_HEAD "hi:" 1 4)) + +(check-equal? (l "hi :") + '(RULE_HEAD "hi :" 1 7)) + +(check-equal? (l "|") + '(PIPE "|" 1 2)) + +(check-equal? (l "(") + '(LPAREN "(" 1 2)) + +(check-equal? (l "[") + '(LBRACKET "[" 1 2)) + +(check-equal? (l ")") + '(RPAREN ")" 1 2)) + +(check-equal? (l "]") + '(RBRACKET "]" 1 2)) + +(check-equal? (l "'hello'") + '(LIT "'hello'" 1 8)) + +(check-equal? (l "'he\\'llo'") + '(LIT "'he\\'llo'" 1 10)) + +(check-equal? (l "/") + '(HIDE "/" 1 2)) + +(check-equal? (l " /") + '(HIDE "/" 2 3)) + +(check-equal? (l "@") + '(SPLICE "@" 1 2)) + +(check-equal? (l " @") + '(SPLICE "@" 2 3)) + +(check-equal? (l "#:prefix-out val:") + (list 'EOF eof 18 18)) ; lexer skips kwarg \ No newline at end of file diff --git a/brag/brag/test/test-old-token.rkt b/brag/brag/test/test-old-token.rkt new file mode 100755 index 0000000..2654b68 --- /dev/null +++ b/brag/brag/test/test-old-token.rkt @@ -0,0 +1,76 @@ +#lang racket/base + +;; Make sure the old token type also works fine. + +(require brag/examples/simple-line-drawing + brag/support + racket/list + br-parser-tools/lex + (prefix-in : br-parser-tools/lex-sre) + rackunit) + +(define-tokens tokens (INTEGER STRING |;| EOF)) + +(define (make-tokenizer ip) + (port-count-lines! ip) + (define lex (lexer-src-pos + [(:+ numeric) + (token-INTEGER (string->number lexeme))] + [upper-case + (token-STRING lexeme)] + ["b" + (token-STRING " ")] + [";" + (|token-;| lexeme)] + [whitespace + (return-without-pos (lex input-port))] + [(eof) + (token-EOF 'eof)])) + (lambda () + (lex ip))) + + + +(define the-parsed-object-stx + (parse (make-tokenizer (open-input-string #<list the-parsed-object-stx)))) + +(check-equal? (syntax->datum the-parsed-object-stx) + '(drawing (rows (repeat 3) (chunk 9 "X") ";") + (rows (repeat 6) (chunk 3 " ") (chunk 3 "X") (chunk 3 " ") ";") + (rows (repeat 3) (chunk 9 "X") ";"))) + +(define the-parsed-object (syntax->list the-parsed-object-stx)) + +(check-equal? (syntax-line the-parsed-object-stx) 1) +(check-equal? (syntax-column the-parsed-object-stx) 0) +(check-equal? (syntax-position the-parsed-object-stx) 1) +(check-equal? (syntax-span the-parsed-object-stx) 28) + +(check-equal? (length the-parsed-object) 4) + +(check-equal? (syntax->datum (second the-parsed-object)) + '(rows (repeat 3) (chunk 9 "X") ";")) +(check-equal? (syntax-line (list-ref the-parsed-object 1)) 1) + +(check-equal? (syntax->datum (third the-parsed-object)) + '(rows (repeat 6) (chunk 3 " ") (chunk 3 "X") (chunk 3 " ") ";")) +(check-equal? (syntax-line (list-ref the-parsed-object 2)) 2) + +(check-equal? (syntax->datum (fourth the-parsed-object)) + '(rows (repeat 3) (chunk 9 "X") ";")) +(check-equal? (syntax-line (list-ref the-parsed-object 3)) 3) + +;; FIXME: add tests to make sure location is as we expect. +;; +;; FIXME: handle the EOF issue better. Something in cfg-parser +;; appears to deviate from br-parser-tools/yacc with regards to the stop +;; token. diff --git a/brag/brag/test/test-parser.rkt b/brag/brag/test/test-parser.rkt new file mode 100755 index 0000000..2b56e27 --- /dev/null +++ b/brag/brag/test/test-parser.rkt @@ -0,0 +1,153 @@ +#lang racket/base + + +(require rackunit + br-parser-tools/lex + brag/rules/parser + brag/rules/lexer + brag/rules/rule-structs) + + +;; quick-and-dirty helper for pos construction. +(define (p x) + (pos x #f #f)) + + + +;; FIXME: fix the test cases so they work on locations rather than just offsets. +(check-equal? (grammar-parser (tokenize (open-input-string "expr : 'hello'"))) + (list (rule (p 1) (p 15) + (lhs-id (p 1) (p 5) "expr" #f) + (pattern-lit (p 8) (p 15) "hello" #f)))) + +(check-equal? (grammar-parser (tokenize (open-input-string "expr : COLON"))) + (list (rule (p 1) (p 13) + (lhs-id (p 1) (p 5) "expr" #f) + (pattern-token (p 8) (p 13) "COLON" #f)))) + +(check-equal? (grammar-parser (tokenize (open-input-string "/expr : COLON"))) + (list (rule (p 1) (p 14) + (lhs-id (p 1) (p 6) "expr" ''hide) + (pattern-token (p 9) (p 14) "COLON" #f)))) + +(check-equal? (grammar-parser (tokenize (open-input-string "@expr : COLON"))) + (list (rule (p 1) (p 14) + (lhs-id (p 1) (p 6) "expr" ''splice) + (pattern-token (p 9) (p 14) "COLON" #f)))) + +(check-equal? (grammar-parser (tokenize (open-input-string "expr : /COLON COLON"))) + (list (rule (p 1) (p 20) + (lhs-id (p 1) (p 5) "expr" #f) + (pattern-seq (p 8) (p 20) + (list + (pattern-token (p 8) (p 14) "COLON" 'hide) + (pattern-token (p 15) (p 20) "COLON" #f)))))) + +(check-equal? (grammar-parser (tokenize (open-input-string "expr : /thing COLON"))) + (list (rule (p 1) (p 20) + (lhs-id (p 1) (p 5) "expr" #f) + (pattern-seq (p 8) (p 20) + (list + (pattern-id (p 8) (p 14) "thing" 'hide) + (pattern-token (p 15) (p 20) "COLON" #f)))))) + +(check-equal? (grammar-parser (tokenize (open-input-string "expr : @thing COLON"))) + (list (rule (p 1) (p 20) + (lhs-id (p 1) (p 5) "expr" #f) + (pattern-seq (p 8) (p 20) + (list + (pattern-id (p 8) (p 14) "thing" 'splice) + (pattern-token (p 15) (p 20) "COLON" #f)))))) + +(check-equal? (grammar-parser (tokenize (open-input-string "expr : 'hello'*"))) + (list (rule (p 1) (p 16) + (lhs-id (p 1) (p 5) "expr" #f) + (pattern-repeat (p 8) (p 16) + 0 + (pattern-lit (p 8) (p 15) "hello" #f))))) + +(check-equal? (grammar-parser (tokenize (open-input-string "expr : 'hello'+"))) + (list (rule (p 1) (p 16) + (lhs-id (p 1) (p 5) "expr" #f) + (pattern-repeat (p 8) (p 16) + 1 + (pattern-lit (p 8) (p 15) "hello" #f))))) + +(check-equal? (grammar-parser (tokenize (open-input-string "expr : [/'hello']"))) + (list (rule (p 1) (p 18) + (lhs-id (p 1) (p 5) "expr" #f) + (pattern-maybe (p 8) (p 18) + (pattern-lit (p 9) (p 17) "hello" 'hide))))) + +(check-equal? (grammar-parser (tokenize (open-input-string "expr : COLON | BLAH"))) + (list (rule (p 1) (p 20) + (lhs-id (p 1) (p 5) "expr" #f) + (pattern-choice (p 8) (p 20) + (list (pattern-token (p 8) (p 13) "COLON" #f) + (pattern-token (p 16) (p 20) "BLAH" #f)))))) + +(check-equal? (grammar-parser (tokenize (open-input-string "expr : COLON | BLAH | BAZ expr"))) + (list (rule (p 1) (p 31) + (lhs-id (p 1) (p 5) "expr" #f) + (pattern-choice (p 8) (p 31) + (list (pattern-token (p 8) (p 13) "COLON" #f) + (pattern-token (p 16) (p 20) "BLAH" #f) + (pattern-seq (p 23) (p 31) + (list (pattern-token (p 23) (p 26) "BAZ" #f) + (pattern-id (p 27) (p 31) "expr" #f)))))))) + +(check-equal? (grammar-parser (tokenize (open-input-string "expr : one two /three"))) + (list (rule (p 1) (p 22) + (lhs-id (p 1) (p 5) "expr" #f) + (pattern-seq (p 8) (p 22) (list (pattern-id (p 8) (p 11) "one" #f) + (pattern-id (p 12) (p 15) "two" #f) + (pattern-id (p 16) (p 22) "three" 'hide)))))) + +(check-equal? (grammar-parser (tokenize (open-input-string "expr : (one two three)"))) + (list (rule (p 1) (p 23) + (lhs-id (p 1) (p 5) "expr" #f) + (pattern-seq (p 8) (p 23) (list (pattern-id (p 9) (p 12) "one" #f) + (pattern-id (p 13) (p 16) "two" #f) + (pattern-id (p 17) (p 22) "three" #f)))))) + +(check-equal? (grammar-parser (tokenize (open-input-string "expr : one two* three"))) + (list (rule (p 1) (p 22) + (lhs-id (p 1) (p 5) "expr" #f) + (pattern-seq (p 8) (p 22) (list (pattern-id (p 8) (p 11) "one" #f) + (pattern-repeat (p 12) (p 16) 0 (pattern-id (p 12) (p 15) "two" #f)) + (pattern-id (p 17) (p 22) "three" #f)))))) + +(check-equal? (grammar-parser (tokenize (open-input-string "expr : one two+ three"))) + (list (rule (p 1) (p 22) + (lhs-id (p 1) (p 5) "expr" #f) + (pattern-seq (p 8) (p 22) (list (pattern-id (p 8) (p 11) "one" #f) + (pattern-repeat (p 12) (p 16) 1 (pattern-id (p 12) (p 15) "two" #f)) + (pattern-id (p 17) (p 22) "three" #f)))))) + +(check-equal? (grammar-parser (tokenize (open-input-string "expr : (one two)+ three"))) + (list (rule (p 1) (p 24) + (lhs-id (p 1) (p 5) "expr" #f) + (pattern-seq (p 8) (p 24) (list (pattern-repeat (p 8) (p 18) 1 + (pattern-seq (p 8) (p 17) + (list (pattern-id (p 9) (p 12) "one" #f) + (pattern-id (p 13) (p 16) "two" #f)))) + (pattern-id (p 19) (p 24) "three" #f)))))) + + +(check-equal? (grammar-parser (tokenize (open-input-string #<number lexeme))] + [whitespace + (token 'WHITESPACE #:skip? #t)] + ["+" + (token '+ "+")] + ["*" + (token '* "*")] + [(eof) + (token eof)])) + (lambda () + (lex/1 ip))) + + +;; expr : term ('+' term)* +;; term : factor (('*') factor)* +;; factor : INT + +(check-equal? (syntax->datum (parse #f (tokenize (open-input-string "42")))) + '(expr (term (factor 42)))) +(check-equal? (syntax->datum (parse #f (tokenize (open-input-string "3+4")))) + '(expr (term (factor 3)) + "+" + (term (factor 4)))) +(check-equal? (syntax->datum (parse #f (tokenize (open-input-string "3+4+5")))) + '(expr (term (factor 3)) + "+" + (term (factor 4)) + "+" + (term (factor 5)))) + + +(check-equal? (syntax->datum (parse #f (tokenize (open-input-string "3*4*5")))) + '(expr (term (factor 3) "*" (factor 4) "*" (factor 5)))) + + +(check-equal? (syntax->datum (parse #f (tokenize (open-input-string "3*4 + 5*6")))) + '(expr (term (factor 3) "*" (factor 4)) + "+" + (term (factor 5) "*" (factor 6)))) + +(check-equal? (syntax->datum (parse #f (tokenize (open-input-string "4*5+6")))) + '(expr (term (factor 4) "*" (factor 5)) + "+" + (term (factor 6)))) + +(check-equal? (syntax->datum (parse #f (tokenize (open-input-string "4+5 *6")))) + '(expr (term (factor 4)) + "+" + (term (factor 5) "*" (factor 6)))) + + +(check-exn exn:fail:parsing? + (lambda () (parse #f (tokenize (open-input-string "7+"))))) +(check-exn exn:fail:parsing? + (lambda () (parse #f (tokenize (open-input-string "7+6+"))))) + + +(check-equal? all-token-types + (set '+ '* 'INT)) diff --git a/brag/brag/test/test-simple-line-drawing.rkt b/brag/brag/test/test-simple-line-drawing.rkt new file mode 100755 index 0000000..b9e3d19 --- /dev/null +++ b/brag/brag/test/test-simple-line-drawing.rkt @@ -0,0 +1,72 @@ +#lang racket/base + +(require brag/examples/simple-line-drawing + brag/support + racket/list + br-parser-tools/lex + (prefix-in : br-parser-tools/lex-sre) + rackunit) + +(define (make-tokenizer ip) + (port-count-lines! ip) + (define lex (lexer-src-pos + [(:+ numeric) + (token 'INTEGER (string->number lexeme))] + [upper-case + (token 'STRING lexeme)] + ["b" + (token 'STRING " ")] + [";" + (token ";" lexeme)] + [whitespace + (token 'WHITESPACE lexeme #:skip? #t)] + [(eof) + (void)])) + (lambda () + (lex ip))) + + + +(define the-parsed-object-stx + (parse (make-tokenizer (open-input-string #<list the-parsed-object-stx)))) + +(check-equal? (syntax->datum the-parsed-object-stx) + '(drawing (rows (repeat 3) (chunk 9 "X") ";") + (rows (repeat 6) (chunk 3 " ") (chunk 3 "X") (chunk 3 " ") ";") + (rows (repeat 3) (chunk 9 "X") ";"))) + +(define the-parsed-object (syntax->list the-parsed-object-stx)) + +(check-equal? (syntax-line the-parsed-object-stx) 1) +(check-equal? (syntax-column the-parsed-object-stx) 0) +(check-equal? (syntax-position the-parsed-object-stx) 1) +(check-equal? (syntax-span the-parsed-object-stx) 28) + +(check-equal? (length the-parsed-object) 4) + +(check-equal? (syntax->datum (second the-parsed-object)) + '(rows (repeat 3) (chunk 9 "X") ";")) +(check-equal? (syntax-line (list-ref the-parsed-object 1)) 1) + +(check-equal? (syntax->datum (third the-parsed-object)) + '(rows (repeat 6) (chunk 3 " ") (chunk 3 "X") (chunk 3 " ") ";")) +(check-equal? (syntax-line (list-ref the-parsed-object 2)) 2) + +(check-equal? (syntax->datum (fourth the-parsed-object)) + '(rows (repeat 3) (chunk 9 "X") ";")) +(check-equal? (syntax-line (list-ref the-parsed-object 3)) 3) + +;; FIXME: add tests to make sure location is as we expect. +;; +;; FIXME: handle the EOF issue better. Something in cfg-parser +;; appears to deviate from br-parser-tools/yacc with regards to the stop +;; token. diff --git a/brag/brag/test/test-weird-grammar.rkt b/brag/brag/test/test-weird-grammar.rkt new file mode 100755 index 0000000..1847feb --- /dev/null +++ b/brag/brag/test/test-weird-grammar.rkt @@ -0,0 +1,7 @@ +#lang racket/base + +(require "weird-grammar.rkt" + rackunit) + +(check-equal? (syntax->datum (parse '("foo"))) + '(foo "foo")) diff --git a/brag/brag/test/test-whitespace.rkt b/brag/brag/test/test-whitespace.rkt new file mode 100755 index 0000000..455ee3f --- /dev/null +++ b/brag/brag/test/test-whitespace.rkt @@ -0,0 +1,12 @@ +#lang racket/base +(require brag/examples/whitespace + brag/support + rackunit) + +(check-equal? + (parse-to-datum "\ty\n x\tz") + '(start (tab "\t") (letter "y") (newline "\n") (space " ") (letter "x") (tab "\t") (letter "z"))) + +(check-equal? + (parse-to-datum "\t\n \t") + '(start (tab "\t") (newline "\n") (space " ") (tab "\t"))) diff --git a/brag/brag/test/test-wordy.rkt b/brag/brag/test/test-wordy.rkt new file mode 100755 index 0000000..bcb516d --- /dev/null +++ b/brag/brag/test/test-wordy.rkt @@ -0,0 +1,18 @@ +#lang racket/base +(require brag/examples/wordy + brag/support + rackunit) + +(check-equal? + (syntax->datum + (parse (list "hello" "world"))) + '(sentence (verb (greeting "hello")) (optional-adjective) (object "world"))) + + + +(check-equal? + (syntax->datum + (parse (list "hola" "frumpy" (token 'WORLD "세계")))) + + '(sentence (verb (greeting "hola")) (optional-adjective "frumpy") (object "세계"))) + diff --git a/brag/brag/test/weird-grammar.rkt b/brag/brag/test/weird-grammar.rkt new file mode 100755 index 0000000..094ddcd --- /dev/null +++ b/brag/brag/test/weird-grammar.rkt @@ -0,0 +1,6 @@ +#lang brag + +;; This used to fail when we had the yacc-based backend, but +;; cfg-parser seems to be ok with it. + +foo: "foo" diff --git a/brag/compiled/info_rkt.dep b/brag/compiled/info_rkt.dep new file mode 100644 index 0000000..d9ddf54 --- /dev/null +++ b/brag/compiled/info_rkt.dep @@ -0,0 +1 @@ +("6.7.0.3" ("204513a73112731266f01cc8a274660a65d93031" . "a5c1fb83a37820ddc78fedf5c303e1df7f1896cc") (collects #"setup" #"infotab" #"lang" #"reader.rkt") (collects #"setup" #"infotab.rkt")) diff --git a/brag/compiled/info_rkt.zo b/brag/compiled/info_rkt.zo new file mode 100644 index 0000000000000000000000000000000000000000..16aabffea3ff75c2e7b504683d8a02fd9b1ab588 GIT binary patch literal 1053 zcmZ{jzi-n(6vv;R6W2e|=9=aQEiHA_l5^6=gx{qT0tr>>(gC4LC=@3-S}Um?*^UH7 zDq>_nE`ouXjfDX^zybq>zk(kF8%V5B2E;jOXc@3&>wVvS?(28YcT<}KXUwx^#XNa= z$3gr;dCB&Uu>qTF!TE!#0G`Ttwy=Q+Wy3%&w@_-STrNBYT82GZM9fEuwCauG(HK{xEu|dUNczy$GNY1 zt{2xkt-!w2M+-?JRtZKGp@;-i1yaS~>0zLSR5c_b#Suh0JtAxwA*M+T2Pj2>NGM?j zW&S9bDWpSAkwT`*kq`wGQ$*xIlEhJ+smRUak(PV9T#+A&-GtIhlq&L(nN&zHR52N9 zL{t>yyrL*m+W2nvg_3)Rs4Q(6wD?y_TpIgQ#=&3N*BTBxSqag<=zWd zu8oiX%tCGlce54lMKx^?UR-21+q{RYq5G`vIt|_ORy*s=3G~3#YfQKFw&&JaqvJ6> zShINAYBFEvpXh`BtiI|7^ZF*sy~kd8JKbt&zgjMNwX|RDj=&o+_#^jL$gJ?*Nhm)s zl=Q{}6etli0_nraIR&FjBr3*KjH@W+vnc0tsN@gv-=rw~l^->hLQ3~0#(Pc}#~1;l zL+Fix-=X_zP$jRcP&x+&ET#3Y_h63kqeVzHX#Gl`J4<@wAj2d>-l z%PqSmB@&)hZ+09z=t@r93f5eQ6HVsW8_eU2rN*9(s#-yrH@S}Z^y7WH) literal 0 HcmV?d00001 diff --git a/brag/info.rkt b/brag/info.rkt new file mode 100755 index 0000000..0211925 --- /dev/null +++ b/brag/info.rkt @@ -0,0 +1,7 @@ +#lang setup/infotab + +(define deps '("base" "br-parser-tools-lib" "rackunit-lib")) +(define build-deps '("at-exp-lib" "br-parser-tools-doc" "racket-doc" + "scribble-lib")) +(define collection 'multi) +