From 010262b662c50f1aa74cbc8c75c0921c0d772043 Mon Sep 17 00:00:00 2001 From: DongHun Kwak Date: Tue, 20 Feb 2018 15:21:10 +0900 Subject: [PATCH] Imported Upstream version 1.0.3 Change-Id: If88247edb45f7ce9413d4b25db30833c808f7436 Signed-off-by: DongHun Kwak --- .gitignore | 10 - CHANGELOG | 106 +- Makefile.am | 273 +- Makefile.in | 2008 ++ aclocal.m4 | 1189 + bootstrap/doc/re2c.1 | 1610 +- bootstrap/src/ast/lex.cc | 3014 ++ bootstrap/src/ast/lex_conf.cc | 4049 +++ bootstrap/src/ast/parser.cc | 1835 + bootstrap/src/{parse => ast}/y.tab.h | 73 +- bootstrap/src/conf/help.cc | 264 + bootstrap/src/conf/parse_opts.cc | 3452 +- bootstrap/src/parse/lex.cc | 2861 -- bootstrap/src/parse/lex_conf.cc | 2284 -- bootstrap/src/parse/parser.cc | 2464 -- build.sh | 10 - build_mingw.sh | 10 - compile | 348 + config.h.in | 58 + configure | 6690 ++++ configure.ac | 9 +- depcomp | 791 + distcheck.sh | 24 - doc/help.rst | 5 + doc/help.rst.in | 5 + doc/manpage.rst.in | 958 +- doc/manual/contributors.rst_ | 34 + doc/manual/features/conditions/conditions.rst_ | 52 + doc/manual/features/encodings/encodings.rst_ | 56 + doc/manual/features/generic_api/generic_api.rst_ | 54 + doc/manual/features/state/state.rst_ | 28 + doc/manual/features/submatch/submatch.rst_ | 68 + doc/manual/options/options_list.rst | 171 + doc/manual/syntax/configurations.rst_ | 308 + doc/manual/syntax/interface.rst_ | 119 + doc/manual/syntax/named_definitions.rst_ | 6 + doc/manual/syntax/regular_expressions.rst_ | 44 + doc/manual/syntax/rules.rst_ | 17 + doc/manual/warnings/warnings_general.rst | 22 + doc/manual/warnings/warnings_list.rst | 40 + doc/tdfa/tdfa.pdf | Bin 0 -> 836087 bytes examples/001_upn_calculator/README | 83 - examples/001_upn_calculator/calc_001.re | 84 - examples/001_upn_calculator/calc_002.re | 69 - examples/001_upn_calculator/calc_003.re | 61 - examples/001_upn_calculator/calc_004.re | 78 - examples/001_upn_calculator/calc_005.re | 144 - examples/001_upn_calculator/calc_006.s.re | 162 - examples/001_upn_calculator/calc_007.b.re | 135 - examples/001_upn_calculator/calc_008.b.re | 158 - examples/001_upn_calculator/windows/HiResTimer.h | 54 - examples/001_upn_calculator/windows/main.b.re | 291 - examples/002_strip_comments/README | 21 - examples/002_strip_comments/strip_001.s.re | 147 - examples/002_strip_comments/strip_002.s.re | 162 - examples/002_strip_comments/strip_003.b.re | 179 - examples/01_recognizing_integers.i.c | 171 + examples/01_recognizing_integers.i.re | 38 + examples/02_recognizing_strings.i.c | 72 + examples/02_recognizing_strings.i.re | 47 + examples/03_arbitrary_large_input.i.c | 121 + examples/03_arbitrary_large_input.i.re | 78 + examples/04_parsing_integers_blocks.i.c | 251 + examples/04_parsing_integers_blocks.i.re | 78 + examples/05_parsing_integers_conditions.ci.c | 251 + examples/05_parsing_integers_conditions.ci.re | 59 + examples/06_braille.cr8i.c | 1701 + examples/06_braille.cr8i.re | 229 + examples/07_cxx98.i.c | 8332 +++++ examples/07_cxx98.i.re | 374 + examples/08_ipv4.i--tags.c | 253 + examples/08_ipv4.i--tags.re | 32 + examples/09_etc_passwd.i--tags.c | 238 + examples/09_etc_passwd.i--tags.re | 74 + examples/10_uri_rfc3986.i--tags.c | 7935 +++++ examples/10_uri_rfc3986.i--tags.re | 169 + examples/11_http_rfc7230.i--tags.c | 13267 +++++++ examples/11_http_rfc7230.i--tags.re | 296 + examples/13_records.i--tags.c | 1226 + examples/13_records.i--tags.re | 98 + examples/14_options.i--tags.c | 1636 + examples/14_options.i--tags.re | 91 + examples/15_binsyms.i--input(custom).c | 209 + examples/15_binsyms.i--input(custom).re | 49 + examples/16_fake_sentinel.i--input(custom).c | 249 + examples/16_fake_sentinel.i--input(custom).re | 31 + examples/17_ifstream.i--input(custom).c | 49 + examples/17_ifstream.i--input(custom).re | 30 + examples/18_push_model.if.c | 240 + examples/18_push_model.if.re | 95 + examples/input_custom/fixed.re | 35 - examples/input_custom/simple/README | 20 - examples/input_custom/simple/default.re | 24 - examples/input_custom/simple/fgetc.re | 43 - examples/input_custom/simple/istringstream.re | 27 - examples/langs/c.re | 272 - examples/langs/modula.re | 203 - examples/langs/rexx.re | 319 - examples/push_model/push.re | 340 - genhelp.sh | 13 + install-sh | 501 + missing | 215 + run_tests.sh.in | 59 +- src/adfa/action.h | 108 + src/adfa/adfa.cc | 177 + src/adfa/adfa.h | 120 + src/adfa/dump.cc | 101 + src/adfa/dump.h | 15 + src/adfa/prepare.cc | 348 + src/ast/ast.cc | 145 + src/ast/ast.h | 140 + src/{parse => ast}/input.cc | 2 +- src/{parse => ast}/input.h | 8 +- src/{parse => ast}/lex.re | 491 +- src/ast/lex_conf.re | 300 + src/ast/normalize.cc | 49 + src/ast/parser.h | 32 + src/ast/parser.ypp | 274 + src/ast/scanner.cc | 98 + src/ast/scanner.h | 120 + src/{parse => ast}/unescape.cc | 2 +- src/{parse => ast}/unescape.h | 6 +- src/ast/validate.cc | 99 + src/code/bitmap.cc | 150 + src/code/bitmap.h | 48 + src/code/emit.h | 29 + src/code/emit_action.cc | 473 + src/code/emit_dfa.cc | 285 + src/code/go.h | 240 + src/code/go_construct.cc | 328 + src/{codegen => code}/go_destruct.cc | 10 +- src/code/go_emit.cc | 249 + src/{codegen => code}/go_used_labels.cc | 35 +- src/code/input_api.cc | 131 + src/code/input_api.h | 37 + src/{codegen => code}/label.cc | 2 +- src/{codegen => code}/label.h | 9 +- src/code/output.cc | 776 + src/code/output.h | 191 + src/code/print.cc | 96 + src/code/print.h | 17 + src/codegen/bitmap.cc | 168 - src/codegen/bitmap.h | 45 - src/codegen/emit.h | 43 - src/codegen/emit_action.cc | 388 - src/codegen/emit_dfa.cc | 348 - src/codegen/go.h | 216 - src/codegen/go_construct.cc | 284 - src/codegen/go_emit.cc | 271 - src/codegen/indent.h | 24 - src/codegen/input_api.cc | 175 - src/codegen/input_api.h | 43 - src/codegen/output.cc | 465 - src/codegen/output.h | 158 - src/codegen/print.cc | 156 - src/codegen/print.h | 20 - src/compile.cc | 193 + src/compile.h | 19 + src/conf/msg.cc | 197 +- src/conf/msg.h | 10 +- src/conf/opt.cc | 220 +- src/conf/opt.h | 394 +- src/conf/parse_opts.re | 144 +- src/conf/warn.cc | 77 +- src/conf/warn.h | 32 +- src/dfa/cfg/cfg.cc | 205 + src/dfa/cfg/cfg.h | 57 + src/dfa/cfg/compact.cc | 48 + src/dfa/cfg/dce.cc | 29 + src/dfa/cfg/dump.cc | 85 + src/dfa/cfg/freeze.cc | 56 + src/dfa/cfg/interfere.cc | 101 + src/dfa/cfg/liveanal.cc | 173 + src/dfa/cfg/normalize.cc | 116 + src/dfa/cfg/optimize.cc | 47 + src/dfa/cfg/rename.cc | 55 + src/dfa/cfg/varalloc.cc | 145 + src/dfa/closure.cc | 522 + src/dfa/closure.h | 68 + src/dfa/dead_rules.cc | 252 + src/dfa/determinization.cc | 194 + src/dfa/dfa.h | 86 + src/dfa/dump.cc | 328 + src/dfa/dump.h | 45 + src/dfa/fallback_tags.cc | 132 + src/{ir => }/dfa/fillpoints.cc | 23 +- src/dfa/find_state.cc | 418 + src/dfa/find_state.h | 95 + src/{ir => }/dfa/minimization.cc | 78 +- src/dfa/tagpool.cc | 83 + src/dfa/tagpool.h | 52 + src/dfa/tagtree.cc | 159 + src/dfa/tagtree.h | 48 + src/dfa/tcmd.cc | 229 + src/dfa/tcmd.h | 56 + src/globals.h | 24 - src/ir/adfa/action.h | 109 - src/ir/adfa/adfa.cc | 135 - src/ir/adfa/adfa.h | 101 - src/ir/adfa/prepare.cc | 268 - src/ir/compile.cc | 104 - src/ir/compile.h | 20 - src/ir/dfa/determinization.cc | 197 - src/ir/dfa/dfa.h | 58 - src/ir/nfa/calc_size.cc | 50 - src/ir/nfa/nfa.cc | 72 - src/ir/nfa/nfa.h | 90 - src/ir/nfa/split.cc | 49 - src/ir/regexp/display.cc | 51 - src/ir/regexp/encoding/range_suffix.cc | 38 - src/ir/regexp/encoding/utf16/utf16_regexp.h | 16 - src/ir/regexp/encoding/utf8/utf8_range.h | 18 - src/ir/regexp/encoding/utf8/utf8_regexp.h | 16 - src/ir/regexp/fixed_length.cc | 55 - src/ir/regexp/regexp.cc | 241 - src/ir/regexp/regexp.h | 52 - src/ir/regexp/regexp_alt.h | 31 - src/ir/regexp/regexp_cat.h | 30 - src/ir/regexp/regexp_close.h | 27 - src/ir/regexp/regexp_match.h | 29 - src/ir/regexp/regexp_null.h | 21 - src/ir/regexp/regexp_rule.h | 52 - src/ir/rule_rank.cc | 68 - src/ir/rule_rank.h | 44 - src/ir/skeleton/control_flow.cc | 61 - src/ir/skeleton/generate_code.cc | 323 - src/ir/skeleton/generate_data.cc | 215 - src/ir/skeleton/match_empty.cc | 49 - src/ir/skeleton/maxlen.cc | 50 - src/ir/skeleton/path.h | 103 - src/ir/skeleton/skeleton.cc | 163 - src/ir/skeleton/skeleton.h | 174 - src/ir/skeleton/unreachable.cc | 73 - src/ir/skeleton/way.cc | 74 - src/ir/skeleton/way.h | 20 - src/main.cc | 59 +- src/nfa/dump.cc | 80 + src/nfa/estimate_size.cc | 46 + src/nfa/nfa.h | 121 + src/nfa/re_to_nfa.cc | 125 + src/parse/code.cc | 8 - src/parse/code.h | 31 - src/parse/extop.h | 17 - src/parse/lex_conf.re | 222 - src/parse/loc.h | 24 - src/parse/parser.h | 28 - src/parse/parser.ypp | 775 - src/parse/rules.h | 29 - src/parse/scanner.cc | 211 - src/parse/scanner.h | 147 - src/parse/spec.h | 55 - src/re/ast_to_re.cc | 373 + src/re/default_tags.cc | 58 + src/{ir/regexp => re}/empty_class_policy.h | 6 +- src/{ir/regexp => re}/encoding/case.h | 6 +- src/{ir/regexp => re}/encoding/enc.cc | 5 +- src/{ir/regexp => re}/encoding/enc.h | 69 +- src/re/encoding/range_suffix.cc | 32 + src/{ir/regexp => re}/encoding/range_suffix.h | 13 +- src/{ir/regexp => re}/encoding/utf16/utf16.cc | 2 +- src/{ir/regexp => re}/encoding/utf16/utf16.h | 6 +- .../regexp => re}/encoding/utf16/utf16_range.cc | 7 +- src/{ir/regexp => re}/encoding/utf16/utf16_range.h | 8 +- .../regexp => re}/encoding/utf16/utf16_regexp.cc | 26 +- src/re/encoding/utf16/utf16_regexp.h | 16 + src/{ir/regexp => re}/encoding/utf8/utf8.cc | 2 +- src/{ir/regexp => re}/encoding/utf8/utf8.h | 6 +- src/{ir/regexp => re}/encoding/utf8/utf8_range.cc | 7 +- src/re/encoding/utf8/utf8_range.h | 18 + src/{ir/regexp => re}/encoding/utf8/utf8_regexp.cc | 22 +- src/re/encoding/utf8/utf8_regexp.h | 16 + src/re/fixed_tags.cc | 84 + src/re/nullable.cc | 51 + src/re/re.h | 128 + src/re/rule.cc | 12 + src/re/rule.h | 89 + src/re/split_charset.cc | 60 + src/re/tag.cc | 12 + src/re/tag.h | 82 + src/skeleton/control_flow.cc | 116 + src/skeleton/generate_code.cc | 521 + src/skeleton/generate_data.cc | 409 + src/skeleton/maxpath.cc | 71 + src/skeleton/path.h | 78 + src/skeleton/skeleton.cc | 107 + src/skeleton/skeleton.h | 125 + src/util/hash32.h | 21 + src/util/lookup.h | 122 + src/util/ord_hash_set.h | 115 - src/util/range.h | 2 +- src/util/s_to_n32_unsafe.h | 3 +- src/util/slab_allocator.h | 70 + src/util/string_utils.h | 37 + src/util/wrap_iter.h | 26 + test-driver | 148 + test/bug1054496.c | 4 +- test/bug116.c | 7 +- test/bug1163046.--skeleton.c | 39 +- test/bug1163046.c | 1 + test/bug128.c | 5 +- test/bug1297658.c | 6 +- test/bug142.c | Bin 0 -> 46 bytes test/bug142.re | Bin 0 -> 2 bytes test/bug145.ci.c | 59 + test/bug145.ci.re | 32 + test/bug147.c | 1 + test/bug147.re | 3 + test/bug152.c.c | 15 + test/bug152.c.re | 10 + test/bug1529351.c | 2 +- test/bug1682718.c | 5 +- test/bug1682718.is.c | 3 +- test/bug1708378.ib.c | 4 +- test/bug2462777.ci.c | 2 +- test/bug46_infinite_loop.c | 1 - test/bug47_dot_escapes.--emit-dot.c | 2 - test/bug57.c | 14 +- test/bug57_original.bi--case-insensitive.c | 804 +- test/bug60_redundant_yymarker.ci.c | 54 +- test/bug61.i--empty-class(error).c | 2 +- test/bug61.i--empty-class(match-empty).c | 2 +- .../bug61.i--empty-class(match-none)--eager-skip.c | 49 + ...bug61.i--empty-class(match-none)--eager-skip.re | 19 + test/bug61.i.c | 2 +- test/bug61_difference_full.i--empty-class(error).c | 2 +- ...g61_difference_negative.i--empty-class(error).c | 2 +- ...fference_negative.i--empty-class(match-empty).c | 2 +- test/bug61_difference_negative.i.c | 2 +- ...g61_difference_positive.i--empty-class(error).c | 2 +- ...fference_positive.i--empty-class(match-empty).c | 2 +- test/bug61_difference_positive.i.c | 2 +- test/bug61_negative.i--empty-class(error).c | 2 +- test/bug61_positive.i--empty-class(error).c | 2 +- test/c.c | 360 +- test/calc_001.c | 23 +- test/calc_001.dei.c | 5 +- test/calc_001.ei.c | 5 +- test/calc_002.c | 23 +- test/calc_003.c | 23 +- test/calc_004.c | 21 +- test/calc_005.c | 21 +- test/calc_006.s.c | 24 +- test/calc_007.b.c | 24 +- test/calc_008.b--skeleton.c | Bin 21928 -> 19162 bytes test/calc_008.b.c | 24 +- test/class3.i8.c | 912 +- test/cmmap.c | 360 +- test/cnokw.c | 168 +- test/code_points.8.c | 8 +- test/code_points.x.c | 4 +- test/code_points_error.8.c | 2 +- test/code_points_error.c | 2 +- test/code_points_error.e.c | 2 +- test/code_points_error.u.c | 2 +- test/code_points_error.w.c | 2 +- test/code_points_error.x.c | 2 +- test/code_points_error_esc.c | 1 - test/code_points_error_lf.c | 1 - test/cond_error_00.c | 2 +- test/cond_error_01.c.c | 2 +- test/cond_error_02.c.c | 1 - test/cond_error_02.c.re | 5 - test/cond_error_03.c.c | 2 +- test/cond_error_04.c.c | 1 - test/cond_error_04.c.re | 5 - test/cond_error_05.c.c | 1 - test/cond_error_05.c.re | 5 - test/cond_error_06.c.c | 1 - test/cond_error_06.c.re | 5 - test/cond_error_07.c.c | 2 +- test/cond_error_08.c.c | 2 +- test/cond_error_09.c.c | 2 +- test/cond_error_10.c.c | 4 +- test/cond_error_11.c.c | 4 +- test/cond_error_12.c.c | 1 + test/cond_error_12.c.re | 6 + test/condition_02.c.c | 2 +- test/condition_02.cg.c | 2 +- test/condition_03.cg.c | 2 +- test/condition_05.cg.c | 34 +- test/condition_05.cgitcondition_05.cgit.h.c | 22 +- test/condition_05.cgtcondition_05.cgt.h.c | 34 +- test/condition_05.cs.c | 34 +- test/condition_06.cs.c | 163 +- test/condition_07.cbi.c | 1 - test/condition_08.cbi.c | 135 +- test/condition_08.cbif.c | 143 +- test/condition_09.cbif.c | 144 +- test/condition_09.cgif.c | 246 +- test/condition_10.cgif--skeleton.c | 535 +- test/condition_10.cgif.c | 238 +- test/condition_11.cg.c | 2 +- test/condition_12.cgif.c | 238 +- test/condition_13.cg.c | 2 +- test/condition_13a.cg.c | 74 + test/condition_13a.cg.re | 9 + test/condition_14.cbif.c | 136 +- test/condition_14.cgif.c | 238 +- test/condition_14.cif.c | 152 +- test/condition_14.csif.c | 136 +- test/condition_15.csif.c | 136 +- test/condtype_decl.c.c | 9 +- test/condtype_decl.cg.c | 9 +- test/condtype_decl.cs.c | 9 +- test/condtype_forwdecl.cg.c | 3 +- test/condtype_forwdecl.cs.c | 3 +- test/condtype_yysetcondition.cg.c | 21 +- test/condtype_yysetcondition.cs.c | 21 +- test/config/flags.c | 3 + test/config/flags.re | 44 + test/config10.--skeleton.c | Bin 19428 -> 18365 bytes test/config10.c | 19 +- test/config12_error1.c | 2 +- test/config4f.f.c | 7 +- test/config4g.ifs.c | 1 + test/config5.c | 15 +- test/config6.c | 14 +- test/config8.c | 19 +- test/config9.b.c | 17 +- test/control_flow_fail.--skeleton.c | Bin 10908 -> 11339 bytes test/control_flow_fail.c | 6 +- test/control_flow_ok.--skeleton.c | Bin 7423 -> 7854 bytes test/control_flow_ok.c | 6 +- test/control_flow_yymarker_fail.--skeleton.c | Bin 10357 -> 10776 bytes test/control_flow_yymarker_fail.c | 2 +- test/control_flow_yymarker_ok.--skeleton.c | Bin 8241 -> 8660 bytes test/control_flow_yymarker_ok.c | 6 +- ...ontrol_flow_yymarker_yyaccept_fail.--skeleton.c | Bin 14805 -> 15281 bytes test/control_flow_yymarker_yyaccept_fail.c | 2 +- .../control_flow_yymarker_yyaccept_ok.--skeleton.c | Bin 12143 -> 12619 bytes test/control_flow_yymarker_yyaccept_ok.c | 2 +- test/cpoint_class_error_eol.c | 1 + test/cpoint_class_error_eol.re | 4 + test/cpoint_class_error_esc_eol.c | 1 + test/cpoint_class_error_esc_eol.re | 4 + test/cpoint_string_error_eol.c | 1 + ...ints_error_lf.re => cpoint_string_error_eol.re} | 0 test/cpoint_string_error_esc_eol.c | 1 + ...error_esc.re => cpoint_string_error_esc_eol.re} | 0 test/ctx.--skeleton.c | Bin 19438 -> 18355 bytes test/ctx.b.c | 18 +- test/ctx.c | 20 +- test/ctx.s.c | 18 +- test/cunroll.c | 270 +- test/default.8.c | 5 +- test/default.c | 5 +- test/default.e.c | 5 +- test/default.u.c | 5 +- test/default.w.c | 5 +- test/default.x.c | 5 +- test/default_dup.i.c | 2 +- test/default_dup.ic.c | 2 +- test/default_dup_star_1.ic.c | 15 +- test/default_dup_star_2.ic.c | 2 +- test/default_full.8--encoding-policy(fail).c | 4 +- test/default_full.8--encoding-policy(substitute).c | 4 +- test/default_full.8.c | 4 +- test/default_full.c | 5 +- test/default_full.e.c | 5 +- test/default_full.u.c | 5 +- test/default_full.w.c | 5 +- test/default_full.x--encoding-policy(fail).c | 5 +- test/default_full.x--encoding-policy(substitute).c | 5 +- test/default_full.x.c | 4 +- test/dot.--emit-dot.c | 4 +- test/dot2.--emit-dot.c | 4 +- test/dot_backslash.--emit-dot.c | 2 - test/dot_conditions.c--emit-dot.c | 4 - test/dot_ranges.--emit-dot.c | 4 +- test/enc_reset.i.c | 47 + test/enc_reset.i.re | 14 + test/error1.c | 2 +- test/error10.c | 2 +- test/error11.c | 2 +- test/error12.c | 2 +- test/error13.1.c | 9 +- test/error13.c | 9 +- test/error14.1.c | 2 + test/error14.c | 2 + test/error15.c | 1 + test/error15.re | 7 + test/error2.c | 2 +- test/error3.c | 2 +- test/error4.c | 2 +- test/error5.c | 2 +- test/error6.c | 2 +- test/error7.c | 2 +- test/error8.c | 2 +- test/error9.c | 2 +- test/flex-01.i.c | 2 +- test/input11.b--eager-skip.c | 139 + test/input11.b--eager-skip.re | 17 + test/input2.b.c | 2 - test/input2.c | 2 - test/input3.c | 2 - test/input4.--empty-class(error).c | 2 +- test/input4.--empty-class(match-empty).c | 11 +- test/input4.--empty-class(match-none).c | 5 +- test/input4.c | 11 +- test/input6.--empty-class(error).c | 2 +- test/input6.--empty-class(match-empty).c | 11 +- test/input6.--empty-class(match-none).c | 5 +- test/input6.c | 11 +- test/input8.b.c | 1 - test/input8.c | 1 - test/input8.g.c | 1 - test/input_custom_default.--input(custom).c | 7 +- ...nput_custom_default.--skeleton--input(custom).c | Bin 49002 -> 49438 bytes test/input_custom_fgetc.--input(custom).c | 7 +- .../input_custom_fgetc.--skeleton--input(custom).c | Bin 48998 -> 49434 bytes test/input_custom_istringstream.--input(custom).c | 7 +- ...ustom_istringstream.--skeleton--input(custom).c | Bin 49014 -> 49450 bytes test/input_custom_mjson.--input(custom).c | 141 +- .../input_custom_mjson.--skeleton--input(custom).c | 447 +- test/main.b.c | 31 +- test/modula.c | 330 +- test/overflow-2.c | 2 +- test/overflow-3.c | 2 +- test/parse_date.b.c | 271 +- test/parse_date.c | 313 +- test/parse_date.db.c | 211 +- test/parse_date.g.c | 271 +- test/parse_date.s.c | 271 +- test/parse_date_1_78.db.c | 171 +- ...40822_zend_language_scanner.igcd--flex-syntax.c | 9156 +++-- ..._zend_language_scanner_crlf.igcd--flex-syntax.c | 7553 ---- ...zend_language_scanner_crlf.igcd--flex-syntax.re | 2443 -- test/php20150211_json_scanner.igc.c | 14 +- test/php20150211_parse_date.ig.c | 177 +- test/php20150211_parse_date_crlf.ig.c | 27020 --------------- test/php20150211_parse_date_crlf.ig.re | 2245 -- .../php20150211_parse_iso_intervals.ig--skeleton.c | 52 +- test/php20150211_parse_iso_intervals.ig.c | 3 +- test/php20150211_pdo_sql_parser.ig--skeleton.c | 178 +- test/php20150211_pdo_sql_parser.ig.c | 128 +- ...p20150211_pdo_sql_parser_trimmed.ig--skeleton.c | 845 + ...20150211_pdo_sql_parser_trimmed.ig--skeleton.re | 20 + test/php20150211_pdo_sql_parser_trimmed.ig.c | 316 + test/php20150211_pdo_sql_parser_trimmed.ig.re | 20 + test/php20150211_phar_path_check.ig--skeleton.c | 56 +- test/php20150211_phpdbg_lexer.igcd--flex-syntax.c | 2215 +- test/php20150211_url_scanner_ex.ig--skeleton.c | 469 +- test/php20150211_var_unserializer.ig--skeleton.c | 79 +- ...anner.c--emit-dot--flex-syntax--case-inverted.c | 991 +- ..._ini_scanner.igcd--flex-syntax--case-inverted.c | 4680 ++- ...er.igcd--skeleton--flex-syntax--case-inverted.c | 25645 +++++++++++--- ...0211_zend_ini_scanner_trimmed.ic--flex-syntax.c | 1346 +- ...11_zend_ini_scanner_trimmed.icwb--flex-syntax.c | 2794 +- ...1_zend_ini_scanner_trimmed_minimal_wb_bug.iwb.c | 2 +- ...anner.c--emit-dot--flex-syntax--case-inverted.c | 2965 +- ...uage_scanner.igcd--flex-syntax--case-inverted.c | 10246 +++--- ...er.igcd--skeleton--flex-syntax--case-inverted.c | 34507 ++++++++++--------- test/posix_captures/.dat/basic.dat | 59 + test/posix_captures/.dat/categorize.dat | 11 + test/posix_captures/.dat/forcedassoc.dat | 28 + test/posix_captures/.dat/glennfowler.dat | 59 + test/posix_captures/.dat/nullsubexpr.dat | 51 + test/posix_captures/.dat/osxbsdcritical.dat | 7 + test/posix_captures/.dat/other.dat | 69 + test/posix_captures/.dat/repetition.dat | 94 + test/posix_captures/.dat/rightassoc.dat | 12 + test/posix_captures/.gen/__gen.sh | 25 + test/posix_captures/.gen/template | 7 + test/posix_captures/.run/__run.sh | 44 + test/posix_captures/.run/template | 49 + test/posix_captures/basic/01.i--flex-syntax.c | 87 + test/posix_captures/basic/01.i--flex-syntax.re | Bin 0 -> 95 bytes test/posix_captures/basic/02.i--flex-syntax.c | 87 + test/posix_captures/basic/02.i--flex-syntax.re | Bin 0 -> 95 bytes test/posix_captures/basic/03.i--flex-syntax.c | 59 + test/posix_captures/basic/03.i--flex-syntax.re | 7 + test/posix_captures/basic/04.i--flex-syntax.c | 45 + test/posix_captures/basic/04.i--flex-syntax.re | 7 + test/posix_captures/basic/05.i--flex-syntax.c | 95 + test/posix_captures/basic/05.i--flex-syntax.re | 7 + test/posix_captures/basic/06.i--flex-syntax.c | 95 + test/posix_captures/basic/06.i--flex-syntax.re | 7 + test/posix_captures/basic/07.i--flex-syntax.c | 31 + test/posix_captures/basic/07.i--flex-syntax.re | 7 + test/posix_captures/basic/08.i--flex-syntax.c | 39 + test/posix_captures/basic/08.i--flex-syntax.re | 7 + test/posix_captures/basic/09.i--flex-syntax.c | 44 + test/posix_captures/basic/09.i--flex-syntax.re | Bin 0 -> 81 bytes test/posix_captures/basic/10.i--flex-syntax.c | 77 + test/posix_captures/basic/10.i--flex-syntax.re | 7 + test/posix_captures/basic/11.i--flex-syntax.c | 43 + test/posix_captures/basic/11.i--flex-syntax.re | Bin 0 -> 80 bytes test/posix_captures/basic/12.i--flex-syntax.c | 62 + test/posix_captures/basic/12.i--flex-syntax.re | 7 + test/posix_captures/basic/13.i--flex-syntax.c | 62 + test/posix_captures/basic/13.i--flex-syntax.re | 7 + test/posix_captures/basic/14.i--flex-syntax.c | 53 + test/posix_captures/basic/14.i--flex-syntax.re | 7 + test/posix_captures/basic/15.i--flex-syntax.c | 97 + test/posix_captures/basic/15.i--flex-syntax.re | Bin 0 -> 106 bytes test/posix_captures/basic/16.i--flex-syntax.c | 78 + test/posix_captures/basic/16.i--flex-syntax.re | 7 + test/posix_captures/basic/17.i--flex-syntax.c | 78 + test/posix_captures/basic/17.i--flex-syntax.re | 7 + test/posix_captures/basic/18.i--flex-syntax.c | 55 + test/posix_captures/basic/18.i--flex-syntax.re | 7 + test/posix_captures/basic/19.i--flex-syntax.c | 109 + test/posix_captures/basic/19.i--flex-syntax.re | 7 + test/posix_captures/basic/20.i--flex-syntax.c | 318 + test/posix_captures/basic/20.i--flex-syntax.re | Bin 0 -> 109 bytes test/posix_captures/basic/21.i--flex-syntax.c | 45 + test/posix_captures/basic/21.i--flex-syntax.re | 7 + test/posix_captures/basic/22.i--flex-syntax.c | 84 + test/posix_captures/basic/22.i--flex-syntax.re | 7 + test/posix_captures/basic/23.i--flex-syntax.c | 97 + test/posix_captures/basic/23.i--flex-syntax.re | 7 + test/posix_captures/basic/24.i--flex-syntax.c | 132 + test/posix_captures/basic/24.i--flex-syntax.re | 7 + test/posix_captures/basic/25.i--flex-syntax.c | 41 + test/posix_captures/basic/25.i--flex-syntax.re | 7 + test/posix_captures/basic/26.i--flex-syntax.c | 50 + test/posix_captures/basic/26.i--flex-syntax.re | 7 + test/posix_captures/basic/27.i--flex-syntax.c | 50 + test/posix_captures/basic/27.i--flex-syntax.re | 7 + test/posix_captures/basic/28.i--flex-syntax.c | 48 + test/posix_captures/basic/28.i--flex-syntax.re | 7 + test/posix_captures/basic/29.i--flex-syntax.c | 48 + test/posix_captures/basic/29.i--flex-syntax.re | 7 + test/posix_captures/basic/30.i--flex-syntax.c | 42 + test/posix_captures/basic/30.i--flex-syntax.re | 7 + test/posix_captures/basic/31.i--flex-syntax.c | 40 + test/posix_captures/basic/31.i--flex-syntax.re | 7 + test/posix_captures/basic/32.i--flex-syntax.c | 40 + test/posix_captures/basic/32.i--flex-syntax.re | 7 + test/posix_captures/basic/33.i--flex-syntax.c | 28 + test/posix_captures/basic/33.i--flex-syntax.re | 7 + test/posix_captures/basic/34.i--flex-syntax.c | 43 + test/posix_captures/basic/34.i--flex-syntax.re | 7 + test/posix_captures/basic/35.i--flex-syntax.c | 29 + test/posix_captures/basic/35.i--flex-syntax.re | 7 + test/posix_captures/basic/36.i--flex-syntax.c | 36 + test/posix_captures/basic/36.i--flex-syntax.re | 7 + test/posix_captures/basic/37.i--flex-syntax.c | 31 + test/posix_captures/basic/37.i--flex-syntax.re | 7 + test/posix_captures/basic/38.i--flex-syntax.c | 57 + test/posix_captures/basic/38.i--flex-syntax.re | 7 + test/posix_captures/basic/39.i--flex-syntax.c | 58 + test/posix_captures/basic/39.i--flex-syntax.re | 7 + test/posix_captures/basic/40.i--flex-syntax.c | 54 + test/posix_captures/basic/40.i--flex-syntax.re | 7 + test/posix_captures/basic/41.i--flex-syntax.c | 44 + test/posix_captures/basic/41.i--flex-syntax.re | 7 + test/posix_captures/basic/42.i--flex-syntax.c | 52 + test/posix_captures/basic/42.i--flex-syntax.re | 7 + test/posix_captures/basic/43.i--flex-syntax.c | 100 + test/posix_captures/basic/43.i--flex-syntax.re | 7 + test/posix_captures/basic/44.i--flex-syntax.c | 28 + test/posix_captures/basic/44.i--flex-syntax.re | 7 + test/posix_captures/basic/45.i--flex-syntax.c | 39 + test/posix_captures/basic/45.i--flex-syntax.re | 7 + test/posix_captures/basic/46.i--flex-syntax.c | 59 + test/posix_captures/basic/46.i--flex-syntax.re | 7 + test/posix_captures/basic/47.i--flex-syntax.c | 46 + test/posix_captures/basic/47.i--flex-syntax.re | 7 + test/posix_captures/basic/48.i--flex-syntax.c | 47 + test/posix_captures/basic/48.i--flex-syntax.re | 7 + test/posix_captures/basic/49.i--flex-syntax.c | 55 + test/posix_captures/basic/49.i--flex-syntax.re | 7 + test/posix_captures/basic/50.i--flex-syntax.c | 52 + test/posix_captures/basic/50.i--flex-syntax.re | 7 + test/posix_captures/basic/51.i--flex-syntax.c | 65 + test/posix_captures/basic/51.i--flex-syntax.re | 7 + test/posix_captures/basic/52.i--flex-syntax.c | 90 + test/posix_captures/basic/52.i--flex-syntax.re | 7 + test/posix_captures/basic/53.i--flex-syntax.c | 60 + test/posix_captures/basic/53.i--flex-syntax.re | 7 + test/posix_captures/basic/54.i--flex-syntax.c | 53 + test/posix_captures/basic/54.i--flex-syntax.re | 7 + test/posix_captures/basic/55.i--flex-syntax.c | 42 + test/posix_captures/basic/55.i--flex-syntax.re | 7 + test/posix_captures/basic/56.i--flex-syntax.c | 66 + test/posix_captures/basic/56.i--flex-syntax.re | Bin 0 -> 84 bytes test/posix_captures/basic/57.i--flex-syntax.c | 47 + test/posix_captures/basic/57.i--flex-syntax.re | 7 + test/posix_captures/basic/58.i--flex-syntax.c | 44 + test/posix_captures/basic/58.i--flex-syntax.re | 7 + test/posix_captures/basic/59.i--flex-syntax.c | 67 + test/posix_captures/basic/59.i--flex-syntax.re | 7 + test/posix_captures/categorize/01.i--flex-syntax.c | 122 + .../posix_captures/categorize/01.i--flex-syntax.re | 7 + test/posix_captures/categorize/02.i--flex-syntax.c | 102 + .../posix_captures/categorize/02.i--flex-syntax.re | 7 + test/posix_captures/categorize/03.i--flex-syntax.c | 61 + .../posix_captures/categorize/03.i--flex-syntax.re | Bin 0 -> 90 bytes test/posix_captures/categorize/04.i--flex-syntax.c | 59 + .../posix_captures/categorize/04.i--flex-syntax.re | 7 + test/posix_captures/categorize/05.i--flex-syntax.c | 116 + .../posix_captures/categorize/05.i--flex-syntax.re | 7 + test/posix_captures/categorize/06.i--flex-syntax.c | 36 + .../posix_captures/categorize/06.i--flex-syntax.re | 7 + test/posix_captures/categorize/07.i--flex-syntax.c | 36 + .../posix_captures/categorize/07.i--flex-syntax.re | 7 + test/posix_captures/categorize/08.i--flex-syntax.c | 152 + .../posix_captures/categorize/08.i--flex-syntax.re | 7 + test/posix_captures/categorize/09.i--flex-syntax.c | 56 + .../posix_captures/categorize/09.i--flex-syntax.re | 7 + test/posix_captures/categorize/10.i--flex-syntax.c | 32 + .../posix_captures/categorize/10.i--flex-syntax.re | Bin 0 -> 81 bytes test/posix_captures/categorize/11.i--flex-syntax.c | 193 + .../posix_captures/categorize/11.i--flex-syntax.re | 7 + ...exponential_epsilon_closure.i--posix-captures.c | 19 + ...xponential_epsilon_closure.i--posix-captures.re | 6 + .../posix_captures/forcedassoc/01.i--flex-syntax.c | 78 + .../forcedassoc/01.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/02.i--flex-syntax.c | 78 + .../forcedassoc/02.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/03.i--flex-syntax.c | 78 + .../forcedassoc/03.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/04.i--flex-syntax.c | 78 + .../forcedassoc/04.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/05.i--flex-syntax.c | 94 + .../forcedassoc/05.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/06.i--flex-syntax.c | 94 + .../forcedassoc/06.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/07.i--flex-syntax.c | 94 + .../forcedassoc/07.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/08.i--flex-syntax.c | 94 + .../forcedassoc/08.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/09.i--flex-syntax.c | 81 + .../forcedassoc/09.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/10.i--flex-syntax.c | 81 + .../forcedassoc/10.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/11.i--flex-syntax.c | 81 + .../forcedassoc/11.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/12.i--flex-syntax.c | 81 + .../forcedassoc/12.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/13.i--flex-syntax.c | 68 + .../forcedassoc/13.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/14.i--flex-syntax.c | 68 + .../forcedassoc/14.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/15.i--flex-syntax.c | 84 + .../forcedassoc/15.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/16.i--flex-syntax.c | 84 + .../forcedassoc/16.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/17.i--flex-syntax.c | 63 + .../forcedassoc/17.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/18.i--flex-syntax.c | 63 + .../forcedassoc/18.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/19.i--flex-syntax.c | 68 + .../forcedassoc/19.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/20.i--flex-syntax.c | 68 + .../forcedassoc/20.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/21.i--flex-syntax.c | 84 + .../forcedassoc/21.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/22.i--flex-syntax.c | 84 + .../forcedassoc/22.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/23.i--flex-syntax.c | 63 + .../forcedassoc/23.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/24.i--flex-syntax.c | 63 + .../forcedassoc/24.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/25.i--flex-syntax.c | 36 + .../forcedassoc/25.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/26.i--flex-syntax.c | 36 + .../forcedassoc/26.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/27.i--flex-syntax.c | 50 + .../forcedassoc/27.i--flex-syntax.re | 7 + .../posix_captures/forcedassoc/28.i--flex-syntax.c | 50 + .../forcedassoc/28.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/01.i--flex-syntax.c | 58 + .../glennfowler/01.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/02.i--flex-syntax.c | 85 + .../glennfowler/02.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/03.i--flex-syntax.c | 72 + .../glennfowler/03.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/04.i--flex-syntax.c | 87 + .../glennfowler/04.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/05.i--flex-syntax.c | 23 + .../glennfowler/05.i--flex-syntax.re | Bin 0 -> 76 bytes .../posix_captures/glennfowler/06.i--flex-syntax.c | 23 + .../glennfowler/06.i--flex-syntax.re | Bin 0 -> 79 bytes .../posix_captures/glennfowler/07.i--flex-syntax.c | 31 + .../glennfowler/07.i--flex-syntax.re | Bin 0 -> 83 bytes .../posix_captures/glennfowler/08.i--flex-syntax.c | 29 + .../glennfowler/08.i--flex-syntax.re | Bin 0 -> 79 bytes .../posix_captures/glennfowler/09.i--flex-syntax.c | 33 + .../glennfowler/09.i--flex-syntax.re | Bin 0 -> 77 bytes .../posix_captures/glennfowler/10.i--flex-syntax.c | 25 + .../glennfowler/10.i--flex-syntax.re | Bin 0 -> 81 bytes .../posix_captures/glennfowler/11.i--flex-syntax.c | 25 + .../glennfowler/11.i--flex-syntax.re | Bin 0 -> 84 bytes .../posix_captures/glennfowler/12.i--flex-syntax.c | 38 + .../glennfowler/12.i--flex-syntax.re | Bin 0 -> 93 bytes .../posix_captures/glennfowler/13.i--flex-syntax.c | 36 + .../glennfowler/13.i--flex-syntax.re | Bin 0 -> 84 bytes .../posix_captures/glennfowler/14.i--flex-syntax.c | 51 + .../glennfowler/14.i--flex-syntax.re | Bin 0 -> 105 bytes .../posix_captures/glennfowler/15.i--flex-syntax.c | 46 + .../glennfowler/15.i--flex-syntax.re | Bin 0 -> 84 bytes .../posix_captures/glennfowler/16.i--flex-syntax.c | 40 + .../glennfowler/16.i--flex-syntax.re | Bin 0 -> 82 bytes .../posix_captures/glennfowler/17.i--flex-syntax.c | 83 + .../glennfowler/17.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/18.i--flex-syntax.c | 83 + .../glennfowler/18.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/19.i--flex-syntax.c | 81 + .../glennfowler/19.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/20.i--flex-syntax.c | 36 + .../glennfowler/20.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/21.i--flex-syntax.c | 69 + .../glennfowler/21.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/22.i--flex-syntax.c | 59 + .../glennfowler/22.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/23.i--flex-syntax.c | 48 + .../glennfowler/23.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/24.i--flex-syntax.c | 76 + .../glennfowler/24.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/25.i--flex-syntax.c | 81 + .../glennfowler/25.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/26.i--flex-syntax.c | 57 + .../glennfowler/26.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/27.i--flex-syntax.c | 116 + .../glennfowler/27.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/28.i--flex-syntax.c | 202 + .../glennfowler/28.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/29.i--flex-syntax.c | 152 + .../glennfowler/29.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/30.i--flex-syntax.c | 42 + .../glennfowler/30.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/31.i--flex-syntax.c | 73 + .../glennfowler/31.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/32.i--flex-syntax.c | 120 + .../glennfowler/32.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/33.i--flex-syntax.c | 64 + .../glennfowler/33.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/34.i--flex-syntax.c | 43 + .../glennfowler/34.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/35.i--flex-syntax.c | 70 + .../glennfowler/35.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/36.i--flex-syntax.c | 56 + .../glennfowler/36.i--flex-syntax.re | 7 + .../posix_captures/glennfowler/37.i--flex-syntax.c | 34 + .../glennfowler/37.i--flex-syntax.re | Bin 0 -> 83 bytes .../posix_captures/glennfowler/38.i--flex-syntax.c | 32 + .../glennfowler/38.i--flex-syntax.re | Bin 0 -> 81 bytes .../posix_captures/glennfowler/39.i--flex-syntax.c | 76 + .../glennfowler/39.i--flex-syntax.re | Bin 0 -> 86 bytes .../posix_captures/glennfowler/40.i--flex-syntax.c | 429 + .../glennfowler/40.i--flex-syntax.re | Bin 0 -> 103 bytes .../posix_captures/glennfowler/41.i--flex-syntax.c | 174 + .../glennfowler/41.i--flex-syntax.re | Bin 0 -> 87 bytes .../posix_captures/glennfowler/42.i--flex-syntax.c | 41 + .../glennfowler/42.i--flex-syntax.re | Bin 0 -> 91 bytes .../posix_captures/glennfowler/43.i--flex-syntax.c | 89 + .../glennfowler/43.i--flex-syntax.re | Bin 0 -> 97 bytes .../posix_captures/glennfowler/44.i--flex-syntax.c | 98 + .../glennfowler/44.i--flex-syntax.re | Bin 0 -> 125 bytes .../posix_captures/glennfowler/45.i--flex-syntax.c | 89 + .../glennfowler/45.i--flex-syntax.re | Bin 0 -> 98 bytes test/posix_captures/gor1.i--posix-captures.c | 41 + test/posix_captures/gor1.i--posix-captures.re | 3 + test/posix_captures/gor2.i--posix-captures.c | 36 + test/posix_captures/gor2.i--posix-captures.re | 3 + test/posix_captures/gor3.i--posix-captures.c | 149 + test/posix_captures/gor3.i--posix-captures.re | 3 + .../implicit_grouping1.i--posix-captures.c | 1 + .../implicit_grouping1.i--posix-captures.re | 4 + .../implicit_grouping2.i--posix-captures.c | 47 + .../implicit_grouping2.i--posix-captures.re | 4 + .../implicit_grouping3.i--posix-captures.c | 47 + .../implicit_grouping3.i--posix-captures.re | 4 + test/posix_captures/leftmost1.i--posix-captures.c | 42 + test/posix_captures/leftmost1.i--posix-captures.re | 3 + test/posix_captures/leftmost2.i--posix-captures.c | 40 + test/posix_captures/leftmost2.i--posix-captures.re | 4 + .../multisubhistories.i--posix-captures.c | 65 + .../multisubhistories.i--posix-captures.re | 3 + .../posix_captures/nullsubexpr/01.i--flex-syntax.c | 36 + .../nullsubexpr/01.i--flex-syntax.re | 7 + .../posix_captures/nullsubexpr/02.i--flex-syntax.c | 31 + .../nullsubexpr/02.i--flex-syntax.re | 7 + .../posix_captures/nullsubexpr/03.i--flex-syntax.c | 37 + .../nullsubexpr/03.i--flex-syntax.re | 7 + .../posix_captures/nullsubexpr/04.i--flex-syntax.c | 35 + .../nullsubexpr/04.i--flex-syntax.re | 7 + .../posix_captures/nullsubexpr/05.i--flex-syntax.c | 36 + .../nullsubexpr/05.i--flex-syntax.re | 7 + .../posix_captures/nullsubexpr/06.i--flex-syntax.c | 31 + .../nullsubexpr/06.i--flex-syntax.re | 7 + .../posix_captures/nullsubexpr/07.i--flex-syntax.c | 38 + .../nullsubexpr/07.i--flex-syntax.re | Bin 0 -> 78 bytes .../posix_captures/nullsubexpr/08.i--flex-syntax.c | 38 + .../nullsubexpr/08.i--flex-syntax.re | 7 + .../posix_captures/nullsubexpr/09.i--flex-syntax.c | 38 + .../nullsubexpr/09.i--flex-syntax.re | Bin 0 -> 78 bytes .../posix_captures/nullsubexpr/10.i--flex-syntax.c | 40 + .../nullsubexpr/10.i--flex-syntax.re | Bin 0 -> 79 bytes .../posix_captures/nullsubexpr/11.i--flex-syntax.c | 63 + .../nullsubexpr/11.i--flex-syntax.re | 7 + .../posix_captures/nullsubexpr/12.i--flex-syntax.c | 26 + .../nullsubexpr/12.i--flex-syntax.re | 7 + .../posix_captures/nullsubexpr/13.i--flex-syntax.c | 47 + .../nullsubexpr/13.i--flex-syntax.re | 7 + .../posix_captures/nullsubexpr/14.i--flex-syntax.c | 47 + .../nullsubexpr/14.i--flex-syntax.re | 7 + .../posix_captures/nullsubexpr/15.i--flex-syntax.c | 47 + .../nullsubexpr/15.i--flex-syntax.re | 7 + .../posix_captures/nullsubexpr/16.i--flex-syntax.c | 45 + .../nullsubexpr/16.i--flex-syntax.re | 7 + .../posix_captures/nullsubexpr/17.i--flex-syntax.c | 45 + .../nullsubexpr/17.i--flex-syntax.re | 7 + .../posix_captures/nullsubexpr/18.i--flex-syntax.c | 45 + .../nullsubexpr/18.i--flex-syntax.re | 7 + .../posix_captures/nullsubexpr/19.i--flex-syntax.c | 47 + .../nullsubexpr/19.i--flex-syntax.re | 7 + .../posix_captures/nullsubexpr/20.i--flex-syntax.c | 47 + .../nullsubexpr/20.i--flex-syntax.re | 7 + .../posix_captures/nullsubexpr/21.i--flex-syntax.c | 47 + .../nullsubexpr/21.i--flex-syntax.re | 7 + .../offsets.i--posix-captures--input(custom).c | 76 + .../offsets.i--posix-captures--input(custom).re | 37 + .../osxbsdcritical/01.i--flex-syntax.c | 56 + .../osxbsdcritical/01.i--flex-syntax.re | Bin 0 -> 83 bytes .../osxbsdcritical/02.i--flex-syntax.c | 56 + .../osxbsdcritical/02.i--flex-syntax.re | 7 + .../osxbsdcritical/03.i--flex-syntax.c | 84 + .../osxbsdcritical/03.i--flex-syntax.re | 7 + .../osxbsdcritical/04.i--flex-syntax.c | 56 + .../osxbsdcritical/04.i--flex-syntax.re | Bin 0 -> 83 bytes .../osxbsdcritical/05.i--flex-syntax.c | 56 + .../osxbsdcritical/05.i--flex-syntax.re | 7 + .../osxbsdcritical/06.i--flex-syntax.c | 84 + .../osxbsdcritical/06.i--flex-syntax.re | 7 + .../osxbsdcritical/07.i--flex-syntax.c | 50 + .../osxbsdcritical/07.i--flex-syntax.re | Bin 0 -> 79 bytes test/posix_captures/other/01.i--flex-syntax.c | 49 + test/posix_captures/other/01.i--flex-syntax.re | 7 + test/posix_captures/other/02.i--flex-syntax.c | 49 + test/posix_captures/other/02.i--flex-syntax.re | 7 + test/posix_captures/other/03.i--flex-syntax.c | 27 + test/posix_captures/other/03.i--flex-syntax.re | 7 + test/posix_captures/other/04.i--flex-syntax.c | 29 + test/posix_captures/other/04.i--flex-syntax.re | 7 + test/posix_captures/other/05.i--flex-syntax.c | 42 + test/posix_captures/other/05.i--flex-syntax.re | 7 + test/posix_captures/other/06.i--flex-syntax.c | 41 + test/posix_captures/other/06.i--flex-syntax.re | 7 + test/posix_captures/other/07.i--flex-syntax.c | 37 + test/posix_captures/other/07.i--flex-syntax.re | 7 + test/posix_captures/other/08.i--flex-syntax.c | 49 + test/posix_captures/other/08.i--flex-syntax.re | 7 + test/posix_captures/other/09.i--flex-syntax.c | 99 + test/posix_captures/other/09.i--flex-syntax.re | 7 + test/posix_captures/other/10.i--flex-syntax.c | 97 + test/posix_captures/other/10.i--flex-syntax.re | 7 + test/posix_captures/other/11.i--flex-syntax.c | 116 + test/posix_captures/other/11.i--flex-syntax.re | 7 + test/posix_captures/other/12.i--flex-syntax.c | 292 + test/posix_captures/other/12.i--flex-syntax.re | 7 + test/posix_captures/other/13.i--flex-syntax.c | 39 + test/posix_captures/other/13.i--flex-syntax.re | 7 + test/posix_captures/other/14.i--flex-syntax.c | 41 + test/posix_captures/other/14.i--flex-syntax.re | 7 + test/posix_captures/other/15.i--flex-syntax.c | 38 + test/posix_captures/other/15.i--flex-syntax.re | 7 + test/posix_captures/other/16.i--flex-syntax.c | 48 + test/posix_captures/other/16.i--flex-syntax.re | 7 + test/posix_captures/other/17.i--flex-syntax.c | 47 + test/posix_captures/other/17.i--flex-syntax.re | 7 + test/posix_captures/other/18.i--flex-syntax.c | 48 + test/posix_captures/other/18.i--flex-syntax.re | 7 + test/posix_captures/other/19.i--flex-syntax.c | 36 + test/posix_captures/other/19.i--flex-syntax.re | 7 + test/posix_captures/other/20.i--flex-syntax.c | 40 + test/posix_captures/other/20.i--flex-syntax.re | 7 + test/posix_captures/other/21.i--flex-syntax.c | 34 + test/posix_captures/other/21.i--flex-syntax.re | 7 + test/posix_captures/other/22.i--flex-syntax.c | 45 + test/posix_captures/other/22.i--flex-syntax.re | 7 + test/posix_captures/other/23.i--flex-syntax.c | 46 + test/posix_captures/other/23.i--flex-syntax.re | 7 + test/posix_captures/other/24.i--flex-syntax.c | 43 + test/posix_captures/other/24.i--flex-syntax.re | 7 + test/posix_captures/other/25.i--flex-syntax.c | 91 + test/posix_captures/other/25.i--flex-syntax.re | 7 + test/posix_captures/other/26.i--flex-syntax.c | 69 + test/posix_captures/other/26.i--flex-syntax.re | 7 + test/posix_captures/repetition/01.i--flex-syntax.c | 38 + .../posix_captures/repetition/01.i--flex-syntax.re | Bin 0 -> 88 bytes test/posix_captures/repetition/02.i--flex-syntax.c | 66 + .../posix_captures/repetition/02.i--flex-syntax.re | Bin 0 -> 107 bytes test/posix_captures/repetition/03.i--flex-syntax.c | 101 + .../posix_captures/repetition/03.i--flex-syntax.re | Bin 0 -> 126 bytes test/posix_captures/repetition/04.i--flex-syntax.c | 38 + .../posix_captures/repetition/04.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/repetition/05.i--flex-syntax.c | 56 + .../posix_captures/repetition/05.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/repetition/06.i--flex-syntax.c | 64 + .../posix_captures/repetition/06.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/repetition/07.i--flex-syntax.c | 47 + .../posix_captures/repetition/07.i--flex-syntax.re | Bin 0 -> 89 bytes test/posix_captures/repetition/08.i--flex-syntax.c | 38 + .../posix_captures/repetition/08.i--flex-syntax.re | Bin 0 -> 88 bytes test/posix_captures/repetition/09.i--flex-syntax.c | 66 + .../posix_captures/repetition/09.i--flex-syntax.re | Bin 0 -> 107 bytes test/posix_captures/repetition/10.i--flex-syntax.c | 101 + .../posix_captures/repetition/10.i--flex-syntax.re | Bin 0 -> 126 bytes test/posix_captures/repetition/11.i--flex-syntax.c | 38 + .../posix_captures/repetition/11.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/repetition/12.i--flex-syntax.c | 56 + .../posix_captures/repetition/12.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/repetition/13.i--flex-syntax.c | 64 + .../posix_captures/repetition/13.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/repetition/14.i--flex-syntax.c | 47 + .../posix_captures/repetition/14.i--flex-syntax.re | Bin 0 -> 89 bytes test/posix_captures/repetition/15.i--flex-syntax.c | 38 + .../posix_captures/repetition/15.i--flex-syntax.re | Bin 0 -> 88 bytes test/posix_captures/repetition/16.i--flex-syntax.c | 66 + .../posix_captures/repetition/16.i--flex-syntax.re | Bin 0 -> 107 bytes test/posix_captures/repetition/17.i--flex-syntax.c | 101 + .../posix_captures/repetition/17.i--flex-syntax.re | Bin 0 -> 126 bytes test/posix_captures/repetition/18.i--flex-syntax.c | 38 + .../posix_captures/repetition/18.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/repetition/19.i--flex-syntax.c | 56 + .../posix_captures/repetition/19.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/repetition/20.i--flex-syntax.c | 64 + .../posix_captures/repetition/20.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/repetition/21.i--flex-syntax.c | 47 + .../posix_captures/repetition/21.i--flex-syntax.re | Bin 0 -> 89 bytes test/posix_captures/repetition/22.i--flex-syntax.c | 38 + .../posix_captures/repetition/22.i--flex-syntax.re | Bin 0 -> 88 bytes test/posix_captures/repetition/23.i--flex-syntax.c | 66 + .../posix_captures/repetition/23.i--flex-syntax.re | Bin 0 -> 107 bytes test/posix_captures/repetition/24.i--flex-syntax.c | 101 + .../posix_captures/repetition/24.i--flex-syntax.re | Bin 0 -> 126 bytes test/posix_captures/repetition/25.i--flex-syntax.c | 38 + .../posix_captures/repetition/25.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/repetition/26.i--flex-syntax.c | 56 + .../posix_captures/repetition/26.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/repetition/27.i--flex-syntax.c | 64 + .../posix_captures/repetition/27.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/repetition/28.i--flex-syntax.c | 47 + .../posix_captures/repetition/28.i--flex-syntax.re | Bin 0 -> 89 bytes test/posix_captures/repetition/29.i--flex-syntax.c | 38 + .../posix_captures/repetition/29.i--flex-syntax.re | Bin 0 -> 88 bytes test/posix_captures/repetition/30.i--flex-syntax.c | 66 + .../posix_captures/repetition/30.i--flex-syntax.re | Bin 0 -> 107 bytes test/posix_captures/repetition/31.i--flex-syntax.c | 101 + .../posix_captures/repetition/31.i--flex-syntax.re | Bin 0 -> 126 bytes test/posix_captures/repetition/32.i--flex-syntax.c | 38 + .../posix_captures/repetition/32.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/repetition/33.i--flex-syntax.c | 56 + .../posix_captures/repetition/33.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/repetition/34.i--flex-syntax.c | 64 + .../posix_captures/repetition/34.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/repetition/35.i--flex-syntax.c | 47 + .../posix_captures/repetition/35.i--flex-syntax.re | Bin 0 -> 89 bytes test/posix_captures/repetition/36.i--flex-syntax.c | 38 + .../posix_captures/repetition/36.i--flex-syntax.re | Bin 0 -> 88 bytes test/posix_captures/repetition/37.i--flex-syntax.c | 66 + .../posix_captures/repetition/37.i--flex-syntax.re | Bin 0 -> 107 bytes test/posix_captures/repetition/38.i--flex-syntax.c | 101 + .../posix_captures/repetition/38.i--flex-syntax.re | Bin 0 -> 126 bytes test/posix_captures/repetition/39.i--flex-syntax.c | 38 + .../posix_captures/repetition/39.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/repetition/40.i--flex-syntax.c | 56 + .../posix_captures/repetition/40.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/repetition/41.i--flex-syntax.c | 64 + .../posix_captures/repetition/41.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/repetition/42.i--flex-syntax.c | 47 + .../posix_captures/repetition/42.i--flex-syntax.re | Bin 0 -> 89 bytes test/posix_captures/repetition/43.i--flex-syntax.c | 38 + .../posix_captures/repetition/43.i--flex-syntax.re | Bin 0 -> 88 bytes test/posix_captures/repetition/44.i--flex-syntax.c | 66 + .../posix_captures/repetition/44.i--flex-syntax.re | Bin 0 -> 107 bytes test/posix_captures/repetition/45.i--flex-syntax.c | 101 + .../posix_captures/repetition/45.i--flex-syntax.re | Bin 0 -> 126 bytes test/posix_captures/repetition/46.i--flex-syntax.c | 38 + .../posix_captures/repetition/46.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/repetition/47.i--flex-syntax.c | 56 + .../posix_captures/repetition/47.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/repetition/48.i--flex-syntax.c | 64 + .../posix_captures/repetition/48.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/repetition/49.i--flex-syntax.c | 47 + .../posix_captures/repetition/49.i--flex-syntax.re | Bin 0 -> 89 bytes test/posix_captures/repetition/50.i--flex-syntax.c | 85 + .../posix_captures/repetition/50.i--flex-syntax.re | Bin 0 -> 82 bytes test/posix_captures/repetition/51.i--flex-syntax.c | 85 + .../posix_captures/repetition/51.i--flex-syntax.re | Bin 0 -> 82 bytes test/posix_captures/repetition/52.i--flex-syntax.c | 106 + .../posix_captures/repetition/52.i--flex-syntax.re | Bin 0 -> 82 bytes test/posix_captures/repetition/53.i--flex-syntax.c | 125 + .../posix_captures/repetition/53.i--flex-syntax.re | Bin 0 -> 82 bytes test/posix_captures/repetition/54.i--flex-syntax.c | 144 + .../posix_captures/repetition/54.i--flex-syntax.re | Bin 0 -> 82 bytes test/posix_captures/repetition/55.i--flex-syntax.c | 163 + .../posix_captures/repetition/55.i--flex-syntax.re | Bin 0 -> 82 bytes test/posix_captures/repetition/56.i--flex-syntax.c | 182 + .../posix_captures/repetition/56.i--flex-syntax.re | Bin 0 -> 82 bytes test/posix_captures/repetition/57.i--flex-syntax.c | 201 + .../posix_captures/repetition/57.i--flex-syntax.re | Bin 0 -> 82 bytes test/posix_captures/repetition/58.i--flex-syntax.c | 220 + .../posix_captures/repetition/58.i--flex-syntax.re | Bin 0 -> 82 bytes test/posix_captures/repetition/59.i--flex-syntax.c | 253 + .../posix_captures/repetition/59.i--flex-syntax.re | Bin 0 -> 83 bytes test/posix_captures/repetition/60.i--flex-syntax.c | 249 + .../posix_captures/repetition/60.i--flex-syntax.re | Bin 0 -> 83 bytes test/posix_captures/repetition/61.i--flex-syntax.c | 249 + .../posix_captures/repetition/61.i--flex-syntax.re | Bin 0 -> 83 bytes test/posix_captures/repetition/62.i--flex-syntax.c | 240 + .../posix_captures/repetition/62.i--flex-syntax.re | Bin 0 -> 83 bytes test/posix_captures/repetition/63.i--flex-syntax.c | 231 + .../posix_captures/repetition/63.i--flex-syntax.re | Bin 0 -> 83 bytes test/posix_captures/repetition/64.i--flex-syntax.c | 222 + .../posix_captures/repetition/64.i--flex-syntax.re | Bin 0 -> 83 bytes test/posix_captures/repetition/65.i--flex-syntax.c | 213 + .../posix_captures/repetition/65.i--flex-syntax.re | Bin 0 -> 83 bytes test/posix_captures/repetition/66.i--flex-syntax.c | 207 + .../posix_captures/repetition/66.i--flex-syntax.re | Bin 0 -> 83 bytes test/posix_captures/repetition/67.i--flex-syntax.c | 199 + .../posix_captures/repetition/67.i--flex-syntax.re | Bin 0 -> 83 bytes test/posix_captures/repetition/68.i--flex-syntax.c | 168 + .../posix_captures/repetition/68.i--flex-syntax.re | 7 + test/posix_captures/repetition/69.i--flex-syntax.c | 162 + .../posix_captures/repetition/69.i--flex-syntax.re | 7 + test/posix_captures/repetition/70.i--flex-syntax.c | 210 + .../posix_captures/repetition/70.i--flex-syntax.re | 7 + test/posix_captures/repetition/71.i--flex-syntax.c | 255 + .../posix_captures/repetition/71.i--flex-syntax.re | 7 + test/posix_captures/repetition/72.i--flex-syntax.c | 300 + .../posix_captures/repetition/72.i--flex-syntax.re | 7 + test/posix_captures/repetition/73.i--flex-syntax.c | 921 + .../posix_captures/repetition/73.i--flex-syntax.re | 7 + test/posix_captures/repetition/74.i--flex-syntax.c | 814 + .../posix_captures/repetition/74.i--flex-syntax.re | 7 + test/posix_captures/repetition/75.i--flex-syntax.c | 815 + .../posix_captures/repetition/75.i--flex-syntax.re | 7 + test/posix_captures/repetition/76.i--flex-syntax.c | 772 + .../posix_captures/repetition/76.i--flex-syntax.re | 7 + test/posix_captures/repetition/77.i--flex-syntax.c | 745 + .../posix_captures/repetition/77.i--flex-syntax.re | 7 + test/posix_captures/repetition/78.i--flex-syntax.c | 168 + .../posix_captures/repetition/78.i--flex-syntax.re | 7 + test/posix_captures/repetition/79.i--flex-syntax.c | 162 + .../posix_captures/repetition/79.i--flex-syntax.re | 7 + test/posix_captures/repetition/80.i--flex-syntax.c | 168 + .../posix_captures/repetition/80.i--flex-syntax.re | 7 + test/posix_captures/repetition/81.i--flex-syntax.c | 162 + .../posix_captures/repetition/81.i--flex-syntax.re | 7 + test/posix_captures/repetition/82.i--flex-syntax.c | 210 + .../posix_captures/repetition/82.i--flex-syntax.re | 7 + test/posix_captures/repetition/83.i--flex-syntax.c | 255 + .../posix_captures/repetition/83.i--flex-syntax.re | 7 + test/posix_captures/repetition/84.i--flex-syntax.c | 300 + .../posix_captures/repetition/84.i--flex-syntax.re | 7 + test/posix_captures/repetition/85.i--flex-syntax.c | 921 + .../posix_captures/repetition/85.i--flex-syntax.re | 7 + test/posix_captures/repetition/86.i--flex-syntax.c | 814 + .../posix_captures/repetition/86.i--flex-syntax.re | 7 + test/posix_captures/repetition/87.i--flex-syntax.c | 815 + .../posix_captures/repetition/87.i--flex-syntax.re | 7 + test/posix_captures/repetition/88.i--flex-syntax.c | 772 + .../posix_captures/repetition/88.i--flex-syntax.re | 7 + test/posix_captures/repetition/89.i--flex-syntax.c | 745 + .../posix_captures/repetition/89.i--flex-syntax.re | 7 + test/posix_captures/repetition/90.i--flex-syntax.c | 168 + .../posix_captures/repetition/90.i--flex-syntax.re | 7 + test/posix_captures/repetition/91.i--flex-syntax.c | 162 + .../posix_captures/repetition/91.i--flex-syntax.re | 7 + test/posix_captures/rightassoc/01.i--flex-syntax.c | 79 + .../posix_captures/rightassoc/01.i--flex-syntax.re | 7 + test/posix_captures/rightassoc/02.i--flex-syntax.c | 79 + .../posix_captures/rightassoc/02.i--flex-syntax.re | 7 + test/posix_captures/rightassoc/03.i--flex-syntax.c | 79 + .../posix_captures/rightassoc/03.i--flex-syntax.re | 7 + test/posix_captures/rightassoc/04.i--flex-syntax.c | 79 + .../posix_captures/rightassoc/04.i--flex-syntax.re | 7 + test/posix_captures/rightassoc/05.i--flex-syntax.c | 61 + .../posix_captures/rightassoc/05.i--flex-syntax.re | 7 + test/posix_captures/rightassoc/06.i--flex-syntax.c | 61 + .../posix_captures/rightassoc/06.i--flex-syntax.re | 7 + test/posix_captures/rightassoc/07.i--flex-syntax.c | 61 + .../posix_captures/rightassoc/07.i--flex-syntax.re | 7 + test/posix_captures/rightassoc/08.i--flex-syntax.c | 61 + .../posix_captures/rightassoc/08.i--flex-syntax.re | 7 + test/posix_captures/rightassoc/09.i--flex-syntax.c | 77 + .../posix_captures/rightassoc/09.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/rightassoc/10.i--flex-syntax.c | 77 + .../posix_captures/rightassoc/10.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/rightassoc/11.i--flex-syntax.c | 77 + .../posix_captures/rightassoc/11.i--flex-syntax.re | Bin 0 -> 91 bytes test/posix_captures/rightassoc/12.i--flex-syntax.c | 77 + .../posix_captures/rightassoc/12.i--flex-syntax.re | Bin 0 -> 91 bytes .../uncomparable_bottoms.i--posix-captures.c | 68 + .../uncomparable_bottoms.i--posix-captures.re | 7 + test/push.--skeleton.c | 127 +- test/push.c | 28 +- test/push.f.c | 28 +- test/push.fb.c | 28 +- test/push.fg.c | 28 +- test/push.fs.c | 28 +- test/range_dot.8.c | 4 +- test/range_dot.x.c | 4 +- test/range_full.8.c | 4 +- test/range_full.c | 5 +- test/range_full.e.c | 5 +- test/range_full.u.c | 5 +- test/range_full.w.c | 5 +- test/range_full.x.c | 4 +- test/range_neg_lf.8.c | 4 +- test/range_neg_lf.x.c | 4 +- test/repeat-00.cgi.c | 2 +- test/repeat-01.cgir--skeleton.c | 771 +- test/repeat-01.cgir.c | 13 +- test/repeat-02.cgir--skeleton.c | 771 +- test/repeat-02.cgir.c | 13 +- test/repeat-03.cgir--skeleton.c | 172 +- test/repeat-03.cgir.c | 1 - test/repeat-04.cgir.c | 6 +- test/repeat-05.cgir.c | 2 +- test/repeat-06.gir--skeleton.c | 137 +- test/repeat-07_default.gir--skeleton.c | 146 +- test/repeat-07_error.gir.c | 3 - test/repeat-07_error.gir.re | 64 - test/repeat-08.ir.c | 5 + test/repeat-08.ir.re | 4 + test/repeat-09.ir.c | 22 + test/repeat-09.ir.re | 11 + test/repeater2.c | 26 +- test/repeater_overflow.c | 2 +- test/reuse_conds_default_0.cgir--skeleton.c | 172 +- test/reuse_conds_default_1.cgir--skeleton.c | 180 +- test/reuse_conds_default_1.cgir.c | 14 +- test/reuse_conds_default_1.cgir.re | 4 - test/reuse_conds_setup_0.cgir.c | 194 +- test/reuse_conds_setup_0.cgir.re | 5 +- test/reuse_conds_setup_1.cgir--eager-skip.c | 195 + test/reuse_conds_setup_1.cgir--eager-skip.re | 30 + test/reuse_conds_setup_1.cgir.c | 208 +- test/reuse_conds_setup_1.cgir.re | 3 - test/rexx.--empty-class(error).c | 2 +- test/rexx.--empty-class(match-empty).c | 1743 +- test/rexx.--empty-class(match-none).c | 1738 +- test/rexx.--skeleton.c | 2161 +- test/rexx.c | 1743 +- test/sample.c | 4 +- test/scanner.--skeleton.c | 330 +- test/scanner.c | 12 +- test/scanner.fs.c | 12 +- test/scanner.s.c | 12 +- test/scanner_re2c.bi.c | 1215 +- test/scanner_re2c_default.--emit-dot.c | 842 +- test/scanner_re2c_default.bi.c | 1219 +- test/segfault_full_range_star.bi.c | 2 +- test/segfault_full_range_star_startlabel.ci.c | 2 +- test/segfault_full_range_star_startlabel.i.c | 2 +- test/segfault_full_range_star_startlabel2.ci.c | 2 +- test/segfault_full_range_star_startlabel2.i.c | 2 +- test/strip_001.s.c | 28 +- test/strip_002.s.c | 40 +- test/strip_003.b--skeleton.c | 422 +- test/strip_003.b.c | 16 +- test/tags/ambiguity/alt0.i--tags.c | 13 + test/tags/ambiguity/alt0.i--tags.re | 6 + test/tags/ambiguity/alt1.i--tags.c | 20 + test/tags/ambiguity/alt1.i--tags.re | 4 + test/tags/ambiguity/alt2.i--tags.c | 21 + test/tags/ambiguity/alt2.i--tags.re | 4 + test/tags/ambiguity/cat1.i--tags.c | 38 + test/tags/ambiguity/cat1.i--tags.re | 4 + test/tags/ambiguity/cat3.i.c | 148 + test/tags/ambiguity/cat3.i.re | 31 + test/tags/ambiguity/cat4.i--tags.c | 44 + test/tags/ambiguity/cat4.i--tags.re | 6 + test/tags/ambiguity/iter.i--tags.c | 105 + test/tags/ambiguity/iter.i--tags.re | 10 + test/tags/bench_http_rfc7230.i.c | 13288 +++++++ test/tags/bench_http_rfc7230.i.re | 318 + test/tags/bench_http_simple.i.c | 2437 ++ test/tags/bench_http_simple.i.re | 231 + test/tags/bench_uri_rfc3986.i.c | 7943 +++++ test/tags/bench_uri_rfc3986.i.re | 178 + test/tags/bench_uri_simple.i.c | 1382 + test/tags/bench_uri_simple.i.re | 134 + test/tags/bug121_fix_multiple.i--input(custom).c | 1 + test/tags/bug121_fix_multiple.i--input(custom).re | 10 + .../bug121_fix_multiple.i--tags--input(custom).c | 72 + .../bug121_fix_multiple.i--tags--input(custom).re | 10 + test/tags/bug121_fix_none.i.c | 47 + test/tags/bug121_fix_none.i.re | 8 + test/tags/bug121_fix_single.i--input(custom).c | 58 + test/tags/bug121_fix_single.i--input(custom).re | 11 + test/tags/bug121_var_multiple.i--input(custom).c | 1 + test/tags/bug121_var_multiple.i--input(custom).re | 8 + ...r_multiple.i--tags--eager-skip--input(custom).c | 73 + ..._multiple.i--tags--eager-skip--input(custom).re | 8 + .../tags/bug121_var_multiple.i--tags--eager-skip.c | 71 + .../bug121_var_multiple.i--tags--eager-skip.re | 8 + .../bug121_var_multiple.i--tags--input(custom).c | 69 + .../bug121_var_multiple.i--tags--input(custom).re | 8 + test/tags/bug121_var_multiple.i--tags.c | 65 + test/tags/bug121_var_multiple.i--tags.re | 8 + test/tags/bug121_var_multiple.i.c | 1 + test/tags/bug121_var_multiple.i.re | 8 + test/tags/bug121_var_single.i--input(custom).c | 62 + test/tags/bug121_var_single.i--input(custom).re | 10 + test/tags/bug121_var_single.i.c | 60 + test/tags/bug121_var_single.i.re | 10 + test/tags/cond_star0.ci--input(custom).c | 62 + test/tags/cond_star0.ci--input(custom).re | 8 + test/tags/cond_star0.ci.c | 60 + test/tags/cond_star0.ci.re | 8 + test/tags/cond_star1.ci--input(custom).c | 105 + test/tags/cond_star1.ci--input(custom).re | 10 + test/tags/cond_star1.ci.c | 102 + test/tags/cond_star1.ci.re | 10 + test/tags/cond_star2.ci.c | 159 + test/tags/cond_star2.ci.re | 14 + test/tags/conf1.i--tags--input(custom).c | 299 + test/tags/conf1.i--tags--input(custom).re | 59 + test/tags/conf1.i--tags.c | 277 + test/tags/conf1.i--tags.re | 49 + test/tags/conf2.i--tags--input(custom).c | 363 + test/tags/conf2.i--tags--input(custom).re | 110 + test/tags/conf2.i--tags.c | 339 + test/tags/conf2.i--tags.re | 105 + test/tags/conf3.i--tags--input(custom).c | 320 + test/tags/conf3.i--tags--input(custom).re | 87 + test/tags/conf3.i--tags.c | 298 + test/tags/conf3.i--tags.re | 80 + test/tags/copy_coalescing1.i--tags.c | 101 + test/tags/copy_coalescing1.i--tags.re | 15 + test/tags/copy_coalescing2.i--tags.c | 87 + test/tags/copy_coalescing2.i--tags.re | 10 + test/tags/copy_save.i--tags.c | 56 + test/tags/copy_save.i--tags.re | 5 + test/tags/counter1.i--tags.c | 118 + test/tags/counter1.i--tags.re | 6 + test/tags/dedup0.i--input(custom).c | 75 + test/tags/dedup0.i--input(custom).re | 6 + test/tags/dedup0.i.c | 72 + test/tags/dedup0.i.re | 6 + test/tags/dedup1.i--input(custom).c | 91 + test/tags/dedup1.i--input(custom).re | 6 + test/tags/dedup1.i.c | 87 + test/tags/dedup1.i.re | 6 + test/tags/dedup2.i--input(custom).c | 16 + test/tags/dedup2.i--input(custom).re | 5 + test/tags/dedup2.i.c | 16 + test/tags/dedup2.i.re | 5 + test/tags/dedup3.i--input(custom).c | 77 + test/tags/dedup3.i--input(custom).re | 5 + test/tags/dedup3.i.c | 73 + test/tags/dedup3.i.re | 5 + test/tags/dedup4.i--tags.c | 268 + test/tags/dedup4.i--tags.re | 23 + test/tags/dedup5.i--tags.c | 113 + test/tags/dedup5.i--tags.re | 16 + test/tags/exponential_bottoms.i--tags.c | 59 + test/tags/exponential_bottoms.i--tags.re | 8 + test/tags/fallback1.i--tags.c | 75 + test/tags/fallback1.i--tags.re | 19 + test/tags/fallback2.i--tags.c | 61 + test/tags/fallback2.i--tags.re | 19 + test/tags/fallback3.i--tags.c | 69 + test/tags/fallback3.i--tags.re | 11 + test/tags/fallback4.i--tags.c | 77 + test/tags/fallback4.i--tags.re | 12 + test/tags/fallback5.i--tags.c | 67 + test/tags/fallback5.i--tags.re | 3 + test/tags/fallback6.i--tags.c | 106 + test/tags/fallback6.i--tags.re | 8 + test/tags/fix2.i--tags.c | 134 + test/tags/fix2.i--tags.re | 35 + test/tags/fix2_trail.i--tags--input(custom).c | 166 + test/tags/fix2_trail.i--tags--input(custom).re | 42 + test/tags/fix2_trail.i--tags.c | 134 + test/tags/fix2_trail.i--tags.re | 35 + test/tags/fix3.i--tags.c | 128 + test/tags/fix3.i--tags.re | 35 + test/tags/fix3_trail.i--tags--input(custom).c | 166 + test/tags/fix3_trail.i--tags--input(custom).re | 42 + test/tags/fix3_trail.i--tags.c | 128 + test/tags/fix3_trail.i--tags.re | 35 + test/tags/fix4.i--tags.c | 86 + test/tags/fix4.i--tags.re | 35 + test/tags/fix4_trail.i--tags--input(custom).c | 106 + test/tags/fix4_trail.i--tags--input(custom).re | 42 + test/tags/fix4_trail.i--tags.c | 86 + test/tags/fix4_trail.i--tags.re | 35 + test/tags/fix5.i--tags.c | 109 + test/tags/fix5.i--tags.re | 35 + test/tags/fix5_trail.i--tags--input(custom).c | 132 + test/tags/fix5_trail.i--tags--input(custom).re | 42 + test/tags/fix5_trail.i--tags.c | 109 + test/tags/fix5_trail.i--tags.re | 35 + test/tags/interference.i--tags.c | 72 + test/tags/interference.i--tags.re | 7 + test/tags/iter_plus.i--tags.c | 33 + test/tags/iter_plus.i--tags.re | 7 + ...lost_tag.i--tags--no-lookahead--input(custom).c | 24 + ...ost_tag.i--tags--no-lookahead--input(custom).re | 5 + test/tags/map_ord1.i--tags--no-lookahead.c | 51 + test/tags/map_ord1.i--tags--no-lookahead.re | 6 + test/tags/map_ord1.i--tags.c | 45 + test/tags/map_ord1.i--tags.re | 6 + test/tags/map_ord2.i--tags--no-lookahead.c | 98 + test/tags/map_ord2.i--tags--no-lookahead.re | 6 + test/tags/map_ord2.i--tags.c | 83 + test/tags/map_ord2.i--tags.re | 6 + test/tags/minimization.i.c | 70 + test/tags/minimization.i.re | 14 + .../skip_tags_disorder1.i--tags--no-lookahead.c | 30 + .../skip_tags_disorder1.i--tags--no-lookahead.re | 5 + .../skip_tags_disorder2.i--tags--no-lookahead.c | 55 + .../skip_tags_disorder2.i--tags--no-lookahead.re | 6 + test/tags/skip_tags_disorder3.i--eager-skip.c | 47 + test/tags/skip_tags_disorder3.i--eager-skip.re | 6 + .../skip_tags_disorder4.i--tags--no-lookahead.c | 66 + .../skip_tags_disorder4.i--tags--no-lookahead.re | 6 + test/tags/syntax_error0.c | 1 + test/tags/syntax_error0.re | 4 + test/tags/tags_in_trail.i--tags.c | 50 + test/tags/tags_in_trail.i--tags.re | 5 + test/tags/topsort1.i--tags.c | 63 + test/tags/topsort1.i--tags.re | 6 + test/tags/topsort2.i--tags.c | 57 + test/tags/topsort2.i--tags.re | 5 + test/tags/topsort3.i--tags--no-lookahead.c | 71 + test/tags/topsort3.i--tags--no-lookahead.re | 6 + test/tags/twopass.i--tags.c | 210 + test/tags/twopass.i--tags.re | 9 + test/tags/uniq.i--tags.c | 56 + test/tags/uniq.i--tags.re | 8 + test/tags/yyaccept1.i.c | 63 + test/tags/yyaccept1.i.re | 11 + test/unicode_blocks.8--encoding-policy(fail).c | 2 +- test/unicode_blocks.8--encoding-policy(ignore).c | 4 +- ...unicode_blocks.8--encoding-policy(substitute).c | 4 +- ...e_blocks.8--skeleton--encoding-policy(ignore).c | 3503 +- test/unicode_blocks.u--encoding-policy(fail).c | 2 +- ...e_blocks.u--skeleton--encoding-policy(ignore).c | 3500 +- test/unicode_blocks.x--encoding-policy(fail).c | 2 +- ...e_blocks.x--skeleton--encoding-policy(ignore).c | 3500 +- test/unicode_group_C.8--encoding-policy(fail).c | 2 +- test/unicode_group_C.8--encoding-policy(ignore).c | 4 +- ...nicode_group_C.8--encoding-policy(substitute).c | 4 +- test/unicode_group_C.u--encoding-policy(fail).c | 2 +- test/unicode_group_C.x--encoding-policy(fail).c | 2 +- test/unicode_group_C.x--encoding-policy(ignore).c | 4 +- ...nicode_group_C.x--encoding-policy(substitute).c | 4 +- test/unicode_group_Cc.8--encoding-policy(fail).c | 4 +- test/unicode_group_Cc.8--encoding-policy(ignore).c | 4 +- ...icode_group_Cc.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Cf.8--encoding-policy(fail).c | 4 +- test/unicode_group_Cf.8--encoding-policy(ignore).c | 4 +- ...icode_group_Cf.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Cf.x--encoding-policy(fail).c | 4 +- test/unicode_group_Cf.x--encoding-policy(ignore).c | 4 +- ...icode_group_Cf.x--encoding-policy(substitute).c | 4 +- test/unicode_group_Cn.8--encoding-policy(fail).c | 4 +- test/unicode_group_Cn.8--encoding-policy(ignore).c | 4 +- ...icode_group_Cn.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Cn.x--encoding-policy(fail).c | 4 +- test/unicode_group_Cn.x--encoding-policy(ignore).c | 4 +- ...icode_group_Cn.x--encoding-policy(substitute).c | 4 +- test/unicode_group_Co.8--encoding-policy(fail).c | 4 +- test/unicode_group_Co.8--encoding-policy(ignore).c | 4 +- ...icode_group_Co.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Cs.8--encoding-policy(fail).c | 2 +- test/unicode_group_Cs.u--encoding-policy(fail).c | 2 +- test/unicode_group_Cs.x--encoding-policy(fail).c | 2 +- test/unicode_group_L.8--encoding-policy(fail).c | 4 +- test/unicode_group_L.8--encoding-policy(ignore).c | 4 +- ...nicode_group_L.8--encoding-policy(substitute).c | 4 +- test/unicode_group_L.x--encoding-policy(fail).c | 4 +- test/unicode_group_L.x--encoding-policy(ignore).c | 4 +- ...nicode_group_L.x--encoding-policy(substitute).c | 4 +- test/unicode_group_L_.8--encoding-policy(fail).c | 4 +- test/unicode_group_L_.8--encoding-policy(ignore).c | 4 +- ...icode_group_L_.8--encoding-policy(substitute).c | 4 +- test/unicode_group_L_.x--encoding-policy(fail).c | 4 +- test/unicode_group_L_.x--encoding-policy(ignore).c | 4 +- ...icode_group_L_.x--encoding-policy(substitute).c | 4 +- test/unicode_group_Ll.8--encoding-policy(fail).c | 4 +- test/unicode_group_Ll.8--encoding-policy(ignore).c | 4 +- ...icode_group_Ll.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Ll.x--encoding-policy(fail).c | 4 +- test/unicode_group_Ll.x--encoding-policy(ignore).c | 4 +- ...icode_group_Ll.x--encoding-policy(substitute).c | 4 +- test/unicode_group_Lm.8--encoding-policy(fail).c | 4 +- test/unicode_group_Lm.8--encoding-policy(ignore).c | 4 +- ...icode_group_Lm.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Lo.8--encoding-policy(fail).c | 4 +- test/unicode_group_Lo.8--encoding-policy(ignore).c | 4 +- ...icode_group_Lo.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Lo.x--encoding-policy(fail).c | 4 +- test/unicode_group_Lo.x--encoding-policy(ignore).c | 4 +- ...icode_group_Lo.x--encoding-policy(substitute).c | 4 +- test/unicode_group_Lt.8--encoding-policy(fail).c | 4 +- test/unicode_group_Lt.8--encoding-policy(ignore).c | 4 +- ...icode_group_Lt.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Lu.8--encoding-policy(fail).c | 4 +- test/unicode_group_Lu.8--encoding-policy(ignore).c | 4 +- ...icode_group_Lu.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Lu.x--encoding-policy(fail).c | 4 +- test/unicode_group_Lu.x--encoding-policy(ignore).c | 4 +- ...icode_group_Lu.x--encoding-policy(substitute).c | 4 +- test/unicode_group_M.8--encoding-policy(fail).c | 4 +- test/unicode_group_M.8--encoding-policy(ignore).c | 4 +- ...nicode_group_M.8--encoding-policy(substitute).c | 4 +- test/unicode_group_M.x--encoding-policy(fail).c | 4 +- test/unicode_group_M.x--encoding-policy(ignore).c | 4 +- ...nicode_group_M.x--encoding-policy(substitute).c | 4 +- test/unicode_group_Mc.8--encoding-policy(fail).c | 4 +- test/unicode_group_Mc.8--encoding-policy(ignore).c | 4 +- ...icode_group_Mc.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Mc.x--encoding-policy(fail).c | 4 +- test/unicode_group_Mc.x--encoding-policy(ignore).c | 4 +- ...icode_group_Mc.x--encoding-policy(substitute).c | 4 +- test/unicode_group_Me.8--encoding-policy(fail).c | 4 +- test/unicode_group_Me.8--encoding-policy(ignore).c | 4 +- ...icode_group_Me.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Mn.8--encoding-policy(fail).c | 4 +- test/unicode_group_Mn.8--encoding-policy(ignore).c | 4 +- ...icode_group_Mn.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Mn.x--encoding-policy(fail).c | 4 +- test/unicode_group_Mn.x--encoding-policy(ignore).c | 4 +- ...icode_group_Mn.x--encoding-policy(substitute).c | 4 +- test/unicode_group_N.8--encoding-policy(fail).c | 4 +- test/unicode_group_N.8--encoding-policy(ignore).c | 4 +- ...nicode_group_N.8--encoding-policy(substitute).c | 4 +- test/unicode_group_N.x--encoding-policy(fail).c | 4 +- test/unicode_group_N.x--encoding-policy(ignore).c | 4 +- ...nicode_group_N.x--encoding-policy(substitute).c | 4 +- test/unicode_group_Nd.8--encoding-policy(fail).c | 4 +- test/unicode_group_Nd.8--encoding-policy(ignore).c | 4 +- ...icode_group_Nd.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Nd.x--encoding-policy(fail).c | 4 +- test/unicode_group_Nd.x--encoding-policy(ignore).c | 4 +- ...icode_group_Nd.x--encoding-policy(substitute).c | 4 +- test/unicode_group_Nl.8--encoding-policy(fail).c | 4 +- test/unicode_group_Nl.8--encoding-policy(ignore).c | 4 +- ...icode_group_Nl.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Nl.x--encoding-policy(fail).c | 4 +- test/unicode_group_Nl.x--encoding-policy(ignore).c | 4 +- ...icode_group_Nl.x--encoding-policy(substitute).c | 4 +- test/unicode_group_No.8--encoding-policy(fail).c | 4 +- test/unicode_group_No.8--encoding-policy(ignore).c | 4 +- ...icode_group_No.8--encoding-policy(substitute).c | 4 +- test/unicode_group_No.x--encoding-policy(fail).c | 4 +- test/unicode_group_No.x--encoding-policy(ignore).c | 4 +- ...icode_group_No.x--encoding-policy(substitute).c | 4 +- test/unicode_group_P.8--encoding-policy(fail).c | 4 +- test/unicode_group_P.8--encoding-policy(ignore).c | 4 +- ...nicode_group_P.8--encoding-policy(substitute).c | 4 +- test/unicode_group_P.x--encoding-policy(fail).c | 4 +- test/unicode_group_P.x--encoding-policy(ignore).c | 4 +- ...nicode_group_P.x--encoding-policy(substitute).c | 4 +- test/unicode_group_Pc.8--encoding-policy(fail).c | 4 +- test/unicode_group_Pc.8--encoding-policy(ignore).c | 4 +- ...icode_group_Pc.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Pd.8--encoding-policy(fail).c | 4 +- test/unicode_group_Pd.8--encoding-policy(ignore).c | 4 +- ...icode_group_Pd.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Pe.8--encoding-policy(fail).c | 4 +- test/unicode_group_Pe.8--encoding-policy(ignore).c | 4 +- ...icode_group_Pe.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Pf.8--encoding-policy(fail).c | 4 +- test/unicode_group_Pf.8--encoding-policy(ignore).c | 4 +- ...icode_group_Pf.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Pi.8--encoding-policy(fail).c | 4 +- test/unicode_group_Pi.8--encoding-policy(ignore).c | 4 +- ...icode_group_Pi.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Po.8--encoding-policy(fail).c | 4 +- test/unicode_group_Po.8--encoding-policy(ignore).c | 4 +- ...icode_group_Po.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Po.x--encoding-policy(fail).c | 4 +- test/unicode_group_Po.x--encoding-policy(ignore).c | 4 +- ...icode_group_Po.x--encoding-policy(substitute).c | 4 +- test/unicode_group_Ps.8--encoding-policy(fail).c | 4 +- test/unicode_group_Ps.8--encoding-policy(ignore).c | 4 +- ...icode_group_Ps.8--encoding-policy(substitute).c | 4 +- test/unicode_group_S.8--encoding-policy(fail).c | 4 +- test/unicode_group_S.8--encoding-policy(ignore).c | 4 +- ...nicode_group_S.8--encoding-policy(substitute).c | 4 +- test/unicode_group_S.x--encoding-policy(fail).c | 4 +- test/unicode_group_S.x--encoding-policy(ignore).c | 4 +- ...nicode_group_S.x--encoding-policy(substitute).c | 4 +- test/unicode_group_Sc.8--encoding-policy(fail).c | 4 +- test/unicode_group_Sc.8--encoding-policy(ignore).c | 4 +- ...icode_group_Sc.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Sk.8--encoding-policy(fail).c | 4 +- test/unicode_group_Sk.8--encoding-policy(ignore).c | 4 +- ...icode_group_Sk.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Sm.8--encoding-policy(fail).c | 4 +- test/unicode_group_Sm.8--encoding-policy(ignore).c | 4 +- ...icode_group_Sm.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Sm.x--encoding-policy(fail).c | 4 +- test/unicode_group_Sm.x--encoding-policy(ignore).c | 4 +- ...icode_group_Sm.x--encoding-policy(substitute).c | 4 +- test/unicode_group_So.8--encoding-policy(fail).c | 4 +- test/unicode_group_So.8--encoding-policy(ignore).c | 4 +- ...icode_group_So.8--encoding-policy(substitute).c | 4 +- test/unicode_group_So.x--encoding-policy(fail).c | 4 +- test/unicode_group_So.x--encoding-policy(ignore).c | 4 +- ...icode_group_So.x--encoding-policy(substitute).c | 4 +- test/unicode_group_Z.8--encoding-policy(fail).c | 4 +- test/unicode_group_Z.8--encoding-policy(ignore).c | 4 +- ...nicode_group_Z.8--encoding-policy(substitute).c | 4 +- test/unicode_group_Zs.8--encoding-policy(fail).c | 4 +- test/unicode_group_Zs.8--encoding-policy(ignore).c | 4 +- ...icode_group_Zs.8--encoding-policy(substitute).c | 4 +- test/wunreachable_rules.i.c | 110 + test/wunreachable_rules.i.re | 19 + test/yyaccept_initial.i.c | 61 + test/yyaccept_initial.i.re | 11 + test/yyaccept_missing.bci--eager-skip.c | 158 + test/yyaccept_missing.bci--eager-skip.re | 67 + test/yyaccept_missing.bci.c | 3 +- 1614 files changed, 223207 insertions(+), 117882 deletions(-) delete mode 100644 .gitignore create mode 100644 Makefile.in create mode 100644 aclocal.m4 create mode 100644 bootstrap/src/ast/lex.cc create mode 100644 bootstrap/src/ast/lex_conf.cc create mode 100644 bootstrap/src/ast/parser.cc rename bootstrap/src/{parse => ast}/y.tab.h (65%) create mode 100644 bootstrap/src/conf/help.cc delete mode 100644 bootstrap/src/parse/lex.cc delete mode 100644 bootstrap/src/parse/lex_conf.cc delete mode 100644 bootstrap/src/parse/parser.cc delete mode 100755 build.sh delete mode 100755 build_mingw.sh create mode 100755 compile create mode 100644 config.h.in create mode 100755 configure create mode 100755 depcomp delete mode 100755 distcheck.sh create mode 100644 doc/help.rst create mode 100644 doc/help.rst.in create mode 100644 doc/manual/contributors.rst_ create mode 100644 doc/manual/features/conditions/conditions.rst_ create mode 100644 doc/manual/features/encodings/encodings.rst_ create mode 100644 doc/manual/features/generic_api/generic_api.rst_ create mode 100644 doc/manual/features/state/state.rst_ create mode 100644 doc/manual/features/submatch/submatch.rst_ create mode 100644 doc/manual/options/options_list.rst create mode 100644 doc/manual/syntax/configurations.rst_ create mode 100644 doc/manual/syntax/interface.rst_ create mode 100644 doc/manual/syntax/named_definitions.rst_ create mode 100644 doc/manual/syntax/regular_expressions.rst_ create mode 100644 doc/manual/syntax/rules.rst_ create mode 100644 doc/manual/warnings/warnings_general.rst create mode 100644 doc/manual/warnings/warnings_list.rst create mode 100644 doc/tdfa/tdfa.pdf delete mode 100644 examples/001_upn_calculator/README delete mode 100644 examples/001_upn_calculator/calc_001.re delete mode 100644 examples/001_upn_calculator/calc_002.re delete mode 100644 examples/001_upn_calculator/calc_003.re delete mode 100644 examples/001_upn_calculator/calc_004.re delete mode 100644 examples/001_upn_calculator/calc_005.re delete mode 100644 examples/001_upn_calculator/calc_006.s.re delete mode 100644 examples/001_upn_calculator/calc_007.b.re delete mode 100644 examples/001_upn_calculator/calc_008.b.re delete mode 100644 examples/001_upn_calculator/windows/HiResTimer.h delete mode 100644 examples/001_upn_calculator/windows/main.b.re delete mode 100644 examples/002_strip_comments/README delete mode 100644 examples/002_strip_comments/strip_001.s.re delete mode 100644 examples/002_strip_comments/strip_002.s.re delete mode 100644 examples/002_strip_comments/strip_003.b.re create mode 100644 examples/01_recognizing_integers.i.c create mode 100644 examples/01_recognizing_integers.i.re create mode 100644 examples/02_recognizing_strings.i.c create mode 100644 examples/02_recognizing_strings.i.re create mode 100644 examples/03_arbitrary_large_input.i.c create mode 100644 examples/03_arbitrary_large_input.i.re create mode 100644 examples/04_parsing_integers_blocks.i.c create mode 100644 examples/04_parsing_integers_blocks.i.re create mode 100644 examples/05_parsing_integers_conditions.ci.c create mode 100644 examples/05_parsing_integers_conditions.ci.re create mode 100644 examples/06_braille.cr8i.c create mode 100644 examples/06_braille.cr8i.re create mode 100644 examples/07_cxx98.i.c create mode 100644 examples/07_cxx98.i.re create mode 100644 examples/08_ipv4.i--tags.c create mode 100644 examples/08_ipv4.i--tags.re create mode 100644 examples/09_etc_passwd.i--tags.c create mode 100644 examples/09_etc_passwd.i--tags.re create mode 100644 examples/10_uri_rfc3986.i--tags.c create mode 100644 examples/10_uri_rfc3986.i--tags.re create mode 100644 examples/11_http_rfc7230.i--tags.c create mode 100644 examples/11_http_rfc7230.i--tags.re create mode 100644 examples/13_records.i--tags.c create mode 100644 examples/13_records.i--tags.re create mode 100644 examples/14_options.i--tags.c create mode 100644 examples/14_options.i--tags.re create mode 100644 examples/15_binsyms.i--input(custom).c create mode 100644 examples/15_binsyms.i--input(custom).re create mode 100644 examples/16_fake_sentinel.i--input(custom).c create mode 100644 examples/16_fake_sentinel.i--input(custom).re create mode 100644 examples/17_ifstream.i--input(custom).c create mode 100644 examples/17_ifstream.i--input(custom).re create mode 100644 examples/18_push_model.if.c create mode 100644 examples/18_push_model.if.re delete mode 100644 examples/input_custom/fixed.re delete mode 100644 examples/input_custom/simple/README delete mode 100644 examples/input_custom/simple/default.re delete mode 100644 examples/input_custom/simple/fgetc.re delete mode 100644 examples/input_custom/simple/istringstream.re delete mode 100644 examples/langs/c.re delete mode 100644 examples/langs/modula.re delete mode 100644 examples/langs/rexx.re delete mode 100644 examples/push_model/push.re create mode 100755 genhelp.sh create mode 100755 install-sh create mode 100755 missing create mode 100644 src/adfa/action.h create mode 100644 src/adfa/adfa.cc create mode 100644 src/adfa/adfa.h create mode 100644 src/adfa/dump.cc create mode 100644 src/adfa/dump.h create mode 100644 src/adfa/prepare.cc create mode 100644 src/ast/ast.cc create mode 100644 src/ast/ast.h rename src/{parse => ast}/input.cc (92%) rename src/{parse => ast}/input.h (66%) rename src/{parse => ast}/lex.re (50%) create mode 100644 src/ast/lex_conf.re create mode 100644 src/ast/normalize.cc create mode 100644 src/ast/parser.h create mode 100644 src/ast/parser.ypp create mode 100644 src/ast/scanner.cc create mode 100644 src/ast/scanner.h rename src/{parse => ast}/unescape.cc (97%) rename src/{parse => ast}/unescape.h (67%) create mode 100644 src/ast/validate.cc create mode 100644 src/code/bitmap.cc create mode 100644 src/code/bitmap.h create mode 100644 src/code/emit.h create mode 100644 src/code/emit_action.cc create mode 100644 src/code/emit_dfa.cc create mode 100644 src/code/go.h create mode 100644 src/code/go_construct.cc rename src/{codegen => code}/go_destruct.cc (86%) create mode 100644 src/code/go_emit.cc rename src/{codegen => code}/go_used_labels.cc (60%) create mode 100644 src/code/input_api.cc create mode 100644 src/code/input_api.h rename src/{codegen => code}/label.cc (94%) rename src/{codegen => code}/label.h (88%) create mode 100644 src/code/output.cc create mode 100644 src/code/output.h create mode 100644 src/code/print.cc create mode 100644 src/code/print.h delete mode 100644 src/codegen/bitmap.cc delete mode 100644 src/codegen/bitmap.h delete mode 100644 src/codegen/emit.h delete mode 100644 src/codegen/emit_action.cc delete mode 100644 src/codegen/emit_dfa.cc delete mode 100644 src/codegen/go.h delete mode 100644 src/codegen/go_construct.cc delete mode 100644 src/codegen/go_emit.cc delete mode 100644 src/codegen/indent.h delete mode 100644 src/codegen/input_api.cc delete mode 100644 src/codegen/input_api.h delete mode 100644 src/codegen/output.cc delete mode 100644 src/codegen/output.h delete mode 100644 src/codegen/print.cc delete mode 100644 src/codegen/print.h create mode 100644 src/compile.cc create mode 100644 src/compile.h create mode 100644 src/dfa/cfg/cfg.cc create mode 100644 src/dfa/cfg/cfg.h create mode 100644 src/dfa/cfg/compact.cc create mode 100644 src/dfa/cfg/dce.cc create mode 100644 src/dfa/cfg/dump.cc create mode 100644 src/dfa/cfg/freeze.cc create mode 100644 src/dfa/cfg/interfere.cc create mode 100644 src/dfa/cfg/liveanal.cc create mode 100644 src/dfa/cfg/normalize.cc create mode 100644 src/dfa/cfg/optimize.cc create mode 100644 src/dfa/cfg/rename.cc create mode 100644 src/dfa/cfg/varalloc.cc create mode 100644 src/dfa/closure.cc create mode 100644 src/dfa/closure.h create mode 100644 src/dfa/dead_rules.cc create mode 100644 src/dfa/determinization.cc create mode 100644 src/dfa/dfa.h create mode 100644 src/dfa/dump.cc create mode 100644 src/dfa/dump.h create mode 100644 src/dfa/fallback_tags.cc rename src/{ir => }/dfa/fillpoints.cc (87%) create mode 100644 src/dfa/find_state.cc create mode 100644 src/dfa/find_state.h rename src/{ir => }/dfa/minimization.cc (68%) create mode 100644 src/dfa/tagpool.cc create mode 100644 src/dfa/tagpool.h create mode 100644 src/dfa/tagtree.cc create mode 100644 src/dfa/tagtree.h create mode 100644 src/dfa/tcmd.cc create mode 100644 src/dfa/tcmd.h delete mode 100644 src/globals.h delete mode 100644 src/ir/adfa/action.h delete mode 100644 src/ir/adfa/adfa.cc delete mode 100644 src/ir/adfa/adfa.h delete mode 100644 src/ir/adfa/prepare.cc delete mode 100644 src/ir/compile.cc delete mode 100644 src/ir/compile.h delete mode 100644 src/ir/dfa/determinization.cc delete mode 100644 src/ir/dfa/dfa.h delete mode 100644 src/ir/nfa/calc_size.cc delete mode 100644 src/ir/nfa/nfa.cc delete mode 100644 src/ir/nfa/nfa.h delete mode 100644 src/ir/nfa/split.cc delete mode 100644 src/ir/regexp/display.cc delete mode 100644 src/ir/regexp/encoding/range_suffix.cc delete mode 100644 src/ir/regexp/encoding/utf16/utf16_regexp.h delete mode 100644 src/ir/regexp/encoding/utf8/utf8_range.h delete mode 100644 src/ir/regexp/encoding/utf8/utf8_regexp.h delete mode 100644 src/ir/regexp/fixed_length.cc delete mode 100644 src/ir/regexp/regexp.cc delete mode 100644 src/ir/regexp/regexp.h delete mode 100644 src/ir/regexp/regexp_alt.h delete mode 100644 src/ir/regexp/regexp_cat.h delete mode 100644 src/ir/regexp/regexp_close.h delete mode 100644 src/ir/regexp/regexp_match.h delete mode 100644 src/ir/regexp/regexp_null.h delete mode 100644 src/ir/regexp/regexp_rule.h delete mode 100644 src/ir/rule_rank.cc delete mode 100644 src/ir/rule_rank.h delete mode 100644 src/ir/skeleton/control_flow.cc delete mode 100644 src/ir/skeleton/generate_code.cc delete mode 100644 src/ir/skeleton/generate_data.cc delete mode 100644 src/ir/skeleton/match_empty.cc delete mode 100644 src/ir/skeleton/maxlen.cc delete mode 100644 src/ir/skeleton/path.h delete mode 100644 src/ir/skeleton/skeleton.cc delete mode 100644 src/ir/skeleton/skeleton.h delete mode 100644 src/ir/skeleton/unreachable.cc delete mode 100644 src/ir/skeleton/way.cc delete mode 100644 src/ir/skeleton/way.h create mode 100644 src/nfa/dump.cc create mode 100644 src/nfa/estimate_size.cc create mode 100644 src/nfa/nfa.h create mode 100644 src/nfa/re_to_nfa.cc delete mode 100644 src/parse/code.cc delete mode 100644 src/parse/code.h delete mode 100644 src/parse/extop.h delete mode 100644 src/parse/lex_conf.re delete mode 100644 src/parse/loc.h delete mode 100644 src/parse/parser.h delete mode 100644 src/parse/parser.ypp delete mode 100644 src/parse/rules.h delete mode 100644 src/parse/scanner.cc delete mode 100644 src/parse/scanner.h delete mode 100644 src/parse/spec.h create mode 100644 src/re/ast_to_re.cc create mode 100644 src/re/default_tags.cc rename src/{ir/regexp => re}/empty_class_policy.h (61%) rename src/{ir/regexp => re}/encoding/case.h (78%) rename src/{ir/regexp => re}/encoding/enc.cc (99%) rename src/{ir/regexp => re}/encoding/enc.h (82%) create mode 100644 src/re/encoding/range_suffix.cc rename src/{ir/regexp => re}/encoding/range_suffix.h (70%) rename src/{ir/regexp => re}/encoding/utf16/utf16.cc (82%) rename src/{ir/regexp => re}/encoding/utf16/utf16.h (82%) rename src/{ir/regexp => re}/encoding/utf16/utf16_range.cc (97%) rename src/{ir/regexp => re}/encoding/utf16/utf16_range.h (71%) rename src/{ir/regexp => re}/encoding/utf16/utf16_regexp.cc (53%) create mode 100644 src/re/encoding/utf16/utf16_regexp.h rename src/{ir/regexp => re}/encoding/utf8/utf8.cc (97%) rename src/{ir/regexp => re}/encoding/utf8/utf8.h (88%) rename src/{ir/regexp => re}/encoding/utf8/utf8_range.cc (96%) create mode 100644 src/re/encoding/utf8/utf8_range.h rename src/{ir/regexp => re}/encoding/utf8/utf8_regexp.cc (55%) create mode 100644 src/re/encoding/utf8/utf8_regexp.h create mode 100644 src/re/fixed_tags.cc create mode 100644 src/re/nullable.cc create mode 100644 src/re/re.h create mode 100644 src/re/rule.cc create mode 100644 src/re/rule.h create mode 100644 src/re/split_charset.cc create mode 100644 src/re/tag.cc create mode 100644 src/re/tag.h create mode 100644 src/skeleton/control_flow.cc create mode 100644 src/skeleton/generate_code.cc create mode 100644 src/skeleton/generate_data.cc create mode 100644 src/skeleton/maxpath.cc create mode 100644 src/skeleton/path.h create mode 100644 src/skeleton/skeleton.cc create mode 100644 src/skeleton/skeleton.h create mode 100644 src/util/hash32.h create mode 100644 src/util/lookup.h delete mode 100644 src/util/ord_hash_set.h create mode 100644 src/util/slab_allocator.h create mode 100644 src/util/string_utils.h create mode 100644 src/util/wrap_iter.h create mode 100755 test-driver create mode 100644 test/bug142.c create mode 100644 test/bug142.re create mode 100644 test/bug145.ci.c create mode 100644 test/bug145.ci.re create mode 100644 test/bug147.c create mode 100644 test/bug147.re create mode 100644 test/bug152.c.c create mode 100644 test/bug152.c.re create mode 100644 test/bug61.i--empty-class(match-none)--eager-skip.c create mode 100644 test/bug61.i--empty-class(match-none)--eager-skip.re delete mode 100644 test/code_points_error_esc.c delete mode 100644 test/code_points_error_lf.c delete mode 100644 test/cond_error_02.c.c delete mode 100644 test/cond_error_02.c.re delete mode 100644 test/cond_error_04.c.c delete mode 100644 test/cond_error_04.c.re delete mode 100644 test/cond_error_05.c.c delete mode 100644 test/cond_error_05.c.re delete mode 100644 test/cond_error_06.c.c delete mode 100644 test/cond_error_06.c.re create mode 100644 test/cond_error_12.c.c create mode 100644 test/cond_error_12.c.re create mode 100644 test/condition_13a.cg.c create mode 100644 test/condition_13a.cg.re create mode 100644 test/config/flags.c create mode 100644 test/config/flags.re create mode 100644 test/cpoint_class_error_eol.c create mode 100644 test/cpoint_class_error_eol.re create mode 100644 test/cpoint_class_error_esc_eol.c create mode 100644 test/cpoint_class_error_esc_eol.re create mode 100644 test/cpoint_string_error_eol.c rename test/{code_points_error_lf.re => cpoint_string_error_eol.re} (100%) create mode 100644 test/cpoint_string_error_esc_eol.c rename test/{code_points_error_esc.re => cpoint_string_error_esc_eol.re} (100%) create mode 100644 test/enc_reset.i.c create mode 100644 test/enc_reset.i.re create mode 100644 test/error15.c create mode 100644 test/error15.re create mode 100644 test/input11.b--eager-skip.c create mode 100644 test/input11.b--eager-skip.re delete mode 100644 test/php20140822_zend_language_scanner_crlf.igcd--flex-syntax.c delete mode 100644 test/php20140822_zend_language_scanner_crlf.igcd--flex-syntax.re delete mode 100644 test/php20150211_parse_date_crlf.ig.c delete mode 100644 test/php20150211_parse_date_crlf.ig.re create mode 100644 test/php20150211_pdo_sql_parser_trimmed.ig--skeleton.c create mode 100644 test/php20150211_pdo_sql_parser_trimmed.ig--skeleton.re create mode 100644 test/php20150211_pdo_sql_parser_trimmed.ig.c create mode 100644 test/php20150211_pdo_sql_parser_trimmed.ig.re create mode 100644 test/posix_captures/.dat/basic.dat create mode 100644 test/posix_captures/.dat/categorize.dat create mode 100644 test/posix_captures/.dat/forcedassoc.dat create mode 100644 test/posix_captures/.dat/glennfowler.dat create mode 100644 test/posix_captures/.dat/nullsubexpr.dat create mode 100644 test/posix_captures/.dat/osxbsdcritical.dat create mode 100644 test/posix_captures/.dat/other.dat create mode 100644 test/posix_captures/.dat/repetition.dat create mode 100644 test/posix_captures/.dat/rightassoc.dat create mode 100755 test/posix_captures/.gen/__gen.sh create mode 100644 test/posix_captures/.gen/template create mode 100755 test/posix_captures/.run/__run.sh create mode 100644 test/posix_captures/.run/template create mode 100644 test/posix_captures/basic/01.i--flex-syntax.c create mode 100644 test/posix_captures/basic/01.i--flex-syntax.re create mode 100644 test/posix_captures/basic/02.i--flex-syntax.c create mode 100644 test/posix_captures/basic/02.i--flex-syntax.re create mode 100644 test/posix_captures/basic/03.i--flex-syntax.c create mode 100644 test/posix_captures/basic/03.i--flex-syntax.re create mode 100644 test/posix_captures/basic/04.i--flex-syntax.c create mode 100644 test/posix_captures/basic/04.i--flex-syntax.re create mode 100644 test/posix_captures/basic/05.i--flex-syntax.c create mode 100644 test/posix_captures/basic/05.i--flex-syntax.re create mode 100644 test/posix_captures/basic/06.i--flex-syntax.c create mode 100644 test/posix_captures/basic/06.i--flex-syntax.re create mode 100644 test/posix_captures/basic/07.i--flex-syntax.c create mode 100644 test/posix_captures/basic/07.i--flex-syntax.re create mode 100644 test/posix_captures/basic/08.i--flex-syntax.c create mode 100644 test/posix_captures/basic/08.i--flex-syntax.re create mode 100644 test/posix_captures/basic/09.i--flex-syntax.c create mode 100644 test/posix_captures/basic/09.i--flex-syntax.re create mode 100644 test/posix_captures/basic/10.i--flex-syntax.c create mode 100644 test/posix_captures/basic/10.i--flex-syntax.re create mode 100644 test/posix_captures/basic/11.i--flex-syntax.c create mode 100644 test/posix_captures/basic/11.i--flex-syntax.re create mode 100644 test/posix_captures/basic/12.i--flex-syntax.c create mode 100644 test/posix_captures/basic/12.i--flex-syntax.re create mode 100644 test/posix_captures/basic/13.i--flex-syntax.c create mode 100644 test/posix_captures/basic/13.i--flex-syntax.re create mode 100644 test/posix_captures/basic/14.i--flex-syntax.c create mode 100644 test/posix_captures/basic/14.i--flex-syntax.re create mode 100644 test/posix_captures/basic/15.i--flex-syntax.c create mode 100644 test/posix_captures/basic/15.i--flex-syntax.re create mode 100644 test/posix_captures/basic/16.i--flex-syntax.c create mode 100644 test/posix_captures/basic/16.i--flex-syntax.re create mode 100644 test/posix_captures/basic/17.i--flex-syntax.c create mode 100644 test/posix_captures/basic/17.i--flex-syntax.re create mode 100644 test/posix_captures/basic/18.i--flex-syntax.c create mode 100644 test/posix_captures/basic/18.i--flex-syntax.re create mode 100644 test/posix_captures/basic/19.i--flex-syntax.c create mode 100644 test/posix_captures/basic/19.i--flex-syntax.re create mode 100644 test/posix_captures/basic/20.i--flex-syntax.c create mode 100644 test/posix_captures/basic/20.i--flex-syntax.re create mode 100644 test/posix_captures/basic/21.i--flex-syntax.c create mode 100644 test/posix_captures/basic/21.i--flex-syntax.re create mode 100644 test/posix_captures/basic/22.i--flex-syntax.c create mode 100644 test/posix_captures/basic/22.i--flex-syntax.re create mode 100644 test/posix_captures/basic/23.i--flex-syntax.c create mode 100644 test/posix_captures/basic/23.i--flex-syntax.re create mode 100644 test/posix_captures/basic/24.i--flex-syntax.c create mode 100644 test/posix_captures/basic/24.i--flex-syntax.re create mode 100644 test/posix_captures/basic/25.i--flex-syntax.c create mode 100644 test/posix_captures/basic/25.i--flex-syntax.re create mode 100644 test/posix_captures/basic/26.i--flex-syntax.c create mode 100644 test/posix_captures/basic/26.i--flex-syntax.re create mode 100644 test/posix_captures/basic/27.i--flex-syntax.c create mode 100644 test/posix_captures/basic/27.i--flex-syntax.re create mode 100644 test/posix_captures/basic/28.i--flex-syntax.c create mode 100644 test/posix_captures/basic/28.i--flex-syntax.re create mode 100644 test/posix_captures/basic/29.i--flex-syntax.c create mode 100644 test/posix_captures/basic/29.i--flex-syntax.re create mode 100644 test/posix_captures/basic/30.i--flex-syntax.c create mode 100644 test/posix_captures/basic/30.i--flex-syntax.re create mode 100644 test/posix_captures/basic/31.i--flex-syntax.c create mode 100644 test/posix_captures/basic/31.i--flex-syntax.re create mode 100644 test/posix_captures/basic/32.i--flex-syntax.c create mode 100644 test/posix_captures/basic/32.i--flex-syntax.re create mode 100644 test/posix_captures/basic/33.i--flex-syntax.c create mode 100644 test/posix_captures/basic/33.i--flex-syntax.re create mode 100644 test/posix_captures/basic/34.i--flex-syntax.c create mode 100644 test/posix_captures/basic/34.i--flex-syntax.re create mode 100644 test/posix_captures/basic/35.i--flex-syntax.c create mode 100644 test/posix_captures/basic/35.i--flex-syntax.re create mode 100644 test/posix_captures/basic/36.i--flex-syntax.c create mode 100644 test/posix_captures/basic/36.i--flex-syntax.re create mode 100644 test/posix_captures/basic/37.i--flex-syntax.c create mode 100644 test/posix_captures/basic/37.i--flex-syntax.re create mode 100644 test/posix_captures/basic/38.i--flex-syntax.c create mode 100644 test/posix_captures/basic/38.i--flex-syntax.re create mode 100644 test/posix_captures/basic/39.i--flex-syntax.c create mode 100644 test/posix_captures/basic/39.i--flex-syntax.re create mode 100644 test/posix_captures/basic/40.i--flex-syntax.c create mode 100644 test/posix_captures/basic/40.i--flex-syntax.re create mode 100644 test/posix_captures/basic/41.i--flex-syntax.c create mode 100644 test/posix_captures/basic/41.i--flex-syntax.re create mode 100644 test/posix_captures/basic/42.i--flex-syntax.c create mode 100644 test/posix_captures/basic/42.i--flex-syntax.re create mode 100644 test/posix_captures/basic/43.i--flex-syntax.c create mode 100644 test/posix_captures/basic/43.i--flex-syntax.re create mode 100644 test/posix_captures/basic/44.i--flex-syntax.c create mode 100644 test/posix_captures/basic/44.i--flex-syntax.re create mode 100644 test/posix_captures/basic/45.i--flex-syntax.c create mode 100644 test/posix_captures/basic/45.i--flex-syntax.re create mode 100644 test/posix_captures/basic/46.i--flex-syntax.c create mode 100644 test/posix_captures/basic/46.i--flex-syntax.re create mode 100644 test/posix_captures/basic/47.i--flex-syntax.c create mode 100644 test/posix_captures/basic/47.i--flex-syntax.re create mode 100644 test/posix_captures/basic/48.i--flex-syntax.c create mode 100644 test/posix_captures/basic/48.i--flex-syntax.re create mode 100644 test/posix_captures/basic/49.i--flex-syntax.c create mode 100644 test/posix_captures/basic/49.i--flex-syntax.re create mode 100644 test/posix_captures/basic/50.i--flex-syntax.c create mode 100644 test/posix_captures/basic/50.i--flex-syntax.re create mode 100644 test/posix_captures/basic/51.i--flex-syntax.c create mode 100644 test/posix_captures/basic/51.i--flex-syntax.re create mode 100644 test/posix_captures/basic/52.i--flex-syntax.c create mode 100644 test/posix_captures/basic/52.i--flex-syntax.re create mode 100644 test/posix_captures/basic/53.i--flex-syntax.c create mode 100644 test/posix_captures/basic/53.i--flex-syntax.re create mode 100644 test/posix_captures/basic/54.i--flex-syntax.c create mode 100644 test/posix_captures/basic/54.i--flex-syntax.re create mode 100644 test/posix_captures/basic/55.i--flex-syntax.c create mode 100644 test/posix_captures/basic/55.i--flex-syntax.re create mode 100644 test/posix_captures/basic/56.i--flex-syntax.c create mode 100644 test/posix_captures/basic/56.i--flex-syntax.re create mode 100644 test/posix_captures/basic/57.i--flex-syntax.c create mode 100644 test/posix_captures/basic/57.i--flex-syntax.re create mode 100644 test/posix_captures/basic/58.i--flex-syntax.c create mode 100644 test/posix_captures/basic/58.i--flex-syntax.re create mode 100644 test/posix_captures/basic/59.i--flex-syntax.c create mode 100644 test/posix_captures/basic/59.i--flex-syntax.re create mode 100644 test/posix_captures/categorize/01.i--flex-syntax.c create mode 100644 test/posix_captures/categorize/01.i--flex-syntax.re create mode 100644 test/posix_captures/categorize/02.i--flex-syntax.c create mode 100644 test/posix_captures/categorize/02.i--flex-syntax.re create mode 100644 test/posix_captures/categorize/03.i--flex-syntax.c create mode 100644 test/posix_captures/categorize/03.i--flex-syntax.re create mode 100644 test/posix_captures/categorize/04.i--flex-syntax.c create mode 100644 test/posix_captures/categorize/04.i--flex-syntax.re create mode 100644 test/posix_captures/categorize/05.i--flex-syntax.c create mode 100644 test/posix_captures/categorize/05.i--flex-syntax.re create mode 100644 test/posix_captures/categorize/06.i--flex-syntax.c create mode 100644 test/posix_captures/categorize/06.i--flex-syntax.re create mode 100644 test/posix_captures/categorize/07.i--flex-syntax.c create mode 100644 test/posix_captures/categorize/07.i--flex-syntax.re create mode 100644 test/posix_captures/categorize/08.i--flex-syntax.c create mode 100644 test/posix_captures/categorize/08.i--flex-syntax.re create mode 100644 test/posix_captures/categorize/09.i--flex-syntax.c create mode 100644 test/posix_captures/categorize/09.i--flex-syntax.re create mode 100644 test/posix_captures/categorize/10.i--flex-syntax.c create mode 100644 test/posix_captures/categorize/10.i--flex-syntax.re create mode 100644 test/posix_captures/categorize/11.i--flex-syntax.c create mode 100644 test/posix_captures/categorize/11.i--flex-syntax.re create mode 100644 test/posix_captures/exponential_epsilon_closure.i--posix-captures.c create mode 100644 test/posix_captures/exponential_epsilon_closure.i--posix-captures.re create mode 100644 test/posix_captures/forcedassoc/01.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/01.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/02.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/02.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/03.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/03.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/04.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/04.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/05.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/05.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/06.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/06.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/07.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/07.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/08.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/08.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/09.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/09.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/10.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/10.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/11.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/11.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/12.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/12.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/13.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/13.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/14.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/14.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/15.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/15.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/16.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/16.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/17.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/17.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/18.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/18.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/19.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/19.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/20.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/20.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/21.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/21.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/22.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/22.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/23.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/23.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/24.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/24.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/25.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/25.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/26.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/26.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/27.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/27.i--flex-syntax.re create mode 100644 test/posix_captures/forcedassoc/28.i--flex-syntax.c create mode 100644 test/posix_captures/forcedassoc/28.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/01.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/01.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/02.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/02.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/03.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/03.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/04.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/04.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/05.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/05.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/06.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/06.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/07.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/07.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/08.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/08.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/09.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/09.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/10.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/10.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/11.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/11.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/12.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/12.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/13.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/13.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/14.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/14.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/15.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/15.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/16.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/16.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/17.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/17.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/18.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/18.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/19.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/19.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/20.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/20.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/21.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/21.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/22.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/22.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/23.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/23.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/24.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/24.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/25.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/25.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/26.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/26.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/27.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/27.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/28.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/28.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/29.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/29.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/30.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/30.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/31.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/31.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/32.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/32.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/33.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/33.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/34.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/34.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/35.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/35.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/36.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/36.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/37.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/37.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/38.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/38.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/39.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/39.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/40.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/40.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/41.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/41.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/42.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/42.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/43.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/43.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/44.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/44.i--flex-syntax.re create mode 100644 test/posix_captures/glennfowler/45.i--flex-syntax.c create mode 100644 test/posix_captures/glennfowler/45.i--flex-syntax.re create mode 100644 test/posix_captures/gor1.i--posix-captures.c create mode 100644 test/posix_captures/gor1.i--posix-captures.re create mode 100644 test/posix_captures/gor2.i--posix-captures.c create mode 100644 test/posix_captures/gor2.i--posix-captures.re create mode 100644 test/posix_captures/gor3.i--posix-captures.c create mode 100644 test/posix_captures/gor3.i--posix-captures.re create mode 100644 test/posix_captures/implicit_grouping1.i--posix-captures.c create mode 100644 test/posix_captures/implicit_grouping1.i--posix-captures.re create mode 100644 test/posix_captures/implicit_grouping2.i--posix-captures.c create mode 100644 test/posix_captures/implicit_grouping2.i--posix-captures.re create mode 100644 test/posix_captures/implicit_grouping3.i--posix-captures.c create mode 100644 test/posix_captures/implicit_grouping3.i--posix-captures.re create mode 100644 test/posix_captures/leftmost1.i--posix-captures.c create mode 100644 test/posix_captures/leftmost1.i--posix-captures.re create mode 100644 test/posix_captures/leftmost2.i--posix-captures.c create mode 100644 test/posix_captures/leftmost2.i--posix-captures.re create mode 100644 test/posix_captures/multisubhistories.i--posix-captures.c create mode 100644 test/posix_captures/multisubhistories.i--posix-captures.re create mode 100644 test/posix_captures/nullsubexpr/01.i--flex-syntax.c create mode 100644 test/posix_captures/nullsubexpr/01.i--flex-syntax.re create mode 100644 test/posix_captures/nullsubexpr/02.i--flex-syntax.c create mode 100644 test/posix_captures/nullsubexpr/02.i--flex-syntax.re create mode 100644 test/posix_captures/nullsubexpr/03.i--flex-syntax.c create mode 100644 test/posix_captures/nullsubexpr/03.i--flex-syntax.re create mode 100644 test/posix_captures/nullsubexpr/04.i--flex-syntax.c create mode 100644 test/posix_captures/nullsubexpr/04.i--flex-syntax.re create mode 100644 test/posix_captures/nullsubexpr/05.i--flex-syntax.c create mode 100644 test/posix_captures/nullsubexpr/05.i--flex-syntax.re create mode 100644 test/posix_captures/nullsubexpr/06.i--flex-syntax.c create mode 100644 test/posix_captures/nullsubexpr/06.i--flex-syntax.re create mode 100644 test/posix_captures/nullsubexpr/07.i--flex-syntax.c create mode 100644 test/posix_captures/nullsubexpr/07.i--flex-syntax.re create mode 100644 test/posix_captures/nullsubexpr/08.i--flex-syntax.c create mode 100644 test/posix_captures/nullsubexpr/08.i--flex-syntax.re create mode 100644 test/posix_captures/nullsubexpr/09.i--flex-syntax.c create mode 100644 test/posix_captures/nullsubexpr/09.i--flex-syntax.re create mode 100644 test/posix_captures/nullsubexpr/10.i--flex-syntax.c create mode 100644 test/posix_captures/nullsubexpr/10.i--flex-syntax.re create mode 100644 test/posix_captures/nullsubexpr/11.i--flex-syntax.c create mode 100644 test/posix_captures/nullsubexpr/11.i--flex-syntax.re create mode 100644 test/posix_captures/nullsubexpr/12.i--flex-syntax.c create mode 100644 test/posix_captures/nullsubexpr/12.i--flex-syntax.re create mode 100644 test/posix_captures/nullsubexpr/13.i--flex-syntax.c create mode 100644 test/posix_captures/nullsubexpr/13.i--flex-syntax.re create mode 100644 test/posix_captures/nullsubexpr/14.i--flex-syntax.c create mode 100644 test/posix_captures/nullsubexpr/14.i--flex-syntax.re create mode 100644 test/posix_captures/nullsubexpr/15.i--flex-syntax.c create mode 100644 test/posix_captures/nullsubexpr/15.i--flex-syntax.re create mode 100644 test/posix_captures/nullsubexpr/16.i--flex-syntax.c create mode 100644 test/posix_captures/nullsubexpr/16.i--flex-syntax.re create mode 100644 test/posix_captures/nullsubexpr/17.i--flex-syntax.c create mode 100644 test/posix_captures/nullsubexpr/17.i--flex-syntax.re create mode 100644 test/posix_captures/nullsubexpr/18.i--flex-syntax.c create mode 100644 test/posix_captures/nullsubexpr/18.i--flex-syntax.re create mode 100644 test/posix_captures/nullsubexpr/19.i--flex-syntax.c create mode 100644 test/posix_captures/nullsubexpr/19.i--flex-syntax.re create mode 100644 test/posix_captures/nullsubexpr/20.i--flex-syntax.c create mode 100644 test/posix_captures/nullsubexpr/20.i--flex-syntax.re create mode 100644 test/posix_captures/nullsubexpr/21.i--flex-syntax.c create mode 100644 test/posix_captures/nullsubexpr/21.i--flex-syntax.re create mode 100644 test/posix_captures/offsets.i--posix-captures--input(custom).c create mode 100644 test/posix_captures/offsets.i--posix-captures--input(custom).re create mode 100644 test/posix_captures/osxbsdcritical/01.i--flex-syntax.c create mode 100644 test/posix_captures/osxbsdcritical/01.i--flex-syntax.re create mode 100644 test/posix_captures/osxbsdcritical/02.i--flex-syntax.c create mode 100644 test/posix_captures/osxbsdcritical/02.i--flex-syntax.re create mode 100644 test/posix_captures/osxbsdcritical/03.i--flex-syntax.c create mode 100644 test/posix_captures/osxbsdcritical/03.i--flex-syntax.re create mode 100644 test/posix_captures/osxbsdcritical/04.i--flex-syntax.c create mode 100644 test/posix_captures/osxbsdcritical/04.i--flex-syntax.re create mode 100644 test/posix_captures/osxbsdcritical/05.i--flex-syntax.c create mode 100644 test/posix_captures/osxbsdcritical/05.i--flex-syntax.re create mode 100644 test/posix_captures/osxbsdcritical/06.i--flex-syntax.c create mode 100644 test/posix_captures/osxbsdcritical/06.i--flex-syntax.re create mode 100644 test/posix_captures/osxbsdcritical/07.i--flex-syntax.c create mode 100644 test/posix_captures/osxbsdcritical/07.i--flex-syntax.re create mode 100644 test/posix_captures/other/01.i--flex-syntax.c create mode 100644 test/posix_captures/other/01.i--flex-syntax.re create mode 100644 test/posix_captures/other/02.i--flex-syntax.c create mode 100644 test/posix_captures/other/02.i--flex-syntax.re create mode 100644 test/posix_captures/other/03.i--flex-syntax.c create mode 100644 test/posix_captures/other/03.i--flex-syntax.re create mode 100644 test/posix_captures/other/04.i--flex-syntax.c create mode 100644 test/posix_captures/other/04.i--flex-syntax.re create mode 100644 test/posix_captures/other/05.i--flex-syntax.c create mode 100644 test/posix_captures/other/05.i--flex-syntax.re create mode 100644 test/posix_captures/other/06.i--flex-syntax.c create mode 100644 test/posix_captures/other/06.i--flex-syntax.re create mode 100644 test/posix_captures/other/07.i--flex-syntax.c create mode 100644 test/posix_captures/other/07.i--flex-syntax.re create mode 100644 test/posix_captures/other/08.i--flex-syntax.c create mode 100644 test/posix_captures/other/08.i--flex-syntax.re create mode 100644 test/posix_captures/other/09.i--flex-syntax.c create mode 100644 test/posix_captures/other/09.i--flex-syntax.re create mode 100644 test/posix_captures/other/10.i--flex-syntax.c create mode 100644 test/posix_captures/other/10.i--flex-syntax.re create mode 100644 test/posix_captures/other/11.i--flex-syntax.c create mode 100644 test/posix_captures/other/11.i--flex-syntax.re create mode 100644 test/posix_captures/other/12.i--flex-syntax.c create mode 100644 test/posix_captures/other/12.i--flex-syntax.re create mode 100644 test/posix_captures/other/13.i--flex-syntax.c create mode 100644 test/posix_captures/other/13.i--flex-syntax.re create mode 100644 test/posix_captures/other/14.i--flex-syntax.c create mode 100644 test/posix_captures/other/14.i--flex-syntax.re create mode 100644 test/posix_captures/other/15.i--flex-syntax.c create mode 100644 test/posix_captures/other/15.i--flex-syntax.re create mode 100644 test/posix_captures/other/16.i--flex-syntax.c create mode 100644 test/posix_captures/other/16.i--flex-syntax.re create mode 100644 test/posix_captures/other/17.i--flex-syntax.c create mode 100644 test/posix_captures/other/17.i--flex-syntax.re create mode 100644 test/posix_captures/other/18.i--flex-syntax.c create mode 100644 test/posix_captures/other/18.i--flex-syntax.re create mode 100644 test/posix_captures/other/19.i--flex-syntax.c create mode 100644 test/posix_captures/other/19.i--flex-syntax.re create mode 100644 test/posix_captures/other/20.i--flex-syntax.c create mode 100644 test/posix_captures/other/20.i--flex-syntax.re create mode 100644 test/posix_captures/other/21.i--flex-syntax.c create mode 100644 test/posix_captures/other/21.i--flex-syntax.re create mode 100644 test/posix_captures/other/22.i--flex-syntax.c create mode 100644 test/posix_captures/other/22.i--flex-syntax.re create mode 100644 test/posix_captures/other/23.i--flex-syntax.c create mode 100644 test/posix_captures/other/23.i--flex-syntax.re create mode 100644 test/posix_captures/other/24.i--flex-syntax.c create mode 100644 test/posix_captures/other/24.i--flex-syntax.re create mode 100644 test/posix_captures/other/25.i--flex-syntax.c create mode 100644 test/posix_captures/other/25.i--flex-syntax.re create mode 100644 test/posix_captures/other/26.i--flex-syntax.c create mode 100644 test/posix_captures/other/26.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/01.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/01.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/02.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/02.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/03.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/03.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/04.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/04.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/05.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/05.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/06.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/06.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/07.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/07.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/08.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/08.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/09.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/09.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/10.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/10.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/11.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/11.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/12.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/12.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/13.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/13.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/14.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/14.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/15.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/15.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/16.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/16.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/17.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/17.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/18.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/18.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/19.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/19.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/20.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/20.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/21.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/21.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/22.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/22.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/23.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/23.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/24.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/24.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/25.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/25.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/26.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/26.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/27.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/27.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/28.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/28.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/29.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/29.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/30.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/30.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/31.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/31.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/32.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/32.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/33.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/33.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/34.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/34.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/35.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/35.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/36.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/36.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/37.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/37.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/38.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/38.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/39.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/39.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/40.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/40.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/41.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/41.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/42.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/42.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/43.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/43.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/44.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/44.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/45.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/45.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/46.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/46.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/47.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/47.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/48.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/48.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/49.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/49.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/50.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/50.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/51.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/51.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/52.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/52.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/53.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/53.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/54.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/54.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/55.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/55.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/56.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/56.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/57.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/57.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/58.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/58.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/59.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/59.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/60.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/60.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/61.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/61.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/62.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/62.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/63.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/63.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/64.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/64.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/65.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/65.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/66.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/66.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/67.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/67.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/68.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/68.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/69.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/69.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/70.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/70.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/71.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/71.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/72.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/72.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/73.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/73.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/74.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/74.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/75.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/75.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/76.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/76.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/77.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/77.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/78.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/78.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/79.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/79.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/80.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/80.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/81.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/81.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/82.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/82.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/83.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/83.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/84.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/84.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/85.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/85.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/86.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/86.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/87.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/87.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/88.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/88.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/89.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/89.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/90.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/90.i--flex-syntax.re create mode 100644 test/posix_captures/repetition/91.i--flex-syntax.c create mode 100644 test/posix_captures/repetition/91.i--flex-syntax.re create mode 100644 test/posix_captures/rightassoc/01.i--flex-syntax.c create mode 100644 test/posix_captures/rightassoc/01.i--flex-syntax.re create mode 100644 test/posix_captures/rightassoc/02.i--flex-syntax.c create mode 100644 test/posix_captures/rightassoc/02.i--flex-syntax.re create mode 100644 test/posix_captures/rightassoc/03.i--flex-syntax.c create mode 100644 test/posix_captures/rightassoc/03.i--flex-syntax.re create mode 100644 test/posix_captures/rightassoc/04.i--flex-syntax.c create mode 100644 test/posix_captures/rightassoc/04.i--flex-syntax.re create mode 100644 test/posix_captures/rightassoc/05.i--flex-syntax.c create mode 100644 test/posix_captures/rightassoc/05.i--flex-syntax.re create mode 100644 test/posix_captures/rightassoc/06.i--flex-syntax.c create mode 100644 test/posix_captures/rightassoc/06.i--flex-syntax.re create mode 100644 test/posix_captures/rightassoc/07.i--flex-syntax.c create mode 100644 test/posix_captures/rightassoc/07.i--flex-syntax.re create mode 100644 test/posix_captures/rightassoc/08.i--flex-syntax.c create mode 100644 test/posix_captures/rightassoc/08.i--flex-syntax.re create mode 100644 test/posix_captures/rightassoc/09.i--flex-syntax.c create mode 100644 test/posix_captures/rightassoc/09.i--flex-syntax.re create mode 100644 test/posix_captures/rightassoc/10.i--flex-syntax.c create mode 100644 test/posix_captures/rightassoc/10.i--flex-syntax.re create mode 100644 test/posix_captures/rightassoc/11.i--flex-syntax.c create mode 100644 test/posix_captures/rightassoc/11.i--flex-syntax.re create mode 100644 test/posix_captures/rightassoc/12.i--flex-syntax.c create mode 100644 test/posix_captures/rightassoc/12.i--flex-syntax.re create mode 100644 test/posix_captures/uncomparable_bottoms.i--posix-captures.c create mode 100644 test/posix_captures/uncomparable_bottoms.i--posix-captures.re delete mode 100644 test/repeat-07_error.gir.c delete mode 100644 test/repeat-07_error.gir.re create mode 100644 test/repeat-08.ir.c create mode 100644 test/repeat-08.ir.re create mode 100644 test/repeat-09.ir.c create mode 100644 test/repeat-09.ir.re create mode 100644 test/reuse_conds_setup_1.cgir--eager-skip.c create mode 100644 test/reuse_conds_setup_1.cgir--eager-skip.re create mode 100644 test/tags/ambiguity/alt0.i--tags.c create mode 100644 test/tags/ambiguity/alt0.i--tags.re create mode 100644 test/tags/ambiguity/alt1.i--tags.c create mode 100644 test/tags/ambiguity/alt1.i--tags.re create mode 100644 test/tags/ambiguity/alt2.i--tags.c create mode 100644 test/tags/ambiguity/alt2.i--tags.re create mode 100644 test/tags/ambiguity/cat1.i--tags.c create mode 100644 test/tags/ambiguity/cat1.i--tags.re create mode 100644 test/tags/ambiguity/cat3.i.c create mode 100644 test/tags/ambiguity/cat3.i.re create mode 100644 test/tags/ambiguity/cat4.i--tags.c create mode 100644 test/tags/ambiguity/cat4.i--tags.re create mode 100644 test/tags/ambiguity/iter.i--tags.c create mode 100644 test/tags/ambiguity/iter.i--tags.re create mode 100644 test/tags/bench_http_rfc7230.i.c create mode 100644 test/tags/bench_http_rfc7230.i.re create mode 100644 test/tags/bench_http_simple.i.c create mode 100644 test/tags/bench_http_simple.i.re create mode 100644 test/tags/bench_uri_rfc3986.i.c create mode 100644 test/tags/bench_uri_rfc3986.i.re create mode 100644 test/tags/bench_uri_simple.i.c create mode 100644 test/tags/bench_uri_simple.i.re create mode 100644 test/tags/bug121_fix_multiple.i--input(custom).c create mode 100644 test/tags/bug121_fix_multiple.i--input(custom).re create mode 100644 test/tags/bug121_fix_multiple.i--tags--input(custom).c create mode 100644 test/tags/bug121_fix_multiple.i--tags--input(custom).re create mode 100644 test/tags/bug121_fix_none.i.c create mode 100644 test/tags/bug121_fix_none.i.re create mode 100644 test/tags/bug121_fix_single.i--input(custom).c create mode 100644 test/tags/bug121_fix_single.i--input(custom).re create mode 100644 test/tags/bug121_var_multiple.i--input(custom).c create mode 100644 test/tags/bug121_var_multiple.i--input(custom).re create mode 100644 test/tags/bug121_var_multiple.i--tags--eager-skip--input(custom).c create mode 100644 test/tags/bug121_var_multiple.i--tags--eager-skip--input(custom).re create mode 100644 test/tags/bug121_var_multiple.i--tags--eager-skip.c create mode 100644 test/tags/bug121_var_multiple.i--tags--eager-skip.re create mode 100644 test/tags/bug121_var_multiple.i--tags--input(custom).c create mode 100644 test/tags/bug121_var_multiple.i--tags--input(custom).re create mode 100644 test/tags/bug121_var_multiple.i--tags.c create mode 100644 test/tags/bug121_var_multiple.i--tags.re create mode 100644 test/tags/bug121_var_multiple.i.c create mode 100644 test/tags/bug121_var_multiple.i.re create mode 100644 test/tags/bug121_var_single.i--input(custom).c create mode 100644 test/tags/bug121_var_single.i--input(custom).re create mode 100644 test/tags/bug121_var_single.i.c create mode 100644 test/tags/bug121_var_single.i.re create mode 100644 test/tags/cond_star0.ci--input(custom).c create mode 100644 test/tags/cond_star0.ci--input(custom).re create mode 100644 test/tags/cond_star0.ci.c create mode 100644 test/tags/cond_star0.ci.re create mode 100644 test/tags/cond_star1.ci--input(custom).c create mode 100644 test/tags/cond_star1.ci--input(custom).re create mode 100644 test/tags/cond_star1.ci.c create mode 100644 test/tags/cond_star1.ci.re create mode 100644 test/tags/cond_star2.ci.c create mode 100644 test/tags/cond_star2.ci.re create mode 100644 test/tags/conf1.i--tags--input(custom).c create mode 100644 test/tags/conf1.i--tags--input(custom).re create mode 100644 test/tags/conf1.i--tags.c create mode 100644 test/tags/conf1.i--tags.re create mode 100644 test/tags/conf2.i--tags--input(custom).c create mode 100644 test/tags/conf2.i--tags--input(custom).re create mode 100644 test/tags/conf2.i--tags.c create mode 100644 test/tags/conf2.i--tags.re create mode 100644 test/tags/conf3.i--tags--input(custom).c create mode 100644 test/tags/conf3.i--tags--input(custom).re create mode 100644 test/tags/conf3.i--tags.c create mode 100644 test/tags/conf3.i--tags.re create mode 100644 test/tags/copy_coalescing1.i--tags.c create mode 100644 test/tags/copy_coalescing1.i--tags.re create mode 100644 test/tags/copy_coalescing2.i--tags.c create mode 100644 test/tags/copy_coalescing2.i--tags.re create mode 100644 test/tags/copy_save.i--tags.c create mode 100644 test/tags/copy_save.i--tags.re create mode 100644 test/tags/counter1.i--tags.c create mode 100644 test/tags/counter1.i--tags.re create mode 100644 test/tags/dedup0.i--input(custom).c create mode 100644 test/tags/dedup0.i--input(custom).re create mode 100644 test/tags/dedup0.i.c create mode 100644 test/tags/dedup0.i.re create mode 100644 test/tags/dedup1.i--input(custom).c create mode 100644 test/tags/dedup1.i--input(custom).re create mode 100644 test/tags/dedup1.i.c create mode 100644 test/tags/dedup1.i.re create mode 100644 test/tags/dedup2.i--input(custom).c create mode 100644 test/tags/dedup2.i--input(custom).re create mode 100644 test/tags/dedup2.i.c create mode 100644 test/tags/dedup2.i.re create mode 100644 test/tags/dedup3.i--input(custom).c create mode 100644 test/tags/dedup3.i--input(custom).re create mode 100644 test/tags/dedup3.i.c create mode 100644 test/tags/dedup3.i.re create mode 100644 test/tags/dedup4.i--tags.c create mode 100644 test/tags/dedup4.i--tags.re create mode 100644 test/tags/dedup5.i--tags.c create mode 100644 test/tags/dedup5.i--tags.re create mode 100644 test/tags/exponential_bottoms.i--tags.c create mode 100644 test/tags/exponential_bottoms.i--tags.re create mode 100644 test/tags/fallback1.i--tags.c create mode 100644 test/tags/fallback1.i--tags.re create mode 100644 test/tags/fallback2.i--tags.c create mode 100644 test/tags/fallback2.i--tags.re create mode 100644 test/tags/fallback3.i--tags.c create mode 100644 test/tags/fallback3.i--tags.re create mode 100644 test/tags/fallback4.i--tags.c create mode 100644 test/tags/fallback4.i--tags.re create mode 100644 test/tags/fallback5.i--tags.c create mode 100644 test/tags/fallback5.i--tags.re create mode 100644 test/tags/fallback6.i--tags.c create mode 100644 test/tags/fallback6.i--tags.re create mode 100644 test/tags/fix2.i--tags.c create mode 100644 test/tags/fix2.i--tags.re create mode 100644 test/tags/fix2_trail.i--tags--input(custom).c create mode 100644 test/tags/fix2_trail.i--tags--input(custom).re create mode 100644 test/tags/fix2_trail.i--tags.c create mode 100644 test/tags/fix2_trail.i--tags.re create mode 100644 test/tags/fix3.i--tags.c create mode 100644 test/tags/fix3.i--tags.re create mode 100644 test/tags/fix3_trail.i--tags--input(custom).c create mode 100644 test/tags/fix3_trail.i--tags--input(custom).re create mode 100644 test/tags/fix3_trail.i--tags.c create mode 100644 test/tags/fix3_trail.i--tags.re create mode 100644 test/tags/fix4.i--tags.c create mode 100644 test/tags/fix4.i--tags.re create mode 100644 test/tags/fix4_trail.i--tags--input(custom).c create mode 100644 test/tags/fix4_trail.i--tags--input(custom).re create mode 100644 test/tags/fix4_trail.i--tags.c create mode 100644 test/tags/fix4_trail.i--tags.re create mode 100644 test/tags/fix5.i--tags.c create mode 100644 test/tags/fix5.i--tags.re create mode 100644 test/tags/fix5_trail.i--tags--input(custom).c create mode 100644 test/tags/fix5_trail.i--tags--input(custom).re create mode 100644 test/tags/fix5_trail.i--tags.c create mode 100644 test/tags/fix5_trail.i--tags.re create mode 100644 test/tags/interference.i--tags.c create mode 100644 test/tags/interference.i--tags.re create mode 100644 test/tags/iter_plus.i--tags.c create mode 100644 test/tags/iter_plus.i--tags.re create mode 100644 test/tags/lost_tag.i--tags--no-lookahead--input(custom).c create mode 100644 test/tags/lost_tag.i--tags--no-lookahead--input(custom).re create mode 100644 test/tags/map_ord1.i--tags--no-lookahead.c create mode 100644 test/tags/map_ord1.i--tags--no-lookahead.re create mode 100644 test/tags/map_ord1.i--tags.c create mode 100644 test/tags/map_ord1.i--tags.re create mode 100644 test/tags/map_ord2.i--tags--no-lookahead.c create mode 100644 test/tags/map_ord2.i--tags--no-lookahead.re create mode 100644 test/tags/map_ord2.i--tags.c create mode 100644 test/tags/map_ord2.i--tags.re create mode 100644 test/tags/minimization.i.c create mode 100644 test/tags/minimization.i.re create mode 100644 test/tags/skip_tags_disorder1.i--tags--no-lookahead.c create mode 100644 test/tags/skip_tags_disorder1.i--tags--no-lookahead.re create mode 100644 test/tags/skip_tags_disorder2.i--tags--no-lookahead.c create mode 100644 test/tags/skip_tags_disorder2.i--tags--no-lookahead.re create mode 100644 test/tags/skip_tags_disorder3.i--eager-skip.c create mode 100644 test/tags/skip_tags_disorder3.i--eager-skip.re create mode 100644 test/tags/skip_tags_disorder4.i--tags--no-lookahead.c create mode 100644 test/tags/skip_tags_disorder4.i--tags--no-lookahead.re create mode 100644 test/tags/syntax_error0.c create mode 100644 test/tags/syntax_error0.re create mode 100644 test/tags/tags_in_trail.i--tags.c create mode 100644 test/tags/tags_in_trail.i--tags.re create mode 100644 test/tags/topsort1.i--tags.c create mode 100644 test/tags/topsort1.i--tags.re create mode 100644 test/tags/topsort2.i--tags.c create mode 100644 test/tags/topsort2.i--tags.re create mode 100644 test/tags/topsort3.i--tags--no-lookahead.c create mode 100644 test/tags/topsort3.i--tags--no-lookahead.re create mode 100644 test/tags/twopass.i--tags.c create mode 100644 test/tags/twopass.i--tags.re create mode 100644 test/tags/uniq.i--tags.c create mode 100644 test/tags/uniq.i--tags.re create mode 100644 test/tags/yyaccept1.i.c create mode 100644 test/tags/yyaccept1.i.re create mode 100644 test/wunreachable_rules.i.c create mode 100644 test/wunreachable_rules.i.re create mode 100644 test/yyaccept_initial.i.c create mode 100644 test/yyaccept_initial.i.re create mode 100644 test/yyaccept_missing.bci--eager-skip.c create mode 100644 test/yyaccept_missing.bci--eager-skip.re diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 795216c..0000000 --- a/.gitignore +++ /dev/null @@ -1,10 +0,0 @@ -autom4te.cache/ -Makefile.in -aclocal.m4 -configure -compile -config.h.in -depcomp -install-sh -missing -test-driver diff --git a/CHANGELOG b/CHANGELOG index 02a523c..1737806 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,5 +1,109 @@ +Version 1.0.2 (2017-08-26) +-------------------------- +- Fixed bug #194 Build with "--enable-docs" +- Updated documentation. + +Version 1.0.1 (2017-08-11) +-------------------------- +- Fixed bug #193 1.0 build failure on macOS: error: calling a private constructor of class 're2c::Rule' +- Added paper "Tagged Deterministic Finite Automata with Lookahead" to distribution + +Version 1.0 (2017-08-11) +------------------------ +- Added options: + '-P --posix-captures' (POSIX-compliant capturing groups) + '-T --tags' (standalone tags with leftmost greedy disambiguation) + '--no-lookahead' + '--no-optimize-tags' + '--eager-skip' + '--dump-nfa' + '--dump-dfa-raw' + '--dump-dfa-det' + '--dump-dfa-tagopt' + '--dump-dfa-min' + '--dump-adfa' +- Added new syntax: + '@' + '#' +- Added new directives: + '/*!stags:re2c ... */' + '/*!mtags:re2c ... */' + '/*!maxnmatch:re2c ... */' +- Added new API: + 'YYSTAGN (t)' + 'YYSTAGP (t)' + 'YYMTAGN (t)' + 'YYMTAGP (t)' + 'YYRESTORETAG (t)' + 'YYMAXNMATCH' + 'yynmatch' + 'yypmatch' +- Added inplace confgurations: + 're2c:define:YYSTAGN' + 're2c:define:YYSTAGP' + 're2c:define:YYMTAGN' + 're2c:define:YYMTAGP' + 're2c:define:YYRESTORETAG' + 're2c:flags:8' or 're2c:flags:utf-8'' + 're2c:flags:b' or 're2c:flags:bit-vectors' + 're2c:flags:case-insensitive' + 're2c:flags:case-inverted' + 're2c:flags:d' or 're2c:flags:debug-output' + 're2c:flags:dfa-minimization' + 're2c:flags:eager-skip' + 're2c:flags:e' or 're2c:flags:ecb' + 're2c:flags:empty-class' + 're2c:flags:encoding-policy' + 're2c:flags:g' or 're2c:flags:computed-gotos' + 're2c:flags:i' or 're2c:flags:no-debug-info' + 're2c:flags:input' + 're2c:flags:lookahead' + 're2c:flags:optimize-tags' + 're2c:flags:P' or 're2c:flags:posix-captures' + 're2c:flags:s' or 're2c:flags:nested-ifs' + 're2c:flags:T' or 're2c:flags:tags' + 're2c:flags:u' or 're2c:flags:unicode' + 're2c:flags:w' or 're2c:flags:wide-chars' + 're2c:flags:x' or 're2c:flags:utf-16' + 're2c:tags:expression' + 're2c:tags:prefix' +- Added warning '-Wnondeterministic-tags' +- Added fuzz-testing scripts +- Added paper "Tagged Deterministic Finite Automata with Lookahead" +- Fixed bugs: + #121 "trailing contexts are fundamentally broken" + #135 "In installation 'make check' give syntax error" + #137 "run_tests.sh fail when running configure script with absolute path" + #138 "website improvement" + #141 "Tests under Windows" + #142 "segvault with null terminated input" + #145 "Values for enum YYCONDTYPE are not generated when default rules with conditions are used" + #147 "Please add symbol name to "can't find symbol" error message" + #152 "Line number in #line directive after enum YYCONDTYPE is 0-based" + #156 "Build with Visual Studio 14 2015: symbol name conflict" + #158 "Inconsistent forward declaration of struct/class vs definition" + #160 "Open text files with "wb" causes issues on Windows" + #162 "Reading files with "rb" causes issues in Windows" + #165 "Trailing context consumed if initial expression matches it" + #176 "re2c help message is too wide for most terminals" + #184 "Small documentation issue" + #186 "Difference operator sometimes doesn't work with utf-8" +- Merged pull requests: + #131 "Use bash-specific '[[' builtin" + #136 "Added basic support for travis-ci.org integration" + #171 "Typo fix" + #172 "Grammar fixes in the docs" + #173 "Grammar fixes in the manpage" + #174 "more documentation fixes" + #175 "more manpage fixes" + #177 "sync --help output w/ manpage" + #178 "Moves rts used in the manpage to master" + #179 "compose manpage out of rsts from gh-pages-gen" + #189 "Typo fix and small grammatical change" + #191 "Makefile.am: create target directory before writing into it" + Version 0.16 (2016-01-21) ---------------------------- +------------------------- - Fixed bug #127 "code generation error with wide chars and bitmaps (omitted 'goto' statement)" - Added DFA minimization and option '--dfa-minimization ' - Fixed bug #128 "very slow DFA construction (resulting in a very large DFA)" diff --git a/Makefile.am b/Makefile.am index 3b3b2c5..378fb76 100644 --- a/Makefile.am +++ b/Makefile.am @@ -9,116 +9,138 @@ RE2C = re2c$(EXEEXT) # sources SRC_HDR = \ - src/codegen/bitmap.h \ - src/codegen/emit.h \ - src/codegen/go.h \ - src/codegen/indent.h \ - src/codegen/input_api.h \ - src/codegen/label.h \ - src/codegen/output.h \ - src/codegen/print.h \ + src/code/bitmap.h \ + src/code/emit.h \ + src/code/go.h \ + src/code/input_api.h \ + src/code/label.h \ + src/code/output.h \ + src/code/print.h \ src/conf/msg.h \ src/conf/opt.h \ src/conf/warn.h \ - src/ir/adfa/action.h \ - src/ir/adfa/adfa.h \ - src/ir/dfa/dfa.h \ - src/ir/nfa/nfa.h \ - src/ir/regexp/encoding/case.h \ - src/ir/regexp/encoding/enc.h \ - src/ir/regexp/encoding/range_suffix.h \ - src/ir/regexp/encoding/utf8/utf8.h \ - src/ir/regexp/encoding/utf8/utf8_regexp.h \ - src/ir/regexp/encoding/utf8/utf8_range.h \ - src/ir/regexp/encoding/utf16/utf16_range.h \ - src/ir/regexp/encoding/utf16/utf16_regexp.h \ - src/ir/regexp/encoding/utf16/utf16.h \ - src/ir/regexp/empty_class_policy.h \ - src/ir/regexp/regexp_alt.h \ - src/ir/regexp/regexp_match.h \ - src/ir/regexp/regexp_rule.h \ - src/ir/regexp/regexp_cat.h \ - src/ir/regexp/regexp_null.h \ - src/ir/regexp/regexp.h \ - src/ir/regexp/regexp_close.h \ - src/ir/compile.h \ - src/ir/rule_rank.h \ - src/ir/skeleton/path.h \ - src/ir/skeleton/way.h \ - src/ir/skeleton/skeleton.h \ - src/globals.h \ - src/parse/code.h \ - src/parse/extop.h \ - src/parse/input.h \ - src/parse/loc.h \ - src/parse/parser.h \ - src/parse/rules.h \ - src/parse/scanner.h \ - src/parse/spec.h \ - src/parse/unescape.h \ + src/adfa/action.h \ + src/adfa/adfa.h \ + src/adfa/dump.h \ + src/dfa/cfg/cfg.h \ + src/dfa/closure.h \ + src/dfa/dfa.h \ + src/dfa/dump.h \ + src/dfa/find_state.h \ + src/dfa/tagpool.h \ + src/dfa/tagtree.h \ + src/dfa/tcmd.h \ + src/nfa/nfa.h \ + src/re/encoding/case.h \ + src/re/encoding/enc.h \ + src/re/encoding/range_suffix.h \ + src/re/encoding/utf8/utf8.h \ + src/re/encoding/utf8/utf8_regexp.h \ + src/re/encoding/utf8/utf8_range.h \ + src/re/encoding/utf16/utf16_range.h \ + src/re/encoding/utf16/utf16_regexp.h \ + src/re/encoding/utf16/utf16.h \ + src/re/empty_class_policy.h \ + src/re/re.h \ + src/re/rule.h \ + src/re/tag.h \ + src/compile.h \ + src/skeleton/path.h \ + src/skeleton/skeleton.h \ + src/ast/ast.h \ + src/ast/input.h \ + src/ast/parser.h \ + src/ast/scanner.h \ + src/ast/unescape.h \ src/util/allocate.h \ src/util/attribute.h \ src/util/c99_stdint.h \ src/util/counter.h \ src/util/forbid_copy.h \ src/util/free_list.h \ + src/util/hash32.h \ src/util/local_increment.h \ - src/util/ord_hash_set.h \ + src/util/lookup.h \ src/util/range.h \ src/util/s_to_n32_unsafe.h \ + src/util/slab_allocator.h \ src/util/smart_ptr.h \ src/util/static_assert.h \ + src/util/string_utils.h \ src/util/u32lim.h \ - src/util/uniq_vector.h + src/util/uniq_vector.h \ + src/util/wrap_iter.h SRC = \ - src/codegen/bitmap.cc \ - src/codegen/emit_action.cc \ - src/codegen/emit_dfa.cc \ - src/codegen/label.cc \ - src/codegen/go_construct.cc \ - src/codegen/go_destruct.cc \ - src/codegen/go_emit.cc \ - src/codegen/go_used_labels.cc \ - src/codegen/input_api.cc \ - src/codegen/output.cc \ - src/codegen/print.cc \ + src/code/bitmap.cc \ + src/code/emit_action.cc \ + src/code/emit_dfa.cc \ + src/code/label.cc \ + src/code/go_construct.cc \ + src/code/go_destruct.cc \ + src/code/go_emit.cc \ + src/code/go_used_labels.cc \ + src/code/input_api.cc \ + src/code/output.cc \ + src/code/print.cc \ src/conf/msg.cc \ src/conf/opt.cc \ src/conf/warn.cc \ - src/ir/nfa/calc_size.cc \ - src/ir/nfa/nfa.cc \ - src/ir/nfa/split.cc \ - src/ir/adfa/adfa.cc \ - src/ir/adfa/prepare.cc \ - src/ir/dfa/determinization.cc \ - src/ir/dfa/fillpoints.cc \ - src/ir/dfa/minimization.cc \ - src/ir/regexp/display.cc \ - src/ir/regexp/encoding/enc.cc \ - src/ir/regexp/encoding/range_suffix.cc \ - src/ir/regexp/encoding/utf8/utf8_regexp.cc \ - src/ir/regexp/encoding/utf8/utf8_range.cc \ - src/ir/regexp/encoding/utf8/utf8.cc \ - src/ir/regexp/encoding/utf16/utf16_regexp.cc \ - src/ir/regexp/encoding/utf16/utf16.cc \ - src/ir/regexp/encoding/utf16/utf16_range.cc \ - src/ir/regexp/fixed_length.cc \ - src/ir/regexp/regexp.cc \ - src/ir/compile.cc \ - src/ir/rule_rank.cc \ - src/ir/skeleton/control_flow.cc \ - src/ir/skeleton/generate_code.cc \ - src/ir/skeleton/generate_data.cc \ - src/ir/skeleton/match_empty.cc \ - src/ir/skeleton/maxlen.cc \ - src/ir/skeleton/skeleton.cc \ - src/ir/skeleton/unreachable.cc \ - src/ir/skeleton/way.cc \ + src/nfa/dump.cc \ + src/nfa/estimate_size.cc \ + src/nfa/re_to_nfa.cc \ + src/adfa/adfa.cc \ + src/adfa/dump.cc \ + src/adfa/prepare.cc \ + src/dfa/cfg/cfg.cc \ + src/dfa/cfg/compact.cc \ + src/dfa/cfg/dce.cc \ + src/dfa/cfg/dump.cc \ + src/dfa/cfg/freeze.cc \ + src/dfa/cfg/interfere.cc \ + src/dfa/cfg/liveanal.cc \ + src/dfa/cfg/normalize.cc \ + src/dfa/cfg/optimize.cc \ + src/dfa/cfg/rename.cc \ + src/dfa/cfg/varalloc.cc \ + src/dfa/closure.cc \ + src/dfa/dead_rules.cc \ + src/dfa/determinization.cc \ + src/dfa/dump.cc \ + src/dfa/fallback_tags.cc \ + src/dfa/fillpoints.cc \ + src/dfa/find_state.cc \ + src/dfa/minimization.cc \ + src/dfa/tagpool.cc \ + src/dfa/tagtree.cc \ + src/dfa/tcmd.cc \ + src/re/encoding/enc.cc \ + src/re/encoding/range_suffix.cc \ + src/re/encoding/utf8/utf8_regexp.cc \ + src/re/encoding/utf8/utf8_range.cc \ + src/re/encoding/utf8/utf8.cc \ + src/re/encoding/utf16/utf16_regexp.cc \ + src/re/encoding/utf16/utf16.cc \ + src/re/encoding/utf16/utf16_range.cc \ + src/re/ast_to_re.cc \ + src/re/default_tags.cc \ + src/re/fixed_tags.cc \ + src/re/nullable.cc \ + src/re/rule.cc \ + src/re/split_charset.cc \ + src/re/tag.cc \ + src/compile.cc \ + src/skeleton/control_flow.cc \ + src/skeleton/generate_code.cc \ + src/skeleton/generate_data.cc \ + src/skeleton/maxpath.cc \ + src/skeleton/skeleton.cc \ src/main.cc \ - src/parse/code.cc \ - src/parse/input.cc \ - src/parse/scanner.cc \ - src/parse/unescape.cc \ + src/ast/ast.cc \ + src/ast/input.cc \ + src/ast/normalize.cc \ + src/ast/scanner.cc \ + src/ast/unescape.cc \ + src/ast/validate.cc \ src/util/s_to_n32_unsafe.cc \ src/util/range.cc re2c_SOURCES = \ @@ -126,59 +148,83 @@ re2c_SOURCES = \ $(SRC) # autogenerated sources -AUTOGEN_LEX = src/parse/lex.cc -AUTOGEN_LEX_CONF = src/parse/lex_conf.cc +AUTOGEN_LEX = src/ast/lex.cc +AUTOGEN_LEX_CONF = src/ast/lex_conf.cc AUTOGEN_PARSEOPT = src/conf/parse_opts.cc -AUTOGEN_PARSER = src/parse/parser.cc -AUTOGEN_PARSER_HDR = src/parse/y.tab.h +AUTOGEN_PARSER = src/ast/parser.cc +AUTOGEN_PARSER_HDR = src/ast/y.tab.h +AUTOGEN_HELP = src/conf/help.cc AUTOGEN = \ $(AUTOGEN_LEX) \ $(AUTOGEN_LEX_CONF) \ $(AUTOGEN_PARSER) \ $(AUTOGEN_PARSER_HDR) \ - $(AUTOGEN_PARSEOPT) + $(AUTOGEN_PARSEOPT)\ + $(AUTOGEN_HELP) nodist_re2c_SOURCES = $(AUTOGEN) # bootstrap sources -BOOTSTRAP_LEX = bootstrap/src/parse/lex.cc -BOOTSTRAP_LEX_CONF = bootstrap/src/parse/lex_conf.cc +BOOTSTRAP_LEX = bootstrap/src/ast/lex.cc +BOOTSTRAP_LEX_CONF = bootstrap/src/ast/lex_conf.cc BOOTSTRAP_PARSEOPT = bootstrap/src/conf/parse_opts.cc -BOOTSTRAP_PARSER = bootstrap/src/parse/parser.cc -BOOTSTRAP_PARSER_HDR = bootstrap/src/parse/y.tab.h +BOOTSTRAP_PARSER = bootstrap/src/ast/parser.cc +BOOTSTRAP_PARSER_HDR = bootstrap/src/ast/y.tab.h BOOTSTRAP_DOC = bootstrap/doc/re2c.1 +BOOTSTRAP_HELP = bootstrap/src/conf/help.cc BOOTSTRAP = \ $(BOOTSTRAP_LEX) \ $(BOOTSTRAP_LEX_CONF) \ $(BOOTSTRAP_DOC) \ + $(BOOTSTRAP_HELP) \ $(BOOTSTRAP_PARSER) \ $(BOOTSTRAP_PARSER_HDR) \ $(BOOTSTRAP_PARSEOPT) # custom sources -CUSTOM_LEX = src/parse/lex.re -CUSTOM_LEX_CONF = src/parse/lex_conf.re +CUSTOM_LEX = src/ast/lex.re +CUSTOM_LEX_CONF = src/ast/lex_conf.re CUSTOM_PARSEOPT = src/conf/parse_opts.re -CUSTOM_PARSER = src/parse/parser.ypp +CUSTOM_PARSER = src/ast/parser.ypp +CUSTOM_HELP = doc/help.rst CUSTOM = \ $(CUSTOM_LEX) \ $(CUSTOM_LEX_CONF) \ $(CUSTOM_PARSER) \ - $(CUSTOM_PARSEOPT) + $(CUSTOM_PARSEOPT) \ + $(CUSTOM_HELP) # docs SRC_DOC = doc/manpage.rst +SRC_DOC_EXT = \ + doc/manual/contributors.rst_ \ + doc/manual/syntax/rules.rst_ \ + doc/manual/syntax/interface.rst_ \ + doc/manual/syntax/configurations.rst_ \ + doc/manual/syntax/named_definitions.rst_ \ + doc/manual/syntax/regular_expressions.rst_ \ + doc/manual/warnings/warnings_list.rst \ + doc/manual/warnings/warnings_general.rst \ + doc/manual/features/generic_api/generic_api.rst_ \ + doc/manual/features/conditions/conditions.rst_ \ + doc/manual/features/state/state.rst_ \ + doc/manual/features/submatch/submatch.rst_ \ + doc/manual/features/encodings/encodings.rst_ \ + doc/manual/options/options_list.rst DOC = doc/re2c.1 man_MANS = $(DOC) EXTRA_DIST = \ $(BOOTSTRAP) \ $(CUSTOM) \ + $(SRC_DOC_EXT) \ CHANGELOG \ NO_WARRANTY \ README \ autogen.sh \ + genhelp.sh \ doc/loplas.ps \ doc/sample.bib \ + doc/tdfa/tdfa.pdf \ examples \ test @@ -187,6 +233,7 @@ CLEANFILES = \ $(DOC) $(AUTOGEN_PARSER): $(CUSTOM_PARSER) + $(AM_V_at)$(MKDIR_P) $(@D) $(AM_V_GEN) if test $(BISON) = "no"; \ then \ cp $(top_srcdir)/$(BOOTSTRAP_PARSER) $@ && \ @@ -203,6 +250,7 @@ $(AUTOGEN_PARSER): $(CUSTOM_PARSER) $(AUTOGEN_LEX): $(AUTOGEN_PARSER) $(BOOTSTRAP_PARSER): $(CUSTOM_PARSER) +# target directory exists (as part of source file tree) $(AM_V_GEN) test $(BISON) = "no" || \ $(BISON) \ --output=$(top_srcdir)/$@ \ @@ -211,6 +259,7 @@ $(BOOTSTRAP_PARSER): $(CUSTOM_PARSER) $(top_srcdir)/$(CUSTOM_PARSER); .re.cc: + $(AM_V_at)$(MKDIR_P) $(@D) $(AM_V_GEN) if test -x $(RE2C); \ then \ $(top_builddir)/$(RE2C) $(RE2CFLAGS) -o $@ $< && \ @@ -229,15 +278,25 @@ bootstrap: all .PHONY: docs if REBUILD_DOCS -docs: $(DOC) -$(DOC): $(SRC_DOC) - rst2man.py $(top_builddir)/$(SRC_DOC) > $@ +docs: $(DOC) $(AUTOGEN_HELP) +$(DOC): $(SRC_DOC) $(SRC_DOC_EXT) + $(AM_V_at)$(MKDIR_P) $(@D) + $(RST2MAN) $(top_builddir)/$(SRC_DOC) > $@ cp $@ $(top_srcdir)/$(BOOTSTRAP_DOC) +$(AUTOGEN_HELP): $(CUSTOM_HELP) + $(AM_V_at)$(MKDIR_P) $(@D) + $(RST2MAN) $(top_builddir)/$(CUSTOM_HELP) > $@.1 + $(top_srcdir)/genhelp.sh $@.1 $@ + cp $@ $(top_srcdir)/$(BOOTSTRAP_HELP) else -docs: $(DOC) +docs: $(DOC) $(AUTOGEN_HELP) @echo "Reconfigure to rebuild docs: ./configure --enable-docs" $(DOC): $(BOOTSTRAP_DOC) + $(AM_V_at)$(MKDIR_P) $(@D) cp $(top_srcdir)/$(BOOTSTRAP_DOC) $@ +$(AUTOGEN_HELP): $(BOOTSTRAP_HELP) + $(AM_V_at)$(MKDIR_P) $(@D) + cp $(top_srcdir)/$(BOOTSTRAP_HELP) $@ endif all-local: docs $(BOOTSTRAP_PARSER) diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..dba1407 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,2008 @@ +# Makefile.in generated by automake 1.15.1 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994-2017 Free Software Foundation, Inc. + +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +VPATH = @srcdir@ +am__is_gnu_make = { \ + if test -z '$(MAKELEVEL)'; then \ + false; \ + elif test -n '$(MAKE_HOST)'; then \ + true; \ + elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ + true; \ + else \ + false; \ + fi; \ +} +am__make_running_with_option = \ + case $${target_option-} in \ + ?) ;; \ + *) echo "am__make_running_with_option: internal error: invalid" \ + "target option '$${target_option-}' specified" >&2; \ + exit 1;; \ + esac; \ + has_opt=no; \ + sane_makeflags=$$MAKEFLAGS; \ + if $(am__is_gnu_make); then \ + sane_makeflags=$$MFLAGS; \ + else \ + case $$MAKEFLAGS in \ + *\\[\ \ ]*) \ + bs=\\; \ + sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ + | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ + esac; \ + fi; \ + skip_next=no; \ + strip_trailopt () \ + { \ + flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ + }; \ + for flg in $$sane_makeflags; do \ + test $$skip_next = yes && { skip_next=no; continue; }; \ + case $$flg in \ + *=*|--*) continue;; \ + -*I) strip_trailopt 'I'; skip_next=yes;; \ + -*I?*) strip_trailopt 'I';; \ + -*O) strip_trailopt 'O'; skip_next=yes;; \ + -*O?*) strip_trailopt 'O';; \ + -*l) strip_trailopt 'l'; skip_next=yes;; \ + -*l?*) strip_trailopt 'l';; \ + -[dEDm]) skip_next=yes;; \ + -[JT]) skip_next=yes;; \ + esac; \ + case $$flg in \ + *$$target_option*) has_opt=yes; break;; \ + esac; \ + done; \ + test $$has_opt = yes +am__make_dryrun = (target_option=n; $(am__make_running_with_option)) +am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) +pkgdatadir = $(datadir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkglibexecdir = $(libexecdir)/@PACKAGE@ +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +bin_PROGRAMS = re2c$(EXEEXT) +check_PROGRAMS = $(am__EXEEXT_1) $(am__EXEEXT_2) +subdir = . +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ + $(am__configure_deps) $(am__DIST_COMMON) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno config.status.lineno +mkinstalldirs = $(install_sh) -d +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = doc/manpage.rst doc/help.rst run_tests.sh +CONFIG_CLEAN_VPATH_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)" +am__EXEEXT_1 = testrange$(EXEEXT) +am__EXEEXT_2 = testston32unsafe$(EXEEXT) +PROGRAMS = $(bin_PROGRAMS) +am__objects_1 = +am__dirstamp = $(am__leading_dot)dirstamp +am__objects_2 = src/code/bitmap.$(OBJEXT) \ + src/code/emit_action.$(OBJEXT) src/code/emit_dfa.$(OBJEXT) \ + src/code/label.$(OBJEXT) src/code/go_construct.$(OBJEXT) \ + src/code/go_destruct.$(OBJEXT) src/code/go_emit.$(OBJEXT) \ + src/code/go_used_labels.$(OBJEXT) src/code/input_api.$(OBJEXT) \ + src/code/output.$(OBJEXT) src/code/print.$(OBJEXT) \ + src/conf/msg.$(OBJEXT) src/conf/opt.$(OBJEXT) \ + src/conf/warn.$(OBJEXT) src/nfa/dump.$(OBJEXT) \ + src/nfa/estimate_size.$(OBJEXT) src/nfa/re_to_nfa.$(OBJEXT) \ + src/adfa/adfa.$(OBJEXT) src/adfa/dump.$(OBJEXT) \ + src/adfa/prepare.$(OBJEXT) src/dfa/cfg/cfg.$(OBJEXT) \ + src/dfa/cfg/compact.$(OBJEXT) src/dfa/cfg/dce.$(OBJEXT) \ + src/dfa/cfg/dump.$(OBJEXT) src/dfa/cfg/freeze.$(OBJEXT) \ + src/dfa/cfg/interfere.$(OBJEXT) src/dfa/cfg/liveanal.$(OBJEXT) \ + src/dfa/cfg/normalize.$(OBJEXT) src/dfa/cfg/optimize.$(OBJEXT) \ + src/dfa/cfg/rename.$(OBJEXT) src/dfa/cfg/varalloc.$(OBJEXT) \ + src/dfa/closure.$(OBJEXT) src/dfa/dead_rules.$(OBJEXT) \ + src/dfa/determinization.$(OBJEXT) src/dfa/dump.$(OBJEXT) \ + src/dfa/fallback_tags.$(OBJEXT) src/dfa/fillpoints.$(OBJEXT) \ + src/dfa/find_state.$(OBJEXT) src/dfa/minimization.$(OBJEXT) \ + src/dfa/tagpool.$(OBJEXT) src/dfa/tagtree.$(OBJEXT) \ + src/dfa/tcmd.$(OBJEXT) src/re/encoding/enc.$(OBJEXT) \ + src/re/encoding/range_suffix.$(OBJEXT) \ + src/re/encoding/utf8/utf8_regexp.$(OBJEXT) \ + src/re/encoding/utf8/utf8_range.$(OBJEXT) \ + src/re/encoding/utf8/utf8.$(OBJEXT) \ + src/re/encoding/utf16/utf16_regexp.$(OBJEXT) \ + src/re/encoding/utf16/utf16.$(OBJEXT) \ + src/re/encoding/utf16/utf16_range.$(OBJEXT) \ + src/re/ast_to_re.$(OBJEXT) src/re/default_tags.$(OBJEXT) \ + src/re/fixed_tags.$(OBJEXT) src/re/nullable.$(OBJEXT) \ + src/re/rule.$(OBJEXT) src/re/split_charset.$(OBJEXT) \ + src/re/tag.$(OBJEXT) src/compile.$(OBJEXT) \ + src/skeleton/control_flow.$(OBJEXT) \ + src/skeleton/generate_code.$(OBJEXT) \ + src/skeleton/generate_data.$(OBJEXT) \ + src/skeleton/maxpath.$(OBJEXT) src/skeleton/skeleton.$(OBJEXT) \ + src/main.$(OBJEXT) src/ast/ast.$(OBJEXT) \ + src/ast/input.$(OBJEXT) src/ast/normalize.$(OBJEXT) \ + src/ast/scanner.$(OBJEXT) src/ast/unescape.$(OBJEXT) \ + src/ast/validate.$(OBJEXT) src/util/s_to_n32_unsafe.$(OBJEXT) \ + src/util/range.$(OBJEXT) +am_re2c_OBJECTS = $(am__objects_1) $(am__objects_2) +am__objects_3 = src/ast/lex.$(OBJEXT) +am__objects_4 = src/ast/lex_conf.$(OBJEXT) +am__objects_5 = src/ast/parser.$(OBJEXT) +am__objects_6 = src/conf/parse_opts.$(OBJEXT) +am__objects_7 = src/conf/help.$(OBJEXT) +am__objects_8 = $(am__objects_3) $(am__objects_4) $(am__objects_5) \ + $(am__objects_1) $(am__objects_6) $(am__objects_7) +nodist_re2c_OBJECTS = $(am__objects_8) +re2c_OBJECTS = $(am_re2c_OBJECTS) $(nodist_re2c_OBJECTS) +re2c_LDADD = $(LDADD) +am_testrange_OBJECTS = src/test/range/test.$(OBJEXT) \ + src/util/range.$(OBJEXT) +testrange_OBJECTS = $(am_testrange_OBJECTS) +testrange_LDADD = $(LDADD) +am_testston32unsafe_OBJECTS = src/test/s_to_n32_unsafe/test.$(OBJEXT) \ + src/util/s_to_n32_unsafe.$(OBJEXT) +testston32unsafe_OBJECTS = $(am_testston32unsafe_OBJECTS) +testston32unsafe_LDADD = $(LDADD) +AM_V_P = $(am__v_P_@AM_V@) +am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) +am__v_P_0 = false +am__v_P_1 = : +AM_V_GEN = $(am__v_GEN_@AM_V@) +am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) +am__v_GEN_0 = @echo " GEN " $@; +am__v_GEN_1 = +AM_V_at = $(am__v_at_@AM_V@) +am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) +am__v_at_0 = @ +am__v_at_1 = +DEFAULT_INCLUDES = -I.@am__isrc@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +am__mv = mv -f +CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \ + $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS) +AM_V_CXX = $(am__v_CXX_@AM_V@) +am__v_CXX_ = $(am__v_CXX_@AM_DEFAULT_V@) +am__v_CXX_0 = @echo " CXX " $@; +am__v_CXX_1 = +CXXLD = $(CXX) +CXXLINK = $(CXXLD) $(AM_CXXFLAGS) $(CXXFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \ + -o $@ +AM_V_CXXLD = $(am__v_CXXLD_@AM_V@) +am__v_CXXLD_ = $(am__v_CXXLD_@AM_DEFAULT_V@) +am__v_CXXLD_0 = @echo " CXXLD " $@; +am__v_CXXLD_1 = +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +AM_V_CC = $(am__v_CC_@AM_V@) +am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) +am__v_CC_0 = @echo " CC " $@; +am__v_CC_1 = +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +AM_V_CCLD = $(am__v_CCLD_@AM_V@) +am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) +am__v_CCLD_0 = @echo " CCLD " $@; +am__v_CCLD_1 = +SOURCES = $(re2c_SOURCES) $(nodist_re2c_SOURCES) $(testrange_SOURCES) \ + $(testston32unsafe_SOURCES) +DIST_SOURCES = $(re2c_SOURCES) $(testrange_SOURCES) \ + $(testston32unsafe_SOURCES) +am__can_run_installinfo = \ + case $$AM_UPDATE_INFO_DIR in \ + n|no|NO) false;; \ + *) (install-info --version) >/dev/null 2>&1;; \ + esac +am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; +am__vpath_adj = case $$p in \ + $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ + *) f=$$p;; \ + esac; +am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; +am__install_max = 40 +am__nobase_strip_setup = \ + srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` +am__nobase_strip = \ + for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" +am__nobase_list = $(am__nobase_strip_setup); \ + for p in $$list; do echo "$$p $$p"; done | \ + sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ + $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ + if (++n[$$2] == $(am__install_max)) \ + { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ + END { for (dir in files) print dir, files[dir] }' +am__base_list = \ + sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ + sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' +am__uninstall_files_from_dir = { \ + test -z "$$files" \ + || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ + || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ + $(am__cd) "$$dir" && rm -f $$files; }; \ + } +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ + $(LISP)config.h.in +# Read a list of newline-separated strings from the standard input, +# and print each of them once, without duplicates. Input order is +# *not* preserved. +am__uniquify_input = $(AWK) '\ + BEGIN { nonempty = 0; } \ + { items[$$0] = 1; nonempty = 1; } \ + END { if (nonempty) { for (i in items) print i; }; } \ +' +# Make sure the list of sources is unique. This is necessary because, +# e.g., the same source file might be shared among _SOURCES variables +# for different programs/libraries. +am__define_uniq_tagged_files = \ + list='$(am__tagged_files)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | $(am__uniquify_input)` +ETAGS = etags +CTAGS = ctags +CSCOPE = cscope +AM_RECURSIVE_TARGETS = cscope check recheck +am__tty_colors_dummy = \ + mgn= red= grn= lgn= blu= brg= std=; \ + am__color_tests=no +am__tty_colors = { \ + $(am__tty_colors_dummy); \ + if test "X$(AM_COLOR_TESTS)" = Xno; then \ + am__color_tests=no; \ + elif test "X$(AM_COLOR_TESTS)" = Xalways; then \ + am__color_tests=yes; \ + elif test "X$$TERM" != Xdumb && { test -t 1; } 2>/dev/null; then \ + am__color_tests=yes; \ + fi; \ + if test $$am__color_tests = yes; then \ + red=''; \ + grn=''; \ + lgn=''; \ + blu=''; \ + mgn=''; \ + brg=''; \ + std=''; \ + fi; \ +} +am__recheck_rx = ^[ ]*:recheck:[ ]* +am__global_test_result_rx = ^[ ]*:global-test-result:[ ]* +am__copy_in_global_log_rx = ^[ ]*:copy-in-global-log:[ ]* +# A command that, given a newline-separated list of test names on the +# standard input, print the name of the tests that are to be re-run +# upon "make recheck". +am__list_recheck_tests = $(AWK) '{ \ + recheck = 1; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + { \ + if ((getline line2 < ($$0 ".log")) < 0) \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[nN][Oo]/) \ + { \ + recheck = 0; \ + break; \ + } \ + else if (line ~ /$(am__recheck_rx)[yY][eE][sS]/) \ + { \ + break; \ + } \ + }; \ + if (recheck) \ + print $$0; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# A command that, given a newline-separated list of test names on the +# standard input, create the global log from their .trs and .log files. +am__create_global_log = $(AWK) ' \ +function fatal(msg) \ +{ \ + print "fatal: making $@: " msg | "cat >&2"; \ + exit 1; \ +} \ +function rst_section(header) \ +{ \ + print header; \ + len = length(header); \ + for (i = 1; i <= len; i = i + 1) \ + printf "="; \ + printf "\n\n"; \ +} \ +{ \ + copy_in_global_log = 1; \ + global_test_result = "RUN"; \ + while ((rc = (getline line < ($$0 ".trs"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".trs"); \ + if (line ~ /$(am__global_test_result_rx)/) \ + { \ + sub("$(am__global_test_result_rx)", "", line); \ + sub("[ ]*$$", "", line); \ + global_test_result = line; \ + } \ + else if (line ~ /$(am__copy_in_global_log_rx)[nN][oO]/) \ + copy_in_global_log = 0; \ + }; \ + if (copy_in_global_log) \ + { \ + rst_section(global_test_result ": " $$0); \ + while ((rc = (getline line < ($$0 ".log"))) != 0) \ + { \ + if (rc < 0) \ + fatal("failed to read from " $$0 ".log"); \ + print line; \ + }; \ + printf "\n"; \ + }; \ + close ($$0 ".trs"); \ + close ($$0 ".log"); \ +}' +# Restructured Text title. +am__rst_title = { sed 's/.*/ & /;h;s/./=/g;p;x;s/ *$$//;p;g' && echo; } +# Solaris 10 'make', and several other traditional 'make' implementations, +# pass "-e" to $(SHELL), and POSIX 2008 even requires this. Work around it +# by disabling -e (using the XSI extension "set +e") if it's set. +am__sh_e_setup = case $$- in *e*) set +e;; esac +# Default flags passed to test drivers. +am__common_driver_flags = \ + --color-tests "$$am__color_tests" \ + --enable-hard-errors "$$am__enable_hard_errors" \ + --expect-failure "$$am__expect_failure" +# To be inserted before the command running the test. Creates the +# directory for the log if needed. Stores in $dir the directory +# containing $f, in $tst the test, in $log the log. Executes the +# developer- defined test setup AM_TESTS_ENVIRONMENT (if any), and +# passes TESTS_ENVIRONMENT. Set up options for the wrapper that +# will run the test scripts (or their associated LOG_COMPILER, if +# thy have one). +am__check_pre = \ +$(am__sh_e_setup); \ +$(am__vpath_adj_setup) $(am__vpath_adj) \ +$(am__tty_colors); \ +srcdir=$(srcdir); export srcdir; \ +case "$@" in \ + */*) am__odir=`echo "./$@" | sed 's|/[^/]*$$||'`;; \ + *) am__odir=.;; \ +esac; \ +test "x$$am__odir" = x"." || test -d "$$am__odir" \ + || $(MKDIR_P) "$$am__odir" || exit $$?; \ +if test -f "./$$f"; then dir=./; \ +elif test -f "$$f"; then dir=; \ +else dir="$(srcdir)/"; fi; \ +tst=$$dir$$f; log='$@'; \ +if test -n '$(DISABLE_HARD_ERRORS)'; then \ + am__enable_hard_errors=no; \ +else \ + am__enable_hard_errors=yes; \ +fi; \ +case " $(XFAIL_TESTS) " in \ + *[\ \ ]$$f[\ \ ]* | *[\ \ ]$$dir$$f[\ \ ]*) \ + am__expect_failure=yes;; \ + *) \ + am__expect_failure=no;; \ +esac; \ +$(AM_TESTS_ENVIRONMENT) $(TESTS_ENVIRONMENT) +# A shell command to get the names of the tests scripts with any registered +# extension removed (i.e., equivalently, the names of the test logs, with +# the '.log' extension removed). The result is saved in the shell variable +# '$bases'. This honors runtime overriding of TESTS and TEST_LOGS. Sadly, +# we cannot use something simpler, involving e.g., "$(TEST_LOGS:.log=)", +# since that might cause problem with VPATH rewrites for suffix-less tests. +# See also 'test-harness-vpath-rewrite.sh' and 'test-trs-basic.sh'. +am__set_TESTS_bases = \ + bases='$(TEST_LOGS)'; \ + bases=`for i in $$bases; do echo $$i; done | sed 's/\.log$$//'`; \ + bases=`echo $$bases` +RECHECK_LOGS = $(TEST_LOGS) +TEST_SUITE_LOG = test-suite.log +TEST_EXTENSIONS = @EXEEXT@ .test +LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +LOG_COMPILE = $(LOG_COMPILER) $(AM_LOG_FLAGS) $(LOG_FLAGS) +am__set_b = \ + case '$@' in \ + */*) \ + case '$*' in \ + */*) b='$*';; \ + *) b=`echo '$@' | sed 's/\.log$$//'`; \ + esac;; \ + *) \ + b='$*';; \ + esac +am__test_logs1 = $(TESTS:=.log) +am__test_logs2 = $(am__test_logs1:@EXEEXT@.log=.log) +TEST_LOGS = $(am__test_logs2:.test.log=.log) +TEST_LOG_DRIVER = $(SHELL) $(top_srcdir)/test-driver +TEST_LOG_COMPILE = $(TEST_LOG_COMPILER) $(AM_TEST_LOG_FLAGS) \ + $(TEST_LOG_FLAGS) +am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \ + $(srcdir)/run_tests.sh.in $(top_srcdir)/doc/help.rst.in \ + $(top_srcdir)/doc/manpage.rst.in README compile depcomp \ + install-sh missing test-driver +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + if test -d "$(distdir)"; then \ + find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -rf "$(distdir)" \ + || { sleep 5 && rm -rf "$(distdir)"; }; \ + else :; fi +am__post_remove_distdir = $(am__remove_distdir) +DIST_ARCHIVES = $(distdir).tar.gz +GZIP_ENV = --best +DIST_TARGETS = dist-gzip +distuninstallcheck_listfiles = find . -type f -print +am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ + | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +AMTAR = @AMTAR@ +AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +BISON = @BISON@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CXXFLAGSDEFAULT = @CXXFLAGSDEFAULT@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EXEEXT = @EXEEXT@ +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LDFLAGS = @LDFLAGS@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBOBJS = @LTLIBOBJS@ +MAKEINFO = @MAKEINFO@ +MKDIR_P = @MKDIR_P@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_DATE = @PACKAGE_DATE@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_RELEASE = @PACKAGE_RELEASE@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_URL = @PACKAGE_URL@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +RST2MAN = @RST2MAN@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STRIP = @STRIP@ +VERSION = @VERSION@ +abs_builddir = @abs_builddir@ +abs_srcdir = @abs_srcdir@ +abs_top_builddir = @abs_top_builddir@ +abs_top_srcdir = @abs_top_srcdir@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +am__tar = @am__tar@ +am__untar = @am__untar@ +bindir = @bindir@ +build_alias = @build_alias@ +builddir = @builddir@ +datadir = @datadir@ +datarootdir = @datarootdir@ +docdir = @docdir@ +dvidir = @dvidir@ +exec_prefix = @exec_prefix@ +host_alias = @host_alias@ +htmldir = @htmldir@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localedir = @localedir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +pdfdir = @pdfdir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +psdir = @psdir@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +srcdir = @srcdir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +top_build_prefix = @top_build_prefix@ +top_builddir = @top_builddir@ +top_srcdir = @top_srcdir@ + +# flags +# do *not* add CXXFLAGS here, add them in configure.ac +AM_CXXFLAGS = $(CXXFLAGSDEFAULT) +RE2CFLAGS = -b +RE2C = re2c$(EXEEXT) + +# sources +SRC_HDR = \ + src/code/bitmap.h \ + src/code/emit.h \ + src/code/go.h \ + src/code/input_api.h \ + src/code/label.h \ + src/code/output.h \ + src/code/print.h \ + src/conf/msg.h \ + src/conf/opt.h \ + src/conf/warn.h \ + src/adfa/action.h \ + src/adfa/adfa.h \ + src/adfa/dump.h \ + src/dfa/cfg/cfg.h \ + src/dfa/closure.h \ + src/dfa/dfa.h \ + src/dfa/dump.h \ + src/dfa/find_state.h \ + src/dfa/tagpool.h \ + src/dfa/tagtree.h \ + src/dfa/tcmd.h \ + src/nfa/nfa.h \ + src/re/encoding/case.h \ + src/re/encoding/enc.h \ + src/re/encoding/range_suffix.h \ + src/re/encoding/utf8/utf8.h \ + src/re/encoding/utf8/utf8_regexp.h \ + src/re/encoding/utf8/utf8_range.h \ + src/re/encoding/utf16/utf16_range.h \ + src/re/encoding/utf16/utf16_regexp.h \ + src/re/encoding/utf16/utf16.h \ + src/re/empty_class_policy.h \ + src/re/re.h \ + src/re/rule.h \ + src/re/tag.h \ + src/compile.h \ + src/skeleton/path.h \ + src/skeleton/skeleton.h \ + src/ast/ast.h \ + src/ast/input.h \ + src/ast/parser.h \ + src/ast/scanner.h \ + src/ast/unescape.h \ + src/util/allocate.h \ + src/util/attribute.h \ + src/util/c99_stdint.h \ + src/util/counter.h \ + src/util/forbid_copy.h \ + src/util/free_list.h \ + src/util/hash32.h \ + src/util/local_increment.h \ + src/util/lookup.h \ + src/util/range.h \ + src/util/s_to_n32_unsafe.h \ + src/util/slab_allocator.h \ + src/util/smart_ptr.h \ + src/util/static_assert.h \ + src/util/string_utils.h \ + src/util/u32lim.h \ + src/util/uniq_vector.h \ + src/util/wrap_iter.h + +SRC = \ + src/code/bitmap.cc \ + src/code/emit_action.cc \ + src/code/emit_dfa.cc \ + src/code/label.cc \ + src/code/go_construct.cc \ + src/code/go_destruct.cc \ + src/code/go_emit.cc \ + src/code/go_used_labels.cc \ + src/code/input_api.cc \ + src/code/output.cc \ + src/code/print.cc \ + src/conf/msg.cc \ + src/conf/opt.cc \ + src/conf/warn.cc \ + src/nfa/dump.cc \ + src/nfa/estimate_size.cc \ + src/nfa/re_to_nfa.cc \ + src/adfa/adfa.cc \ + src/adfa/dump.cc \ + src/adfa/prepare.cc \ + src/dfa/cfg/cfg.cc \ + src/dfa/cfg/compact.cc \ + src/dfa/cfg/dce.cc \ + src/dfa/cfg/dump.cc \ + src/dfa/cfg/freeze.cc \ + src/dfa/cfg/interfere.cc \ + src/dfa/cfg/liveanal.cc \ + src/dfa/cfg/normalize.cc \ + src/dfa/cfg/optimize.cc \ + src/dfa/cfg/rename.cc \ + src/dfa/cfg/varalloc.cc \ + src/dfa/closure.cc \ + src/dfa/dead_rules.cc \ + src/dfa/determinization.cc \ + src/dfa/dump.cc \ + src/dfa/fallback_tags.cc \ + src/dfa/fillpoints.cc \ + src/dfa/find_state.cc \ + src/dfa/minimization.cc \ + src/dfa/tagpool.cc \ + src/dfa/tagtree.cc \ + src/dfa/tcmd.cc \ + src/re/encoding/enc.cc \ + src/re/encoding/range_suffix.cc \ + src/re/encoding/utf8/utf8_regexp.cc \ + src/re/encoding/utf8/utf8_range.cc \ + src/re/encoding/utf8/utf8.cc \ + src/re/encoding/utf16/utf16_regexp.cc \ + src/re/encoding/utf16/utf16.cc \ + src/re/encoding/utf16/utf16_range.cc \ + src/re/ast_to_re.cc \ + src/re/default_tags.cc \ + src/re/fixed_tags.cc \ + src/re/nullable.cc \ + src/re/rule.cc \ + src/re/split_charset.cc \ + src/re/tag.cc \ + src/compile.cc \ + src/skeleton/control_flow.cc \ + src/skeleton/generate_code.cc \ + src/skeleton/generate_data.cc \ + src/skeleton/maxpath.cc \ + src/skeleton/skeleton.cc \ + src/main.cc \ + src/ast/ast.cc \ + src/ast/input.cc \ + src/ast/normalize.cc \ + src/ast/scanner.cc \ + src/ast/unescape.cc \ + src/ast/validate.cc \ + src/util/s_to_n32_unsafe.cc \ + src/util/range.cc + +re2c_SOURCES = \ + $(SRC_HDR) \ + $(SRC) + + +# autogenerated sources +AUTOGEN_LEX = src/ast/lex.cc +AUTOGEN_LEX_CONF = src/ast/lex_conf.cc +AUTOGEN_PARSEOPT = src/conf/parse_opts.cc +AUTOGEN_PARSER = src/ast/parser.cc +AUTOGEN_PARSER_HDR = src/ast/y.tab.h +AUTOGEN_HELP = src/conf/help.cc +AUTOGEN = \ + $(AUTOGEN_LEX) \ + $(AUTOGEN_LEX_CONF) \ + $(AUTOGEN_PARSER) \ + $(AUTOGEN_PARSER_HDR) \ + $(AUTOGEN_PARSEOPT)\ + $(AUTOGEN_HELP) + +nodist_re2c_SOURCES = $(AUTOGEN) + +# bootstrap sources +BOOTSTRAP_LEX = bootstrap/src/ast/lex.cc +BOOTSTRAP_LEX_CONF = bootstrap/src/ast/lex_conf.cc +BOOTSTRAP_PARSEOPT = bootstrap/src/conf/parse_opts.cc +BOOTSTRAP_PARSER = bootstrap/src/ast/parser.cc +BOOTSTRAP_PARSER_HDR = bootstrap/src/ast/y.tab.h +BOOTSTRAP_DOC = bootstrap/doc/re2c.1 +BOOTSTRAP_HELP = bootstrap/src/conf/help.cc +BOOTSTRAP = \ + $(BOOTSTRAP_LEX) \ + $(BOOTSTRAP_LEX_CONF) \ + $(BOOTSTRAP_DOC) \ + $(BOOTSTRAP_HELP) \ + $(BOOTSTRAP_PARSER) \ + $(BOOTSTRAP_PARSER_HDR) \ + $(BOOTSTRAP_PARSEOPT) + + +# custom sources +CUSTOM_LEX = src/ast/lex.re +CUSTOM_LEX_CONF = src/ast/lex_conf.re +CUSTOM_PARSEOPT = src/conf/parse_opts.re +CUSTOM_PARSER = src/ast/parser.ypp +CUSTOM_HELP = doc/help.rst +CUSTOM = \ + $(CUSTOM_LEX) \ + $(CUSTOM_LEX_CONF) \ + $(CUSTOM_PARSER) \ + $(CUSTOM_PARSEOPT) \ + $(CUSTOM_HELP) + + +# docs +SRC_DOC = doc/manpage.rst +SRC_DOC_EXT = \ + doc/manual/contributors.rst_ \ + doc/manual/syntax/rules.rst_ \ + doc/manual/syntax/interface.rst_ \ + doc/manual/syntax/configurations.rst_ \ + doc/manual/syntax/named_definitions.rst_ \ + doc/manual/syntax/regular_expressions.rst_ \ + doc/manual/warnings/warnings_list.rst \ + doc/manual/warnings/warnings_general.rst \ + doc/manual/features/generic_api/generic_api.rst_ \ + doc/manual/features/conditions/conditions.rst_ \ + doc/manual/features/state/state.rst_ \ + doc/manual/features/submatch/submatch.rst_ \ + doc/manual/features/encodings/encodings.rst_ \ + doc/manual/options/options_list.rst + +DOC = doc/re2c.1 +man_MANS = $(DOC) +EXTRA_DIST = \ + $(BOOTSTRAP) \ + $(CUSTOM) \ + $(SRC_DOC_EXT) \ + CHANGELOG \ + NO_WARRANTY \ + README \ + autogen.sh \ + genhelp.sh \ + doc/loplas.ps \ + doc/sample.bib \ + doc/tdfa/tdfa.pdf \ + examples \ + test + +CLEANFILES = \ + $(AUTOGEN) \ + $(DOC) + + +# tests +TST_SUITE = run_tests.sh +TST_RANGE = testrange +testrange_SOURCES = \ + src/test/range/test-impl.h \ + src/test/range/test.cc \ + src/test/range/test.h \ + src/util/range.cc\ + src/util/range.h \ + src/util/static_assert.h + +TST_S_TO_N32_UNSAFE = testston32unsafe +testston32unsafe_SOURCES = \ + src/test/s_to_n32_unsafe/test.cc \ + src/util/s_to_n32_unsafe.cc + +TESTS = $(TST_SUITE) $(check_PROGRAMS) +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .cc .log .o .obj .re .test .test$(EXEEXT) .trs +am--refresh: Makefile + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \ + $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \ + $(am__cd) $(top_srcdir) && \ + $(AUTOMAKE) --foreign Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + $(am__cd) $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + $(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) +$(am__aclocal_m4_deps): + +config.h: stamp-h1 + @test -f $@ || rm -f stamp-h1 + @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 + +stamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.h.in: $(am__configure_deps) + ($(am__cd) $(top_srcdir) && $(AUTOHEADER)) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +doc/manpage.rst: $(top_builddir)/config.status $(top_srcdir)/doc/manpage.rst.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +doc/help.rst: $(top_builddir)/config.status $(top_srcdir)/doc/help.rst.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +run_tests.sh: $(top_builddir)/config.status $(srcdir)/run_tests.sh.in + cd $(top_builddir) && $(SHELL) ./config.status $@ +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + if test -n "$$list"; then \ + echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ + fi; \ + for p in $$list; do echo "$$p $$p"; done | \ + sed 's/$(EXEEXT)$$//' | \ + while read p p1; do if test -f $$p \ + ; then echo "$$p"; echo "$$p"; else :; fi; \ + done | \ + sed -e 'p;s,.*/,,;n;h' \ + -e 's|.*|.|' \ + -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ + sed 'N;N;N;s,\n, ,g' | \ + $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ + { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ + if ($$2 == $$4) files[d] = files[d] " " $$1; \ + else { print "f", $$3 "/" $$4, $$1; } } \ + END { for (d in files) print "f", d, files[d] }' | \ + while read type dir files; do \ + if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ + test -z "$$files" || { \ + echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ + $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ + } \ + ; done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ + files=`for p in $$list; do echo "$$p"; done | \ + sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ + -e 's/$$/$(EXEEXT)/' \ + `; \ + test -n "$$list" || exit 0; \ + echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ + cd "$(DESTDIR)$(bindir)" && rm -f $$files + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) + +clean-checkPROGRAMS: + -test -z "$(check_PROGRAMS)" || rm -f $(check_PROGRAMS) +src/code/$(am__dirstamp): + @$(MKDIR_P) src/code + @: > src/code/$(am__dirstamp) +src/code/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/code/$(DEPDIR) + @: > src/code/$(DEPDIR)/$(am__dirstamp) +src/code/bitmap.$(OBJEXT): src/code/$(am__dirstamp) \ + src/code/$(DEPDIR)/$(am__dirstamp) +src/code/emit_action.$(OBJEXT): src/code/$(am__dirstamp) \ + src/code/$(DEPDIR)/$(am__dirstamp) +src/code/emit_dfa.$(OBJEXT): src/code/$(am__dirstamp) \ + src/code/$(DEPDIR)/$(am__dirstamp) +src/code/label.$(OBJEXT): src/code/$(am__dirstamp) \ + src/code/$(DEPDIR)/$(am__dirstamp) +src/code/go_construct.$(OBJEXT): src/code/$(am__dirstamp) \ + src/code/$(DEPDIR)/$(am__dirstamp) +src/code/go_destruct.$(OBJEXT): src/code/$(am__dirstamp) \ + src/code/$(DEPDIR)/$(am__dirstamp) +src/code/go_emit.$(OBJEXT): src/code/$(am__dirstamp) \ + src/code/$(DEPDIR)/$(am__dirstamp) +src/code/go_used_labels.$(OBJEXT): src/code/$(am__dirstamp) \ + src/code/$(DEPDIR)/$(am__dirstamp) +src/code/input_api.$(OBJEXT): src/code/$(am__dirstamp) \ + src/code/$(DEPDIR)/$(am__dirstamp) +src/code/output.$(OBJEXT): src/code/$(am__dirstamp) \ + src/code/$(DEPDIR)/$(am__dirstamp) +src/code/print.$(OBJEXT): src/code/$(am__dirstamp) \ + src/code/$(DEPDIR)/$(am__dirstamp) +src/conf/$(am__dirstamp): + @$(MKDIR_P) src/conf + @: > src/conf/$(am__dirstamp) +src/conf/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/conf/$(DEPDIR) + @: > src/conf/$(DEPDIR)/$(am__dirstamp) +src/conf/msg.$(OBJEXT): src/conf/$(am__dirstamp) \ + src/conf/$(DEPDIR)/$(am__dirstamp) +src/conf/opt.$(OBJEXT): src/conf/$(am__dirstamp) \ + src/conf/$(DEPDIR)/$(am__dirstamp) +src/conf/warn.$(OBJEXT): src/conf/$(am__dirstamp) \ + src/conf/$(DEPDIR)/$(am__dirstamp) +src/nfa/$(am__dirstamp): + @$(MKDIR_P) src/nfa + @: > src/nfa/$(am__dirstamp) +src/nfa/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/nfa/$(DEPDIR) + @: > src/nfa/$(DEPDIR)/$(am__dirstamp) +src/nfa/dump.$(OBJEXT): src/nfa/$(am__dirstamp) \ + src/nfa/$(DEPDIR)/$(am__dirstamp) +src/nfa/estimate_size.$(OBJEXT): src/nfa/$(am__dirstamp) \ + src/nfa/$(DEPDIR)/$(am__dirstamp) +src/nfa/re_to_nfa.$(OBJEXT): src/nfa/$(am__dirstamp) \ + src/nfa/$(DEPDIR)/$(am__dirstamp) +src/adfa/$(am__dirstamp): + @$(MKDIR_P) src/adfa + @: > src/adfa/$(am__dirstamp) +src/adfa/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/adfa/$(DEPDIR) + @: > src/adfa/$(DEPDIR)/$(am__dirstamp) +src/adfa/adfa.$(OBJEXT): src/adfa/$(am__dirstamp) \ + src/adfa/$(DEPDIR)/$(am__dirstamp) +src/adfa/dump.$(OBJEXT): src/adfa/$(am__dirstamp) \ + src/adfa/$(DEPDIR)/$(am__dirstamp) +src/adfa/prepare.$(OBJEXT): src/adfa/$(am__dirstamp) \ + src/adfa/$(DEPDIR)/$(am__dirstamp) +src/dfa/cfg/$(am__dirstamp): + @$(MKDIR_P) src/dfa/cfg + @: > src/dfa/cfg/$(am__dirstamp) +src/dfa/cfg/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/dfa/cfg/$(DEPDIR) + @: > src/dfa/cfg/$(DEPDIR)/$(am__dirstamp) +src/dfa/cfg/cfg.$(OBJEXT): src/dfa/cfg/$(am__dirstamp) \ + src/dfa/cfg/$(DEPDIR)/$(am__dirstamp) +src/dfa/cfg/compact.$(OBJEXT): src/dfa/cfg/$(am__dirstamp) \ + src/dfa/cfg/$(DEPDIR)/$(am__dirstamp) +src/dfa/cfg/dce.$(OBJEXT): src/dfa/cfg/$(am__dirstamp) \ + src/dfa/cfg/$(DEPDIR)/$(am__dirstamp) +src/dfa/cfg/dump.$(OBJEXT): src/dfa/cfg/$(am__dirstamp) \ + src/dfa/cfg/$(DEPDIR)/$(am__dirstamp) +src/dfa/cfg/freeze.$(OBJEXT): src/dfa/cfg/$(am__dirstamp) \ + src/dfa/cfg/$(DEPDIR)/$(am__dirstamp) +src/dfa/cfg/interfere.$(OBJEXT): src/dfa/cfg/$(am__dirstamp) \ + src/dfa/cfg/$(DEPDIR)/$(am__dirstamp) +src/dfa/cfg/liveanal.$(OBJEXT): src/dfa/cfg/$(am__dirstamp) \ + src/dfa/cfg/$(DEPDIR)/$(am__dirstamp) +src/dfa/cfg/normalize.$(OBJEXT): src/dfa/cfg/$(am__dirstamp) \ + src/dfa/cfg/$(DEPDIR)/$(am__dirstamp) +src/dfa/cfg/optimize.$(OBJEXT): src/dfa/cfg/$(am__dirstamp) \ + src/dfa/cfg/$(DEPDIR)/$(am__dirstamp) +src/dfa/cfg/rename.$(OBJEXT): src/dfa/cfg/$(am__dirstamp) \ + src/dfa/cfg/$(DEPDIR)/$(am__dirstamp) +src/dfa/cfg/varalloc.$(OBJEXT): src/dfa/cfg/$(am__dirstamp) \ + src/dfa/cfg/$(DEPDIR)/$(am__dirstamp) +src/dfa/$(am__dirstamp): + @$(MKDIR_P) src/dfa + @: > src/dfa/$(am__dirstamp) +src/dfa/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/dfa/$(DEPDIR) + @: > src/dfa/$(DEPDIR)/$(am__dirstamp) +src/dfa/closure.$(OBJEXT): src/dfa/$(am__dirstamp) \ + src/dfa/$(DEPDIR)/$(am__dirstamp) +src/dfa/dead_rules.$(OBJEXT): src/dfa/$(am__dirstamp) \ + src/dfa/$(DEPDIR)/$(am__dirstamp) +src/dfa/determinization.$(OBJEXT): src/dfa/$(am__dirstamp) \ + src/dfa/$(DEPDIR)/$(am__dirstamp) +src/dfa/dump.$(OBJEXT): src/dfa/$(am__dirstamp) \ + src/dfa/$(DEPDIR)/$(am__dirstamp) +src/dfa/fallback_tags.$(OBJEXT): src/dfa/$(am__dirstamp) \ + src/dfa/$(DEPDIR)/$(am__dirstamp) +src/dfa/fillpoints.$(OBJEXT): src/dfa/$(am__dirstamp) \ + src/dfa/$(DEPDIR)/$(am__dirstamp) +src/dfa/find_state.$(OBJEXT): src/dfa/$(am__dirstamp) \ + src/dfa/$(DEPDIR)/$(am__dirstamp) +src/dfa/minimization.$(OBJEXT): src/dfa/$(am__dirstamp) \ + src/dfa/$(DEPDIR)/$(am__dirstamp) +src/dfa/tagpool.$(OBJEXT): src/dfa/$(am__dirstamp) \ + src/dfa/$(DEPDIR)/$(am__dirstamp) +src/dfa/tagtree.$(OBJEXT): src/dfa/$(am__dirstamp) \ + src/dfa/$(DEPDIR)/$(am__dirstamp) +src/dfa/tcmd.$(OBJEXT): src/dfa/$(am__dirstamp) \ + src/dfa/$(DEPDIR)/$(am__dirstamp) +src/re/encoding/$(am__dirstamp): + @$(MKDIR_P) src/re/encoding + @: > src/re/encoding/$(am__dirstamp) +src/re/encoding/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/re/encoding/$(DEPDIR) + @: > src/re/encoding/$(DEPDIR)/$(am__dirstamp) +src/re/encoding/enc.$(OBJEXT): src/re/encoding/$(am__dirstamp) \ + src/re/encoding/$(DEPDIR)/$(am__dirstamp) +src/re/encoding/range_suffix.$(OBJEXT): \ + src/re/encoding/$(am__dirstamp) \ + src/re/encoding/$(DEPDIR)/$(am__dirstamp) +src/re/encoding/utf8/$(am__dirstamp): + @$(MKDIR_P) src/re/encoding/utf8 + @: > src/re/encoding/utf8/$(am__dirstamp) +src/re/encoding/utf8/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/re/encoding/utf8/$(DEPDIR) + @: > src/re/encoding/utf8/$(DEPDIR)/$(am__dirstamp) +src/re/encoding/utf8/utf8_regexp.$(OBJEXT): \ + src/re/encoding/utf8/$(am__dirstamp) \ + src/re/encoding/utf8/$(DEPDIR)/$(am__dirstamp) +src/re/encoding/utf8/utf8_range.$(OBJEXT): \ + src/re/encoding/utf8/$(am__dirstamp) \ + src/re/encoding/utf8/$(DEPDIR)/$(am__dirstamp) +src/re/encoding/utf8/utf8.$(OBJEXT): \ + src/re/encoding/utf8/$(am__dirstamp) \ + src/re/encoding/utf8/$(DEPDIR)/$(am__dirstamp) +src/re/encoding/utf16/$(am__dirstamp): + @$(MKDIR_P) src/re/encoding/utf16 + @: > src/re/encoding/utf16/$(am__dirstamp) +src/re/encoding/utf16/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/re/encoding/utf16/$(DEPDIR) + @: > src/re/encoding/utf16/$(DEPDIR)/$(am__dirstamp) +src/re/encoding/utf16/utf16_regexp.$(OBJEXT): \ + src/re/encoding/utf16/$(am__dirstamp) \ + src/re/encoding/utf16/$(DEPDIR)/$(am__dirstamp) +src/re/encoding/utf16/utf16.$(OBJEXT): \ + src/re/encoding/utf16/$(am__dirstamp) \ + src/re/encoding/utf16/$(DEPDIR)/$(am__dirstamp) +src/re/encoding/utf16/utf16_range.$(OBJEXT): \ + src/re/encoding/utf16/$(am__dirstamp) \ + src/re/encoding/utf16/$(DEPDIR)/$(am__dirstamp) +src/re/$(am__dirstamp): + @$(MKDIR_P) src/re + @: > src/re/$(am__dirstamp) +src/re/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/re/$(DEPDIR) + @: > src/re/$(DEPDIR)/$(am__dirstamp) +src/re/ast_to_re.$(OBJEXT): src/re/$(am__dirstamp) \ + src/re/$(DEPDIR)/$(am__dirstamp) +src/re/default_tags.$(OBJEXT): src/re/$(am__dirstamp) \ + src/re/$(DEPDIR)/$(am__dirstamp) +src/re/fixed_tags.$(OBJEXT): src/re/$(am__dirstamp) \ + src/re/$(DEPDIR)/$(am__dirstamp) +src/re/nullable.$(OBJEXT): src/re/$(am__dirstamp) \ + src/re/$(DEPDIR)/$(am__dirstamp) +src/re/rule.$(OBJEXT): src/re/$(am__dirstamp) \ + src/re/$(DEPDIR)/$(am__dirstamp) +src/re/split_charset.$(OBJEXT): src/re/$(am__dirstamp) \ + src/re/$(DEPDIR)/$(am__dirstamp) +src/re/tag.$(OBJEXT): src/re/$(am__dirstamp) \ + src/re/$(DEPDIR)/$(am__dirstamp) +src/$(am__dirstamp): + @$(MKDIR_P) src + @: > src/$(am__dirstamp) +src/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/$(DEPDIR) + @: > src/$(DEPDIR)/$(am__dirstamp) +src/compile.$(OBJEXT): src/$(am__dirstamp) \ + src/$(DEPDIR)/$(am__dirstamp) +src/skeleton/$(am__dirstamp): + @$(MKDIR_P) src/skeleton + @: > src/skeleton/$(am__dirstamp) +src/skeleton/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/skeleton/$(DEPDIR) + @: > src/skeleton/$(DEPDIR)/$(am__dirstamp) +src/skeleton/control_flow.$(OBJEXT): src/skeleton/$(am__dirstamp) \ + src/skeleton/$(DEPDIR)/$(am__dirstamp) +src/skeleton/generate_code.$(OBJEXT): src/skeleton/$(am__dirstamp) \ + src/skeleton/$(DEPDIR)/$(am__dirstamp) +src/skeleton/generate_data.$(OBJEXT): src/skeleton/$(am__dirstamp) \ + src/skeleton/$(DEPDIR)/$(am__dirstamp) +src/skeleton/maxpath.$(OBJEXT): src/skeleton/$(am__dirstamp) \ + src/skeleton/$(DEPDIR)/$(am__dirstamp) +src/skeleton/skeleton.$(OBJEXT): src/skeleton/$(am__dirstamp) \ + src/skeleton/$(DEPDIR)/$(am__dirstamp) +src/main.$(OBJEXT): src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) +src/ast/$(am__dirstamp): + @$(MKDIR_P) src/ast + @: > src/ast/$(am__dirstamp) +src/ast/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/ast/$(DEPDIR) + @: > src/ast/$(DEPDIR)/$(am__dirstamp) +src/ast/ast.$(OBJEXT): src/ast/$(am__dirstamp) \ + src/ast/$(DEPDIR)/$(am__dirstamp) +src/ast/input.$(OBJEXT): src/ast/$(am__dirstamp) \ + src/ast/$(DEPDIR)/$(am__dirstamp) +src/ast/normalize.$(OBJEXT): src/ast/$(am__dirstamp) \ + src/ast/$(DEPDIR)/$(am__dirstamp) +src/ast/scanner.$(OBJEXT): src/ast/$(am__dirstamp) \ + src/ast/$(DEPDIR)/$(am__dirstamp) +src/ast/unescape.$(OBJEXT): src/ast/$(am__dirstamp) \ + src/ast/$(DEPDIR)/$(am__dirstamp) +src/ast/validate.$(OBJEXT): src/ast/$(am__dirstamp) \ + src/ast/$(DEPDIR)/$(am__dirstamp) +src/util/$(am__dirstamp): + @$(MKDIR_P) src/util + @: > src/util/$(am__dirstamp) +src/util/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/util/$(DEPDIR) + @: > src/util/$(DEPDIR)/$(am__dirstamp) +src/util/s_to_n32_unsafe.$(OBJEXT): src/util/$(am__dirstamp) \ + src/util/$(DEPDIR)/$(am__dirstamp) +src/util/range.$(OBJEXT): src/util/$(am__dirstamp) \ + src/util/$(DEPDIR)/$(am__dirstamp) +src/ast/lex.$(OBJEXT): src/ast/$(am__dirstamp) \ + src/ast/$(DEPDIR)/$(am__dirstamp) +src/ast/lex_conf.$(OBJEXT): src/ast/$(am__dirstamp) \ + src/ast/$(DEPDIR)/$(am__dirstamp) +src/ast/parser.$(OBJEXT): src/ast/$(am__dirstamp) \ + src/ast/$(DEPDIR)/$(am__dirstamp) +src/conf/parse_opts.$(OBJEXT): src/conf/$(am__dirstamp) \ + src/conf/$(DEPDIR)/$(am__dirstamp) +src/conf/help.$(OBJEXT): src/conf/$(am__dirstamp) \ + src/conf/$(DEPDIR)/$(am__dirstamp) + +re2c$(EXEEXT): $(re2c_OBJECTS) $(re2c_DEPENDENCIES) $(EXTRA_re2c_DEPENDENCIES) + @rm -f re2c$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(re2c_OBJECTS) $(re2c_LDADD) $(LIBS) +src/test/range/$(am__dirstamp): + @$(MKDIR_P) src/test/range + @: > src/test/range/$(am__dirstamp) +src/test/range/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/test/range/$(DEPDIR) + @: > src/test/range/$(DEPDIR)/$(am__dirstamp) +src/test/range/test.$(OBJEXT): src/test/range/$(am__dirstamp) \ + src/test/range/$(DEPDIR)/$(am__dirstamp) + +testrange$(EXEEXT): $(testrange_OBJECTS) $(testrange_DEPENDENCIES) $(EXTRA_testrange_DEPENDENCIES) + @rm -f testrange$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(testrange_OBJECTS) $(testrange_LDADD) $(LIBS) +src/test/s_to_n32_unsafe/$(am__dirstamp): + @$(MKDIR_P) src/test/s_to_n32_unsafe + @: > src/test/s_to_n32_unsafe/$(am__dirstamp) +src/test/s_to_n32_unsafe/$(DEPDIR)/$(am__dirstamp): + @$(MKDIR_P) src/test/s_to_n32_unsafe/$(DEPDIR) + @: > src/test/s_to_n32_unsafe/$(DEPDIR)/$(am__dirstamp) +src/test/s_to_n32_unsafe/test.$(OBJEXT): \ + src/test/s_to_n32_unsafe/$(am__dirstamp) \ + src/test/s_to_n32_unsafe/$(DEPDIR)/$(am__dirstamp) + +testston32unsafe$(EXEEXT): $(testston32unsafe_OBJECTS) $(testston32unsafe_DEPENDENCIES) $(EXTRA_testston32unsafe_DEPENDENCIES) + @rm -f testston32unsafe$(EXEEXT) + $(AM_V_CXXLD)$(CXXLINK) $(testston32unsafe_OBJECTS) $(testston32unsafe_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + -rm -f src/*.$(OBJEXT) + -rm -f src/adfa/*.$(OBJEXT) + -rm -f src/ast/*.$(OBJEXT) + -rm -f src/code/*.$(OBJEXT) + -rm -f src/conf/*.$(OBJEXT) + -rm -f src/dfa/*.$(OBJEXT) + -rm -f src/dfa/cfg/*.$(OBJEXT) + -rm -f src/nfa/*.$(OBJEXT) + -rm -f src/re/*.$(OBJEXT) + -rm -f src/re/encoding/*.$(OBJEXT) + -rm -f src/re/encoding/utf16/*.$(OBJEXT) + -rm -f src/re/encoding/utf8/*.$(OBJEXT) + -rm -f src/skeleton/*.$(OBJEXT) + -rm -f src/test/range/*.$(OBJEXT) + -rm -f src/test/s_to_n32_unsafe/*.$(OBJEXT) + -rm -f src/util/*.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/compile.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/$(DEPDIR)/main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/adfa/$(DEPDIR)/adfa.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/adfa/$(DEPDIR)/dump.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/adfa/$(DEPDIR)/prepare.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/ast/$(DEPDIR)/ast.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/ast/$(DEPDIR)/input.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/ast/$(DEPDIR)/lex.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/ast/$(DEPDIR)/lex_conf.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/ast/$(DEPDIR)/normalize.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/ast/$(DEPDIR)/parser.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/ast/$(DEPDIR)/scanner.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/ast/$(DEPDIR)/unescape.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/ast/$(DEPDIR)/validate.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/code/$(DEPDIR)/bitmap.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/code/$(DEPDIR)/emit_action.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/code/$(DEPDIR)/emit_dfa.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/code/$(DEPDIR)/go_construct.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/code/$(DEPDIR)/go_destruct.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/code/$(DEPDIR)/go_emit.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/code/$(DEPDIR)/go_used_labels.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/code/$(DEPDIR)/input_api.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/code/$(DEPDIR)/label.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/code/$(DEPDIR)/output.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/code/$(DEPDIR)/print.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/conf/$(DEPDIR)/help.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/conf/$(DEPDIR)/msg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/conf/$(DEPDIR)/opt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/conf/$(DEPDIR)/parse_opts.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/conf/$(DEPDIR)/warn.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/dfa/$(DEPDIR)/closure.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/dfa/$(DEPDIR)/dead_rules.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/dfa/$(DEPDIR)/determinization.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/dfa/$(DEPDIR)/dump.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/dfa/$(DEPDIR)/fallback_tags.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/dfa/$(DEPDIR)/fillpoints.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/dfa/$(DEPDIR)/find_state.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/dfa/$(DEPDIR)/minimization.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/dfa/$(DEPDIR)/tagpool.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/dfa/$(DEPDIR)/tagtree.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/dfa/$(DEPDIR)/tcmd.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/dfa/cfg/$(DEPDIR)/cfg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/dfa/cfg/$(DEPDIR)/compact.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/dfa/cfg/$(DEPDIR)/dce.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/dfa/cfg/$(DEPDIR)/dump.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/dfa/cfg/$(DEPDIR)/freeze.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/dfa/cfg/$(DEPDIR)/interfere.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/dfa/cfg/$(DEPDIR)/liveanal.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/dfa/cfg/$(DEPDIR)/normalize.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/dfa/cfg/$(DEPDIR)/optimize.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/dfa/cfg/$(DEPDIR)/rename.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/dfa/cfg/$(DEPDIR)/varalloc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/nfa/$(DEPDIR)/dump.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/nfa/$(DEPDIR)/estimate_size.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/nfa/$(DEPDIR)/re_to_nfa.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/re/$(DEPDIR)/ast_to_re.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/re/$(DEPDIR)/default_tags.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/re/$(DEPDIR)/fixed_tags.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/re/$(DEPDIR)/nullable.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/re/$(DEPDIR)/rule.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/re/$(DEPDIR)/split_charset.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/re/$(DEPDIR)/tag.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/re/encoding/$(DEPDIR)/enc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/re/encoding/$(DEPDIR)/range_suffix.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/re/encoding/utf16/$(DEPDIR)/utf16.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/re/encoding/utf16/$(DEPDIR)/utf16_range.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/re/encoding/utf16/$(DEPDIR)/utf16_regexp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/re/encoding/utf8/$(DEPDIR)/utf8.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/re/encoding/utf8/$(DEPDIR)/utf8_range.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/re/encoding/utf8/$(DEPDIR)/utf8_regexp.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/skeleton/$(DEPDIR)/control_flow.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/skeleton/$(DEPDIR)/generate_code.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/skeleton/$(DEPDIR)/generate_data.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/skeleton/$(DEPDIR)/maxpath.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/skeleton/$(DEPDIR)/skeleton.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/test/range/$(DEPDIR)/test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/test/s_to_n32_unsafe/$(DEPDIR)/test.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/util/$(DEPDIR)/range.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@src/util/$(DEPDIR)/s_to_n32_unsafe.Po@am__quote@ + +.cc.o: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ $< + +.cc.obj: +@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ +@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ +@am__fastdepCXX_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.Po +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ $(AM_V_CXX)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCXX_FALSE@ DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCXX_FALSE@ $(AM_V_CXX@am__nodep@)$(CXXCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` +install-man1: $(man_MANS) + @$(NORMAL_INSTALL) + @list1=''; \ + list2='$(man_MANS)'; \ + test -n "$(man1dir)" \ + && test -n "`echo $$list1$$list2`" \ + || exit 0; \ + echo " $(MKDIR_P) '$(DESTDIR)$(man1dir)'"; \ + $(MKDIR_P) "$(DESTDIR)$(man1dir)" || exit 1; \ + { for i in $$list1; do echo "$$i"; done; \ + if test -n "$$list2"; then \ + for i in $$list2; do echo "$$i"; done \ + | sed -n '/\.1[a-z]*$$/p'; \ + fi; \ + } | while read p; do \ + if test -f $$p; then d=; else d="$(srcdir)/"; fi; \ + echo "$$d$$p"; echo "$$p"; \ + done | \ + sed -e 'n;s,.*/,,;p;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,' | \ + sed 'N;N;s,\n, ,g' | { \ + list=; while read file base inst; do \ + if test "$$base" = "$$inst"; then list="$$list $$file"; else \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst" || exit $$?; \ + fi; \ + done; \ + for i in $$list; do echo "$$i"; done | $(am__base_list) | \ + while read files; do \ + test -z "$$files" || { \ + echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'"; \ + $(INSTALL_DATA) $$files "$(DESTDIR)$(man1dir)" || exit $$?; }; \ + done; } + +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list=''; test -n "$(man1dir)" || exit 0; \ + files=`{ for i in $$list; do echo "$$i"; done; \ + l2='$(man_MANS)'; for i in $$l2; do echo "$$i"; done | \ + sed -n '/\.1[a-z]*$$/p'; \ + } | sed -e 's,.*/,,;h;s,.*\.,,;s,^[^1][0-9a-z]*$$,1,;x' \ + -e 's,\.[0-9a-z]*$$,,;$(transform);G;s,\n,.,'`; \ + dir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir) + +ID: $(am__tagged_files) + $(am__define_uniq_tagged_files); mkid -fID $$unique +tags: tags-am +TAGS: tags + +tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + set x; \ + here=`pwd`; \ + $(am__define_uniq_tagged_files); \ + shift; \ + if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + if test $$# -gt 0; then \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + "$$@" $$unique; \ + else \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$unique; \ + fi; \ + fi +ctags: ctags-am + +CTAGS: ctags +ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) + $(am__define_uniq_tagged_files); \ + test -z "$(CTAGS_ARGS)$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && $(am__cd) $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) "$$here" +cscope: cscope.files + test ! -s cscope.files \ + || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) +clean-cscope: + -rm -f cscope.files +cscope.files: clean-cscope cscopelist +cscopelist: cscopelist-am + +cscopelist-am: $(am__tagged_files) + list='$(am__tagged_files)'; \ + case "$(srcdir)" in \ + [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ + *) sdir=$(subdir)/$(srcdir) ;; \ + esac; \ + for i in $$list; do \ + if test -f "$$i"; then \ + echo "$(subdir)/$$i"; \ + else \ + echo "$$sdir/$$i"; \ + fi; \ + done >> $(top_builddir)/cscope.files + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + -rm -f cscope.out cscope.in.out cscope.po.out cscope.files + +# Recover from deleted '.trs' file; this should ensure that +# "rm -f foo.log; make foo.trs" re-run 'foo.test', and re-create +# both 'foo.log' and 'foo.trs'. Break the recipe in two subshells +# to avoid problems with "make -n". +.log.trs: + rm -f $< $@ + $(MAKE) $(AM_MAKEFLAGS) $< + +# Leading 'am--fnord' is there to ensure the list of targets does not +# expand to empty, as could happen e.g. with make check TESTS=''. +am--fnord $(TEST_LOGS) $(TEST_LOGS:.log=.trs): $(am__force_recheck) +am--force-recheck: + @: + +$(TEST_SUITE_LOG): $(TEST_LOGS) + @$(am__set_TESTS_bases); \ + am__f_ok () { test -f "$$1" && test -r "$$1"; }; \ + redo_bases=`for i in $$bases; do \ + am__f_ok $$i.trs && am__f_ok $$i.log || echo $$i; \ + done`; \ + if test -n "$$redo_bases"; then \ + redo_logs=`for i in $$redo_bases; do echo $$i.log; done`; \ + redo_results=`for i in $$redo_bases; do echo $$i.trs; done`; \ + if $(am__make_dryrun); then :; else \ + rm -f $$redo_logs && rm -f $$redo_results || exit 1; \ + fi; \ + fi; \ + if test -n "$$am__remaking_logs"; then \ + echo "fatal: making $(TEST_SUITE_LOG): possible infinite" \ + "recursion detected" >&2; \ + elif test -n "$$redo_logs"; then \ + am__remaking_logs=yes $(MAKE) $(AM_MAKEFLAGS) $$redo_logs; \ + fi; \ + if $(am__make_dryrun); then :; else \ + st=0; \ + errmsg="fatal: making $(TEST_SUITE_LOG): failed to create"; \ + for i in $$redo_bases; do \ + test -f $$i.trs && test -r $$i.trs \ + || { echo "$$errmsg $$i.trs" >&2; st=1; }; \ + test -f $$i.log && test -r $$i.log \ + || { echo "$$errmsg $$i.log" >&2; st=1; }; \ + done; \ + test $$st -eq 0 || exit 1; \ + fi + @$(am__sh_e_setup); $(am__tty_colors); $(am__set_TESTS_bases); \ + ws='[ ]'; \ + results=`for b in $$bases; do echo $$b.trs; done`; \ + test -n "$$results" || results=/dev/null; \ + all=` grep "^$$ws*:test-result:" $$results | wc -l`; \ + pass=` grep "^$$ws*:test-result:$$ws*PASS" $$results | wc -l`; \ + fail=` grep "^$$ws*:test-result:$$ws*FAIL" $$results | wc -l`; \ + skip=` grep "^$$ws*:test-result:$$ws*SKIP" $$results | wc -l`; \ + xfail=`grep "^$$ws*:test-result:$$ws*XFAIL" $$results | wc -l`; \ + xpass=`grep "^$$ws*:test-result:$$ws*XPASS" $$results | wc -l`; \ + error=`grep "^$$ws*:test-result:$$ws*ERROR" $$results | wc -l`; \ + if test `expr $$fail + $$xpass + $$error` -eq 0; then \ + success=true; \ + else \ + success=false; \ + fi; \ + br='==================='; br=$$br$$br$$br$$br; \ + result_count () \ + { \ + if test x"$$1" = x"--maybe-color"; then \ + maybe_colorize=yes; \ + elif test x"$$1" = x"--no-color"; then \ + maybe_colorize=no; \ + else \ + echo "$@: invalid 'result_count' usage" >&2; exit 4; \ + fi; \ + shift; \ + desc=$$1 count=$$2; \ + if test $$maybe_colorize = yes && test $$count -gt 0; then \ + color_start=$$3 color_end=$$std; \ + else \ + color_start= color_end=; \ + fi; \ + echo "$${color_start}# $$desc $$count$${color_end}"; \ + }; \ + create_testsuite_report () \ + { \ + result_count $$1 "TOTAL:" $$all "$$brg"; \ + result_count $$1 "PASS: " $$pass "$$grn"; \ + result_count $$1 "SKIP: " $$skip "$$blu"; \ + result_count $$1 "XFAIL:" $$xfail "$$lgn"; \ + result_count $$1 "FAIL: " $$fail "$$red"; \ + result_count $$1 "XPASS:" $$xpass "$$red"; \ + result_count $$1 "ERROR:" $$error "$$mgn"; \ + }; \ + { \ + echo "$(PACKAGE_STRING): $(subdir)/$(TEST_SUITE_LOG)" | \ + $(am__rst_title); \ + create_testsuite_report --no-color; \ + echo; \ + echo ".. contents:: :depth: 2"; \ + echo; \ + for b in $$bases; do echo $$b; done \ + | $(am__create_global_log); \ + } >$(TEST_SUITE_LOG).tmp || exit 1; \ + mv $(TEST_SUITE_LOG).tmp $(TEST_SUITE_LOG); \ + if $$success; then \ + col="$$grn"; \ + else \ + col="$$red"; \ + test x"$$VERBOSE" = x || cat $(TEST_SUITE_LOG); \ + fi; \ + echo "$${col}$$br$${std}"; \ + echo "$${col}Testsuite summary for $(PACKAGE_STRING)$${std}"; \ + echo "$${col}$$br$${std}"; \ + create_testsuite_report --maybe-color; \ + echo "$$col$$br$$std"; \ + if $$success; then :; else \ + echo "$${col}See $(subdir)/$(TEST_SUITE_LOG)$${std}"; \ + if test -n "$(PACKAGE_BUGREPORT)"; then \ + echo "$${col}Please report to $(PACKAGE_BUGREPORT)$${std}"; \ + fi; \ + echo "$$col$$br$$std"; \ + fi; \ + $$success || exit 1 + +check-TESTS: + @list='$(RECHECK_LOGS)'; test -z "$$list" || rm -f $$list + @list='$(RECHECK_LOGS:.log=.trs)'; test -z "$$list" || rm -f $$list + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + trs_list=`for i in $$bases; do echo $$i.trs; done`; \ + log_list=`echo $$log_list`; trs_list=`echo $$trs_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) TEST_LOGS="$$log_list"; \ + exit $$?; +recheck: all $(check_PROGRAMS) + @test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + @set +e; $(am__set_TESTS_bases); \ + bases=`for i in $$bases; do echo $$i; done \ + | $(am__list_recheck_tests)` || exit 1; \ + log_list=`for i in $$bases; do echo $$i.log; done`; \ + log_list=`echo $$log_list`; \ + $(MAKE) $(AM_MAKEFLAGS) $(TEST_SUITE_LOG) \ + am__force_recheck=am--force-recheck \ + TEST_LOGS="$$log_list"; \ + exit $$? +run_tests.sh.log: run_tests.sh + @p='run_tests.sh'; \ + b='run_tests.sh'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +testrange.log: testrange$(EXEEXT) + @p='testrange$(EXEEXT)'; \ + b='testrange'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +testston32unsafe.log: testston32unsafe$(EXEEXT) + @p='testston32unsafe$(EXEEXT)'; \ + b='testston32unsafe'; \ + $(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +.test.log: + @p='$<'; \ + $(am__set_b); \ + $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ + --log-file $$b.log --trs-file $$b.trs \ + $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ + "$$tst" $(AM_TESTS_FD_REDIRECT) +@am__EXEEXT_TRUE@.test$(EXEEXT).log: +@am__EXEEXT_TRUE@ @p='$<'; \ +@am__EXEEXT_TRUE@ $(am__set_b); \ +@am__EXEEXT_TRUE@ $(am__check_pre) $(TEST_LOG_DRIVER) --test-name "$$f" \ +@am__EXEEXT_TRUE@ --log-file $$b.log --trs-file $$b.trs \ +@am__EXEEXT_TRUE@ $(am__common_driver_flags) $(AM_TEST_LOG_DRIVER_FLAGS) $(TEST_LOG_DRIVER_FLAGS) -- $(TEST_LOG_COMPILE) \ +@am__EXEEXT_TRUE@ "$$tst" $(AM_TESTS_FD_REDIRECT) + +distdir: $(DISTFILES) + $(am__remove_distdir) + test -d "$(distdir)" || mkdir "$(distdir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ + list='$(DISTFILES)'; \ + dist_files=`for file in $$list; do echo $$file; done | \ + sed -e "s|^$$srcdirstrip/||;t" \ + -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ + case $$dist_files in \ + */*) $(MKDIR_P) `echo "$$dist_files" | \ + sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ + sort -u` ;; \ + esac; \ + for file in $$dist_files; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + if test -d $$d/$$file; then \ + dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test -d "$(distdir)/$$file"; then \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ + find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ + fi; \ + cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ + else \ + test -f "$(distdir)/$$file" \ + || cp -p $$d/$$file "$(distdir)/$$file" \ + || exit 1; \ + fi; \ + done + -test -n "$(am__skip_mode_fix)" \ + || find "$(distdir)" -type d ! -perm -755 \ + -exec chmod u+rwx,go+rx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r "$(distdir)" +dist-gzip: distdir + tardir=$(distdir) && $(am__tar) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).tar.gz + $(am__post_remove_distdir) + +dist-bzip2: distdir + tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 + $(am__post_remove_distdir) + +dist-lzip: distdir + tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz + $(am__post_remove_distdir) + +dist-xz: distdir + tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz + $(am__post_remove_distdir) + +dist-tarZ: distdir + @echo WARNING: "Support for distribution archives compressed with" \ + "legacy program 'compress' is deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z + $(am__post_remove_distdir) + +dist-shar: distdir + @echo WARNING: "Support for shar distribution archives is" \ + "deprecated." >&2 + @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 + shar $(distdir) | eval GZIP= gzip $(GZIP_ENV) -c >$(distdir).shar.gz + $(am__post_remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__post_remove_distdir) + +dist dist-all: + $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' + $(am__post_remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).tar.gz | $(am__untar) ;;\ + *.tar.bz2*) \ + bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\ + *.tar.lz*) \ + lzip -dc $(distdir).tar.lz | $(am__untar) ;;\ + *.tar.xz*) \ + xz -dc $(distdir).tar.xz | $(am__untar) ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(am__untar) ;;\ + *.shar.gz*) \ + eval GZIP= gzip $(GZIP_ENV) -dc $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir) + chmod u+w $(distdir) + mkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst + chmod a-w $(distdir) + test -d $(distdir)/_build || exit 0; \ + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && am__cwd=`pwd` \ + && $(am__cd) $(distdir)/_build/sub \ + && ../../configure \ + $(AM_DISTCHECK_CONFIGURE_FLAGS) \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + --srcdir=../.. --prefix="$$dc_install_base" \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \ + && cd "$$am__cwd" \ + || exit 1 + $(am__post_remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x' +distuninstallcheck: + @test -n '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: trying to run $@ with an empty' \ + '$$(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + $(am__cd) '$(distuninstallcheck_dir)' || { \ + echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ + exit 1; \ + }; \ + test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_PROGRAMS) + $(MAKE) $(AM_MAKEFLAGS) check-TESTS +check: check-am +all-am: Makefile $(PROGRAMS) $(MANS) config.h all-local +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(MKDIR_P) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + if test -z '$(STRIP)'; then \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + install; \ + else \ + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ + fi +mostlyclean-generic: + -test -z "$(TEST_LOGS)" || rm -f $(TEST_LOGS) + -test -z "$(TEST_LOGS:.log=.trs)" || rm -f $(TEST_LOGS:.log=.trs) + -test -z "$(TEST_SUITE_LOG)" || rm -f $(TEST_SUITE_LOG) + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) + -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) + -rm -f src/$(DEPDIR)/$(am__dirstamp) + -rm -f src/$(am__dirstamp) + -rm -f src/adfa/$(DEPDIR)/$(am__dirstamp) + -rm -f src/adfa/$(am__dirstamp) + -rm -f src/ast/$(DEPDIR)/$(am__dirstamp) + -rm -f src/ast/$(am__dirstamp) + -rm -f src/code/$(DEPDIR)/$(am__dirstamp) + -rm -f src/code/$(am__dirstamp) + -rm -f src/conf/$(DEPDIR)/$(am__dirstamp) + -rm -f src/conf/$(am__dirstamp) + -rm -f src/dfa/$(DEPDIR)/$(am__dirstamp) + -rm -f src/dfa/$(am__dirstamp) + -rm -f src/dfa/cfg/$(DEPDIR)/$(am__dirstamp) + -rm -f src/dfa/cfg/$(am__dirstamp) + -rm -f src/nfa/$(DEPDIR)/$(am__dirstamp) + -rm -f src/nfa/$(am__dirstamp) + -rm -f src/re/$(DEPDIR)/$(am__dirstamp) + -rm -f src/re/$(am__dirstamp) + -rm -f src/re/encoding/$(DEPDIR)/$(am__dirstamp) + -rm -f src/re/encoding/$(am__dirstamp) + -rm -f src/re/encoding/utf16/$(DEPDIR)/$(am__dirstamp) + -rm -f src/re/encoding/utf16/$(am__dirstamp) + -rm -f src/re/encoding/utf8/$(DEPDIR)/$(am__dirstamp) + -rm -f src/re/encoding/utf8/$(am__dirstamp) + -rm -f src/skeleton/$(DEPDIR)/$(am__dirstamp) + -rm -f src/skeleton/$(am__dirstamp) + -rm -f src/test/range/$(DEPDIR)/$(am__dirstamp) + -rm -f src/test/range/$(am__dirstamp) + -rm -f src/test/s_to_n32_unsafe/$(DEPDIR)/$(am__dirstamp) + -rm -f src/test/s_to_n32_unsafe/$(am__dirstamp) + -rm -f src/util/$(DEPDIR)/$(am__dirstamp) + -rm -f src/util/$(am__dirstamp) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-checkPROGRAMS clean-generic \ + mostlyclean-am + +distclean: distclean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf src/$(DEPDIR) src/adfa/$(DEPDIR) src/ast/$(DEPDIR) src/code/$(DEPDIR) src/conf/$(DEPDIR) src/dfa/$(DEPDIR) src/dfa/cfg/$(DEPDIR) src/nfa/$(DEPDIR) src/re/$(DEPDIR) src/re/encoding/$(DEPDIR) src/re/encoding/utf16/$(DEPDIR) src/re/encoding/utf8/$(DEPDIR) src/skeleton/$(DEPDIR) src/test/range/$(DEPDIR) src/test/s_to_n32_unsafe/$(DEPDIR) src/util/$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-hdr distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +html-am: + +info: info-am + +info-am: + +install-data-am: install-man + +install-dvi: install-dvi-am + +install-dvi-am: + +install-exec-am: install-binPROGRAMS + +install-html: install-html-am + +install-html-am: + +install-info: install-info-am + +install-info-am: + +install-man: install-man1 + +install-pdf: install-pdf-am + +install-pdf-am: + +install-ps: install-ps-am + +install-ps-am: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -rf src/$(DEPDIR) src/adfa/$(DEPDIR) src/ast/$(DEPDIR) src/code/$(DEPDIR) src/conf/$(DEPDIR) src/dfa/$(DEPDIR) src/dfa/cfg/$(DEPDIR) src/nfa/$(DEPDIR) src/re/$(DEPDIR) src/re/encoding/$(DEPDIR) src/re/encoding/utf16/$(DEPDIR) src/re/encoding/utf8/$(DEPDIR) src/skeleton/$(DEPDIR) src/test/range/$(DEPDIR) src/test/s_to_n32_unsafe/$(DEPDIR) src/util/$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-man + +uninstall-man: uninstall-man1 + +.MAKE: all check-am install-am install-strip + +.PHONY: CTAGS GTAGS TAGS all all-am all-local am--refresh check \ + check-TESTS check-am clean clean-binPROGRAMS \ + clean-checkPROGRAMS clean-cscope clean-generic cscope \ + cscopelist-am ctags ctags-am dist dist-all dist-bzip2 \ + dist-gzip dist-lzip dist-shar dist-tarZ dist-xz dist-zip \ + distcheck distclean distclean-compile distclean-generic \ + distclean-hdr distclean-tags distcleancheck distdir \ + distuninstallcheck dvi dvi-am html html-am info info-am \ + install install-am install-binPROGRAMS install-data \ + install-data-am install-dvi install-dvi-am install-exec \ + install-exec-am install-html install-html-am install-info \ + install-info-am install-man install-man1 install-pdf \ + install-pdf-am install-ps install-ps-am install-strip \ + installcheck installcheck-am installdirs maintainer-clean \ + maintainer-clean-generic mostlyclean mostlyclean-compile \ + mostlyclean-generic pdf pdf-am ps ps-am recheck tags tags-am \ + uninstall uninstall-am uninstall-binPROGRAMS uninstall-man \ + uninstall-man1 + +.PRECIOUS: Makefile + + +$(AUTOGEN_PARSER): $(CUSTOM_PARSER) + $(AM_V_at)$(MKDIR_P) $(@D) + $(AM_V_GEN) if test $(BISON) = "no"; \ + then \ + cp $(top_srcdir)/$(BOOTSTRAP_PARSER) $@ && \ + cp $(top_srcdir)/$(BOOTSTRAP_PARSER_HDR) $(AUTOGEN_PARSER_HDR); \ + else \ + $(BISON) \ + --output=$@ \ + --defines=$(AUTOGEN_PARSER_HDR) \ + $(top_srcdir)/$(CUSTOM_PARSER); \ + fi + +# lexer depends on bison-generated header +# so bison rule must be triggered before lexer rule +$(AUTOGEN_LEX): $(AUTOGEN_PARSER) + +$(BOOTSTRAP_PARSER): $(CUSTOM_PARSER) +# target directory exists (as part of source file tree) + $(AM_V_GEN) test $(BISON) = "no" || \ + $(BISON) \ + --output=$(top_srcdir)/$@ \ + --defines=$(top_srcdir)/$(BOOTSTRAP_PARSER_HDR) \ + --no-lines \ + $(top_srcdir)/$(CUSTOM_PARSER); + +.re.cc: + $(AM_V_at)$(MKDIR_P) $(@D) + $(AM_V_GEN) if test -x $(RE2C); \ + then \ + $(top_builddir)/$(RE2C) $(RE2CFLAGS) -o $@ $< && \ + cp $@ $(top_srcdir)/bootstrap/$@; \ + else \ + cp $(top_srcdir)/bootstrap/$@ $@; \ + fi + +# rebuild all re2c sources using newly built re2c +.PHONY: bootstrap +bootstrap: all + rm $(top_builddir)/$(AUTOGEN_LEX) + rm $(top_builddir)/$(AUTOGEN_LEX_CONF) + rm $(top_builddir)/$(AUTOGEN_PARSEOPT) + $(MAKE) all + +.PHONY: docs +@REBUILD_DOCS_TRUE@docs: $(DOC) $(AUTOGEN_HELP) +@REBUILD_DOCS_TRUE@$(DOC): $(SRC_DOC) $(SRC_DOC_EXT) +@REBUILD_DOCS_TRUE@ $(AM_V_at)$(MKDIR_P) $(@D) +@REBUILD_DOCS_TRUE@ $(RST2MAN) $(top_builddir)/$(SRC_DOC) > $@ +@REBUILD_DOCS_TRUE@ cp $@ $(top_srcdir)/$(BOOTSTRAP_DOC) +@REBUILD_DOCS_TRUE@$(AUTOGEN_HELP): $(CUSTOM_HELP) +@REBUILD_DOCS_TRUE@ $(AM_V_at)$(MKDIR_P) $(@D) +@REBUILD_DOCS_TRUE@ $(RST2MAN) $(top_builddir)/$(CUSTOM_HELP) > $@.1 +@REBUILD_DOCS_TRUE@ $(top_srcdir)/genhelp.sh $@.1 $@ +@REBUILD_DOCS_TRUE@ cp $@ $(top_srcdir)/$(BOOTSTRAP_HELP) +@REBUILD_DOCS_FALSE@docs: $(DOC) $(AUTOGEN_HELP) +@REBUILD_DOCS_FALSE@ @echo "Reconfigure to rebuild docs: ./configure --enable-docs" +@REBUILD_DOCS_FALSE@$(DOC): $(BOOTSTRAP_DOC) +@REBUILD_DOCS_FALSE@ $(AM_V_at)$(MKDIR_P) $(@D) +@REBUILD_DOCS_FALSE@ cp $(top_srcdir)/$(BOOTSTRAP_DOC) $@ +@REBUILD_DOCS_FALSE@$(AUTOGEN_HELP): $(BOOTSTRAP_HELP) +@REBUILD_DOCS_FALSE@ $(AM_V_at)$(MKDIR_P) $(@D) +@REBUILD_DOCS_FALSE@ cp $(top_srcdir)/$(BOOTSTRAP_HELP) $@ + +all-local: docs $(BOOTSTRAP_PARSER) +.PHONY: tests +tests: all $(TST_SUITE) + $(top_builddir)/$(TST_SUITE) +.PHONY: vtests +vtests: all $(TST_SUITE) + $(top_builddir)/$(TST_SUITE) --valgrind +.PHONY: wtests +wtests: all $(TST_SUITE) + $(top_builddir)/$(TST_SUITE) --wine -j1 + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/aclocal.m4 b/aclocal.m4 new file mode 100644 index 0000000..2a6168b --- /dev/null +++ b/aclocal.m4 @@ -0,0 +1,1189 @@ +# generated automatically by aclocal 1.15.1 -*- Autoconf -*- + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. + +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +m4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],, +[m4_warning([this file was generated for autoconf 2.69. +You have another version of autoconf. It may work, but is not guaranteed to. +If you have problems, you may need to regenerate the build system entirely. +To do so, use the procedure documented by the package, typically 'autoreconf'.])]) + +# Copyright (C) 2002-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +# (This private macro should not be called outside this file.) +AC_DEFUN([AM_AUTOMAKE_VERSION], +[am__api_version='1.15' +dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to +dnl require some minimum version. Point them to the right macro. +m4_if([$1], [1.15.1], [], + [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl +]) + +# _AM_AUTOCONF_VERSION(VERSION) +# ----------------------------- +# aclocal traces this macro to find the Autoconf version. +# This is a private macro too. Using m4_define simplifies +# the logic in aclocal, which can simply ignore this definition. +m4_define([_AM_AUTOCONF_VERSION], []) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced. +# This function is AC_REQUIREd by AM_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], +[AM_AUTOMAKE_VERSION([1.15.1])dnl +m4_ifndef([AC_AUTOCONF_VERSION], + [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl +_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))]) + +# AM_AUX_DIR_EXPAND -*- Autoconf -*- + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to '$srcdir/foo'. In other projects, it is set to +# '$srcdir', '$srcdir/..', or '$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is '.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` +]) + +# AM_COND_IF -*- Autoconf -*- + +# Copyright (C) 2008-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_COND_IF +# _AM_COND_ELSE +# _AM_COND_ENDIF +# -------------- +# These macros are only used for tracing. +m4_define([_AM_COND_IF]) +m4_define([_AM_COND_ELSE]) +m4_define([_AM_COND_ENDIF]) + +# AM_COND_IF(COND, [IF-TRUE], [IF-FALSE]) +# --------------------------------------- +# If the shell condition COND is true, execute IF-TRUE, otherwise execute +# IF-FALSE. Allow automake to learn about conditional instantiating macros +# (the AC_CONFIG_FOOS). +AC_DEFUN([AM_COND_IF], +[m4_ifndef([_AM_COND_VALUE_$1], + [m4_fatal([$0: no such condition "$1"])])dnl +_AM_COND_IF([$1])dnl +if test -z "$$1_TRUE"; then : + m4_n([$2])[]dnl +m4_ifval([$3], +[_AM_COND_ELSE([$1])dnl +else + $3 +])dnl +_AM_COND_ENDIF([$1])dnl +fi[]dnl +]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ([2.52])dnl + m4_if([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE])dnl +AC_SUBST([$1_FALSE])dnl +_AM_SUBST_NOTMAKE([$1_TRUE])dnl +_AM_SUBST_NOTMAKE([$1_FALSE])dnl +m4_define([_AM_COND_VALUE_$1], [$2])dnl +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([[conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]]) +fi])]) + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "OBJC", "OBJCXX", "UPC", or "GJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +m4_if([$1], [CC], [depcc="$CC" am_compiler_list=], + [$1], [CXX], [depcc="$CXX" am_compiler_list=], + [$1], [OBJC], [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], [OBJCXX], [depcc="$OBJCXX" am_compiler_list='gcc3 gcc'], + [$1], [UPC], [depcc="$UPC" am_compiler_list=], + [$1], [GCJ], [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + am__universal=false + m4_case([$1], [CC], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac], + [CXX], + [case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac]) + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES. +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE([dependency-tracking], [dnl +AS_HELP_STRING( + [--enable-dependency-tracking], + [do not reject slow dependency extractors]) +AS_HELP_STRING( + [--disable-dependency-tracking], + [speeds up one-time build])]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH])dnl +_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl +AC_SUBST([am__nodep])dnl +_AM_SUBST_NOTMAKE([am__nodep])dnl +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[{ + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each '.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This macro actually does too much. Some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O. +m4_define([AC_PROG_CC], +m4_defn([AC_PROG_CC]) +[_AM_PROG_CC_C_O +]) + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.65])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[AC_DIAGNOSE([obsolete], + [$0: two- and three-arguments forms are deprecated.]) +m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl +dnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT. +m4_if( + m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]), + [ok:ok],, + [m4_fatal([AC_INIT should be called with package and version arguments])])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"], [Name of package]) + AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"], [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}]) +AM_MISSING_PROG([AUTOCONF], [autoconf]) +AM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}]) +AM_MISSING_PROG([AUTOHEADER], [autoheader]) +AM_MISSING_PROG([MAKEINFO], [makeinfo]) +AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +AC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl +AC_REQUIRE([AC_PROG_MKDIR_P])dnl +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +AC_SUBST([mkdir_p], ['$(MKDIR_P)']) +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl +_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])], + [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])], + [_AM_PROG_TAR([v7])])]) +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES([CC])], + [m4_define([AC_PROG_CC], + m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES([CXX])], + [m4_define([AC_PROG_CXX], + m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJC], + [_AM_DEPENDENCIES([OBJC])], + [m4_define([AC_PROG_OBJC], + m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl +AC_PROVIDE_IFELSE([AC_PROG_OBJCXX], + [_AM_DEPENDENCIES([OBJCXX])], + [m4_define([AC_PROG_OBJCXX], + m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl +]) +AC_REQUIRE([AM_SILENT_RULES])dnl +dnl The testsuite driver may need to know about EXEEXT, so add the +dnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen. This +dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below. +AC_CONFIG_COMMANDS_PRE(dnl +[m4_provide_if([_AM_COMPILER_EXEEXT], + [AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) + fi +fi +dnl The trailing newline in this macro's definition is deliberate, for +dnl backward compatibility and to allow trailing 'dnl'-style comments +dnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841. +]) + +dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not +dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further +dnl mangled by Autoconf and run in a shell conditional statement. +m4_define([_AC_COMPILER_EXEEXT], +m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])]) + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_arg=$1 +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`AS_DIRNAME(["$_am_arg"])`/stamp-h[]$_am_stamp_count]) + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi +AC_SUBST([install_sh])]) + +# Copyright (C) 2003-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- + +# Copyright (C) 1997-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it is modern enough. +# If it is, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([missing])dnl +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + AC_MSG_WARN(['missing' script is too old or missing]) +fi +]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# -------------------- +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), [1])]) + +# _AM_SET_OPTIONS(OPTIONS) +# ------------------------ +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_CC_C_O +# --------------- +# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC +# to automatically call this. +AC_DEFUN([_AM_PROG_CC_C_O], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +AC_REQUIRE_AUX_FILE([compile])dnl +AC_LANG_PUSH([C])dnl +AC_CACHE_CHECK( + [whether $CC understands -c and -o together], + [am_cv_prog_cc_c_o], + [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])]) + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i]) +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +AC_LANG_POP([C])]) + +# For backward compatibility. +AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])]) + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_RUN_LOG(COMMAND) +# ------------------- +# Run COMMAND, save the exit status in ac_status, and log it. +# (This has been adapted from Autoconf's _AC_RUN_LOG macro.) +AC_DEFUN([AM_RUN_LOG], +[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD + ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD + (exit $ac_status); }]) + +# Check to make sure that the build environment is sane. -*- Autoconf -*- + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[[\\\"\#\$\&\'\`$am_lf]]*) + AC_MSG_ERROR([unsafe absolute working directory name]);; +esac +case $srcdir in + *[[\\\"\#\$\&\'\`$am_lf\ \ ]]*) + AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken + alias in your environment]) + fi + if test "$[2]" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT([yes]) +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi +AC_CONFIG_COMMANDS_PRE( + [AC_MSG_CHECKING([that generated files are newer than configure]) + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + AC_MSG_RESULT([done])]) +rm -f conftest.file +]) + +# Copyright (C) 2009-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_SILENT_RULES([DEFAULT]) +# -------------------------- +# Enable less verbose build rules; with the default set to DEFAULT +# ("yes" being less verbose, "no" or empty being verbose). +AC_DEFUN([AM_SILENT_RULES], +[AC_ARG_ENABLE([silent-rules], [dnl +AS_HELP_STRING( + [--enable-silent-rules], + [less verbose build output (undo: "make V=1")]) +AS_HELP_STRING( + [--disable-silent-rules], + [verbose build output (undo: "make V=0")])dnl +]) +case $enable_silent_rules in @%:@ ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);; +esac +dnl +dnl A few 'make' implementations (e.g., NonStop OS and NextStep) +dnl do not support nested variable expansions. +dnl See automake bug#9928 and bug#10237. +am_make=${MAKE-make} +AC_CACHE_CHECK([whether $am_make supports nested variables], + [am_cv_make_support_nested_variables], + [if AS_ECHO([['TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi]) +if test $am_cv_make_support_nested_variables = yes; then + dnl Using '$V' instead of '$(V)' breaks IRIX make. + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AC_SUBST([AM_V])dnl +AM_SUBST_NOTMAKE([AM_V])dnl +AC_SUBST([AM_DEFAULT_V])dnl +AM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl +AC_SUBST([AM_DEFAULT_VERBOSITY])dnl +AM_BACKSLASH='\' +AC_SUBST([AM_BACKSLASH])dnl +_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl +]) + +# Copyright (C) 2001-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# AM_PROG_INSTALL_STRIP +# --------------------- +# One issue with vendor 'install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in "make install-strip", and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be 'maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +# Copyright (C) 2006-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_SUBST_NOTMAKE(VARIABLE) +# --------------------------- +# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in. +# This macro is traced by Automake. +AC_DEFUN([_AM_SUBST_NOTMAKE]) + +# AM_SUBST_NOTMAKE(VARIABLE) +# -------------------------- +# Public sister of _AM_SUBST_NOTMAKE. +AC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)]) + +# Check how to create a tarball. -*- Autoconf -*- + +# Copyright (C) 2004-2017 Free Software Foundation, Inc. +# +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# _AM_PROG_TAR(FORMAT) +# -------------------- +# Check how to create a tarball in format FORMAT. +# FORMAT should be one of 'v7', 'ustar', or 'pax'. +# +# Substitute a variable $(am__tar) that is a command +# writing to stdout a FORMAT-tarball containing the directory +# $tardir. +# tardir=directory && $(am__tar) > result.tar +# +# Substitute a variable $(am__untar) that extract such +# a tarball read from stdin. +# $(am__untar) < result.tar +# +AC_DEFUN([_AM_PROG_TAR], +[# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AC_SUBST([AMTAR], ['$${TAR-tar}']) + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' + +m4_if([$1], [v7], + [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], + + [m4_case([$1], + [ustar], + [# The POSIX 1988 'ustar' format is defined with fixed-size fields. + # There is notably a 21 bits limit for the UID and the GID. In fact, + # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343 + # and bug#13588). + am_max_uid=2097151 # 2^21 - 1 + am_max_gid=$am_max_uid + # The $UID and $GID variables are not portable, so we need to resort + # to the POSIX-mandated id(1) utility. Errors in the 'id' calls + # below are definitely unexpected, so allow the users to see them + # (that is, avoid stderr redirection). + am_uid=`id -u || echo unknown` + am_gid=`id -g || echo unknown` + AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format]) + if test $am_uid -le $am_max_uid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi + AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format]) + if test $am_gid -le $am_max_gid; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + _am_tools=none + fi], + + [pax], + [], + + [m4_fatal([Unknown tar format])]) + + AC_MSG_CHECKING([how to create a $1 tar archive]) + + # Go ahead even if we have the value already cached. We do so because we + # need to set the values for the 'am__tar' and 'am__untar' variables. + _am_tools=${am_cv_prog_tar_$1-$_am_tools} + + for _am_tool in $_am_tools; do + case $_am_tool in + gnutar) + for _am_tar in tar gnutar gtar; do + AM_RUN_LOG([$_am_tar --version]) && break + done + am__tar="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$$tardir"' + am__tar_="$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - "'"$tardir"' + am__untar="$_am_tar -xf -" + ;; + plaintar) + # Must skip GNU tar: if it does not support --format= it doesn't create + # ustar tarball either. + (tar --version) >/dev/null 2>&1 && continue + am__tar='tar chf - "$$tardir"' + am__tar_='tar chf - "$tardir"' + am__untar='tar xf -' + ;; + pax) + am__tar='pax -L -x $1 -w "$$tardir"' + am__tar_='pax -L -x $1 -w "$tardir"' + am__untar='pax -r' + ;; + cpio) + am__tar='find "$$tardir" -print | cpio -o -H $1 -L' + am__tar_='find "$tardir" -print | cpio -o -H $1 -L' + am__untar='cpio -i -H $1 -d' + ;; + none) + am__tar=false + am__tar_=false + am__untar=false + ;; + esac + + # If the value was cached, stop now. We just wanted to have am__tar + # and am__untar set. + test -n "${am_cv_prog_tar_$1}" && break + + # tar/untar a dummy directory, and stop if the command works. + rm -rf conftest.dir + mkdir conftest.dir + echo GrepMe > conftest.dir/file + AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar]) + rm -rf conftest.dir + if test -s conftest.tar; then + AM_RUN_LOG([$am__untar /dev/null 2>&1 && break + fi + done + rm -rf conftest.dir + + AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool]) + AC_MSG_RESULT([$am_cv_prog_tar_$1])]) + +AC_SUBST([am__tar]) +AC_SUBST([am__untar]) +]) # _AM_PROG_TAR + diff --git a/bootstrap/doc/re2c.1 b/bootstrap/doc/re2c.1 index b97bab1..6110556 100644 --- a/bootstrap/doc/re2c.1 +++ b/bootstrap/doc/re2c.1 @@ -43,1011 +43,1109 @@ control and customize the generated DFA. .INDENT 0.0 .TP .B \fB\-? \-h \-\-help\fP -Invoke a short help. +Show help message. .TP .B \fB\-b \-\-bit\-vectors\fP -Implies \fB\-s\fP\&. Use bit vectors as well in the -attempt to coax better code out of the compiler. Most useful for -specifications with more than a few keywords (e.g. for most programming -languages). +Optimize conditional jumps using bit masks. Implies \fB\-s\fP\&. .TP .B \fB\-c \-\-conditions\fP -Used to support (f)lex\-like condition support. +Enable support of Flex\-like "conditions": multiple interrelated lexers within one block. .TP .B \fB\-d \-\-debug\-output\fP -Creates a parser that dumps information about -the current position and in which state the parser is while parsing the -input. This is useful to debug parser issues and states. If you use this -switch you need to define a macro \fBYYDEBUG\fP that is called like a -function with two parameters: \fBvoid YYDEBUG (int state, char current)\fP\&. -The first parameter receives the state or \fB\-1\fP and the second parameter -receives the input at the current cursor. +Emit \fBYYDEBUG\fP in the generated code. +\fBYYDEBUG\fP should be defined by the user in the form of a void function with two parameters: +\fBstate\fP (lexer state or \-1) and \fBsymbol\fP (current input symbol of type \fBYYCTYPE\fP). .TP .B \fB\-D \-\-emit\-dot\fP -Emit Graphviz dot data. It can then be processed -with e.g. \fBdot \-Tpng input.dot > output.png\fP\&. Please note that -scanners with many states may crash dot. +Instead of normal output generate lexer graph in DOT format. +The output can be converted to PNG with the help of Graphviz (something like \fBdot \-Tpng \-odfa.png dfa.dot\fP). +Note that large graphs may crash Graphviz. .TP .B \fB\-e \-\-ecb\fP -Generate a parser that supports EBCDIC. The generated -code can deal with any character up to 0xFF. In this mode \fBre2c\fP assumes -that input character size is 1 byte. This switch is incompatible with -\fB\-w\fP, \fB\-x\fP, \fB\-u\fP and \fB\-8\fP\&. +Generate a lexer that reads input in EBCDIC encoding. +\fBre2c\fP assumes that character range is 0 \-\- 0xFF an character size is 1 byte. .TP .B \fB\-f \-\-storable\-state\fP -Generate a scanner with support for storable state. +Generate a lexer which can store its inner state. +This is useful in push\-model lexers which are stopped by an outer program when there is not enough input, +and then resumed when more input becomes available. +In this mode users should additionally define +\fBYYGETSTATE ()\fP and \fBYYSETSTATE (state)\fP macros +and variables \fByych\fP, \fByyaccept\fP and the \fBstate\fP as part of the lexer state. .TP .B \fB\-F \-\-flex\-syntax\fP -Partial support for flex syntax. When this flag -is active then named definitions must be surrounded by curly braces and -can be defined without an equal sign and the terminating semi colon. -Instead names are treated as direct double quoted strings. +Partial support for Flex syntax: +in this mode named definitions don\(aqt need the equal sign and the terminating semicolon, +and when used they must be surrounded by curly braces. +Names without curly braces are treated as double\-quoted strings. .TP .B \fB\-g \-\-computed\-gotos\fP -Generate a scanner that utilizes GCC\(aqs -computed goto feature. That is \fBre2c\fP generates jump tables whenever a -decision is of a certain complexity (e.g. a lot of if conditions are -otherwise necessary). This is only useable with GCC and produces output -that cannot be compiled with any other compiler. Note that this implies -\fB\-b\fP and that the complexity threshold can be configured using the -inplace configuration \fBcgoto:threshold\fP\&. +Optimize conditional jumps using non\-standard "computed goto" extension (must be supported by C/C++ compiler). +\fBre2c\fP generates jump tables only in complex cases with a lot of conditional branches. +Complexity threshold can be configured with \fBcgoto:threshold\fP configuration. +This option implies \fB\-b\fP\&. .TP .B \fB\-i \-\-no\-debug\-info\fP -Do not output \fB#line\fP information. This is -useful when you want use a CMS tool with the \fBre2c\fP output which you -might want if you do not require your users to have \fBre2c\fP themselves -when building from your source. +Do not output \fB#line\fP information. +This is useful when the generated code is tracked by some version control system. .TP .B \fB\-o OUTPUT \-\-output=OUTPUT\fP Specify the \fBOUTPUT\fP file. .TP .B \fB\-r \-\-reusable\fP -Allows reuse of scanner definitions with \fB/*!use:re2c */\fP after \fB/*!rules:re2c */\fP\&. -In this mode no \fB/*!re2c */\fP block and exactly one \fB/*!rules:re2c */\fP must be present. -The rules are being saved and used by every \fB/*!use:re2c */\fP block that follows. -These blocks can contain inplace configurations, especially \fBre2c:flags:e\fP, -\fBre2c:flags:w\fP, \fBre2c:flags:x\fP, \fBre2c:flags:u\fP and \fBre2c:flags:8\fP\&. -That way it is possible to create the same scanner multiple times for -different character types, different input mechanisms or different output mechanisms. -The \fB/*!use:re2c */\fP blocks can also contain additional rules that will be appended -to the set of rules in \fB/*!rules:re2c */\fP\&. +Allows reuse of \fBre2c\fP rules with \fB/*!rules:re2c */\fP and \fB/*!use:re2c */\fP blocks. +In this mode simple \fB/*!re2c */\fP blocks are not allowed +and exactly one \fB/*!rules:re2c */\fP block must be present. +The rules are saved and used by every \fB/*!use:re2c */\fP block that follows (which may add rules of their own). +This option allows to reuse the same set of rules with different configurations. .TP .B \fB\-s \-\-nested\-ifs\fP -Generate nested ifs for some switches. Many -compilers need this assist to generate better code. +Use nested \fBif\fP statements instead of \fBswitch\fP statements in conditional jumps. +This usually results in more efficient code with non\-optimizing C/C++ compilers. .TP .B \fB\-t HEADER \-\-type\-header=HEADER\fP -Create a \fBHEADER\fP file that -contains types for the (f)lex\-like condition support. This can only be -activated when \fB\-c\fP is in use. +Generate a \fBHEADER\fP file that contains enum with condition names. +Requires \fB\-c\fP option. +.TP +.B \fB\-T \-\-tags\fP +Enable submatch extraction with tags. +.TP +.B \fB\-P \-\-posix\-captures\fP +Enable submatch extraction with POSIX\-style capturing groups. .TP .B \fB\-u \-\-unicode\fP -Generate a parser that supports UTF\-32. The generated -code can deal with any valid Unicode character up to 0x10FFFF. In this -mode \fBre2c\fP assumes that input character size is 4 bytes. This switch is -incompatible with \fB\-e\fP, \fB\-w\fP, \fB\-x\fP and \fB\-8\fP\&. This implies \fB\-s\fP\&. +Generate a lexer that reads input in UTF\-32 encoding. +\fBre2c\fP assumes that character range is 0 \-\- 0x10FFFF and character size is 4 bytes. +Implies \fB\-s\fP\&. .TP .B \fB\-v \-\-version\fP Show version information. .TP .B \fB\-V \-\-vernum\fP -Show the version as a number XXYYZZ. +Show version information in \fBMMmmpp\fP format (major, minor, patch). .TP .B \fB\-w \-\-wide\-chars\fP -Generate a parser that supports UCS\-2. The -generated code can deal with any valid Unicode character up to 0xFFFF. -In this mode \fBre2c\fP assumes that input character size is 2 bytes. This -switch is incompatible with \fB\-e\fP, \fB\-x\fP, \fB\-u\fP and \fB\-8\fP\&. This implies -\fB\-s\fP\&. +Generate a lexer that reads input in UCS\-2 encoding. +\fBre2c\fP assumes that character range is 0 \-\- 0xFFFF and character size is 2 bytes. +Implies \fB\-s\fP\&. .TP .B \fB\-x \-\-utf\-16\fP -Generate a parser that supports UTF\-16. The generated -code can deal with any valid Unicode character up to 0x10FFFF. In this -mode \fBre2c\fP assumes that input character size is 2 bytes. This switch is -incompatible with \fB\-e\fP, \fB\-w\fP, \fB\-u\fP and \fB\-8\fP\&. This implies \fB\-s\fP\&. +Generate a lexer that reads input in UTF\-16 encoding. +\fBre2c\fP assumes that character range is 0 \-\- 0x10FFFF and character size is 2 bytes. +Implies \fB\-s\fP\&. .TP .B \fB\-8 \-\-utf\-8\fP -Generate a parser that supports UTF\-8. The generated -code can deal with any valid Unicode character up to 0x10FFFF. In this -mode \fBre2c\fP assumes that input character size is 1 byte. This switch is -incompatible with \fB\-e\fP, \fB\-w\fP, \fB\-x\fP and \fB\-u\fP\&. +Generate a lexer that reads input in UTF\-8 encoding. +\fBre2c\fP assumes that character range is 0 \-\- 0x10FFFF and character size is 1 byte. .TP .B \fB\-\-case\-insensitive\fP -All strings are case insensitive, so all -"\-expressions are treated in the same way \(aq\-expressions are. +Treat single\-quoted and double\-quoted strings as case\-insensitive. .TP .B \fB\-\-case\-inverted\fP -Invert the meaning of single and double quoted -strings. With this switch single quotes are case sensitive and double -quotes are case insensitive. +Invert the meaning of single\-quoted and double\-quoted strings: +treat single\-quoted strings as case\-sensitive and double\-quoted strings as case\-insensitive. .TP .B \fB\-\-no\-generation\-date\fP Suppress date output in the generated file. .TP -.B \fB\-\-no\-generation\-date\fP +.B \fB\-\-no\-lookahead\fP +Use TDFA(0) instead of TDFA(1). +This option only has effect with \fB\-\-tags\fP or \fB\-\-posix\-captures\fP options. +.TP +.B \fB\-\-no\-optimize\-tags\fP +Suppress optimization of tag variables (useful for debugging or benchmarking). +.TP +.B \fB\-\-no\-version\fP Suppress version output in the generated file. .TP .B \fB\-\-encoding\-policy POLICY\fP -Specify how \fBre2c\fP must treat Unicode -surrogates. \fBPOLICY\fP can be one of the following: \fBfail\fP (abort with -error when surrogate encountered), \fBsubstitute\fP (silently substitute -surrogate with error code point 0xFFFD), \fBignore\fP (treat surrogates as -normal code points). By default \fBre2c\fP ignores surrogates (for backward -compatibility). Unicode standard says that standalone surrogates are -invalid code points, but different libraries and programs treat them -differently. +Define the way \fBre2c\fP treats Unicode surrogates. +\fBPOLICY\fP can be one of the following: \fBfail\fP (abort with an error when a surrogate is encountered), +\fBsubstitute\fP (silently replace surrogates with the error code point 0xFFFD), +\fBignore\fP (default, treat surrogates as normal code points). +The Unicode standard says that standalone surrogates are invalid, +but real\-world libraries and programs behave in different ways. .TP .B \fB\-\-input INPUT\fP -Specify re2c input API. \fBINPUT\fP can be one of the -following: \fBdefault\fP, \fBcustom\fP\&. +Specify \fBre2c\fP input API. \fBINPUT\fP can be either \fBdefault\fP or \fBcustom\fP (enables the use of generic API). .TP .B \fB\-S \-\-skeleton\fP -Instead of embedding re2c\-generated code into C/C++ -source, generate a self\-contained program for the same DFA. Most useful -for correctness and performance testing. +Ignore user\-defined interface code and generate a self\-contained "skeleton" program. +Additionally, generate input files with strings derived from the regular grammar +and compressed match results that are used to verify "skeleton" behavior on all inputs. +This option is useful for finding bugs in optimizations and code generation. .TP .B \fB\-\-empty\-class POLICY\fP -What to do if user inputs empty character -class. \fBPOLICY\fP can be one of the following: \fBmatch\-empty\fP (match empty -input: pretty illogical, but this is the default for backwards -compatibility reason), \fBmatch\-none\fP (fail to match on any input), -\fBerror\fP (compilation error). Note that there are various ways to -construct empty class, e.g: [], [^\ex00\-\exFF], -[\ex00\-\exFF][\ex00\-\exFF]. -.TP -.B \fB\-\-dfa\-minimization
\fP -Internal algorithm used by re2c to minimize DFA (defaults to \fBmoore\fP). -Both table filling and Moore\(aqs algorithms should produce identical DFA (up to states relabelling). -Table filling algorithm is much simpler and slower; it serves as a reference implementation. +Define the way \fBre2c\fP treats empty character classes. +\fBPOLICY\fP can be one of the following: \fBmatch\-empty\fP (match empty input: illogical, but default behavior for backwards compatibility reasons), +\fBmatch\-none\fP (fail to match on any input), +\fBerror\fP (compilation error). +.TP +.B \fB\-\-dfa\-minimization ALGORITHM\fP +The internal algorithm used by re2c to minimize the DFA. +\fBALGORITHM\fP can be either \fBmoore\fP (Moore algorithm, the default) or \fBtable\fP (table filling algorithm). +Both algorithms should produce the same DFA up to states relabeling; +table filling is much slower and serves as a reference implementation. +.TP +.B \fB\-\-eager\-skip\fP +Make the generated lexer advance the input position "eagerly": +immediately after reading input symbol. +By default this happens after transition to the next state. +Implied by \fB\-\-no\-lookahead\fP\&. +.TP +.B \fB\-\-dump\-nfa\fP +Generate representation of NFA in DOT format and dump it on stderr. +.TP +.B \fB\-\-dump\-dfa\-raw\fP +Generate representation of DFA in DOT format under construction and dump it on stderr. +.TP +.B \fB\-\-dump\-dfa\-det\fP +Generate representation of DFA in DOT format immediately after determinization and dump it on stderr. +.TP +.B \fB\-\-dump\-dfa\-tagopt\fP +Generate representation of DFA in DOT format after tag optimizations and dump it on stderr. +.TP +.B \fB\-\-dump\-dfa\-min\fP +Generate representation of DFA in DOT format after minimization and dump it on stderr. +.TP +.B \fB\-\-dump\-adfa\fP +Generate representation of DFA in DOT format after tunneling and dump it on stderr. .TP .B \fB\-1 \-\-single\-pass\fP -Deprecated and does nothing (single pass is by default now). +Deprecated. Does nothing (single pass is the default now). +.UNINDENT +.INDENT 0.0 .TP .B \fB\-W\fP Turn on all warnings. .TP .B \fB\-Werror\fP -Turn warnings into errors. Note that this option along -doesn\(aqt turn on any warnings, it only affects those warnings that have +Turn warnings into errors. Note that this option alone +doesn\(aqt turn on any warnings; it only affects those warnings that have been turned on so far or will be turned on later. .TP .B \fB\-W\fP -Turn on individual \fBwarning\fP\&. +Turn on \fBwarning\fP\&. .TP .B \fB\-Wno\-\fP -Turn off individual \fBwarning\fP\&. +Turn off \fBwarning\fP\&. .TP .B \fB\-Werror\-\fP -Turn on individual \fBwarning\fP and treat it as error (this implies \fB\-W\fP). +Turn on \fBwarning\fP and treat it as an error (this implies \fB\-W\fP). .TP .B \fB\-Wno\-error\-\fP -Don\(aqt treat this particular \fBwarning\fP as error. This doesn\(aqt turn off +Don\(aqt treat this particular \fBwarning\fP as an error. This doesn\(aqt turn off the warning itself. +.UNINDENT +.INDENT 0.0 .TP .B \fB\-Wcondition\-order\fP Warn if the generated program makes implicit -assumptions about condition numbering. One should use either \fB\-t, \-\-type\-header\fP option or -\fB/*!types:re2c*/\fP directive to generate mapping of condition names to numbers and use -autogenerated condition names. +assumptions about condition numbering. One should use either the \fB\-t, \-\-type\-header\fP option or +the \fB/*!types:re2c*/\fP directive to generate a mapping of condition names to numbers and then use +the autogenerated condition names. .TP .B \fB\-Wempty\-character\-class\fP -Warn if regular expression contains empty -character class. From the rational point of view trying to match empty -character class makes no sense: it should always fail. However, for -backwards compatibility reasons \fBre2c\fP allows empty character class and -treats it as empty string. Use \fB\-\-empty\-class\fP option to change default -behaviour. +Warn if a regular expression contains an empty +character class. Trying to match an empty character class makes no sense: it should always fail. +However, for backwards compatibility reasons \fBre2c\fP allows empty character classes and +treats them as empty strings. Use the \fB\-\-empty\-class\fP option to change the default +behavior. .TP .B \fB\-Wmatch\-empty\-string\fP -Warn if regular expression in a rule is -nullable (matches empty string). If DFA runs in a loop and empty match -is unintentional (input position in not advanced manually), lexer may -get stuck in eternal loop. +Warn if a rule is nullable (matches an empty string). +If the lexer runs in a loop and the empty match is unintentional, +the lexer may unexpectedly hang in an infinite loop. .TP .B \fB\-Wswapped\-range\fP -Warn if range lower bound is greater that upper -bound. Default \fBre2c\fP behaviour is to silently swap range bounds. +Warn if the lower bound of a range is greater than its upper +bound. The default behavior is to silently swap the range bounds. .TP .B \fB\-Wundefined\-control\-flow\fP Warn if some input strings cause undefined -control flow in lexer (the faulty patterns are reported). This is the -most dangerous and common mistake. It can be easily fixed by adding -default rule \fB*\fP (this rule has the lowest priority, matches any code unit and consumes -exactly one code unit). +control flow in the lexer (the faulty patterns are reported). This is the +most dangerous and most common mistake. It can be easily fixed by adding +the default rule \fB*\fP which has the lowest priority, matches any code unit, and consumes +exactly one code unit. +.TP +.B \fB\-Wunreachable\-rules\fP +Warn about rules that are shadowed by other rules and will never match. .TP .B \fB\-Wuseless\-escape\fP Warn if a symbol is escaped when it shouldn\(aqt be. -By default re2c silently ignores escape, but this may as well indicate a -typo or an error in escape sequence. +By default, re2c silently ignores such escapes, but this may as well indicate a +typo or an error in the escape sequence. +.TP +.B \fB\-Wnondeterministic\-tags\fP +Warn if a tag has \fBn\fP\-th degree of nondeterminism, where \fBn\fP is greater than 1. .UNINDENT .SH INTERFACE CODE .sp -The user must supply interface code either in the form of C/C++ code -(macros, functions, variables, etc.) or in the form of \fBINPLACE CONFIGURATIONS\fP\&. -Which symbols must be defined and which are optional -depends on a particular use case. +Below is the list of all symbols which may be used by the lexer in order to interact with the outer world. +These symbols should be defined by the user, +either in the form of inplace configurations, +or as C/C++ variables, functions, macros and other language constructs. +Which primitives are necessary depends on the particular use case. .INDENT 0.0 .TP +.B \fByyaccept\fP +L\-value of unsigned integral type that is used to hold the number of the last matched rule. +Explicit definition by the user is necessary only with \fB\-f\fP \fB\-\-storable\-state\fP option. +.TP +.B \fBYYBACKUP ()\fP +Backup current input position (used only with \fB\-\-input custom\fP option). +.TP +.B \fBYYBACKUPCTX ()\fP +Backup current input position for trailing context (used only with \fB\-\-input custom\fP option). +.TP +.B \fByych\fP +L\-value of type \fBYYCTYPE\fP that is used to hold current input character. +Explicit definition by the user is necessary only with \fB\-f\fP \fB\-\-storable\-state\fP option. +.TP .B \fBYYCONDTYPE\fP -In \fB\-c\fP mode you can use \fB\-t\fP to generate a file that -contains the enumeration used as conditions. Each of the values refers -to a condition of a rule set. +The type of \fIcondition\fP identifiers (used only with \fB\-c\fP \fB\-\-conditions\fP option). +Should be generated either with \fB/*!types:re2c*/\fP directive, or with \fB\-t\fP \fB\-\-type\-header\fP option. .TP .B \fBYYCTXMARKER\fP -l\-value of type \fBYYCTYPE *\fP\&. -The generated code saves trailing context backtracking information in -\fBYYCTXMARKER\fP\&. The user only needs to define this macro if a scanner -specification uses trailing context in one or more of its regular -expressions. +L\-value of type \fBYYCTYPE *\fP that is used to backup input position of trailing context. +It is needed only if regular expressions use the lookahead operator \fB/\fP\&. .TP .B \fBYYCTYPE\fP -Type used to hold an input symbol (code unit). Usually -\fBchar\fP or \fBunsigned char\fP for ASCII, EBCDIC and UTF\-8, \fBunsigned short\fP -for UTF\-16 or UCS\-2 and \fBunsigned int\fP for UTF\-32. +The type of the input characters (\fIcode units\fP). +Usually it should be \fBunsigned char\fP for ASCII, EBCDIC and UTF\-8 encodings, +\fBunsigned short\fP for UTF\-16 or UCS\-2 encodings, +and \fBunsigned int\fP for UTF\-32 encoding. .TP .B \fBYYCURSOR\fP -l\-value of type \fBYYCTYPE *\fP that points to the current input symbol. The generated code advances -\fBYYCURSOR\fP as symbols are matched. On entry, \fBYYCURSOR\fP is assumed to -point to the first character of the current token. On exit, \fBYYCURSOR\fP -will point to the first character of the following token. -.TP -.B \fBYYDEBUG (state, current)\fP -This is only needed if the \fB\-d\fP flag was -specified. It allows one to easily debug the generated parser by calling a -user defined function for every state. The function should have the -following signature: \fBvoid YYDEBUG (int state, char current)\fP\&. The first -parameter receives the state or \-1 and the second parameter receives the -input at the current cursor. +L\-value of type \fBYYCTYPE *\fP that is used as a pointer to the current input symbol. +Initially \fBYYCURSOR\fP points to the first character and is advanced by the lexer during matching. +When a rule matches, \fBYYCURSOR\fP points past the last character of the matched string. +.TP +.B \fBYYDEBUG (state, symbol)\fP +A function\-like primitive that is used to dump debug information (only used with \fB\-d\fP \fB\-\-debug\-output\fP option). +\fBYYDEBUG\fP should return no value and accept two arguments: +\fBstate\fP (either lexer state or \fB\-1\fP) and \fBsymbol\fP (current input symbol). .TP .B \fBYYFILL (n)\fP -The generated code "calls"" \fBYYFILL (n)\fP when the -buffer needs (re)filling: at least \fBn\fP additional characters should be -provided. \fBYYFILL (n)\fP should adjust \fBYYCURSOR\fP, \fBYYLIMIT\fP, \fBYYMARKER\fP -and \fBYYCTXMARKER\fP as needed. Note that for typical programming languages -\fBn\fP will be the length of the longest keyword plus one. The user can -place a comment of the form \fB/*!max:re2c*/\fP to insert \fBYYMAXFILL\fP definition that is set to the maximum -length value. +A function\-like primitive that is called by the lexer when there is not enough input. +\fBYYFILL\fP should return no value and supply at least \fBn\fP additional characters. +Maximal value of \fBn\fP equals \fBYYMAXFILL\fP, which can be obtained with the \fB/*!max:re2c*/\fP directive. .TP .B \fBYYGETCONDITION ()\fP -This define is used to get the condition prior to -entering the scanner code when using \fB\-c\fP switch. The value must be -initialized with a value from the enumeration \fBYYCONDTYPE\fP type. +R\-value of type \fBYYCONDTYPE\fP that represents current \fIcondition\fP identifier (used only with \fB\-c\fP \fB\-\-conditions\fP option). .TP .B \fBYYGETSTATE ()\fP -The user only needs to define this macro if the \fB\-f\fP -flag was specified. In that case, the generated code "calls" -\fBYYGETSTATE ()\fP at the very beginning of the scanner in order to obtain -the saved state. \fBYYGETSTATE ()\fP must return a signed integer. The value -must be either \-1, indicating that the scanner is entered for the first -time, or a value previously saved by \fBYYSETSTATE (s)\fP\&. In the second -case, the scanner will resume operations right after where the last -\fBYYFILL (n)\fP was called. +R\-value of signed integral type that represents current lexer state (used only with \fB\-f\fP \fB\-\-storable\-state\fP option). +Initial value of lexer state should be \fB\-1\fP\&. +.TP +.B \fBYYLESSTHAN (n)\fP +R\-value of boolean type that is \fBtrue\fP if and only if there is less than \fBn\fP input characters left (used only with \fB\-\-input custom\fP option). .TP .B \fBYYLIMIT\fP -Expression of type \fBYYCTYPE *\fP that marks the end of the buffer \fBYYLIMIT[\-1]\fP -is the last character in the buffer). The generated code repeatedly -compares \fBYYCURSOR\fP to \fBYYLIMIT\fP to determine when the buffer needs -(re)filling. +R\-value of type \fBYYCTYPE *\fP that marks the end of input (\fBYYLIMIT[\-1]\fP should be the last input character). +Lexer compares \fBYYCURSOR\fP and \fBYYLIMIT\fP in order to determine if there is enough input characters left. .TP .B \fBYYMARKER\fP -l\-value of type \fBYYCTYPE *\fP\&. -The generated code saves backtracking information in \fBYYMARKER\fP\&. Some -easy scanners might not use this. +L\-value of type \fBYYCTYPE *\fP used to backup input position of successful match. +This might be necessary if there is an overlapping longer rule that might also match. +.TP +.B \fBYYMTAGP (t)\fP +Append current input position to the history of \fIm\-tag\fP \fBt\fP (used only with \fB\-T\fP \fB\-\-tags\fP option). +.TP +.B \fBYYMTAGN (t)\fP +Append default value to the history of \fIm\-tag\fP \fBt\fP (used only with \fB\-T\fP \fB\-\-tags\fP option). .TP .B \fBYYMAXFILL\fP -This will be automatically defined by \fB/*!max:re2c*/\fP blocks as explained above. -.TP -.B \fBYYSETCONDITION (c)\fP -This define is used to set the condition in -transition rules. This is only being used when \fB\-c\fP is active and -transition rules are being used. -.TP -.B \fBYYSETSTATE (s)\fP -The user only needs to define this macro if the \fB\-f\fP -flag was specified. In that case, the generated code "calls" -\fBYYSETSTATE\fP just before calling \fBYYFILL (n)\fP\&. The parameter to -\fBYYSETSTATE\fP is a signed integer that uniquely identifies the specific -instance of \fBYYFILL (n)\fP that is about to be called. Should the user -wish to save the state of the scanner and have \fBYYFILL (n)\fP return to -the caller, all he has to do is store that unique identifer in a -variable. Later, when the scannered is called again, it will call -\fBYYGETSTATE ()\fP and resume execution right where it left off. The -generated code will contain both \fBYYSETSTATE (s)\fP and \fBYYGETSTATE\fP even -if \fBYYFILL (n)\fP is being disabled. +Integral constant that denotes maximal value of \fBYYFILL\fP argument +and is autogenerated by \fB/*!max:re2c*/\fP directive. +.TP +.B \fBYYMAXNMATCH\fP +Integral constant that denotes maximal number of capturing groups in a rule +and is autogenerated by \fB/*!maxnmatch:re2c*/\fP directive (used only with \fB\-\-posix\-captures\fP option). +.TP +.B \fByynmatch\fP +L\-value of unsigned integral type that is used to hold the number of capturing groups in the matching rule. +Used only with \fB\-P\fP \fB\-\-posix\-captures\fP option. +.TP +.B \fBYYPEEK ()\fP +R\-value of type \fBYYCTYPE\fP that denotes current input character (used only with \fB\-\-input custom\fP option). +.TP +.B \fByypmatch\fP +An array of l\-values that are used to hold the values of \fIs\-tags\fP +corresponding to the capturing parentheses in the matching rule. +The length of array must be at least \fByynmatch * 2\fP (ideally \fBYYMAXNMATCH * 2\fP). +Used only with \fB\-P\fP \fB\-\-posix\-captures\fP option. +.TP +.B \fBYYRESTORE ()\fP +Restore input position (used only with \fB\-\-input custom\fP option). +.TP +.B \fBYYRESTORECTX ()\fP +Restore input position from the value of trailing context (used only with \fB\-\-input custom\fP option). +.TP +.B \fBYYRESTORETAG (t)\fP +Restore input position from the value of \fIs\-tag\fP \fBt\fP (used only with \fB\-\-input custom\fP option). +.TP +.B \fBYYSETCONDITION (condition)\fP +Set current \fIcondition\fP identifier to \fBcondition\fP (used only with \fB\-c\fP \fB\-\-conditions\fP option). +.TP +.B \fBYYSETSTATE (state)\fP +Set current lexer state to \fBstate\fP (used only with \fB\-f\fP \fB\-\-storable\-state\fP option). +Parameter \fBstate\fP is of signed integral type. +.TP +.B \fBYYSKIP ()\fP +Advance input position to the next character (used only with generic API). +.TP +.B \fBYYSTAGP (t)\fP +Save current input position to \fIs\-tag\fP \fBt\fP (used only with \fB\-T\fP \fB\-\-tags\fP and \fB\-\-input custom\fP option). +.TP +.B \fBYYSTAGN (t)\fP +Save default value to \fIs\-tag\fP \fBt\fP (used only with \fB\-T\fP \fB\-\-tags\fP and \fB\-\-input custom\fP options). .UNINDENT .SH SYNTAX .sp -Code for \fBre2c\fP consists of a set of \fBRULES\fP, \fBNAMED DEFINITIONS\fP and -\fBINPLACE CONFIGURATIONS\fP\&. +A program can contain any number of \fBre2c\fP blocks. +Each block consists of a sequence of \fBRULES\fP, \fBNAMED DEFINITIONS\fP and \fBINPLACE CONFIGURATIONS\fP\&. .SS RULES .sp -Rules consist of a regular expression (see \fBREGULAR EXPRESSIONS\fP) along with a block of C/C++ code -that is to be executed when the associated regular expression is -matched. You can either start the code with an opening curly brace or -the sequence \fB:=\fP\&. When the code with a curly brace then \fBre2c\fP counts the brace depth -and stops looking for code automatically. Otherwise curly braces are not -allowed and \fBre2c\fP stops looking for code at the first line that does -not begin with whitespace. If two or more rules overlap, the first rule -is preferred. -.INDENT 0.0 -.INDENT 3.5 -\fBregular\-expression { C/C++ code }\fP -.sp -\fBregular\-expression := C/C++ code\fP -.UNINDENT -.UNINDENT -.sp -There is one special rule: default rule \fB*\fP -.INDENT 0.0 -.INDENT 3.5 -\fB* { C/C++ code }\fP -.sp -\fB* := C/C++ code\fP -.UNINDENT -.UNINDENT -.sp -Note that default rule \fB*\fP differs from \fB[^]\fP: default rule has the lowest priority, -matches any code unit (either valid or invalid) and always consumes one character; -while \fB[^]\fP matches any valid code point (not code unit) and can consume multiple -code units. In fact, when variable\-length encoding is used, \fB*\fP -is the only possible way to match invalid input character (see \fBENCODINGS\fP for details). -.sp -If \fB\-c\fP is active then each regular expression is preceded by a list -of comma separated condition names. Besides normal naming rules there -are two special cases: \fB<*>\fP (such rules are merged to all conditions) -and \fB<>\fP (such the rule cannot have an associated regular expression, -its code is merged to all actions). Non empty rules may further more specify the new -condition. In that case \fBre2c\fP will generate the necessary code to -change the condition automatically. Rules can use \fB:=>\fP as a shortcut -to automatically generate code that not only sets the -new condition state but also continues execution with the new state. A -shortcut rule should not be used in a loop where there is code between -the start of the loop and the \fBre2c\fP block unless \fBre2c:cond:goto\fP -is changed to \fBcontinue\fP\&. If code is necessary before all rules (though not simple jumps) you -can doso by using \fB\fP pseudo\-rules. -.INDENT 0.0 -.INDENT 3.5 -\fB regular\-expression { C/C++ code }\fP -.sp -\fB regular\-expression := C/C++ code\fP -.sp -\fB * { C/C++ code }\fP -.sp -\fB * := C/C++ code\fP -.sp -\fB regular\-expression => condition { C/C++ code }\fP -.sp -\fB regular\-expression => condition := C/C++ code\fP -.sp -\fB * => condition { C/C++ code }\fP -.sp -\fB * => condition := C/C++ code\fP -.sp -\fB regular\-expression :=> condition\fP -.sp -\fB<*> regular\-expression { C/C++ code }\fP -.sp -\fB<*> regular\-expression := C/C++ code\fP -.sp -\fB<*> * { C/C++ code }\fP -.sp -\fB<*> * := C/C++ code\fP -.sp -\fB<*> regular\-expression => condition { C/C++ code }\fP -.sp -\fB<*> regular\-expression => condition := C/C++ code\fP -.sp -\fB<*> * => condition { C/C++ code }\fP -.sp -\fB<*> * => condition := C/C++ code\fP -.sp -\fB<*> regular\-expression :=> condition\fP -.sp -\fB<> { C/C++ code }\fP -.sp -\fB<> := C/C++ code\fP -.sp -\fB<> => condition { C/C++ code }\fP -.sp -\fB<> => condition := C/C++ code\fP -.sp -\fB<> :=> condition\fP +Rules consist of a regular expression followed by a user\-defined action: +a block of C/C++ code that is executed in case of sucessful match. +Action can be either an arbitrary block of code enclosed in curly braces \fB{\fP and \fB}\fP +or a block of code without curly braces preceded with \fB:=\fP and ended with a newline that is not followed by a whitespace. .sp -\fB<> :=> condition\fP +If multiple rules match, \fBre2c\fP prefers the longest match. +If rules match the same string, the earlier rule has priority. .sp -\fB { C/C++ code }\fP +There is one special kind of rule: the \fIdefault rule\fP with \fB*\fP instead of the regular expression. +It always has the lowest priority, matches any \fIcode unit\fP (either valid or invalid) and consumes exactly one \fIcode unit\fP\&. +Note that \fIdefault rule\fP is not the same as \fB[^]\fP, which +matches any valid \fIcode point\fP and can consume multiple \fIcode units\fP\&. +In case of variable\-length encodings \fB*\fP is the only possible way to match invalid input character. .sp -\fB := C/C++ code\fP -.sp -\fB { C/C++ code }\fP -.sp -\fB := C/C++ code\fP -.UNINDENT -.UNINDENT +If \fB\-c\fP \fB\-\-conditions\fP option is used, then rules have more complex form +described in the section about conditions. .SS NAMED DEFINITIONS .sp -Named definitions are of the form: -.INDENT 0.0 -.INDENT 3.5 -\fBname = regular\-expression;\fP -.UNINDENT -.UNINDENT -.sp -If \fB\-F\fP is active, then named definitions are also of the form: -.INDENT 0.0 -.INDENT 3.5 -\fBname { regular\-expression }\fP -.UNINDENT -.UNINDENT +Named definitions are of the form \fBname = regexp ;\fP +where \fBname\fP is an identifier that consists of letters, digits and underscores, +and \fBregexp\fP is a regular expression. +With \fB\-F\fP \fB\-\-flex\-syntax\fP option named definitions are also of the form \fBname regexp\fP\&. +Each name should be defined before it is used. .SS INPLACE CONFIGURATIONS .INDENT 0.0 .TP -.B \fBre2c:condprefix = yyc;\fP -Allows one to specify the prefix used for -condition labels. That is this text is prepended to any condition label -in the generated output file. -.TP -.B \fBre2c:condenumprefix = yyc;\fP -Allows one to specify the prefix used for -condition values. That is this text is prepended to any condition enum -value in the generated output file. +.B \fBre2c:cgoto:threshold = 9;\fP +With \fB\-g\fP \fB\-\-computed\-gotos\fP option this value specifies +the complexity threshold that triggers the generation of jump tables rather +than nested \fBif\fP statements and bit masks. .TP -.B \fBre2c:cond:divider = "/* *********************************** */";\fP -Allows one to customize the devider for condition blocks. You can use \fB@@\fP -to put the name of the condition or customize the placeholder using -\fBre2c:cond:divider@cond\fP\&. +.B \fBre2c:cond:divider = \(aq/* *********************************** */\(aq;\fP +Allows to customize the divider for condition blocks. One can use \fB@@\fP to insert condition name. .TP .B \fBre2c:cond:divider@cond = @@;\fP -Specifies the placeholder that will be -replaced with the condition name in \fBre2c:cond:divider\fP\&. +Specifies the placeholder that will be replaced with condition name in \fBre2c:cond:divider\fP\&. .TP -.B \fBre2c:cond:goto = "goto @@;";\fP -Allows one to customize the condition goto statements used with \fB:=>\fP style rules. You can use \fB@@\fP -to put the name of the condition or ustomize the placeholder using -\fBre2c:cond:goto@cond\fP\&. You can also change this to \fBcontinue;\fP, which -would allow you to continue with the next loop cycle including any code -between loop start and re2c block. +.B \fBre2c:condenumprefix = yyc;\fP +Specifies the prefix used for condition identifiers. .TP .B \fBre2c:cond:goto@cond = @@;\fP -Spcifies the placeholder that will be replaced with the condition label in \fBre2c:cond:goto\fP\&. +Specifies the placeholder that will be replaced with condition label in \fBre2c:cond:goto\fP\&. .TP -.B \fBre2c:indent:top = 0;\fP -Specifies the minimum number of indentation to -use. Requires a numeric value greater than or equal zero. +.B \fBre2c:cond:goto = \(aqgoto @@;\(aq;\fP +Allows to customize \fBgoto\fP statements used with \fB:=>\fP style rules. +One can use \fB@@\fP to insert the condition name. .TP -.B \fBre2c:indent:string = "\et";\fP -Specifies the string to use for indentation. Requires a string that should -contain only whitespace unless you need this for external tools. The easiest -way to specify spaces is to enclude them in single or double quotes. -If you do not want any indentation at all you can simply set this to "". +.B \fBre2c:condprefix = yyc;\fP +Specifies the prefix used for condition labels. .TP -.B \fBre2c:yych:conversion = 0;\fP -When this setting is non zero, then \fBre2c\fP automatically generates -conversion code whenever yych gets read. In this case the type must be -defined using \fBre2c:define:YYCTYPE\fP\&. +.B \fBre2c:define:YYBACKUPCTX = \(aqYYBACKUPCTX\(aq;\fP +Replaces \fBYYBACKUPCTX\fP identifier with the specified string. .TP -.B \fBre2c:yych:emit = 1;\fP -Generation of \fByych\fP can be suppressed by setting this to 0. +.B \fBre2c:define:YYBACKUP = \(aqYYBACKUP\(aq;\fP +Replaces \fBYYBACKUP\fP identifier with the specified string. .TP -.B \fBre2c:yybm:hex = 0;\fP -If set to zero then a decimal table is being used else a hexadecimal table will be generated. +.B \fBre2c:define:YYCONDTYPE = \(aqYYCONDTYPE\(aq;\fP +Enumeration type used for condition identifiers. .TP -.B \fBre2c:yyfill:enable = 1;\fP -Set this to zero to suppress generation of \fBYYFILL (n)\fP\&. When using this be sure to verify that the generated -scanner does not read behind input. Allowing this behavior might -introduce sever security issues to you programs. +.B \fBre2c:define:YYCTXMARKER = \(aqYYCTXMARKER\(aq;\fP +Replaces the \fBYYCTXMARKER\fP placeholder with the specified identifier. .TP -.B \fBre2c:yyfill:check = 1;\fP -This can be set 0 to suppress output of the -pre condition using \fBYYCURSOR\fP and \fBYYLIMIT\fP which becomes useful when -\fBYYLIMIT + YYMAXFILL\fP is always accessible. +.B \fBre2c:define:YYCTYPE = \(aqYYCTYPE\(aq;\fP +Replaces the \fBYYCTYPE\fP placeholder with the specified type. .TP -.B \fBre2c:define:YYFILL = "YYFILL";\fP -Substitution for \fBYYFILL\fP\&. Note -that by default \fBre2c\fP generates argument in braces and semicolon after -\fBYYFILL\fP\&. If you need to make \fBYYFILL\fP an arbitrary statement rather -than a call, set \fBre2c:define:YYFILL:naked\fP to non\-zero and use -\fBre2c:define:YYFILL@len\fP to denote formal parameter inside of \fBYYFILL\fP -body. +.B \fBre2c:define:YYCURSOR = \(aqYYCURSOR\(aq;\fP +Replaces the \fBYYCURSOR\fP placeholder with the specified identifier. .TP -.B \fBre2c:define:YYFILL@len = "@@";\fP -Any occurrence of this text -inside of \fBYYFILL\fP will be replaced with the actual argument. +.B \fBre2c:define:YYDEBUG = \(aqYYDEBUG\(aq;\fP +Replaces the \fBYYDEBUG\fP placeholder with the specified identifier. .TP -.B \fBre2c:yyfill:parameter = 1;\fP -Controls argument in braces after -\fBYYFILL\fP\&. If zero, agrument is omitted. If non\-zero, argument is -generated unless \fBre2c:define:YYFILL:naked\fP is set to non\-zero. +.B \fBre2c:define:YYFILL@len = \(aq@@\(aq;\fP +Any occurrence of this text inside of a \fBYYFILL\fP will be replaced with the actual argument. .TP .B \fBre2c:define:YYFILL:naked = 0;\fP -Controls argument in braces and -semicolon after \fBYYFILL\fP\&. If zero, both agrument and semicolon are -omitted. If non\-zero, argument is generated unless -\fBre2c:yyfill:parameter\fP is set to zero and semicolon is generated -unconditionally. +Controls the argument in the parentheses after \fBYYFILL\fP and the following semicolon. +If zero, both the argument and the semicolon are omitted. +If non\-zero, the argument is generated unless \fBre2c:yyfill:parameter\fP is set to zero; +the semicolon is generated unconditionally. .TP -.B \fBre2c:startlabel = 0;\fP -If set to a non zero integer then the start -label of the next scanner blocks will be generated even if not used by -the scanner itself. Otherwise the normal \fByy0\fP like start label is only -being generated if needed. If set to a text value then a label with that -text will be generated regardless of whether the normal start label is -being used or not. This setting is being reset to 0 after a start -label has been generated. +.B \fBre2c:define:YYFILL = \(aqYYFILL\(aq;\fP +Define a substitution for \fBYYFILL\fP\&. +By default re2c generates an argument in parentheses and a semicolon after \fBYYFILL\fP\&. +If you need to make \fBYYFILL\fP an arbitrary statement rather than a call, +set \fBre2c:define:YYFILL:naked\fP to a non\-zero value. .TP -.B \fBre2c:labelprefix = "yy";\fP -Allows one to change the prefix of numbered -labels. The default is \fByy\fP and can be set any string that is a valid -label. +.B \fBre2c:define:YYGETCONDITION:naked = 0;\fP +Controls the parentheses after \fBYYGETCONDITION\fP\&. +If zero, the parentheses are omitted. If non\-zero, the parentheses are generated. .TP -.B \fBre2c:state:abort = 0;\fP -When not zero and switch \fB\-f\fP is active then -the \fBYYGETSTATE\fP block will contain a default case that aborts and a \-1 -case is used for initialization. +.B \fBre2c:define:YYGETCONDITION = \(aqYYGETCONDITION\(aq;\fP +Substitution for \fBYYGETCONDITION\fP\&. +By default re2c generates parentheses after \fBYYGETCONDITION\fP\&. +Set \fBre2c:define:YYGETCONDITION:naked\fP to non\-zero in order to omit the parentheses. .TP -.B \fBre2c:state:nextlabel = 0;\fP -Used when \fB\-f\fP is active to control -whether the \fBYYGETSTATE\fP block is followed by a \fByyNext:\fP label line. -Instead of using \fByyNext\fP you can usually also use configuration -\fBstartlabel\fP to force a specific start label or default to \fByy0\fP as -start label. Instead of using a dedicated label it is often better to -separate the \fBYYGETSTATE\fP code from the actual scanner code by placing a -\fB/*!getstate:re2c*/\fP comment. +.B \fBre2c:define:YYGETSTATE:naked = 0;\fP +Controls the parentheses that follow \fBYYGETSTATE\fP\&. +If zero, the parentheses are omitted. If non\-zero, they are generated. .TP -.B \fBre2c:cgoto:threshold = 9;\fP -When \fB\-g\fP is active this value specifies -the complexity threshold that triggers generation of jump tables rather -than using nested if\(aqs and decision bitfields. The threshold is compared -against a calculated estimation of if\-s needed where every used bitmap -divides the threshold by 2. +.B \fBre2c:define:YYGETSTATE = \(aqYYGETSTATE\(aq;\fP +Substitution for \fBYYGETSTATE\fP\&. +By default re2c generates parentheses after \fBYYGETSTATE\fP\&. +Set \fBre2c:define:YYGETSTATE:naked\fP to non\-zero to omit the parentheses. .TP -.B \fBre2c:yych:conversion = 0;\fP -When the input uses signed characters and -\fB\-s\fP or \fB\-b\fP switches are in effect re2c allows one to automatically convert -to the unsigned character type that is then necessary for its internal -single character. When this setting is zero or an empty string the -conversion is disabled. Using a non zero number the conversion is taken -from \fBYYCTYPE\fP\&. If that is given by an inplace configuration that value -is being used. Otherwise it will be \fB(YYCTYPE)\fP and changes to that -configuration are no longer possible. When this setting is a string the -braces must be specified. Now assuming your input is a \fBchar *\fP -buffer and you are using above mentioned switches you can set -\fBYYCTYPE\fP to \fBunsigned char\fP and this setting to either 1 or \fB(unsigned char)\fP\&. -.TP -.B \fBre2c:define:YYCONDTYPE = "YYCONDTYPE";\fP -Enumeration used for condition support with \fB\-c\fP mode. -.TP -.B \fBre2c:define:YYCTXMARKER = "YYCTXMARKER";\fP -Allows one to overwrite the -define \fBYYCTXMARKER\fP and thus avoiding it by setting the value to the -actual code needed. -.TP -.B \fBre2c:define:YYCTYPE = "YYCTYPE";\fP -Allows one to overwrite the define -\fBYYCTYPE\fP and thus avoiding it by setting the value to the actual code -needed. -.TP -.B \fBre2c:define:YYCURSOR = "YYCURSOR";\fP -Allows one to overwrite the define -\fBYYCURSOR\fP and thus avoiding it by setting the value to the actual code -needed. -.TP -.B \fBre2c:define:YYDEBUG = "YYDEBUG";\fP -Allows one to overwrite the define -\fBYYDEBUG\fP and thus avoiding it by setting the value to the actual code -needed. -.TP -.B \fBre2c:define:YYGETCONDITION = "YYGETCONDITION";\fP -Substitution for -\fBYYGETCONDITION\fP\&. Note that by default \fBre2c\fP generates braces after -\fBYYGETCONDITION\fP\&. Set \fBre2c:define:YYGETCONDITION:naked\fP to non\-zero to -omit braces. +.B \fBre2c:define:YYLESSTHAN = \(aqYYLESSTHAN\(aq;\fP +Replaces \fBYYLESSTHAN\fP identifier with the specified string. .TP -.B \fBre2c:define:YYGETCONDITION:naked = 0;\fP -Controls braces after -\fBYYGETCONDITION\fP\&. If zero, braces are omitted. If non\-zero, braces are -generated. +.B \fBre2c:define:YYLIMIT = \(aqYYLIMIT\(aq;\fP +Replaces the \fBYYLIMIT\fP placeholder with the specified identifier. .TP -.B \fBre2c:define:YYSETCONDITION = "YYSETCONDITION";\fP -Substitution for -\fBYYSETCONDITION\fP\&. Note that by default \fBre2c\fP generates argument in -braces and semicolon after \fBYYSETCONDITION\fP\&. If you need to make -\fBYYSETCONDITION\fP an arbitrary statement rather than a call, set -\fBre2c:define:YYSETCONDITION:naked\fP to non\-zero and use -\fBre2c:define:YYSETCONDITION@cond\fP to denote formal parameter inside of -\fBYYSETCONDITION\fP body. +.B \fBre2c:define:YYMARKER = \(aqYYMARKER\(aq;\fP +Replaces the \fBYYMARKER\fP placeholder with the specified identifier. .TP -.B \fBre2c:define:YYSETCONDITION@cond = "@@";\fP +.B \fBre2c:define:YYMTAGN = \(aqYYMTAGN\(aq;\fP +Replaces \fBYYMTAGN\fP identifier with the specified string. +.TP +.B \fBre2c:define:YYMTAGP = \(aqYYMTAGP\(aq;\fP +Replaces \fBYYMTAGP\fP identifier with the specified string. +.TP +.B \fBre2c:define:YYPEEK = \(aqYYPEEK\(aq;\fP +Replaces \fBYYPEEK\fP identifier with the specified string. +.TP +.B \fBre2c:define:YYRESTORECTX = \(aqYYRESTORECTX\(aq;\fP +Replaces \fBYYRESTORECTX\fP identifier with the specified string. +.TP +.B \fBre2c:define:YYRESTORE = \(aqYYRESTORE\(aq;\fP +Replaces \fBYYRESTORE\fP identifier with the specified string. +.TP +.B \fBre2c:define:YYRESTORETAG = \(aqYYRESTORETAG\(aq;\fP +Replaces \fBYYRESTORETAG\fP identifier with the specified string. +.TP +.B \fBre2c:define:YYSETCONDITION@cond = \(aq@@\(aq;\fP Any occurrence of this -text inside of \fBYYSETCONDITION\fP will be replaced with the actual -argument. +text inside of \fBYYSETCONDITION\fP will be replaced with the actual argument. .TP .B \fBre2c:define:YYSETCONDITION:naked = 0;\fP -Controls argument in braces -and semicolon after \fBYYSETCONDITION\fP\&. If zero, both agrument and -semicolon are omitted. If non\-zero, both argument and semicolon are +Controls the argument in parentheses +and the semicolon after \fBYYSETCONDITION\fP\&. If zero, both the argument and +the semicolon are omitted. If non\-zero, both the argument and the semicolon are generated. .TP -.B \fBre2c:define:YYGETSTATE = "YYGETSTATE";\fP +.B \fBre2c:define:YYSETCONDITION = \(aqYYSETCONDITION\(aq;\fP Substitution for -\fBYYGETSTATE\fP\&. Note that by default \fBre2c\fP generates braces after -\fBYYGETSTATE\fP\&. Set \fBre2c:define:YYGETSTATE:naked\fP to non\-zero to omit -braces. +\fBYYSETCONDITION\fP\&. By default re2c generates an argument in +parentheses followed by semicolon after \fBYYSETCONDITION\fP\&. If you need to make +\fBYYSETCONDITION\fP an arbitrary statement rather than a call, set +\fBre2c:define:YYSETCONDITION:naked\fP to non\-zero. .TP -.B \fBre2c:define:YYGETSTATE:naked = 0;\fP -Controls braces after -\fBYYGETSTATE\fP\&. If zero, braces are omitted. If non\-zero, braces are -generated. +.B \fBre2c:define:YYSETSTATE:naked = 0;\fP +Controls the argument in parentheses and the +semicolon after \fBYYSETSTATE\fP\&. If zero, both argument and the semicolon are +omitted. If non\-zero, both the argument and the semicolon are generated. .TP -.B \fBre2c:define:YYSETSTATE = "YYSETSTATE";\fP +.B \fBre2c:define:YYSETSTATE@state = \(aq@@\(aq;\fP +Any occurrence of this text +inside of \fBYYSETSTATE\fP will be replaced with the actual argument. +.TP +.B \fBre2c:define:YYSETSTATE = \(aqYYSETSTATE\(aq;\fP Substitution for -\fBYYSETSTATE\fP\&. Note that by default \fBre2c\fP generates argument in braces -and semicolon after \fBYYSETSTATE\fP\&. If you need to make \fBYYSETSTATE\fP an +\fBYYSETSTATE\fP\&. By default re2c generates an argument in parentheses +followed by a semicolon after \fBYYSETSTATE\fP\&. If you need to make \fBYYSETSTATE\fP an arbitrary statement rather than a call, set -\fBre2c:define:YYSETSTATE:naked\fP to non\-zero and use -\fBre2c:define:YYSETSTATE@cond\fP to denote formal parameter inside of -\fBYYSETSTATE\fP body. +\fBre2c:define:YYSETSTATE:naked\fP to non\-zero. .TP -.B \fBre2c:define:YYSETSTATE@state = "@@";\fP -Any occurrence of this text -inside of \fBYYSETSTATE\fP will be replaced with the actual argument. +.B \fBre2c:define:YYSKIP = \(aqYYSKIP\(aq;\fP +Replaces \fBYYSKIP\fP identifier with the specified string. .TP -.B \fBre2c:define:YYSETSTATE:naked = 0;\fP -Controls argument in braces and -semicolon after \fBYYSETSTATE\fP\&. If zero, both agrument and semicolon are -omitted. If non\-zero, both argument and semicolon are generated. +.B \fBre2c:define:YYSTAGN = \(aqYYSTAGN\(aq;\fP +Replaces \fBYYSTAGN\fP identifier with the specified string. .TP -.B \fBre2c:define:YYLIMIT = "YYLIMIT";\fP -Allows one to overwrite the define -\fBYYLIMIT\fP and thus avoiding it by setting the value to the actual code -needed. +.B \fBre2c:define:YYSTAGP = \(aqYYSTAGP\(aq;\fP +Replaces \fBYYSTAGP\fP identifier with the specified string. .TP -.B \fBre2c:define:YYMARKER = "YYMARKER";\fP -Allows one to overwrite the define -\fBYYMARKER\fP and thus avoiding it by setting the value to the actual code -needed. +.B \fBre2c:flags:8\fP or \fBre2c:flags:utf\-8\fP +Same as \fB\-8 \-\-utf\-8\fP command\-line option. .TP -.B \fBre2c:label:yyFillLabel = "yyFillLabel";\fP -Allows one to overwrite the name of the label \fByyFillLabel\fP\&. +.B \fBre2c:flags:b\fP or \fBre2c:flags:bit\-vectors\fP +Same as \fB\-b \-\-bit\-vectors\fP command\-line option. .TP -.B \fBre2c:label:yyNext = "yyNext";\fP -Allows one to overwrite the name of the label \fByyNext\fP\&. +.B \fBre2c:flags:case\-insensitive = 0;\fP +Same as \fB\-\-case\-insensitive\fP command\-line option. .TP -.B \fBre2c:variable:yyaccept = yyaccept;\fP -Allows one to overwrite the name of the variable \fByyaccept\fP\&. +.B \fBre2c:flags:case\-inverted = 0;\fP +Same as \fB\-\-case\-inverted\fP command\-line option. .TP -.B \fBre2c:variable:yybm = "yybm";\fP -Allows one to overwrite the name of the variable \fByybm\fP\&. +.B \fBre2c:flags:d\fP or \fBre2c:flags:debug\-output\fP +Same as \fB\-d \-\-debug\-output\fP command\-line option. .TP -.B \fBre2c:variable:yych = "yych";\fP -Allows one to overwrite the name of the variable \fByych\fP\&. +.B \fBre2c:flags:dfa\-minimization = \(aqmoore\(aq;\fP +Same as \fB\-\-dfa\-minimization\fP command\-line option. .TP -.B \fBre2c:variable:yyctable = "yyctable";\fP -When both \fB\-c\fP and \fB\-g\fP are active then \fBre2c\fP uses this variable to generate a static jump table -for \fBYYGETCONDITION\fP\&. +.B \fBre2c:flags:eager\-skip = 0;\fP +Same as \fB\-\-eager\-skip\fP command\-line option. .TP -.B \fBre2c:variable:yystable = "yystable";\fP -Deprecated. +.B \fBre2c:flags:e\fP or \fBre2c:flags:ecb\fP +Same as \fB\-e \-\-ecb\fP command\-line option. .TP -.B \fBre2c:variable:yytarget = "yytarget";\fP -Allows one to overwrite the name of the variable \fByytarget\fP\&. -.UNINDENT -.SS REGULAR EXPRESSIONS -.INDENT 0.0 +.B \fBre2c:flags:empty\-class = \(aqmatch\-empty\(aq;\fP +Same as \fB\-\-empty\-class\fP command\-line option. .TP -.B \fB"foo"\fP -literal string \fB"foo"\fP\&. ANSI\-C escape sequences can be used. +.B \fBre2c:flags:encoding\-policy = \(aqignore\(aq;\fP +Same as \fB\-\-encoding\-policy\fP command\-line option. .TP -.B \fB\(aqfoo\(aq\fP -literal string \fB"foo"\fP (characters [a\-zA\-Z] treated -case\-insensitive). ANSI\-C escape sequences can be used. +.B \fBre2c:flags:g\fP or \fBre2c:flags:computed\-gotos\fP +Same as \fB\-g \-\-computed\-gotos\fP command\-line option. .TP -.B \fB[xyz]\fP -character class; in this case, regular expression matches either \fBx\fP, \fBy\fP, or \fBz\fP\&. +.B \fBre2c:flags:i\fP or \fBre2c:flags:no\-debug\-info\fP +Same as \fB\-i \-\-no\-debug\-info\fP command\-line option. .TP -.B \fB[abj\-oZ]\fP -character class with a range in it; matches \fBa\fP, \fBb\fP, any letter from \fBj\fP through \fBo\fP or \fBZ\fP\&. +.B \fBre2c:flags:input = \(aqdefault\(aq;\fP +Same as \fB\-\-input\fP command\-line option. .TP -.B \fB[^class]\fP -inverted character class. +.B \fBre2c:flags:lookahead = 1;\fP +Same as inverted \fB\-\-no\-lookahead\fP command\-line option. .TP -.B \fBr \e s\fP -match any \fBr\fP which isn\(aqt \fBs\fP\&. \fBr\fP and \fBs\fP must be regular expressions -which can be expressed as character classes. +.B \fBre2c:flags:optimize\-tags = 1;\fP +Same as inverted \fB\-\-no\-optimize\-tags\fP command\-line option. .TP -.B \fBr*\fP -zero or more occurrences of \fBr\fP\&. +.B \fBre2c:flags:P\fP or \fBre2c:flags:posix\-captures\fP +Same as \fB\-P \-\-posix\-captures\fP command\-line option. .TP -.B \fBr+\fP -one or more occurrences of \fBr\fP\&. +.B \fBre2c:flags:s\fP or \fBre2c:flags:nested\-ifs\fP +Same as \fB\-s \-\-nested\-ifs\fP command\-line option. .TP -.B \fBr?\fP -optional \fBr\fP\&. +.B \fBre2c:flags:T\fP or \fBre2c:flags:tags\fP +Same as \fB\-T \-\-tags\fP command\-line option. .TP -.B \fB(r)\fP -\fBr\fP; parentheses are used to override precedence. +.B \fBre2c:flags:u\fP or \fBre2c:flags:unicode\fP +Same as \fB\-u \-\-unicode\fP command\-line option. .TP -.B \fBr s\fP -\fBr\fP followed by \fBs\fP (concatenation). +.B \fBre2c:flags:w\fP or \fBre2c:flags:wide\-chars\fP +Same as \fB\-w \-\-wide\-chars\fP command\-line option. .TP -.B \fBr | s\fP -either \fBr\fP or \fBs\fP (alternative). +.B \fBre2c:flags:x\fP or \fBre2c:flags:utf\-16\fP +Same as \fB\-x \-\-utf\-16\fP command\-line option. .TP -.B \fBr\fP / \fBs\fP -\fBr\fP but only if it is followed by \fBs\fP\&. Note that \fBs\fP is not -part of the matched text. This type of regular expression is called -"trailing context". Trailing context can only be the end of a rule -and not part of a named definition. +.B \fBre2c:indent:string = \(aq\et\(aq;\fP +Specifies the string to use for indentation. Requires a string that contains +only whitespace (unless you need something else for external tools). The easiest +way to specify spaces is to enclose them in single or double quotes. +If you do not want any indentation at all, you can set this to \(aq\(aq. .TP -.B \fBr{n}\fP -matches \fBr\fP exactly \fBn\fP times. +.B \fBre2c:indent:top = 0;\fP +Specifies the minimum amount of indentation to +use. Requires a numeric value greater than or equal to zero. .TP -.B \fBr{n,}\fP -matches \fBr\fP at least \fBn\fP times. +.B \fBre2c:labelprefix = \(aqyy\(aq;\fP +Allows to change the prefix of numbered +labels. The default is \fByy\fP\&. Can be set any string that is valid in +a label name. .TP -.B \fBr{n,m}\fP -matches \fBr\fP at least \fBn\fP times, but not more than \fBm\fP times. +.B \fBre2c:label:yyFillLabel = \(aqyyFillLabel\(aq;\fP +Overrides the name of the \fByyFillLabel\fP label. .TP -.B \fB\&.\fP -match any character except newline. +.B \fBre2c:label:yyNext = \(aqyyNext\(aq;\fP +Overrides the name of the \fByyNext\fP label. .TP -.B \fBname\fP -matches named definition as specified by \fBname\fP only if \fB\-F\fP is -off. If \fB\-F\fP is active then this behaves like it was enclosed in double -quotes and matches the string "name". +.B \fBre2c:startlabel = 0;\fP +If set to a non zero integer, then the start +label of the next scanner block will be generated even if it isn\(aqt used by +the scanner itself. Otherwise, the normal \fByy0\fP\-like start label is only +generated if needed. If set to a text value, then a label with that +text will be generated regardless of whether the normal start label is +used or not. This setting is reset to 0 after a start label has been generated. +.TP +.B \fBre2c:state:abort = 0;\fP +When not zero and the \fB\-f\fP \fB\-\-storable\-state\fP switch is active, then +the \fBYYGETSTATE\fP block will contain a default case that aborts and a \-1 +case will be used for initialization. +.TP +.B \fBre2c:state:nextlabel = 0;\fP +Used when \fB\-f\fP \fB\-\-storable\-state\fP is active to control +whether the \fBYYGETSTATE\fP block is followed by a \fByyNext:\fP label line. +Instead of using \fByyNext\fP, you can usually also use configuration +\fBstartlabel\fP to force a specific start label or default to \fByy0\fP as +a start label. Instead of using a dedicated label, it is often better to +separate the \fBYYGETSTATE\fP code from the actual scanner code by placing a +\fB/*!getstate:re2c*/\fP comment. +.TP +.B \fBre2c:tags:expression = \(aq@@\(aq;\fP +Allows to customize the way re2c addresses tag variables: +by default it emits expressions of the form \fByyt\fP, +but this might be inconvenient if tag variables are defined as fields in a struct, +or for any other reason require special accessors. +For example, setting \fBre2c:tags:expression = p\->@@\fP will result in \fBp\->yyt\fP\&. +.TP +.B \fBre2c:tags:prefix = \(aqyyt\(aq;\fP +Allows to override prefix of tag variables. +.TP +.B \fBre2c:variable:yyaccept = yyaccept;\fP +Overrides the name of the \fByyaccept\fP variable. +.TP +.B \fBre2c:variable:yybm = \(aqyybm\(aq;\fP +Overrides the name of the \fByybm\fP variable. +.TP +.B \fBre2c:variable:yych = \(aqyych\(aq;\fP +Overrides the name of the \fByych\fP variable. +.TP +.B \fBre2c:variable:yyctable = \(aqyyctable\(aq;\fP +When both \fB\-c\fP \fB\-\-conditions\fP and \fB\-g\fP \fB\-\-computed\-gotos\fP are active, +re2c will use this variable to generate a static jump table +for \fBYYGETCONDITION\fP\&. +.TP +.B \fBre2c:variable:yystable = \(aqyystable\(aq;\fP +Deprecated. +.TP +.B \fBre2c:variable:yytarget = \(aqyytarget\(aq;\fP +Overrides the name of the \fByytarget\fP variable. +.TP +.B \fBre2c:yybm:hex = 0;\fP +If set to zero, a decimal table will be used. Otherwise, a hexadecimal table will be generated. +.TP +.B \fBre2c:yych:conversion = 0;\fP +When this setting is non zero, re2c automatically generates +conversion code whenever yych gets read. In this case, the type must be +defined using \fBre2c:define:YYCTYPE\fP\&. +.TP +.B \fBre2c:yych:emit = 1;\fP +Set this to zero to suppress the generation of \fIyych\fP\&. +.TP +.B \fBre2c:yyfill:check = 1;\fP +This can be set to 0 to suppress the generations of +\fBYYCURSOR\fP and \fBYYLIMIT\fP based precondition checks. This option is useful when +\fBYYLIMIT + YYMAXFILL\fP is always accessible. +.TP +.B \fBre2c:yyfill:enable = 1;\fP +Set this to zero to suppress the generation of \fBYYFILL (n)\fP\&. When using this, be sure to verify that the generated +scanner does not read beyond the available input, as allowing such behavior might +introduce severe security issues to your programs. +.TP +.B \fBre2c:yyfill:parameter = 1;\fP +Controls the argument in the parentheses that follow \fBYYFILL\fP\&. If zero, the argument is omitted. +If non\-zero, the argument is generated unless \fBre2c:define:YYFILL:naked\fP is set to non\-zero. +.UNINDENT +.SS REGULAR EXPRESSIONS +.sp +re2c uses the following syntax for regular expressions: +.INDENT 0.0 +.IP \(bu 2 +\fB"foo"\fP case\-sensitive string literal +.IP \(bu 2 +\fB\(aqfoo\(aq\fP case\-insensitive string literal +.IP \(bu 2 +\fB[a\-xyz]\fP, \fB[^a\-xyz]\fP character class (possibly negated) +.IP \(bu 2 +\fB\&.\fP any character except newline +.IP \(bu 2 +\fBR \e S\fP difference of character classes \fBR\fP and \fBS\fP +.IP \(bu 2 +\fBR*\fP zero or more occurrences of \fBR\fP +.IP \(bu 2 +\fBR+\fP one or more occurrences of \fBR\fP +.IP \(bu 2 +\fBR?\fP optional \fBR\fP +.IP \(bu 2 +\fBR{n}\fP repetition of \fBR\fP exactly \fBn\fP times +.IP \(bu 2 +\fBR{n,}\fP repetition of \fBR\fP at least \fBn\fP times +.IP \(bu 2 +\fBR{n,m}\fP repetition of \fBR\fP from \fBn\fP to \fBm\fP times +.IP \(bu 2 +\fB(R)\fP just \fBR\fP; parentheses are used to override precedence or for POSIX\-style submatch +.IP \(bu 2 +\fBR S\fP concatenation: \fBR\fP followed by \fBS\fP +.IP \(bu 2 +\fBR | S\fP alternative: \fBR or S\fP +.IP \(bu 2 +\fBR / S\fP loohakead: \fBR\fP followed by \fBS\fP, but \fBS\fP is not consumed +.IP \(bu 2 +\fBname\fP the regular expression defined as \fBname\fP (or literal string \fB"name"\fP in Flex compatibility mode) +.IP \(bu 2 +\fB{name}\fP the regular expression defined as \fBname\fP in Flex compatibility mode +.IP \(bu 2 +\fB@stag\fP an \fIs\-tag\fP: saves the last input position at which \fB@stag\fP matches in a variable named \fBstag\fP +.IP \(bu 2 +\fB#mtag\fP an \fIm\-tag\fP: saves all input positions at which \fB#mtag\fP matches in a variable named \fBmtag\fP .UNINDENT .sp -Character classes and string literals may contain octal or hexadecimal -character definitions and the following set of escape sequences: -\fB\ea\fP, \fB\eb\fP, \fB\ef\fP, \fB\en\fP, \fB\er\fP, \fB\et\fP, \fB\ev\fP, \fB\e\e\fP\&. An octal character is defined by a backslash -followed by its three octal digits (e.g. \fB\e377\fP). -Hexadecimal characters from 0 to 0xFF are defined by backslash, a lower -cased \fBx\fP and two hexadecimal digits (e.g. \fB\ex12\fP). Hexadecimal characters from 0x100 to 0xFFFF are defined by backslash, a lower cased -\fB\eu\fP or an upper cased \fB\eX\fP and four hexadecimal digits (e.g. \fB\eu1234\fP). -Hexadecimal characters from 0x10000 to 0xFFFFffff are defined by backslash, an upper cased \fB\eU\fP -and eight hexadecimal digits (e.g. \fB\eU12345678\fP). +Character classes and string literals may contain the following escape sequences: +\fB\ea\fP, \fB\eb\fP, \fB\ef\fP, \fB\en\fP, \fB\er\fP, \fB\et\fP, \fB\ev\fP, \fB\e\e\fP, octal escapes \fB\eooo\fP and hexadecimal escapes \fB\exhh\fP, \fB\euhhhh\fP and \fB\eUhhhhhhhh\fP\&. +.SH SUBMATCH EXTRACTION +.sp +\fBre2c\fP supports two kinds of submatch extraction. +.sp +The first option is \fB\-P \-\-posix\-captures\fP: it enables POSIX\-compliant capturing groups. +In this mode parentheses in regular expressions denote the beginning and the end of capturing groups; +the whole regular expression is group number zero. +The number of groups for the matching rule is stored in a variable \fByynmatch\fP, +and submatch results are stored in \fByypmatch\fP array. +Both \fByynmatch\fP and \fByypmatch\fP should be defined by the user; +note that \fByypmatch\fP size must be at least \fB[yynmatch * 2]\fP\&. +\fBre2c\fP provides a directive \fB/*!maxnmatch:re2c*/\fP that defines a constant \fBYYMAXNMATCH\fP: the maximal value of \fByynmatch\fP among all rules. +Note that \fBre2c\fP implements POSIX\-compliant disambiguation: +each subexpression matches as long as possible, +and subexpressions that start earlier in regular expression have priority over those starting later. +.sp +Second option is \fB\-T \-\-tags\fP\&. +With this option one can use standalone tags of the form \fB@stag\fP and \fB#mtag\fP instead of capturing parentheses, +where \fBstag\fP and \fBmtag\fP are arbitrary used\-defined names. +Tags can be used anywhere inside of a regular expression; semantically they are just position markers. +Tags of the form \fB@stag\fP are called \fIs\-tags\fP: they denote a single submatch value (the last input position where this tag matched). +Tags of the form \fB#mtag\fP are called \fIm\-tags\fP: they denote multiple submatch values (the whole history of repetitions of this tag). +All tags should be defined by the user as variables with the corresponding names. +With standalone tags \fBre2c\fP uses leftmost greedy disambiguation: +submatch positions correspond to the leftmost matching path through the regular expression. +.sp +With both \fB\-\-posix\-captures\fP and \fB\-\-tags\fP options \fBre2c\fP generates a number of tag variables +that are used by the lexer to track multiple possible versions of each tag +(multiple versions are caused by possible ambiguity of submatch). +When a rule matches, ambiguity is resolved and all tags of this rule (or capturing parentheses, which are also implemented as tags) +are initialized with the values of appropriate tag variables. +Note that there is no one\-to\-one correspondence between tag variables and tags: +the same tag variable may be reused for different tags, and one tag may require multiple tag variables to hold all its ambiguous versions. +The exact number of tag variables is unknown to the user; this number is determined by \fBre2c\fP\&. +However, tag variables should be defined by the user, because it might be necessary to update them in \fBYYFILL\fP +and store them between invocations of lexer with \fB\-\-storable\-state\fP option. +Therefore \fBre2c\fP provides directives \fB/*!stags:re2c ... */\fP and \fB/*!mtags:re2c ... */\fP +that can be used to declare, initialize and manipulate tag variables. +.sp +\fIS\-tags\fP must support the following operations: +.INDENT 0.0 +.IP \(bu 2 +save input position to \fIs\-tag\fP: +\fBt = YYCURSOR\fP with default API, or user\-defined operation \fBYYSTAGP (t)\fP with generic API +.IP \(bu 2 +save default value to \fIs\-tag\fP: +\fBt = NULL\fP with default API, or user\-defined operation \fBYYSTAGN (t)\fP with generic API +.IP \(bu 2 +copy one \fIs\-tag\fP to another: +\fBt1 = t2\fP +.UNINDENT .sp -The only portable "any" rule is the default rule \fB*\fP\&. -.SH SCANNER WITH STORABLE STATES +\fIM\-tags\fP must support the following operations: +.INDENT 0.0 +.IP \(bu 2 +append input position to \fIm\-tag\fP: +user\-defined operation \fBYYMTAGP (t)\fP with both default and generic API +.IP \(bu 2 +append default value to \fIm\-tag\fP: +user\-defined operation \fBYYMTAGN (t)\fP with both default and generic API +.IP \(bu 2 +copy one \fIm\-tag\fP to another: +\fBt1 = t2\fP +.UNINDENT .sp -When the \fB\-f\fP flag is specified, \fBre2c\fP generates a scanner that can -store its current state, return to the caller, and later resume -operations exactly where it left off. +\fIS\-tags\fP can be implemented as scalar values (pointers or offsets). +\fIM\-tags\fP need a more complex representation, as they need to store a sequence of tag values. +The most naive and inefficient representation of \fIm\-tag\fP is a list (array, vector) of tag values; +a more efficient representation is to store all \fIm\-tags\fP in a prefix\-tree +represented as array of nodes \fB(v, p)\fP, where \fBv\fP is tag value and \fBp\fP is a pointer to parent node. .sp -The default operation of \fBre2c\fP is a -"pull" model, where the scanner asks for extra input whenever it needs it. However, this mode of operation assumes that the scanner is the "owner" -the parsing loop, and that may not always be convenient. +For further details see \fBhttp://re2c.org/examples/examples.html\fP page on the website +or \fBre2c/examples/\fP subdirectory of \fBre2c\fP distribution. +.SH STORABLE STATE .sp -Typically, if there is a preprocessor ahead of the scanner in the -stream, or for that matter any other procedural source of data, the -scanner cannot "ask" for more data unless both scanner and source -live in a separate threads. +With \fB\-f\fP \fB\-\-storable\-state\fP option re2c generates a lexer that can +store its current state, return to the caller, and later resume operations exactly where it left off. +The default mode of operation in re2c is a "pull" model, where the lexer "pulls" more input whenever it needs it. +However, this mode of operation assumes that the lexer is the owner of the parsing loop, and that may not always be convenient. .sp -The \fB\-f\fP flag is useful for just this situation: it lets users design -scanners that work in a "push" model, i.e. where data is fed to the -scanner chunk by chunk. When the scanner runs out of data to consume, it -just stores its state, and return to the caller. When more input data is -fed to the scanner, it resumes operations exactly where it left off. +Storable state is useful exactly for situations like that: it allows to construct +lexers that work in a "push" model, where data is fed to the lexer chunk by chunk. +When the lexer needs more input, it stores its state and returns to the caller. +Later, when more input becomes available, it resumes operations exactly where it stopped. .sp Changes needed compared to the "pull" model: .INDENT 0.0 .IP \(bu 2 -User has to supply macros \fBYYSETSTATE ()\fP and \fBYYGETSTATE (state)\fP\&. -.IP \(bu 2 -The \fB\-f\fP option inhibits declaration of \fByych\fP and \fByyaccept\fP\&. So the -user has to declare these. Also the user has to save and restore these. -In the example \fBexamples/push_model/push.re\fP these are declared as -fields of the (C++) class of which the scanner is a method, so they do -not need to be saved/restored explicitly. For C they could e.g. be made -macros that select fields from a structure passed in as parameter. -Alternatively, they could be declared as local variables, saved with -\fBYYFILL (n)\fP when it decides to return and restored at entry to the -function. Also, it could be more efficient to save the state from -\fBYYFILL (n)\fP because \fBYYSETSTATE (state)\fP is called unconditionally. -\fBYYFILL (n)\fP however does not get \fBstate\fP as parameter, so we would have -to store state in a local variable by \fBYYSETSTATE (state)\fP\&. -.IP \(bu 2 -Modify \fBYYFILL (n)\fP to return (from the function calling it) if more input is needed. -.IP \(bu 2 -Modify caller to recognise if more input is needed and respond appropriately. -.IP \(bu 2 -The generated code will contain a switch block that is used to -restores the last state by jumping behind the corrspoding \fBYYFILL (n)\fP -call. This code is automatically generated in the epilog of the first \fB/*!re2c */\fP -block. It is possible to trigger generation of the \fBYYGETSTATE ()\fP -block earlier by placing a \fB/*!getstate:re2c*/\fP comment. This is especially useful when the scanner code should be -wrapped inside a loop. +Define \fBYYSETSTATE ()\fP and \fBYYGETSTATE (state)\fP\&. +.IP \(bu 2 +Define \fByych\fP, \fByyaccept\fP and \fBstate\fP variables as a part of persistent lexer state. +\fBstate\fP should be initialized to \fB\-1\fP\&. +.IP \(bu 2 +\fBYYFILL\fP should return to the outer program instead of trying to supply more input. +Return code should indicate that lexer needs more input. +.IP \(bu 2 +The outer program should recognize situations when lexer needs more input +and respond appropriately. +.IP \(bu 2 +Use \fB/*!getstate:re2c*/\fP directive if it is necessary to execute any code +before entering the lexer. +.IP \(bu 2 +Use configurations \fBstate:abort\fP and \fBstate:nextlabel\fP to tweak the generated code. +.UNINDENT +.SH CONDITIONS +.sp +\fIConditions\fP are enabled with \fB\-c\fP \fB\-\-conditions\fP\&. +This option allows to encode multiple interrelated lexers within the same re2c block. +.sp +Each lexer corresponds to a single \fIcondition\fP\&. +It starts with a label of the form \fByyc_name\fP, +where \fBname\fP is \fIcondition\fP name +and \fByyc\fP prefix can be adjusted with configuration \fBre2c:condprefix\fP\&. +Different lexers are separated with a comment \fB/* *********************************** */\fP +which can be adjusted with configuration \fBre2c:cond:divider\fP\&. +.sp +Furthermore, each \fIcondition\fP has a unique identifier of the form \fByycname\fP, +where \fBname\fP is condition name +and \fByyc\fP prefix can be adjusted with configuration \fBre2c:condenumprefix\fP\&. +Identifiers have the type \fBYYCONDTYPE\fP and should be generated with \fB/*!types:re2c*/\fP directive or \fB\-t\fP \fB\-\-type\-header\fP option. +Users shouldn\(aqt define these identifiers manually, as the order of \fIconditions\fP is not specified. +.sp +Before all \fIconditions\fP re2c generates entry code that checks the current \fIcondition\fP identifier +and transfers control flow to the start label of the active \fIcondition\fP\&. +After matching some rule of this \fIcondition\fP, +lexer may either transfer control flow back to the entry code (after executing the associated action and optionally setting another \fIcondition\fP with \fB=>\fP), +or use \fB:=>\fP shortcut and transition directly to the start label of another \fIcondition\fP (skipping the action and the entry code). +Configuration \fBre2c:cond:goto\fP allows to change the default behavior. +.sp +Syntactically each rule must be preceded with a list of comma\-separated \fIcondition\fP names or a wildcard \fB*\fP +enclosed in angle brackets \fB<\fP and \fB>\fP\&. +Wildcard means "any condition" and is semantically equivalent to listing all condition names. +Here \fBregexp\fP is a regular expression, \fBdefault\fP refers to the \fIdefault rule\fP \fB*\fP, +and \fBaction\fP is a block of C/C++ code. +.INDENT 0.0 +.IP \(bu 2 +\fB regexp\-or\-default action\fP +.IP \(bu 2 +\fB regexp\-or\-default => condition action\fP +.IP \(bu 2 +\fB regexp\-or\-default :=> condition\fP .UNINDENT .sp -Please see \fBexamples/push_model/push.re\fP for "push" model scanner. The -generated code can be tweaked using inplace configurations \fBstate:abort\fP -and \fBstate:nextlabel\fP\&. -.SH SCANNER WITH CONDITION SUPPORT -.sp -You can preceed regular expressions with a list of condition names when -using the \fB\-c\fP switch. In this case \fBre2c\fP generates scanner blocks for -each conditon. Where each of the generated blocks has its own -precondition. The precondition is given by the interface define -\fBYYGETCONDITON()\fP and must be of type \fBYYCONDTYPE\fP\&. -.sp -There are two special rule types. First, the rules of the condition \fB<*>\fP -are merged to all conditions (note that they have lower priority than -other rules of that condition). And second the empty condition list -allows one to provide a code block that does not have a scanner part. -Meaning it does not allow any regular expression. The condition value -referring to this special block is always the one with the enumeration -value 0. This way the code of this special rule can be used to -initialize a scanner. It is in no way necessary to have these rules: but -sometimes it is helpful to have a dedicated uninitialized condition -state. -.sp -Non empty rules allow one to specify the new condition, which makes them -transition rules. Besides generating calls for the define -\fBYYSETCONDTITION\fP no other special code is generated. +Rules with an exclamation mark \fB!\fP in front of condition list have a special meaning: +they have no regular expression, +and the associated action is merged as an entry code to actions of normal rules. +This might be a convenient place to peform a routine task that is common to all rules. +.INDENT 0.0 +.IP \(bu 2 +\fB action\fP +.UNINDENT .sp -There is another kind of special rules that allow one to prepend code to any -code block of all rules of a certain set of conditions or to all code -blocks to all rules. This can be helpful when some operation is common -among rules. For instance this can be used to store the length of the -scanned string. These special setup rules start with an exclamation mark -followed by either a list of conditions \fB\fP or a star -\fB\fP\&. When \fBre2c\fP generates the code for a rule whose state does not have a -setup rule and a star\(aqd setup rule is present, than that code will be -used as setup code. +Another special form of rules with an empty condition list \fB<>\fP and no regular expression +allows to specify an "entry condition" that can be used to execute code before entering the lexer. +It is semantically equivalent to a condition with number zero, name \fB0\fP and an empty regular expression. +.INDENT 0.0 +.IP \(bu 2 +\fB<> action\fP +.IP \(bu 2 +\fB<> => condition action\fP +.IP \(bu 2 +\fB<> :=> condition\fP +.UNINDENT .SH ENCODINGS .sp \fBre2c\fP supports the following encodings: ASCII (default), EBCDIC (\fB\-e\fP), UCS\-2 (\fB\-w\fP), UTF\-16 (\fB\-x\fP), UTF\-32 (\fB\-u\fP) and UTF\-8 (\fB\-8\fP). See also inplace configuration \fBre2c:flags\fP\&. .sp -The following concepts should be clarified when talking about encoding. -Code point is an abstract number, which represents single encoding -symbol. Code unit is the smallest unit of memory, which is used in the +The following concepts should be clarified when talking about encodings. +A \fIcode point\fP is an abstract number that represents a single symbol. +A \fIcode unit\fP is the smallest unit of memory, which is used in the encoded text (it corresponds to one character in the input stream). One -or more code units can be needed to represent a single code point, -depending on the encoding. In fixed\-length encoding, each code point -is represented with equal number of code units. In variable\-length -encoding, different code points can be represented with different number +or more code units may be needed to represent a single code point, +depending on the encoding. In a \fIfixed\-length\fP encoding, each code point +is represented with an equal number of code units. In \fIvariable\-length\fP +encodings, different code points can be represented with different number of code units. .INDENT 0.0 -.TP -.B ASCII -is a fixed\-length encoding. Its code space includes 0x100 -code points, from 0 to 0xFF. One code point is represented with exactly one -1\-byte code unit, which has the same value as the code point. Size of +.IP \(bu 2 +ASCII is a fixed\-length encoding. Its code space includes 0x100 +code points, from 0 to 0xFF. A code point is represented with exactly one +1\-byte code unit, which has the same value as the code point. The size of \fBYYCTYPE\fP must be 1 byte. -.TP -.B EBCDIC -is a fixed\-length encoding. Its code space includes 0x100 -code points, from 0 to 0xFF. One code point is represented with exactly -one 1\-byte code unit, which has the same value as the code point. Size +.IP \(bu 2 +EBCDIC is a fixed\-length encoding. Its code space includes 0x100 +code points, from 0 to 0xFF. A code point is represented with exactly +one 1\-byte code unit, which has the same value as the code point. The size of \fBYYCTYPE\fP must be 1 byte. -.TP -.B UCS\-2 -is a fixed\-length encoding. Its code space includes 0x10000 +.IP \(bu 2 +UCS\-2 is a fixed\-length encoding. Its code space includes 0x10000 code points, from 0 to 0xFFFF. One code point is represented with exactly one 2\-byte code unit, which has the same value as the code -point. Size of \fBYYCTYPE\fP must be 2 bytes. -.TP -.B UTF\-16 -is a variable\-length encoding. Its code space includes all +point. The size of \fBYYCTYPE\fP must be 2 bytes. +.IP \(bu 2 +UTF\-16 is a variable\-length encoding. Its code space includes all Unicode code points, from 0 to 0xD7FF and from 0xE000 to 0x10FFFF. One -code point is represented with one or two 2\-byte code units. Size of +code point is represented with one or two 2\-byte code units. The size of \fBYYCTYPE\fP must be 2 bytes. -.TP -.B UTF\-32 -is a fixed\-length encoding. Its code space includes all +.IP \(bu 2 +UTF\-32 is a fixed\-length encoding. Its code space includes all Unicode code points, from 0 to 0xD7FF and from 0xE000 to 0x10FFFF. One -code point is represented with exactly one 4\-byte code unit. Size of +code point is represented with exactly one 4\-byte code unit. The size of \fBYYCTYPE\fP must be 4 bytes. -.TP -.B UTF\-8 -is a variable\-length encoding. Its code space includes all +.IP \(bu 2 +UTF\-8 is a variable\-length encoding. Its code space includes all Unicode code points, from 0 to 0xD7FF and from 0xE000 to 0x10FFFF. One -code point is represented with sequence of one, two, three or four -1\-byte code units. Size of \fBYYCTYPE\fP must be 1 byte. +code point is represented with a sequence of one, two, three, or four +1\-byte code units. The size of \fBYYCTYPE\fP must be 1 byte. .UNINDENT .sp In Unicode, values from range 0xD800 to 0xDFFF (surrogates) are not -valid Unicode code points, any encoded sequence of code units, that +valid Unicode code points. Any encoded sequence of code units that would map to Unicode code points in the range 0xD800\-0xDFFF, is ill\-formed. The user can control how \fBre2c\fP treats such ill\-formed -sequences with \fB\-\-encoding\-policy \fP flag (see \fBOPTIONS\fP -for full explanation). -.sp -For some encodings, there are code units, that never occur in valid -encoded stream (e.g. 0xFF byte in UTF\-8). If the generated scanner must -check for invalid input, the only true way to do so is to use default -rule \fB*\fP\&. Note, that full range rule \fB[^]\fP won\(aqt catch invalid code units when variable\-length encoding is used -(\fB[^]\fP means "all valid code points", while default rule \fB*\fP means "all possible code units"). -.SH GENERIC INPUT API -.sp -\fBre2c\fP usually operates on input using pointer\-like primitives -\fBYYCURSOR\fP, \fBYYMARKER\fP, \fBYYCTXMARKER\fP and \fBYYLIMIT\fP\&. +sequences with the \fB\-\-encoding\-policy \fP switch. +.sp +For some encodings, there are code units that never occur in a valid +encoded stream (e.g., 0xFF byte in UTF\-8). If the generated scanner must +check for invalid input, the only correct way to do so is to use the default +rule (\fB*\fP). Note that the full range rule (\fB[^]\fP) won\(aqt catch invalid code units when a variable\-length encoding is used +(\fB[^]\fP means "any valid code point", whereas the default rule (\fB*\fP) means "any possible code unit"). +.SH GENERIC API +.sp +By default \fBre2c\fP operates on input using pointer\-like primitives +\fBYYCURSOR\fP, \fBYYMARKER\fP, \fBYYCTXMARKER\fP, and \fBYYLIMIT\fP\&. +Normally pointer\-like primitives are defined as variables of type \fBYYCTYPE*\fP, +but it is possible to use STL iterators or any other abstraction as long as it syntactically fits into the following use cases: +.INDENT 0.0 +.IP \(bu 2 +\fB++YYCURSOR;\fP +.IP \(bu 2 +\fByych = *YYCURSOR;\fP +.IP \(bu 2 +\fByych = *++YYCURSOR;\fP +.IP \(bu 2 +\fByych = *(YYMARKER = YYCURSOR);\fP +.IP \(bu 2 +\fByych = *(YYMARKER = ++YCURSOR);\fP +.IP \(bu 2 +\fBYYMARKER = YYCURSOR;\fP +.IP \(bu 2 +\fBYYMARKER = ++YYCURSOR;\fP +.IP \(bu 2 +\fBYYCURSOR = YYMARKER;\fP +.IP \(bu 2 +\fBYYCTXMARKER = YYCURSOR + 1;\fP +.IP \(bu 2 +\fBYYCURSOR = YYCTXMARKER;\fP +.IP \(bu 2 +\fBif (YYLIMIT <= YYCURSOR) ...\fP +.IP \(bu 2 +\fBif ((YYLIMIT \- YYCURSOR) < n) ...\fP +.IP \(bu 2 +\fBYYDEBUG (label, *YYCURSOR);\fP +.UNINDENT .sp -Generic input API (enabled with \fB\-\-input custom\fP switch) allows one to -customize input operations. In this mode, \fBre2c\fP will express all -operations on input in terms of the following primitives: +If this input model is too restrictive, then it is possible to use generic input API enabled with \fB\-\-input custom\fP option. +In this mode all input operations are expressed in terms of the primitives below. +These primitives can be defined in any suitable way; one doesn\(aqt have to stick to the pointer semantics. +For example, it is possible to read input directly from file without any buffering, +or to disable \fBYYFILL\fP mechanism and perform end\-of\-input checking on each input character from inside of \fBYYPEEK\fP or \fBYYSKIP\fP\&. .INDENT 0.0 -.INDENT 3.5 -.TS -center; -|l|l|. -_ -T{ +.IP \(bu 2 \fBYYPEEK ()\fP -T} T{ -get current input character -T} -_ -T{ +.IP \(bu 2 \fBYYSKIP ()\fP -T} T{ -advance to the next character -T} -_ -T{ +.IP \(bu 2 \fBYYBACKUP ()\fP -T} T{ -backup current input position -T} -_ -T{ +.IP \(bu 2 \fBYYBACKUPCTX ()\fP -T} T{ -backup current input position for trailing context -T} -_ -T{ +.IP \(bu 2 +\fBYYSTAGP (t)\fP +.IP \(bu 2 +\fBYYSTAGN (t)\fP +.IP \(bu 2 +\fBYYMTAGP (t)\fP +.IP \(bu 2 +\fBYYMTAGN (t)\fP +.IP \(bu 2 \fBYYRESTORE ()\fP -T} T{ -restore current input position -T} -_ -T{ +.IP \(bu 2 \fBYYRESTORECTX ()\fP -T} T{ -restore current input position for trailing context -T} -_ -T{ +.IP \(bu 2 +\fBYYRESTORETAG (t)\fP +.IP \(bu 2 \fBYYLESSTHAN (n)\fP -T} T{ -check if less than \fBn\fP input characters are left -T} -_ -.TE -.UNINDENT .UNINDENT .sp -A couple of useful links that provide some examples: +Default input model can be expressed in terms of generic API as follows +(except for \fBYMTAGP\fP and \fBYYMTAGN\fP, which have no default implementation): .INDENT 0.0 -.IP 1. 3 -\fI\%http://skvadrik.github.io/aleph_null/posts/re2c/2015\-01\-13\-input_model.html\fP -.IP 2. 3 -\fI\%http://skvadrik.github.io/aleph_null/posts/re2c/2015\-01\-15\-input_model_custom.html\fP +.IP \(bu 2 +\fB#define YYPEEK () *YYCURSOR\fP +.IP \(bu 2 +\fB#define YYSKIP () ++YYCURSOR\fP +.IP \(bu 2 +\fB#define YYBACKUP () YYMARKER = YYCURSOR\fP +.IP \(bu 2 +\fB#define YYBACKUPCTX () YYCTXMARKER = YYCURSOR\fP +.IP \(bu 2 +\fB#define YYRESTORE () YYCURSOR = YYMARKER\fP +.IP \(bu 2 +\fB#define YYRESTORECTX () YYCURSOR = YYCTXMARKER\fP +.IP \(bu 2 +\fB#define YYRESTORERAG (t) YYCURSOR = t\fP +.IP \(bu 2 +\fB#define YYLESSTHAN (n) YYLIMIT \- YYCURSOR < n\fP +.IP \(bu 2 +\fB#define YYSTAGP (t) t = YYCURSOR\fP +.IP \(bu 2 +\fB#define YYSTAGN (t) t = NULL\fP .UNINDENT .SH SEE ALSO .sp -You can find more information about \fBre2c\fP on the website: \fI\%http://re2c.org\fP\&. +You can find more information about \fBre2c\fP at: \fI\%http://re2c.org\fP\&. See also: flex(1), lex(1), quex (\fI\%http://quex.sourceforge.net\fP). .SH AUTHORS .sp -Peter Bumbulis \fI\%peter@csg.uwaterloo.ca\fP -.sp -Brian Young \fI\%bayoung@acm.org\fP -.sp -Dan Nuffer \fI\%nuffer@users.sourceforge.net\fP -.sp -Marcus Boerger \fI\%helly@users.sourceforge.net\fP -.sp -Hartmut Kaiser \fI\%hkaiser@users.sourceforge.net\fP -.sp -Emmanuel Mogenet \fI\%mgix@mgix.com\fP -.sp -Ulya Trofimovich \fI\%skvadrik@gmail.com\fP +Originaly written by Peter Bumbulis in 1993; +developed and maintained by Brain Young, Marcus Boerger, Dan Nuffer and Ulya Trofimovich. +Below is a (more or less) full list of contributors retrieved from the Git history and mailing lists: +.sp +Abs62, +asmwarrior, +Ben Smith, +Brian Young, +CRCinAU, +Dan Nuffer, +Derick Rethans, +Dimitri John Ledkov, +Eldar Zakirov, +Emmanuel Mogenet, +Hartmut Kaiser, +jcfp, +Jean\-Claude Wippler, +Jeff Trull, +Jérôme Dumesnil, +Jesse Buesking, +joscherl, +Julian Andres Klode, +Marcus Boerger, +Mike Gilbert, +nuno\-lopes, +Oleksii Taran, +paulmcq, +Paulo Custodio, +Perry E. Metzger, +philippschaefer, +Ross Burton, +Rui Maciel, +Ryan Mast, +Samuel006, +Sergei Trofimovich, +sirzooro, +Tim Kelly, +Ulya Trofimovich .SH VERSION INFORMATION .sp -This manpage describes \fBre2c\fP version 0.16, package date 21 Jan 2016. +This manpage describes \fBre2c\fP version 1.0.3, package date 08 Nov 2017. .\" Generated by docutils manpage writer. . diff --git a/bootstrap/src/ast/lex.cc b/bootstrap/src/ast/lex.cc new file mode 100644 index 0000000..083a4b3 --- /dev/null +++ b/bootstrap/src/ast/lex.cc @@ -0,0 +1,3014 @@ +/* Generated by re2c 1.0.3 on Wed Nov 8 20:39:40 2017 */ +#line 1 "../src/ast/lex.re" +#include "src/util/c99_stdint.h" +#include +#include +#include +#include +#include + +#include "src/conf/msg.h" +#include "src/code/output.h" +#include "src/re/encoding/enc.h" +#include "src/ast/input.h" +#include "src/ast/ast.h" +#include "src/ast/scanner.h" +#include "src/ast/parser.h" // needed by "y.tab.h" +#include "src/ast/unescape.h" +#include "src/util/range.h" +#include "src/util/s_to_n32_unsafe.h" +#include "y.tab.h" + +extern YYSTYPE yylval; + +#define YYCTYPE unsigned char +#define YYCURSOR cur +#define YYLIMIT lim +#define YYMARKER mar +#define YYCTXMARKER ctx +#define YYFILL(n) { fill (n); } + +namespace re2c +{ + +// source code is in ASCII: pointers have type 'char *' +// but re2c makes an implicit assumption that YYCTYPE is unsigned +// when it generates comparisons +#line 37 "../src/ast/lex.re" + + +#line 58 "../src/ast/lex.re" + + +Scanner::ParseMode Scanner::echo(OutputFile &out) +{ + if (eof && cur == eof) // Catch EOF + { + return Stop; + } + + tok = cur; +echo: + ptr = cur; + + +#line 56 "src/ast/lex.cc" +{ + YYCTYPE yych; + unsigned int yyaccept = 0; + static const unsigned char yybm[] = { + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 160, 0, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 160, 128, 0, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 0, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + }; + if ((YYLIMIT - YYCURSOR) < 17) YYFILL(17); + yych = (YYCTYPE)*YYCURSOR; + if (yych <= '\r') { + if (yych <= '\t') { + if (yych >= 0x01) goto yy4; + } else { + if (yych <= '\n') goto yy6; + if (yych <= '\f') goto yy4; + goto yy8; + } + } else { + if (yych <= '%') { + if (yych <= '$') goto yy4; + goto yy9; + } else { + if (yych == '/') goto yy10; + goto yy4; + } + } + ++YYCURSOR; +#line 135 "../src/ast/lex.re" + { + if (cur != eof) goto echo; + out.wraw(tok, ptr); + return Stop; + } +#line 120 "src/ast/lex.cc" +yy4: + ++YYCURSOR; +yy5: +#line 152 "../src/ast/lex.re" + { goto echo; } +#line 126 "src/ast/lex.cc" +yy6: + yyaccept = 0; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 32) { + goto yy11; + } + if (yych == '#') goto yy14; +yy7: +#line 146 "../src/ast/lex.re" + { + cline++; + pos = cur; + goto echo; + } +#line 141 "src/ast/lex.cc" +yy8: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '\n') goto yy6; + goto yy5; +yy9: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '{') goto yy16; + goto yy5; +yy10: + yyaccept = 1; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych == '*') goto yy18; + goto yy5; +yy11: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yybm[0+yych] & 32) { + goto yy11; + } + if (yych == '#') goto yy14; +yy13: + YYCURSOR = YYMARKER; + if (yyaccept == 0) { + goto yy7; + } else { + goto yy5; + } +yy14: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 5) YYFILL(5); + yych = (YYCTYPE)*YYCURSOR; + if (yych <= 0x1F) { + if (yych == '\t') goto yy14; + goto yy13; + } else { + if (yych <= ' ') goto yy14; + if (yych == 'l') goto yy19; + goto yy13; + } +yy16: + ++YYCURSOR; +#line 72 "../src/ast/lex.re" + { + out.wraw(tok, ptr); + return Parse; + } +#line 189 "src/ast/lex.cc" +yy18: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '!') goto yy20; + goto yy13; +yy19: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'i') goto yy21; + goto yy13; +yy20: + yych = (YYCTYPE)*++YYCURSOR; + switch (yych) { + case 'g': goto yy22; + case 'i': goto yy23; + case 'm': goto yy24; + case 'r': goto yy25; + case 's': goto yy26; + case 't': goto yy27; + case 'u': goto yy28; + default: goto yy13; + } +yy21: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'n') goto yy29; + goto yy13; +yy22: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy30; + goto yy13; +yy23: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'g') goto yy31; + goto yy13; +yy24: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'a') goto yy32; + if (yych == 't') goto yy33; + goto yy13; +yy25: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy34; + if (yych == 'u') goto yy35; + goto yy13; +yy26: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 't') goto yy36; + goto yy13; +yy27: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'y') goto yy37; + goto yy13; +yy28: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 's') goto yy38; + goto yy13; +yy29: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy39; + goto yy13; +yy30: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 't') goto yy40; + goto yy13; +yy31: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'n') goto yy41; + goto yy13; +yy32: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'x') goto yy42; + goto yy13; +yy33: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'a') goto yy43; + goto yy13; +yy34: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '2') goto yy44; + goto yy13; +yy35: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'l') goto yy45; + goto yy13; +yy36: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'a') goto yy46; + goto yy13; +yy37: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'p') goto yy47; + goto yy13; +yy38: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy48; + goto yy13; +yy39: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= '0') goto yy50; + if (yych <= '9') goto yy13; + goto yy50; +yy40: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 's') goto yy51; + goto yy13; +yy41: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'o') goto yy52; + goto yy13; +yy42: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == ':') goto yy53; + if (yych == 'n') goto yy54; + goto yy13; +yy43: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'g') goto yy55; + goto yy13; +yy44: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'c') goto yy16; + goto yy13; +yy45: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy56; + goto yy13; +yy46: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'g') goto yy57; + goto yy13; +yy47: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy58; + goto yy13; +yy48: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == ':') goto yy59; + goto yy13; +yy49: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; +yy50: + if (yych <= 0x1F) { + if (yych == '\t') goto yy49; + goto yy13; + } else { + if (yych <= ' ') goto yy49; + if (yych <= '0') goto yy13; + if (yych <= '9') { + YYCTXMARKER = YYCURSOR; + goto yy60; + } + goto yy13; + } +yy51: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 't') goto yy62; + goto yy13; +yy52: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'r') goto yy63; + goto yy13; +yy53: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'r') goto yy64; + goto yy13; +yy54: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'm') goto yy65; + goto yy13; +yy55: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 's') goto yy66; + goto yy13; +yy56: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 's') goto yy67; + goto yy13; +yy57: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 's') goto yy68; + goto yy13; +yy58: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 's') goto yy69; + goto yy13; +yy59: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'r') goto yy70; + goto yy13; +yy60: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = (YYCTYPE)*YYCURSOR; + if (yybm[0+yych] & 64) { + goto yy60; + } + if (yych <= '\f') { + if (yych <= 0x08) goto yy13; + if (yych <= '\t') goto yy71; + if (yych <= '\n') goto yy73; + goto yy13; + } else { + if (yych <= '\r') goto yy75; + if (yych == ' ') goto yy71; + goto yy13; + } +yy62: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'a') goto yy76; + goto yy13; +yy63: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy77; + goto yy13; +yy64: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy78; + goto yy13; +yy65: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'a') goto yy79; + goto yy13; +yy66: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == ':') goto yy80; + goto yy13; +yy67: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == ':') goto yy81; + goto yy13; +yy68: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == ':') goto yy82; + goto yy13; +yy69: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == ':') goto yy83; + goto yy13; +yy70: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy84; + goto yy13; +yy71: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yych <= 0x1F) { + if (yych == '\t') goto yy71; + goto yy13; + } else { + if (yych <= ' ') goto yy71; + if (yych == '"') goto yy85; + goto yy13; + } +yy73: + ++YYCURSOR; + YYCURSOR = YYCTXMARKER; +#line 141 "../src/ast/lex.re" + { + set_sourceline(); + goto echo; + } +#line 452 "src/ast/lex.cc" +yy75: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '\n') goto yy73; + goto yy13; +yy76: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 't') goto yy87; + goto yy13; +yy77: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == ':') goto yy88; + goto yy13; +yy78: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '2') goto yy89; + goto yy13; +yy79: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 't') goto yy90; + goto yy13; +yy80: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'r') goto yy91; + goto yy13; +yy81: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'r') goto yy92; + goto yy13; +yy82: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'r') goto yy93; + goto yy13; +yy83: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'r') goto yy94; + goto yy13; +yy84: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '2') goto yy95; + goto yy13; +yy85: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); + yych = (YYCTYPE)*YYCURSOR; + if (yybm[0+yych] & 128) { + goto yy85; + } + if (yych <= '\n') goto yy13; + if (yych <= '"') goto yy96; + goto yy97; +yy87: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy98; + goto yy13; +yy88: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'r') goto yy99; + goto yy13; +yy89: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'c') goto yy100; + goto yy13; +yy90: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'c') goto yy102; + goto yy13; +yy91: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy103; + goto yy13; +yy92: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy104; + goto yy13; +yy93: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy105; + goto yy13; +yy94: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy106; + goto yy13; +yy95: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'c') goto yy107; + goto yy13; +yy96: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '\n') goto yy73; + if (yych == '\r') goto yy75; + goto yy13; +yy97: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yych == '\n') goto yy13; + goto yy85; +yy98: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == ':') goto yy109; + goto yy13; +yy99: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy110; + goto yy13; +yy100: + ++YYCURSOR; +#line 93 "../src/ast/lex.re" + { + out.wraw(tok, ptr); + out.wdelay_yymaxfill(); + lex_end_of_comment(out); + goto echo; + } +#line 567 "src/ast/lex.cc" +yy102: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'h') goto yy111; + goto yy13; +yy103: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '2') goto yy112; + goto yy13; +yy104: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '2') goto yy113; + goto yy13; +yy105: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '2') goto yy114; + goto yy13; +yy106: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '2') goto yy115; + goto yy13; +yy107: + ++YYCURSOR; +#line 82 "../src/ast/lex.re" + { + out.wraw(tok, ptr); + return Reuse; + } +#line 595 "src/ast/lex.cc" +yy109: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'r') goto yy116; + goto yy13; +yy110: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '2') goto yy117; + goto yy13; +yy111: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == ':') goto yy118; + goto yy13; +yy112: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'c') goto yy119; + goto yy13; +yy113: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'c') goto yy121; + goto yy13; +yy114: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'c') goto yy123; + goto yy13; +yy115: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'c') goto yy125; + goto yy13; +yy116: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy127; + goto yy13; +yy117: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'c') goto yy128; + goto yy13; +yy118: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'r') goto yy130; + goto yy13; +yy119: + ++YYCURSOR; +#line 129 "../src/ast/lex.re" + { + out.wraw(tok, ptr); + lex_tags(out, true); + goto echo; + } +#line 644 "src/ast/lex.cc" +yy121: + ++YYCURSOR; +#line 77 "../src/ast/lex.re" + { + out.wraw(tok, ptr); + return Rules; + } +#line 652 "src/ast/lex.cc" +yy123: + ++YYCURSOR; +#line 123 "../src/ast/lex.re" + { + out.wraw(tok, ptr); + lex_tags(out, false); + goto echo; + } +#line 661 "src/ast/lex.cc" +yy125: + ++YYCURSOR; +#line 114 "../src/ast/lex.re" + { + out.wraw(tok, ptr); + out.wdelay_line_info(); + out.wdelay_types(); + out.wline_info(cline, get_fname().c_str()); + lex_end_of_comment(out); + goto echo; + } +#line 673 "src/ast/lex.cc" +yy127: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '2') goto yy131; + goto yy13; +yy128: + ++YYCURSOR; +#line 87 "../src/ast/lex.re" + { + out.wraw(tok, ptr); + lex_end_of_comment(out); + goto echo; + } +#line 686 "src/ast/lex.cc" +yy130: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy132; + goto yy13; +yy131: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'c') goto yy133; + goto yy13; +yy132: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '2') goto yy135; + goto yy13; +yy133: + ++YYCURSOR; +#line 107 "../src/ast/lex.re" + { + out.wraw(tok, ptr); + out.wdelay_state_goto(0); + lex_end_of_comment(out); + goto echo; + } +#line 708 "src/ast/lex.cc" +yy135: + yych = (YYCTYPE)*++YYCURSOR; + if (yych != 'c') goto yy13; + ++YYCURSOR; +#line 100 "../src/ast/lex.re" + { + out.wraw(tok, ptr); + out.wdelay_yymaxnmatch(); + lex_end_of_comment(out); + goto echo; + } +#line 720 "src/ast/lex.cc" +} +#line 153 "../src/ast/lex.re" + +} + +void Scanner::lex_end_of_comment(OutputFile &out) +{ + uint32_t ignored = 0; + for (;;) { +#line 730 "src/ast/lex.cc" +{ + YYCTYPE yych; + if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = (YYCTYPE)*YYCURSOR; + if (yych <= '\f') { + if (yych <= 0x00) goto yy140; + if (yych == '\n') goto yy144; + goto yy142; + } else { + if (yych <= '\r') goto yy146; + if (yych == '*') goto yy147; + goto yy142; + } +yy140: + ++YYCURSOR; +#line 160 "../src/ast/lex.re" + { fatal_lc(get_cline(), get_column(), "expected end of block"); } +#line 748 "src/ast/lex.cc" +yy142: + ++YYCURSOR; +yy143: +#line 162 "../src/ast/lex.re" + { continue; } +#line 754 "src/ast/lex.cc" +yy144: + ++YYCURSOR; +#line 163 "../src/ast/lex.re" + { ++ignored; continue; } +#line 759 "src/ast/lex.cc" +yy146: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '\n') goto yy144; + goto yy143; +yy147: + yych = (YYCTYPE)*++YYCURSOR; + if (yych != '/') goto yy143; + ++YYCURSOR; +#line 164 "../src/ast/lex.re" + { + if (ignored > 0) { + cline += ignored; + out.wline_info(cline, get_fname().c_str()); + } + tok = pos = cur; + return; + } +#line 777 "src/ast/lex.cc" +} +#line 172 "../src/ast/lex.re" +} +} + +void Scanner::lex_tags(OutputFile &out, bool mtags) +{ + std::string fmt, sep; + for (;;) { +#line 787 "src/ast/lex.cc" +{ + YYCTYPE yych; + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + if ((YYLIMIT - YYCURSOR) < 9) YYFILL(9); + yych = (YYCTYPE)*YYCURSOR; + if (yybm[0+yych] & 128) { + goto yy154; + } + if (yych <= ')') { + if (yych <= '\n') { + if (yych >= '\t') goto yy157; + } else { + if (yych == '\r') goto yy159; + } + } else { + if (yych <= 'f') { + if (yych <= '*') goto yy160; + if (yych >= 'f') goto yy161; + } else { + if (yych == 's') goto yy162; + } + } + ++YYCURSOR; +yy153: +#line 179 "../src/ast/lex.re" + { fatal_lc(get_cline(), get_column(), "unrecognized configuration"); } +#line 847 "src/ast/lex.cc" +yy154: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yybm[0+yych] & 128) { + goto yy154; + } +#line 184 "../src/ast/lex.re" + { continue; } +#line 857 "src/ast/lex.cc" +yy157: + ++YYCURSOR; +#line 185 "../src/ast/lex.re" + { ++cline; continue; } +#line 862 "src/ast/lex.cc" +yy159: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '\n') goto yy157; + goto yy153; +yy160: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '/') goto yy163; + goto yy153; +yy161: + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych == 'o') goto yy165; + goto yy153; +yy162: + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych == 'e') goto yy167; + goto yy153; +yy163: + ++YYCURSOR; +#line 186 "../src/ast/lex.re" + { + out.wdelay_tags(new ConfTags(fmt, sep), mtags); + tok = pos = cur; + return; + } +#line 887 "src/ast/lex.cc" +yy165: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'r') goto yy168; +yy166: + YYCURSOR = YYMARKER; + goto yy153; +yy167: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'p') goto yy169; + goto yy166; +yy168: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'm') goto yy170; + goto yy166; +yy169: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'a') goto yy171; + goto yy166; +yy170: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'a') goto yy172; + goto yy166; +yy171: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'r') goto yy173; + goto yy166; +yy172: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 't') goto yy174; + goto yy166; +yy173: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'a') goto yy176; + goto yy166; +yy174: + ++YYCURSOR; +#line 181 "../src/ast/lex.re" + { fmt = lex_conf_string(); continue; } +#line 926 "src/ast/lex.cc" +yy176: + yych = (YYCTYPE)*++YYCURSOR; + if (yych != 't') goto yy166; + yych = (YYCTYPE)*++YYCURSOR; + if (yych != 'o') goto yy166; + yych = (YYCTYPE)*++YYCURSOR; + if (yych != 'r') goto yy166; + ++YYCURSOR; +#line 182 "../src/ast/lex.re" + { sep = lex_conf_string(); continue; } +#line 937 "src/ast/lex.cc" +} +#line 191 "../src/ast/lex.re" +} +} + +int Scanner::scan(const conopt_t *globopts) +{ + uint32_t depth, code_line; +scan: + tchar = cur - pos; + tok = cur; + +#line 950 "src/ast/lex.cc" +{ + YYCTYPE yych; + unsigned int yyaccept = 0; + static const unsigned char yybm[] = { + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 144, 0, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 144, 128, 0, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 128, 128, 128, 128, 128, 128, + 128, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 128, 0, 128, 128, 160, + 128, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + }; + if ((YYLIMIT - YYCURSOR) < 5) YYFILL(5); + yych = (YYCTYPE)*YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy185; + } + if (yych <= '.') { + if (yych <= '#') { + if (yych <= '\r') { + if (yych <= 0x08) goto yy183; + if (yych <= '\n') goto yy188; + if (yych >= '\r') goto yy190; + } else { + if (yych <= 0x1F) goto yy183; + if (yych <= '!') goto yy191; + if (yych <= '"') goto yy193; + goto yy195; + } + } else { + if (yych <= '\'') { + if (yych == '%') goto yy196; + if (yych >= '\'') goto yy197; + } else { + if (yych <= '*') { + if (yych <= ')') goto yy191; + goto yy199; + } else { + if (yych <= ',') goto yy191; + if (yych >= '.') goto yy200; + } + } + } + } else { + if (yych <= '\\') { + if (yych <= '?') { + if (yych <= '/') goto yy202; + if (yych <= '9') goto yy183; + if (yych <= ':') goto yy203; + goto yy191; + } else { + if (yych <= '@') goto yy195; + if (yych <= 'Z') goto yy204; + if (yych <= '[') goto yy206; + goto yy191; + } + } else { + if (yych <= 'q') { + if (yych == '_') goto yy204; + if (yych >= 'a') goto yy204; + } else { + if (yych <= 'z') { + if (yych <= 'r') goto yy208; + goto yy204; + } else { + if (yych <= '{') goto yy209; + if (yych <= '|') goto yy191; + } + } + } + } +yy183: + ++YYCURSOR; +yy184: +#line 351 "../src/ast/lex.re" + { + fatal_lc(get_cline(), get_column(), "unexpected character: '%c'", *tok); + goto scan; + } +#line 1055 "src/ast/lex.cc" +yy185: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy185; + } +#line 330 "../src/ast/lex.re" + { + goto scan; + } +#line 1067 "src/ast/lex.cc" +yy188: + yyaccept = 0; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych <= 0x1F) { + if (yych == '\t') goto yy211; + } else { + if (yych <= ' ') goto yy211; + if (yych == '#') goto yy214; + } +yy189: +#line 339 "../src/ast/lex.re" + { + if (cur == eof) return 0; + pos = cur; + cline++; + if (lexer_state == LEX_FLEX_NAME) { + lexer_state = LEX_NORMAL; + return TOKEN_FID_END; + } else { + goto scan; + } + } +#line 1090 "src/ast/lex.cc" +yy190: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '\n') goto yy188; + goto yy184; +yy191: + ++YYCURSOR; +yy192: +#line 243 "../src/ast/lex.re" + { return *tok; } +#line 1100 "src/ast/lex.cc" +yy193: + ++YYCURSOR; +#line 233 "../src/ast/lex.re" + { yylval.regexp = lex_str('"'); return TOKEN_REGEXP; } +#line 1105 "src/ast/lex.cc" +yy195: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= '^') { + if (yych <= '@') goto yy184; + if (yych <= 'Z') goto yy216; + goto yy184; + } else { + if (yych == '`') goto yy184; + if (yych <= 'z') goto yy216; + goto yy184; + } +yy196: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '}') goto yy219; + goto yy184; +yy197: + ++YYCURSOR; +#line 232 "../src/ast/lex.re" + { yylval.regexp = lex_str('\''); return TOKEN_REGEXP; } +#line 1125 "src/ast/lex.cc" +yy199: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '/') goto yy219; + goto yy192; +yy200: + ++YYCURSOR; +#line 325 "../src/ast/lex.re" + { + yylval.regexp = ast_dot(cline, get_column()); + return TOKEN_REGEXP; + } +#line 1137 "src/ast/lex.cc" +yy202: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '*') goto yy221; + if (yych == '/') goto yy223; + goto yy192; +yy203: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '=') goto yy225; + goto yy184; +yy204: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; +yy205: + if (yybm[0+yych] & 32) { + goto yy204; + } + if (yych <= ' ') { + if (yych == '\t') { + YYCTXMARKER = YYCURSOR; + goto yy229; + } + if (yych <= 0x1F) goto yy227; + YYCTXMARKER = YYCURSOR; + goto yy229; + } else { + if (yych <= ',') { + if (yych <= '+') goto yy227; + YYCTXMARKER = YYCURSOR; + goto yy231; + } else { + if (yych <= '<') goto yy227; + if (yych <= '>') { + YYCTXMARKER = YYCURSOR; + goto yy231; + } + goto yy227; + } + } +yy206: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '^') goto yy233; +#line 234 "../src/ast/lex.re" + { yylval.regexp = lex_cls(false); return TOKEN_REGEXP; } +#line 1182 "src/ast/lex.cc" +yy208: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy235; + goto yy205; +yy209: + yyaccept = 1; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 64) { + goto yy238; + } + if (yych <= 'Z') { + if (yych == ',') goto yy236; + if (yych >= 'A') goto yy240; + } else { + if (yych <= '_') { + if (yych >= '_') goto yy240; + } else { + if (yych <= '`') goto yy210; + if (yych <= 'z') goto yy240; + } + } +yy210: +#line 201 "../src/ast/lex.re" + { + depth = 1; + code_line = cline; + goto code; + } +#line 1211 "src/ast/lex.cc" +yy211: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yych <= 0x1F) { + if (yych == '\t') goto yy211; + } else { + if (yych <= ' ') goto yy211; + if (yych == '#') goto yy214; + } +yy213: + YYCURSOR = YYMARKER; + if (yyaccept <= 1) { + if (yyaccept == 0) { + goto yy189; + } else { + goto yy210; + } + } else { + goto yy237; + } +yy214: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 5) YYFILL(5); + yych = (YYCTYPE)*YYCURSOR; + if (yych <= 0x1F) { + if (yych == '\t') goto yy214; + goto yy213; + } else { + if (yych <= ' ') goto yy214; + if (yych == 'l') goto yy242; + goto yy213; + } +yy216: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yych <= 'Z') { + if (yych <= '/') goto yy218; + if (yych <= '9') goto yy216; + if (yych >= 'A') goto yy216; + } else { + if (yych <= '_') { + if (yych >= '_') goto yy216; + } else { + if (yych <= '`') goto yy218; + if (yych <= 'z') goto yy216; + } + } +yy218: +#line 237 "../src/ast/lex.re" + { + const std::string *name = new std::string(tok + 1, tok_len() - 1); + yylval.regexp = ast_tag(cline, get_column(), name, tok[0] == '#'); + return TOKEN_REGEXP; + } +#line 1268 "src/ast/lex.cc" +yy219: + ++YYCURSOR; +#line 227 "../src/ast/lex.re" + { + tok = cur; + return 0; + } +#line 1276 "src/ast/lex.cc" +yy221: + ++YYCURSOR; +#line 221 "../src/ast/lex.re" + { + depth = 1; + goto comment; + } +#line 1284 "src/ast/lex.cc" +yy223: + ++YYCURSOR; +#line 218 "../src/ast/lex.re" + { + goto nextLine; + } +#line 1291 "src/ast/lex.cc" +yy225: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '>') goto yy243; +#line 211 "../src/ast/lex.re" + { + tok += 2; /* skip ":=" */ + depth = 0; + code_line = cline; + goto code; + } +#line 1302 "src/ast/lex.cc" +yy227: + ++YYCURSOR; + YYCURSOR -= 1; +#line 308 "../src/ast/lex.re" + { + if (!globopts->FFlag) { + yylval.str = new std::string (tok, tok_len()); + return TOKEN_ID; + } else { + std::vector *str = new std::vector; + for (char *s = tok; s < cur; ++s) { + const uint32_t + chr = static_cast(*s), + col = static_cast(s - tok); + str->push_back(ASTChar(chr, col)); + } + yylval.regexp = ast_str(cline, get_column(), str, false); + return TOKEN_REGEXP; + } + } +#line 1323 "src/ast/lex.cc" +yy229: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yych <= ' ') { + if (yych == '\t') goto yy229; + if (yych <= 0x1F) goto yy245; + goto yy229; + } else { + if (yych <= ',') { + if (yych <= '+') goto yy245; + } else { + if (yych <= '<') goto yy245; + if (yych >= '?') goto yy245; + } + } +yy231: + ++YYCURSOR; + YYCURSOR = YYCTXMARKER; +#line 303 "../src/ast/lex.re" + { + yylval.str = new std::string (tok, tok_len ()); + return TOKEN_ID; + } +#line 1348 "src/ast/lex.cc" +yy233: + ++YYCURSOR; +#line 235 "../src/ast/lex.re" + { yylval.regexp = lex_cls(true); return TOKEN_REGEXP; } +#line 1353 "src/ast/lex.cc" +yy235: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '2') goto yy247; + goto yy205; +yy236: + ++YYCURSOR; +yy237: +#line 276 "../src/ast/lex.re" + { + fatal_lc(get_cline(), get_column(), "illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers"); + } +#line 1365 "src/ast/lex.cc" +yy238: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = (YYCTYPE)*YYCURSOR; + if (yybm[0+yych] & 64) { + goto yy238; + } + if (yych == ',') goto yy248; + if (yych == '}') goto yy249; + goto yy213; +yy240: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yych <= '^') { + if (yych <= '9') { + if (yych <= '/') goto yy213; + goto yy240; + } else { + if (yych <= '@') goto yy213; + if (yych <= 'Z') goto yy240; + goto yy213; + } + } else { + if (yych <= 'z') { + if (yych == '`') goto yy213; + goto yy240; + } else { + if (yych == '}') goto yy251; + goto yy213; + } + } +yy242: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'i') goto yy253; + goto yy213; +yy243: + ++YYCURSOR; + YYCURSOR -= 2; +#line 207 "../src/ast/lex.re" + { + return *tok; + } +#line 1409 "src/ast/lex.cc" +yy245: + ++YYCURSOR; + YYCURSOR = YYCTXMARKER; +#line 290 "../src/ast/lex.re" + { + yylval.str = new std::string (tok, tok_len ()); + if (globopts->FFlag) + { + lexer_state = LEX_FLEX_NAME; + return TOKEN_FID; + } + else + { + return TOKEN_ID; + } + } +#line 1426 "src/ast/lex.cc" +yy247: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'c') goto yy254; + goto yy205; +yy248: + yyaccept = 2; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych <= '/') goto yy237; + if (yych <= '9') goto yy255; + if (yych == '}') goto yy257; + goto yy237; +yy249: + ++YYCURSOR; +#line 245 "../src/ast/lex.re" + { + if (!s_to_u32_unsafe (tok + 1, cur - 1, yylval.bounds.min)) + { + fatal_lc(get_cline(), get_column(), "repetition count overflow"); + } + yylval.bounds.max = yylval.bounds.min; + return TOKEN_CLOSESIZE; + } +#line 1449 "src/ast/lex.cc" +yy251: + ++YYCURSOR; +#line 280 "../src/ast/lex.re" + { + if (!globopts->FFlag) { + fatal_lc(get_cline(), get_column(), "curly braces for names only allowed with -F switch"); + } + yylval.str = new std::string (tok + 1, tok_len () - 2); // -2 to omit braces + return TOKEN_ID; + } +#line 1460 "src/ast/lex.cc" +yy253: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'n') goto yy259; + goto yy213; +yy254: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == ':') goto yy260; + goto yy205; +yy255: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yych <= '/') goto yy213; + if (yych <= '9') goto yy255; + if (yych == '}') goto yy262; + goto yy213; +yy257: + ++YYCURSOR; +#line 267 "../src/ast/lex.re" + { + if (!s_to_u32_unsafe (tok + 1, cur - 2, yylval.bounds.min)) + { + fatal_lc(get_cline(), get_column(), "repetition lower bound overflow"); + } + yylval.bounds.max = std::numeric_limits::max(); + return TOKEN_CLOSESIZE; + } +#line 1488 "src/ast/lex.cc" +yy259: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy264; + goto yy213; +yy260: + ++YYCURSOR; +#line 288 "../src/ast/lex.re" + { return TOKEN_CONF; } +#line 1497 "src/ast/lex.cc" +yy262: + ++YYCURSOR; +#line 254 "../src/ast/lex.re" + { + const char * p = strchr (tok, ','); + if (!s_to_u32_unsafe (tok + 1, p, yylval.bounds.min)) + { + fatal_lc(get_cline(), get_column(), "repetition lower bound overflow"); + } + if (!s_to_u32_unsafe (p + 1, cur - 1, yylval.bounds.max)) + { + fatal_lc(get_cline(), get_column(), "repetition upper bound overflow"); + } + return TOKEN_CLOSESIZE; + } +#line 1513 "src/ast/lex.cc" +yy264: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= '0') goto yy266; + if (yych <= '9') goto yy213; + goto yy266; +yy265: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; +yy266: + if (yych <= 0x1F) { + if (yych == '\t') goto yy265; + goto yy213; + } else { + if (yych <= ' ') goto yy265; + if (yych <= '0') goto yy213; + if (yych >= ':') goto yy213; + YYCTXMARKER = YYCURSOR; + } +yy267: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = (YYCTYPE)*YYCURSOR; + if (yych <= '\r') { + if (yych <= '\t') { + if (yych <= 0x08) goto yy213; + } else { + if (yych <= '\n') goto yy271; + if (yych <= '\f') goto yy213; + goto yy273; + } + } else { + if (yych <= ' ') { + if (yych <= 0x1F) goto yy213; + } else { + if (yych <= '/') goto yy213; + if (yych <= '9') goto yy267; + goto yy213; + } + } +yy269: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yych <= 0x1F) { + if (yych == '\t') goto yy269; + goto yy213; + } else { + if (yych <= ' ') goto yy269; + if (yych == '"') goto yy274; + goto yy213; + } +yy271: + ++YYCURSOR; + YYCURSOR = YYCTXMARKER; +#line 334 "../src/ast/lex.re" + { + set_sourceline (); + return TOKEN_LINE_INFO; + } +#line 1574 "src/ast/lex.cc" +yy273: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '\n') goto yy271; + goto yy213; +yy274: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); + yych = (YYCTYPE)*YYCURSOR; + if (yybm[0+yych] & 128) { + goto yy274; + } + if (yych <= '\n') goto yy213; + if (yych >= '#') goto yy277; + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '\n') goto yy271; + if (yych == '\r') goto yy273; + goto yy213; +yy277: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yych == '\n') goto yy213; + goto yy274; +} +#line 355 "../src/ast/lex.re" + + +code: + +#line 1604 "src/ast/lex.cc" +{ + YYCTYPE yych; + unsigned int yyaccept = 0; + static const unsigned char yybm[] = { + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 112, 0, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 112, 96, 64, 96, 96, 96, 96, 32, + 96, 96, 96, 96, 96, 96, 96, 96, + 224, 224, 224, 224, 224, 224, 224, 224, + 224, 224, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 0, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, + }; + if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); + yych = (YYCTYPE)*YYCURSOR; + if (yych <= '&') { + if (yych <= '\n') { + if (yych <= 0x00) goto yy280; + if (yych <= '\t') goto yy282; + goto yy284; + } else { + if (yych == '"') goto yy286; + goto yy282; + } + } else { + if (yych <= '{') { + if (yych <= '\'') goto yy287; + if (yych <= 'z') goto yy282; + goto yy288; + } else { + if (yych == '}') goto yy290; + goto yy282; + } + } +yy280: + ++YYCURSOR; +#line 418 "../src/ast/lex.re" + { + if (cur == eof) + { + if (depth) + { + fatal_l(get_cline(), "missing '}'"); + } + return 0; + } + goto code; + } +#line 1677 "src/ast/lex.cc" +yy282: + ++YYCURSOR; +yy283: +#line 432 "../src/ast/lex.re" + { + goto code; + } +#line 1685 "src/ast/lex.cc" +yy284: + yyaccept = 0; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych <= '\r') { + if (yych <= '\t') { + if (yych >= '\t') goto yy292; + } else { + if (yych <= '\n') goto yy294; + if (yych >= '\r') goto yy294; + } + } else { + if (yych <= ' ') { + if (yych >= ' ') goto yy292; + } else { + if (yych == '#') goto yy295; + } + } +yy285: +#line 399 "../src/ast/lex.re" + { + if (depth == 0) + { + tok += strspn(tok, " \t\r\n"); + while (cur > tok && strchr(" \t\r\n", cur[-1])) + { + --cur; + } + yylval.code = new Code(get_fname (), code_line, tok, tok_len ()); + return TOKEN_CODE; + } + else if (cur == eof) + { + fatal_l(get_cline(), "missing '}'"); + } + pos = cur; + cline++; + goto code; + } +#line 1724 "src/ast/lex.cc" +yy286: + yyaccept = 1; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych == '\n') goto yy283; + goto yy299; +yy287: + yyaccept = 1; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych == '\n') goto yy283; + goto yy304; +yy288: + ++YYCURSOR; +#line 371 "../src/ast/lex.re" + { + if (depth == 0) + { + fatal_l(get_cline(), "Curly braces are not allowed after ':='"); + } + else + { + ++depth; + } + goto code; + } +#line 1749 "src/ast/lex.cc" +yy290: + ++YYCURSOR; +#line 359 "../src/ast/lex.re" + { + if (depth == 0) + { + fatal_l(get_cline(), "Curly braces are not allowed after ':='"); + } + else if (--depth == 0) + { + yylval.code = new Code(get_fname (), code_line, tok, tok_len ()); + return TOKEN_CODE; + } + goto code; + } +#line 1765 "src/ast/lex.cc" +yy292: + yyaccept = 2; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych <= 0x1F) { + if (yych == '\t') goto yy306; + } else { + if (yych <= ' ') goto yy306; + if (yych == '#') goto yy295; + } +yy293: + YYCURSOR -= 1; +#line 386 "../src/ast/lex.re" + { + if (depth == 0) + { + goto code; + } + else if (cur == eof) + { + fatal_l(get_cline(), "missing '}'"); + } + pos = cur; + cline++; + goto code; + } +#line 1791 "src/ast/lex.cc" +yy294: + ++YYCURSOR; + goto yy293; +yy295: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 5) YYFILL(5); + yych = (YYCTYPE)*YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy295; + } + if (yych == 'l') goto yy308; +yy297: + YYCURSOR = YYMARKER; + if (yyaccept <= 1) { + if (yyaccept == 0) { + goto yy285; + } else { + goto yy283; + } + } else { + goto yy293; + } +yy298: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; +yy299: + if (yybm[0+yych] & 32) { + goto yy298; + } + if (yych <= '\n') goto yy297; + if (yych >= '#') goto yy302; +yy300: + ++YYCURSOR; +#line 429 "../src/ast/lex.re" + { + goto code; + } +#line 1830 "src/ast/lex.cc" +yy302: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yych == '\n') goto yy297; + goto yy298; +yy303: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; +yy304: + if (yybm[0+yych] & 64) { + goto yy303; + } + if (yych <= '\n') goto yy297; + if (yych <= '\'') goto yy300; + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yych == '\n') goto yy297; + goto yy303; +yy306: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yych <= 0x1F) { + if (yych == '\t') goto yy306; + goto yy297; + } else { + if (yych <= ' ') goto yy306; + if (yych == '#') goto yy295; + goto yy297; + } +yy308: + yych = (YYCTYPE)*++YYCURSOR; + if (yych != 'i') goto yy297; + yych = (YYCTYPE)*++YYCURSOR; + if (yych != 'n') goto yy297; + yych = (YYCTYPE)*++YYCURSOR; + if (yych != 'e') goto yy297; + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= '0') goto yy313; + if (yych <= '9') goto yy297; + goto yy313; +yy312: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; +yy313: + if (yych <= 0x1F) { + if (yych == '\t') goto yy312; + goto yy297; + } else { + if (yych <= ' ') goto yy312; + if (yych <= '0') goto yy297; + if (yych >= ':') goto yy297; + YYCTXMARKER = YYCURSOR; + } +yy314: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = (YYCTYPE)*YYCURSOR; + if (yybm[0+yych] & 128) { + goto yy314; + } + if (yych <= '\f') { + if (yych <= 0x08) goto yy297; + if (yych <= '\t') goto yy316; + if (yych <= '\n') goto yy318; + goto yy297; + } else { + if (yych <= '\r') goto yy320; + if (yych != ' ') goto yy297; + } +yy316: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yych <= 0x1F) { + if (yych == '\t') goto yy316; + goto yy297; + } else { + if (yych <= ' ') goto yy316; + if (yych == '"') goto yy321; + goto yy297; + } +yy318: + ++YYCURSOR; + YYCURSOR = YYCTXMARKER; +#line 382 "../src/ast/lex.re" + { + set_sourceline (); + goto code; + } +#line 1925 "src/ast/lex.cc" +yy320: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '\n') goto yy318; + goto yy297; +yy321: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); + yych = (YYCTYPE)*YYCURSOR; + if (yych <= '!') { + if (yych == '\n') goto yy297; + goto yy321; + } else { + if (yych <= '"') goto yy323; + if (yych == '\\') goto yy324; + goto yy321; + } +yy323: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '\n') goto yy318; + if (yych == '\r') goto yy320; + goto yy297; +yy324: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yych == '\n') goto yy297; + goto yy321; +} +#line 435 "../src/ast/lex.re" + + +comment: + +#line 1959 "src/ast/lex.cc" +{ + YYCTYPE yych; + static const unsigned char yybm[] = { + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 160, 0, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 160, 128, 0, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 0, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + }; + if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = (YYCTYPE)*YYCURSOR; + if (yych <= ')') { + if (yych == '\n') goto yy329; + } else { + if (yych <= '*') goto yy331; + if (yych == '/') goto yy332; + } + ++YYCURSOR; +yy328: +#line 467 "../src/ast/lex.re" + { + if (cur == eof) + { + return 0; + } + goto comment; + } +#line 2014 "src/ast/lex.cc" +yy329: + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 32) { + goto yy333; + } + if (yych == '#') goto yy336; +yy330: +#line 458 "../src/ast/lex.re" + { + if (cur == eof) + { + return 0; + } + tok = pos = cur; + cline++; + goto comment; + } +#line 2032 "src/ast/lex.cc" +yy331: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '/') goto yy338; + goto yy328; +yy332: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '*') goto yy340; + goto yy328; +yy333: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yybm[0+yych] & 32) { + goto yy333; + } + if (yych == '#') goto yy336; +yy335: + YYCURSOR = YYMARKER; + goto yy330; +yy336: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 5) YYFILL(5); + yych = (YYCTYPE)*YYCURSOR; + if (yych <= 0x1F) { + if (yych == '\t') goto yy336; + goto yy335; + } else { + if (yych <= ' ') goto yy336; + if (yych == 'l') goto yy342; + goto yy335; + } +yy338: + ++YYCURSOR; +#line 439 "../src/ast/lex.re" + { + if (--depth == 0) + { + goto scan; + } + else + { + goto comment; + } + } +#line 2077 "src/ast/lex.cc" +yy340: + ++YYCURSOR; +#line 449 "../src/ast/lex.re" + { + ++depth; + fatal_lc(get_cline(), get_column(), "ambiguous /* found"); + goto comment; + } +#line 2086 "src/ast/lex.cc" +yy342: + yych = (YYCTYPE)*++YYCURSOR; + if (yych != 'i') goto yy335; + yych = (YYCTYPE)*++YYCURSOR; + if (yych != 'n') goto yy335; + yych = (YYCTYPE)*++YYCURSOR; + if (yych != 'e') goto yy335; + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= '0') goto yy347; + if (yych <= '9') goto yy335; + goto yy347; +yy346: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; +yy347: + if (yych <= 0x1F) { + if (yych == '\t') goto yy346; + goto yy335; + } else { + if (yych <= ' ') goto yy346; + if (yych <= '0') goto yy335; + if (yych >= ':') goto yy335; + YYCTXMARKER = YYCURSOR; + } +yy348: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = (YYCTYPE)*YYCURSOR; + if (yybm[0+yych] & 64) { + goto yy348; + } + if (yych <= '\f') { + if (yych <= 0x08) goto yy335; + if (yych <= '\t') goto yy350; + if (yych <= '\n') goto yy352; + goto yy335; + } else { + if (yych <= '\r') goto yy354; + if (yych != ' ') goto yy335; + } +yy350: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yych <= 0x1F) { + if (yych == '\t') goto yy350; + goto yy335; + } else { + if (yych <= ' ') goto yy350; + if (yych == '"') goto yy355; + goto yy335; + } +yy352: + ++YYCURSOR; + YYCURSOR = YYCTXMARKER; +#line 454 "../src/ast/lex.re" + { + set_sourceline (); + goto comment; + } +#line 2148 "src/ast/lex.cc" +yy354: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '\n') goto yy352; + goto yy335; +yy355: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); + yych = (YYCTYPE)*YYCURSOR; + if (yybm[0+yych] & 128) { + goto yy355; + } + if (yych <= '\n') goto yy335; + if (yych >= '#') goto yy358; + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '\n') goto yy352; + if (yych == '\r') goto yy354; + goto yy335; +yy358: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yych == '\n') goto yy335; + goto yy355; +} +#line 474 "../src/ast/lex.re" + + +nextLine: + +#line 2178 "src/ast/lex.cc" +{ + YYCTYPE yych; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yych == '\n') goto yy363; + ++YYCURSOR; +#line 485 "../src/ast/lex.re" + { if(cur == eof) { + return 0; + } + goto nextLine; + } +#line 2191 "src/ast/lex.cc" +yy363: + ++YYCURSOR; +#line 478 "../src/ast/lex.re" + { if(cur == eof) { + return 0; + } + tok = pos = cur; + cline++; + goto scan; + } +#line 2202 "src/ast/lex.cc" +} +#line 490 "../src/ast/lex.re" + +} + +static void escape (std::string & dest, const std::string & src) +{ + dest = src; + size_t l = dest.length(); + for (size_t p = 0; p < l; ++p) + { + if (dest[p] == '\\') + { + dest.insert(++p, "\\"); + ++l; + } + } +} + +const AST *Scanner::lex_cls(bool neg) +{ + std::vector *cls = new std::vector; + uint32_t u, l, c, c0 = get_column(); +fst: + tok = cur; + c = get_column(); + +#line 2230 "src/ast/lex.cc" +{ + YYCTYPE yych; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yych == ']') goto yy368; +#line 516 "../src/ast/lex.re" + { l = lex_cls_chr(); goto snd; } +#line 2238 "src/ast/lex.cc" +yy368: + ++YYCURSOR; +#line 515 "../src/ast/lex.re" + { return ast_cls(cline, c0, cls, neg); } +#line 2243 "src/ast/lex.cc" +} +#line 517 "../src/ast/lex.re" + +snd: + +#line 2249 "src/ast/lex.cc" +{ + YYCTYPE yych; + if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = (YYCTYPE)*(YYMARKER = YYCURSOR); + if (yych == '-') goto yy373; +yy372: +#line 520 "../src/ast/lex.re" + { u = l; goto add; } +#line 2258 "src/ast/lex.cc" +yy373: + yych = (YYCTYPE)*++YYCURSOR; + if (yych != ']') goto yy375; + YYCURSOR = YYMARKER; + goto yy372; +yy375: + ++YYCURSOR; + YYCURSOR -= 1; +#line 521 "../src/ast/lex.re" + { + u = lex_cls_chr(); + if (l > u) { + warn.swapped_range(cline, l, u); + std::swap(l, u); + } + goto add; + } +#line 2276 "src/ast/lex.cc" +} +#line 529 "../src/ast/lex.re" + +add: + cls->push_back(ASTRange(l, u, c)); + goto fst; +} + +uint32_t Scanner::lex_cls_chr() +{ + tok = cur; + const uint32_t l = get_cline(), c = get_column(); + +#line 2290 "src/ast/lex.cc" +{ + YYCTYPE yych; + unsigned int yyaccept = 0; + if ((YYLIMIT - YYCURSOR) < 10) YYFILL(10); + yych = (YYCTYPE)*YYCURSOR; + if (yych <= '\f') { + if (yych == '\n') goto yy381; + } else { + if (yych <= '\r') goto yy383; + if (yych == '\\') goto yy384; + } + ++YYCURSOR; +yy380: +#line 546 "../src/ast/lex.re" + { return static_cast(tok[0]); } +#line 2306 "src/ast/lex.cc" +yy381: + ++YYCURSOR; +#line 541 "../src/ast/lex.re" + { fatal_lc(l, c, "newline in character class"); } +#line 2311 "src/ast/lex.cc" +yy383: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '\n') goto yy381; + goto yy380; +yy384: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= ']') { + if (yych <= '3') { + if (yych <= '\r') { + if (yych == '\n') goto yy381; + if (yych >= '\r') goto yy387; + } else { + if (yych == '-') goto yy388; + if (yych >= '0') goto yy390; + } + } else { + if (yych <= 'W') { + if (yych <= '7') goto yy392; + if (yych == 'U') goto yy393; + } else { + if (yych <= 'X') goto yy395; + if (yych <= '[') goto yy385; + if (yych <= '\\') goto yy396; + goto yy398; + } + } + } else { + if (yych <= 'q') { + if (yych <= 'e') { + if (yych <= '`') goto yy385; + if (yych <= 'a') goto yy400; + if (yych <= 'b') goto yy402; + } else { + if (yych <= 'f') goto yy404; + if (yych == 'n') goto yy406; + } + } else { + if (yych <= 'u') { + if (yych <= 'r') goto yy408; + if (yych <= 's') goto yy385; + if (yych <= 't') goto yy410; + goto yy395; + } else { + if (yych <= 'v') goto yy412; + if (yych == 'x') goto yy414; + } + } + } +yy385: + ++YYCURSOR; +yy386: +#line 559 "../src/ast/lex.re" + { + warn.useless_escape(cline, get_column(), tok[1]); + return static_cast(tok[1]); + } +#line 2368 "src/ast/lex.cc" +yy387: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '\n') goto yy381; + goto yy386; +yy388: + ++YYCURSOR; +#line 557 "../src/ast/lex.re" + { return static_cast('-'); } +#line 2377 "src/ast/lex.cc" +yy390: + yyaccept = 0; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych <= '/') goto yy391; + if (yych <= '7') goto yy415; +yy391: +#line 543 "../src/ast/lex.re" + { fatal_lc(l, c, "syntax error in octal escape sequence"); } +#line 2386 "src/ast/lex.cc" +yy392: + ++YYCURSOR; + goto yy391; +yy393: + yyaccept = 1; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych <= '@') { + if (yych <= '/') goto yy394; + if (yych <= '9') goto yy417; + } else { + if (yych <= 'F') goto yy417; + if (yych <= '`') goto yy394; + if (yych <= 'f') goto yy417; + } +yy394: +#line 542 "../src/ast/lex.re" + { fatal_lc(l, c, "syntax error in hexadecimal escape sequence"); } +#line 2404 "src/ast/lex.cc" +yy395: + yyaccept = 1; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych <= '@') { + if (yych <= '/') goto yy394; + if (yych <= '9') goto yy418; + goto yy394; + } else { + if (yych <= 'F') goto yy418; + if (yych <= '`') goto yy394; + if (yych <= 'f') goto yy418; + goto yy394; + } +yy396: + ++YYCURSOR; +#line 556 "../src/ast/lex.re" + { return static_cast('\\'); } +#line 2422 "src/ast/lex.cc" +yy398: + ++YYCURSOR; +#line 558 "../src/ast/lex.re" + { return static_cast(']'); } +#line 2427 "src/ast/lex.cc" +yy400: + ++YYCURSOR; +#line 549 "../src/ast/lex.re" + { return static_cast('\a'); } +#line 2432 "src/ast/lex.cc" +yy402: + ++YYCURSOR; +#line 550 "../src/ast/lex.re" + { return static_cast('\b'); } +#line 2437 "src/ast/lex.cc" +yy404: + ++YYCURSOR; +#line 551 "../src/ast/lex.re" + { return static_cast('\f'); } +#line 2442 "src/ast/lex.cc" +yy406: + ++YYCURSOR; +#line 552 "../src/ast/lex.re" + { return static_cast('\n'); } +#line 2447 "src/ast/lex.cc" +yy408: + ++YYCURSOR; +#line 553 "../src/ast/lex.re" + { return static_cast('\r'); } +#line 2452 "src/ast/lex.cc" +yy410: + ++YYCURSOR; +#line 554 "../src/ast/lex.re" + { return static_cast('\t'); } +#line 2457 "src/ast/lex.cc" +yy412: + ++YYCURSOR; +#line 555 "../src/ast/lex.re" + { return static_cast('\v'); } +#line 2462 "src/ast/lex.cc" +yy414: + yyaccept = 1; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych <= '@') { + if (yych <= '/') goto yy394; + if (yych <= '9') goto yy419; + goto yy394; + } else { + if (yych <= 'F') goto yy419; + if (yych <= '`') goto yy394; + if (yych <= 'f') goto yy419; + goto yy394; + } +yy415: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= '/') goto yy416; + if (yych <= '7') goto yy420; +yy416: + YYCURSOR = YYMARKER; + if (yyaccept == 0) { + goto yy391; + } else { + goto yy394; + } +yy417: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy416; + if (yych <= '9') goto yy422; + goto yy416; + } else { + if (yych <= 'F') goto yy422; + if (yych <= '`') goto yy416; + if (yych <= 'f') goto yy422; + goto yy416; + } +yy418: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy416; + if (yych <= '9') goto yy423; + goto yy416; + } else { + if (yych <= 'F') goto yy423; + if (yych <= '`') goto yy416; + if (yych <= 'f') goto yy423; + goto yy416; + } +yy419: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy416; + if (yych <= '9') goto yy424; + goto yy416; + } else { + if (yych <= 'F') goto yy424; + if (yych <= '`') goto yy416; + if (yych <= 'f') goto yy424; + goto yy416; + } +yy420: + ++YYCURSOR; +#line 548 "../src/ast/lex.re" + { return unesc_oct(tok, cur); } +#line 2527 "src/ast/lex.cc" +yy422: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy416; + if (yych <= '9') goto yy426; + goto yy416; + } else { + if (yych <= 'F') goto yy426; + if (yych <= '`') goto yy416; + if (yych <= 'f') goto yy426; + goto yy416; + } +yy423: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy416; + if (yych <= '9') goto yy419; + goto yy416; + } else { + if (yych <= 'F') goto yy419; + if (yych <= '`') goto yy416; + if (yych <= 'f') goto yy419; + goto yy416; + } +yy424: + ++YYCURSOR; +#line 547 "../src/ast/lex.re" + { return unesc_hex(tok, cur); } +#line 2556 "src/ast/lex.cc" +yy426: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy416; + if (yych >= ':') goto yy416; + } else { + if (yych <= 'F') goto yy427; + if (yych <= '`') goto yy416; + if (yych >= 'g') goto yy416; + } +yy427: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy416; + if (yych <= '9') goto yy418; + goto yy416; + } else { + if (yych <= 'F') goto yy418; + if (yych <= '`') goto yy416; + if (yych <= 'f') goto yy418; + goto yy416; + } +} +#line 563 "../src/ast/lex.re" + +} + +uint32_t Scanner::lex_str_chr(char quote, bool &end) +{ + end = false; + tok = cur; + const uint32_t l = get_cline(), c = get_column(); + +#line 2590 "src/ast/lex.cc" +{ + YYCTYPE yych; + unsigned int yyaccept = 0; + if ((YYLIMIT - YYCURSOR) < 10) YYFILL(10); + yych = (YYCTYPE)*YYCURSOR; + if (yych <= '\f') { + if (yych == '\n') goto yy432; + } else { + if (yych <= '\r') goto yy434; + if (yych == '\\') goto yy435; + } + ++YYCURSOR; +yy431: +#line 578 "../src/ast/lex.re" + { + end = tok[0] == quote; + return static_cast(tok[0]); + } +#line 2609 "src/ast/lex.cc" +yy432: + ++YYCURSOR; +#line 573 "../src/ast/lex.re" + { fatal_lc(l, c, "newline in character string"); } +#line 2614 "src/ast/lex.cc" +yy434: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '\n') goto yy432; + goto yy431; +yy435: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= '`') { + if (yych <= '7') { + if (yych <= '\f') { + if (yych == '\n') goto yy432; + } else { + if (yych <= '\r') goto yy438; + if (yych <= '/') goto yy436; + if (yych <= '3') goto yy439; + goto yy441; + } + } else { + if (yych <= 'W') { + if (yych == 'U') goto yy442; + } else { + if (yych <= 'X') goto yy444; + if (yych == '\\') goto yy445; + } + } + } else { + if (yych <= 'q') { + if (yych <= 'e') { + if (yych <= 'a') goto yy447; + if (yych <= 'b') goto yy449; + } else { + if (yych <= 'f') goto yy451; + if (yych == 'n') goto yy453; + } + } else { + if (yych <= 'u') { + if (yych <= 'r') goto yy455; + if (yych <= 's') goto yy436; + if (yych <= 't') goto yy457; + goto yy444; + } else { + if (yych <= 'v') goto yy459; + if (yych == 'x') goto yy461; + } + } + } +yy436: + ++YYCURSOR; +yy437: +#line 592 "../src/ast/lex.re" + { + if (tok[1] != quote) { + warn.useless_escape(cline, get_column(), tok[1]); + } + return static_cast(tok[1]); + } +#line 2670 "src/ast/lex.cc" +yy438: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '\n') goto yy432; + goto yy437; +yy439: + yyaccept = 0; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych <= '/') goto yy440; + if (yych <= '7') goto yy462; +yy440: +#line 575 "../src/ast/lex.re" + { fatal_lc(l, c, "syntax error in octal escape sequence"); } +#line 2683 "src/ast/lex.cc" +yy441: + ++YYCURSOR; + goto yy440; +yy442: + yyaccept = 1; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych <= '@') { + if (yych <= '/') goto yy443; + if (yych <= '9') goto yy464; + } else { + if (yych <= 'F') goto yy464; + if (yych <= '`') goto yy443; + if (yych <= 'f') goto yy464; + } +yy443: +#line 574 "../src/ast/lex.re" + { fatal_lc(l, c, "syntax error in hexadecimal escape sequence"); } +#line 2701 "src/ast/lex.cc" +yy444: + yyaccept = 1; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych <= '@') { + if (yych <= '/') goto yy443; + if (yych <= '9') goto yy465; + goto yy443; + } else { + if (yych <= 'F') goto yy465; + if (yych <= '`') goto yy443; + if (yych <= 'f') goto yy465; + goto yy443; + } +yy445: + ++YYCURSOR; +#line 591 "../src/ast/lex.re" + { return static_cast('\\'); } +#line 2719 "src/ast/lex.cc" +yy447: + ++YYCURSOR; +#line 584 "../src/ast/lex.re" + { return static_cast('\a'); } +#line 2724 "src/ast/lex.cc" +yy449: + ++YYCURSOR; +#line 585 "../src/ast/lex.re" + { return static_cast('\b'); } +#line 2729 "src/ast/lex.cc" +yy451: + ++YYCURSOR; +#line 586 "../src/ast/lex.re" + { return static_cast('\f'); } +#line 2734 "src/ast/lex.cc" +yy453: + ++YYCURSOR; +#line 587 "../src/ast/lex.re" + { return static_cast('\n'); } +#line 2739 "src/ast/lex.cc" +yy455: + ++YYCURSOR; +#line 588 "../src/ast/lex.re" + { return static_cast('\r'); } +#line 2744 "src/ast/lex.cc" +yy457: + ++YYCURSOR; +#line 589 "../src/ast/lex.re" + { return static_cast('\t'); } +#line 2749 "src/ast/lex.cc" +yy459: + ++YYCURSOR; +#line 590 "../src/ast/lex.re" + { return static_cast('\v'); } +#line 2754 "src/ast/lex.cc" +yy461: + yyaccept = 1; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych <= '@') { + if (yych <= '/') goto yy443; + if (yych <= '9') goto yy466; + goto yy443; + } else { + if (yych <= 'F') goto yy466; + if (yych <= '`') goto yy443; + if (yych <= 'f') goto yy466; + goto yy443; + } +yy462: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= '/') goto yy463; + if (yych <= '7') goto yy467; +yy463: + YYCURSOR = YYMARKER; + if (yyaccept == 0) { + goto yy440; + } else { + goto yy443; + } +yy464: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy463; + if (yych <= '9') goto yy469; + goto yy463; + } else { + if (yych <= 'F') goto yy469; + if (yych <= '`') goto yy463; + if (yych <= 'f') goto yy469; + goto yy463; + } +yy465: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy463; + if (yych <= '9') goto yy470; + goto yy463; + } else { + if (yych <= 'F') goto yy470; + if (yych <= '`') goto yy463; + if (yych <= 'f') goto yy470; + goto yy463; + } +yy466: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy463; + if (yych <= '9') goto yy471; + goto yy463; + } else { + if (yych <= 'F') goto yy471; + if (yych <= '`') goto yy463; + if (yych <= 'f') goto yy471; + goto yy463; + } +yy467: + ++YYCURSOR; +#line 583 "../src/ast/lex.re" + { return unesc_oct(tok, cur); } +#line 2819 "src/ast/lex.cc" +yy469: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy463; + if (yych <= '9') goto yy473; + goto yy463; + } else { + if (yych <= 'F') goto yy473; + if (yych <= '`') goto yy463; + if (yych <= 'f') goto yy473; + goto yy463; + } +yy470: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy463; + if (yych <= '9') goto yy466; + goto yy463; + } else { + if (yych <= 'F') goto yy466; + if (yych <= '`') goto yy463; + if (yych <= 'f') goto yy466; + goto yy463; + } +yy471: + ++YYCURSOR; +#line 582 "../src/ast/lex.re" + { return unesc_hex(tok, cur); } +#line 2848 "src/ast/lex.cc" +yy473: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy463; + if (yych >= ':') goto yy463; + } else { + if (yych <= 'F') goto yy474; + if (yych <= '`') goto yy463; + if (yych >= 'g') goto yy463; + } +yy474: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= '@') { + if (yych <= '/') goto yy463; + if (yych <= '9') goto yy465; + goto yy463; + } else { + if (yych <= 'F') goto yy465; + if (yych <= '`') goto yy463; + if (yych <= 'f') goto yy465; + goto yy463; + } +} +#line 598 "../src/ast/lex.re" + +} + +const AST *Scanner::lex_str(char quote) +{ + const uint32_t column = get_column(); + std::vector *str = new std::vector; + for (bool end;;) { + const uint32_t c = lex_str_chr(quote, end); + if (end) return ast_str(cline, column, str, quote == '\''); + str->push_back(ASTChar(c, get_column())); + } +} + +void Scanner::set_sourceline () +{ +sourceline: + tok = cur; + +#line 2892 "src/ast/lex.cc" +{ + YYCTYPE yych; + static const unsigned char yybm[] = { + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 192, 192, 192, 192, 192, 192, 192, 192, + 192, 192, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 0, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + }; + if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = (YYCTYPE)*YYCURSOR; + if (yych <= '!') { + if (yych == '\n') goto yy479; + } else { + if (yych <= '"') goto yy481; + if (yych <= '0') goto yy477; + if (yych <= '9') goto yy482; + } +yy477: + ++YYCURSOR; +yy478: +#line 640 "../src/ast/lex.re" + { + goto sourceline; + } +#line 2945 "src/ast/lex.cc" +yy479: + ++YYCURSOR; +#line 628 "../src/ast/lex.re" + { + if (cur == eof) + { + --cur; + } + else + { + pos = cur; + } + tok = cur; + return; + } +#line 2961 "src/ast/lex.cc" +yy481: + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych == '\n') goto yy478; + goto yy486; +yy482: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yybm[0+yych] & 64) { + goto yy482; + } +#line 617 "../src/ast/lex.re" + { + if (!s_to_u32_unsafe (tok, cur, cline)) + { + fatal_lc(get_cline(), get_column(), "line number overflow"); + } + goto sourceline; + } +#line 2981 "src/ast/lex.cc" +yy485: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; +yy486: + if (yybm[0+yych] & 128) { + goto yy485; + } + if (yych <= '\n') goto yy487; + if (yych <= '"') goto yy488; + goto yy490; +yy487: + YYCURSOR = YYMARKER; + goto yy478; +yy488: + ++YYCURSOR; +#line 624 "../src/ast/lex.re" + { + escape (in.file_name, std::string (tok + 1, tok_len () - 2)); // -2 to omit quotes + goto sourceline; + } +#line 3003 "src/ast/lex.cc" +yy490: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = (YYCTYPE)*YYCURSOR; + if (yych == '\n') goto yy487; + goto yy485; +} +#line 643 "../src/ast/lex.re" + +} + +} // end namespace re2c diff --git a/bootstrap/src/ast/lex_conf.cc b/bootstrap/src/ast/lex_conf.cc new file mode 100644 index 0000000..713a935 --- /dev/null +++ b/bootstrap/src/ast/lex_conf.cc @@ -0,0 +1,4049 @@ +/* Generated by re2c 1.0.3 on Wed Nov 8 20:39:40 2017 */ +#line 1 "../src/ast/lex_conf.re" +#include "src/util/c99_stdint.h" +#include + +#include "src/code/output.h" +#include "src/conf/msg.h" +#include "src/re/encoding/enc.h" +#include "src/ast/scanner.h" +#include "src/util/s_to_n32_unsafe.h" + +namespace re2c +{ + +// global re2c config (affects the whole file) +#line 35 "../src/ast/lex_conf.re" + + +void Scanner::lex_conf(Opt &opts) +{ + tok = cur; + const uint32_t l = get_cline(), c = get_column(); + +#line 25 "src/ast/lex_conf.cc" +{ + unsigned char yych; + unsigned int yyaccept = 0; + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 64, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 64, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 32, 0, 0, + 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 32, 0, 0, 0, 0, 0, + 0, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 0, 0, 0, 0, 32, + 0, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + if ((lim - cur) < 28) fill(28); + yych = (unsigned char)*cur; + if (yych <= 'e') { + if (yych <= 'Z') { + if (yych <= '/') { + if (yych == '-') goto yy3; + } else { + if (yych <= ':') goto yy3; + if (yych >= 'A') goto yy3; + } + } else { + if (yych <= '`') { + if (yych == '_') goto yy3; + } else { + if (yych <= 'b') goto yy3; + if (yych <= 'c') goto yy5; + if (yych <= 'd') goto yy6; + goto yy3; + } + } + } else { + if (yych <= 's') { + if (yych <= 'i') { + if (yych <= 'f') goto yy7; + if (yych <= 'h') goto yy3; + goto yy8; + } else { + if (yych == 'l') goto yy9; + if (yych <= 'r') goto yy3; + goto yy10; + } + } else { + if (yych <= 'v') { + if (yych <= 't') goto yy11; + if (yych <= 'u') goto yy3; + goto yy12; + } else { + if (yych == 'y') goto yy13; + if (yych <= 'z') goto yy3; + } + } + } +yy2: +#line 161 "../src/ast/lex_conf.re" + { + fatal_lc(l, c, "unrecognized configuration '%.*s'", + static_cast(cur - tok), tok); + } +#line 111 "src/ast/lex_conf.cc" +yy3: + ++cur; + if (lim <= cur) fill(1); + yych = (unsigned char)*cur; +yy4: + if (yybm[0+yych] & 32) { + goto yy3; + } + goto yy2; +yy5: + yych = (unsigned char)*++cur; + if (yych == 'g') goto yy14; + if (yych == 'o') goto yy15; + goto yy4; +yy6: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy16; + goto yy4; +yy7: + yych = (unsigned char)*++cur; + if (yych == 'l') goto yy17; + goto yy4; +yy8: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy18; + goto yy4; +yy9: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy19; + goto yy4; +yy10: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy20; + goto yy4; +yy11: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy21; + goto yy4; +yy12: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy22; + goto yy4; +yy13: + yych = (unsigned char)*++cur; + if (yych == 'y') goto yy23; + goto yy4; +yy14: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy24; + goto yy4; +yy15: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy25; + goto yy4; +yy16: + yych = (unsigned char)*++cur; + if (yych == 'f') goto yy26; + goto yy4; +yy17: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy27; + goto yy4; +yy18: + yych = (unsigned char)*++cur; + if (yych == 'd') goto yy28; + goto yy4; +yy19: + yych = (unsigned char)*++cur; + if (yych == 'b') goto yy29; + goto yy4; +yy20: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy30; + goto yy4; +yy21: + yych = (unsigned char)*++cur; + if (yych == 'g') goto yy31; + goto yy4; +yy22: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy32; + goto yy4; +yy23: + yych = (unsigned char)*++cur; + if (yych <= 'c') { + if (yych <= 'a') goto yy4; + if (yych <= 'b') goto yy33; + goto yy34; + } else { + if (yych == 'f') goto yy35; + goto yy4; + } +yy24: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy36; + goto yy4; +yy25: + yych = (unsigned char)*++cur; + if (yych == 'd') goto yy37; + goto yy4; +yy26: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy38; + goto yy4; +yy27: + yych = (unsigned char)*++cur; + if (yych == 'g') goto yy39; + goto yy4; +yy28: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy40; + goto yy4; +yy29: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy41; + goto yy4; +yy30: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy42; + if (yych == 't') goto yy43; + goto yy4; +yy31: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy44; + goto yy4; +yy32: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy45; + goto yy4; +yy33: + yych = (unsigned char)*++cur; + if (yych == 'm') goto yy46; + goto yy4; +yy34: + yych = (unsigned char)*++cur; + if (yych == 'h') goto yy47; + goto yy4; +yy35: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy48; + goto yy4; +yy36: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy49; + goto yy4; +yy37: + yych = (unsigned char)*++cur; + if (yych <= 'd') { + if (yych == ':') goto yy50; + goto yy4; + } else { + if (yych <= 'e') goto yy51; + if (yych == 'p') goto yy52; + goto yy4; + } +yy38: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy53; + goto yy4; +yy39: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy54; + goto yy4; +yy40: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy55; + goto yy4; +yy41: + yych = (unsigned char)*++cur; + if (yych == 'l') goto yy56; + goto yy4; +yy42: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy57; + goto yy4; +yy43: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy58; + goto yy4; +yy44: + yych = (unsigned char)*++cur; + if (yych == ':') goto yy59; + goto yy4; +yy45: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy60; + goto yy4; +yy46: + yych = (unsigned char)*++cur; + if (yych == ':') goto yy61; + goto yy4; +yy47: + yych = (unsigned char)*++cur; + if (yych == ':') goto yy62; + goto yy4; +yy48: + yych = (unsigned char)*++cur; + if (yych == 'l') goto yy63; + goto yy4; +yy49: + yych = (unsigned char)*++cur; + if (yych == ':') goto yy64; + goto yy4; +yy50: + yych = (unsigned char)*++cur; + if (yych == 'd') goto yy65; + if (yych == 'g') goto yy66; + goto yy4; +yy51: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy67; + goto yy4; +yy52: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy68; + goto yy4; +yy53: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy69; + goto yy4; +yy54: + yych = (unsigned char)*++cur; + if (yych == ':') goto yy70; + goto yy4; +yy55: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy71; + goto yy4; +yy56: + yych = (unsigned char)*++cur; + if (yych == ':') goto yy72; + if (yych == 'p') goto yy73; + goto yy4; +yy57: + yych = (unsigned char)*++cur; + if (yych == 'l') goto yy74; + goto yy4; +yy58: + yych = (unsigned char)*++cur; + if (yych == ':') goto yy75; + goto yy4; +yy59: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy76; + if (yych == 'p') goto yy77; + goto yy4; +yy60: + yych = (unsigned char)*++cur; + if (yych == 'b') goto yy78; + goto yy4; +yy61: + yych = (unsigned char)*++cur; + if (yych == 'h') goto yy79; + goto yy4; +yy62: + yych = (unsigned char)*++cur; + if (yych == 'c') goto yy80; + if (yych == 'e') goto yy81; + goto yy4; +yy63: + yych = (unsigned char)*++cur; + if (yych == 'l') goto yy82; + goto yy4; +yy64: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy83; + goto yy4; +yy65: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy84; + goto yy4; +yy66: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy85; + goto yy4; +yy67: + yych = (unsigned char)*++cur; + if (yych == 'u') goto yy86; + goto yy4; +yy68: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy87; + goto yy4; +yy69: + yych = (unsigned char)*++cur; + if (yych == ':') goto yy88; + goto yy4; +yy70: + yych = (unsigned char)*++cur; + switch (yych) { + case '8': goto yy89; + case 'P': goto yy91; + case 'T': goto yy93; + case 'b': goto yy95; + case 'c': goto yy97; + case 'd': goto yy98; + case 'e': goto yy100; + case 'g': goto yy102; + case 'i': goto yy104; + case 'l': goto yy106; + case 'n': goto yy107; + case 'o': goto yy108; + case 'p': goto yy109; + case 's': goto yy110; + case 't': goto yy112; + case 'u': goto yy113; + case 'w': goto yy115; + case 'x': goto yy117; + default: goto yy4; + } +yy71: + yych = (unsigned char)*++cur; + if (yych == ':') goto yy119; + goto yy4; +yy72: + yych = (unsigned char)*++cur; + if (yych == 'y') goto yy120; + goto yy4; +yy73: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy121; + goto yy4; +yy74: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy122; + goto yy4; +yy75: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy123; + if (yych == 'n') goto yy124; + goto yy4; +yy76: + yych = (unsigned char)*++cur; + if (yych == 'x') goto yy125; + goto yy4; +yy77: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy126; + goto yy4; +yy78: + yych = (unsigned char)*++cur; + if (yych == 'l') goto yy127; + goto yy4; +yy79: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy128; + goto yy4; +yy80: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy129; + goto yy4; +yy81: + yych = (unsigned char)*++cur; + if (yych == 'm') goto yy130; + goto yy4; +yy82: + yych = (unsigned char)*++cur; + if (yych == ':') goto yy131; + goto yy4; +yy83: + yych = (unsigned char)*++cur; + if (yych == 'h') goto yy132; + goto yy4; +yy84: + yych = (unsigned char)*++cur; + if (yych == 'v') goto yy133; + goto yy4; +yy85: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy134; + goto yy4; +yy86: + yych = (unsigned char)*++cur; + if (yych == 'm') goto yy135; + goto yy4; +yy87: + yych = (unsigned char)*++cur; + if (yych == 'f') goto yy136; + goto yy4; +yy88: + yych = (unsigned char)*++cur; + if (yych == 'Y') goto yy137; + goto yy4; +yy89: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 59 "../src/ast/lex_conf.re" + { lex_conf_enc(Enc::UTF8, opts); return; } +#line 502 "src/ast/lex_conf.cc" +yy91: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 48 "../src/ast/lex_conf.re" + { opts.set_posix_captures(lex_conf_bool()); return; } +#line 510 "src/ast/lex_conf.cc" +yy93: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 47 "../src/ast/lex_conf.re" + { opts.set_tags(lex_conf_bool()); return; } +#line 518 "src/ast/lex_conf.cc" +yy95: + yych = (unsigned char)*++cur; + if (yych <= 'Z') { + if (yych <= '/') { + if (yych == '-') goto yy3; + } else { + if (yych <= ':') goto yy3; + if (yych >= 'A') goto yy3; + } + } else { + if (yych <= '`') { + if (yych == '_') goto yy3; + } else { + if (yych == 'i') goto yy138; + if (yych <= 'z') goto yy3; + } + } +yy96: +#line 42 "../src/ast/lex_conf.re" + { opts.set_bFlag(lex_conf_bool()); return; } +#line 539 "src/ast/lex_conf.cc" +yy97: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy139; + if (yych == 'o') goto yy140; + goto yy4; +yy98: + yych = (unsigned char)*++cur; + if (yych <= '^') { + if (yych <= '/') { + if (yych == '-') goto yy3; + } else { + if (yych <= ':') goto yy3; + if (yych <= '@') goto yy99; + if (yych <= 'Z') goto yy3; + } + } else { + if (yych <= 'd') { + if (yych != '`') goto yy3; + } else { + if (yych <= 'e') goto yy141; + if (yych <= 'f') goto yy142; + if (yych <= 'z') goto yy3; + } + } +yy99: +#line 43 "../src/ast/lex_conf.re" + { opts.set_dFlag(lex_conf_bool()); return; } +#line 567 "src/ast/lex_conf.cc" +yy100: + yych = (unsigned char)*++cur; + if (yych <= '_') { + if (yych <= ':') { + if (yych == '-') goto yy3; + if (yych >= '0') goto yy3; + } else { + if (yych <= '@') goto yy101; + if (yych <= 'Z') goto yy3; + if (yych >= '_') goto yy3; + } + } else { + if (yych <= 'c') { + if (yych <= '`') goto yy101; + if (yych <= 'a') goto yy143; + if (yych <= 'b') goto yy3; + goto yy144; + } else { + if (yych <= 'm') { + if (yych <= 'l') goto yy3; + goto yy145; + } else { + if (yych <= 'n') goto yy146; + if (yych <= 'z') goto yy3; + } + } + } +yy101: +#line 55 "../src/ast/lex_conf.re" + { lex_conf_enc(Enc::EBCDIC, opts); return; } +#line 598 "src/ast/lex_conf.cc" +yy102: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 44 "../src/ast/lex_conf.re" + { opts.set_gFlag(lex_conf_bool()); return; } +#line 606 "src/ast/lex_conf.cc" +yy104: + yych = (unsigned char)*++cur; + if (yych <= 'Z') { + if (yych <= '/') { + if (yych == '-') goto yy3; + } else { + if (yych <= ':') goto yy3; + if (yych >= 'A') goto yy3; + } + } else { + if (yych <= '`') { + if (yych == '_') goto yy3; + } else { + if (yych == 'n') goto yy147; + if (yych <= 'z') goto yy3; + } + } +yy105: +#line 45 "../src/ast/lex_conf.re" + { opts.set_iFlag(lex_conf_bool()); return; } +#line 627 "src/ast/lex_conf.cc" +yy106: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy148; + goto yy4; +yy107: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy149; + if (yych == 'o') goto yy150; + goto yy4; +yy108: + yych = (unsigned char)*++cur; + if (yych == 'p') goto yy151; + goto yy4; +yy109: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy152; + goto yy4; +yy110: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 46 "../src/ast/lex_conf.re" + { opts.set_sFlag(lex_conf_bool()); return; } +#line 652 "src/ast/lex_conf.cc" +yy112: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy153; + goto yy4; +yy113: + yych = (unsigned char)*++cur; + if (yych <= '^') { + if (yych <= '/') { + if (yych == '-') goto yy3; + } else { + if (yych <= ':') goto yy3; + if (yych <= '@') goto yy114; + if (yych <= 'Z') goto yy3; + } + } else { + if (yych <= 'n') { + if (yych == '`') goto yy114; + if (yych <= 'm') goto yy3; + goto yy154; + } else { + if (yych == 't') goto yy155; + if (yych <= 'z') goto yy3; + } + } +yy114: +#line 56 "../src/ast/lex_conf.re" + { lex_conf_enc(Enc::UTF32, opts); return; } +#line 680 "src/ast/lex_conf.cc" +yy115: + yych = (unsigned char)*++cur; + if (yych <= 'Z') { + if (yych <= '/') { + if (yych == '-') goto yy3; + } else { + if (yych <= ':') goto yy3; + if (yych >= 'A') goto yy3; + } + } else { + if (yych <= '`') { + if (yych == '_') goto yy3; + } else { + if (yych == 'i') goto yy156; + if (yych <= 'z') goto yy3; + } + } +yy116: +#line 57 "../src/ast/lex_conf.re" + { lex_conf_enc(Enc::UCS2, opts); return; } +#line 701 "src/ast/lex_conf.cc" +yy117: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 58 "../src/ast/lex_conf.re" + { lex_conf_enc(Enc::UTF16, opts); return; } +#line 709 "src/ast/lex_conf.cc" +yy119: + yych = (unsigned char)*++cur; + if (yych <= 'r') goto yy4; + if (yych <= 's') goto yy157; + if (yych <= 't') goto yy158; + goto yy4; +yy120: + yych = (unsigned char)*++cur; + if (yych == 'y') goto yy159; + goto yy4; +yy121: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy160; + goto yy4; +yy122: + yych = (unsigned char)*++cur; + if (yych == 'b') goto yy161; + goto yy4; +yy123: + yych = (unsigned char)*++cur; + if (yych == 'b') goto yy162; + goto yy4; +yy124: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy163; + goto yy4; +yy125: + yych = (unsigned char)*++cur; + if (yych == 'p') goto yy164; + goto yy4; +yy126: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy165; + goto yy4; +yy127: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy166; + goto yy4; +yy128: + yych = (unsigned char)*++cur; + if (yych == 'x') goto yy167; + goto yy4; +yy129: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy169; + goto yy4; +yy130: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy170; + goto yy4; +yy131: + yych = (unsigned char)*++cur; + if (yych <= 'd') { + if (yych == 'c') goto yy171; + goto yy4; + } else { + if (yych <= 'e') goto yy172; + if (yych == 'p') goto yy173; + goto yy4; + } +yy132: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy174; + goto yy4; +yy133: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy175; + goto yy4; +yy134: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy176; + goto yy4; +yy135: + yych = (unsigned char)*++cur; + if (yych == 'p') goto yy178; + goto yy4; +yy136: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy179; + goto yy4; +yy137: + yych = (unsigned char)*++cur; + if (yych == 'Y') goto yy180; + goto yy4; +yy138: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy181; + goto yy4; +yy139: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy182; + goto yy4; +yy140: + yych = (unsigned char)*++cur; + if (yych == 'm') goto yy183; + goto yy4; +yy141: + yych = (unsigned char)*++cur; + if (yych == 'b') goto yy184; + goto yy4; +yy142: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy185; + goto yy4; +yy143: + yych = (unsigned char)*++cur; + if (yych == 'g') goto yy186; + goto yy4; +yy144: + yych = (unsigned char)*++cur; + if (yych == 'b') goto yy187; + goto yy4; +yy145: + yych = (unsigned char)*++cur; + if (yych == 'p') goto yy188; + goto yy4; +yy146: + yych = (unsigned char)*++cur; + if (yych == 'c') goto yy189; + goto yy4; +yy147: + yych = (unsigned char)*++cur; + if (yych == 'p') goto yy190; + goto yy4; +yy148: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy191; + goto yy4; +yy149: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy192; + goto yy4; +yy150: + yych = (unsigned char)*++cur; + if (yych == '-') goto yy193; + goto yy4; +yy151: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy194; + goto yy4; +yy152: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy195; + goto yy4; +yy153: + yych = (unsigned char)*++cur; + if (yych == 'g') goto yy196; + goto yy4; +yy154: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy197; + goto yy4; +yy155: + yych = (unsigned char)*++cur; + if (yych == 'f') goto yy198; + goto yy4; +yy156: + yych = (unsigned char)*++cur; + if (yych == 'd') goto yy199; + goto yy4; +yy157: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy200; + goto yy4; +yy158: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy201; + goto yy4; +yy159: + yych = (unsigned char)*++cur; + if (yych == 'F') goto yy202; + if (yych == 'N') goto yy203; + goto yy4; +yy160: + yych = (unsigned char)*++cur; + if (yych == 'f') goto yy204; + goto yy4; +yy161: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy205; + goto yy4; +yy162: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy206; + goto yy4; +yy163: + yych = (unsigned char)*++cur; + if (yych == 'x') goto yy207; + goto yy4; +yy164: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy208; + goto yy4; +yy165: + yych = (unsigned char)*++cur; + if (yych == 'f') goto yy209; + goto yy4; +yy166: + yych = (unsigned char)*++cur; + if (yych == ':') goto yy210; + goto yy4; +yy167: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 92 "../src/ast/lex_conf.re" + { opts.set_yybmHexTable (lex_conf_bool()); return; } +#line 918 "src/ast/lex_conf.cc" +yy169: + yych = (unsigned char)*++cur; + if (yych == 'v') goto yy211; + goto yy4; +yy170: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy212; + goto yy4; +yy171: + yych = (unsigned char)*++cur; + if (yych == 'h') goto yy214; + goto yy4; +yy172: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy215; + goto yy4; +yy173: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy216; + goto yy4; +yy174: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy217; + goto yy4; +yy175: + yych = (unsigned char)*++cur; + if (yych == 'd') goto yy218; + goto yy4; +yy176: + yyaccept = 0; + yych = (unsigned char)*(mar = ++cur); + if (yybm[0+yych] & 32) { + goto yy3; + } + if (yych == '@') goto yy219; +yy177: +#line 76 "../src/ast/lex_conf.re" + { opts.set_condGoto (lex_conf_string ()); return; } +#line 957 "src/ast/lex_conf.cc" +yy178: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy221; + goto yy4; +yy179: + yych = (unsigned char)*++cur; + if (yych == 'x') goto yy222; + goto yy4; +yy180: + yych = (unsigned char)*++cur; + switch (yych) { + case 'B': goto yy224; + case 'C': goto yy225; + case 'D': goto yy226; + case 'F': goto yy227; + case 'G': goto yy228; + case 'L': goto yy229; + case 'M': goto yy230; + case 'P': goto yy231; + case 'R': goto yy232; + case 'S': goto yy233; + default: goto yy4; + } +yy181: + yych = (unsigned char)*++cur; + if (yych == '-') goto yy234; + goto yy4; +yy182: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy235; + goto yy4; +yy183: + yych = (unsigned char)*++cur; + if (yych == 'p') goto yy236; + goto yy4; +yy184: + yych = (unsigned char)*++cur; + if (yych == 'u') goto yy237; + goto yy4; +yy185: + yych = (unsigned char)*++cur; + if (yych == '-') goto yy238; + goto yy4; +yy186: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy239; + goto yy4; +yy187: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } + goto yy101; +yy188: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy240; + goto yy4; +yy189: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy241; + goto yy4; +yy190: + yych = (unsigned char)*++cur; + if (yych == 'u') goto yy242; + goto yy4; +yy191: + yych = (unsigned char)*++cur; + if (yych == 'k') goto yy243; + goto yy4; +yy192: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy244; + goto yy4; +yy193: + yych = (unsigned char)*++cur; + if (yych == 'd') goto yy245; + goto yy4; +yy194: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy246; + goto yy4; +yy195: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy247; + goto yy4; +yy196: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy93; + goto yy4; +yy197: + yych = (unsigned char)*++cur; + if (yych == 'c') goto yy248; + goto yy4; +yy198: + yych = (unsigned char)*++cur; + if (yych == '-') goto yy249; + goto yy4; +yy199: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy250; + goto yy4; +yy200: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy251; + goto yy4; +yy201: + yych = (unsigned char)*++cur; + if (yych == 'p') goto yy252; + goto yy4; +yy202: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy254; + goto yy4; +yy203: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy255; + goto yy4; +yy204: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy256; + goto yy4; +yy205: + yych = (unsigned char)*++cur; + if (yych == 'l') goto yy257; + goto yy4; +yy206: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy259; + goto yy4; +yy207: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy260; + goto yy4; +yy208: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy261; + goto yy4; +yy209: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy262; + goto yy4; +yy210: + yych = (unsigned char)*++cur; + if (yych == 'y') goto yy263; + goto yy4; +yy211: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy264; + goto yy4; +yy212: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 143 "../src/ast/lex_conf.re" + { opts.set_bEmitYYCh (lex_conf_bool()); return; } +#line 1114 "src/ast/lex_conf.cc" +yy214: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy265; + goto yy4; +yy215: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy266; + goto yy4; +yy216: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy267; + goto yy4; +yy217: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy268; + goto yy4; +yy218: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy269; + goto yy4; +yy219: + yych = (unsigned char)*++cur; + if (yych == 'c') goto yy270; +yy220: + cur = mar; + if (yyaccept <= 2) { + if (yyaccept <= 1) { + if (yyaccept == 0) { + goto yy177; + } else { + goto yy258; + } + } else { + goto yy328; + } + } else { + if (yyaccept <= 4) { + if (yyaccept == 3) { + goto yy395; + } else { + goto yy598; + } + } else { + goto yy675; + } + } +yy221: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy271; + goto yy4; +yy222: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 72 "../src/ast/lex_conf.re" + { opts.set_condPrefix (lex_conf_string ()); return; } +#line 1172 "src/ast/lex_conf.cc" +yy224: + yych = (unsigned char)*++cur; + if (yych == 'A') goto yy272; + goto yy4; +yy225: + yych = (unsigned char)*++cur; + if (yych <= 'S') { + if (yych == 'O') goto yy273; + goto yy4; + } else { + if (yych <= 'T') goto yy274; + if (yych <= 'U') goto yy275; + goto yy4; + } +yy226: + yych = (unsigned char)*++cur; + if (yych == 'E') goto yy276; + goto yy4; +yy227: + yych = (unsigned char)*++cur; + if (yych == 'I') goto yy277; + goto yy4; +yy228: + yych = (unsigned char)*++cur; + if (yych == 'E') goto yy278; + goto yy4; +yy229: + yych = (unsigned char)*++cur; + if (yych == 'E') goto yy279; + if (yych == 'I') goto yy280; + goto yy4; +yy230: + yych = (unsigned char)*++cur; + if (yych == 'A') goto yy281; + if (yych == 'T') goto yy282; + goto yy4; +yy231: + yych = (unsigned char)*++cur; + if (yych == 'E') goto yy283; + goto yy4; +yy232: + yych = (unsigned char)*++cur; + if (yych == 'E') goto yy284; + goto yy4; +yy233: + yych = (unsigned char)*++cur; + if (yych <= 'J') { + if (yych == 'E') goto yy285; + goto yy4; + } else { + if (yych <= 'K') goto yy286; + if (yych == 'T') goto yy287; + goto yy4; + } +yy234: + yych = (unsigned char)*++cur; + if (yych == 'v') goto yy288; + goto yy4; +yy235: + yych = (unsigned char)*++cur; + if (yych == '-') goto yy289; + goto yy4; +yy236: + yych = (unsigned char)*++cur; + if (yych == 'u') goto yy290; + goto yy4; +yy237: + yych = (unsigned char)*++cur; + if (yych == 'g') goto yy291; + goto yy4; +yy238: + yych = (unsigned char)*++cur; + if (yych == 'm') goto yy292; + goto yy4; +yy239: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy293; + goto yy4; +yy240: + yych = (unsigned char)*++cur; + if (yych == 'y') goto yy294; + goto yy4; +yy241: + yych = (unsigned char)*++cur; + if (yych == 'd') goto yy295; + goto yy4; +yy242: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy296; + goto yy4; +yy243: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy298; + goto yy4; +yy244: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy299; + goto yy4; +yy245: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy300; + goto yy4; +yy246: + yych = (unsigned char)*++cur; + if (yych == 'm') goto yy301; + goto yy4; +yy247: + yych = (unsigned char)*++cur; + if (yych == 'x') goto yy302; + goto yy4; +yy248: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy303; + goto yy4; +yy249: + yych = (unsigned char)*++cur; + if (yych == '1') goto yy304; + if (yych == '8') goto yy89; + goto yy4; +yy250: + yych = (unsigned char)*++cur; + if (yych == '-') goto yy305; + goto yy4; +yy251: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy306; + goto yy4; +yy252: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 128 "../src/ast/lex_conf.re" + { + const int32_t n = lex_conf_number (); + if (n < 0) + { + fatal_lc(l, c, "configuration 'indent:top' must be nonnegative"); + } + opts.set_topIndent (static_cast (n)); + return; + } +#line 1315 "src/ast/lex_conf.cc" +yy254: + yych = (unsigned char)*++cur; + if (yych == 'l') goto yy307; + goto yy4; +yy255: + yych = (unsigned char)*++cur; + if (yych == 'x') goto yy308; + goto yy4; +yy256: + yych = (unsigned char)*++cur; + if (yych == 'x') goto yy309; + goto yy4; +yy257: + yyaccept = 1; + yych = (unsigned char)*(mar = ++cur); + if (yybm[0+yych] & 32) { + goto yy3; + } + if (yych <= 0x1F) { + if (yych == '\t') { + ctx = cur; + goto yy311; + } + } else { + if (yych <= ' ') { + ctx = cur; + goto yy311; + } + if (yych == '=') { + ctx = cur; + goto yy313; + } + } +yy258: +#line 156 "../src/ast/lex_conf.re" + { opts.set_startlabel (lex_conf_string()); return; } +#line 1352 "src/ast/lex_conf.cc" +yy259: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy315; + goto yy4; +yy260: + yych = (unsigned char)*++cur; + if (yych == 'l') goto yy317; + goto yy4; +yy261: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy318; + goto yy4; +yy262: + yych = (unsigned char)*++cur; + if (yych == 'x') goto yy319; + goto yy4; +yy263: + yych = (unsigned char)*++cur; + if (yych == 'y') goto yy321; + goto yy4; +yy264: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy322; + goto yy4; +yy265: + yych = (unsigned char)*++cur; + if (yych == 'c') goto yy323; + goto yy4; +yy266: + yych = (unsigned char)*++cur; + if (yych == 'b') goto yy324; + goto yy4; +yy267: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy325; + goto yy4; +yy268: + yych = (unsigned char)*++cur; + if (yych == 'h') goto yy326; + goto yy4; +yy269: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy327; + goto yy4; +yy270: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy329; + goto yy220; +yy271: + yych = (unsigned char)*++cur; + if (yych == 'f') goto yy330; + goto yy4; +yy272: + yych = (unsigned char)*++cur; + if (yych == 'C') goto yy331; + goto yy4; +yy273: + yych = (unsigned char)*++cur; + if (yych == 'N') goto yy332; + goto yy4; +yy274: + yych = (unsigned char)*++cur; + if (yych <= 'W') goto yy4; + if (yych <= 'X') goto yy333; + if (yych <= 'Y') goto yy334; + goto yy4; +yy275: + yych = (unsigned char)*++cur; + if (yych == 'R') goto yy335; + goto yy4; +yy276: + yych = (unsigned char)*++cur; + if (yych == 'B') goto yy336; + goto yy4; +yy277: + yych = (unsigned char)*++cur; + if (yych == 'L') goto yy337; + goto yy4; +yy278: + yych = (unsigned char)*++cur; + if (yych == 'T') goto yy338; + goto yy4; +yy279: + yych = (unsigned char)*++cur; + if (yych == 'S') goto yy339; + goto yy4; +yy280: + yych = (unsigned char)*++cur; + if (yych == 'M') goto yy340; + goto yy4; +yy281: + yych = (unsigned char)*++cur; + if (yych == 'R') goto yy341; + goto yy4; +yy282: + yych = (unsigned char)*++cur; + if (yych == 'A') goto yy342; + goto yy4; +yy283: + yych = (unsigned char)*++cur; + if (yych == 'E') goto yy343; + goto yy4; +yy284: + yych = (unsigned char)*++cur; + if (yych == 'S') goto yy344; + goto yy4; +yy285: + yych = (unsigned char)*++cur; + if (yych == 'T') goto yy345; + goto yy4; +yy286: + yych = (unsigned char)*++cur; + if (yych == 'I') goto yy346; + goto yy4; +yy287: + yych = (unsigned char)*++cur; + if (yych == 'A') goto yy347; + goto yy4; +yy288: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy348; + goto yy4; +yy289: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy349; + goto yy4; +yy290: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy350; + goto yy4; +yy291: + yych = (unsigned char)*++cur; + if (yych == '-') goto yy351; + goto yy4; +yy292: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy352; + goto yy4; +yy293: + yych = (unsigned char)*++cur; + if (yych == '-') goto yy353; + goto yy4; +yy294: + yych = (unsigned char)*++cur; + if (yych == '-') goto yy354; + goto yy4; +yy295: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy355; + goto yy4; +yy296: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 62 "../src/ast/lex_conf.re" + { lex_conf_input(opts); return; } +#line 1510 "src/ast/lex_conf.cc" +yy298: + yych = (unsigned char)*++cur; + if (yych == 'h') goto yy356; + goto yy4; +yy299: + yych = (unsigned char)*++cur; + if (yych == 'd') goto yy357; + goto yy4; +yy300: + yych = (unsigned char)*++cur; + if (yych == 'b') goto yy358; + goto yy4; +yy301: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy359; + goto yy4; +yy302: + yych = (unsigned char)*++cur; + if (yych == '-') goto yy360; + goto yy4; +yy303: + yych = (unsigned char)*++cur; + if (yych == 'd') goto yy361; + goto yy4; +yy304: + yych = (unsigned char)*++cur; + if (yych == '6') goto yy117; + goto yy4; +yy305: + yych = (unsigned char)*++cur; + if (yych == 'c') goto yy362; + goto yy4; +yy306: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy363; + goto yy4; +yy307: + yych = (unsigned char)*++cur; + if (yych == 'l') goto yy364; + goto yy4; +yy308: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy365; + goto yy4; +yy309: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 152 "../src/ast/lex_conf.re" + { opts.set_labelPrefix (lex_conf_string ()); return; } +#line 1562 "src/ast/lex_conf.cc" +yy311: + ++cur; + if (lim <= cur) fill(1); + yych = (unsigned char)*cur; + if (yybm[0+yych] & 64) { + goto yy311; + } + if (yych != '=') goto yy220; +yy313: + ++cur; + if ((lim - cur) < 2) fill(2); + yych = (unsigned char)*cur; + if (yych <= ',') { + if (yych <= '\t') { + if (yych <= 0x08) goto yy220; + goto yy313; + } else { + if (yych == ' ') goto yy313; + goto yy220; + } + } else { + if (yych <= '/') { + if (yych <= '-') goto yy367; + goto yy220; + } else { + if (yych <= '0') goto yy368; + if (yych <= '9') goto yy370; + goto yy220; + } + } +yy315: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 87 "../src/ast/lex_conf.re" + { opts.set_bUseStateAbort (lex_conf_bool()); return; } +#line 1600 "src/ast/lex_conf.cc" +yy317: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy372; + goto yy4; +yy318: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy373; + goto yy4; +yy319: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 123 "../src/ast/lex_conf.re" + { opts.set_tags_prefix (lex_conf_string ()); return; } +#line 1616 "src/ast/lex_conf.cc" +yy321: + yych = (unsigned char)*++cur; + if (yych <= 'c') { + if (yych <= '`') goto yy4; + if (yych <= 'a') goto yy374; + if (yych <= 'b') goto yy375; + goto yy376; + } else { + if (yych <= 'r') goto yy4; + if (yych <= 's') goto yy377; + if (yych <= 't') goto yy378; + goto yy4; + } +yy322: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy379; + goto yy4; +yy323: + yych = (unsigned char)*++cur; + if (yych == 'k') goto yy380; + goto yy4; +yy324: + yych = (unsigned char)*++cur; + if (yych == 'l') goto yy382; + goto yy4; +yy325: + yych = (unsigned char)*++cur; + if (yych == 'm') goto yy383; + goto yy4; +yy326: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy384; + goto yy4; +yy327: + yyaccept = 2; + yych = (unsigned char)*(mar = ++cur); + if (yybm[0+yych] & 32) { + goto yy3; + } + if (yych == '@') goto yy385; +yy328: +#line 74 "../src/ast/lex_conf.re" + { opts.set_condDivider (lex_conf_string ()); return; } +#line 1660 "src/ast/lex_conf.cc" +yy329: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy386; + goto yy220; +yy330: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy387; + goto yy4; +yy331: + yych = (unsigned char)*++cur; + if (yych == 'K') goto yy388; + goto yy4; +yy332: + yych = (unsigned char)*++cur; + if (yych == 'D') goto yy389; + goto yy4; +yy333: + yych = (unsigned char)*++cur; + if (yych == 'M') goto yy390; + goto yy4; +yy334: + yych = (unsigned char)*++cur; + if (yych == 'P') goto yy391; + goto yy4; +yy335: + yych = (unsigned char)*++cur; + if (yych == 'S') goto yy392; + goto yy4; +yy336: + yych = (unsigned char)*++cur; + if (yych == 'U') goto yy393; + goto yy4; +yy337: + yych = (unsigned char)*++cur; + if (yych == 'L') goto yy394; + goto yy4; +yy338: + yych = (unsigned char)*++cur; + if (yych == 'C') goto yy396; + if (yych == 'S') goto yy397; + goto yy4; +yy339: + yych = (unsigned char)*++cur; + if (yych == 'S') goto yy398; + goto yy4; +yy340: + yych = (unsigned char)*++cur; + if (yych == 'I') goto yy399; + goto yy4; +yy341: + yych = (unsigned char)*++cur; + if (yych == 'K') goto yy400; + goto yy4; +yy342: + yych = (unsigned char)*++cur; + if (yych == 'G') goto yy401; + goto yy4; +yy343: + yych = (unsigned char)*++cur; + if (yych == 'K') goto yy402; + goto yy4; +yy344: + yych = (unsigned char)*++cur; + if (yych == 'T') goto yy404; + goto yy4; +yy345: + yych = (unsigned char)*++cur; + if (yych == 'C') goto yy405; + if (yych == 'S') goto yy406; + goto yy4; +yy346: + yych = (unsigned char)*++cur; + if (yych == 'P') goto yy407; + goto yy4; +yy347: + yych = (unsigned char)*++cur; + if (yych == 'G') goto yy409; + goto yy4; +yy348: + yych = (unsigned char)*++cur; + if (yych == 'c') goto yy410; + goto yy4; +yy349: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy411; + goto yy4; +yy350: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy412; + goto yy4; +yy351: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy413; + goto yy4; +yy352: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy414; + goto yy4; +yy353: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy415; + goto yy4; +yy354: + yych = (unsigned char)*++cur; + if (yych == 'c') goto yy416; + goto yy4; +yy355: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy417; + goto yy4; +yy356: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy418; + goto yy4; +yy357: + yych = (unsigned char)*++cur; + if (yych == '-') goto yy419; + goto yy4; +yy358: + yych = (unsigned char)*++cur; + if (yych == 'u') goto yy420; + goto yy4; +yy359: + yych = (unsigned char)*++cur; + if (yych == 'z') goto yy421; + goto yy4; +yy360: + yych = (unsigned char)*++cur; + if (yych == 'c') goto yy422; + goto yy4; +yy361: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy423; + goto yy4; +yy362: + yych = (unsigned char)*++cur; + if (yych == 'h') goto yy424; + goto yy4; +yy363: + yych = (unsigned char)*++cur; + if (yych == 'g') goto yy425; + goto yy4; +yy364: + yych = (unsigned char)*++cur; + if (yych == 'L') goto yy427; + goto yy4; +yy365: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 86 "../src/ast/lex_conf.re" + { opts.set_yynext (lex_conf_string ()); return; } +#line 1814 "src/ast/lex_conf.cc" +yy367: + yych = (unsigned char)*++cur; + if (yych <= '0') goto yy220; + if (yych <= '9') goto yy370; + goto yy220; +yy368: + ++cur; +yy369: + cur = ctx; +#line 155 "../src/ast/lex_conf.re" + { opts.set_startlabel_force (lex_conf_bool()); return; } +#line 1826 "src/ast/lex_conf.cc" +yy370: + ++cur; + if (lim <= cur) fill(1); + yych = (unsigned char)*cur; + if (yybm[0+yych] & 128) { + goto yy370; + } + goto yy369; +yy372: + yych = (unsigned char)*++cur; + if (yych == 'b') goto yy428; + goto yy4; +yy373: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy429; + goto yy4; +yy374: + yych = (unsigned char)*++cur; + if (yych == 'c') goto yy430; + goto yy4; +yy375: + yych = (unsigned char)*++cur; + if (yych == 'm') goto yy431; + goto yy4; +yy376: + yych = (unsigned char)*++cur; + if (yych == 'h') goto yy433; + if (yych == 't') goto yy435; + goto yy4; +yy377: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy436; + goto yy4; +yy378: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy437; + goto yy4; +yy379: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy438; + goto yy4; +yy380: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 150 "../src/ast/lex_conf.re" + { opts.set_fill_check (lex_conf_bool()); return; } +#line 1875 "src/ast/lex_conf.cc" +yy382: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy439; + goto yy4; +yy383: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy441; + goto yy4; +yy384: + yych = (unsigned char)*++cur; + if (yych == 'l') goto yy442; + goto yy4; +yy385: + yych = (unsigned char)*++cur; + if (yych == 'c') goto yy443; + goto yy220; +yy386: + yych = (unsigned char)*++cur; + if (yych == 'd') goto yy444; + goto yy220; +yy387: + yych = (unsigned char)*++cur; + if (yych == 'x') goto yy446; + goto yy4; +yy388: + yych = (unsigned char)*++cur; + if (yych == 'U') goto yy448; + goto yy4; +yy389: + yych = (unsigned char)*++cur; + if (yych == 'T') goto yy449; + goto yy4; +yy390: + yych = (unsigned char)*++cur; + if (yych == 'A') goto yy450; + goto yy4; +yy391: + yych = (unsigned char)*++cur; + if (yych == 'E') goto yy451; + goto yy4; +yy392: + yych = (unsigned char)*++cur; + if (yych == 'O') goto yy453; + goto yy4; +yy393: + yych = (unsigned char)*++cur; + if (yych == 'G') goto yy454; + goto yy4; +yy394: + yyaccept = 3; + yych = (unsigned char)*(mar = ++cur); + if (yych <= '?') { + if (yych <= '/') { + if (yych == '-') goto yy3; + } else { + if (yych <= '9') goto yy3; + if (yych <= ':') goto yy456; + } + } else { + if (yych <= '^') { + if (yych <= '@') goto yy457; + if (yych <= 'Z') goto yy3; + } else { + if (yych == '`') goto yy395; + if (yych <= 'z') goto yy3; + } + } +yy395: +#line 145 "../src/ast/lex_conf.re" + { opts.set_fill (lex_conf_string ()); return; } +#line 1946 "src/ast/lex_conf.cc" +yy396: + yych = (unsigned char)*++cur; + if (yych == 'O') goto yy458; + goto yy4; +yy397: + yych = (unsigned char)*++cur; + if (yych == 'T') goto yy459; + goto yy4; +yy398: + yych = (unsigned char)*++cur; + if (yych == 'T') goto yy460; + goto yy4; +yy399: + yych = (unsigned char)*++cur; + if (yych == 'T') goto yy461; + goto yy4; +yy400: + yych = (unsigned char)*++cur; + if (yych == 'E') goto yy463; + goto yy4; +yy401: + yych = (unsigned char)*++cur; + if (yych == 'N') goto yy464; + if (yych == 'P') goto yy466; + goto yy4; +yy402: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 110 "../src/ast/lex_conf.re" + { opts.set_yypeek (lex_conf_string ()); return; } +#line 1979 "src/ast/lex_conf.cc" +yy404: + yych = (unsigned char)*++cur; + if (yych == 'O') goto yy468; + goto yy4; +yy405: + yych = (unsigned char)*++cur; + if (yych == 'O') goto yy469; + goto yy4; +yy406: + yych = (unsigned char)*++cur; + if (yych == 'T') goto yy470; + goto yy4; +yy407: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 111 "../src/ast/lex_conf.re" + { opts.set_yyskip (lex_conf_string ()); return; } +#line 1999 "src/ast/lex_conf.cc" +yy409: + yych = (unsigned char)*++cur; + if (yych == 'N') goto yy471; + if (yych == 'P') goto yy473; + goto yy4; +yy410: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy475; + goto yy4; +yy411: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy476; + if (yych == 'v') goto yy477; + goto yy4; +yy412: + yych = (unsigned char)*++cur; + if (yych == 'd') goto yy478; + goto yy4; +yy413: + yych = (unsigned char)*++cur; + if (yych == 'u') goto yy479; + goto yy4; +yy414: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy480; + goto yy4; +yy415: + yych = (unsigned char)*++cur; + if (yych == 'k') goto yy481; + goto yy4; +yy416: + yych = (unsigned char)*++cur; + if (yych == 'l') goto yy482; + goto yy4; +yy417: + yych = (unsigned char)*++cur; + if (yych == 'g') goto yy483; + goto yy4; +yy418: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy484; + goto yy4; +yy419: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy485; + goto yy4; +yy420: + yych = (unsigned char)*++cur; + if (yych == 'g') goto yy486; + goto yy4; +yy421: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy487; + goto yy4; +yy422: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy488; + goto yy4; +yy423: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } + goto yy114; +yy424: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy489; + goto yy4; +yy425: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 126 "../src/ast/lex_conf.re" + { opts.set_indString (lex_conf_string ()); return; } +#line 2075 "src/ast/lex_conf.cc" +yy427: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy490; + goto yy4; +yy428: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy491; + goto yy4; +yy429: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy492; + goto yy4; +yy430: + yych = (unsigned char)*++cur; + if (yych == 'c') goto yy493; + goto yy4; +yy431: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 91 "../src/ast/lex_conf.re" + { opts.set_yybm (lex_conf_string ()); return; } +#line 2099 "src/ast/lex_conf.cc" +yy433: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 141 "../src/ast/lex_conf.re" + { opts.set_yych (lex_conf_string ()); return; } +#line 2107 "src/ast/lex_conf.cc" +yy435: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy494; + goto yy4; +yy436: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy495; + goto yy4; +yy437: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy496; + goto yy4; +yy438: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy497; + goto yy4; +yy439: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 146 "../src/ast/lex_conf.re" + { opts.set_fill_use (lex_conf_bool()); return; } +#line 2131 "src/ast/lex_conf.cc" +yy441: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy498; + goto yy4; +yy442: + yych = (unsigned char)*++cur; + if (yych == 'd') goto yy499; + goto yy4; +yy443: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy501; + goto yy220; +yy444: + ++cur; +#line 77 "../src/ast/lex_conf.re" + { opts.set_condGotoParam (lex_conf_string ()); return; } +#line 2148 "src/ast/lex_conf.cc" +yy446: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 73 "../src/ast/lex_conf.re" + { opts.set_condEnumPrefix (lex_conf_string ()); return; } +#line 2156 "src/ast/lex_conf.cc" +yy448: + yych = (unsigned char)*++cur; + if (yych == 'P') goto yy502; + goto yy4; +yy449: + yych = (unsigned char)*++cur; + if (yych == 'Y') goto yy504; + goto yy4; +yy450: + yych = (unsigned char)*++cur; + if (yych == 'R') goto yy505; + goto yy4; +yy451: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 140 "../src/ast/lex_conf.re" + { opts.set_yyctype (lex_conf_string ()); return; } +#line 2176 "src/ast/lex_conf.cc" +yy453: + yych = (unsigned char)*++cur; + if (yych == 'R') goto yy506; + goto yy4; +yy454: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 138 "../src/ast/lex_conf.re" + { opts.set_yydebug (lex_conf_string ()); return; } +#line 2188 "src/ast/lex_conf.cc" +yy456: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy508; + goto yy4; +yy457: + yych = (unsigned char)*++cur; + if (yych == 'l') goto yy509; + goto yy220; +yy458: + yych = (unsigned char)*++cur; + if (yych == 'N') goto yy510; + goto yy4; +yy459: + yych = (unsigned char)*++cur; + if (yych == 'A') goto yy511; + goto yy4; +yy460: + yych = (unsigned char)*++cur; + if (yych == 'H') goto yy512; + goto yy4; +yy461: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 108 "../src/ast/lex_conf.re" + { opts.set_yylimit (lex_conf_string ()); return; } +#line 2216 "src/ast/lex_conf.cc" +yy463: + yych = (unsigned char)*++cur; + if (yych == 'R') goto yy513; + goto yy4; +yy464: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 120 "../src/ast/lex_conf.re" + { opts.set_yymtagn (lex_conf_string ()); return; } +#line 2228 "src/ast/lex_conf.cc" +yy466: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 121 "../src/ast/lex_conf.re" + { opts.set_yymtagp (lex_conf_string ()); return; } +#line 2236 "src/ast/lex_conf.cc" +yy468: + yych = (unsigned char)*++cur; + if (yych == 'R') goto yy515; + goto yy4; +yy469: + yych = (unsigned char)*++cur; + if (yych == 'N') goto yy516; + goto yy4; +yy470: + yych = (unsigned char)*++cur; + if (yych == 'A') goto yy517; + goto yy4; +yy471: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 118 "../src/ast/lex_conf.re" + { opts.set_yystagn (lex_conf_string ()); return; } +#line 2256 "src/ast/lex_conf.cc" +yy473: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 119 "../src/ast/lex_conf.re" + { opts.set_yystagp (lex_conf_string ()); return; } +#line 2264 "src/ast/lex_conf.cc" +yy475: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy518; + goto yy4; +yy476: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy519; + goto yy4; +yy477: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy520; + goto yy4; +yy478: + yych = (unsigned char)*++cur; + if (yych == '-') goto yy521; + goto yy4; +yy479: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy522; + goto yy4; +yy480: + yych = (unsigned char)*++cur; + if (yych == 'm') goto yy523; + goto yy4; +yy481: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy524; + goto yy4; +yy482: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy525; + goto yy4; +yy483: + yych = (unsigned char)*++cur; + if (yych == '-') goto yy526; + goto yy4; +yy484: + yych = (unsigned char)*++cur; + if (yych == 'd') goto yy527; + goto yy4; +yy485: + yych = (unsigned char)*++cur; + if (yych == 'f') goto yy529; + goto yy4; +yy486: + yych = (unsigned char)*++cur; + if (yych == '-') goto yy530; + goto yy4; +yy487: + yych = (unsigned char)*++cur; + if (yych == '-') goto yy531; + goto yy4; +yy488: + yych = (unsigned char)*++cur; + if (yych == 'p') goto yy532; + goto yy4; +yy489: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy533; + goto yy4; +yy490: + yych = (unsigned char)*++cur; + if (yych == 'b') goto yy534; + goto yy4; +yy491: + yych = (unsigned char)*++cur; + if (yych == 'l') goto yy535; + goto yy4; +yy492: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy537; + goto yy4; +yy493: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy539; + goto yy4; +yy494: + yych = (unsigned char)*++cur; + if (yych == 'b') goto yy540; + goto yy4; +yy495: + yych = (unsigned char)*++cur; + if (yych == 'b') goto yy541; + goto yy4; +yy496: + yych = (unsigned char)*++cur; + if (yych == 'g') goto yy542; + goto yy4; +yy497: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy543; + goto yy4; +yy498: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy545; + goto yy4; +yy499: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 94 "../src/ast/lex_conf.re" + { + const int32_t n = lex_conf_number (); + if (n < 0) + { + fatal_lc(l, c, "configuration 'cgoto:threshold' must be nonnegative"); + } + opts.set_cGotoThreshold (static_cast (n)); + return; + } +#line 2376 "src/ast/lex_conf.cc" +yy501: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy546; + goto yy220; +yy502: + yych = (unsigned char)*++cur; + if (yych <= 'B') { + if (yych <= '/') { + if (yych == '-') goto yy3; + } else { + if (yych <= ':') goto yy3; + if (yych >= 'A') goto yy3; + } + } else { + if (yych <= '^') { + if (yych <= 'C') goto yy547; + if (yych <= 'Z') goto yy3; + } else { + if (yych == '`') goto yy503; + if (yych <= 'z') goto yy3; + } + } +yy503: +#line 112 "../src/ast/lex_conf.re" + { opts.set_yybackup (lex_conf_string ()); return; } +#line 2402 "src/ast/lex_conf.cc" +yy504: + yych = (unsigned char)*++cur; + if (yych == 'P') goto yy548; + goto yy4; +yy505: + yych = (unsigned char)*++cur; + if (yych == 'K') goto yy549; + goto yy4; +yy506: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 105 "../src/ast/lex_conf.re" + { opts.set_yycursor (lex_conf_string ()); return; } +#line 2418 "src/ast/lex_conf.cc" +yy508: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy550; + goto yy4; +yy509: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy551; + goto yy220; +yy510: + yych = (unsigned char)*++cur; + if (yych == 'D') goto yy552; + goto yy4; +yy511: + yych = (unsigned char)*++cur; + if (yych == 'T') goto yy553; + goto yy4; +yy512: + yych = (unsigned char)*++cur; + if (yych == 'A') goto yy554; + goto yy4; +yy513: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 106 "../src/ast/lex_conf.re" + { opts.set_yymarker (lex_conf_string ()); return; } +#line 2446 "src/ast/lex_conf.cc" +yy515: + yych = (unsigned char)*++cur; + if (yych == 'E') goto yy555; + goto yy4; +yy516: + yych = (unsigned char)*++cur; + if (yych == 'D') goto yy557; + goto yy4; +yy517: + yych = (unsigned char)*++cur; + if (yych == 'T') goto yy558; + goto yy4; +yy518: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy559; + goto yy4; +yy519: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy560; + goto yy4; +yy520: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy561; + goto yy4; +yy521: + yych = (unsigned char)*++cur; + if (yych == 'g') goto yy562; + goto yy4; +yy522: + yych = (unsigned char)*++cur; + if (yych == 'p') goto yy563; + goto yy4; +yy523: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy564; + goto yy4; +yy524: + yych = (unsigned char)*++cur; + if (yych == 'p') goto yy565; + goto yy4; +yy525: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy567; + goto yy4; +yy526: + yych = (unsigned char)*++cur; + if (yych == 'p') goto yy568; + goto yy4; +yy527: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 51 "../src/ast/lex_conf.re" + { opts.set_lookahead(lex_conf_bool()); return; } +#line 2502 "src/ast/lex_conf.cc" +yy529: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy110; + goto yy4; +yy530: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy569; + goto yy4; +yy531: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy570; + goto yy4; +yy532: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy571; + goto yy4; +yy533: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy572; + goto yy4; +yy534: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy573; + goto yy4; +yy535: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 88 "../src/ast/lex_conf.re" + { opts.set_bUseStateNext (lex_conf_bool()); return; } +#line 2534 "src/ast/lex_conf.cc" +yy537: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 124 "../src/ast/lex_conf.re" + { opts.set_tags_expression(lex_conf_string ()); return; } +#line 2542 "src/ast/lex_conf.cc" +yy539: + yych = (unsigned char)*++cur; + if (yych == 'p') goto yy574; + goto yy4; +yy540: + yych = (unsigned char)*++cur; + if (yych == 'l') goto yy575; + goto yy4; +yy541: + yych = (unsigned char)*++cur; + if (yych == 'l') goto yy576; + goto yy4; +yy542: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy577; + goto yy4; +yy543: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 142 "../src/ast/lex_conf.re" + { opts.set_yychConversion (lex_conf_bool()); return; } +#line 2566 "src/ast/lex_conf.cc" +yy545: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy578; + goto yy4; +yy546: + yych = (unsigned char)*++cur; + if (yych == 'd') goto yy580; + goto yy220; +yy547: + yych = (unsigned char)*++cur; + if (yych == 'T') goto yy582; + goto yy4; +yy548: + yych = (unsigned char)*++cur; + if (yych == 'E') goto yy583; + goto yy4; +yy549: + yych = (unsigned char)*++cur; + if (yych == 'E') goto yy585; + goto yy4; +yy550: + yych = (unsigned char)*++cur; + if (yych == 'k') goto yy586; + goto yy4; +yy551: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy587; + goto yy220; +yy552: + yych = (unsigned char)*++cur; + if (yych == 'I') goto yy589; + goto yy4; +yy553: + yych = (unsigned char)*++cur; + if (yych == 'E') goto yy590; + goto yy4; +yy554: + yych = (unsigned char)*++cur; + if (yych == 'N') goto yy592; + goto yy4; +yy555: + yych = (unsigned char)*++cur; + if (yych <= 'C') { + if (yych <= '/') { + if (yych == '-') goto yy3; + } else { + if (yych <= ':') goto yy3; + if (yych <= '@') goto yy556; + if (yych <= 'B') goto yy3; + goto yy594; + } + } else { + if (yych <= '^') { + if (yych == 'T') goto yy595; + if (yych <= 'Z') goto yy3; + } else { + if (yych == '`') goto yy556; + if (yych <= 'z') goto yy3; + } + } +yy556: +#line 114 "../src/ast/lex_conf.re" + { opts.set_yyrestore (lex_conf_string ()); return; } +#line 2630 "src/ast/lex_conf.cc" +yy557: + yych = (unsigned char)*++cur; + if (yych == 'I') goto yy596; + goto yy4; +yy558: + yych = (unsigned char)*++cur; + if (yych == 'E') goto yy597; + goto yy4; +yy559: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy599; + goto yy4; +yy560: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy600; + goto yy4; +yy561: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy601; + goto yy4; +yy562: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy602; + goto yy4; +yy563: + yych = (unsigned char)*++cur; + if (yych == 'u') goto yy603; + goto yy4; +yy564: + yych = (unsigned char)*++cur; + if (yych == 'z') goto yy604; + goto yy4; +yy565: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 53 "../src/ast/lex_conf.re" + { opts.set_eager_skip(lex_conf_bool()); return; } +#line 2670 "src/ast/lex_conf.cc" +yy567: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy605; + goto yy4; +yy568: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy607; + goto yy4; +yy569: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy608; + goto yy4; +yy570: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy609; + goto yy4; +yy571: + yych = (unsigned char)*++cur; + if (yych == 'u') goto yy610; + goto yy4; +yy572: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } + goto yy116; +yy573: + yych = (unsigned char)*++cur; + if (yych == 'l') goto yy611; + goto yy4; +yy574: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy613; + goto yy4; +yy575: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy615; + goto yy4; +yy576: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy617; + goto yy4; +yy577: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy619; + goto yy4; +yy578: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 148 "../src/ast/lex_conf.re" + { opts.set_fill_arg_use (lex_conf_bool()); return; } +#line 2724 "src/ast/lex_conf.cc" +yy580: + ++cur; +#line 75 "../src/ast/lex_conf.re" + { opts.set_condDividerParam (lex_conf_string ()); return; } +#line 2729 "src/ast/lex_conf.cc" +yy582: + yych = (unsigned char)*++cur; + if (yych == 'X') goto yy621; + goto yy4; +yy583: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 66 "../src/ast/lex_conf.re" + { opts.set_yycondtype (lex_conf_string ()); return; } +#line 2741 "src/ast/lex_conf.cc" +yy585: + yych = (unsigned char)*++cur; + if (yych == 'R') goto yy623; + goto yy4; +yy586: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy625; + goto yy4; +yy587: + ++cur; +#line 147 "../src/ast/lex_conf.re" + { opts.set_fill_arg (lex_conf_string ()); return; } +#line 2754 "src/ast/lex_conf.cc" +yy589: + yych = (unsigned char)*++cur; + if (yych == 'T') goto yy626; + goto yy4; +yy590: + yych = (unsigned char)*++cur; + if (yych <= '@') { + if (yych <= '/') { + if (yych == '-') goto yy3; + } else { + if (yych <= '9') goto yy3; + if (yych <= ':') goto yy627; + } + } else { + if (yych <= '_') { + if (yych <= 'Z') goto yy3; + if (yych >= '_') goto yy3; + } else { + if (yych <= '`') goto yy591; + if (yych <= 'z') goto yy3; + } + } +yy591: +#line 80 "../src/ast/lex_conf.re" + { opts.set_state_get (lex_conf_string ()); return; } +#line 2780 "src/ast/lex_conf.cc" +yy592: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 117 "../src/ast/lex_conf.re" + { opts.set_yylessthan (lex_conf_string ()); return; } +#line 2788 "src/ast/lex_conf.cc" +yy594: + yych = (unsigned char)*++cur; + if (yych == 'T') goto yy628; + goto yy4; +yy595: + yych = (unsigned char)*++cur; + if (yych == 'A') goto yy629; + goto yy4; +yy596: + yych = (unsigned char)*++cur; + if (yych == 'T') goto yy630; + goto yy4; +yy597: + yyaccept = 4; + yych = (unsigned char)*(mar = ++cur); + if (yych <= '?') { + if (yych <= '/') { + if (yych == '-') goto yy3; + } else { + if (yych <= '9') goto yy3; + if (yych <= ':') goto yy631; + } + } else { + if (yych <= '^') { + if (yych <= '@') goto yy632; + if (yych <= 'Z') goto yy3; + } else { + if (yych == '`') goto yy598; + if (yych <= 'z') goto yy3; + } + } +yy598: +#line 82 "../src/ast/lex_conf.re" + { opts.set_state_set (lex_conf_string ()); return; } +#line 2823 "src/ast/lex_conf.cc" +yy599: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } + goto yy96; +yy600: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy633; + goto yy4; +yy601: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy634; + goto yy4; +yy602: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy635; + goto yy4; +yy603: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy636; + goto yy4; +yy604: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy637; + goto yy4; +yy605: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 63 "../src/ast/lex_conf.re" + { lex_conf_empty_class(opts); return; } +#line 2857 "src/ast/lex_conf.cc" +yy607: + yych = (unsigned char)*++cur; + if (yych == 'l') goto yy638; + goto yy4; +yy608: + yych = (unsigned char)*++cur; + if (yych == 'f') goto yy639; + goto yy4; +yy609: + yych = (unsigned char)*++cur; + if (yych == 'g') goto yy640; + goto yy4; +yy610: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy641; + goto yy4; +yy611: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 85 "../src/ast/lex_conf.re" + { opts.set_yyfilllabel (lex_conf_string ()); return; } +#line 2881 "src/ast/lex_conf.cc" +yy613: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 89 "../src/ast/lex_conf.re" + { opts.set_yyaccept (lex_conf_string ()); return; } +#line 2889 "src/ast/lex_conf.cc" +yy615: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 78 "../src/ast/lex_conf.re" + { opts.set_yyctable (lex_conf_string ()); return; } +#line 2897 "src/ast/lex_conf.cc" +yy617: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 159 "../src/ast/lex_conf.re" + { lex_conf_string (); return; } +#line 2905 "src/ast/lex_conf.cc" +yy619: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 103 "../src/ast/lex_conf.re" + { opts.set_yytarget (lex_conf_string ()); return; } +#line 2913 "src/ast/lex_conf.cc" +yy621: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 113 "../src/ast/lex_conf.re" + { opts.set_yybackupctx (lex_conf_string ()); return; } +#line 2921 "src/ast/lex_conf.cc" +yy623: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 107 "../src/ast/lex_conf.re" + { opts.set_yyctxmarker (lex_conf_string ()); return; } +#line 2929 "src/ast/lex_conf.cc" +yy625: + yych = (unsigned char)*++cur; + if (yych == 'd') goto yy642; + goto yy4; +yy626: + yych = (unsigned char)*++cur; + if (yych == 'I') goto yy644; + goto yy4; +yy627: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy645; + goto yy4; +yy628: + yych = (unsigned char)*++cur; + if (yych == 'X') goto yy646; + goto yy4; +yy629: + yych = (unsigned char)*++cur; + if (yych == 'G') goto yy648; + goto yy4; +yy630: + yych = (unsigned char)*++cur; + if (yych == 'I') goto yy650; + goto yy4; +yy631: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy651; + goto yy4; +yy632: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy652; + goto yy220; +yy633: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy653; + goto yy4; +yy634: + yych = (unsigned char)*++cur; + if (yych == 'd') goto yy654; + goto yy4; +yy635: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy656; + goto yy4; +yy636: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } + goto yy99; +yy637: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy657; + goto yy4; +yy638: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy658; + goto yy4; +yy639: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy659; + goto yy4; +yy640: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy660; + goto yy4; +yy641: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy662; + goto yy4; +yy642: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 149 "../src/ast/lex_conf.re" + { opts.set_fill_naked (lex_conf_bool()); return; } +#line 3007 "src/ast/lex_conf.cc" +yy644: + yych = (unsigned char)*++cur; + if (yych == 'O') goto yy663; + goto yy4; +yy645: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy664; + goto yy4; +yy646: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 115 "../src/ast/lex_conf.re" + { opts.set_yyrestorectx (lex_conf_string ()); return; } +#line 3023 "src/ast/lex_conf.cc" +yy648: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 116 "../src/ast/lex_conf.re" + { opts.set_yyrestoretag (lex_conf_string ()); return; } +#line 3031 "src/ast/lex_conf.cc" +yy650: + yych = (unsigned char)*++cur; + if (yych == 'O') goto yy665; + goto yy4; +yy651: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy666; + goto yy4; +yy652: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy667; + goto yy220; +yy653: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy668; + goto yy4; +yy654: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 50 "../src/ast/lex_conf.re" + { opts.set_bCaseInverted(lex_conf_bool()); return; } +#line 3055 "src/ast/lex_conf.cc" +yy656: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy102; + goto yy4; +yy657: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy669; + goto yy4; +yy658: + yych = (unsigned char)*++cur; + if (yych == 'c') goto yy670; + goto yy4; +yy659: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } + goto yy105; +yy660: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 52 "../src/ast/lex_conf.re" + { opts.set_optimize_tags(lex_conf_bool()); return; } +#line 3081 "src/ast/lex_conf.cc" +yy662: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy91; + goto yy4; +yy663: + yych = (unsigned char)*++cur; + if (yych == 'N') goto yy671; + goto yy4; +yy664: + yych = (unsigned char)*++cur; + if (yych == 'k') goto yy673; + goto yy4; +yy665: + yych = (unsigned char)*++cur; + if (yych == 'N') goto yy674; + goto yy4; +yy666: + yych = (unsigned char)*++cur; + if (yych == 'k') goto yy676; + goto yy4; +yy667: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy677; + goto yy220; +yy668: + yych = (unsigned char)*++cur; + if (yych == 'v') goto yy678; + goto yy4; +yy669: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy679; + goto yy4; +yy670: + yych = (unsigned char)*++cur; + if (yych == 'y') goto yy680; + goto yy4; +yy671: + yych = (unsigned char)*++cur; + if (yych <= '@') { + if (yych <= '/') { + if (yych == '-') goto yy3; + } else { + if (yych <= '9') goto yy3; + if (yych <= ':') goto yy682; + } + } else { + if (yych <= '_') { + if (yych <= 'Z') goto yy3; + if (yych >= '_') goto yy3; + } else { + if (yych <= '`') goto yy672; + if (yych <= 'z') goto yy3; + } + } +yy672: +#line 67 "../src/ast/lex_conf.re" + { opts.set_cond_get (lex_conf_string ()); return; } +#line 3139 "src/ast/lex_conf.cc" +yy673: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy683; + goto yy4; +yy674: + yyaccept = 5; + yych = (unsigned char)*(mar = ++cur); + if (yych <= '?') { + if (yych <= '/') { + if (yych == '-') goto yy3; + } else { + if (yych <= '9') goto yy3; + if (yych <= ':') goto yy684; + } + } else { + if (yych <= '^') { + if (yych <= '@') goto yy685; + if (yych <= 'Z') goto yy3; + } else { + if (yych == '`') goto yy675; + if (yych <= 'z') goto yy3; + } + } +yy675: +#line 69 "../src/ast/lex_conf.re" + { opts.set_cond_set (lex_conf_string ()); return; } +#line 3166 "src/ast/lex_conf.cc" +yy676: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy686; + goto yy4; +yy677: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy687; + goto yy220; +yy678: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy688; + goto yy4; +yy679: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy690; + goto yy4; +yy680: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 61 "../src/ast/lex_conf.re" + { lex_conf_encoding_policy(opts); return; } +#line 3190 "src/ast/lex_conf.cc" +yy682: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy692; + goto yy4; +yy683: + yych = (unsigned char)*++cur; + if (yych == 'd') goto yy693; + goto yy4; +yy684: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy695; + goto yy4; +yy685: + yych = (unsigned char)*++cur; + if (yych == 'c') goto yy696; + goto yy220; +yy686: + yych = (unsigned char)*++cur; + if (yych == 'd') goto yy697; + goto yy4; +yy687: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy699; + goto yy220; +yy688: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 49 "../src/ast/lex_conf.re" + { opts.set_bCaseInsensitive(lex_conf_bool()); return; } +#line 3222 "src/ast/lex_conf.cc" +yy690: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 64 "../src/ast/lex_conf.re" + { lex_conf_dfa_minimization(opts); return; } +#line 3230 "src/ast/lex_conf.cc" +yy692: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy701; + goto yy4; +yy693: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 81 "../src/ast/lex_conf.re" + { opts.set_state_get_naked (lex_conf_bool()); return; } +#line 3242 "src/ast/lex_conf.cc" +yy695: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy702; + goto yy4; +yy696: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy703; + goto yy220; +yy697: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 83 "../src/ast/lex_conf.re" + { opts.set_state_set_naked (lex_conf_bool()); return; } +#line 3258 "src/ast/lex_conf.cc" +yy699: + ++cur; +#line 84 "../src/ast/lex_conf.re" + { opts.set_state_set_arg (lex_conf_string ()); return; } +#line 3263 "src/ast/lex_conf.cc" +yy701: + yych = (unsigned char)*++cur; + if (yych == 'k') goto yy704; + goto yy4; +yy702: + yych = (unsigned char)*++cur; + if (yych == 'k') goto yy705; + goto yy4; +yy703: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy706; + goto yy220; +yy704: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy707; + goto yy4; +yy705: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy708; + goto yy4; +yy706: + yych = (unsigned char)*++cur; + if (yych == 'd') goto yy709; + goto yy220; +yy707: + yych = (unsigned char)*++cur; + if (yych == 'd') goto yy711; + goto yy4; +yy708: + yych = (unsigned char)*++cur; + if (yych == 'd') goto yy713; + goto yy4; +yy709: + ++cur; +#line 70 "../src/ast/lex_conf.re" + { opts.set_cond_set_arg (lex_conf_string ()); return; } +#line 3300 "src/ast/lex_conf.cc" +yy711: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 68 "../src/ast/lex_conf.re" + { opts.set_cond_get_naked (lex_conf_bool()); return; } +#line 3308 "src/ast/lex_conf.cc" +yy713: + yych = (unsigned char)*++cur; + if (yybm[0+yych] & 32) { + goto yy3; + } +#line 71 "../src/ast/lex_conf.re" + { opts.set_cond_set_naked (lex_conf_bool()); return; } +#line 3316 "src/ast/lex_conf.cc" +} +#line 165 "../src/ast/lex_conf.re" + +} + +void Scanner::lex_conf_encoding_policy(Opt &opts) +{ + lex_conf_assign (); + +#line 3326 "src/ast/lex_conf.cc" +{ + unsigned char yych; + if ((lim - cur) < 10) fill(10); + yych = (unsigned char)*cur; + if (yych <= 'h') { + if (yych == 'f') goto yy719; + } else { + if (yych <= 'i') goto yy720; + if (yych == 's') goto yy721; + } + ++cur; +yy718: +#line 172 "../src/ast/lex_conf.re" + { fatal_lc(get_cline(), get_column(), + "bad configuration value (expected: 'ignore', 'substitute', 'fail')"); } +#line 3342 "src/ast/lex_conf.cc" +yy719: + yych = (unsigned char)*(mar = ++cur); + if (yych == 'a') goto yy722; + goto yy718; +yy720: + yych = (unsigned char)*(mar = ++cur); + if (yych == 'g') goto yy724; + goto yy718; +yy721: + yych = (unsigned char)*(mar = ++cur); + if (yych == 'u') goto yy725; + goto yy718; +yy722: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy726; +yy723: + cur = mar; + goto yy718; +yy724: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy727; + goto yy723; +yy725: + yych = (unsigned char)*++cur; + if (yych == 'b') goto yy728; + goto yy723; +yy726: + yych = (unsigned char)*++cur; + if (yych == 'l') goto yy729; + goto yy723; +yy727: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy731; + goto yy723; +yy728: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy732; + goto yy723; +yy729: + ++cur; +#line 176 "../src/ast/lex_conf.re" + { opts.set_encoding_policy(Enc::POLICY_FAIL); goto end; } +#line 3385 "src/ast/lex_conf.cc" +yy731: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy733; + goto yy723; +yy732: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy734; + goto yy723; +yy733: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy735; + goto yy723; +yy734: + yych = (unsigned char)*++cur; + if (yych == 'i') goto yy737; + goto yy723; +yy735: + ++cur; +#line 174 "../src/ast/lex_conf.re" + { opts.set_encoding_policy(Enc::POLICY_IGNORE); goto end; } +#line 3406 "src/ast/lex_conf.cc" +yy737: + yych = (unsigned char)*++cur; + if (yych != 't') goto yy723; + yych = (unsigned char)*++cur; + if (yych != 'u') goto yy723; + yych = (unsigned char)*++cur; + if (yych != 't') goto yy723; + yych = (unsigned char)*++cur; + if (yych != 'e') goto yy723; + ++cur; +#line 175 "../src/ast/lex_conf.re" + { opts.set_encoding_policy(Enc::POLICY_SUBSTITUTE); goto end; } +#line 3419 "src/ast/lex_conf.cc" +} +#line 177 "../src/ast/lex_conf.re" + +end: + lex_conf_semicolon(); +} + +void Scanner::lex_conf_input(Opt &opts) +{ + lex_conf_assign (); + +#line 3431 "src/ast/lex_conf.cc" +{ + unsigned char yych; + if ((lim - cur) < 7) fill(7); + yych = (unsigned char)*cur; + if (yych <= 'b') goto yy745; + if (yych <= 'c') goto yy747; + if (yych <= 'd') goto yy748; +yy745: + ++cur; +yy746: +#line 186 "../src/ast/lex_conf.re" + { fatal_lc(get_cline(), get_column(), + "bad configuration value (expected: 'default', 'custom')"); } +#line 3445 "src/ast/lex_conf.cc" +yy747: + yych = (unsigned char)*(mar = ++cur); + if (yych == 'u') goto yy749; + goto yy746; +yy748: + yych = (unsigned char)*(mar = ++cur); + if (yych == 'e') goto yy751; + goto yy746; +yy749: + yych = (unsigned char)*++cur; + if (yych == 's') goto yy752; +yy750: + cur = mar; + goto yy746; +yy751: + yych = (unsigned char)*++cur; + if (yych == 'f') goto yy753; + goto yy750; +yy752: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy754; + goto yy750; +yy753: + yych = (unsigned char)*++cur; + if (yych == 'a') goto yy755; + goto yy750; +yy754: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy756; + goto yy750; +yy755: + yych = (unsigned char)*++cur; + if (yych == 'u') goto yy757; + goto yy750; +yy756: + yych = (unsigned char)*++cur; + if (yych == 'm') goto yy758; + goto yy750; +yy757: + yych = (unsigned char)*++cur; + if (yych == 'l') goto yy760; + goto yy750; +yy758: + ++cur; +#line 189 "../src/ast/lex_conf.re" + { opts.set_input_api(INPUT_CUSTOM); goto end; } +#line 3492 "src/ast/lex_conf.cc" +yy760: + yych = (unsigned char)*++cur; + if (yych != 't') goto yy750; + ++cur; +#line 188 "../src/ast/lex_conf.re" + { opts.set_input_api(INPUT_DEFAULT); goto end; } +#line 3499 "src/ast/lex_conf.cc" +} +#line 190 "../src/ast/lex_conf.re" + +end: + lex_conf_semicolon(); +} + +void Scanner::lex_conf_empty_class(Opt &opts) +{ + lex_conf_assign (); + +#line 3511 "src/ast/lex_conf.cc" +{ + unsigned char yych; + if ((lim - cur) < 11) fill(11); + yych = (unsigned char)*cur; + if (yych == 'e') goto yy767; + if (yych == 'm') goto yy768; + ++cur; +yy766: +#line 199 "../src/ast/lex_conf.re" + { fatal_lc(get_cline(), get_column(), + "bad configuration value (expected: 'match-empty', 'match-none', 'error')"); } +#line 3523 "src/ast/lex_conf.cc" +yy767: + yych = (unsigned char)*(mar = ++cur); + if (yych == 'r') goto yy769; + goto yy766; +yy768: + yych = (unsigned char)*(mar = ++cur); + if (yych == 'a') goto yy771; + goto yy766; +yy769: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy772; +yy770: + cur = mar; + goto yy766; +yy771: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy773; + goto yy770; +yy772: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy774; + goto yy770; +yy773: + yych = (unsigned char)*++cur; + if (yych == 'c') goto yy775; + goto yy770; +yy774: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy776; + goto yy770; +yy775: + yych = (unsigned char)*++cur; + if (yych == 'h') goto yy778; + goto yy770; +yy776: + ++cur; +#line 203 "../src/ast/lex_conf.re" + { opts.set_empty_class_policy(EMPTY_CLASS_ERROR); goto end; } +#line 3562 "src/ast/lex_conf.cc" +yy778: + yych = (unsigned char)*++cur; + if (yych != '-') goto yy770; + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy780; + if (yych == 'n') goto yy781; + goto yy770; +yy780: + yych = (unsigned char)*++cur; + if (yych == 'm') goto yy782; + goto yy770; +yy781: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy783; + goto yy770; +yy782: + yych = (unsigned char)*++cur; + if (yych == 'p') goto yy784; + goto yy770; +yy783: + yych = (unsigned char)*++cur; + if (yych == 'n') goto yy785; + goto yy770; +yy784: + yych = (unsigned char)*++cur; + if (yych == 't') goto yy786; + goto yy770; +yy785: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy787; + goto yy770; +yy786: + yych = (unsigned char)*++cur; + if (yych == 'y') goto yy789; + goto yy770; +yy787: + ++cur; +#line 202 "../src/ast/lex_conf.re" + { opts.set_empty_class_policy(EMPTY_CLASS_MATCH_NONE); goto end; } +#line 3602 "src/ast/lex_conf.cc" +yy789: + ++cur; +#line 201 "../src/ast/lex_conf.re" + { opts.set_empty_class_policy(EMPTY_CLASS_MATCH_EMPTY); goto end; } +#line 3607 "src/ast/lex_conf.cc" +} +#line 204 "../src/ast/lex_conf.re" + +end: + lex_conf_semicolon(); +} + +void Scanner::lex_conf_dfa_minimization(Opt &opts) +{ + lex_conf_assign (); + +#line 3619 "src/ast/lex_conf.cc" +{ + unsigned char yych; + if ((lim - cur) < 5) fill(5); + yych = (unsigned char)*cur; + if (yych == 'm') goto yy795; + if (yych == 't') goto yy796; + ++cur; +yy794: +#line 213 "../src/ast/lex_conf.re" + { fatal_lc(get_cline(), get_column(), + "bad configuration value (expected: 'table', 'moore')"); } +#line 3631 "src/ast/lex_conf.cc" +yy795: + yych = (unsigned char)*(mar = ++cur); + if (yych == 'o') goto yy797; + goto yy794; +yy796: + yych = (unsigned char)*(mar = ++cur); + if (yych == 'a') goto yy799; + goto yy794; +yy797: + yych = (unsigned char)*++cur; + if (yych == 'o') goto yy800; +yy798: + cur = mar; + goto yy794; +yy799: + yych = (unsigned char)*++cur; + if (yych == 'b') goto yy801; + goto yy798; +yy800: + yych = (unsigned char)*++cur; + if (yych == 'r') goto yy802; + goto yy798; +yy801: + yych = (unsigned char)*++cur; + if (yych == 'l') goto yy803; + goto yy798; +yy802: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy804; + goto yy798; +yy803: + yych = (unsigned char)*++cur; + if (yych == 'e') goto yy806; + goto yy798; +yy804: + ++cur; +#line 216 "../src/ast/lex_conf.re" + { opts.set_dfa_minimization(DFA_MINIMIZATION_MOORE); goto end; } +#line 3670 "src/ast/lex_conf.cc" +yy806: + ++cur; +#line 215 "../src/ast/lex_conf.re" + { opts.set_dfa_minimization(DFA_MINIMIZATION_TABLE); goto end; } +#line 3675 "src/ast/lex_conf.cc" +} +#line 217 "../src/ast/lex_conf.re" + +end: + lex_conf_semicolon(); +} + +void Scanner::lex_conf_enc(Enc::type_t enc, Opt &opts) +{ + if (lex_conf_bool()) { + opts.set_encoding(enc); + } else { + opts.unset_encoding(enc); + } +} + +void Scanner::lex_conf_assign () +{ + +#line 3695 "src/ast/lex_conf.cc" +{ + unsigned char yych; + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + if ((lim - cur) < 2) fill(2); + yych = (unsigned char)*cur; + if (yych <= 0x1F) { + if (yych == '\t') goto yy812; + } else { + if (yych <= ' ') goto yy812; + if (yych == '=') goto yy813; + } + ++cur; +yy811: +#line 234 "../src/ast/lex_conf.re" + { fatal_lc(get_cline(), get_column(), "missing '=' in configuration"); } +#line 3744 "src/ast/lex_conf.cc" +yy812: + yych = (unsigned char)*(mar = ++cur); + if (yych <= 0x1F) { + if (yych == '\t') goto yy816; + goto yy811; + } else { + if (yych <= ' ') goto yy816; + if (yych != '=') goto yy811; + } +yy813: + ++cur; + if (lim <= cur) fill(1); + yych = (unsigned char)*cur; + if (yybm[0+yych] & 128) { + goto yy813; + } +#line 235 "../src/ast/lex_conf.re" + { return; } +#line 3763 "src/ast/lex_conf.cc" +yy816: + ++cur; + if (lim <= cur) fill(1); + yych = (unsigned char)*cur; + if (yych <= 0x1F) { + if (yych == '\t') goto yy816; + } else { + if (yych <= ' ') goto yy816; + if (yych == '=') goto yy813; + } + cur = mar; + goto yy811; +} +#line 236 "../src/ast/lex_conf.re" + +} + +void Scanner::lex_conf_semicolon () +{ + +#line 3784 "src/ast/lex_conf.cc" +{ + unsigned char yych; + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 128, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + if ((lim - cur) < 2) fill(2); + yych = (unsigned char)*cur; + if (yych <= 0x1F) { + if (yych == '\t') goto yy823; + } else { + if (yych <= ' ') goto yy823; + if (yych == ';') goto yy824; + } + ++cur; +yy822: +#line 242 "../src/ast/lex_conf.re" + { fatal_lc(get_cline(), get_column(), "missing ending ';' in configuration"); } +#line 3833 "src/ast/lex_conf.cc" +yy823: + yych = (unsigned char)*(mar = ++cur); + if (yybm[0+yych] & 128) { + goto yy826; + } + if (yych != ';') goto yy822; +yy824: + ++cur; +#line 243 "../src/ast/lex_conf.re" + { return; } +#line 3844 "src/ast/lex_conf.cc" +yy826: + ++cur; + if (lim <= cur) fill(1); + yych = (unsigned char)*cur; + if (yybm[0+yych] & 128) { + goto yy826; + } + if (yych == ';') goto yy824; + cur = mar; + goto yy822; +} +#line 244 "../src/ast/lex_conf.re" + +} + +bool Scanner::lex_conf_bool() +{ + return lex_conf_number() != 0; +} + +int32_t Scanner::lex_conf_number () +{ + lex_conf_assign (); + tok = cur; + +#line 3870 "src/ast/lex_conf.cc" +{ + unsigned char yych; + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + }; + if ((lim - cur) < 2) fill(2); + yych = (unsigned char)*cur; + if (yych <= '/') { + if (yych == '-') goto yy832; + } else { + if (yych <= '0') goto yy833; + if (yych <= '9') goto yy835; + } +yy831: +yy832: + yych = (unsigned char)*++cur; + if (yych <= '0') goto yy831; + if (yych <= '9') goto yy835; + goto yy831; +yy833: + ++cur; +yy834: +#line 257 "../src/ast/lex_conf.re" + { + int32_t n = 0; + if (!s_to_i32_unsafe (tok, cur, n)) { + fatal_lc(get_cline(), get_column(), "configuration value overflow"); + } + lex_conf_semicolon (); + return n; + } +#line 3933 "src/ast/lex_conf.cc" +yy835: + ++cur; + if (lim <= cur) fill(1); + yych = (unsigned char)*cur; + if (yybm[0+yych] & 128) { + goto yy835; + } + goto yy834; +} +#line 265 "../src/ast/lex_conf.re" + +} + +std::string Scanner::lex_conf_string () +{ + lex_conf_assign (); + std::string s; + tok = cur; + +#line 3953 "src/ast/lex_conf.cc" +{ + unsigned char yych; + static const unsigned char yybm[] = { + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 0, 0, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + }; + if (lim <= cur) fill(1); + yych = (unsigned char)*cur; + if (yych <= '!') { + if (yych <= '\n') { + if (yych <= 0x08) goto yy840; + } else { + if (yych != ' ') goto yy840; + } + } else { + if (yych <= '\'') { + if (yych <= '"') goto yy843; + if (yych <= '&') goto yy840; + goto yy843; + } else { + if (yych != ';') goto yy840; + } + } +#line 293 "../src/ast/lex_conf.re" + { goto end; } +#line 4009 "src/ast/lex_conf.cc" +yy840: + ++cur; + if (lim <= cur) fill(1); + yych = (unsigned char)*cur; + if (yybm[0+yych] & 128) { + goto yy840; + } +#line 289 "../src/ast/lex_conf.re" + { + s = std::string(tok, tok_len()); + goto end; + } +#line 4022 "src/ast/lex_conf.cc" +yy843: + ++cur; +#line 274 "../src/ast/lex_conf.re" + { + const char quote = tok[0]; + for (bool end;;) { + const uint32_t c = lex_str_chr(quote, end); + if (end) { + goto end; + } + if (c > 0xFF) { + fatal_lc(get_cline(), get_column(), + "multibyte character in configuration string: 0x%X", c); + } else { + s += static_cast(c); + } + } + } +#line 4041 "src/ast/lex_conf.cc" +} +#line 294 "../src/ast/lex_conf.re" + +end: + lex_conf_semicolon (); + return s; +} + +} // end namespace re2c diff --git a/bootstrap/src/ast/parser.cc b/bootstrap/src/ast/parser.cc new file mode 100644 index 0000000..3bd3e9a --- /dev/null +++ b/bootstrap/src/ast/parser.cc @@ -0,0 +1,1835 @@ +/* A Bison parser, made by GNU Bison 3.0.4. */ + +/* Bison implementation for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +/* As a special exception, you may create a larger work that contains + part or all of the Bison parser skeleton and distribute that work + under terms of your choice, so long as that work isn't itself a + parser generator using the skeleton or a modified version thereof + as a parser skeleton. Alternatively, if you modify or redistribute + the parser skeleton itself, you may (at your option) remove this + special exception, which will cause the skeleton and the resulting + Bison output files to be licensed under the GNU General Public + License without this special exception. + + This special exception was added by the Free Software Foundation in + version 2.2 of Bison. */ + +/* C LALR(1) parser skeleton written by Richard Stallman, by + simplifying the original so-called "semantic" parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Bison version. */ +#define YYBISON_VERSION "3.0.4" + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 0 + +/* Push parsers. */ +#define YYPUSH 0 + +/* Pull parsers. */ +#define YYPULL 1 + + + + +/* Copy the first part of user declarations. */ + + + +#include "src/ast/parser.h" + +#define YYMALLOC malloc +#define YYFREE free + +using namespace re2c; + +extern "C" { + +int yylex(context_t &context); +void yyerror(context_t &context, const char*); + +} // extern "C" + +/* Bison version 1.875 emits a definition that is not working + * with several g++ version. Hence we disable it here. + */ +#if defined(__GNUC__) +#define __attribute__(x) +#endif + +static spec_t &find(specs_t &specs, const std::string &name) +{ + for (specs_t::iterator i = specs.begin(); i != specs.end(); ++i) { + if (i->name == name) return *i; + } + specs.push_back(spec_t(name)); + return specs.back(); +} + + + + +# ifndef YY_NULLPTR +# if defined __cplusplus && 201103L <= __cplusplus +# define YY_NULLPTR nullptr +# else +# define YY_NULLPTR 0 +# endif +# endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 0 +#endif + +/* In a future release of Bison, this section will be replaced + by #include "y.tab.h". */ +#ifndef YY_YY_BOOTSTRAP_SRC_AST_Y_TAB_H_INCLUDED +# define YY_YY_BOOTSTRAP_SRC_AST_Y_TAB_H_INCLUDED +/* Debug traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif +#if YYDEBUG +extern int yydebug; +#endif + +/* Token type. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + enum yytokentype + { + TOKEN_CLOSESIZE = 258, + TOKEN_CODE = 259, + TOKEN_CONF = 260, + TOKEN_ID = 261, + TOKEN_FID = 262, + TOKEN_FID_END = 263, + TOKEN_LINE_INFO = 264, + TOKEN_REGEXP = 265 + }; +#endif + +/* Value type. */ +#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED + +union YYSTYPE +{ + + + const re2c::AST * regexp; + re2c::Code * code; + char op; + re2c::ASTBounds bounds; + std::string * str; + re2c::CondList * clist; + + +}; + +typedef union YYSTYPE YYSTYPE; +# define YYSTYPE_IS_TRIVIAL 1 +# define YYSTYPE_IS_DECLARED 1 +#endif + + +extern YYSTYPE yylval; + +int yyparse (re2c::context_t &context); + +#endif /* !YY_YY_BOOTSTRAP_SRC_AST_Y_TAB_H_INCLUDED */ + +/* Copy the second part of user declarations. */ + + + +#ifdef short +# undef short +#endif + +#ifdef YYTYPE_UINT8 +typedef YYTYPE_UINT8 yytype_uint8; +#else +typedef unsigned char yytype_uint8; +#endif + +#ifdef YYTYPE_INT8 +typedef YYTYPE_INT8 yytype_int8; +#else +typedef signed char yytype_int8; +#endif + +#ifdef YYTYPE_UINT16 +typedef YYTYPE_UINT16 yytype_uint16; +#else +typedef unsigned short int yytype_uint16; +#endif + +#ifdef YYTYPE_INT16 +typedef YYTYPE_INT16 yytype_int16; +#else +typedef short int yytype_int16; +#endif + +#ifndef YYSIZE_T +# ifdef __SIZE_TYPE__ +# define YYSIZE_T __SIZE_TYPE__ +# elif defined size_t +# define YYSIZE_T size_t +# elif ! defined YYSIZE_T +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# else +# define YYSIZE_T unsigned int +# endif +#endif + +#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) + +#ifndef YY_ +# if defined YYENABLE_NLS && YYENABLE_NLS +# if ENABLE_NLS +# include /* INFRINGES ON USER NAME SPACE */ +# define YY_(Msgid) dgettext ("bison-runtime", Msgid) +# endif +# endif +# ifndef YY_ +# define YY_(Msgid) Msgid +# endif +#endif + +#ifndef YY_ATTRIBUTE +# if (defined __GNUC__ \ + && (2 < __GNUC__ || (__GNUC__ == 2 && 96 <= __GNUC_MINOR__))) \ + || defined __SUNPRO_C && 0x5110 <= __SUNPRO_C +# define YY_ATTRIBUTE(Spec) __attribute__(Spec) +# else +# define YY_ATTRIBUTE(Spec) /* empty */ +# endif +#endif + +#ifndef YY_ATTRIBUTE_PURE +# define YY_ATTRIBUTE_PURE YY_ATTRIBUTE ((__pure__)) +#endif + +#ifndef YY_ATTRIBUTE_UNUSED +# define YY_ATTRIBUTE_UNUSED YY_ATTRIBUTE ((__unused__)) +#endif + +#if !defined _Noreturn \ + && (!defined __STDC_VERSION__ || __STDC_VERSION__ < 201112) +# if defined _MSC_VER && 1200 <= _MSC_VER +# define _Noreturn __declspec (noreturn) +# else +# define _Noreturn YY_ATTRIBUTE ((__noreturn__)) +# endif +#endif + +/* Suppress unused-variable warnings by "using" E. */ +#if ! defined lint || defined __GNUC__ +# define YYUSE(E) ((void) (E)) +#else +# define YYUSE(E) /* empty */ +#endif + +#if defined __GNUC__ && 407 <= __GNUC__ * 100 + __GNUC_MINOR__ +/* Suppress an incorrect diagnostic about yylval being uninitialized. */ +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN \ + _Pragma ("GCC diagnostic push") \ + _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")\ + _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"") +# define YY_IGNORE_MAYBE_UNINITIALIZED_END \ + _Pragma ("GCC diagnostic pop") +#else +# define YY_INITIAL_VALUE(Value) Value +#endif +#ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN +# define YY_IGNORE_MAYBE_UNINITIALIZED_END +#endif +#ifndef YY_INITIAL_VALUE +# define YY_INITIAL_VALUE(Value) /* Nothing. */ +#endif + + +#if ! defined yyoverflow || YYERROR_VERBOSE + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# elif defined __BUILTIN_VA_ARG_INCR +# include /* INFRINGES ON USER NAME SPACE */ +# elif defined _AIX +# define YYSTACK_ALLOC __alloca +# elif defined _MSC_VER +# include /* INFRINGES ON USER NAME SPACE */ +# define alloca _alloca +# else +# define YYSTACK_ALLOC alloca +# if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS +# include /* INFRINGES ON USER NAME SPACE */ + /* Use EXIT_SUCCESS as a witness for stdlib.h. */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's 'empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# ifndef YYSTACK_ALLOC_MAXIMUM + /* The OS might guarantee only one guard page at the bottom of the stack, + and a page size can be as small as 4096 bytes. So we cannot safely + invoke alloca (N) if N exceeds 4096. Use a slightly smaller number + to allow for a few compiler-allocated temporary stack slots. */ +# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ +# endif +# else +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# ifndef YYSTACK_ALLOC_MAXIMUM +# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM +# endif +# if (defined __cplusplus && ! defined EXIT_SUCCESS \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) +# include /* INFRINGES ON USER NAME SPACE */ +# ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +# endif +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# if ! defined malloc && ! defined EXIT_SUCCESS +void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# ifndef YYFREE +# define YYFREE free +# if ! defined free && ! defined EXIT_SUCCESS +void free (void *); /* INFRINGES ON USER NAME SPACE */ +# endif +# endif +# endif +#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ + + +#if (! defined yyoverflow \ + && (! defined __cplusplus \ + || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + yytype_int16 yyss_alloc; + YYSTYPE yyvs_alloc; +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM) + +# define YYCOPY_NEEDED 1 + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ + Stack = &yyptr->Stack_alloc; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) + +#endif + +#if defined YYCOPY_NEEDED && YYCOPY_NEEDED +/* Copy COUNT objects from SRC to DST. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined __GNUC__ && 1 < __GNUC__ +# define YYCOPY(Dst, Src, Count) \ + __builtin_memcpy (Dst, Src, (Count) * sizeof (*(Src))) +# else +# define YYCOPY(Dst, Src, Count) \ + do \ + { \ + YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (Dst)[yyi] = (Src)[yyi]; \ + } \ + while (0) +# endif +# endif +#endif /* !YYCOPY_NEEDED */ + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 2 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 70 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 26 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 17 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 44 +/* YYNSTATES -- Number of states. */ +#define YYNSTATES 71 + +/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned + by yylex, with out-of-bounds checking. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 265 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM + as returned by yylex, without out-of-bounds checking. */ +static const yytype_uint8 yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 17, 2, 2, 2, 2, 2, 2, + 24, 25, 14, 22, 19, 2, 2, 11, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 18, 13, + 15, 12, 16, 23, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 21, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 20, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6, 7, 8, 9, 10 +}; + +#if YYDEBUG + /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ +static const yytype_uint8 yyrline[] = +{ + 0, 67, 67, 69, 70, 71, 72, 76, 83, 89, + 92, 96, 96, 99, 103, 107, 114, 121, 128, 134, + 136, 142, 149, 150, 156, 162, 169, 171, 177, 181, + 188, 192, 199, 203, 210, 211, 217, 222, 223, 227, + 228, 229, 233, 234, 245 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE || 0 +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "TOKEN_CLOSESIZE", "TOKEN_CODE", + "TOKEN_CONF", "TOKEN_ID", "TOKEN_FID", "TOKEN_FID_END", + "TOKEN_LINE_INFO", "TOKEN_REGEXP", "'/'", "'='", "';'", "'*'", "'<'", + "'>'", "'!'", "':'", "','", "'|'", "'\\\\'", "'+'", "'?'", "'('", "')'", + "$accept", "spec", "def", "name", "enddef", "rule", "ccode", "clist", + "conds", "trailexpr", "expr", "diff", "term", "factor", "closes", + "close", "primary", YY_NULLPTR +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[NUM] -- (External) token number corresponding to the + (internal) symbol number NUM (which must be that of a token). */ +static const yytype_uint16 yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 265, 47, 61, 59, 42, 60, 62, 33, 58, 44, + 124, 92, 43, 63, 40, 41 +}; +# endif + +#define YYPACT_NINF -45 + +#define yypact_value_is_default(Yystate) \ + (!!((Yystate) == (-45))) + +#define YYTABLE_NINF -1 + +#define yytable_value_is_error(Yytable_value) \ + 0 + + /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +static const yytype_int8 yypact[] = +{ + -45, 0, -45, -45, 18, -45, -45, -45, 7, 22, + 19, -45, 19, -45, 41, 30, 10, -45, 19, -1, + -45, -45, -45, -45, 15, 28, 35, 34, -45, 27, + 24, -45, 19, 19, 19, -45, -45, -45, -45, -45, + 26, -45, -45, 38, 43, -45, 40, 2, 51, -45, + -45, -45, -45, -45, 39, 10, -45, -45, 52, 44, + 42, 15, 15, -45, 57, 56, -45, -45, -45, -45, + -45 +}; + + /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. + Performed when YYTABLE does not specify something else to do. Zero + means the default is an error. */ +static const yytype_uint8 yydefact[] = +{ + 2, 0, 1, 3, 43, 10, 6, 42, 0, 0, + 0, 4, 0, 5, 0, 26, 28, 30, 32, 34, + 9, 14, 24, 23, 0, 0, 0, 22, 43, 0, + 0, 13, 0, 0, 0, 33, 36, 39, 40, 41, + 35, 37, 19, 0, 0, 18, 0, 0, 0, 44, + 12, 8, 11, 7, 27, 29, 31, 38, 0, 0, + 0, 0, 0, 25, 0, 0, 17, 16, 15, 20, + 21 +}; + + /* YYPGOTO[NTERM-NUM]. */ +static const yytype_int8 yypgoto[] = +{ + -45, -45, -45, -45, -45, -45, -44, 45, -45, 16, + -9, 31, -14, -45, -45, 25, -45 +}; + + /* YYDEFGOTO[NTERM-NUM]. */ +static const yytype_int8 yydefgoto[] = +{ + -1, 1, 11, 12, 53, 13, 45, 26, 27, 14, + 15, 16, 17, 18, 40, 41, 19 +}; + + /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule whose + number is the opposite. If YYTABLE_NINF, syntax error. */ +static const yytype_uint8 yytable[] = +{ + 2, 29, 36, 30, 35, 3, 4, 5, 28, 6, + 7, 21, 7, 37, 8, 9, 61, 67, 68, 42, + 56, 38, 39, 54, 10, 28, 10, 43, 22, 7, + 20, 34, 50, 44, 22, 51, 23, 52, 24, 25, + 37, 32, 23, 10, 33, 31, 66, 33, 38, 39, + 33, 47, 49, 48, 58, 59, 60, 63, 64, 33, + 65, 69, 70, 62, 55, 57, 0, 0, 0, 0, + 46 +}; + +static const yytype_int8 yycheck[] = +{ + 0, 10, 3, 12, 18, 5, 6, 7, 6, 9, + 10, 4, 10, 14, 14, 15, 14, 61, 62, 4, + 34, 22, 23, 32, 24, 6, 24, 12, 6, 10, + 12, 21, 8, 18, 6, 11, 14, 13, 16, 17, + 14, 11, 14, 24, 20, 4, 4, 20, 22, 23, + 20, 16, 25, 19, 16, 12, 16, 6, 6, 20, + 16, 4, 6, 47, 33, 40, -1, -1, -1, -1, + 25 +}; + + /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const yytype_uint8 yystos[] = +{ + 0, 27, 0, 5, 6, 7, 9, 10, 14, 15, + 24, 28, 29, 31, 35, 36, 37, 38, 39, 42, + 12, 4, 6, 14, 16, 17, 33, 34, 6, 36, + 36, 4, 11, 20, 21, 38, 3, 14, 22, 23, + 40, 41, 4, 12, 18, 32, 33, 16, 19, 25, + 8, 11, 13, 30, 36, 37, 38, 41, 16, 12, + 16, 14, 35, 6, 6, 16, 4, 32, 32, 4, + 6 +}; + + /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const yytype_uint8 yyr1[] = +{ + 0, 26, 27, 27, 27, 27, 27, 28, 28, 29, + 29, 30, 30, 31, 31, 31, 31, 31, 31, 32, + 32, 32, 33, 33, 34, 34, 35, 35, 36, 36, + 37, 37, 38, 38, 39, 39, 39, 40, 40, 41, + 41, 41, 42, 42, 42 +}; + + /* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */ +static const yytype_uint8 yyr2[] = +{ + 0, 2, 0, 2, 2, 2, 2, 3, 3, 2, + 1, 1, 1, 2, 2, 5, 5, 5, 3, 1, + 4, 4, 1, 1, 1, 3, 1, 3, 1, 3, + 1, 3, 1, 2, 1, 2, 2, 1, 2, 1, + 1, 1, 1, 1, 3 +}; + + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + YYPOPSTACK (yylen); \ + yystate = *yyssp; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (context, YY_("syntax error: cannot back up")); \ + YYERROR; \ + } \ +while (0) + +/* Error token number */ +#define YYTERROR 1 +#define YYERRCODE 256 + + + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +/* This macro is provided for backward compatibility. */ +#ifndef YY_LOCATION_PRINT +# define YY_LOCATION_PRINT(File, Loc) ((void) 0) +#endif + + +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yy_symbol_print (stderr, \ + Type, Value, context); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + + +/*----------------------------------------. +| Print this symbol's value on YYOUTPUT. | +`----------------------------------------*/ + +static void +yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, re2c::context_t &context) +{ + FILE *yyo = yyoutput; + YYUSE (yyo); + YYUSE (context); + if (!yyvaluep) + return; +# ifdef YYPRINT + if (yytype < YYNTOKENS) + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif + YYUSE (yytype); +} + + +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +static void +yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep, re2c::context_t &context) +{ + YYFPRINTF (yyoutput, "%s %s (", + yytype < YYNTOKENS ? "token" : "nterm", yytname[yytype]); + + yy_symbol_value_print (yyoutput, yytype, yyvaluep, context); + YYFPRINTF (yyoutput, ")"); +} + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +static void +yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) +{ + YYFPRINTF (stderr, "Stack now"); + for (; yybottom <= yytop; yybottom++) + { + int yybot = *yybottom; + YYFPRINTF (stderr, " %d", yybot); + } + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +static void +yy_reduce_print (yytype_int16 *yyssp, YYSTYPE *yyvsp, int yyrule, re2c::context_t &context) +{ + unsigned long int yylno = yyrline[yyrule]; + int yynrhs = yyr2[yyrule]; + int yyi; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", + yyrule - 1, yylno); + /* The symbols being reduced. */ + for (yyi = 0; yyi < yynrhs; yyi++) + { + YYFPRINTF (stderr, " $%d = ", yyi + 1); + yy_symbol_print (stderr, + yystos[yyssp[yyi + 1 - yynrhs]], + &(yyvsp[(yyi + 1) - (yynrhs)]) + , context); + YYFPRINTF (stderr, "\n"); + } +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (yyssp, yyvsp, Rule, context); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YY_SYMBOL_PRINT(Title, Type, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined __GLIBC__ && defined _STRING_H +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +yystrlen (const char *yystr) +{ + YYSIZE_T yylen; + for (yylen = 0; yystr[yylen]; yylen++) + continue; + return yylen; +} +# endif +# endif + +# ifndef yystpcpy +# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +yystpcpy (char *yydest, const char *yysrc) +{ + char *yyd = yydest; + const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +# ifndef yytnamerr +/* Copy to YYRES the contents of YYSTR after stripping away unnecessary + quotes and backslashes, so that it's suitable for yyerror. The + heuristic is that double-quoting is unnecessary unless the string + contains an apostrophe, a comma, or backslash (other than + backslash-backslash). YYSTR is taken from yytname. If YYRES is + null, do not copy; instead, return the length of what the result + would have been. */ +static YYSIZE_T +yytnamerr (char *yyres, const char *yystr) +{ + if (*yystr == '"') + { + YYSIZE_T yyn = 0; + char const *yyp = yystr; + + for (;;) + switch (*++yyp) + { + case '\'': + case ',': + goto do_not_strip_quotes; + + case '\\': + if (*++yyp != '\\') + goto do_not_strip_quotes; + /* Fall through. */ + default: + if (yyres) + yyres[yyn] = *yyp; + yyn++; + break; + + case '"': + if (yyres) + yyres[yyn] = '\0'; + return yyn; + } + do_not_strip_quotes: ; + } + + if (! yyres) + return yystrlen (yystr); + + return yystpcpy (yyres, yystr) - yyres; +} +# endif + +/* Copy into *YYMSG, which is of size *YYMSG_ALLOC, an error message + about the unexpected token YYTOKEN for the state stack whose top is + YYSSP. + + Return 0 if *YYMSG was successfully written. Return 1 if *YYMSG is + not large enough to hold the message. In that case, also set + *YYMSG_ALLOC to the required number of bytes. Return 2 if the + required number of bytes is too large to store. */ +static int +yysyntax_error (YYSIZE_T *yymsg_alloc, char **yymsg, + yytype_int16 *yyssp, int yytoken) +{ + YYSIZE_T yysize0 = yytnamerr (YY_NULLPTR, yytname[yytoken]); + YYSIZE_T yysize = yysize0; + enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; + /* Internationalized format string. */ + const char *yyformat = YY_NULLPTR; + /* Arguments of yyformat. */ + char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; + /* Number of reported tokens (one for the "unexpected", one per + "expected"). */ + int yycount = 0; + + /* There are many possibilities here to consider: + - If this state is a consistent state with a default action, then + the only way this function was invoked is if the default action + is an error action. In that case, don't check for expected + tokens because there are none. + - The only way there can be no lookahead present (in yychar) is if + this state is a consistent state with a default action. Thus, + detecting the absence of a lookahead is sufficient to determine + that there is no unexpected or expected token to report. In that + case, just report a simple "syntax error". + - Don't assume there isn't a lookahead just because this state is a + consistent state with a default action. There might have been a + previous inconsistent state, consistent state with a non-default + action, or user semantic action that manipulated yychar. + - Of course, the expected token list depends on states to have + correct lookahead information, and it depends on the parser not + to perform extra reductions after fetching a lookahead from the + scanner and before detecting a syntax error. Thus, state merging + (from LALR or IELR) and default reductions corrupt the expected + token list. However, the list is correct for canonical LR with + one exception: it will still contain any token that will not be + accepted due to an error action in a later state. + */ + if (yytoken != YYEMPTY) + { + int yyn = yypact[*yyssp]; + yyarg[yycount++] = yytname[yytoken]; + if (!yypact_value_is_default (yyn)) + { + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. In other words, skip the first -YYN actions for + this state because they are default actions. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn + 1; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yyx; + + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR + && !yytable_value_is_error (yytable[yyx + yyn])) + { + if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) + { + yycount = 1; + yysize = yysize0; + break; + } + yyarg[yycount++] = yytname[yyx]; + { + YYSIZE_T yysize1 = yysize + yytnamerr (YY_NULLPTR, yytname[yyx]); + if (! (yysize <= yysize1 + && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + } + } + } + } + + switch (yycount) + { +# define YYCASE_(N, S) \ + case N: \ + yyformat = S; \ + break + YYCASE_(0, YY_("syntax error")); + YYCASE_(1, YY_("syntax error, unexpected %s")); + YYCASE_(2, YY_("syntax error, unexpected %s, expecting %s")); + YYCASE_(3, YY_("syntax error, unexpected %s, expecting %s or %s")); + YYCASE_(4, YY_("syntax error, unexpected %s, expecting %s or %s or %s")); + YYCASE_(5, YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s")); +# undef YYCASE_ + } + + { + YYSIZE_T yysize1 = yysize + yystrlen (yyformat); + if (! (yysize <= yysize1 && yysize1 <= YYSTACK_ALLOC_MAXIMUM)) + return 2; + yysize = yysize1; + } + + if (*yymsg_alloc < yysize) + { + *yymsg_alloc = 2 * yysize; + if (! (yysize <= *yymsg_alloc + && *yymsg_alloc <= YYSTACK_ALLOC_MAXIMUM)) + *yymsg_alloc = YYSTACK_ALLOC_MAXIMUM; + return 1; + } + + /* Avoid sprintf, as that infringes on the user's name space. + Don't have undefined behavior even if the translation + produced a string with the wrong number of "%s"s. */ + { + char *yyp = *yymsg; + int yyi = 0; + while ((*yyp = *yyformat) != '\0') + if (*yyp == '%' && yyformat[1] == 's' && yyi < yycount) + { + yyp += yytnamerr (yyp, yyarg[yyi++]); + yyformat += 2; + } + else + { + yyp++; + yyformat++; + } + } + return 0; +} +#endif /* YYERROR_VERBOSE */ + +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +static void +yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep, re2c::context_t &context) +{ + YYUSE (yyvaluep); + YYUSE (context); + if (!yymsg) + yymsg = "Deleting"; + YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + YYUSE (yytype); + YY_IGNORE_MAYBE_UNINITIALIZED_END +} + + + + +/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; +/* Number of syntax errors so far. */ +int yynerrs; + + +/*----------. +| yyparse. | +`----------*/ + +int +yyparse (re2c::context_t &context) +{ + int yystate; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + + /* The stacks and their tools: + 'yyss': related to states. + 'yyvs': related to semantic values. + + Refer to the stacks through separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + yytype_int16 yyssa[YYINITDEPTH]; + yytype_int16 *yyss; + yytype_int16 *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs; + YYSTYPE *yyvsp; + + YYSIZE_T yystacksize; + + int yyn; + int yyresult; + /* Lookahead token as an internal (translated) token number. */ + int yytoken = 0; + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + +#if YYERROR_VERBOSE + /* Buffer for error messages, and its allocated size. */ + char yymsgbuf[128]; + char *yymsg = yymsgbuf; + YYSIZE_T yymsg_alloc = sizeof yymsgbuf; +#endif + +#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) + + /* The number of symbols on the RHS of the reduced rule. + Keep to zero when no symbol should be popped. */ + int yylen = 0; + + yyssp = yyss = yyssa; + yyvsp = yyvs = yyvsa; + yystacksize = YYINITDEPTH; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. So pushing a state here evens the stacks. */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + yytype_int16 *yyss1 = yyss; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow (YY_("memory exhausted"), + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + &yystacksize); + + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyexhaustedlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyexhaustedlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + yytype_int16 *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyexhaustedlab; + YYSTACK_RELOCATE (yyss_alloc, yyss); + YYSTACK_RELOCATE (yyvs_alloc, yyvs); +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + if (yystate == YYFINAL) + YYACCEPT; + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + + /* Do appropriate processing given the current state. Read a + lookahead token if we need one and don't already have one. */ + + /* First try to decide what to do without reference to lookahead token. */ + yyn = yypact[yystate]; + if (yypact_value_is_default (yyn)) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = yylex (context); + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yytable_value_is_error (yyn)) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + /* Shift the lookahead token. */ + YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); + + /* Discard the shifted token. */ + yychar = YYEMPTY; + + yystate = yyn; + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + '$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 3: + + { context.input.lex_conf(context.opts); } + + break; + + case 7: + + { + if (!context.symtab.insert(std::make_pair(*(yyvsp[-2].str), (yyvsp[-1].regexp))).second) { + fatal_l(context.input.get_cline(), "sym already defined"); + } + delete (yyvsp[-2].str); + } + + break; + + case 8: + + { + fatal_l(context.input.get_cline(), + "trailing contexts are not allowed in named definitions"); + } + + break; + + case 9: + + { + (yyval.str) = (yyvsp[-1].str); + } + + break; + + case 10: + + { + (yyval.str) = (yyvsp[0].str); + } + + break; + + case 13: + + { + find(context.specs, "").rules.push_back(ASTRule((yyvsp[-1].regexp), (yyvsp[0].code))); + } + + break; + + case 14: + + { + find(context.specs, "").defs.push_back((yyvsp[0].code)); + } + + break; + + case 15: + + { + for(CondList::const_iterator i = (yyvsp[-3].clist)->begin(); i != (yyvsp[-3].clist)->end(); ++i) { + find(context.specs, *i).rules.push_back(ASTRule((yyvsp[-1].regexp), (yyvsp[0].code))); + } + delete (yyvsp[-3].clist); + } + + break; + + case 16: + + { + for(CondList::const_iterator i = (yyvsp[-3].clist)->begin(); i != (yyvsp[-3].clist)->end(); ++i) { + find(context.specs, *i).defs.push_back((yyvsp[0].code)); + } + delete (yyvsp[-3].clist); + } + + break; + + case 17: + + { + for (CondList::const_iterator i = (yyvsp[-2].clist)->begin(); i != (yyvsp[-2].clist)->end(); ++i) { + find(context.specs, *i).setup.push_back((yyvsp[0].code)); + } + delete (yyvsp[-2].clist); + } + + break; + + case 18: + + { + const AST *r = ast_nil(context.input.get_cline(), 0); + find(context.specs, "0").rules.push_back(ASTRule(r, (yyvsp[0].code))); + } + + break; + + case 20: + + { + (yyval.code) = (yyvsp[0].code); + (yyval.code)->cond = *(yyvsp[-1].str); + delete (yyvsp[-1].str); + } + + break; + + case 21: + + { + (yyval.code) = new Code(context.input.get_fname(), context.input.get_cline()); + (yyval.code)->cond = *(yyvsp[0].str); + delete (yyvsp[0].str); + } + + break; + + case 23: + + { + (yyval.clist) = new CondList; + (yyval.clist)->insert("*"); + } + + break; + + case 24: + + { + (yyval.clist) = new CondList; + (yyval.clist)->insert(*(yyvsp[0].str)); + delete (yyvsp[0].str); + } + + break; + + case 25: + + { + (yyvsp[-2].clist)->insert(*(yyvsp[0].str)); + delete (yyvsp[0].str); + (yyval.clist) = (yyvsp[-2].clist); + } + + break; + + case 26: + + { + (yyval.regexp) = ast_cap((yyvsp[0].regexp)); + } + + break; + + case 27: + + { + (yyval.regexp) = ast_cat(ast_cap((yyvsp[-2].regexp)), + ast_cat(ast_tag(context.input.get_cline(), 0, NULL, false), (yyvsp[0].regexp))); + } + + break; + + case 28: + + { + (yyval.regexp) = (yyvsp[0].regexp); + } + + break; + + case 29: + + { + (yyval.regexp) = ast_alt((yyvsp[-2].regexp), (yyvsp[0].regexp)); + } + + break; + + case 30: + + { + (yyval.regexp) = (yyvsp[0].regexp); + } + + break; + + case 31: + + { + (yyval.regexp) = ast_diff((yyvsp[-2].regexp), (yyvsp[0].regexp)); + } + + break; + + case 32: + + { + (yyval.regexp) = (yyvsp[0].regexp); + } + + break; + + case 33: + + { + (yyval.regexp) = ast_cat((yyvsp[-1].regexp), (yyvsp[0].regexp)); + } + + break; + + case 35: + + { + switch((yyvsp[0].op)) { + case '*': (yyval.regexp) = ast_iter((yyvsp[-1].regexp), 0, AST::MANY); break; + case '+': (yyval.regexp) = ast_iter((yyvsp[-1].regexp), 1, AST::MANY); break; + case '?': (yyval.regexp) = ast_iter((yyvsp[-1].regexp), 0, 1); break; + } + } + + break; + + case 36: + + { + (yyval.regexp) = ast_iter((yyvsp[-1].regexp), (yyvsp[0].bounds).min, (yyvsp[0].bounds).max); + } + + break; + + case 38: + + { (yyval.op) = ((yyvsp[-1].op) == (yyvsp[0].op)) ? (yyvsp[-1].op) : '*'; } + + break; + + case 39: + + { (yyval.op) = '*'; } + + break; + + case 40: + + { (yyval.op) = '+'; } + + break; + + case 41: + + { (yyval.op) = '?'; } + + break; + + case 43: + + { + symtab_t::iterator i = context.symtab.find(*(yyvsp[0].str)); + if (i == context.symtab.end()) { + fatal_l(context.input.get_cline(), + "undefined symbol '%s'", (yyvsp[0].str)->c_str()); + } + (yyval.regexp) = i->second; + if (ast_need_wrap((yyval.regexp))) { + (yyval.regexp) = ast_ref((yyval.regexp), *(yyvsp[0].str)); + } + delete (yyvsp[0].str); + } + + break; + + case 44: + + { + (yyval.regexp) = ast_cap((yyvsp[-1].regexp)); + } + + break; + + + + default: break; + } + /* User semantic actions sometimes alter yychar, and that requires + that yytoken be updated with the new translation. We take the + approach of translating immediately before every use of yytoken. + One alternative is translating here after every semantic action, + but that translation would be missed if the semantic action invokes + YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or + if it invokes YYBACKUP. In the case of YYABORT or YYACCEPT, an + incorrect destructor might then be invoked immediately. In the + case of YYERROR or YYBACKUP, subsequent parser actions might lead + to an incorrect destructor call or verbose syntax error message + before the lookahead is translated. */ + YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); + + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + + /* Now 'shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*--------------------------------------. +| yyerrlab -- here on detecting error. | +`--------------------------------------*/ +yyerrlab: + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = yychar == YYEMPTY ? YYEMPTY : YYTRANSLATE (yychar); + + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if ! YYERROR_VERBOSE + yyerror (context, YY_("syntax error")); +#else +# define YYSYNTAX_ERROR yysyntax_error (&yymsg_alloc, &yymsg, \ + yyssp, yytoken) + { + char const *yymsgp = YY_("syntax error"); + int yysyntax_error_status; + yysyntax_error_status = YYSYNTAX_ERROR; + if (yysyntax_error_status == 0) + yymsgp = yymsg; + else if (yysyntax_error_status == 1) + { + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); + yymsg = (char *) YYSTACK_ALLOC (yymsg_alloc); + if (!yymsg) + { + yymsg = yymsgbuf; + yymsg_alloc = sizeof yymsgbuf; + yysyntax_error_status = 2; + } + else + { + yysyntax_error_status = YYSYNTAX_ERROR; + yymsgp = yymsg; + } + } + yyerror (context, yymsgp); + if (yysyntax_error_status == 2) + goto yyexhaustedlab; + } +# undef YYSYNTAX_ERROR +#endif + } + + + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* Return failure if at end of input. */ + if (yychar == YYEOF) + YYABORT; + } + else + { + yydestruct ("Error: discarding", + yytoken, &yylval, context); + yychar = YYEMPTY; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + + /* Pacify compilers like GCC when the user code never invokes + YYERROR and the label yyerrorlab therefore never appears in user + code. */ + if (/*CONSTCOND*/ 0) + goto yyerrorlab; + + /* Do not reclaim the symbols of the rule whose action triggered + this YYERROR. */ + YYPOPSTACK (yylen); + yylen = 0; + YY_STACK_PRINT (yyss, yyssp); + yystate = *yyssp; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (!yypact_value_is_default (yyn)) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + + yydestruct ("Error: popping", + yystos[yystate], yyvsp, context); + YYPOPSTACK (1); + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN + *++yyvsp = yylval; + YY_IGNORE_MAYBE_UNINITIALIZED_END + + + /* Shift the error token. */ + YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#if !defined yyoverflow || YYERROR_VERBOSE +/*-------------------------------------------------. +| yyexhaustedlab -- memory exhaustion comes here. | +`-------------------------------------------------*/ +yyexhaustedlab: + yyerror (context, YY_("memory exhausted")); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: + if (yychar != YYEMPTY) + { + /* Make sure we have latest lookahead translation. See comments at + user semantic actions for why this is necessary. */ + yytoken = YYTRANSLATE (yychar); + yydestruct ("Cleanup: discarding lookahead", + yytoken, &yylval, context); + } + /* Do not reclaim the symbols of the rule whose action triggered + this YYABORT or YYACCEPT. */ + YYPOPSTACK (yylen); + YY_STACK_PRINT (yyss, yyssp); + while (yyssp != yyss) + { + yydestruct ("Cleanup: popping", + yystos[*yyssp], yyvsp, context); + YYPOPSTACK (1); + } +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif +#if YYERROR_VERBOSE + if (yymsg != yymsgbuf) + YYSTACK_FREE (yymsg); +#endif + return yyresult; +} + + + +extern "C" { + +void yyerror(context_t &context, const char* s) +{ + fatal_l(context.input.get_cline(), "%s", s); +} + +int yylex(context_t &context) +{ + return context.input.scan(&context.opts.glob); +} + +} // extern "C" + +namespace re2c +{ + +void parse(Scanner &input, specs_t &specs, symtab_t &symtab, Opt &opts) +{ + context_t context = {input, specs, symtab, opts}; + yyparse(context); +} + +} // namespace re2c diff --git a/bootstrap/src/parse/y.tab.h b/bootstrap/src/ast/y.tab.h similarity index 65% rename from bootstrap/src/parse/y.tab.h rename to bootstrap/src/ast/y.tab.h index 5a87621..23fe896 100644 --- a/bootstrap/src/parse/y.tab.h +++ b/bootstrap/src/ast/y.tab.h @@ -1,20 +1,19 @@ -/* A Bison parser, made by GNU Bison 2.4.3. */ +/* A Bison parser, made by GNU Bison 3.0.4. */ + +/* Bison interface for Yacc-like parsers in C + + Copyright (C) 1984, 1989-1990, 2000-2015 Free Software Foundation, Inc. -/* Skeleton interface for Bison's Yacc-like parsers in C - - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006, - 2009, 2010 Free Software Foundation, Inc. - This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - + This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - + You should have received a copy of the GNU General Public License along with this program. If not, see . */ @@ -27,53 +26,61 @@ special exception, which will cause the skeleton and the resulting Bison output files to be licensed under the GNU General Public License without this special exception. - + This special exception was added by the Free Software Foundation in version 2.2 of Bison. */ +#ifndef YY_YY_BOOTSTRAP_SRC_AST_Y_TAB_H_INCLUDED +# define YY_YY_BOOTSTRAP_SRC_AST_Y_TAB_H_INCLUDED +/* Debug traces. */ +#ifndef YYDEBUG +# define YYDEBUG 0 +#endif +#if YYDEBUG +extern int yydebug; +#endif -/* Tokens. */ +/* Token type. */ #ifndef YYTOKENTYPE # define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - TOKEN_CLOSE = 258, - TOKEN_CLOSESIZE = 259, - TOKEN_CODE = 260, - TOKEN_CONF = 261, - TOKEN_ID = 262, - TOKEN_FID = 263, - TOKEN_FID_END = 264, - TOKEN_NOCOND = 265, - TOKEN_REGEXP = 266, - TOKEN_SETUP = 267, - TOKEN_STAR = 268 - }; + enum yytokentype + { + TOKEN_CLOSESIZE = 258, + TOKEN_CODE = 259, + TOKEN_CONF = 260, + TOKEN_ID = 261, + TOKEN_FID = 262, + TOKEN_FID_END = 263, + TOKEN_LINE_INFO = 264, + TOKEN_REGEXP = 265 + }; #endif - - +/* Value type. */ #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE + +union YYSTYPE { - re2c::RegExp * regexp; - const re2c::Code * code; + const re2c::AST * regexp; + re2c::Code * code; char op; - re2c::ExtOp extop; + re2c::ASTBounds bounds; std::string * str; re2c::CondList * clist; +}; -} YYSTYPE; +typedef union YYSTYPE YYSTYPE; # define YYSTYPE_IS_TRIVIAL 1 -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 #endif + extern YYSTYPE yylval; +int yyparse (re2c::context_t &context); +#endif /* !YY_YY_BOOTSTRAP_SRC_AST_Y_TAB_H_INCLUDED */ diff --git a/bootstrap/src/conf/help.cc b/bootstrap/src/conf/help.cc new file mode 100644 index 0000000..6e14c06 --- /dev/null +++ b/bootstrap/src/conf/help.cc @@ -0,0 +1,264 @@ +extern const char *help; +const char *help = +"\n" +" -? -h --help\n" +" Show help message.\n" +"\n" +" -b --bit-vectors\n" +" Optimize conditional jumps using bit masks. Implies -s.\n" +"\n" +" -c --conditions\n" +" Enable support of Flex-like \"conditions\": multiple interrelated\n" +" lexers within one block.\n" +"\n" +" -d --debug-output\n" +" Emit YYDEBUG in the generated code. YYDEBUG should be defined\n" +" by the user in the form of a void function with two parameters:\n" +" state (lexer state or -1) and symbol (current input symbol of\n" +" type YYCTYPE).\n" +"\n" +" -D --emit-dot\n" +" Instead of normal output generate lexer graph in DOT format.\n" +" The output can be converted to PNG with the help of Graphviz\n" +" (something like dot -Tpng -odfa.png dfa.dot). Note that large\n" +" graphs may crash Graphviz.\n" +"\n" +" -e --ecb\n" +" Generate a lexer that reads input in EBCDIC encoding. re2c\n" +" assumes that character range is 0 -- 0xFF an character size is 1\n" +" byte.\n" +"\n" +" -f --storable-state\n" +" Generate a lexer which can store its inner state. This is use‐\n" +" ful in push-model lexers which are stopped by an outer program\n" +" when there is not enough input, and then resumed when more input\n" +" becomes available. In this mode users should additionally\n" +" define YYGETSTATE () and YYSETSTATE (state) macros and variables\n" +" yych, yyaccept and the state as part of the lexer state.\n" +"\n" +" -F --flex-syntax\n" +" Partial support for Flex syntax: in this mode named definitions\n" +" don't need the equal sign and the terminating semicolon, and\n" +" when used they must be surrounded by curly braces. Names with‐\n" +" out curly braces are treated as double-quoted strings.\n" +"\n" +" -g --computed-gotos\n" +" Optimize conditional jumps using non-standard \"computed goto\"\n" +" extension (must be supported by C/C++ compiler). re2c generates\n" +" jump tables only in complex cases with a lot of conditional\n" +" branches. Complexity threshold can be configured with\n" +" cgoto:threshold configuration. This option implies -b.\n" +"\n" +" -i --no-debug-info\n" +" Do not output #line information. This is useful when the gener‐\n" +" ated code is tracked by some version control system.\n" +"\n" +" -o OUTPUT --output=OUTPUT\n" +" Specify the OUTPUT file.\n" +"\n" +" -r --reusable\n" +" Allows reuse of re2c rules with /*!rules:re2c */ and /*!use:re2c\n" +" */ blocks. In this mode simple /*!re2c */ blocks are not\n" +" allowed and exactly one /*!rules:re2c */ block must be present.\n" +" The rules are saved and used by every /*!use:re2c */ block that\n" +" follows (which may add rules of their own). This option allows\n" +" to reuse the same set of rules with different configurations.\n" +"\n" +" -s --nested-ifs\n" +" Use nested if statements instead of switch statements in condi‐\n" +" tional jumps. This usually results in more efficient code with\n" +" non-optimizing C/C++ compilers.\n" +"\n" +" -t HEADER --type-header=HEADER\n" +" Generate a HEADER file that contains enum with condition names.\n" +" Requires -c option.\n" +"\n" +" -T --tags\n" +" Enable submatch extraction with tags.\n" +"\n" +" -P --posix-captures\n" +" Enable submatch extraction with POSIX-style capturing groups.\n" +"\n" +" -u --unicode\n" +" Generate a lexer that reads input in UTF-32 encoding. re2c\n" +" assumes that character range is 0 -- 0x10FFFF and character size\n" +" is 4 bytes. Implies -s.\n" +"\n" +" -v --version\n" +" Show version information.\n" +"\n" +" -V --vernum\n" +" Show version information in MMmmpp format (major, minor, patch).\n" +"\n" +" -w --wide-chars\n" +" Generate a lexer that reads input in UCS-2 encoding. re2c\n" +" assumes that character range is 0 -- 0xFFFF and character size\n" +" is 2 bytes. Implies -s.\n" +"\n" +" -x --utf-16\n" +" Generate a lexer that reads input in UTF-16 encoding. re2c\n" +" assumes that character range is 0 -- 0x10FFFF and character size\n" +" is 2 bytes. Implies -s.\n" +"\n" +" -8 --utf-8\n" +" Generate a lexer that reads input in UTF-8 encoding. re2c\n" +" assumes that character range is 0 -- 0x10FFFF and character size\n" +" is 1 byte.\n" +"\n" +" --case-insensitive\n" +" Treat single-quoted and double-quoted strings as case-insensi‐\n" +" tive.\n" +"\n" +" --case-inverted\n" +" Invert the meaning of single-quoted and double-quoted strings:\n" +" treat single-quoted strings as case-sensitive and double-quoted\n" +" strings as case-insensitive.\n" +"\n" +" --no-generation-date\n" +" Suppress date output in the generated file.\n" +"\n" +" --no-lookahead\n" +" Use TDFA(0) instead of TDFA(1). This option only has effect\n" +" with --tags or --posix-captures options.\n" +"\n" +" --no-optimize-tags\n" +" Suppress optimization of tag variables (useful for debugging or\n" +" benchmarking).\n" +"\n" +" --no-version\n" +" Suppress version output in the generated file.\n" +"\n" +" --encoding-policy POLICY\n" +" Define the way re2c treats Unicode surrogates. POLICY can be\n" +" one of the following: fail (abort with an error when a surrogate\n" +" is encountered), substitute (silently replace surrogates with\n" +" the error code point 0xFFFD), ignore (default, treat surrogates\n" +" as normal code points). The Unicode standard says that stand‐\n" +" alone surrogates are invalid, but real-world libraries and pro‐\n" +" grams behave in different ways.\n" +"\n" +" --input INPUT\n" +" Specify re2c input API. INPUT can be either default or custom\n" +" (enables the use of generic API).\n" +"\n" +" -S --skeleton\n" +" Ignore user-defined interface code and generate a self-contained\n" +" \"skeleton\" program. Additionally, generate input files with\n" +" strings derived from the regular grammar and compressed match\n" +" results that are used to verify \"skeleton\" behavior on all\n" +" inputs. This option is useful for finding bugs in optimizations\n" +" and code generation.\n" +"\n" +" --empty-class POLICY\n" +" Define the way re2c treats empty character classes. POLICY can\n" +" be one of the following: match-empty (match empty input: illogi‐\n" +" cal, but default behavior for backwards compatibility reasons),\n" +" match-none (fail to match on any input), error (compilation\n" +" error).\n" +"\n" +" --dfa-minimization ALGORITHM\n" +" The internal algorithm used by re2c to minimize the DFA. ALGO‐\n" +" RITHM can be either moore (Moore algorithm, the default) or ta‐\n" +" ble (table filling algorithm). Both algorithms should produce\n" +" the same DFA up to states relabeling; table filling is much\n" +" slower and serves as a reference implementation.\n" +"\n" +" --eager-skip\n" +" Make the generated lexer advance the input position \"eagerly\":\n" +" immediately after reading input symbol. By default this happens\n" +" after transition to the next state. Implied by --no-lookahead.\n" +"\n" +" --dump-nfa\n" +" Generate representation of NFA in DOT format and dump it on\n" +" stderr.\n" +"\n" +" --dump-dfa-raw\n" +" Generate representation of DFA in DOT format under construction\n" +" and dump it on stderr.\n" +"\n" +" --dump-dfa-det\n" +" Generate representation of DFA in DOT format immediately after\n" +" determinization and dump it on stderr.\n" +"\n" +" --dump-dfa-tagopt\n" +" Generate representation of DFA in DOT format after tag optimiza‐\n" +" tions and dump it on stderr.\n" +"\n" +" --dump-dfa-min\n" +" Generate representation of DFA in DOT format after minimization\n" +" and dump it on stderr.\n" +"\n" +" --dump-adfa\n" +" Generate representation of DFA in DOT format after tunneling and\n" +" dump it on stderr.\n" +"\n" +" -1 --single-pass\n" +" Deprecated. Does nothing (single pass is the default now).\n" +"\n" +" -W Turn on all warnings.\n" +"\n" +" -Werror\n" +" Turn warnings into errors. Note that this option alone doesn't\n" +" turn on any warnings; it only affects those warnings that have\n" +" been turned on so far or will be turned on later.\n" +"\n" +" -W\n" +" Turn on warning.\n" +"\n" +" -Wno-\n" +" Turn off warning.\n" +"\n" +" -Werror-\n" +" Turn on warning and treat it as an error (this implies -W).\n" +"\n" +" -Wno-error-\n" +" Don't treat this particular warning as an error. This doesn't\n" +" turn off the warning itself.\n" +"\n" +" -Wcondition-order\n" +" Warn if the generated program makes implicit assumptions about\n" +" condition numbering. One should use either the -t, --type-header\n" +" option or the /*!types:re2c*/ directive to generate a mapping of\n" +" condition names to numbers and then use the autogenerated condi‐\n" +" tion names.\n" +"\n" +" -Wempty-character-class\n" +" Warn if a regular expression contains an empty character class.\n" +" Trying to match an empty character class makes no sense: it\n" +" should always fail. However, for backwards compatibility rea‐\n" +" sons re2c allows empty character classes and treats them as\n" +" empty strings. Use the --empty-class option to change the\n" +" default behavior.\n" +"\n" +" -Wmatch-empty-string\n" +" Warn if a rule is nullable (matches an empty string). If the\n" +" lexer runs in a loop and the empty match is unintentional, the\n" +" lexer may unexpectedly hang in an infinite loop.\n" +"\n" +" -Wswapped-range\n" +" Warn if the lower bound of a range is greater than its upper\n" +" bound. The default behavior is to silently swap the range\n" +" bounds.\n" +"\n" +" -Wundefined-control-flow\n" +" Warn if some input strings cause undefined control flow in the\n" +" lexer (the faulty patterns are reported). This is the most dan‐\n" +" gerous and most common mistake. It can be easily fixed by adding\n" +" the default rule * which has the lowest priority, matches any\n" +" code unit, and consumes exactly one code unit.\n" +"\n" +" -Wunreachable-rules\n" +" Warn about rules that are shadowed by other rules and will never\n" +" match.\n" +"\n" +" -Wuseless-escape\n" +" Warn if a symbol is escaped when it shouldn't be. By default,\n" +" re2c silently ignores such escapes, but this may as well indi‐\n" +" cate a typo or an error in the escape sequence.\n" +"\n" +" -Wnondeterministic-tags\n" +" Warn if a tag has n-th degree of nondeterminism, where n is\n" +" greater than 1.\n" +"\n" +; diff --git a/bootstrap/src/conf/parse_opts.cc b/bootstrap/src/conf/parse_opts.cc index 9eb0798..f386b99 100644 --- a/bootstrap/src/conf/parse_opts.cc +++ b/bootstrap/src/conf/parse_opts.cc @@ -1,12 +1,10 @@ -/* Generated by re2c 0.16 on Thu Jan 21 10:47:47 2016 */ +/* Generated by re2c 1.0.3 on Wed Nov 8 20:39:40 2017 */ #line 1 "../src/conf/parse_opts.re" -#include "src/codegen/input_api.h" +#include "src/code/input_api.h" #include "src/conf/msg.h" #include "src/conf/opt.h" -#include "src/conf/warn.h" -#include "src/globals.h" -#include "src/ir/regexp/empty_class_policy.h" -#include "src/ir/regexp/encoding/enc.h" +#include "src/re/empty_class_policy.h" +#include "src/re/encoding/enc.h" namespace re2c { @@ -17,14 +15,14 @@ static inline bool next (char * & arg, char ** & argv) return arg != NULL; } -parse_opts_t parse_opts (char ** argv, Opt & opts) +parse_opts_t parse_opts(char **argv, conopt_t &globopts, Opt &opts, Warn &warn) { #define YYCTYPE unsigned char char * YYCURSOR; char * YYMARKER; Warn::option_t option; -#line 31 "../src/conf/parse_opts.re" +#line 29 "../src/conf/parse_opts.re" opt: @@ -33,7 +31,7 @@ opt: goto end; } -#line 37 "src/conf/parse_opts.cc" +#line 35 "src/conf/parse_opts.cc" { YYCTYPE yych; unsigned int yyaccept = 0; @@ -73,72 +71,65 @@ opt: }; yych = (YYCTYPE)*YYCURSOR; if (yych <= 0x00) goto yy2; - if (yych == '-') goto yy5; + if (yych == '-') goto yy6; goto yy4; yy2: ++YYCURSOR; -yy3: -#line 40 "../src/conf/parse_opts.re" +#line 38 "../src/conf/parse_opts.re" { error ("bad option: %s", *argv); return EXIT_FAIL; } -#line 87 "src/conf/parse_opts.cc" +#line 84 "src/conf/parse_opts.cc" yy4: - yyaccept = 0; - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - goto yy10; -yy5: - ++YYCURSOR; - if ((yych = (YYCTYPE)*YYCURSOR) <= '-') { - if (yych <= 0x00) goto yy11; - if (yych >= '-') goto yy13; + yych = (YYCTYPE)*++YYCURSOR; + if (yybm[0+yych] & 128) { + goto yy4; + } + goto yy8; +yy6: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= '-') { + if (yych <= 0x00) goto yy10; + if (yych >= '-') goto yy12; } else { - if (yych == 'W') goto yy15; + if (yych == 'W') goto yy14; } -#line 63 "../src/conf/parse_opts.re" +#line 61 "../src/conf/parse_opts.re" { goto opt_short; } -#line 102 "src/conf/parse_opts.cc" -yy7: +#line 101 "src/conf/parse_opts.cc" +yy8: ++YYCURSOR; -#line 61 "../src/conf/parse_opts.re" +#line 59 "../src/conf/parse_opts.re" { if (!opts.source (*argv)) return EXIT_FAIL; goto opt; } -#line 107 "src/conf/parse_opts.cc" -yy9: - ++YYCURSOR; - yych = (YYCTYPE)*YYCURSOR; +#line 106 "src/conf/parse_opts.cc" yy10: - if (yybm[0+yych] & 128) { - goto yy9; - } - goto yy7; -yy11: ++YYCURSOR; -#line 60 "../src/conf/parse_opts.re" +#line 58 "../src/conf/parse_opts.re" { if (!opts.source ("")) return EXIT_FAIL; goto opt; } -#line 120 "src/conf/parse_opts.cc" -yy13: - ++YYCURSOR; - if ((yych = (YYCTYPE)*YYCURSOR) <= 0x00) goto yy17; -#line 64 "../src/conf/parse_opts.re" +#line 111 "src/conf/parse_opts.cc" +yy12: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy16; +#line 62 "../src/conf/parse_opts.re" { goto opt_long; } -#line 126 "src/conf/parse_opts.cc" -yy15: - yyaccept = 1; +#line 117 "src/conf/parse_opts.cc" +yy14: + yyaccept = 0; yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); if (yych <= 'e') { - if (yych <= 0x00) goto yy19; - if (yych >= 'e') goto yy21; + if (yych <= 0x00) goto yy18; + if (yych >= 'e') goto yy20; } else { - if (yych == 'n') goto yy23; + if (yych == 'n') goto yy22; } -yy16: -#line 68 "../src/conf/parse_opts.re" +yy15: +#line 66 "../src/conf/parse_opts.re" { option = Warn::W; goto opt_warn; } -#line 139 "src/conf/parse_opts.cc" -yy17: +#line 130 "src/conf/parse_opts.cc" +yy16: ++YYCURSOR; -#line 46 "../src/conf/parse_opts.re" +#line 44 "../src/conf/parse_opts.re" { // all remaining arguments are non-options // so they must be input files @@ -152,458 +143,459 @@ yy17: } goto end; } -#line 156 "src/conf/parse_opts.cc" -yy19: +#line 147 "src/conf/parse_opts.cc" +yy18: ++YYCURSOR; -#line 66 "../src/conf/parse_opts.re" +#line 64 "../src/conf/parse_opts.re" { warn.set_all (); goto opt; } -#line 161 "src/conf/parse_opts.cc" -yy21: +#line 152 "src/conf/parse_opts.cc" +yy20: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy24; -yy22: + if (yych == 'r') goto yy23; +yy21: YYCURSOR = YYMARKER; - if (yyaccept <= 1) { - if (yyaccept == 0) { - goto yy3; - } else { - goto yy16; - } + if (yyaccept == 0) { + goto yy15; } else { - goto yy28; + goto yy27; } +yy22: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'o') goto yy24; + goto yy21; yy23: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy25; - goto yy22; + if (yych == 'r') goto yy25; + goto yy21; yy24: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy26; - goto yy22; + if (yych == '-') goto yy26; + goto yy21; yy25: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy27; - goto yy22; + if (yych == 'o') goto yy28; + goto yy21; yy26: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy29; - goto yy22; -yy27: - yyaccept = 2; + yyaccept = 1; yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'e') goto yy30; -yy28: -#line 69 "../src/conf/parse_opts.re" + if (yych == 'e') goto yy29; +yy27: +#line 67 "../src/conf/parse_opts.re" { option = Warn::WNO; goto opt_warn; } -#line 199 "src/conf/parse_opts.cc" +#line 186 "src/conf/parse_opts.cc" +yy28: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'r') goto yy30; + goto yy21; yy29: yych = (YYCTYPE)*++YYCURSOR; if (yych == 'r') goto yy31; - goto yy22; + goto yy21; yy30: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy32; - goto yy22; + if (yych <= 0x00) goto yy32; + if (yych == '-') goto yy34; + goto yy21; yy31: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy33; - if (yych == '-') goto yy35; - goto yy22; + if (yych == 'r') goto yy36; + goto yy21; yy32: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy37; - goto yy22; -yy33: ++YYCURSOR; -#line 67 "../src/conf/parse_opts.re" +#line 65 "../src/conf/parse_opts.re" { warn.set_all_error (); goto opt; } -#line 221 "src/conf/parse_opts.cc" -yy35: +#line 208 "src/conf/parse_opts.cc" +yy34: ++YYCURSOR; -#line 70 "../src/conf/parse_opts.re" +#line 68 "../src/conf/parse_opts.re" { option = Warn::WERROR; goto opt_warn; } -#line 226 "src/conf/parse_opts.cc" -yy37: +#line 213 "src/conf/parse_opts.cc" +yy36: yych = (YYCTYPE)*++YYCURSOR; - if (yych != 'o') goto yy22; + if (yych != 'o') goto yy21; yych = (YYCTYPE)*++YYCURSOR; - if (yych != 'r') goto yy22; + if (yych != 'r') goto yy21; yych = (YYCTYPE)*++YYCURSOR; - if (yych != '-') goto yy22; + if (yych != '-') goto yy21; ++YYCURSOR; -#line 71 "../src/conf/parse_opts.re" +#line 69 "../src/conf/parse_opts.re" { option = Warn::WNOERROR; goto opt_warn; } -#line 237 "src/conf/parse_opts.cc" +#line 224 "src/conf/parse_opts.cc" } -#line 72 "../src/conf/parse_opts.re" +#line 70 "../src/conf/parse_opts.re" opt_warn: -#line 244 "src/conf/parse_opts.cc" +#line 231 "src/conf/parse_opts.cc" { YYCTYPE yych; yych = (YYCTYPE)*YYCURSOR; switch (yych) { - case 'c': goto yy46; - case 'e': goto yy47; - case 'm': goto yy48; + case 'c': goto yy45; + case 'e': goto yy46; + case 'm': goto yy47; + case 'n': goto yy48; case 's': goto yy49; case 'u': goto yy50; - default: goto yy44; + default: goto yy43; } -yy44: +yy43: ++YYCURSOR; -yy45: -#line 77 "../src/conf/parse_opts.re" +yy44: +#line 75 "../src/conf/parse_opts.re" { error ("bad warning: %s", *argv); return EXIT_FAIL; } -#line 264 "src/conf/parse_opts.cc" -yy46: +#line 252 "src/conf/parse_opts.cc" +yy45: yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); if (yych == 'o') goto yy51; - goto yy45; -yy47: + goto yy44; +yy46: yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); if (yych == 'm') goto yy53; - goto yy45; -yy48: + goto yy44; +yy47: yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); if (yych == 'a') goto yy54; - goto yy45; + goto yy44; +yy48: + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych == 'o') goto yy55; + goto yy44; yy49: yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'w') goto yy55; - goto yy45; + if (yych == 'w') goto yy56; + goto yy44; yy50: yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'n') goto yy56; - if (yych == 's') goto yy57; - goto yy45; + if (yych == 'n') goto yy57; + if (yych == 's') goto yy58; + goto yy44; yy51: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy58; + if (yych == 'n') goto yy59; yy52: YYCURSOR = YYMARKER; - goto yy45; + goto yy44; yy53: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'p') goto yy59; + if (yych == 'p') goto yy60; goto yy52; yy54: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy60; + if (yych == 't') goto yy61; goto yy52; yy55: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy61; + if (yych == 'n') goto yy62; goto yy52; yy56: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'd') goto yy62; - if (yych == 'r') goto yy63; + if (yych == 'a') goto yy63; goto yy52; yy57: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy64; + if (yych == 'd') goto yy64; + if (yych == 'r') goto yy65; goto yy52; yy58: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'd') goto yy65; + if (yych == 'e') goto yy66; goto yy52; yy59: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy66; + if (yych == 'd') goto yy67; goto yy52; yy60: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'c') goto yy67; + if (yych == 't') goto yy68; goto yy52; yy61: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'p') goto yy68; + if (yych == 'c') goto yy69; goto yy52; yy62: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy69; + if (yych == 'd') goto yy70; goto yy52; yy63: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy70; + if (yych == 'p') goto yy71; goto yy52; yy64: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'l') goto yy71; + if (yych == 'e') goto yy72; goto yy52; yy65: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy72; + if (yych == 'e') goto yy73; goto yy52; yy66: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'y') goto yy73; + if (yych == 'l') goto yy74; goto yy52; yy67: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'h') goto yy74; + if (yych == 'i') goto yy75; goto yy52; yy68: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'p') goto yy75; + if (yych == 'y') goto yy76; goto yy52; yy69: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'f') goto yy76; + if (yych == 'h') goto yy77; goto yy52; yy70: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy77; + if (yych == 'e') goto yy78; goto yy52; yy71: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy78; + if (yych == 'p') goto yy79; goto yy52; yy72: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy79; + if (yych == 'f') goto yy80; goto yy52; yy73: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy80; + if (yych == 'a') goto yy81; goto yy52; yy74: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy81; + if (yych == 'e') goto yy82; goto yy52; yy75: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy82; + if (yych == 't') goto yy83; goto yy52; yy76: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy83; + if (yych == '-') goto yy84; goto yy52; yy77: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'c') goto yy84; + if (yych == '-') goto yy85; goto yy52; yy78: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy85; + if (yych == 't') goto yy86; goto yy52; yy79: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy86; + if (yych == 'e') goto yy87; goto yy52; yy80: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'c') goto yy87; + if (yych == 'i') goto yy88; goto yy52; yy81: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy88; + if (yych == 'c') goto yy89; goto yy52; yy82: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'd') goto yy89; + if (yych == 's') goto yy90; goto yy52; yy83: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy90; + if (yych == 'i') goto yy91; goto yy52; yy84: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'h') goto yy91; + if (yych == 'c') goto yy92; goto yy52; yy85: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy92; + if (yych == 'e') goto yy93; goto yy52; yy86: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy93; + if (yych == 'e') goto yy94; goto yy52; yy87: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'h') goto yy94; + if (yych == 'd') goto yy95; goto yy52; yy88: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'm') goto yy95; + if (yych == 'n') goto yy96; goto yy52; yy89: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy96; + if (yych == 'h') goto yy97; goto yy52; yy90: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy97; + if (yych == 's') goto yy98; goto yy52; yy91: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy98; + if (yych == 'o') goto yy99; goto yy52; yy92: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy99; + if (yych == 'h') goto yy100; goto yy52; yy93: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy100; + if (yych == 'm') goto yy101; goto yy52; yy94: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy101; + if (yych == 'r') goto yy102; goto yy52; yy95: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'p') goto yy102; + if (yych == '-') goto yy103; goto yy52; yy96: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy103; + if (yych == 'e') goto yy104; goto yy52; yy97: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'd') goto yy104; + if (yych == 'a') goto yy105; goto yy52; yy98: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'b') goto yy105; + if (yych == '-') goto yy106; goto yy52; yy99: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy106; + if (yych == 'n') goto yy107; goto yy52; yy100: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy107; + if (yych == 'a') goto yy108; goto yy52; yy101: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy108; + if (yych == 'p') goto yy109; goto yy52; yy102: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy109; + if (yych == 'm') goto yy110; goto yy52; yy103: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy110; + if (yych == 'r') goto yy111; goto yy52; yy104: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy111; + if (yych == 'd') goto yy112; goto yy52; yy105: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'l') goto yy112; + if (yych == 'b') goto yy113; goto yy52; yy106: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy113; + if (yych == 'e') goto yy114; goto yy52; yy107: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy114; + if (yych == '-') goto yy115; goto yy52; yy108: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy115; + if (yych == 'r') goto yy116; goto yy52; yy109: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'y') goto yy116; + if (yych == 't') goto yy117; goto yy52; yy110: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy117; + if (yych == 'i') goto yy118; goto yy52; yy111: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'c') goto yy118; + if (yych == 'a') goto yy119; goto yy52; yy112: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy119; + if (yych == '-') goto yy120; goto yy52; yy113: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'c') goto yy120; + if (yych == 'l') goto yy121; goto yy52; yy114: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy121; + if (yych == 's') goto yy122; goto yy52; yy115: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'c') goto yy122; + if (yych == 'o') goto yy123; goto yy52; yy116: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy123; + if (yych == 'a') goto yy124; goto yy52; yy117: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'g') goto yy124; + if (yych == 'y') goto yy125; goto yy52; yy118: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy125; + if (yych == 'n') goto yy126; goto yy52; yy119: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy126; + if (yych == 'n') goto yy127; goto yy52; yy120: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy127; + if (yych == 'c') goto yy128; goto yy52; yy121: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'd') goto yy128; + if (yych == 'e') goto yy129; goto yy52; yy122: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy129; + if (yych == 'c') goto yy130; goto yy52; yy123: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy130; + if (yych == 'r') goto yy131; goto yy52; yy124: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy131; + if (yych == 'c') goto yy132; goto yy52; yy125: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy132; + if (yych == '-') goto yy133; goto yy52; yy126: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy133; + if (yych == 'i') goto yy134; goto yy52; yy127: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'p') goto yy134; + if (yych == 'g') goto yy135; goto yy52; yy128: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy135; + if (yych == 'o') goto yy136; goto yy52; yy129: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy136; + if (yych == '-') goto yy137; goto yy52; yy130: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy137; + if (yych == 'a') goto yy138; goto yy52; yy131: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy138; + if (yych == 'd') goto yy139; goto yy52; yy132: yych = (YYCTYPE)*++YYCURSOR; @@ -611,1682 +603,2175 @@ yy132: goto yy52; yy133: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'u') goto yy141; + if (yych == 's') goto yy141; goto yy52; yy134: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy142; + if (yych == 's') goto yy142; goto yy52; yy135: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy143; + if (yych == 'e') goto yy143; goto yy52; yy136: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy144; + if (yych == 'n') goto yy144; goto yy52; yy137: yych = (YYCTYPE)*++YYCURSOR; if (yych == 'r') goto yy145; goto yy52; yy138: - ++YYCURSOR; -#line 84 "../src/conf/parse_opts.re" - { warn.set (Warn::SWAPPED_RANGE, option); goto opt; } -#line 637 "src/conf/parse_opts.cc" + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'p') goto yy146; + goto yy52; +yy139: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy147; + goto yy52; yy140: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy146; + if (yych == 'e') goto yy148; goto yy52; yy141: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'l') goto yy147; + if (yych == 't') goto yy149; goto yy52; yy142: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy148; + if (yych == 't') goto yy150; goto yy52; yy143: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy150; + if (yych <= 0x00) goto yy151; goto yy52; yy144: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy152; + if (yych == 't') goto yy153; goto yy52; yy145: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy153; + if (yych == 'u') goto yy154; goto yy52; yy146: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy154; + if (yych == 'e') goto yy155; goto yy52; yy147: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy155; + if (yych == 'r') goto yy156; goto yy52; yy148: - ++YYCURSOR; -#line 87 "../src/conf/parse_opts.re" - { warn.set (Warn::USELESS_ESCAPE, option); goto opt; } -#line 674 "src/conf/parse_opts.cc" + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'r') goto yy157; + goto yy52; +yy149: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'r') goto yy158; + goto yy52; yy150: - ++YYCURSOR; -#line 81 "../src/conf/parse_opts.re" - { warn.set (Warn::CONDITION_ORDER, option); goto opt; } -#line 679 "src/conf/parse_opts.cc" -yy152: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'c') goto yy156; + if (yych == 'i') goto yy159; goto yy52; +yy151: + ++YYCURSOR; +#line 83 "../src/conf/parse_opts.re" + { warn.set (Warn::SWAPPED_RANGE, option); goto opt; } +#line 681 "src/conf/parse_opts.cc" yy153: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy157; + if (yych == 'r') goto yy160; goto yy52; yy154: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'l') goto yy158; + if (yych == 'l') goto yy161; goto yy52; yy155: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy159; + if (yych <= 0x00) goto yy162; goto yy52; yy156: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'l') goto yy160; + if (yych <= 0x00) goto yy164; goto yy52; yy157: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'g') goto yy161; + if (yych == '-') goto yy166; goto yy52; yy158: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy162; + if (yych == 'i') goto yy167; goto yy52; yy159: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy163; + if (yych == 'c') goto yy168; goto yy52; yy160: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy165; + if (yych == 'o') goto yy169; goto yy52; yy161: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy166; + if (yych == 'e') goto yy170; goto yy52; yy162: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'f') goto yy168; - goto yy52; -yy163: ++YYCURSOR; #line 86 "../src/conf/parse_opts.re" - { warn.set (Warn::UNREACHABLE_RULES, option); goto opt; } -#line 728 "src/conf/parse_opts.cc" -yy165: + { warn.set (Warn::USELESS_ESCAPE, option); goto opt; } +#line 722 "src/conf/parse_opts.cc" +yy164: + ++YYCURSOR; +#line 79 "../src/conf/parse_opts.re" + { warn.set (Warn::CONDITION_ORDER, option); goto opt; } +#line 727 "src/conf/parse_opts.cc" +yy166: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy169; + if (yych == 'c') goto yy171; + goto yy52; +yy167: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'n') goto yy172; goto yy52; -yy166: - ++YYCURSOR; -#line 83 "../src/conf/parse_opts.re" - { warn.set (Warn::MATCH_EMPTY_STRING, option); goto opt; } -#line 737 "src/conf/parse_opts.cc" yy168: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'l') goto yy170; + if (yych == '-') goto yy173; goto yy52; yy169: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy171; + if (yych == 'l') goto yy174; goto yy52; yy170: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy172; + if (yych == 's') goto yy175; goto yy52; yy171: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy173; + if (yych == 'l') goto yy176; goto yy52; yy172: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'w') goto yy175; + if (yych == 'g') goto yy177; goto yy52; yy173: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 't') goto yy178; + goto yy52; +yy174: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '-') goto yy179; + goto yy52; +yy175: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy180; + goto yy52; +yy176: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'a') goto yy182; + goto yy52; +yy177: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy183; + goto yy52; +yy178: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'a') goto yy185; + goto yy52; +yy179: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'f') goto yy186; + goto yy52; +yy180: + ++YYCURSOR; +#line 85 "../src/conf/parse_opts.re" + { warn.set (Warn::UNREACHABLE_RULES, option); goto opt; } +#line 788 "src/conf/parse_opts.cc" +yy182: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 's') goto yy187; + goto yy52; +yy183: + ++YYCURSOR; +#line 81 "../src/conf/parse_opts.re" + { warn.set (Warn::MATCH_EMPTY_STRING, option); goto opt; } +#line 797 "src/conf/parse_opts.cc" +yy185: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'g') goto yy188; + goto yy52; +yy186: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'l') goto yy189; + goto yy52; +yy187: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 's') goto yy190; + goto yy52; +yy188: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 's') goto yy191; + goto yy52; +yy189: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'o') goto yy192; + goto yy52; +yy190: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy193; + goto yy52; +yy191: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy195; + goto yy52; +yy192: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'w') goto yy197; + goto yy52; +yy193: + ++YYCURSOR; +#line 80 "../src/conf/parse_opts.re" + { warn.set (Warn::EMPTY_CHARACTER_CLASS, option); goto opt; } +#line 834 "src/conf/parse_opts.cc" +yy195: ++YYCURSOR; #line 82 "../src/conf/parse_opts.re" - { warn.set (Warn::EMPTY_CHARACTER_CLASS, option); goto opt; } -#line 762 "src/conf/parse_opts.cc" -yy175: + { warn.set (Warn::NONDETERMINISTIC_TAGS, option); goto opt; } +#line 839 "src/conf/parse_opts.cc" +yy197: yych = (YYCTYPE)*++YYCURSOR; if (yych >= 0x01) goto yy52; ++YYCURSOR; -#line 85 "../src/conf/parse_opts.re" - { warn.set (Warn::UNDEFINED_CONTROL_FLOW, option); goto opt; } -#line 769 "src/conf/parse_opts.cc" +#line 84 "../src/conf/parse_opts.re" + { warn.set (Warn::UNDEFINED_CONTROL_FLOW, option); goto opt; } +#line 846 "src/conf/parse_opts.cc" } -#line 88 "../src/conf/parse_opts.re" +#line 87 "../src/conf/parse_opts.re" opt_short: -#line 776 "src/conf/parse_opts.cc" +#line 853 "src/conf/parse_opts.cc" { YYCTYPE yych; yych = (YYCTYPE)*YYCURSOR; - if (yych <= 'b') { - if (yych <= 'C') { + if (yych <= 'a') { + if (yych <= 'D') { if (yych <= '7') { - if (yych <= 0x00) goto yy180; - if (yych == '1') goto yy184; - goto yy182; + if (yych <= 0x00) goto yy202; + if (yych == '1') goto yy206; + goto yy204; } else { - if (yych <= '8') goto yy186; - if (yych == '?') goto yy188; - goto yy182; + if (yych <= '>') { + if (yych <= '8') goto yy208; + goto yy204; + } else { + if (yych <= '?') goto yy210; + if (yych <= 'C') goto yy204; + goto yy212; + } } } else { if (yych <= 'R') { - if (yych <= 'D') goto yy190; - if (yych == 'F') goto yy192; - goto yy182; + if (yych <= 'F') { + if (yych <= 'E') goto yy204; + goto yy214; + } else { + if (yych == 'P') goto yy216; + goto yy204; + } } else { - if (yych <= 'U') { - if (yych <= 'S') goto yy194; - goto yy182; + if (yych <= 'T') { + if (yych <= 'S') goto yy218; + goto yy220; } else { - if (yych <= 'V') goto yy196; - if (yych <= 'a') goto yy182; - goto yy198; + if (yych == 'V') goto yy222; + goto yy204; } } } } else { - if (yych <= 'o') { - if (yych <= 'f') { - if (yych <= 'c') goto yy200; - if (yych <= 'd') goto yy202; - if (yych <= 'e') goto yy204; - goto yy206; + if (yych <= 'n') { + if (yych <= 'e') { + if (yych <= 'b') goto yy224; + if (yych <= 'c') goto yy226; + if (yych <= 'd') goto yy228; + goto yy230; } else { - if (yych <= 'h') { - if (yych <= 'g') goto yy208; - goto yy188; + if (yych <= 'g') { + if (yych <= 'f') goto yy232; + goto yy234; } else { - if (yych <= 'i') goto yy210; - if (yych <= 'n') goto yy182; - goto yy212; + if (yych <= 'h') goto yy210; + if (yych <= 'i') goto yy236; + goto yy204; } } } else { if (yych <= 't') { - if (yych <= 'q') goto yy182; - if (yych <= 'r') goto yy214; - if (yych <= 's') goto yy216; - goto yy218; + if (yych <= 'q') { + if (yych <= 'o') goto yy238; + goto yy204; + } else { + if (yych <= 'r') goto yy240; + if (yych <= 's') goto yy242; + goto yy244; + } } else { if (yych <= 'v') { - if (yych <= 'u') goto yy220; - goto yy222; + if (yych <= 'u') goto yy246; + goto yy248; } else { - if (yych <= 'w') goto yy224; - if (yych <= 'x') goto yy226; - goto yy182; + if (yych <= 'w') goto yy250; + if (yych <= 'x') goto yy252; + goto yy204; } } } } -yy180: +yy202: ++YYCURSOR; -#line 97 "../src/conf/parse_opts.re" +#line 96 "../src/conf/parse_opts.re" { goto opt; } -#line 846 "src/conf/parse_opts.cc" -yy182: +#line 935 "src/conf/parse_opts.cc" +yy204: ++YYCURSOR; -#line 93 "../src/conf/parse_opts.re" +#line 92 "../src/conf/parse_opts.re" { error ("bad short option: %s", *argv); return EXIT_FAIL; } -#line 854 "src/conf/parse_opts.cc" -yy184: +#line 943 "src/conf/parse_opts.cc" +yy206: ++YYCURSOR; -#line 121 "../src/conf/parse_opts.re" +#line 124 "../src/conf/parse_opts.re" { goto opt_short; } -#line 859 "src/conf/parse_opts.cc" -yy186: +#line 948 "src/conf/parse_opts.cc" +yy208: ++YYCURSOR; -#line 116 "../src/conf/parse_opts.re" - { if (!opts.set_encoding (Enc::UTF8)) { error_encoding (); return EXIT_FAIL; } goto opt_short; } -#line 864 "src/conf/parse_opts.cc" -yy188: +#line 119 "../src/conf/parse_opts.re" + { opts.set_encoding(Enc::UTF8); goto opt_short; } +#line 953 "src/conf/parse_opts.cc" +yy210: ++YYCURSOR; -#line 98 "../src/conf/parse_opts.re" +#line 97 "../src/conf/parse_opts.re" { usage (); return EXIT_OK; } -#line 869 "src/conf/parse_opts.cc" -yy190: +#line 958 "src/conf/parse_opts.cc" +yy212: + ++YYCURSOR; +#line 102 "../src/conf/parse_opts.re" + { globopts.target = TARGET_DOT; goto opt_short; } +#line 963 "src/conf/parse_opts.cc" +yy214: ++YYCURSOR; #line 104 "../src/conf/parse_opts.re" - { opts.set_target (opt_t::DOT); goto opt_short; } -#line 874 "src/conf/parse_opts.cc" -yy192: + { globopts.FFlag = true; goto opt_short; } +#line 968 "src/conf/parse_opts.cc" +yy216: + ++YYCURSOR; +#line 114 "../src/conf/parse_opts.re" + { opts.set_posix_captures(true); goto opt_short; } +#line 973 "src/conf/parse_opts.cc" +yy218: ++YYCURSOR; #line 106 "../src/conf/parse_opts.re" - { opts.set_FFlag (true); goto opt_short; } -#line 879 "src/conf/parse_opts.cc" -yy194: + { globopts.target = TARGET_SKELETON; goto opt_short; } +#line 978 "src/conf/parse_opts.cc" +yy220: ++YYCURSOR; -#line 111 "../src/conf/parse_opts.re" - { opts.set_target (opt_t::SKELETON); goto opt_short; } -#line 884 "src/conf/parse_opts.cc" -yy196: +#line 113 "../src/conf/parse_opts.re" + { opts.set_tags(true); goto opt_short; } +#line 983 "src/conf/parse_opts.cc" +yy222: ++YYCURSOR; -#line 100 "../src/conf/parse_opts.re" +#line 99 "../src/conf/parse_opts.re" { vernum (); return EXIT_OK; } -#line 889 "src/conf/parse_opts.cc" -yy198: - ++YYCURSOR; -#line 101 "../src/conf/parse_opts.re" - { opts.set_bFlag (true); goto opt_short; } -#line 894 "src/conf/parse_opts.cc" -yy200: +#line 988 "src/conf/parse_opts.cc" +yy224: ++YYCURSOR; -#line 102 "../src/conf/parse_opts.re" - { opts.set_cFlag (true); goto opt_short; } -#line 899 "src/conf/parse_opts.cc" -yy202: +#line 108 "../src/conf/parse_opts.re" + { opts.set_bFlag(true); goto opt_short; } +#line 993 "src/conf/parse_opts.cc" +yy226: ++YYCURSOR; -#line 103 "../src/conf/parse_opts.re" - { opts.set_dFlag (true); goto opt_short; } -#line 904 "src/conf/parse_opts.cc" -yy204: +#line 101 "../src/conf/parse_opts.re" + { globopts.cFlag = true; goto opt_short; } +#line 998 "src/conf/parse_opts.cc" +yy228: ++YYCURSOR; -#line 112 "../src/conf/parse_opts.re" - { if (!opts.set_encoding (Enc::EBCDIC)) { error_encoding (); return EXIT_FAIL; } goto opt_short; } -#line 909 "src/conf/parse_opts.cc" -yy206: +#line 109 "../src/conf/parse_opts.re" + { opts.set_dFlag(true); goto opt_short; } +#line 1003 "src/conf/parse_opts.cc" +yy230: ++YYCURSOR; -#line 105 "../src/conf/parse_opts.re" - { opts.set_fFlag (true); goto opt_short; } -#line 914 "src/conf/parse_opts.cc" -yy208: +#line 115 "../src/conf/parse_opts.re" + { opts.set_encoding(Enc::EBCDIC); goto opt_short; } +#line 1008 "src/conf/parse_opts.cc" +yy232: ++YYCURSOR; -#line 107 "../src/conf/parse_opts.re" - { opts.set_gFlag (true); goto opt_short; } -#line 919 "src/conf/parse_opts.cc" -yy210: +#line 103 "../src/conf/parse_opts.re" + { globopts.fFlag = true; goto opt_short; } +#line 1013 "src/conf/parse_opts.cc" +yy234: ++YYCURSOR; -#line 108 "../src/conf/parse_opts.re" - { opts.set_iFlag (true); goto opt_short; } -#line 924 "src/conf/parse_opts.cc" -yy212: +#line 110 "../src/conf/parse_opts.re" + { opts.set_gFlag(true); goto opt_short; } +#line 1018 "src/conf/parse_opts.cc" +yy236: ++YYCURSOR; - if ((yych = (YYCTYPE)*YYCURSOR) <= 0x00) goto yy228; -#line 118 "../src/conf/parse_opts.re" +#line 111 "../src/conf/parse_opts.re" + { opts.set_iFlag(true); goto opt_short; } +#line 1023 "src/conf/parse_opts.cc" +yy238: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy254; +#line 121 "../src/conf/parse_opts.re" { *argv = YYCURSOR; goto opt_output; } -#line 930 "src/conf/parse_opts.cc" -yy214: - ++YYCURSOR; -#line 109 "../src/conf/parse_opts.re" - { opts.set_rFlag (true); goto opt_short; } -#line 935 "src/conf/parse_opts.cc" -yy216: +#line 1029 "src/conf/parse_opts.cc" +yy240: ++YYCURSOR; -#line 110 "../src/conf/parse_opts.re" - { opts.set_sFlag (true); goto opt_short; } -#line 940 "src/conf/parse_opts.cc" -yy218: +#line 105 "../src/conf/parse_opts.re" + { globopts.rFlag = true; goto opt_short; } +#line 1034 "src/conf/parse_opts.cc" +yy242: ++YYCURSOR; - if ((yych = (YYCTYPE)*YYCURSOR) <= 0x00) goto yy230; -#line 120 "../src/conf/parse_opts.re" +#line 112 "../src/conf/parse_opts.re" + { opts.set_sFlag(true); goto opt_short; } +#line 1039 "src/conf/parse_opts.cc" +yy244: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy256; +#line 123 "../src/conf/parse_opts.re" { *argv = YYCURSOR; goto opt_header; } -#line 946 "src/conf/parse_opts.cc" -yy220: +#line 1045 "src/conf/parse_opts.cc" +yy246: ++YYCURSOR; -#line 113 "../src/conf/parse_opts.re" - { if (!opts.set_encoding (Enc::UTF32)) { error_encoding (); return EXIT_FAIL; } goto opt_short; } -#line 951 "src/conf/parse_opts.cc" -yy222: +#line 116 "../src/conf/parse_opts.re" + { opts.set_encoding(Enc::UTF32); goto opt_short; } +#line 1050 "src/conf/parse_opts.cc" +yy248: ++YYCURSOR; -#line 99 "../src/conf/parse_opts.re" +#line 98 "../src/conf/parse_opts.re" { version (); return EXIT_OK; } -#line 956 "src/conf/parse_opts.cc" -yy224: +#line 1055 "src/conf/parse_opts.cc" +yy250: ++YYCURSOR; -#line 114 "../src/conf/parse_opts.re" - { if (!opts.set_encoding (Enc::UCS2)) { error_encoding (); return EXIT_FAIL; } goto opt_short; } -#line 961 "src/conf/parse_opts.cc" -yy226: +#line 117 "../src/conf/parse_opts.re" + { opts.set_encoding(Enc::UCS2); goto opt_short; } +#line 1060 "src/conf/parse_opts.cc" +yy252: ++YYCURSOR; -#line 115 "../src/conf/parse_opts.re" - { if (!opts.set_encoding (Enc::UTF16)) { error_encoding (); return EXIT_FAIL; } goto opt_short; } -#line 966 "src/conf/parse_opts.cc" -yy228: +#line 118 "../src/conf/parse_opts.re" + { opts.set_encoding(Enc::UTF16); goto opt_short; } +#line 1065 "src/conf/parse_opts.cc" +yy254: ++YYCURSOR; -#line 117 "../src/conf/parse_opts.re" +#line 120 "../src/conf/parse_opts.re" { if (!next (YYCURSOR, argv)) { error_arg ("-o, --output"); return EXIT_FAIL; } goto opt_output; } -#line 971 "src/conf/parse_opts.cc" -yy230: +#line 1070 "src/conf/parse_opts.cc" +yy256: ++YYCURSOR; -#line 119 "../src/conf/parse_opts.re" +#line 122 "../src/conf/parse_opts.re" { if (!next (YYCURSOR, argv)) { error_arg ("-t, --type-header"); return EXIT_FAIL; } goto opt_header; } -#line 976 "src/conf/parse_opts.cc" +#line 1075 "src/conf/parse_opts.cc" } -#line 122 "../src/conf/parse_opts.re" +#line 125 "../src/conf/parse_opts.re" opt_long: -#line 983 "src/conf/parse_opts.cc" +#line 1082 "src/conf/parse_opts.cc" { YYCTYPE yych; yych = (YYCTYPE)*YYCURSOR; switch (yych) { - case 'b': goto yy236; - case 'c': goto yy237; - case 'd': goto yy238; - case 'e': goto yy239; - case 'f': goto yy240; - case 'h': goto yy241; - case 'i': goto yy242; - case 'n': goto yy243; - case 'o': goto yy244; - case 'r': goto yy245; - case 's': goto yy246; - case 't': goto yy247; - case 'u': goto yy248; - case 'v': goto yy249; - case 'w': goto yy250; - default: goto yy234; + case 'b': goto yy262; + case 'c': goto yy263; + case 'd': goto yy264; + case 'e': goto yy265; + case 'f': goto yy266; + case 'h': goto yy267; + case 'i': goto yy268; + case 'n': goto yy269; + case 'o': goto yy270; + case 'p': goto yy271; + case 'r': goto yy272; + case 's': goto yy273; + case 't': goto yy274; + case 'u': goto yy275; + case 'v': goto yy276; + case 'w': goto yy277; + default: goto yy260; } -yy234: +yy260: ++YYCURSOR; -yy235: -#line 127 "../src/conf/parse_opts.re" +yy261: +#line 130 "../src/conf/parse_opts.re" { error ("bad long option: %s", *argv); return EXIT_FAIL; } -#line 1013 "src/conf/parse_opts.cc" -yy236: - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'i') goto yy251; - goto yy235; -yy237: +#line 1113 "src/conf/parse_opts.cc" +yy262: yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'a') goto yy253; - if (yych == 'o') goto yy254; - goto yy235; -yy238: + if (yych == 'i') goto yy278; + goto yy261; +yy263: yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych <= 'd') goto yy235; - if (yych <= 'e') goto yy255; - if (yych <= 'f') goto yy256; - goto yy235; -yy239: + if (yych == 'a') goto yy280; + if (yych == 'o') goto yy281; + goto yy261; +yy264: yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych <= 'l') { - if (yych == 'c') goto yy257; - goto yy235; + if (yych <= 'f') { + if (yych <= 'd') goto yy261; + if (yych <= 'e') goto yy282; + goto yy283; } else { - if (yych <= 'm') goto yy258; - if (yych <= 'n') goto yy259; - goto yy235; + if (yych == 'u') goto yy284; + goto yy261; } -yy240: - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'l') goto yy260; - goto yy235; -yy241: - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'e') goto yy261; - goto yy235; -yy242: - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'n') goto yy262; - goto yy235; -yy243: - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'e') goto yy263; - if (yych == 'o') goto yy264; - goto yy235; -yy244: - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'u') goto yy265; - goto yy235; -yy245: - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'e') goto yy266; - goto yy235; -yy246: +yy265: yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych <= 'j') { - if (yych == 'i') goto yy267; - goto yy235; + if (yych <= 'c') { + if (yych == 'a') goto yy285; + if (yych <= 'b') goto yy261; + goto yy286; } else { - if (yych <= 'k') goto yy268; - if (yych == 't') goto yy269; - goto yy235; + if (yych <= 'l') goto yy261; + if (yych <= 'm') goto yy287; + if (yych <= 'n') goto yy288; + goto yy261; } -yy247: - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'y') goto yy270; - goto yy235; -yy248: +yy266: yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'n') goto yy271; - if (yych == 't') goto yy272; - goto yy235; -yy249: + if (yych == 'l') goto yy289; + goto yy261; +yy267: yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'e') goto yy273; - goto yy235; -yy250: + if (yych == 'e') goto yy290; + goto yy261; +yy268: yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'i') goto yy274; - goto yy235; -yy251: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy275; -yy252: - YYCURSOR = YYMARKER; - goto yy235; -yy253: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy276; - goto yy252; -yy254: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'm') goto yy277; - goto yy252; -yy255: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'b') goto yy278; - goto yy252; -yy256: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy279; - goto yy252; -yy257: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'b') goto yy280; - goto yy252; -yy258: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy281; - if (yych == 'p') goto yy282; - goto yy252; -yy259: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'c') goto yy283; - goto yy252; -yy260: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy284; - goto yy252; -yy261: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'l') goto yy285; - goto yy252; -yy262: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'p') goto yy286; - goto yy252; -yy263: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy287; - goto yy252; -yy264: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy288; - goto yy252; -yy265: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy289; - goto yy252; -yy266: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'u') goto yy290; - goto yy252; -yy267: - yych = (YYCTYPE)*++YYCURSOR; if (yych == 'n') goto yy291; - goto yy252; -yy268: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy292; - goto yy252; + goto yy261; yy269: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy293; - if (yych == 'o') goto yy294; - goto yy252; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych == 'e') goto yy292; + if (yych == 'o') goto yy293; + goto yy261; yy270: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'p') goto yy295; - goto yy252; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych == 'u') goto yy294; + goto yy261; yy271: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy296; - goto yy252; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych == 'o') goto yy295; + goto yy261; yy272: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'f') goto yy297; - goto yy252; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych == 'e') goto yy296; + goto yy261; yy273: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy298; - goto yy252; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych <= 'j') { + if (yych == 'i') goto yy297; + goto yy261; + } else { + if (yych <= 'k') goto yy298; + if (yych == 't') goto yy299; + goto yy261; + } yy274: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'd') goto yy299; - goto yy252; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych == 'a') goto yy300; + if (yych == 'y') goto yy301; + goto yy261; yy275: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy300; - goto yy252; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych == 'n') goto yy302; + if (yych == 't') goto yy303; + goto yy261; yy276: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy301; - goto yy252; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych == 'e') goto yy304; + goto yy261; yy277: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'p') goto yy302; - goto yy252; + yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); + if (yych == 'i') goto yy305; + goto yy261; yy278: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'u') goto yy303; - goto yy252; + if (yych == 't') goto yy306; yy279: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy304; - goto yy252; + YYCURSOR = YYMARKER; + goto yy261; yy280: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy305; - goto yy252; + if (yych == 's') goto yy307; + goto yy279; yy281: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy307; - goto yy252; + if (yych == 'm') goto yy308; + goto yy279; yy282: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy308; - goto yy252; + if (yych == 'b') goto yy309; + goto yy279; yy283: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy309; - goto yy252; + if (yych == 'a') goto yy310; + goto yy279; yy284: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'x') goto yy310; - goto yy252; + if (yych == 'm') goto yy311; + goto yy279; yy285: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'p') goto yy311; - goto yy252; + if (yych == 'g') goto yy312; + goto yy279; yy286: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'u') goto yy312; - goto yy252; + if (yych == 'b') goto yy313; + goto yy279; yy287: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy313; - goto yy252; + if (yych == 'i') goto yy314; + if (yych == 'p') goto yy315; + goto yy279; yy288: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 'f') { - if (yych == 'd') goto yy314; - goto yy252; - } else { - if (yych <= 'g') goto yy315; - if (yych == 'v') goto yy316; - goto yy252; - } + if (yych == 'c') goto yy316; + goto yy279; yy289: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'p') goto yy317; - goto yy252; + if (yych == 'e') goto yy317; + goto yy279; yy290: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy318; - goto yy252; + if (yych == 'l') goto yy318; + goto yy279; yy291: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'g') goto yy319; - goto yy252; + if (yych == 'p') goto yy319; + goto yy279; yy292: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'l') goto yy320; - goto yy252; + if (yych == 's') goto yy320; + goto yy279; yy293: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy321; - goto yy252; + if (yych == '-') goto yy321; + goto yy279; yy294: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy322; - goto yy252; + if (yych == 't') goto yy322; + goto yy279; yy295: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy323; - goto yy252; + if (yych == 's') goto yy323; + goto yy279; yy296: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'c') goto yy324; - goto yy252; + if (yych == 'u') goto yy324; + goto yy279; yy297: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy325; - goto yy252; + if (yych == 'n') goto yy325; + goto yy279; yy298: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy326; - if (yych == 's') goto yy327; - goto yy252; + if (yych == 'e') goto yy326; + goto yy279; yy299: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy328; - goto yy252; + if (yych == 'a') goto yy327; + if (yych == 'o') goto yy328; + goto yy279; yy300: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'v') goto yy329; - goto yy252; + if (yych == 'g') goto yy329; + goto yy279; yy301: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy330; - goto yy252; + if (yych == 'p') goto yy330; + goto yy279; yy302: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'u') goto yy331; - goto yy252; + if (yych == 'i') goto yy331; + goto yy279; yy303: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'g') goto yy332; - goto yy252; + if (yych == 'f') goto yy332; + goto yy279; yy304: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'm') goto yy333; - goto yy252; + if (yych == 'r') goto yy333; + goto yy279; yy305: - ++YYCURSOR; -#line 149 "../src/conf/parse_opts.re" - { if (!opts.set_encoding (Enc::EBCDIC)) { error_encoding (); return EXIT_FAIL; } goto opt; } -#line 1318 "src/conf/parse_opts.cc" + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'd') goto yy334; + goto yy279; +yy306: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '-') goto yy335; + goto yy279; yy307: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy334; - goto yy252; + if (yych == 'e') goto yy336; + goto yy279; yy308: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'y') goto yy335; - goto yy252; + if (yych == 'p') goto yy337; + goto yy279; yy309: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'd') goto yy336; - goto yy252; + if (yych == 'u') goto yy338; + goto yy279; yy310: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy337; - goto yy252; + if (yych == '-') goto yy339; + goto yy279; yy311: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy338; - goto yy252; + if (yych == 'p') goto yy340; + goto yy279; yy312: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy340; - goto yy252; + if (yych == 'e') goto yy341; + goto yy279; yy313: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy341; - goto yy252; + if (yych <= 0x00) goto yy342; + goto yy279; yy314: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy342; - goto yy252; + if (yych == 't') goto yy344; + goto yy279; yy315: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy343; - goto yy252; + if (yych == 't') goto yy345; + goto yy279; yy316: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy344; - goto yy252; + if (yych == 'o') goto yy346; + goto yy279; yy317: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'u') goto yy345; - goto yy252; + if (yych == 'x') goto yy347; + goto yy279; yy318: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy346; - goto yy252; + if (yych == 'p') goto yy348; + goto yy279; yy319: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'l') goto yy347; - goto yy252; + if (yych == 'u') goto yy349; + goto yy279; yy320: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy348; - goto yy252; + if (yych == 't') goto yy350; + goto yy279; yy321: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy349; - goto yy252; + switch (yych) { + case 'd': goto yy351; + case 'g': goto yy352; + case 'l': goto yy353; + case 'o': goto yy354; + case 'v': goto yy355; + default: goto yy279; + } yy322: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy350; - goto yy252; + if (yych == 'p') goto yy356; + goto yy279; yy323: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy351; - goto yy252; + if (yych == 'i') goto yy357; + goto yy279; yy324: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy352; - goto yy252; + if (yych == 's') goto yy358; + goto yy279; yy325: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '1') goto yy353; - if (yych == '8') goto yy354; - goto yy252; + if (yych == 'g') goto yy359; + goto yy279; yy326: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'u') goto yy355; - goto yy252; + if (yych == 'l') goto yy360; + goto yy279; yy327: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy356; - goto yy252; + if (yych == 'r') goto yy361; + goto yy279; yy328: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy357; - goto yy252; + if (yych == 'r') goto yy362; + goto yy279; yy329: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy358; - goto yy252; + if (yych == 's') goto yy363; + goto yy279; yy330: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy359; - goto yy252; + if (yych == 'e') goto yy364; + goto yy279; yy331: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy360; - goto yy252; + if (yych == 'c') goto yy365; + goto yy279; yy332: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy361; - goto yy252; + if (yych == '-') goto yy366; + goto yy279; yy333: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy362; - goto yy252; + if (yych == 'n') goto yy367; + if (yych == 's') goto yy368; + goto yy279; yy334: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'd') goto yy363; - goto yy252; + if (yych == 'e') goto yy369; + goto yy279; yy335: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy364; - goto yy252; + if (yych == 'v') goto yy370; + goto yy279; yy336: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy365; - goto yy252; + if (yych == '-') goto yy371; + goto yy279; yy337: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy366; - goto yy252; + if (yych == 'u') goto yy372; + goto yy279; yy338: - ++YYCURSOR; -#line 131 "../src/conf/parse_opts.re" - { usage (); return EXIT_OK; } -#line 1448 "src/conf/parse_opts.cc" + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'g') goto yy373; + goto yy279; +yy339: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'm') goto yy374; + goto yy279; yy340: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy367; - goto yy252; + if (yych == '-') goto yy375; + goto yy279; yy341: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'd') goto yy369; - goto yy252; + if (yych == 'r') goto yy376; + goto yy279; yy342: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'b') goto yy370; - goto yy252; -yy343: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy371; - goto yy252; + ++YYCURSOR; +#line 159 "../src/conf/parse_opts.re" + { opts.set_encoding(Enc::EBCDIC); goto opt; } +#line 1469 "src/conf/parse_opts.cc" yy344: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy372; - goto yy252; + if (yych == '-') goto yy377; + goto yy279; yy345: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy373; - goto yy252; + if (yych == 'y') goto yy378; + goto yy279; yy346: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'b') goto yy374; - goto yy252; + if (yych == 'd') goto yy379; + goto yy279; yy347: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy375; - goto yy252; + if (yych == '-') goto yy380; + goto yy279; yy348: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy376; - goto yy252; + if (yych <= 0x00) goto yy381; + goto yy279; yy349: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy377; - goto yy252; + if (yych == 't') goto yy383; + goto yy279; yy350: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'b') goto yy378; - goto yy252; + if (yych == 'e') goto yy384; + goto yy279; yy351: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'h') goto yy379; - goto yy252; + if (yych == 'e') goto yy385; + goto yy279; yy352: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'd') goto yy380; - goto yy252; + if (yych == 'e') goto yy386; + goto yy279; yy353: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '6') goto yy381; - goto yy252; + if (yych == 'o') goto yy387; + goto yy279; yy354: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy382; - goto yy252; + if (yych == 'p') goto yy388; + goto yy279; yy355: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'm') goto yy384; - goto yy252; + if (yych == 'e') goto yy389; + goto yy279; yy356: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy385; - goto yy252; + if (yych == 'u') goto yy390; + goto yy279; yy357: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'c') goto yy386; - goto yy252; + if (yych == 'x') goto yy391; + goto yy279; yy358: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'c') goto yy387; - goto yy252; + if (yych == 'a') goto yy392; + goto yy279; yy359: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy388; - goto yy252; + if (yych == 'l') goto yy393; + goto yy279; yy360: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy389; - goto yy252; + if (yych == 'e') goto yy394; + goto yy279; yy361: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy390; - goto yy252; + if (yych == 't') goto yy395; + goto yy279; yy362: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy391; - goto yy252; + if (yych == 'a') goto yy396; + goto yy279; yy363: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy392; - goto yy252; + if (yych <= 0x00) goto yy397; + goto yy279; yy364: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'c') goto yy393; - goto yy252; + if (yych == '-') goto yy399; + goto yy279; yy365: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy394; - goto yy252; + if (yych == 'o') goto yy400; + goto yy279; yy366: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'y') goto yy395; - goto yy252; + if (yych == '1') goto yy401; + if (yych == '8') goto yy402; + goto yy279; yy367: - ++YYCURSOR; -#line 157 "../src/conf/parse_opts.re" - { goto opt_input; } -#line 1561 "src/conf/parse_opts.cc" + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'u') goto yy403; + goto yy279; +yy368: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'i') goto yy404; + goto yy279; yy369: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy396; - goto yy252; + if (yych == '-') goto yy405; + goto yy279; yy370: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'u') goto yy397; - goto yy252; + if (yych == 'e') goto yy406; + goto yy279; yy371: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy398; - goto yy252; + if (yych == 'i') goto yy407; + goto yy279; yy372: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy399; - goto yy252; + if (yych == 't') goto yy408; + goto yy279; yy373: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy400; - goto yy252; + if (yych == '-') goto yy409; + goto yy279; yy374: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'l') goto yy402; - goto yy252; + if (yych == 'i') goto yy410; + goto yy279; yy375: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy403; - goto yy252; + if (yych <= 'c') { + if (yych == 'a') goto yy411; + goto yy279; + } else { + if (yych <= 'd') goto yy412; + if (yych == 'n') goto yy413; + goto yy279; + } yy376: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy404; - goto yy252; + if (yych == '-') goto yy414; + goto yy279; yy377: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'c') goto yy405; - goto yy252; + if (yych == 'd') goto yy415; + goto yy279; yy378: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'l') goto yy406; - goto yy252; + if (yych == '-') goto yy416; + goto yy279; yy379: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy407; - goto yy252; + if (yych == 'i') goto yy417; + goto yy279; yy380: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy408; - goto yy252; + if (yych == 's') goto yy418; + goto yy279; yy381: - yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy409; - goto yy252; -yy382: ++YYCURSOR; -#line 153 "../src/conf/parse_opts.re" - { if (!opts.set_encoding (Enc::UTF8)) { error_encoding (); return EXIT_FAIL; } goto opt; } -#line 1618 "src/conf/parse_opts.cc" +#line 134 "../src/conf/parse_opts.re" + { usage (); return EXIT_OK; } +#line 1629 "src/conf/parse_opts.cc" +yy383: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy419; + goto yy279; yy384: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy411; - goto yy252; + if (yych == 'd') goto yy421; + goto yy279; yy385: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy413; - goto yy252; + if (yych == 'b') goto yy422; + goto yy279; yy386: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'h') goto yy414; - goto yy252; + if (yych == 'n') goto yy423; + goto yy279; yy387: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy415; - goto yy252; + if (yych == 'o') goto yy424; + goto yy279; yy388: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy416; - if (yych == 'v') goto yy417; - goto yy252; + if (yych == 't') goto yy425; + goto yy279; yy389: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'd') goto yy418; - goto yy252; + if (yych == 'r') goto yy426; + goto yy279; yy390: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'u') goto yy419; - goto yy252; + if (yych == 't') goto yy427; + goto yy279; yy391: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy420; - goto yy252; + if (yych == '-') goto yy428; + goto yy279; yy392: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy421; - goto yy252; + if (yych == 'b') goto yy429; + goto yy279; yy393: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'l') goto yy422; - goto yy252; + if (yych == 'e') goto yy430; + goto yy279; yy394: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'g') goto yy423; - goto yy252; + if (yych == 't') goto yy431; + goto yy279; yy395: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy424; - goto yy252; + if (yych == '-') goto yy432; + goto yy279; yy396: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy425; - goto yy252; + if (yych == 'b') goto yy433; + goto yy279; yy397: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'g') goto yy426; - goto yy252; -yy398: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy427; - goto yy252; + ++YYCURSOR; +#line 154 "../src/conf/parse_opts.re" + { opts.set_tags (true); goto opt; } +#line 1690 "src/conf/parse_opts.cc" yy399: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy428; - goto yy252; + if (yych == 'h') goto yy434; + goto yy279; yy400: - ++YYCURSOR; -#line 154 "../src/conf/parse_opts.re" - { if (!next (YYCURSOR, argv)) { error_arg ("-o, --output"); return EXIT_FAIL; } goto opt_output; } -#line 1688 "src/conf/parse_opts.cc" + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'd') goto yy435; + goto yy279; +yy401: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '6') goto yy436; + goto yy279; yy402: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy429; - goto yy252; + if (yych <= 0x00) goto yy437; + goto yy279; yy403: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'p') goto yy430; - goto yy252; + if (yych == 'm') goto yy439; + goto yy279; yy404: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy431; - goto yy252; + if (yych == 'o') goto yy440; + goto yy279; yy405: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy432; - goto yy252; + if (yych == 'c') goto yy441; + goto yy279; yy406: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy433; - goto yy252; + if (yych == 'c') goto yy442; + goto yy279; yy407: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy434; - goto yy252; + if (yych == 'n') goto yy443; + goto yy279; yy408: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy435; - goto yy252; + if (yych == 'e') goto yy444; + goto yy279; yy409: - ++YYCURSOR; -#line 152 "../src/conf/parse_opts.re" - { if (!opts.set_encoding (Enc::UTF16)) { error_encoding (); return EXIT_FAIL; } goto opt; } -#line 1721 "src/conf/parse_opts.cc" + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'o') goto yy445; + goto yy279; +yy410: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'n') goto yy446; + goto yy279; yy411: - ++YYCURSOR; -#line 133 "../src/conf/parse_opts.re" - { vernum (); return EXIT_OK; } -#line 1726 "src/conf/parse_opts.cc" + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'd') goto yy447; + goto yy279; +yy412: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'f') goto yy448; + goto yy279; yy413: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy437; - goto yy252; + if (yych == 'f') goto yy449; + goto yy279; yy414: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy439; - goto yy252; + if (yych == 's') goto yy450; + goto yy279; yy415: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy440; - goto yy252; + if (yych == 'o') goto yy451; + goto yy279; yy416: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy441; - goto yy252; + if (yych == 'c') goto yy452; + goto yy279; yy417: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy442; - goto yy252; + if (yych == 'n') goto yy453; + goto yy279; yy418: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy443; - goto yy252; + if (yych == 'y') goto yy454; + goto yy279; yy419: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy444; - goto yy252; -yy420: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'm') goto yy445; - goto yy252; + ++YYCURSOR; +#line 167 "../src/conf/parse_opts.re" + { goto opt_input; } +#line 1775 "src/conf/parse_opts.cc" yy421: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy446; - goto yy252; + if (yych == '-') goto yy455; + goto yy279; yy422: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy448; - goto yy252; + if (yych == 'u') goto yy456; + goto yy279; yy423: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy449; - goto yy252; + if (yych == 'e') goto yy457; + goto yy279; yy424: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy450; - goto yy252; + if (yych == 'k') goto yy458; + goto yy279; yy425: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'f') goto yy451; - goto yy252; + if (yych == 'i') goto yy459; + goto yy279; yy426: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy452; - goto yy252; + if (yych == 's') goto yy460; + goto yy279; yy427: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy453; - goto yy252; + if (yych <= 0x00) goto yy461; + goto yy279; yy428: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy454; - goto yy252; + if (yych == 'c') goto yy463; + goto yy279; yy429: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy455; - goto yy252; + if (yych == 'l') goto yy464; + goto yy279; yy430: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy457; - goto yy252; + if (yych == '-') goto yy465; + goto yy279; yy431: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy458; - goto yy252; + if (yych == 'o') goto yy466; + goto yy279; yy432: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy460; - goto yy252; + if (yych == 'c') goto yy467; + goto yy279; yy433: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy461; - goto yy252; + if (yych == 'l') goto yy468; + goto yy279; yy434: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'd') goto yy462; - goto yy252; + if (yych == 'e') goto yy469; + goto yy279; yy435: - ++YYCURSOR; -#line 150 "../src/conf/parse_opts.re" - { if (!opts.set_encoding (Enc::UTF32)) { error_encoding (); return EXIT_FAIL; } goto opt; } -#line 1819 "src/conf/parse_opts.cc" + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy470; + goto yy279; +yy436: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy471; + goto yy279; yy437: ++YYCURSOR; -#line 132 "../src/conf/parse_opts.re" - { version (); return EXIT_OK; } -#line 1824 "src/conf/parse_opts.cc" +#line 163 "../src/conf/parse_opts.re" + { opts.set_encoding(Enc::UTF8); goto opt; } +#line 1844 "src/conf/parse_opts.cc" yy439: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy463; - goto yy252; + if (yych <= 0x00) goto yy473; + goto yy279; yy440: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy464; - goto yy252; + if (yych == 'n') goto yy475; + goto yy279; yy441: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy465; - goto yy252; + if (yych == 'h') goto yy476; + goto yy279; yy442: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy466; - goto yy252; + if (yych == 't') goto yy477; + goto yy279; yy443: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'g') goto yy467; - goto yy252; + if (yych == 's') goto yy478; + if (yych == 'v') goto yy479; + goto yy279; yy444: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'p') goto yy468; - goto yy252; + if (yych == 'd') goto yy480; + goto yy279; yy445: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy469; - goto yy252; + if (yych == 'u') goto yy481; + goto yy279; yy446: - ++YYCURSOR; -#line 137 "../src/conf/parse_opts.re" - { opts.set_target (opt_t::DOT); goto opt; } -#line 1857 "src/conf/parse_opts.cc" + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'i') goto yy482; + goto yy279; +yy447: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'f') goto yy483; + goto yy279; yy448: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy470; - goto yy252; + if (yych == 'a') goto yy484; + goto yy279; yy449: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'p') goto yy471; - goto yy252; + if (yych == 'a') goto yy485; + goto yy279; yy450: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy472; - goto yy252; + if (yych == 'k') goto yy486; + goto yy279; yy451: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy473; - goto yy252; + if (yych == 't') goto yy487; + goto yy279; yy452: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy474; - goto yy252; + if (yych == 'l') goto yy488; + goto yy279; yy453: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy475; - goto yy252; + if (yych == 'g') goto yy489; + goto yy279; yy454: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy476; - goto yy252; + if (yych == 'n') goto yy490; + goto yy279; yy455: - ++YYCURSOR; -#line 142 "../src/conf/parse_opts.re" - { opts.set_rFlag (true); goto opt; } -#line 1890 "src/conf/parse_opts.cc" + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'i') goto yy491; + goto yy279; +yy456: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'g') goto yy492; + goto yy279; yy457: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy477; - goto yy252; + if (yych == 'r') goto yy493; + goto yy279; yy458: - ++YYCURSOR; -#line 148 "../src/conf/parse_opts.re" - { opts.set_target (opt_t::SKELETON); goto opt; } -#line 1899 "src/conf/parse_opts.cc" -yy460: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'd') goto yy478; - goto yy252; -yy461: + if (yych == 'a') goto yy494; + goto yy279; +yy459: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy479; - goto yy252; -yy462: + if (yych == 'm') goto yy495; + goto yy279; +yy460: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy480; - goto yy252; + if (yych == 'i') goto yy496; + goto yy279; +yy461: + ++YYCURSOR; +#line 164 "../src/conf/parse_opts.re" + { if (!next (YYCURSOR, argv)) { error_arg ("-o, --output"); return EXIT_FAIL; } goto opt_output; } +#line 1938 "src/conf/parse_opts.cc" yy463: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy481; - goto yy252; + if (yych == 'a') goto yy497; + goto yy279; yy464: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy482; - goto yy252; + if (yych == 'e') goto yy498; + goto yy279; yy465: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy483; - goto yy252; + if (yych == 'p') goto yy499; + goto yy279; yy466: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy484; - goto yy252; + if (yych == 'n') goto yy500; + goto yy279; yy467: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy485; - goto yy252; + if (yych == 'o') goto yy501; + goto yy279; yy468: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'u') goto yy486; - goto yy252; + if (yych == 'e') goto yy502; + goto yy279; yy469: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'z') goto yy487; - goto yy252; + if (yych == 'a') goto yy503; + goto yy279; yy470: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy488; - goto yy252; + if (yych <= 0x00) goto yy504; + goto yy279; yy471: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy489; - goto yy252; -yy472: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'x') goto yy490; - goto yy252; + ++YYCURSOR; +#line 162 "../src/conf/parse_opts.re" + { opts.set_encoding(Enc::UTF16); goto opt; } +#line 1975 "src/conf/parse_opts.cc" yy473: - yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy491; - goto yy252; -yy474: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy493; - goto yy252; + ++YYCURSOR; +#line 136 "../src/conf/parse_opts.re" + { vernum (); return EXIT_OK; } +#line 1980 "src/conf/parse_opts.cc" yy475: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy494; - goto yy252; + if (yych <= 0x00) goto yy506; + goto yy279; yy476: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy495; - goto yy252; + if (yych == 'a') goto yy508; + goto yy279; yy477: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy497; - goto yy252; + if (yych == 'o') goto yy509; + goto yy279; yy478: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy498; - goto yy252; + if (yych == 'e') goto yy510; + goto yy279; yy479: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy499; - goto yy252; + if (yych == 'e') goto yy511; + goto yy279; yy480: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy500; - goto yy252; + if (yych == '-') goto yy512; + goto yy279; yy481: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy501; - goto yy252; + if (yych == 't') goto yy513; + goto yy279; yy482: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy503; - goto yy252; + if (yych == 'm') goto yy514; + goto yy279; yy483: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy505; - goto yy252; + if (yych == 'a') goto yy515; + goto yy279; yy484: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy506; - goto yy252; + if (yych == '-') goto yy516; + goto yy279; yy485: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy507; - goto yy252; + if (yych <= 0x00) goto yy517; + goto yy279; yy486: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy508; - goto yy252; + if (yych == 'i') goto yy519; + goto yy279; yy487: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy509; - goto yy252; + if (yych <= 0x00) goto yy520; + goto yy279; yy488: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy510; - goto yy252; + if (yych == 'a') goto yy522; + goto yy279; yy489: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'l') goto yy512; - goto yy252; + if (yych == '-') goto yy523; + goto yy279; yy490: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy513; - goto yy252; + if (yych == 't') goto yy524; + goto yy279; yy491: - ++YYCURSOR; -#line 143 "../src/conf/parse_opts.re" - { opts.set_sFlag (true); goto opt; } -#line 2028 "src/conf/parse_opts.cc" + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'f') goto yy525; + goto yy279; +yy492: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '-') goto yy526; + goto yy279; yy493: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'f') goto yy515; - goto yy252; + if (yych == 'a') goto yy527; + goto yy279; yy494: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy516; - goto yy252; + if (yych == 'h') goto yy528; + goto yy279; yy495: - ++YYCURSOR; -#line 145 "../src/conf/parse_opts.re" - { opts.set_version (false); goto opt; } -#line 2041 "src/conf/parse_opts.cc" + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'i') goto yy529; + goto yy279; +yy496: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'o') goto yy530; + goto yy279; yy497: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy517; - goto yy252; + if (yych == 'p') goto yy531; + goto yy279; yy498: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy519; - goto yy252; + if (yych <= 0x00) goto yy532; + goto yy279; yy499: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy520; - goto yy252; + if (yych == 'a') goto yy534; + goto yy279; yy500: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy521; - goto yy252; + if (yych <= 0x00) goto yy535; + goto yy279; yy501: - ++YYCURSOR; -#line 151 "../src/conf/parse_opts.re" - { if (!opts.set_encoding (Enc::UCS2)) { error_encoding (); return EXIT_FAIL; } goto opt; } -#line 2062 "src/conf/parse_opts.cc" -yy503: - ++YYCURSOR; -#line 134 "../src/conf/parse_opts.re" - { opts.set_bFlag (true); goto opt; } -#line 2067 "src/conf/parse_opts.cc" -yy505: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy523; - goto yy252; -yy506: + if (yych == 'n') goto yy537; + goto yy279; +yy502: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'd') goto yy524; - goto yy252; -yy507: + if (yych == '-') goto yy538; + goto yy279; +yy503: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy525; - goto yy252; + if (yych == 'd') goto yy539; + goto yy279; +yy504: + ++YYCURSOR; +#line 160 "../src/conf/parse_opts.re" + { opts.set_encoding(Enc::UTF32); goto opt; } +#line 2101 "src/conf/parse_opts.cc" +yy506: + ++YYCURSOR; +#line 135 "../src/conf/parse_opts.re" + { version (); return EXIT_OK; } +#line 2106 "src/conf/parse_opts.cc" yy508: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy526; - goto yy252; + if (yych == 'r') goto yy540; + goto yy279; yy509: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy528; - goto yy252; + if (yych == 'r') goto yy541; + goto yy279; yy510: - ++YYCURSOR; -#line 158 "../src/conf/parse_opts.re" - { goto opt_empty_class; } -#line 2092 "src/conf/parse_opts.cc" + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'n') goto yy542; + goto yy279; +yy511: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'r') goto yy543; + goto yy279; yy512: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy529; - goto yy252; + if (yych == 'g') goto yy544; + goto yy279; yy513: - ++YYCURSOR; -#line 139 "../src/conf/parse_opts.re" - { opts.set_FFlag (true); goto opt; } -#line 2101 "src/conf/parse_opts.cc" + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'p') goto yy545; + goto yy279; +yy514: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'i') goto yy546; + goto yy279; yy515: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy530; - goto yy252; + if (yych <= 0x00) goto yy547; + goto yy279; yy516: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy531; - goto yy252; + switch (yych) { + case 'd': goto yy549; + case 'm': goto yy550; + case 'r': goto yy551; + case 't': goto yy552; + default: goto yy279; + } yy517: ++YYCURSOR; -#line 160 "../src/conf/parse_opts.re" - { goto opt; } -#line 2114 "src/conf/parse_opts.cc" +#line 172 "../src/conf/parse_opts.re" + { globopts.dump_nfa = true; goto opt; } +#line 2152 "src/conf/parse_opts.cc" yy519: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy532; - goto yy252; + if (yych == 'p') goto yy553; + goto yy279; yy520: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy533; - goto yy252; -yy521: ++YYCURSOR; -#line 155 "../src/conf/parse_opts.re" - { if (!next (YYCURSOR, argv)) { error_arg ("-t, --type-header"); return EXIT_FAIL; } goto opt_header; } -#line 2127 "src/conf/parse_opts.cc" +#line 139 "../src/conf/parse_opts.re" + { globopts.target = TARGET_DOT; goto opt; } +#line 2161 "src/conf/parse_opts.cc" +yy522: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 's') goto yy554; + goto yy279; yy523: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy534; - goto yy252; + if (yych == 'p') goto yy555; + goto yy279; yy524: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy535; - goto yy252; + if (yych == 'a') goto yy556; + goto yy279; yy525: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy537; - goto yy252; + if (yych == 's') goto yy557; + goto yy279; yy526: - ++YYCURSOR; -#line 136 "../src/conf/parse_opts.re" - { opts.set_dFlag (true); goto opt; } -#line 2144 "src/conf/parse_opts.cc" + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'i') goto yy558; + goto yy279; +yy527: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 't') goto yy559; + goto yy279; yy528: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy538; - goto yy252; + if (yych == 'e') goto yy560; + goto yy279; yy529: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'c') goto yy539; - goto yy252; + if (yych == 'z') goto yy561; + goto yy279; yy530: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy540; - goto yy252; + if (yych == 'n') goto yy562; + goto yy279; yy531: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy542; - goto yy252; + if (yych == 't') goto yy563; + goto yy279; yy532: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy543; - goto yy252; -yy533: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy544; - goto yy252; + ++YYCURSOR; +#line 142 "../src/conf/parse_opts.re" + { globopts.rFlag = true; goto opt; } +#line 2206 "src/conf/parse_opts.cc" yy534: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'v') goto yy545; - goto yy252; + if (yych == 's') goto yy564; + goto yy279; yy535: ++YYCURSOR; -#line 147 "../src/conf/parse_opts.re" - { opts.set_bCaseInverted (true); goto opt; } -#line 2177 "src/conf/parse_opts.cc" +#line 145 "../src/conf/parse_opts.re" + { globopts.target = TARGET_SKELETON; goto opt; } +#line 2215 "src/conf/parse_opts.cc" yy537: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy546; - goto yy252; + if (yych == 'd') goto yy565; + goto yy279; yy538: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy548; - goto yy252; + if (yych == 's') goto yy566; + goto yy279; yy539: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'y') goto yy549; - goto yy252; + if (yych == 'e') goto yy567; + goto yy279; yy540: - ++YYCURSOR; -#line 141 "../src/conf/parse_opts.re" - { opts.set_iFlag (true); goto opt; } -#line 2194 "src/conf/parse_opts.cc" + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 's') goto yy568; + goto yy279; +yy541: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 's') goto yy569; + goto yy279; yy542: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'd') goto yy550; - goto yy252; + if (yych == 's') goto yy570; + goto yy279; yy543: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy551; - goto yy252; + if (yych == 't') goto yy571; + goto yy279; yy544: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy552; - goto yy252; + if (yych == 'o') goto yy572; + goto yy279; yy545: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy554; - goto yy252; + if (yych == 'u') goto yy573; + goto yy279; yy546: - ++YYCURSOR; -#line 140 "../src/conf/parse_opts.re" - { opts.set_gFlag (true); goto opt; } -#line 2215 "src/conf/parse_opts.cc" -yy548: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy555; - goto yy252; + if (yych == 'z') goto yy574; + goto yy279; +yy547: + ++YYCURSOR; +#line 177 "../src/conf/parse_opts.re" + { globopts.dump_adfa = true; goto opt; } +#line 2260 "src/conf/parse_opts.cc" yy549: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy556; - goto yy252; + if (yych == 'e') goto yy575; + goto yy279; yy550: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy558; - goto yy252; + if (yych == 'i') goto yy576; + goto yy279; yy551: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy559; - goto yy252; + if (yych == 'a') goto yy577; + goto yy279; yy552: - ++YYCURSOR; -#line 138 "../src/conf/parse_opts.re" - { opts.set_fFlag (true); goto opt; } -#line 2236 "src/conf/parse_opts.cc" + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'a') goto yy578; + goto yy279; +yy553: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy579; + goto yy279; yy554: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy560; - goto yy252; + if (yych == 's') goto yy581; + goto yy279; yy555: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy562; - goto yy252; + if (yych == 'o') goto yy582; + goto yy279; yy556: - ++YYCURSOR; -#line 156 "../src/conf/parse_opts.re" - { goto opt_encoding_policy; } -#line 2249 "src/conf/parse_opts.cc" + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'x') goto yy583; + goto yy279; +yy557: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy584; + goto yy279; yy558: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy564; - goto yy252; + if (yych == 'n') goto yy586; + goto yy279; yy559: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy565; - goto yy252; + if (yych == 'i') goto yy587; + goto yy279; yy560: - ++YYCURSOR; -#line 146 "../src/conf/parse_opts.re" - { opts.set_bCaseInsensitive (true); goto opt; } -#line 2262 "src/conf/parse_opts.cc" + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'a') goto yy588; + goto yy279; +yy561: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy589; + goto yy279; yy562: - ++YYCURSOR; -#line 159 "../src/conf/parse_opts.re" - { goto opt_dfa_minimization; } -#line 2267 "src/conf/parse_opts.cc" + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy590; + goto yy279; +yy563: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'u') goto yy592; + goto yy279; yy564: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy567; - goto yy252; + if (yych == 's') goto yy593; + goto yy279; yy565: - ++YYCURSOR; -#line 135 "../src/conf/parse_opts.re" - { opts.set_cFlag (true); goto opt; } -#line 2276 "src/conf/parse_opts.cc" + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'i') goto yy594; + goto yy279; +yy566: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 't') goto yy595; + goto yy279; yy567: yych = (YYCTYPE)*++YYCURSOR; - if (yych >= 0x01) goto yy252; + if (yych == 'r') goto yy596; + goto yy279; +yy568: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy597; + goto yy279; +yy569: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy599; + goto yy279; +yy570: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'i') goto yy601; + goto yy279; +yy571: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy602; + goto yy279; +yy572: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 't') goto yy603; + goto yy279; +yy573: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 't') goto yy604; + goto yy279; +yy574: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'a') goto yy605; + goto yy279; +yy575: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 't') goto yy606; + goto yy279; +yy576: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'n') goto yy607; + goto yy279; +yy577: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'w') goto yy608; + goto yy279; +yy578: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'g') goto yy609; + goto yy279; +yy579: + ++YYCURSOR; +#line 158 "../src/conf/parse_opts.re" + { opts.set_eager_skip(true); goto opt; } +#line 2385 "src/conf/parse_opts.cc" +yy581: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy610; + goto yy279; +yy582: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'l') goto yy612; + goto yy279; +yy583: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy613; + goto yy279; +yy584: + ++YYCURSOR; +#line 151 "../src/conf/parse_opts.re" + { opts.set_sFlag (true); goto opt; } +#line 2402 "src/conf/parse_opts.cc" +yy586: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'f') goto yy615; + goto yy279; +yy587: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'o') goto yy616; + goto yy279; +yy588: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'd') goto yy617; + goto yy279; +yy589: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '-') goto yy618; + goto yy279; +yy590: ++YYCURSOR; #line 144 "../src/conf/parse_opts.re" - { opts.set_bNoGenerationDate (true); goto opt; } -#line 2283 "src/conf/parse_opts.cc" -} + { globopts.version = false; goto opt; } +#line 2423 "src/conf/parse_opts.cc" +yy592: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'r') goto yy619; + goto yy279; +yy593: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy620; + goto yy279; +yy594: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 't') goto yy622; + goto yy279; +yy595: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'a') goto yy623; + goto yy279; +yy596: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy624; + goto yy279; +yy597: + ++YYCURSOR; #line 161 "../src/conf/parse_opts.re" + { opts.set_encoding(Enc::UCS2); goto opt; } +#line 2448 "src/conf/parse_opts.cc" +yy599: + ++YYCURSOR; +#line 147 "../src/conf/parse_opts.re" + { opts.set_bFlag (true); goto opt; } +#line 2453 "src/conf/parse_opts.cc" +yy601: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 't') goto yy626; + goto yy279; +yy602: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'd') goto yy627; + goto yy279; +yy603: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'o') goto yy628; + goto yy279; +yy604: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy629; + goto yy279; +yy605: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 't') goto yy631; + goto yy279; +yy606: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy632; + goto yy279; +yy607: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy634; + goto yy279; +yy608: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy636; + goto yy279; +yy609: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'o') goto yy638; + goto yy279; +yy610: + ++YYCURSOR; +#line 168 "../src/conf/parse_opts.re" + { goto opt_empty_class; } +#line 2494 "src/conf/parse_opts.cc" +yy612: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'i') goto yy639; + goto yy279; +yy613: + ++YYCURSOR; +#line 141 "../src/conf/parse_opts.re" + { globopts.FFlag = true; goto opt; } +#line 2503 "src/conf/parse_opts.cc" +yy615: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'o') goto yy640; + goto yy279; +yy616: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'n') goto yy641; + goto yy279; +yy617: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy642; + goto yy279; +yy618: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 't') goto yy644; + goto yy279; +yy619: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy645; + goto yy279; +yy620: + ++YYCURSOR; +#line 170 "../src/conf/parse_opts.re" + { goto opt; } +#line 2528 "src/conf/parse_opts.cc" +yy622: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'i') goto yy646; + goto yy279; +yy623: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 't') goto yy647; + goto yy279; +yy624: + ++YYCURSOR; +#line 165 "../src/conf/parse_opts.re" + { if (!next (YYCURSOR, argv)) { error_arg ("-t, --type-header"); return EXIT_FAIL; } goto opt_header; } +#line 2541 "src/conf/parse_opts.cc" +yy626: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'i') goto yy648; + goto yy279; +yy627: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy649; + goto yy279; +yy628: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 's') goto yy651; + goto yy279; +yy629: + ++YYCURSOR; +#line 148 "../src/conf/parse_opts.re" + { opts.set_dFlag (true); goto opt; } +#line 2558 "src/conf/parse_opts.cc" +yy631: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'i') goto yy652; + goto yy279; +yy632: + ++YYCURSOR; +#line 174 "../src/conf/parse_opts.re" + { globopts.dump_dfa_det = true; goto opt; } +#line 2567 "src/conf/parse_opts.cc" +yy634: + ++YYCURSOR; +#line 176 "../src/conf/parse_opts.re" + { globopts.dump_dfa_min = true; goto opt; } +#line 2572 "src/conf/parse_opts.cc" +yy636: + ++YYCURSOR; +#line 173 "../src/conf/parse_opts.re" + { globopts.dump_dfa_raw = true; goto opt; } +#line 2577 "src/conf/parse_opts.cc" +yy638: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'p') goto yy653; + goto yy279; +yy639: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'c') goto yy654; + goto yy279; +yy640: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy655; + goto yy279; +yy641: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == '-') goto yy657; + goto yy279; +yy642: + ++YYCURSOR; +#line 156 "../src/conf/parse_opts.re" + { opts.set_lookahead(false); goto opt; } +#line 2598 "src/conf/parse_opts.cc" +yy644: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'a') goto yy658; + goto yy279; +yy645: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 's') goto yy659; + goto yy279; +yy646: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'o') goto yy660; + goto yy279; +yy647: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy661; + goto yy279; +yy648: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'v') goto yy662; + goto yy279; +yy649: + ++YYCURSOR; +#line 153 "../src/conf/parse_opts.re" + { opts.set_bCaseInverted (true); goto opt; } +#line 2623 "src/conf/parse_opts.cc" +yy651: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy663; + goto yy279; +yy652: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'o') goto yy665; + goto yy279; +yy653: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 't') goto yy666; + goto yy279; +yy654: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'y') goto yy667; + goto yy279; +yy655: + ++YYCURSOR; +#line 150 "../src/conf/parse_opts.re" + { opts.set_iFlag (true); goto opt; } +#line 2644 "src/conf/parse_opts.cc" +yy657: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'd') goto yy668; + goto yy279; +yy658: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'g') goto yy669; + goto yy279; +yy659: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy670; + goto yy279; +yy660: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'n') goto yy672; + goto yy279; +yy661: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy673; + goto yy279; +yy662: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy675; + goto yy279; +yy663: + ++YYCURSOR; +#line 149 "../src/conf/parse_opts.re" + { opts.set_gFlag (true); goto opt; } +#line 2673 "src/conf/parse_opts.cc" +yy665: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'n') goto yy676; + goto yy279; +yy666: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy677; + goto yy279; +yy667: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy679; + goto yy279; +yy668: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'a') goto yy681; + goto yy279; +yy669: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 's') goto yy682; + goto yy279; +yy670: + ++YYCURSOR; +#line 155 "../src/conf/parse_opts.re" + { opts.set_posix_captures(true); goto opt; } +#line 2698 "src/conf/parse_opts.cc" +yy672: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 's') goto yy683; + goto yy279; +yy673: + ++YYCURSOR; +#line 140 "../src/conf/parse_opts.re" + { globopts.fFlag = true; goto opt; } +#line 2707 "src/conf/parse_opts.cc" +yy675: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy684; + goto yy279; +yy676: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy686; + goto yy279; +yy677: + ++YYCURSOR; +#line 175 "../src/conf/parse_opts.re" + { globopts.dump_dfa_tagopt = true; goto opt; } +#line 2720 "src/conf/parse_opts.cc" +yy679: + ++YYCURSOR; +#line 166 "../src/conf/parse_opts.re" + { goto opt_encoding_policy; } +#line 2725 "src/conf/parse_opts.cc" +yy681: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 't') goto yy688; + goto yy279; +yy682: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy689; + goto yy279; +yy683: + yych = (YYCTYPE)*++YYCURSOR; + if (yych <= 0x00) goto yy691; + goto yy279; +yy684: + ++YYCURSOR; +#line 152 "../src/conf/parse_opts.re" + { opts.set_bCaseInsensitive (true); goto opt; } +#line 2742 "src/conf/parse_opts.cc" +yy686: + ++YYCURSOR; +#line 169 "../src/conf/parse_opts.re" + { goto opt_dfa_minimization; } +#line 2747 "src/conf/parse_opts.cc" +yy688: + yych = (YYCTYPE)*++YYCURSOR; + if (yych == 'e') goto yy693; + goto yy279; +yy689: + ++YYCURSOR; +#line 157 "../src/conf/parse_opts.re" + { opts.set_optimize_tags(false); goto opt; } +#line 2756 "src/conf/parse_opts.cc" +yy691: + ++YYCURSOR; +#line 138 "../src/conf/parse_opts.re" + { globopts.cFlag = true; goto opt; } +#line 2761 "src/conf/parse_opts.cc" +yy693: + yych = (YYCTYPE)*++YYCURSOR; + if (yych >= 0x01) goto yy279; + ++YYCURSOR; +#line 143 "../src/conf/parse_opts.re" + { globopts.bNoGenerationDate = true; goto opt; } +#line 2768 "src/conf/parse_opts.cc" +} +#line 178 "../src/conf/parse_opts.re" opt_output: -#line 2290 "src/conf/parse_opts.cc" +#line 2775 "src/conf/parse_opts.cc" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -2324,39 +2809,32 @@ opt_output: 128, 128, 128, 128, 128, 128, 128, 128, }; yych = (YYCTYPE)*YYCURSOR; - if (yych <= 0x00) goto yy572; - if (yych != '-') goto yy574; -yy572: + if (yych <= 0x00) goto yy698; + if (yych != '-') goto yy700; +yy698: ++YYCURSOR; -#line 166 "../src/conf/parse_opts.re" +#line 183 "../src/conf/parse_opts.re" { error ("bad argument to option -o, --output: %s", *argv); return EXIT_FAIL; } -#line 2337 "src/conf/parse_opts.cc" -yy574: +#line 2822 "src/conf/parse_opts.cc" +yy700: yych = (YYCTYPE)*++YYCURSOR; - goto yy578; -yy575: - ++YYCURSOR; -#line 170 "../src/conf/parse_opts.re" - { if (!opts.output (*argv)) return EXIT_FAIL; goto opt; } -#line 2345 "src/conf/parse_opts.cc" -yy577: - ++YYCURSOR; - yych = (YYCTYPE)*YYCURSOR; -yy578: if (yybm[0+yych] & 128) { - goto yy577; + goto yy700; } - goto yy575; + ++YYCURSOR; +#line 187 "../src/conf/parse_opts.re" + { globopts.output_file = *argv; goto opt; } +#line 2831 "src/conf/parse_opts.cc" } -#line 171 "../src/conf/parse_opts.re" +#line 188 "../src/conf/parse_opts.re" opt_header: -#line 2360 "src/conf/parse_opts.cc" +#line 2838 "src/conf/parse_opts.cc" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -2394,34 +2872,27 @@ opt_header: 128, 128, 128, 128, 128, 128, 128, 128, }; yych = (YYCTYPE)*YYCURSOR; - if (yych <= 0x00) goto yy581; - if (yych != '-') goto yy583; -yy581: + if (yych <= 0x00) goto yy706; + if (yych != '-') goto yy708; +yy706: ++YYCURSOR; -#line 176 "../src/conf/parse_opts.re" +#line 193 "../src/conf/parse_opts.re" { error ("bad argument to option -t, --type-header: %s", *argv); return EXIT_FAIL; } -#line 2407 "src/conf/parse_opts.cc" -yy583: +#line 2885 "src/conf/parse_opts.cc" +yy708: yych = (YYCTYPE)*++YYCURSOR; - goto yy587; -yy584: - ++YYCURSOR; -#line 180 "../src/conf/parse_opts.re" - { opts.set_header_file (*argv); goto opt; } -#line 2415 "src/conf/parse_opts.cc" -yy586: - ++YYCURSOR; - yych = (YYCTYPE)*YYCURSOR; -yy587: if (yybm[0+yych] & 128) { - goto yy586; + goto yy708; } - goto yy584; + ++YYCURSOR; +#line 197 "../src/conf/parse_opts.re" + { globopts.header_file = *argv; goto opt; } +#line 2894 "src/conf/parse_opts.cc" } -#line 181 "../src/conf/parse_opts.re" +#line 198 "../src/conf/parse_opts.re" opt_encoding_policy: @@ -2431,115 +2902,115 @@ opt_encoding_policy: return EXIT_FAIL; } -#line 2435 "src/conf/parse_opts.cc" +#line 2906 "src/conf/parse_opts.cc" { YYCTYPE yych; yych = (YYCTYPE)*YYCURSOR; if (yych <= 'h') { - if (yych == 'f') goto yy592; + if (yych == 'f') goto yy716; } else { - if (yych <= 'i') goto yy593; - if (yych == 's') goto yy594; + if (yych <= 'i') goto yy717; + if (yych == 's') goto yy718; } ++YYCURSOR; -yy591: -#line 191 "../src/conf/parse_opts.re" +yy715: +#line 208 "../src/conf/parse_opts.re" { error ("bad argument to option --encoding-policy (expected: ignore | substitute | fail): %s", *argv); return EXIT_FAIL; } -#line 2452 "src/conf/parse_opts.cc" -yy592: +#line 2923 "src/conf/parse_opts.cc" +yy716: yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'a') goto yy595; - goto yy591; -yy593: + if (yych == 'a') goto yy719; + goto yy715; +yy717: yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'g') goto yy597; - goto yy591; -yy594: + if (yych == 'g') goto yy721; + goto yy715; +yy718: yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'u') goto yy598; - goto yy591; -yy595: + if (yych == 'u') goto yy722; + goto yy715; +yy719: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy599; -yy596: + if (yych == 'i') goto yy723; +yy720: YYCURSOR = YYMARKER; - goto yy591; -yy597: + goto yy715; +yy721: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy600; - goto yy596; -yy598: + if (yych == 'n') goto yy724; + goto yy720; +yy722: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'b') goto yy601; - goto yy596; -yy599: + if (yych == 'b') goto yy725; + goto yy720; +yy723: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'l') goto yy602; - goto yy596; -yy600: + if (yych == 'l') goto yy726; + goto yy720; +yy724: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy603; - goto yy596; -yy601: + if (yych == 'o') goto yy727; + goto yy720; +yy725: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy604; - goto yy596; -yy602: + if (yych == 's') goto yy728; + goto yy720; +yy726: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy605; - goto yy596; -yy603: + if (yych <= 0x00) goto yy729; + goto yy720; +yy727: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy607; - goto yy596; -yy604: + if (yych == 'r') goto yy731; + goto yy720; +yy728: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy608; - goto yy596; -yy605: + if (yych == 't') goto yy732; + goto yy720; +yy729: ++YYCURSOR; -#line 197 "../src/conf/parse_opts.re" +#line 214 "../src/conf/parse_opts.re" { opts.set_encoding_policy (Enc::POLICY_FAIL); goto opt; } -#line 2507 "src/conf/parse_opts.cc" -yy607: +#line 2978 "src/conf/parse_opts.cc" +yy731: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy609; - goto yy596; -yy608: + if (yych == 'e') goto yy733; + goto yy720; +yy732: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy610; - goto yy596; -yy609: + if (yych == 'i') goto yy734; + goto yy720; +yy733: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy611; - goto yy596; -yy610: + if (yych <= 0x00) goto yy735; + goto yy720; +yy734: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy613; - goto yy596; -yy611: + if (yych == 't') goto yy737; + goto yy720; +yy735: ++YYCURSOR; -#line 195 "../src/conf/parse_opts.re" +#line 212 "../src/conf/parse_opts.re" { opts.set_encoding_policy (Enc::POLICY_IGNORE); goto opt; } -#line 2528 "src/conf/parse_opts.cc" -yy613: +#line 2999 "src/conf/parse_opts.cc" +yy737: yych = (YYCTYPE)*++YYCURSOR; - if (yych != 'u') goto yy596; + if (yych != 'u') goto yy720; yych = (YYCTYPE)*++YYCURSOR; - if (yych != 't') goto yy596; + if (yych != 't') goto yy720; yych = (YYCTYPE)*++YYCURSOR; - if (yych != 'e') goto yy596; + if (yych != 'e') goto yy720; yych = (YYCTYPE)*++YYCURSOR; - if (yych >= 0x01) goto yy596; + if (yych >= 0x01) goto yy720; ++YYCURSOR; -#line 196 "../src/conf/parse_opts.re" +#line 213 "../src/conf/parse_opts.re" { opts.set_encoding_policy (Enc::POLICY_SUBSTITUTE); goto opt; } -#line 2541 "src/conf/parse_opts.cc" +#line 3012 "src/conf/parse_opts.cc" } -#line 198 "../src/conf/parse_opts.re" +#line 215 "../src/conf/parse_opts.re" opt_input: @@ -2549,86 +3020,86 @@ opt_input: return EXIT_FAIL; } -#line 2553 "src/conf/parse_opts.cc" +#line 3024 "src/conf/parse_opts.cc" { YYCTYPE yych; yych = (YYCTYPE)*YYCURSOR; - if (yych <= 'b') goto yy621; - if (yych <= 'c') goto yy623; - if (yych <= 'd') goto yy624; -yy621: + if (yych <= 'b') goto yy745; + if (yych <= 'c') goto yy747; + if (yych <= 'd') goto yy748; +yy745: ++YYCURSOR; -yy622: -#line 208 "../src/conf/parse_opts.re" +yy746: +#line 225 "../src/conf/parse_opts.re" { error ("bad argument to option --input (expected: default | custom): %s", *argv); return EXIT_FAIL; } -#line 2568 "src/conf/parse_opts.cc" -yy623: +#line 3039 "src/conf/parse_opts.cc" +yy747: yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'u') goto yy625; - goto yy622; -yy624: + if (yych == 'u') goto yy749; + goto yy746; +yy748: yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'e') goto yy627; - goto yy622; -yy625: + if (yych == 'e') goto yy751; + goto yy746; +yy749: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy628; -yy626: + if (yych == 's') goto yy752; +yy750: YYCURSOR = YYMARKER; - goto yy622; -yy627: + goto yy746; +yy751: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'f') goto yy629; - goto yy626; -yy628: + if (yych == 'f') goto yy753; + goto yy750; +yy752: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy630; - goto yy626; -yy629: + if (yych == 't') goto yy754; + goto yy750; +yy753: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy631; - goto yy626; -yy630: + if (yych == 'a') goto yy755; + goto yy750; +yy754: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy632; - goto yy626; -yy631: + if (yych == 'o') goto yy756; + goto yy750; +yy755: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'u') goto yy633; - goto yy626; -yy632: + if (yych == 'u') goto yy757; + goto yy750; +yy756: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'm') goto yy634; - goto yy626; -yy633: + if (yych == 'm') goto yy758; + goto yy750; +yy757: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'l') goto yy635; - goto yy626; -yy634: + if (yych == 'l') goto yy759; + goto yy750; +yy758: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy636; - goto yy626; -yy635: + if (yych <= 0x00) goto yy760; + goto yy750; +yy759: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy638; - goto yy626; -yy636: + if (yych == 't') goto yy762; + goto yy750; +yy760: ++YYCURSOR; -#line 213 "../src/conf/parse_opts.re" - { opts.set_input_api (InputAPI::CUSTOM); goto opt; } -#line 2623 "src/conf/parse_opts.cc" -yy638: +#line 230 "../src/conf/parse_opts.re" + { opts.set_input_api(INPUT_CUSTOM); goto opt; } +#line 3094 "src/conf/parse_opts.cc" +yy762: yych = (YYCTYPE)*++YYCURSOR; - if (yych >= 0x01) goto yy626; + if (yych >= 0x01) goto yy750; ++YYCURSOR; -#line 212 "../src/conf/parse_opts.re" - { opts.set_input_api (InputAPI::DEFAULT); goto opt; } -#line 2630 "src/conf/parse_opts.cc" +#line 229 "../src/conf/parse_opts.re" + { opts.set_input_api(INPUT_DEFAULT); goto opt; } +#line 3101 "src/conf/parse_opts.cc" } -#line 214 "../src/conf/parse_opts.re" +#line 231 "../src/conf/parse_opts.re" opt_empty_class: @@ -2638,120 +3109,120 @@ opt_empty_class: return EXIT_FAIL; } -#line 2642 "src/conf/parse_opts.cc" +#line 3113 "src/conf/parse_opts.cc" { YYCTYPE yych; yych = (YYCTYPE)*YYCURSOR; - if (yych == 'e') goto yy645; - if (yych == 'm') goto yy646; + if (yych == 'e') goto yy769; + if (yych == 'm') goto yy770; ++YYCURSOR; -yy644: -#line 224 "../src/conf/parse_opts.re" +yy768: +#line 241 "../src/conf/parse_opts.re" { error ("bad argument to option --empty-class (expected: match-empty | match-none | error): %s", *argv); return EXIT_FAIL; } -#line 2655 "src/conf/parse_opts.cc" -yy645: +#line 3126 "src/conf/parse_opts.cc" +yy769: yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'r') goto yy647; - goto yy644; -yy646: + if (yych == 'r') goto yy771; + goto yy768; +yy770: yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'a') goto yy649; - goto yy644; -yy647: + if (yych == 'a') goto yy773; + goto yy768; +yy771: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy650; -yy648: + if (yych == 'r') goto yy774; +yy772: YYCURSOR = YYMARKER; - goto yy644; -yy649: + goto yy768; +yy773: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy651; - goto yy648; -yy650: + if (yych == 't') goto yy775; + goto yy772; +yy774: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy652; - goto yy648; -yy651: + if (yych == 'o') goto yy776; + goto yy772; +yy775: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'c') goto yy653; - goto yy648; -yy652: + if (yych == 'c') goto yy777; + goto yy772; +yy776: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy654; - goto yy648; -yy653: + if (yych == 'r') goto yy778; + goto yy772; +yy777: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'h') goto yy655; - goto yy648; -yy654: + if (yych == 'h') goto yy779; + goto yy772; +yy778: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy656; - goto yy648; -yy655: + if (yych <= 0x00) goto yy780; + goto yy772; +yy779: yych = (YYCTYPE)*++YYCURSOR; - if (yych == '-') goto yy658; - goto yy648; -yy656: + if (yych == '-') goto yy782; + goto yy772; +yy780: ++YYCURSOR; -#line 230 "../src/conf/parse_opts.re" +#line 247 "../src/conf/parse_opts.re" { opts.set_empty_class_policy (EMPTY_CLASS_ERROR); goto opt; } -#line 2702 "src/conf/parse_opts.cc" -yy658: +#line 3173 "src/conf/parse_opts.cc" +yy782: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy659; - if (yych == 'n') goto yy660; - goto yy648; -yy659: + if (yych == 'e') goto yy783; + if (yych == 'n') goto yy784; + goto yy772; +yy783: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'm') goto yy661; - goto yy648; -yy660: + if (yych == 'm') goto yy785; + goto yy772; +yy784: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy662; - goto yy648; -yy661: + if (yych == 'o') goto yy786; + goto yy772; +yy785: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'p') goto yy663; - goto yy648; -yy662: + if (yych == 'p') goto yy787; + goto yy772; +yy786: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy664; - goto yy648; -yy663: + if (yych == 'n') goto yy788; + goto yy772; +yy787: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy665; - goto yy648; -yy664: + if (yych == 't') goto yy789; + goto yy772; +yy788: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy666; - goto yy648; -yy665: + if (yych == 'e') goto yy790; + goto yy772; +yy789: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'y') goto yy667; - goto yy648; -yy666: + if (yych == 'y') goto yy791; + goto yy772; +yy790: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy668; - goto yy648; -yy667: + if (yych <= 0x00) goto yy792; + goto yy772; +yy791: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy670; - goto yy648; -yy668: + if (yych <= 0x00) goto yy794; + goto yy772; +yy792: ++YYCURSOR; -#line 229 "../src/conf/parse_opts.re" +#line 246 "../src/conf/parse_opts.re" { opts.set_empty_class_policy (EMPTY_CLASS_MATCH_NONE); goto opt; } -#line 2748 "src/conf/parse_opts.cc" -yy670: +#line 3219 "src/conf/parse_opts.cc" +yy794: ++YYCURSOR; -#line 228 "../src/conf/parse_opts.re" +#line 245 "../src/conf/parse_opts.re" { opts.set_empty_class_policy (EMPTY_CLASS_MATCH_EMPTY); goto opt; } -#line 2753 "src/conf/parse_opts.cc" +#line 3224 "src/conf/parse_opts.cc" } -#line 231 "../src/conf/parse_opts.re" +#line 248 "../src/conf/parse_opts.re" opt_dfa_minimization: @@ -2761,74 +3232,74 @@ opt_dfa_minimization: return EXIT_FAIL; } -#line 2765 "src/conf/parse_opts.cc" +#line 3236 "src/conf/parse_opts.cc" { YYCTYPE yych; yych = (YYCTYPE)*YYCURSOR; - if (yych == 'm') goto yy676; - if (yych == 't') goto yy677; + if (yych == 'm') goto yy800; + if (yych == 't') goto yy801; ++YYCURSOR; -yy675: -#line 241 "../src/conf/parse_opts.re" +yy799: +#line 258 "../src/conf/parse_opts.re" { error ("bad argument to option --dfa-minimization (expected: table | moore): %s", *argv); return EXIT_FAIL; } -#line 2778 "src/conf/parse_opts.cc" -yy676: +#line 3249 "src/conf/parse_opts.cc" +yy800: yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'o') goto yy678; - goto yy675; -yy677: + if (yych == 'o') goto yy802; + goto yy799; +yy801: yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == 'a') goto yy680; - goto yy675; -yy678: + if (yych == 'a') goto yy804; + goto yy799; +yy802: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy681; -yy679: + if (yych == 'o') goto yy805; +yy803: YYCURSOR = YYMARKER; - goto yy675; -yy680: + goto yy799; +yy804: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'b') goto yy682; - goto yy679; -yy681: + if (yych == 'b') goto yy806; + goto yy803; +yy805: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy683; - goto yy679; -yy682: + if (yych == 'r') goto yy807; + goto yy803; +yy806: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'l') goto yy684; - goto yy679; -yy683: + if (yych == 'l') goto yy808; + goto yy803; +yy807: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy685; - goto yy679; -yy684: + if (yych == 'e') goto yy809; + goto yy803; +yy808: yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy686; - goto yy679; -yy685: + if (yych == 'e') goto yy810; + goto yy803; +yy809: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy687; - goto yy679; -yy686: + if (yych <= 0x00) goto yy811; + goto yy803; +yy810: yych = (YYCTYPE)*++YYCURSOR; - if (yych <= 0x00) goto yy689; - goto yy679; -yy687: + if (yych <= 0x00) goto yy813; + goto yy803; +yy811: ++YYCURSOR; -#line 246 "../src/conf/parse_opts.re" +#line 263 "../src/conf/parse_opts.re" { opts.set_dfa_minimization (DFA_MINIMIZATION_MOORE); goto opt; } -#line 2825 "src/conf/parse_opts.cc" -yy689: +#line 3296 "src/conf/parse_opts.cc" +yy813: ++YYCURSOR; -#line 245 "../src/conf/parse_opts.re" +#line 262 "../src/conf/parse_opts.re" { opts.set_dfa_minimization (DFA_MINIMIZATION_TABLE); goto opt; } -#line 2830 "src/conf/parse_opts.cc" +#line 3301 "src/conf/parse_opts.cc" } -#line 247 "../src/conf/parse_opts.re" +#line 264 "../src/conf/parse_opts.re" end: @@ -2837,6 +3308,7 @@ end: error ("no source file"); return EXIT_FAIL; } + globopts.fix(); return OK; diff --git a/bootstrap/src/parse/lex.cc b/bootstrap/src/parse/lex.cc deleted file mode 100644 index 9c7e014..0000000 --- a/bootstrap/src/parse/lex.cc +++ /dev/null @@ -1,2861 +0,0 @@ -/* Generated by re2c 0.16 on Thu Jan 21 10:47:47 2016 */ -#line 1 "../src/parse/lex.re" -#include "src/util/c99_stdint.h" -#include -#include -#include -#include -#include - -#include "src/codegen/output.h" -#include "src/conf/opt.h" -#include "src/conf/warn.h" -#include "src/globals.h" -#include "src/ir/regexp/encoding/enc.h" -#include "src/ir/regexp/regexp.h" -#include "src/ir/regexp/regexp_null.h" -#include "src/parse/code.h" -#include "src/parse/extop.h" -#include "src/parse/input.h" -#include "src/parse/scanner.h" -#include "src/parse/parser.h" // needed by "y.tab.h" -#include "src/parse/unescape.h" -#include "src/util/range.h" -#include "src/util/s_to_n32_unsafe.h" -#include "y.tab.h" - -extern YYSTYPE yylval; - -#define YYCTYPE unsigned char -#define YYCURSOR cur -#define YYLIMIT lim -#define YYMARKER ptr -#define YYCTXMARKER ctx -#define YYFILL(n) { fill (n); } - -namespace re2c -{ - -// source code is in ASCII: pointers have type 'char *' -// but re2c makes an implicit assumption that YYCTYPE is unsigned -// when it generates comparisons -#line 42 "../src/parse/lex.re" - - -#line 62 "../src/parse/lex.re" - - -Scanner::ParseMode Scanner::echo() -{ - bool ignore_eoc = false; - int ignore_cnt = 0; - - if (eof && cur == eof) // Catch EOF - { - return Stop; - } - - tok = cur; -echo: - -#line 62 "src/parse/lex.cc" -{ - YYCTYPE yych; - unsigned int yyaccept = 0; - static const unsigned char yybm[] = { - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 160, 0, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 160, 128, 0, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 192, 192, 192, 192, 192, 192, 192, 192, - 192, 192, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 0, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - }; - if ((YYLIMIT - YYCURSOR) < 16) YYFILL(16); - yych = (YYCTYPE)*YYCURSOR; - if (yych <= '%') { - if (yych <= '\t') { - if (yych >= 0x01) goto yy4; - } else { - if (yych <= '\n') goto yy6; - if (yych <= '$') goto yy4; - goto yy8; - } - } else { - if (yych <= '*') { - if (yych <= ')') goto yy4; - goto yy9; - } else { - if (yych == '/') goto yy10; - goto yy4; - } - } - ++YYCURSOR; -#line 202 "../src/parse/lex.re" - { - if (!ignore_eoc && opts->target == opt_t::CODE) - { - out.wraw(tok, tok_len () - 1); - // -1 so we don't write out the \0 - } - if(cur == eof) - { - return Stop; - } - } -#line 132 "src/parse/lex.cc" -yy4: - ++YYCURSOR; -yy5: -#line 213 "../src/parse/lex.re" - { - goto echo; - } -#line 140 "src/parse/lex.cc" -yy6: - yyaccept = 0; - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 32) { - goto yy11; - } - if (yych == '#') goto yy14; -yy7: -#line 189 "../src/parse/lex.re" - { - if (ignore_eoc) - { - ignore_cnt++; - } - else if (opts->target == opt_t::CODE) - { - out.wraw(tok, tok_len ()); - } - tok = pos = cur; - cline++; - goto echo; - } -#line 163 "src/parse/lex.cc" -yy8: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '{') goto yy16; - goto yy5; -yy9: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '/') goto yy18; - goto yy5; -yy10: - yyaccept = 1; - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == '*') goto yy20; - goto yy5; -yy11: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - if (yybm[0+yych] & 32) { - goto yy11; - } - if (yych == '#') goto yy14; -yy13: - YYCURSOR = YYMARKER; - if (yyaccept <= 1) { - if (yyaccept == 0) { - goto yy7; - } else { - goto yy5; - } - } else { - goto yy19; - } -yy14: - ++YYCURSOR; - if ((YYLIMIT - YYCURSOR) < 5) YYFILL(5); - yych = (YYCTYPE)*YYCURSOR; - if (yych <= 0x1F) { - if (yych == '\t') goto yy14; - goto yy13; - } else { - if (yych <= ' ') goto yy14; - if (yych == 'l') goto yy21; - goto yy13; - } -yy16: - ++YYCURSOR; -#line 78 "../src/parse/lex.re" - { - if (opts->rFlag) - { - fatal("found standard 're2c' block while using -r flag"); - } - if (opts->target == opt_t::CODE) - { - const size_t lexeme_len = cur[-1] == '{' - ? sizeof ("%{") - 1 - : sizeof ("/*!re2c") - 1; - out.wraw(tok, tok_len () - lexeme_len); - } - tok = cur; - return Parse; - } -#line 226 "src/parse/lex.cc" -yy18: - yyaccept = 2; - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == '\n') goto yy22; - if (yych == '\r') goto yy24; -yy19: -#line 168 "../src/parse/lex.re" - { - if (ignore_eoc) - { - if (ignore_cnt) - { - out.ws("\n").wline_info (cline, get_fname ().c_str ()); - } - ignore_eoc = false; - ignore_cnt = 0; - } - else if (opts->target == opt_t::CODE) - { - out.wraw(tok, tok_len ()); - } - tok = pos = cur; - goto echo; - } -#line 251 "src/parse/lex.cc" -yy20: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '!') goto yy25; - goto yy13; -yy21: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy26; - goto yy13; -yy22: - ++YYCURSOR; -#line 150 "../src/parse/lex.re" - { - cline++; - if (ignore_eoc) - { - if (ignore_cnt) - { - out.wline_info (cline, get_fname ().c_str ()); - } - ignore_eoc = false; - ignore_cnt = 0; - } - else if (opts->target == opt_t::CODE) - { - out.wraw(tok, tok_len ()); - } - tok = pos = cur; - goto echo; - } -#line 281 "src/parse/lex.cc" -yy24: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '\n') goto yy22; - goto yy13; -yy25: - yych = (YYCTYPE)*++YYCURSOR; - switch (yych) { - case 'g': goto yy27; - case 'i': goto yy28; - case 'm': goto yy29; - case 'r': goto yy30; - case 't': goto yy31; - case 'u': goto yy32; - default: goto yy13; - } -yy26: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy33; - goto yy13; -yy27: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy34; - goto yy13; -yy28: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'g') goto yy35; - goto yy13; -yy29: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy36; - goto yy13; -yy30: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy37; - if (yych == 'u') goto yy38; - goto yy13; -yy31: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'y') goto yy39; - goto yy13; -yy32: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy40; - goto yy13; -yy33: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy41; - goto yy13; -yy34: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy42; - goto yy13; -yy35: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy43; - goto yy13; -yy36: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'x') goto yy44; - goto yy13; -yy37: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '2') goto yy45; - goto yy13; -yy38: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'l') goto yy46; - goto yy13; -yy39: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'p') goto yy47; - goto yy13; -yy40: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy48; - goto yy13; -yy41: - yych = (YYCTYPE)*++YYCURSOR; - if (yych <= '0') goto yy50; - if (yych <= '9') goto yy13; - goto yy50; -yy42: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy51; - goto yy13; -yy43: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'o') goto yy52; - goto yy13; -yy44: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == ':') goto yy53; - goto yy13; -yy45: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'c') goto yy16; - goto yy13; -yy46: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy54; - goto yy13; -yy47: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy55; - goto yy13; -yy48: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == ':') goto yy56; - goto yy13; -yy49: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - YYCTXMARKER = YYCURSOR; -yy50: - if (yych <= 0x1F) { - if (yych == '\t') goto yy49; - goto yy13; - } else { - if (yych <= ' ') goto yy49; - if (yych <= '0') goto yy13; - if (yych <= '9') goto yy57; - goto yy13; - } -yy51: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy59; - goto yy13; -yy52: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy60; - goto yy13; -yy53: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy61; - goto yy13; -yy54: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy62; - goto yy13; -yy55: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 's') goto yy63; - goto yy13; -yy56: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy64; - goto yy13; -yy57: - ++YYCURSOR; - if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = (YYCTYPE)*YYCURSOR; - if (yybm[0+yych] & 64) { - goto yy57; - } - if (yych <= '\f') { - if (yych <= 0x08) goto yy13; - if (yych <= '\t') goto yy65; - if (yych <= '\n') goto yy67; - goto yy13; - } else { - if (yych <= '\r') goto yy69; - if (yych == ' ') goto yy65; - goto yy13; - } -yy59: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'a') goto yy70; - goto yy13; -yy60: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy71; - goto yy13; -yy61: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy72; - goto yy13; -yy62: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == ':') goto yy73; - goto yy13; -yy63: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == ':') goto yy74; - goto yy13; -yy64: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy75; - goto yy13; -yy65: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - if (yych <= 0x1F) { - if (yych == '\t') goto yy65; - goto yy13; - } else { - if (yych <= ' ') goto yy65; - if (yych == '"') goto yy76; - goto yy13; - } -yy67: - ++YYCURSOR; - YYCURSOR = YYCTXMARKER; -#line 185 "../src/parse/lex.re" - { - set_sourceline (); - goto echo; - } -#line 491 "src/parse/lex.cc" -yy69: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '\n') goto yy67; - goto yy13; -yy70: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 't') goto yy78; - goto yy13; -yy71: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == ':') goto yy79; - goto yy13; -yy72: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '2') goto yy80; - goto yy13; -yy73: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy81; - goto yy13; -yy74: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy82; - goto yy13; -yy75: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '2') goto yy83; - goto yy13; -yy76: - ++YYCURSOR; - if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); - yych = (YYCTYPE)*YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy76; - } - if (yych <= '\n') goto yy13; - if (yych <= '"') goto yy84; - goto yy85; -yy78: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy86; - goto yy13; -yy79: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy87; - goto yy13; -yy80: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'c') goto yy88; - goto yy13; -yy81: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy90; - goto yy13; -yy82: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy91; - goto yy13; -yy83: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'c') goto yy92; - goto yy13; -yy84: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '\n') goto yy67; - if (yych == '\r') goto yy69; - goto yy13; -yy85: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - if (yych == '\n') goto yy13; - goto yy76; -yy86: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == ':') goto yy94; - goto yy13; -yy87: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy95; - goto yy13; -yy88: - ++YYCURSOR; -#line 119 "../src/parse/lex.re" - { - if (opts->target != opt_t::DOT) - { - out.wdelay_yymaxfill (); - } - tok = pos = cur; - ignore_eoc = true; - goto echo; - } -#line 585 "src/parse/lex.cc" -yy90: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '2') goto yy96; - goto yy13; -yy91: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '2') goto yy97; - goto yy13; -yy92: - ++YYCURSOR; -#line 105 "../src/parse/lex.re" - { - if (!opts->rFlag) - { - fatal("found 'use:re2c' block without -r flag"); - } - reuse(); - if (opts->target == opt_t::CODE) - { - const size_t lexeme_len = sizeof ("/*!use:re2c") - 1; - out.wraw(tok, tok_len () - lexeme_len); - } - tok = cur; - return Reuse; - } -#line 611 "src/parse/lex.cc" -yy94: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'r') goto yy98; - goto yy13; -yy95: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '2') goto yy99; - goto yy13; -yy96: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'c') goto yy100; - goto yy13; -yy97: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'c') goto yy102; - goto yy13; -yy98: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy104; - goto yy13; -yy99: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'c') goto yy105; - goto yy13; -yy100: - ++YYCURSOR; -#line 93 "../src/parse/lex.re" - { - if (opts->rFlag) - { - opts.reset_mapCodeName (); - } - else - { - fatal("found 'rules:re2c' block without -r flag"); - } - tok = cur; - return Rules; - } -#line 651 "src/parse/lex.cc" -yy102: - ++YYCURSOR; -#line 139 "../src/parse/lex.re" - { - tok = pos = cur; - ignore_eoc = true; - if (opts->target != opt_t::DOT) - { - out.wdelay_line_info ().ws("\n") - .wdelay_types ().ws("\n") - .wline_info (cline, get_fname ().c_str ()); - } - goto echo; - } -#line 666 "src/parse/lex.cc" -yy104: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '2') goto yy107; - goto yy13; -yy105: - ++YYCURSOR; -#line 134 "../src/parse/lex.re" - { - tok = pos = cur; - ignore_eoc = true; - goto echo; - } -#line 679 "src/parse/lex.cc" -yy107: - yych = (YYCTYPE)*++YYCURSOR; - if (yych != 'c') goto yy13; - ++YYCURSOR; -#line 128 "../src/parse/lex.re" - { - tok = pos = cur; - out.wdelay_state_goto (opts->topIndent); - ignore_eoc = true; - goto echo; - } -#line 691 "src/parse/lex.cc" -} -#line 216 "../src/parse/lex.re" - -} - -int Scanner::scan() -{ - uint32_t depth; - -scan: - tchar = cur - pos; - tline = cline; - tok = cur; - switch (lexer_state) - { - case LEX_NORMAL: goto start; - case LEX_FLEX_NAME: goto flex_name; - } - -start: - -#line 713 "src/parse/lex.cc" -{ - YYCTYPE yych; - unsigned int yyaccept = 0; - static const unsigned char yybm[] = { - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 144, 0, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 144, 128, 0, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 128, 128, 128, 128, 128, 128, - 128, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 128, 0, 128, 128, 160, - 128, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 160, 160, 160, 160, 160, - 160, 160, 160, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - }; - if ((YYLIMIT - YYCURSOR) < 6) YYFILL(6); - yych = (YYCTYPE)*YYCURSOR; - if (yybm[0+yych] & 16) { - goto yy114; - } - if (yych <= '9') { - if (yych <= '&') { - if (yych <= '\r') { - if (yych <= 0x08) goto yy112; - if (yych <= '\n') goto yy117; - if (yych >= '\r') goto yy119; - } else { - if (yych <= '"') { - if (yych >= '"') goto yy120; - } else { - if (yych == '%') goto yy122; - } - } - } else { - if (yych <= '+') { - if (yych <= '\'') goto yy123; - if (yych <= ')') goto yy125; - if (yych <= '*') goto yy127; - goto yy129; - } else { - if (yych <= '-') { - if (yych <= ',') goto yy125; - } else { - if (yych <= '.') goto yy131; - if (yych <= '/') goto yy133; - goto yy134; - } - } - } - } else { - if (yych <= '\\') { - if (yych <= '>') { - if (yych <= ':') goto yy135; - if (yych == '<') goto yy136; - goto yy125; - } else { - if (yych <= '@') { - if (yych <= '?') goto yy129; - } else { - if (yych <= 'Z') goto yy134; - if (yych <= '[') goto yy137; - goto yy125; - } - } - } else { - if (yych <= 'q') { - if (yych == '_') goto yy134; - if (yych >= 'a') goto yy134; - } else { - if (yych <= 'z') { - if (yych <= 'r') goto yy139; - goto yy134; - } else { - if (yych <= '{') goto yy140; - if (yych <= '|') goto yy125; - } - } - } - } -yy112: - ++YYCURSOR; -yy113: -#line 388 "../src/parse/lex.re" - { - fatalf("unexpected character: '%c'", *tok); - goto scan; - } -#line 823 "src/parse/lex.cc" -yy114: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - if (yybm[0+yych] & 16) { - goto yy114; - } -#line 372 "../src/parse/lex.re" - { - goto scan; - } -#line 835 "src/parse/lex.cc" -yy117: - yyaccept = 0; - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych <= 0x1F) { - if (yych == '\t') goto yy142; - } else { - if (yych <= ' ') goto yy142; - if (yych == '#') goto yy145; - } -yy118: -#line 381 "../src/parse/lex.re" - { - if (cur == eof) return 0; - pos = cur; - cline++; - goto scan; - } -#line 853 "src/parse/lex.cc" -yy119: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '\n') goto yy117; - goto yy113; -yy120: - ++YYCURSOR; -#line 265 "../src/parse/lex.re" - { yylval.regexp = lex_str('"', opts->bCaseInsensitive || opts->bCaseInverted); return TOKEN_REGEXP; } -#line 862 "src/parse/lex.cc" -yy122: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '}') goto yy147; - goto yy113; -yy123: - ++YYCURSOR; -#line 264 "../src/parse/lex.re" - { yylval.regexp = lex_str('\'', opts->bCaseInsensitive || !opts->bCaseInverted); return TOKEN_REGEXP; } -#line 871 "src/parse/lex.cc" -yy125: - ++YYCURSOR; -yy126: -#line 275 "../src/parse/lex.re" - { - return *tok; - } -#line 879 "src/parse/lex.cc" -yy127: - ++YYCURSOR; - if ((yych = (YYCTYPE)*YYCURSOR) == '/') goto yy147; -#line 279 "../src/parse/lex.re" - { - yylval.op = *tok; - return TOKEN_STAR; - } -#line 888 "src/parse/lex.cc" -yy129: - ++YYCURSOR; -#line 283 "../src/parse/lex.re" - { - yylval.op = *tok; - return TOKEN_CLOSE; - } -#line 896 "src/parse/lex.cc" -yy131: - ++YYCURSOR; -#line 367 "../src/parse/lex.re" - { - yylval.regexp = mkDot(); - return TOKEN_REGEXP; - } -#line 904 "src/parse/lex.cc" -yy133: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '*') goto yy149; - if (yych == '/') goto yy151; - goto yy126; -yy134: - yych = (YYCTYPE)*++YYCURSOR; - YYCTXMARKER = YYCURSOR; - goto yy159; -yy135: - yych = (YYCTYPE)*++YYCURSOR; - YYCTXMARKER = YYCURSOR; - if (yych == '=') goto yy160; - goto yy113; -yy136: - yyaccept = 1; - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == '!') goto yy162; - if (yych == '>') goto yy164; - goto yy126; -yy137: - ++YYCURSOR; - if ((yych = (YYCTYPE)*YYCURSOR) == '^') goto yy165; -#line 266 "../src/parse/lex.re" - { yylval.regexp = lex_cls(false); return TOKEN_REGEXP; } -#line 930 "src/parse/lex.cc" -yy139: - yych = (YYCTYPE)*++YYCURSOR; - YYCTXMARKER = YYCURSOR; - if (yych == 'e') goto yy167; - goto yy159; -yy140: - yyaccept = 2; - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 64) { - goto yy170; - } - if (yych <= 'Z') { - if (yych == ',') goto yy168; - if (yych >= 'A') goto yy172; - } else { - if (yych <= '_') { - if (yych >= '_') goto yy172; - } else { - if (yych <= '`') goto yy141; - if (yych <= 'z') goto yy172; - } - } -yy141: -#line 235 "../src/parse/lex.re" - { - depth = 1; - goto code; - } -#line 959 "src/parse/lex.cc" -yy142: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - if (yych <= 0x1F) { - if (yych == '\t') goto yy142; - } else { - if (yych <= ' ') goto yy142; - if (yych == '#') goto yy145; - } -yy144: - YYCURSOR = YYMARKER; - if (yyaccept <= 1) { - if (yyaccept == 0) { - goto yy118; - } else { - goto yy126; - } - } else { - if (yyaccept == 2) { - goto yy141; - } else { - goto yy169; - } - } -yy145: - ++YYCURSOR; - if ((YYLIMIT - YYCURSOR) < 5) YYFILL(5); - yych = (YYCTYPE)*YYCURSOR; - if (yych <= 0x1F) { - if (yych == '\t') goto yy145; - goto yy144; - } else { - if (yych <= ' ') goto yy145; - if (yych == 'l') goto yy174; - goto yy144; - } -yy147: - ++YYCURSOR; -#line 259 "../src/parse/lex.re" - { - tok = cur; - return 0; - } -#line 1004 "src/parse/lex.cc" -yy149: - ++YYCURSOR; -#line 253 "../src/parse/lex.re" - { - depth = 1; - goto comment; - } -#line 1012 "src/parse/lex.cc" -yy151: - ++YYCURSOR; -#line 250 "../src/parse/lex.re" - { - goto nextLine; - } -#line 1019 "src/parse/lex.cc" -yy153: - ++YYCURSOR; - YYCURSOR = YYCTXMARKER; -#line 351 "../src/parse/lex.re" - { - if (!opts->FFlag) { - yylval.str = new std::string (tok, tok_len()); - return TOKEN_ID; - } else { - RegExp *r = NULL; - const bool casing = opts->bCaseInsensitive || opts->bCaseInverted; - for (char *s = tok; s < cur; ++s) { - const uint32_t c = static_cast(*s); - r = doCat(r, casing ? ichr(c) : schr(c)); - } - yylval.regexp = r ? r : new NullOp; - return TOKEN_REGEXP; - } - } -#line 1039 "src/parse/lex.cc" -yy155: - yych = (YYCTYPE)*++YYCURSOR; - goto yy178; -yy156: - ++YYCURSOR; - YYCURSOR = YYCTXMARKER; -#line 346 "../src/parse/lex.re" - { - yylval.str = new std::string (tok, tok_len ()); - return TOKEN_ID; - } -#line 1051 "src/parse/lex.cc" -yy158: - ++YYCURSOR; - if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = (YYCTYPE)*YYCURSOR; - YYCTXMARKER = YYCURSOR; -yy159: - if (yybm[0+yych] & 32) { - goto yy158; - } - if (yych <= ' ') { - if (yych == '\t') goto yy155; - if (yych <= 0x1F) goto yy153; - goto yy155; - } else { - if (yych <= ',') { - if (yych <= '+') goto yy153; - goto yy156; - } else { - if (yych <= '<') goto yy153; - if (yych <= '>') goto yy156; - goto yy153; - } - } -yy160: - ++YYCURSOR; - if ((yych = (YYCTYPE)*YYCURSOR) == '>') goto yy179; -#line 244 "../src/parse/lex.re" - { - tok += 2; /* skip ":=" */ - depth = 0; - goto code; - } -#line 1084 "src/parse/lex.cc" -yy162: - ++YYCURSOR; -#line 272 "../src/parse/lex.re" - { - return TOKEN_SETUP; - } -#line 1091 "src/parse/lex.cc" -yy164: - yych = (YYCTYPE)*++YYCURSOR; - YYCTXMARKER = YYCURSOR; - goto yy182; -yy165: - ++YYCURSOR; -#line 267 "../src/parse/lex.re" - { yylval.regexp = lex_cls(true); return TOKEN_REGEXP; } -#line 1100 "src/parse/lex.cc" -yy167: - yych = (YYCTYPE)*++YYCURSOR; - YYCTXMARKER = YYCURSOR; - if (yych == '2') goto yy187; - goto yy159; -yy168: - ++YYCURSOR; -yy169: -#line 319 "../src/parse/lex.re" - { - fatal("illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers"); - } -#line 1113 "src/parse/lex.cc" -yy170: - ++YYCURSOR; - if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = (YYCTYPE)*YYCURSOR; - if (yybm[0+yych] & 64) { - goto yy170; - } - if (yych <= '^') { - if (yych <= ',') { - if (yych <= '+') goto yy144; - goto yy188; - } else { - if (yych <= '@') goto yy144; - if (yych >= '[') goto yy144; - } - } else { - if (yych <= 'z') { - if (yych == '`') goto yy144; - } else { - if (yych == '}') goto yy189; - goto yy144; - } - } -yy172: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - if (yych <= '^') { - if (yych <= '9') { - if (yych <= '/') goto yy144; - goto yy172; - } else { - if (yych <= '@') goto yy144; - if (yych <= 'Z') goto yy172; - goto yy144; - } - } else { - if (yych <= 'z') { - if (yych == '`') goto yy144; - goto yy172; - } else { - if (yych == '}') goto yy191; - goto yy144; - } - } -yy174: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'i') goto yy193; - goto yy144; -yy175: - ++YYCURSOR; - YYCURSOR = YYCTXMARKER; -#line 333 "../src/parse/lex.re" - { - yylval.str = new std::string (tok, tok_len ()); - if (opts->FFlag) - { - lexer_state = LEX_FLEX_NAME; - return TOKEN_FID; - } - else - { - return TOKEN_ID; - } - } -#line 1179 "src/parse/lex.cc" -yy177: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; -yy178: - if (yych <= ' ') { - if (yych == '\t') goto yy177; - if (yych <= 0x1F) goto yy175; - goto yy177; - } else { - if (yych <= ',') { - if (yych <= '+') goto yy175; - goto yy156; - } else { - if (yych <= '<') goto yy175; - if (yych <= '>') goto yy156; - goto yy175; - } - } -yy179: - ++YYCURSOR; - YYCURSOR = YYCTXMARKER; -#line 240 "../src/parse/lex.re" - { - return *tok; - } -#line 1206 "src/parse/lex.cc" -yy181: - ++YYCURSOR; - if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = (YYCTYPE)*YYCURSOR; -yy182: - if (yych <= '9') { - if (yych <= '\t') { - if (yych <= 0x08) goto yy144; - goto yy181; - } else { - if (yych == ' ') goto yy181; - goto yy144; - } - } else { - if (yych <= '=') { - if (yych <= ':') goto yy183; - if (yych <= '<') goto yy144; - goto yy184; - } else { - if (yych == '{') goto yy185; - goto yy144; - } - } -yy183: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '=') goto yy185; - goto yy144; -yy184: - yych = (YYCTYPE)*++YYCURSOR; - if (yych != '>') goto yy144; -yy185: - ++YYCURSOR; - YYCURSOR = YYCTXMARKER; -#line 269 "../src/parse/lex.re" - { - return TOKEN_NOCOND; - } -#line 1244 "src/parse/lex.cc" -yy187: - yych = (YYCTYPE)*++YYCURSOR; - YYCTXMARKER = YYCURSOR; - if (yych == 'c') goto yy194; - goto yy159; -yy188: - yyaccept = 3; - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy169; - if (yych <= '9') goto yy195; - if (yych == '}') goto yy197; - goto yy169; -yy189: - ++YYCURSOR; -#line 288 "../src/parse/lex.re" - { - if (!s_to_u32_unsafe (tok + 1, cur - 1, yylval.extop.min)) - { - fatal ("repetition count overflow"); - } - yylval.extop.max = yylval.extop.min; - return TOKEN_CLOSESIZE; - } -#line 1268 "src/parse/lex.cc" -yy191: - ++YYCURSOR; -#line 323 "../src/parse/lex.re" - { - if (!opts->FFlag) { - fatal("curly braces for names only allowed with -F switch"); - } - yylval.str = new std::string (tok + 1, tok_len () - 2); // -2 to omit braces - return TOKEN_ID; - } -#line 1279 "src/parse/lex.cc" -yy193: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'n') goto yy199; - goto yy144; -yy194: - yych = (YYCTYPE)*++YYCURSOR; - YYCTXMARKER = YYCURSOR; - if (yych == ':') goto yy200; - goto yy159; -yy195: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - if (yych <= '/') goto yy144; - if (yych <= '9') goto yy195; - if (yych == '}') goto yy202; - goto yy144; -yy197: - ++YYCURSOR; -#line 310 "../src/parse/lex.re" - { - if (!s_to_u32_unsafe (tok + 1, cur - 2, yylval.extop.min)) - { - fatal ("repetition lower bound overflow"); - } - yylval.extop.max = std::numeric_limits::max(); - return TOKEN_CLOSESIZE; - } -#line 1308 "src/parse/lex.cc" -yy199: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == 'e') goto yy204; - goto yy144; -yy200: - ++YYCURSOR; -#line 331 "../src/parse/lex.re" - { lex_conf (); return TOKEN_CONF; } -#line 1317 "src/parse/lex.cc" -yy202: - ++YYCURSOR; -#line 297 "../src/parse/lex.re" - { - const char * p = strchr (tok, ','); - if (!s_to_u32_unsafe (tok + 1, p, yylval.extop.min)) - { - fatal ("repetition lower bound overflow"); - } - if (!s_to_u32_unsafe (p + 1, cur - 1, yylval.extop.max)) - { - fatal ("repetition upper bound overflow"); - } - return TOKEN_CLOSESIZE; - } -#line 1333 "src/parse/lex.cc" -yy204: - yych = (YYCTYPE)*++YYCURSOR; - if (yych <= '0') goto yy206; - if (yych <= '9') goto yy144; - goto yy206; -yy205: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - YYCTXMARKER = YYCURSOR; -yy206: - if (yych <= 0x1F) { - if (yych == '\t') goto yy205; - goto yy144; - } else { - if (yych <= ' ') goto yy205; - if (yych <= '0') goto yy144; - if (yych >= ':') goto yy144; - } -yy207: - ++YYCURSOR; - if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = (YYCTYPE)*YYCURSOR; - if (yych <= '\r') { - if (yych <= '\t') { - if (yych <= 0x08) goto yy144; - } else { - if (yych <= '\n') goto yy211; - if (yych <= '\f') goto yy144; - goto yy213; - } - } else { - if (yych <= ' ') { - if (yych <= 0x1F) goto yy144; - } else { - if (yych <= '/') goto yy144; - if (yych <= '9') goto yy207; - goto yy144; - } - } -yy209: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - if (yych <= 0x1F) { - if (yych == '\t') goto yy209; - goto yy144; - } else { - if (yych <= ' ') goto yy209; - if (yych == '"') goto yy214; - goto yy144; - } -yy211: - ++YYCURSOR; - YYCURSOR = YYCTXMARKER; -#line 376 "../src/parse/lex.re" - { - set_sourceline (); - goto scan; - } -#line 1394 "src/parse/lex.cc" -yy213: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '\n') goto yy211; - goto yy144; -yy214: - ++YYCURSOR; - if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); - yych = (YYCTYPE)*YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy214; - } - if (yych <= '\n') goto yy144; - if (yych >= '#') goto yy217; - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '\n') goto yy211; - if (yych == '\r') goto yy213; - goto yy144; -yy217: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - if (yych == '\n') goto yy144; - goto yy214; -} -#line 392 "../src/parse/lex.re" - - -flex_name: - -#line 1424 "src/parse/lex.cc" -{ - YYCTYPE yych; - if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = (YYCTYPE)*YYCURSOR; - if (yych == '\n') goto yy222; - if (yych == '\r') goto yy224; - ++YYCURSOR; -yy221: -#line 403 "../src/parse/lex.re" - { - YYCURSOR = tok; - goto start; - } -#line 1438 "src/parse/lex.cc" -yy222: - ++YYCURSOR; -#line 397 "../src/parse/lex.re" - { - YYCURSOR = tok; - lexer_state = LEX_NORMAL; - return TOKEN_FID_END; - } -#line 1447 "src/parse/lex.cc" -yy224: - ++YYCURSOR; - if ((yych = (YYCTYPE)*YYCURSOR) == '\n') goto yy222; - goto yy221; -} -#line 407 "../src/parse/lex.re" - - -code: - -#line 1458 "src/parse/lex.cc" -{ - YYCTYPE yych; - unsigned int yyaccept = 0; - static const unsigned char yybm[] = { - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 112, 0, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 112, 96, 64, 96, 96, 96, 96, 32, - 96, 96, 96, 96, 96, 96, 96, 96, - 224, 224, 224, 224, 224, 224, 224, 224, - 224, 224, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 0, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, - }; - if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); - yych = (YYCTYPE)*YYCURSOR; - if (yych <= '&') { - if (yych <= '\n') { - if (yych <= 0x00) goto yy227; - if (yych <= '\t') goto yy229; - goto yy231; - } else { - if (yych == '"') goto yy233; - goto yy229; - } - } else { - if (yych <= '{') { - if (yych <= '\'') goto yy234; - if (yych <= 'z') goto yy229; - goto yy235; - } else { - if (yych == '}') goto yy237; - goto yy229; - } - } -yy227: - ++YYCURSOR; -#line 470 "../src/parse/lex.re" - { - if (cur == eof) - { - if (depth) - { - fatal("missing '}'"); - } - return 0; - } - goto code; - } -#line 1531 "src/parse/lex.cc" -yy229: - ++YYCURSOR; -yy230: -#line 484 "../src/parse/lex.re" - { - goto code; - } -#line 1539 "src/parse/lex.cc" -yy231: - yyaccept = 0; - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - YYCTXMARKER = YYCURSOR; - if (yych <= '\r') { - if (yych <= '\t') { - if (yych >= '\t') goto yy239; - } else { - if (yych <= '\n') goto yy241; - if (yych >= '\r') goto yy241; - } - } else { - if (yych <= ' ') { - if (yych >= ' ') goto yy239; - } else { - if (yych == '#') goto yy242; - } - } -yy232: -#line 451 "../src/parse/lex.re" - { - if (depth == 0) - { - tok += strspn(tok, " \t\r\n"); - while (cur > tok && strchr(" \t\r\n", cur[-1])) - { - --cur; - } - yylval.code = new Code (tok, tok_len (), get_fname (), tline); - return TOKEN_CODE; - } - else if (cur == eof) - { - fatal("missing '}'"); - } - pos = cur; - cline++; - goto code; - } -#line 1579 "src/parse/lex.cc" -yy233: - yyaccept = 1; - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == '\n') goto yy230; - goto yy246; -yy234: - yyaccept = 1; - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == '\n') goto yy230; - goto yy251; -yy235: - ++YYCURSOR; -#line 423 "../src/parse/lex.re" - { - if (depth == 0) - { - fatal("Curly braces are not allowed after ':='"); - } - else - { - ++depth; - } - goto code; - } -#line 1604 "src/parse/lex.cc" -yy237: - ++YYCURSOR; -#line 411 "../src/parse/lex.re" - { - if (depth == 0) - { - fatal("Curly braces are not allowed after ':='"); - } - else if (--depth == 0) - { - yylval.code = new Code (tok, tok_len (), get_fname (), tline); - return TOKEN_CODE; - } - goto code; - } -#line 1620 "src/parse/lex.cc" -yy239: - yyaccept = 2; - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych <= 0x1F) { - if (yych == '\t') goto yy253; - } else { - if (yych <= ' ') goto yy253; - if (yych == '#') goto yy242; - } -yy240: - YYCURSOR = YYCTXMARKER; -#line 438 "../src/parse/lex.re" - { - if (depth == 0) - { - goto code; - } - else if (cur == eof) - { - fatal("missing '}'"); - } - pos = cur; - cline++; - goto code; - } -#line 1646 "src/parse/lex.cc" -yy241: - yych = (YYCTYPE)*++YYCURSOR; - goto yy240; -yy242: - ++YYCURSOR; - if ((YYLIMIT - YYCURSOR) < 5) YYFILL(5); - yych = (YYCTYPE)*YYCURSOR; - if (yybm[0+yych] & 16) { - goto yy242; - } - if (yych == 'l') goto yy255; -yy244: - YYCURSOR = YYMARKER; - if (yyaccept <= 1) { - if (yyaccept == 0) { - goto yy232; - } else { - goto yy230; - } - } else { - goto yy240; - } -yy245: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; -yy246: - if (yybm[0+yych] & 32) { - goto yy245; - } - if (yych <= '\n') goto yy244; - if (yych >= '#') goto yy249; -yy247: - ++YYCURSOR; -#line 481 "../src/parse/lex.re" - { - goto code; - } -#line 1685 "src/parse/lex.cc" -yy249: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - if (yych == '\n') goto yy244; - goto yy245; -yy250: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; -yy251: - if (yybm[0+yych] & 64) { - goto yy250; - } - if (yych <= '\n') goto yy244; - if (yych <= '\'') goto yy247; - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - if (yych == '\n') goto yy244; - goto yy250; -yy253: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - if (yych <= 0x1F) { - if (yych == '\t') goto yy253; - goto yy244; - } else { - if (yych <= ' ') goto yy253; - if (yych == '#') goto yy242; - goto yy244; - } -yy255: - yych = (YYCTYPE)*++YYCURSOR; - if (yych != 'i') goto yy244; - yych = (YYCTYPE)*++YYCURSOR; - if (yych != 'n') goto yy244; - yych = (YYCTYPE)*++YYCURSOR; - if (yych != 'e') goto yy244; - yych = (YYCTYPE)*++YYCURSOR; - if (yych <= '0') goto yy260; - if (yych <= '9') goto yy244; - goto yy260; -yy259: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - YYCTXMARKER = YYCURSOR; -yy260: - if (yych <= 0x1F) { - if (yych == '\t') goto yy259; - goto yy244; - } else { - if (yych <= ' ') goto yy259; - if (yych <= '0') goto yy244; - if (yych >= ':') goto yy244; - } -yy261: - ++YYCURSOR; - if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = (YYCTYPE)*YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy261; - } - if (yych <= '\f') { - if (yych <= 0x08) goto yy244; - if (yych <= '\t') goto yy263; - if (yych <= '\n') goto yy265; - goto yy244; - } else { - if (yych <= '\r') goto yy267; - if (yych != ' ') goto yy244; - } -yy263: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - if (yych <= 0x1F) { - if (yych == '\t') goto yy263; - goto yy244; - } else { - if (yych <= ' ') goto yy263; - if (yych == '"') goto yy268; - goto yy244; - } -yy265: - ++YYCURSOR; - YYCURSOR = YYCTXMARKER; -#line 434 "../src/parse/lex.re" - { - set_sourceline (); - goto code; - } -#line 1780 "src/parse/lex.cc" -yy267: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '\n') goto yy265; - goto yy244; -yy268: - ++YYCURSOR; - if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); - yych = (YYCTYPE)*YYCURSOR; - if (yych <= '!') { - if (yych == '\n') goto yy244; - goto yy268; - } else { - if (yych <= '"') goto yy270; - if (yych == '\\') goto yy271; - goto yy268; - } -yy270: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '\n') goto yy265; - if (yych == '\r') goto yy267; - goto yy244; -yy271: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - if (yych == '\n') goto yy244; - goto yy268; -} -#line 487 "../src/parse/lex.re" - - -comment: - -#line 1814 "src/parse/lex.cc" -{ - YYCTYPE yych; - static const unsigned char yybm[] = { - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 160, 0, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 160, 128, 0, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 192, 192, 192, 192, 192, 192, 192, 192, - 192, 192, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 0, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - }; - if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = (YYCTYPE)*YYCURSOR; - if (yych <= ')') { - if (yych == '\n') goto yy276; - } else { - if (yych <= '*') goto yy278; - if (yych == '/') goto yy279; - } - ++YYCURSOR; -yy275: -#line 519 "../src/parse/lex.re" - { - if (cur == eof) - { - return 0; - } - goto comment; - } -#line 1869 "src/parse/lex.cc" -yy276: - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 32) { - goto yy280; - } - if (yych == '#') goto yy283; -yy277: -#line 510 "../src/parse/lex.re" - { - if (cur == eof) - { - return 0; - } - tok = pos = cur; - cline++; - goto comment; - } -#line 1887 "src/parse/lex.cc" -yy278: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '/') goto yy285; - goto yy275; -yy279: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '*') goto yy287; - goto yy275; -yy280: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - if (yybm[0+yych] & 32) { - goto yy280; - } - if (yych == '#') goto yy283; -yy282: - YYCURSOR = YYMARKER; - goto yy277; -yy283: - ++YYCURSOR; - if ((YYLIMIT - YYCURSOR) < 5) YYFILL(5); - yych = (YYCTYPE)*YYCURSOR; - if (yych <= 0x1F) { - if (yych == '\t') goto yy283; - goto yy282; - } else { - if (yych <= ' ') goto yy283; - if (yych == 'l') goto yy289; - goto yy282; - } -yy285: - ++YYCURSOR; -#line 491 "../src/parse/lex.re" - { - if (--depth == 0) - { - goto scan; - } - else - { - goto comment; - } - } -#line 1932 "src/parse/lex.cc" -yy287: - ++YYCURSOR; -#line 501 "../src/parse/lex.re" - { - ++depth; - fatal("ambiguous /* found"); - goto comment; - } -#line 1941 "src/parse/lex.cc" -yy289: - yych = (YYCTYPE)*++YYCURSOR; - if (yych != 'i') goto yy282; - yych = (YYCTYPE)*++YYCURSOR; - if (yych != 'n') goto yy282; - yych = (YYCTYPE)*++YYCURSOR; - if (yych != 'e') goto yy282; - yych = (YYCTYPE)*++YYCURSOR; - if (yych <= '0') goto yy294; - if (yych <= '9') goto yy282; - goto yy294; -yy293: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - YYCTXMARKER = YYCURSOR; -yy294: - if (yych <= 0x1F) { - if (yych == '\t') goto yy293; - goto yy282; - } else { - if (yych <= ' ') goto yy293; - if (yych <= '0') goto yy282; - if (yych >= ':') goto yy282; - } -yy295: - ++YYCURSOR; - if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = (YYCTYPE)*YYCURSOR; - if (yybm[0+yych] & 64) { - goto yy295; - } - if (yych <= '\f') { - if (yych <= 0x08) goto yy282; - if (yych <= '\t') goto yy297; - if (yych <= '\n') goto yy299; - goto yy282; - } else { - if (yych <= '\r') goto yy301; - if (yych != ' ') goto yy282; - } -yy297: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - if (yych <= 0x1F) { - if (yych == '\t') goto yy297; - goto yy282; - } else { - if (yych <= ' ') goto yy297; - if (yych == '"') goto yy302; - goto yy282; - } -yy299: - ++YYCURSOR; - YYCURSOR = YYCTXMARKER; -#line 506 "../src/parse/lex.re" - { - set_sourceline (); - goto comment; - } -#line 2003 "src/parse/lex.cc" -yy301: - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '\n') goto yy299; - goto yy282; -yy302: - ++YYCURSOR; - if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); - yych = (YYCTYPE)*YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy302; - } - if (yych <= '\n') goto yy282; - if (yych >= '#') goto yy305; - yych = (YYCTYPE)*++YYCURSOR; - if (yych == '\n') goto yy299; - if (yych == '\r') goto yy301; - goto yy282; -yy305: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - if (yych == '\n') goto yy282; - goto yy302; -} -#line 526 "../src/parse/lex.re" - - -nextLine: - -#line 2033 "src/parse/lex.cc" -{ - YYCTYPE yych; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - if (yych == '\n') goto yy310; - ++YYCURSOR; -#line 537 "../src/parse/lex.re" - { if(cur == eof) { - return 0; - } - goto nextLine; - } -#line 2046 "src/parse/lex.cc" -yy310: - ++YYCURSOR; -#line 530 "../src/parse/lex.re" - { if(cur == eof) { - return 0; - } - tok = pos = cur; - cline++; - goto scan; - } -#line 2057 "src/parse/lex.cc" -} -#line 542 "../src/parse/lex.re" - -} - -static void escape (std::string & dest, const std::string & src) -{ - dest = src; - size_t l = dest.length(); - for (size_t p = 0; p < l; ++p) - { - if (dest[p] == '\\') - { - dest.insert(++p, "\\"); - ++l; - } - } -} - -RegExp *Scanner::lex_cls(bool neg) -{ - Range *r = NULL, *s; - uint32_t u, l; -fst: - -#line 2083 "src/parse/lex.cc" -{ - YYCTYPE yych; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - if (yych == ']') goto yy315; -#line 566 "../src/parse/lex.re" - { l = lex_cls_chr(); goto snd; } -#line 2091 "src/parse/lex.cc" -yy315: - ++YYCURSOR; -#line 565 "../src/parse/lex.re" - { goto end; } -#line 2096 "src/parse/lex.cc" -} -#line 567 "../src/parse/lex.re" - -snd: - -#line 2102 "src/parse/lex.cc" -{ - YYCTYPE yych; - if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = (YYCTYPE)*(YYMARKER = YYCURSOR); - if (yych == '-') goto yy320; -yy319: -#line 570 "../src/parse/lex.re" - { u = l; goto add; } -#line 2111 "src/parse/lex.cc" -yy320: - yych = (YYCTYPE)*++YYCURSOR; - YYCTXMARKER = YYCURSOR; - if (yych != ']') goto yy322; - YYCURSOR = YYMARKER; - goto yy319; -yy322: - ++YYCURSOR; - YYCURSOR = YYCTXMARKER; -#line 571 "../src/parse/lex.re" - { - u = lex_cls_chr(); - if (l > u) { - warn.swapped_range(get_line(), l, u); - std::swap(l, u); - } - goto add; - } -#line 2130 "src/parse/lex.cc" -} -#line 579 "../src/parse/lex.re" - -add: - if (!(s = opts->encoding.encodeRange(l, u))) { - fatalf ("Bad code point range: '0x%X - 0x%X'", l, u); - } - r = Range::add(r, s); - goto fst; -end: - if (neg) { - r = Range::sub(opts->encoding.fullRange(), r); - } - return cls(r); -} - -uint32_t Scanner::lex_cls_chr() -{ - tok = cur; - -#line 2151 "src/parse/lex.cc" -{ - YYCTYPE yych; - unsigned int yyaccept = 0; - if ((YYLIMIT - YYCURSOR) < 10) YYFILL(10); - yych = (YYCTYPE)*YYCURSOR; - if (yych == '\n') goto yy328; - if (yych == '\\') goto yy330; - ++YYCURSOR; -#line 602 "../src/parse/lex.re" - { return static_cast(tok[0]); } -#line 2162 "src/parse/lex.cc" -yy328: - ++YYCURSOR; -#line 597 "../src/parse/lex.re" - { fatal ((tok - pos) - tchar, "syntax error"); } -#line 2167 "src/parse/lex.cc" -yy330: - ++YYCURSOR; - if ((yych = (YYCTYPE)*YYCURSOR) <= '`') { - if (yych <= '7') { - if (yych <= ',') { - if (yych != '\n') goto yy332; - } else { - if (yych <= '-') goto yy334; - if (yych <= '/') goto yy332; - if (yych <= '3') goto yy336; - goto yy338; - } - } else { - if (yych <= 'X') { - if (yych == 'U') goto yy339; - if (yych <= 'W') goto yy332; - goto yy341; - } else { - if (yych <= '[') goto yy332; - if (yych <= '\\') goto yy342; - if (yych <= ']') goto yy344; - goto yy332; - } - } - } else { - if (yych <= 'q') { - if (yych <= 'e') { - if (yych <= 'a') goto yy346; - if (yych <= 'b') goto yy348; - goto yy332; - } else { - if (yych <= 'f') goto yy350; - if (yych == 'n') goto yy352; - goto yy332; - } - } else { - if (yych <= 'u') { - if (yych <= 'r') goto yy354; - if (yych <= 's') goto yy332; - if (yych <= 't') goto yy356; - goto yy341; - } else { - if (yych <= 'v') goto yy358; - if (yych == 'x') goto yy360; - goto yy332; - } - } - } -#line 600 "../src/parse/lex.re" - { fatal ((tok - pos) - tchar, "syntax error in escape sequence"); } -#line 2218 "src/parse/lex.cc" -yy332: - ++YYCURSOR; -#line 615 "../src/parse/lex.re" - { - warn.useless_escape(tline, tok - pos, tok[1]); - return static_cast(tok[1]); - } -#line 2226 "src/parse/lex.cc" -yy334: - ++YYCURSOR; -#line 613 "../src/parse/lex.re" - { return static_cast('-'); } -#line 2231 "src/parse/lex.cc" -yy336: - yyaccept = 0; - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy337; - if (yych <= '7') goto yy361; -yy337: -#line 599 "../src/parse/lex.re" - { fatal ((tok - pos) - tchar, "syntax error in octal escape sequence"); } -#line 2240 "src/parse/lex.cc" -yy338: - yych = (YYCTYPE)*++YYCURSOR; - goto yy337; -yy339: - yyaccept = 1; - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych <= '@') { - if (yych <= '/') goto yy340; - if (yych <= '9') goto yy363; - } else { - if (yych <= 'F') goto yy363; - if (yych <= '`') goto yy340; - if (yych <= 'f') goto yy363; - } -yy340: -#line 598 "../src/parse/lex.re" - { fatal ((tok - pos) - tchar, "syntax error in hexadecimal escape sequence"); } -#line 2258 "src/parse/lex.cc" -yy341: - yyaccept = 1; - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych <= '@') { - if (yych <= '/') goto yy340; - if (yych <= '9') goto yy364; - goto yy340; - } else { - if (yych <= 'F') goto yy364; - if (yych <= '`') goto yy340; - if (yych <= 'f') goto yy364; - goto yy340; - } -yy342: - ++YYCURSOR; -#line 612 "../src/parse/lex.re" - { return static_cast('\\'); } -#line 2276 "src/parse/lex.cc" -yy344: - ++YYCURSOR; -#line 614 "../src/parse/lex.re" - { return static_cast(']'); } -#line 2281 "src/parse/lex.cc" -yy346: - ++YYCURSOR; -#line 605 "../src/parse/lex.re" - { return static_cast('\a'); } -#line 2286 "src/parse/lex.cc" -yy348: - ++YYCURSOR; -#line 606 "../src/parse/lex.re" - { return static_cast('\b'); } -#line 2291 "src/parse/lex.cc" -yy350: - ++YYCURSOR; -#line 607 "../src/parse/lex.re" - { return static_cast('\f'); } -#line 2296 "src/parse/lex.cc" -yy352: - ++YYCURSOR; -#line 608 "../src/parse/lex.re" - { return static_cast('\n'); } -#line 2301 "src/parse/lex.cc" -yy354: - ++YYCURSOR; -#line 609 "../src/parse/lex.re" - { return static_cast('\r'); } -#line 2306 "src/parse/lex.cc" -yy356: - ++YYCURSOR; -#line 610 "../src/parse/lex.re" - { return static_cast('\t'); } -#line 2311 "src/parse/lex.cc" -yy358: - ++YYCURSOR; -#line 611 "../src/parse/lex.re" - { return static_cast('\v'); } -#line 2316 "src/parse/lex.cc" -yy360: - yyaccept = 1; - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych <= '@') { - if (yych <= '/') goto yy340; - if (yych <= '9') goto yy365; - goto yy340; - } else { - if (yych <= 'F') goto yy365; - if (yych <= '`') goto yy340; - if (yych <= 'f') goto yy365; - goto yy340; - } -yy361: - yych = (YYCTYPE)*++YYCURSOR; - if (yych <= '/') goto yy362; - if (yych <= '7') goto yy366; -yy362: - YYCURSOR = YYMARKER; - if (yyaccept == 0) { - goto yy337; - } else { - goto yy340; - } -yy363: - yych = (YYCTYPE)*++YYCURSOR; - if (yych <= '@') { - if (yych <= '/') goto yy362; - if (yych <= '9') goto yy368; - goto yy362; - } else { - if (yych <= 'F') goto yy368; - if (yych <= '`') goto yy362; - if (yych <= 'f') goto yy368; - goto yy362; - } -yy364: - yych = (YYCTYPE)*++YYCURSOR; - if (yych <= '@') { - if (yych <= '/') goto yy362; - if (yych <= '9') goto yy369; - goto yy362; - } else { - if (yych <= 'F') goto yy369; - if (yych <= '`') goto yy362; - if (yych <= 'f') goto yy369; - goto yy362; - } -yy365: - yych = (YYCTYPE)*++YYCURSOR; - if (yych <= '@') { - if (yych <= '/') goto yy362; - if (yych <= '9') goto yy370; - goto yy362; - } else { - if (yych <= 'F') goto yy370; - if (yych <= '`') goto yy362; - if (yych <= 'f') goto yy370; - goto yy362; - } -yy366: - ++YYCURSOR; -#line 604 "../src/parse/lex.re" - { return unesc_oct(tok, cur); } -#line 2381 "src/parse/lex.cc" -yy368: - yych = (YYCTYPE)*++YYCURSOR; - if (yych <= '@') { - if (yych <= '/') goto yy362; - if (yych <= '9') goto yy372; - goto yy362; - } else { - if (yych <= 'F') goto yy372; - if (yych <= '`') goto yy362; - if (yych <= 'f') goto yy372; - goto yy362; - } -yy369: - yych = (YYCTYPE)*++YYCURSOR; - if (yych <= '@') { - if (yych <= '/') goto yy362; - if (yych <= '9') goto yy365; - goto yy362; - } else { - if (yych <= 'F') goto yy365; - if (yych <= '`') goto yy362; - if (yych <= 'f') goto yy365; - goto yy362; - } -yy370: - ++YYCURSOR; -#line 603 "../src/parse/lex.re" - { return unesc_hex(tok, cur); } -#line 2410 "src/parse/lex.cc" -yy372: - yych = (YYCTYPE)*++YYCURSOR; - if (yych <= '@') { - if (yych <= '/') goto yy362; - if (yych >= ':') goto yy362; - } else { - if (yych <= 'F') goto yy373; - if (yych <= '`') goto yy362; - if (yych >= 'g') goto yy362; - } -yy373: - ++YYCURSOR; - if ((yych = (YYCTYPE)*YYCURSOR) <= '@') { - if (yych <= '/') goto yy362; - if (yych <= '9') goto yy364; - goto yy362; - } else { - if (yych <= 'F') goto yy364; - if (yych <= '`') goto yy362; - if (yych <= 'f') goto yy364; - goto yy362; - } -} -#line 619 "../src/parse/lex.re" - -} - -uint32_t Scanner::lex_str_chr(char quote, bool &end) -{ - end = false; - tok = cur; - -#line 2443 "src/parse/lex.cc" -{ - YYCTYPE yych; - unsigned int yyaccept = 0; - if ((YYLIMIT - YYCURSOR) < 10) YYFILL(10); - yych = (YYCTYPE)*YYCURSOR; - if (yych == '\n') goto yy378; - if (yych == '\\') goto yy380; - ++YYCURSOR; -#line 632 "../src/parse/lex.re" - { - end = tok[0] == quote; - return static_cast(tok[0]); - } -#line 2457 "src/parse/lex.cc" -yy378: - ++YYCURSOR; -#line 627 "../src/parse/lex.re" - { fatal ((tok - pos) - tchar, "syntax error"); } -#line 2462 "src/parse/lex.cc" -yy380: - ++YYCURSOR; - if ((yych = (YYCTYPE)*YYCURSOR) <= 'a') { - if (yych <= 'T') { - if (yych <= '/') { - if (yych != '\n') goto yy382; - } else { - if (yych <= '3') goto yy384; - if (yych <= '7') goto yy386; - goto yy382; - } - } else { - if (yych <= 'X') { - if (yych <= 'U') goto yy387; - if (yych <= 'W') goto yy382; - goto yy389; - } else { - if (yych == '\\') goto yy390; - if (yych <= '`') goto yy382; - goto yy392; - } - } - } else { - if (yych <= 'r') { - if (yych <= 'f') { - if (yych <= 'b') goto yy394; - if (yych <= 'e') goto yy382; - goto yy396; - } else { - if (yych == 'n') goto yy398; - if (yych <= 'q') goto yy382; - goto yy400; - } - } else { - if (yych <= 'u') { - if (yych <= 's') goto yy382; - if (yych <= 't') goto yy402; - goto yy389; - } else { - if (yych <= 'v') goto yy404; - if (yych == 'x') goto yy406; - goto yy382; - } - } - } -#line 630 "../src/parse/lex.re" - { fatal ((tok - pos) - tchar, "syntax error in escape sequence"); } -#line 2510 "src/parse/lex.cc" -yy382: - ++YYCURSOR; -#line 646 "../src/parse/lex.re" - { - if (tok[1] != quote) { - warn.useless_escape(tline, tok - pos, tok[1]); - } - return static_cast(tok[1]); - } -#line 2520 "src/parse/lex.cc" -yy384: - yyaccept = 0; - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych <= '/') goto yy385; - if (yych <= '7') goto yy407; -yy385: -#line 629 "../src/parse/lex.re" - { fatal ((tok - pos) - tchar, "syntax error in octal escape sequence"); } -#line 2529 "src/parse/lex.cc" -yy386: - yych = (YYCTYPE)*++YYCURSOR; - goto yy385; -yy387: - yyaccept = 1; - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych <= '@') { - if (yych <= '/') goto yy388; - if (yych <= '9') goto yy409; - } else { - if (yych <= 'F') goto yy409; - if (yych <= '`') goto yy388; - if (yych <= 'f') goto yy409; - } -yy388: -#line 628 "../src/parse/lex.re" - { fatal ((tok - pos) - tchar, "syntax error in hexadecimal escape sequence"); } -#line 2547 "src/parse/lex.cc" -yy389: - yyaccept = 1; - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych <= '@') { - if (yych <= '/') goto yy388; - if (yych <= '9') goto yy410; - goto yy388; - } else { - if (yych <= 'F') goto yy410; - if (yych <= '`') goto yy388; - if (yych <= 'f') goto yy410; - goto yy388; - } -yy390: - ++YYCURSOR; -#line 645 "../src/parse/lex.re" - { return static_cast('\\'); } -#line 2565 "src/parse/lex.cc" -yy392: - ++YYCURSOR; -#line 638 "../src/parse/lex.re" - { return static_cast('\a'); } -#line 2570 "src/parse/lex.cc" -yy394: - ++YYCURSOR; -#line 639 "../src/parse/lex.re" - { return static_cast('\b'); } -#line 2575 "src/parse/lex.cc" -yy396: - ++YYCURSOR; -#line 640 "../src/parse/lex.re" - { return static_cast('\f'); } -#line 2580 "src/parse/lex.cc" -yy398: - ++YYCURSOR; -#line 641 "../src/parse/lex.re" - { return static_cast('\n'); } -#line 2585 "src/parse/lex.cc" -yy400: - ++YYCURSOR; -#line 642 "../src/parse/lex.re" - { return static_cast('\r'); } -#line 2590 "src/parse/lex.cc" -yy402: - ++YYCURSOR; -#line 643 "../src/parse/lex.re" - { return static_cast('\t'); } -#line 2595 "src/parse/lex.cc" -yy404: - ++YYCURSOR; -#line 644 "../src/parse/lex.re" - { return static_cast('\v'); } -#line 2600 "src/parse/lex.cc" -yy406: - yyaccept = 1; - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych <= '@') { - if (yych <= '/') goto yy388; - if (yych <= '9') goto yy411; - goto yy388; - } else { - if (yych <= 'F') goto yy411; - if (yych <= '`') goto yy388; - if (yych <= 'f') goto yy411; - goto yy388; - } -yy407: - yych = (YYCTYPE)*++YYCURSOR; - if (yych <= '/') goto yy408; - if (yych <= '7') goto yy412; -yy408: - YYCURSOR = YYMARKER; - if (yyaccept == 0) { - goto yy385; - } else { - goto yy388; - } -yy409: - yych = (YYCTYPE)*++YYCURSOR; - if (yych <= '@') { - if (yych <= '/') goto yy408; - if (yych <= '9') goto yy414; - goto yy408; - } else { - if (yych <= 'F') goto yy414; - if (yych <= '`') goto yy408; - if (yych <= 'f') goto yy414; - goto yy408; - } -yy410: - yych = (YYCTYPE)*++YYCURSOR; - if (yych <= '@') { - if (yych <= '/') goto yy408; - if (yych <= '9') goto yy415; - goto yy408; - } else { - if (yych <= 'F') goto yy415; - if (yych <= '`') goto yy408; - if (yych <= 'f') goto yy415; - goto yy408; - } -yy411: - yych = (YYCTYPE)*++YYCURSOR; - if (yych <= '@') { - if (yych <= '/') goto yy408; - if (yych <= '9') goto yy416; - goto yy408; - } else { - if (yych <= 'F') goto yy416; - if (yych <= '`') goto yy408; - if (yych <= 'f') goto yy416; - goto yy408; - } -yy412: - ++YYCURSOR; -#line 637 "../src/parse/lex.re" - { return unesc_oct(tok, cur); } -#line 2665 "src/parse/lex.cc" -yy414: - yych = (YYCTYPE)*++YYCURSOR; - if (yych <= '@') { - if (yych <= '/') goto yy408; - if (yych <= '9') goto yy418; - goto yy408; - } else { - if (yych <= 'F') goto yy418; - if (yych <= '`') goto yy408; - if (yych <= 'f') goto yy418; - goto yy408; - } -yy415: - yych = (YYCTYPE)*++YYCURSOR; - if (yych <= '@') { - if (yych <= '/') goto yy408; - if (yych <= '9') goto yy411; - goto yy408; - } else { - if (yych <= 'F') goto yy411; - if (yych <= '`') goto yy408; - if (yych <= 'f') goto yy411; - goto yy408; - } -yy416: - ++YYCURSOR; -#line 636 "../src/parse/lex.re" - { return unesc_hex(tok, cur); } -#line 2694 "src/parse/lex.cc" -yy418: - yych = (YYCTYPE)*++YYCURSOR; - if (yych <= '@') { - if (yych <= '/') goto yy408; - if (yych >= ':') goto yy408; - } else { - if (yych <= 'F') goto yy419; - if (yych <= '`') goto yy408; - if (yych >= 'g') goto yy408; - } -yy419: - ++YYCURSOR; - if ((yych = (YYCTYPE)*YYCURSOR) <= '@') { - if (yych <= '/') goto yy408; - if (yych <= '9') goto yy410; - goto yy408; - } else { - if (yych <= 'F') goto yy410; - if (yych <= '`') goto yy408; - if (yych <= 'f') goto yy410; - goto yy408; - } -} -#line 652 "../src/parse/lex.re" - -} - -RegExp *Scanner::lex_str(char quote, bool casing) -{ - RegExp *r = NULL; - for (bool end;;) { - const uint32_t c = lex_str_chr(quote, end); - if (end) { - return r ? r : new NullOp; - } - r = doCat(r, casing ? ichr(c) : schr(c)); - } -} - -void Scanner::set_sourceline () -{ -sourceline: - tok = cur; - -#line 2739 "src/parse/lex.cc" -{ - YYCTYPE yych; - static const unsigned char yybm[] = { - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 0, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 0, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 192, 192, 192, 192, 192, 192, 192, 192, - 192, 192, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 0, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - }; - if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = (YYCTYPE)*YYCURSOR; - if (yych <= '!') { - if (yych == '\n') goto yy424; - } else { - if (yych <= '"') goto yy426; - if (yych <= '0') goto yy422; - if (yych <= '9') goto yy427; - } -yy422: - ++YYCURSOR; -yy423: -#line 695 "../src/parse/lex.re" - { - goto sourceline; - } -#line 2792 "src/parse/lex.cc" -yy424: - ++YYCURSOR; -#line 683 "../src/parse/lex.re" - { - if (cur == eof) - { - --cur; - } - else - { - pos = cur; - } - tok = cur; - return; - } -#line 2808 "src/parse/lex.cc" -yy426: - yych = (YYCTYPE)*(YYMARKER = ++YYCURSOR); - if (yych == '\n') goto yy423; - goto yy431; -yy427: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - if (yybm[0+yych] & 64) { - goto yy427; - } -#line 672 "../src/parse/lex.re" - { - if (!s_to_u32_unsafe (tok, cur, cline)) - { - fatal ("line number overflow"); - } - goto sourceline; - } -#line 2828 "src/parse/lex.cc" -yy430: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; -yy431: - if (yybm[0+yych] & 128) { - goto yy430; - } - if (yych <= '\n') goto yy432; - if (yych <= '"') goto yy433; - goto yy435; -yy432: - YYCURSOR = YYMARKER; - goto yy423; -yy433: - ++YYCURSOR; -#line 679 "../src/parse/lex.re" - { - escape (in.file_name, std::string (tok + 1, tok_len () - 2)); // -2 to omit quotes - goto sourceline; - } -#line 2850 "src/parse/lex.cc" -yy435: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = (YYCTYPE)*YYCURSOR; - if (yych == '\n') goto yy432; - goto yy430; -} -#line 698 "../src/parse/lex.re" - -} - -} // end namespace re2c diff --git a/bootstrap/src/parse/lex_conf.cc b/bootstrap/src/parse/lex_conf.cc deleted file mode 100644 index eb0aec7..0000000 --- a/bootstrap/src/parse/lex_conf.cc +++ /dev/null @@ -1,2284 +0,0 @@ -/* Generated by re2c 0.16 on Thu Jan 21 10:47:47 2016 */ -#line 1 "../src/parse/lex_conf.re" -#include "src/util/c99_stdint.h" -#include - -#include "src/codegen/output.h" -#include "src/conf/opt.h" -#include "src/globals.h" -#include "src/ir/regexp/encoding/enc.h" -#include "src/parse/scanner.h" -#include "src/util/s_to_n32_unsafe.h" - -namespace re2c -{ - -// global re2c config (affects the whole file) -#line 36 "../src/parse/lex_conf.re" - - -void Scanner::lex_conf () -{ - tok = cur; - -#line 25 "src/parse/lex_conf.cc" -{ - unsigned char yych; - unsigned int yyaccept = 0; - static const unsigned char yybm[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 64, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 64, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }; - if ((lim - cur) < 27) fill(27); - yych = (unsigned char)*cur; - switch (yych) { - case 'c': goto yy4; - case 'd': goto yy5; - case 'f': goto yy6; - case 'i': goto yy7; - case 'l': goto yy8; - case 's': goto yy9; - case 'v': goto yy10; - case 'y': goto yy11; - default: goto yy2; - } -yy2: - ++cur; -yy3: -#line 42 "../src/parse/lex_conf.re" - { fatal ((tok - pos) - tchar, "unrecognized configuration"); } -#line 81 "src/parse/lex_conf.cc" -yy4: - yyaccept = 0; - yych = (unsigned char)*(ptr = ++cur); - if (yych == 'g') goto yy12; - if (yych == 'o') goto yy14; - goto yy3; -yy5: - yyaccept = 0; - yych = (unsigned char)*(ptr = ++cur); - if (yych == 'e') goto yy15; - goto yy3; -yy6: - yyaccept = 0; - yych = (unsigned char)*(ptr = ++cur); - if (yych == 'l') goto yy16; - goto yy3; -yy7: - yyaccept = 0; - yych = (unsigned char)*(ptr = ++cur); - if (yych == 'n') goto yy17; - goto yy3; -yy8: - yyaccept = 0; - yych = (unsigned char)*(ptr = ++cur); - if (yych == 'a') goto yy18; - goto yy3; -yy9: - yyaccept = 0; - yych = (unsigned char)*(ptr = ++cur); - if (yych == 't') goto yy19; - goto yy3; -yy10: - yyaccept = 0; - yych = (unsigned char)*(ptr = ++cur); - if (yych == 'a') goto yy20; - goto yy3; -yy11: - yyaccept = 0; - yych = (unsigned char)*(ptr = ++cur); - if (yych == 'y') goto yy21; - goto yy3; -yy12: - yych = (unsigned char)*++cur; - if (yych == 'o') goto yy22; -yy13: - cur = ptr; - if (yyaccept <= 5) { - if (yyaccept <= 2) { - if (yyaccept <= 1) { - if (yyaccept == 0) { - goto yy3; - } else { - goto yy119; - } - } else { - goto yy161; - } - } else { - if (yyaccept <= 4) { - if (yyaccept == 3) { - goto yy206; - } else { - goto yy255; - } - } else { - goto yy321; - } - } - } else { - if (yyaccept <= 8) { - if (yyaccept <= 7) { - if (yyaccept == 6) { - goto yy356; - } else { - goto yy377; - } - } else { - goto yy383; - } - } else { - if (yyaccept == 9) { - goto yy420; - } else { - goto yy423; - } - } - } -yy14: - yych = (unsigned char)*++cur; - if (yych == 'n') goto yy23; - goto yy13; -yy15: - yych = (unsigned char)*++cur; - if (yych == 'f') goto yy24; - goto yy13; -yy16: - yych = (unsigned char)*++cur; - if (yych == 'a') goto yy25; - goto yy13; -yy17: - yych = (unsigned char)*++cur; - if (yych == 'd') goto yy26; - goto yy13; -yy18: - yych = (unsigned char)*++cur; - if (yych == 'b') goto yy27; - goto yy13; -yy19: - yych = (unsigned char)*++cur; - if (yych == 'a') goto yy28; - goto yy13; -yy20: - yych = (unsigned char)*++cur; - if (yych == 'r') goto yy29; - goto yy13; -yy21: - yych = (unsigned char)*++cur; - if (yych <= 'c') { - if (yych <= 'a') goto yy13; - if (yych <= 'b') goto yy30; - goto yy31; - } else { - if (yych == 'f') goto yy32; - goto yy13; - } -yy22: - yych = (unsigned char)*++cur; - if (yych == 't') goto yy33; - goto yy13; -yy23: - yych = (unsigned char)*++cur; - if (yych == 'd') goto yy34; - goto yy13; -yy24: - yych = (unsigned char)*++cur; - if (yych == 'i') goto yy35; - goto yy13; -yy25: - yych = (unsigned char)*++cur; - if (yych == 'g') goto yy36; - goto yy13; -yy26: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy37; - goto yy13; -yy27: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy38; - goto yy13; -yy28: - yych = (unsigned char)*++cur; - if (yych == 'r') goto yy39; - if (yych == 't') goto yy40; - goto yy13; -yy29: - yych = (unsigned char)*++cur; - if (yych == 'i') goto yy41; - goto yy13; -yy30: - yych = (unsigned char)*++cur; - if (yych == 'm') goto yy42; - goto yy13; -yy31: - yych = (unsigned char)*++cur; - if (yych == 'h') goto yy43; - goto yy13; -yy32: - yych = (unsigned char)*++cur; - if (yych == 'i') goto yy44; - goto yy13; -yy33: - yych = (unsigned char)*++cur; - if (yych == 'o') goto yy45; - goto yy13; -yy34: - yych = (unsigned char)*++cur; - if (yych <= 'd') { - if (yych == ':') goto yy46; - goto yy13; - } else { - if (yych <= 'e') goto yy47; - if (yych == 'p') goto yy48; - goto yy13; - } -yy35: - yych = (unsigned char)*++cur; - if (yych == 'n') goto yy49; - goto yy13; -yy36: - yych = (unsigned char)*++cur; - if (yych == 's') goto yy50; - goto yy13; -yy37: - yych = (unsigned char)*++cur; - if (yych == 'n') goto yy51; - goto yy13; -yy38: - yych = (unsigned char)*++cur; - if (yych == 'l') goto yy52; - goto yy13; -yy39: - yych = (unsigned char)*++cur; - if (yych == 't') goto yy53; - goto yy13; -yy40: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy54; - goto yy13; -yy41: - yych = (unsigned char)*++cur; - if (yych == 'a') goto yy55; - goto yy13; -yy42: - yych = (unsigned char)*++cur; - if (yych == ':') goto yy56; - goto yy13; -yy43: - yych = (unsigned char)*++cur; - if (yych == ':') goto yy57; - goto yy13; -yy44: - yych = (unsigned char)*++cur; - if (yych == 'l') goto yy58; - goto yy13; -yy45: - yych = (unsigned char)*++cur; - if (yych == ':') goto yy59; - goto yy13; -yy46: - yych = (unsigned char)*++cur; - if (yych == 'd') goto yy60; - if (yych == 'g') goto yy61; - goto yy13; -yy47: - yych = (unsigned char)*++cur; - if (yych == 'n') goto yy62; - goto yy13; -yy48: - yych = (unsigned char)*++cur; - if (yych == 'r') goto yy63; - goto yy13; -yy49: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy64; - goto yy13; -yy50: - yych = (unsigned char)*++cur; - if (yych == ':') goto yy65; - goto yy13; -yy51: - yych = (unsigned char)*++cur; - if (yych == 't') goto yy66; - goto yy13; -yy52: - yych = (unsigned char)*++cur; - if (yych == ':') goto yy67; - if (yych == 'p') goto yy68; - goto yy13; -yy53: - yych = (unsigned char)*++cur; - if (yych == 'l') goto yy69; - goto yy13; -yy54: - yych = (unsigned char)*++cur; - if (yych == ':') goto yy70; - goto yy13; -yy55: - yych = (unsigned char)*++cur; - if (yych == 'b') goto yy71; - goto yy13; -yy56: - yych = (unsigned char)*++cur; - if (yych == 'h') goto yy72; - goto yy13; -yy57: - yych = (unsigned char)*++cur; - if (yych == 'c') goto yy73; - if (yych == 'e') goto yy74; - goto yy13; -yy58: - yych = (unsigned char)*++cur; - if (yych == 'l') goto yy75; - goto yy13; -yy59: - yych = (unsigned char)*++cur; - if (yych == 't') goto yy76; - goto yy13; -yy60: - yych = (unsigned char)*++cur; - if (yych == 'i') goto yy77; - goto yy13; -yy61: - yych = (unsigned char)*++cur; - if (yych == 'o') goto yy78; - goto yy13; -yy62: - yych = (unsigned char)*++cur; - if (yych == 'u') goto yy79; - goto yy13; -yy63: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy80; - goto yy13; -yy64: - yych = (unsigned char)*++cur; - if (yych == ':') goto yy81; - goto yy13; -yy65: - yych = (unsigned char)*++cur; - if (yych <= 'e') { - if (yych == '8') goto yy82; - if (yych <= 'd') goto yy13; - goto yy82; - } else { - if (yych <= 'u') { - if (yych <= 't') goto yy13; - goto yy82; - } else { - if (yych <= 'v') goto yy13; - if (yych <= 'x') goto yy82; - goto yy13; - } - } -yy66: - yych = (unsigned char)*++cur; - if (yych == ':') goto yy84; - goto yy13; -yy67: - yych = (unsigned char)*++cur; - if (yych == 'y') goto yy85; - goto yy13; -yy68: - yych = (unsigned char)*++cur; - if (yych == 'r') goto yy86; - goto yy13; -yy69: - yych = (unsigned char)*++cur; - if (yych == 'a') goto yy87; - goto yy13; -yy70: - yych = (unsigned char)*++cur; - if (yych == 'a') goto yy88; - if (yych == 'n') goto yy89; - goto yy13; -yy71: - yych = (unsigned char)*++cur; - if (yych == 'l') goto yy90; - goto yy13; -yy72: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy91; - goto yy13; -yy73: - yych = (unsigned char)*++cur; - if (yych == 'o') goto yy92; - goto yy13; -yy74: - yych = (unsigned char)*++cur; - if (yych == 'm') goto yy93; - goto yy13; -yy75: - yych = (unsigned char)*++cur; - if (yych == ':') goto yy94; - goto yy13; -yy76: - yych = (unsigned char)*++cur; - if (yych == 'h') goto yy95; - goto yy13; -yy77: - yych = (unsigned char)*++cur; - if (yych == 'v') goto yy96; - goto yy13; -yy78: - yych = (unsigned char)*++cur; - if (yych == 't') goto yy97; - goto yy13; -yy79: - yych = (unsigned char)*++cur; - if (yych == 'm') goto yy98; - goto yy13; -yy80: - yych = (unsigned char)*++cur; - if (yych == 'f') goto yy99; - goto yy13; -yy81: - yych = (unsigned char)*++cur; - if (yych == 'Y') goto yy100; - goto yy13; -yy82: - ++cur; -#line 45 "../src/parse/lex_conf.re" - { - Enc::type_t enc = Enc::ASCII; - switch (cur[-1]) - { - case 'e': enc = Enc::EBCDIC; break; - case 'w': enc = Enc::UCS2; break; - case 'x': enc = Enc::UTF16; break; - case 'u': enc = Enc::UTF32; break; - case '8': enc = Enc::UTF8; break; - } - const int32_t n = lex_conf_number (); - if (n == 0) - { - opts.unset_encoding (enc); - } - else if (!opts.set_encoding (enc)) - { - fatalf ("Cannot set %s encoding: please reset %s encoding first" - , Enc::name (enc) - , Enc::name (opts->encoding.type ())); - } - return; - } -#line 496 "src/parse/lex_conf.cc" -yy84: - yych = (unsigned char)*++cur; - if (yych <= 'r') goto yy13; - if (yych <= 's') goto yy101; - if (yych <= 't') goto yy102; - goto yy13; -yy85: - yych = (unsigned char)*++cur; - if (yych == 'y') goto yy103; - goto yy13; -yy86: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy104; - goto yy13; -yy87: - yych = (unsigned char)*++cur; - if (yych == 'b') goto yy105; - goto yy13; -yy88: - yych = (unsigned char)*++cur; - if (yych == 'b') goto yy106; - goto yy13; -yy89: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy107; - goto yy13; -yy90: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy108; - goto yy13; -yy91: - yych = (unsigned char)*++cur; - if (yych == 'x') goto yy109; - goto yy13; -yy92: - yych = (unsigned char)*++cur; - if (yych == 'n') goto yy111; - goto yy13; -yy93: - yych = (unsigned char)*++cur; - if (yych == 'i') goto yy112; - goto yy13; -yy94: - yych = (unsigned char)*++cur; - if (yych <= 'd') { - if (yych == 'c') goto yy113; - goto yy13; - } else { - if (yych <= 'e') goto yy114; - if (yych == 'p') goto yy115; - goto yy13; - } -yy95: - yych = (unsigned char)*++cur; - if (yych == 'r') goto yy116; - goto yy13; -yy96: - yych = (unsigned char)*++cur; - if (yych == 'i') goto yy117; - goto yy13; -yy97: - yych = (unsigned char)*++cur; - if (yych == 'o') goto yy118; - goto yy13; -yy98: - yych = (unsigned char)*++cur; - if (yych == 'p') goto yy120; - goto yy13; -yy99: - yych = (unsigned char)*++cur; - if (yych == 'i') goto yy121; - goto yy13; -yy100: - yych = (unsigned char)*++cur; - if (yych == 'Y') goto yy122; - goto yy13; -yy101: - yych = (unsigned char)*++cur; - if (yych == 't') goto yy123; - goto yy13; -yy102: - yych = (unsigned char)*++cur; - if (yych == 'o') goto yy124; - goto yy13; -yy103: - yych = (unsigned char)*++cur; - if (yych == 'F') goto yy125; - if (yych == 'N') goto yy126; - goto yy13; -yy104: - yych = (unsigned char)*++cur; - if (yych == 'f') goto yy127; - goto yy13; -yy105: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy128; - goto yy13; -yy106: - yych = (unsigned char)*++cur; - if (yych == 'o') goto yy129; - goto yy13; -yy107: - yych = (unsigned char)*++cur; - if (yych == 'x') goto yy130; - goto yy13; -yy108: - yych = (unsigned char)*++cur; - if (yych == ':') goto yy131; - goto yy13; -yy109: - ++cur; -#line 95 "../src/parse/lex_conf.re" - { opts.set_yybmHexTable (lex_conf_number () != 0); return; } -#line 610 "src/parse/lex_conf.cc" -yy111: - yych = (unsigned char)*++cur; - if (yych == 'v') goto yy132; - goto yy13; -yy112: - yych = (unsigned char)*++cur; - if (yych == 't') goto yy133; - goto yy13; -yy113: - yych = (unsigned char)*++cur; - if (yych == 'h') goto yy135; - goto yy13; -yy114: - yych = (unsigned char)*++cur; - if (yych == 'n') goto yy136; - goto yy13; -yy115: - yych = (unsigned char)*++cur; - if (yych == 'a') goto yy137; - goto yy13; -yy116: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy138; - goto yy13; -yy117: - yych = (unsigned char)*++cur; - if (yych == 'd') goto yy139; - goto yy13; -yy118: - yyaccept = 1; - yych = (unsigned char)*(ptr = ++cur); - if (yych == '@') goto yy140; -yy119: -#line 79 "../src/parse/lex_conf.re" - { opts.set_condGoto (lex_conf_string ()); return; } -#line 646 "src/parse/lex_conf.cc" -yy120: - yych = (unsigned char)*++cur; - if (yych == 'r') goto yy141; - goto yy13; -yy121: - yych = (unsigned char)*++cur; - if (yych == 'x') goto yy142; - goto yy13; -yy122: - yych = (unsigned char)*++cur; - switch (yych) { - case 'B': goto yy144; - case 'C': goto yy145; - case 'D': goto yy146; - case 'F': goto yy147; - case 'G': goto yy148; - case 'L': goto yy149; - case 'M': goto yy150; - case 'P': goto yy151; - case 'R': goto yy152; - case 'S': goto yy153; - default: goto yy13; - } -yy123: - yych = (unsigned char)*++cur; - if (yych == 'r') goto yy154; - goto yy13; -yy124: - yych = (unsigned char)*++cur; - if (yych == 'p') goto yy155; - goto yy13; -yy125: - yych = (unsigned char)*++cur; - if (yych == 'i') goto yy157; - goto yy13; -yy126: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy158; - goto yy13; -yy127: - yych = (unsigned char)*++cur; - if (yych == 'i') goto yy159; - goto yy13; -yy128: - yych = (unsigned char)*++cur; - if (yych == 'l') goto yy160; - goto yy13; -yy129: - yych = (unsigned char)*++cur; - if (yych == 'r') goto yy162; - goto yy13; -yy130: - yych = (unsigned char)*++cur; - if (yych == 't') goto yy163; - goto yy13; -yy131: - yych = (unsigned char)*++cur; - if (yych == 'y') goto yy164; - goto yy13; -yy132: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy165; - goto yy13; -yy133: - ++cur; -#line 138 "../src/parse/lex_conf.re" - { opts.set_bEmitYYCh (lex_conf_number () != 0); return; } -#line 714 "src/parse/lex_conf.cc" -yy135: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy166; - goto yy13; -yy136: - yych = (unsigned char)*++cur; - if (yych == 'a') goto yy167; - goto yy13; -yy137: - yych = (unsigned char)*++cur; - if (yych == 'r') goto yy168; - goto yy13; -yy138: - yych = (unsigned char)*++cur; - if (yych == 's') goto yy169; - goto yy13; -yy139: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy170; - goto yy13; -yy140: - yych = (unsigned char)*++cur; - if (yych == 'c') goto yy171; - goto yy13; -yy141: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy172; - goto yy13; -yy142: - ++cur; -#line 75 "../src/parse/lex_conf.re" - { opts.set_condPrefix (lex_conf_string ()); return; } -#line 747 "src/parse/lex_conf.cc" -yy144: - yych = (unsigned char)*++cur; - if (yych == 'A') goto yy173; - goto yy13; -yy145: - yych = (unsigned char)*++cur; - if (yych <= 'S') { - if (yych == 'O') goto yy174; - goto yy13; - } else { - if (yych <= 'T') goto yy175; - if (yych <= 'U') goto yy176; - goto yy13; - } -yy146: - yych = (unsigned char)*++cur; - if (yych == 'E') goto yy177; - goto yy13; -yy147: - yych = (unsigned char)*++cur; - if (yych == 'I') goto yy178; - goto yy13; -yy148: - yych = (unsigned char)*++cur; - if (yych == 'E') goto yy179; - goto yy13; -yy149: - yych = (unsigned char)*++cur; - if (yych == 'E') goto yy180; - if (yych == 'I') goto yy181; - goto yy13; -yy150: - yych = (unsigned char)*++cur; - if (yych == 'A') goto yy182; - goto yy13; -yy151: - yych = (unsigned char)*++cur; - if (yych == 'E') goto yy183; - goto yy13; -yy152: - yych = (unsigned char)*++cur; - if (yych == 'E') goto yy184; - goto yy13; -yy153: - yych = (unsigned char)*++cur; - if (yych == 'E') goto yy185; - if (yych == 'K') goto yy186; - goto yy13; -yy154: - yych = (unsigned char)*++cur; - if (yych == 'i') goto yy187; - goto yy13; -yy155: - ++cur; -#line 123 "../src/parse/lex_conf.re" - { - const int32_t n = lex_conf_number (); - if (n < 0) - { - fatal ("configuration 'indent:top' must be nonnegative"); - } - opts.set_topIndent (static_cast (n)); - return; - } -#line 812 "src/parse/lex_conf.cc" -yy157: - yych = (unsigned char)*++cur; - if (yych == 'l') goto yy188; - goto yy13; -yy158: - yych = (unsigned char)*++cur; - if (yych == 'x') goto yy189; - goto yy13; -yy159: - yych = (unsigned char)*++cur; - if (yych == 'x') goto yy190; - goto yy13; -yy160: - yyaccept = 2; - yych = (unsigned char)*(ptr = ++cur); - ctx = cur; - if (yybm[0+yych] & 64) { - goto yy192; - } - if (yych == '=') goto yy194; -yy161: -#line 151 "../src/parse/lex_conf.re" - { out.set_user_start_label (lex_conf_string ()); return; } -#line 836 "src/parse/lex_conf.cc" -yy162: - yych = (unsigned char)*++cur; - if (yych == 't') goto yy196; - goto yy13; -yy163: - yych = (unsigned char)*++cur; - if (yych == 'l') goto yy198; - goto yy13; -yy164: - yych = (unsigned char)*++cur; - if (yych == 'y') goto yy199; - goto yy13; -yy165: - yych = (unsigned char)*++cur; - if (yych == 'r') goto yy200; - goto yy13; -yy166: - yych = (unsigned char)*++cur; - if (yych == 'c') goto yy201; - goto yy13; -yy167: - yych = (unsigned char)*++cur; - if (yych == 'b') goto yy202; - goto yy13; -yy168: - yych = (unsigned char)*++cur; - if (yych == 'a') goto yy203; - goto yy13; -yy169: - yych = (unsigned char)*++cur; - if (yych == 'h') goto yy204; - goto yy13; -yy170: - yych = (unsigned char)*++cur; - if (yych == 'r') goto yy205; - goto yy13; -yy171: - yych = (unsigned char)*++cur; - if (yych == 'o') goto yy207; - goto yy13; -yy172: - yych = (unsigned char)*++cur; - if (yych == 'f') goto yy208; - goto yy13; -yy173: - yych = (unsigned char)*++cur; - if (yych == 'C') goto yy209; - goto yy13; -yy174: - yych = (unsigned char)*++cur; - if (yych == 'N') goto yy210; - goto yy13; -yy175: - yych = (unsigned char)*++cur; - if (yych <= 'W') goto yy13; - if (yych <= 'X') goto yy211; - if (yych <= 'Y') goto yy212; - goto yy13; -yy176: - yych = (unsigned char)*++cur; - if (yych == 'R') goto yy213; - goto yy13; -yy177: - yych = (unsigned char)*++cur; - if (yych == 'B') goto yy214; - goto yy13; -yy178: - yych = (unsigned char)*++cur; - if (yych == 'L') goto yy215; - goto yy13; -yy179: - yych = (unsigned char)*++cur; - if (yych == 'T') goto yy216; - goto yy13; -yy180: - yych = (unsigned char)*++cur; - if (yych == 'S') goto yy217; - goto yy13; -yy181: - yych = (unsigned char)*++cur; - if (yych == 'M') goto yy218; - goto yy13; -yy182: - yych = (unsigned char)*++cur; - if (yych == 'R') goto yy219; - goto yy13; -yy183: - yych = (unsigned char)*++cur; - if (yych == 'E') goto yy220; - goto yy13; -yy184: - yych = (unsigned char)*++cur; - if (yych == 'S') goto yy221; - goto yy13; -yy185: - yych = (unsigned char)*++cur; - if (yych == 'T') goto yy222; - goto yy13; -yy186: - yych = (unsigned char)*++cur; - if (yych == 'I') goto yy223; - goto yy13; -yy187: - yych = (unsigned char)*++cur; - if (yych == 'n') goto yy224; - goto yy13; -yy188: - yych = (unsigned char)*++cur; - if (yych == 'l') goto yy225; - goto yy13; -yy189: - yych = (unsigned char)*++cur; - if (yych == 't') goto yy226; - goto yy13; -yy190: - ++cur; -#line 147 "../src/parse/lex_conf.re" - { opts.set_labelPrefix (lex_conf_string ()); return; } -#line 955 "src/parse/lex_conf.cc" -yy192: - ++cur; - if (lim <= cur) fill(1); - yych = (unsigned char)*cur; - if (yybm[0+yych] & 64) { - goto yy192; - } - if (yych != '=') goto yy13; -yy194: - ++cur; - if ((lim - cur) < 2) fill(2); - yych = (unsigned char)*cur; - if (yych <= ',') { - if (yych <= '\t') { - if (yych <= 0x08) goto yy13; - goto yy194; - } else { - if (yych == ' ') goto yy194; - goto yy13; - } - } else { - if (yych <= '/') { - if (yych <= '-') goto yy228; - goto yy13; - } else { - if (yych <= '0') goto yy229; - if (yych <= '9') goto yy231; - goto yy13; - } - } -yy196: - ++cur; -#line 90 "../src/parse/lex_conf.re" - { opts.set_bUseStateAbort (lex_conf_number () != 0); return; } -#line 990 "src/parse/lex_conf.cc" -yy198: - yych = (unsigned char)*++cur; - if (yych == 'a') goto yy233; - goto yy13; -yy199: - yych = (unsigned char)*++cur; - if (yych <= 'c') { - if (yych <= '`') goto yy13; - if (yych <= 'a') goto yy234; - if (yych <= 'b') goto yy235; - goto yy236; - } else { - if (yych <= 'r') goto yy13; - if (yych <= 's') goto yy237; - if (yych <= 't') goto yy238; - goto yy13; - } -yy200: - yych = (unsigned char)*++cur; - if (yych == 's') goto yy239; - goto yy13; -yy201: - yych = (unsigned char)*++cur; - if (yych == 'k') goto yy240; - goto yy13; -yy202: - yych = (unsigned char)*++cur; - if (yych == 'l') goto yy242; - goto yy13; -yy203: - yych = (unsigned char)*++cur; - if (yych == 'm') goto yy243; - goto yy13; -yy204: - yych = (unsigned char)*++cur; - if (yych == 'o') goto yy244; - goto yy13; -yy205: - yyaccept = 3; - yych = (unsigned char)*(ptr = ++cur); - if (yych == '@') goto yy245; -yy206: -#line 77 "../src/parse/lex_conf.re" - { opts.set_condDivider (lex_conf_string ()); return; } -#line 1035 "src/parse/lex_conf.cc" -yy207: - yych = (unsigned char)*++cur; - if (yych == 'n') goto yy246; - goto yy13; -yy208: - yych = (unsigned char)*++cur; - if (yych == 'i') goto yy247; - goto yy13; -yy209: - yych = (unsigned char)*++cur; - if (yych == 'K') goto yy248; - goto yy13; -yy210: - yych = (unsigned char)*++cur; - if (yych == 'D') goto yy249; - goto yy13; -yy211: - yych = (unsigned char)*++cur; - if (yych == 'M') goto yy250; - goto yy13; -yy212: - yych = (unsigned char)*++cur; - if (yych == 'P') goto yy251; - goto yy13; -yy213: - yych = (unsigned char)*++cur; - if (yych == 'S') goto yy252; - goto yy13; -yy214: - yych = (unsigned char)*++cur; - if (yych == 'U') goto yy253; - goto yy13; -yy215: - yych = (unsigned char)*++cur; - if (yych == 'L') goto yy254; - goto yy13; -yy216: - yych = (unsigned char)*++cur; - if (yych == 'C') goto yy256; - if (yych == 'S') goto yy257; - goto yy13; -yy217: - yych = (unsigned char)*++cur; - if (yych == 'S') goto yy258; - goto yy13; -yy218: - yych = (unsigned char)*++cur; - if (yych == 'I') goto yy259; - goto yy13; -yy219: - yych = (unsigned char)*++cur; - if (yych == 'K') goto yy260; - goto yy13; -yy220: - yych = (unsigned char)*++cur; - if (yych == 'K') goto yy261; - goto yy13; -yy221: - yych = (unsigned char)*++cur; - if (yych == 'T') goto yy263; - goto yy13; -yy222: - yych = (unsigned char)*++cur; - if (yych == 'C') goto yy264; - if (yych == 'S') goto yy265; - goto yy13; -yy223: - yych = (unsigned char)*++cur; - if (yych == 'P') goto yy266; - goto yy13; -yy224: - yych = (unsigned char)*++cur; - if (yych == 'g') goto yy268; - goto yy13; -yy225: - yych = (unsigned char)*++cur; - if (yych == 'L') goto yy270; - goto yy13; -yy226: - ++cur; -#line 89 "../src/parse/lex_conf.re" - { opts.set_yynext (lex_conf_string ()); return; } -#line 1118 "src/parse/lex_conf.cc" -yy228: - yych = (unsigned char)*++cur; - if (yych <= '0') goto yy13; - if (yych <= '9') goto yy231; - goto yy13; -yy229: - ++cur; -yy230: - cur = ctx; -#line 150 "../src/parse/lex_conf.re" - { out.set_force_start_label (lex_conf_number () != 0); return; } -#line 1130 "src/parse/lex_conf.cc" -yy231: - ++cur; - if (lim <= cur) fill(1); - yych = (unsigned char)*cur; - if (yybm[0+yych] & 128) { - goto yy231; - } - goto yy230; -yy233: - yych = (unsigned char)*++cur; - if (yych == 'b') goto yy271; - goto yy13; -yy234: - yych = (unsigned char)*++cur; - if (yych == 'c') goto yy272; - goto yy13; -yy235: - yych = (unsigned char)*++cur; - if (yych == 'm') goto yy273; - goto yy13; -yy236: - yych = (unsigned char)*++cur; - if (yych == 'h') goto yy275; - if (yych == 't') goto yy277; - goto yy13; -yy237: - yych = (unsigned char)*++cur; - if (yych == 't') goto yy278; - goto yy13; -yy238: - yych = (unsigned char)*++cur; - if (yych == 'a') goto yy279; - goto yy13; -yy239: - yych = (unsigned char)*++cur; - if (yych == 'i') goto yy280; - goto yy13; -yy240: - ++cur; -#line 145 "../src/parse/lex_conf.re" - { opts.set_fill_check (lex_conf_number () != 0); return; } -#line 1172 "src/parse/lex_conf.cc" -yy242: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy281; - goto yy13; -yy243: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy283; - goto yy13; -yy244: - yych = (unsigned char)*++cur; - if (yych == 'l') goto yy284; - goto yy13; -yy245: - yych = (unsigned char)*++cur; - if (yych == 'c') goto yy285; - goto yy13; -yy246: - yych = (unsigned char)*++cur; - if (yych == 'd') goto yy286; - goto yy13; -yy247: - yych = (unsigned char)*++cur; - if (yych == 'x') goto yy288; - goto yy13; -yy248: - yych = (unsigned char)*++cur; - if (yych == 'U') goto yy290; - goto yy13; -yy249: - yych = (unsigned char)*++cur; - if (yych == 'T') goto yy291; - goto yy13; -yy250: - yych = (unsigned char)*++cur; - if (yych == 'A') goto yy292; - goto yy13; -yy251: - yych = (unsigned char)*++cur; - if (yych == 'E') goto yy293; - goto yy13; -yy252: - yych = (unsigned char)*++cur; - if (yych == 'O') goto yy295; - goto yy13; -yy253: - yych = (unsigned char)*++cur; - if (yych == 'G') goto yy296; - goto yy13; -yy254: - yyaccept = 4; - yych = (unsigned char)*(ptr = ++cur); - if (yych == ':') goto yy298; - if (yych == '@') goto yy299; -yy255: -#line 140 "../src/parse/lex_conf.re" - { opts.set_fill (lex_conf_string ()); return; } -#line 1229 "src/parse/lex_conf.cc" -yy256: - yych = (unsigned char)*++cur; - if (yych == 'O') goto yy300; - goto yy13; -yy257: - yych = (unsigned char)*++cur; - if (yych == 'T') goto yy301; - goto yy13; -yy258: - yych = (unsigned char)*++cur; - if (yych == 'T') goto yy302; - goto yy13; -yy259: - yych = (unsigned char)*++cur; - if (yych == 'T') goto yy303; - goto yy13; -yy260: - yych = (unsigned char)*++cur; - if (yych == 'E') goto yy305; - goto yy13; -yy261: - ++cur; -#line 113 "../src/parse/lex_conf.re" - { opts.set_yypeek (lex_conf_string ()); return; } -#line 1254 "src/parse/lex_conf.cc" -yy263: - yych = (unsigned char)*++cur; - if (yych == 'O') goto yy306; - goto yy13; -yy264: - yych = (unsigned char)*++cur; - if (yych == 'O') goto yy307; - goto yy13; -yy265: - yych = (unsigned char)*++cur; - if (yych == 'T') goto yy308; - goto yy13; -yy266: - ++cur; -#line 114 "../src/parse/lex_conf.re" - { opts.set_yyskip (lex_conf_string ()); return; } -#line 1271 "src/parse/lex_conf.cc" -yy268: - ++cur; -#line 121 "../src/parse/lex_conf.re" - { opts.set_indString (lex_conf_string ()); return; } -#line 1276 "src/parse/lex_conf.cc" -yy270: - yych = (unsigned char)*++cur; - if (yych == 'a') goto yy309; - goto yy13; -yy271: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy310; - goto yy13; -yy272: - yych = (unsigned char)*++cur; - if (yych == 'c') goto yy311; - goto yy13; -yy273: - ++cur; -#line 94 "../src/parse/lex_conf.re" - { opts.set_yybm (lex_conf_string ()); return; } -#line 1293 "src/parse/lex_conf.cc" -yy275: - ++cur; -#line 136 "../src/parse/lex_conf.re" - { opts.set_yych (lex_conf_string ()); return; } -#line 1298 "src/parse/lex_conf.cc" -yy277: - yych = (unsigned char)*++cur; - if (yych == 'a') goto yy312; - goto yy13; -yy278: - yych = (unsigned char)*++cur; - if (yych == 'a') goto yy313; - goto yy13; -yy279: - yych = (unsigned char)*++cur; - if (yych == 'r') goto yy314; - goto yy13; -yy280: - yych = (unsigned char)*++cur; - if (yych == 'o') goto yy315; - goto yy13; -yy281: - ++cur; -#line 141 "../src/parse/lex_conf.re" - { opts.set_fill_use (lex_conf_number () != 0); return; } -#line 1319 "src/parse/lex_conf.cc" -yy283: - yych = (unsigned char)*++cur; - if (yych == 't') goto yy316; - goto yy13; -yy284: - yych = (unsigned char)*++cur; - if (yych == 'd') goto yy317; - goto yy13; -yy285: - yych = (unsigned char)*++cur; - if (yych == 'o') goto yy319; - goto yy13; -yy286: - ++cur; -#line 80 "../src/parse/lex_conf.re" - { opts.set_condGotoParam (lex_conf_string ()); return; } -#line 1336 "src/parse/lex_conf.cc" -yy288: - ++cur; -#line 76 "../src/parse/lex_conf.re" - { opts.set_condEnumPrefix (lex_conf_string ()); return; } -#line 1341 "src/parse/lex_conf.cc" -yy290: - yych = (unsigned char)*++cur; - if (yych == 'P') goto yy320; - goto yy13; -yy291: - yych = (unsigned char)*++cur; - if (yych == 'Y') goto yy322; - goto yy13; -yy292: - yych = (unsigned char)*++cur; - if (yych == 'R') goto yy323; - goto yy13; -yy293: - ++cur; -#line 135 "../src/parse/lex_conf.re" - { opts.set_yyctype (lex_conf_string ()); return; } -#line 1358 "src/parse/lex_conf.cc" -yy295: - yych = (unsigned char)*++cur; - if (yych == 'R') goto yy324; - goto yy13; -yy296: - ++cur; -#line 133 "../src/parse/lex_conf.re" - { opts.set_yydebug (lex_conf_string ()); return; } -#line 1367 "src/parse/lex_conf.cc" -yy298: - yych = (unsigned char)*++cur; - if (yych == 'n') goto yy326; - goto yy13; -yy299: - yych = (unsigned char)*++cur; - if (yych == 'l') goto yy327; - goto yy13; -yy300: - yych = (unsigned char)*++cur; - if (yych == 'N') goto yy328; - goto yy13; -yy301: - yych = (unsigned char)*++cur; - if (yych == 'A') goto yy329; - goto yy13; -yy302: - yych = (unsigned char)*++cur; - if (yych == 'H') goto yy330; - goto yy13; -yy303: - ++cur; -#line 111 "../src/parse/lex_conf.re" - { opts.set_yylimit (lex_conf_string ()); return; } -#line 1392 "src/parse/lex_conf.cc" -yy305: - yych = (unsigned char)*++cur; - if (yych == 'R') goto yy331; - goto yy13; -yy306: - yych = (unsigned char)*++cur; - if (yych == 'R') goto yy333; - goto yy13; -yy307: - yych = (unsigned char)*++cur; - if (yych == 'N') goto yy334; - goto yy13; -yy308: - yych = (unsigned char)*++cur; - if (yych == 'A') goto yy335; - goto yy13; -yy309: - yych = (unsigned char)*++cur; - if (yych == 'b') goto yy336; - goto yy13; -yy310: - yych = (unsigned char)*++cur; - if (yych == 'l') goto yy337; - goto yy13; -yy311: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy339; - goto yy13; -yy312: - yych = (unsigned char)*++cur; - if (yych == 'b') goto yy340; - goto yy13; -yy313: - yych = (unsigned char)*++cur; - if (yych == 'b') goto yy341; - goto yy13; -yy314: - yych = (unsigned char)*++cur; - if (yych == 'g') goto yy342; - goto yy13; -yy315: - yych = (unsigned char)*++cur; - if (yych == 'n') goto yy343; - goto yy13; -yy316: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy345; - goto yy13; -yy317: - ++cur; -#line 97 "../src/parse/lex_conf.re" - { - const int32_t n = lex_conf_number (); - if (n < 0) - { - fatal ("configuration 'cgoto:threshold' must be nonnegative"); - } - opts.set_cGotoThreshold (static_cast (n)); - return; - } -#line 1453 "src/parse/lex_conf.cc" -yy319: - yych = (unsigned char)*++cur; - if (yych == 'n') goto yy346; - goto yy13; -yy320: - yyaccept = 5; - yych = (unsigned char)*(ptr = ++cur); - if (yych == 'C') goto yy347; -yy321: -#line 115 "../src/parse/lex_conf.re" - { opts.set_yybackup (lex_conf_string ()); return; } -#line 1465 "src/parse/lex_conf.cc" -yy322: - yych = (unsigned char)*++cur; - if (yych == 'P') goto yy348; - goto yy13; -yy323: - yych = (unsigned char)*++cur; - if (yych == 'K') goto yy349; - goto yy13; -yy324: - ++cur; -#line 108 "../src/parse/lex_conf.re" - { opts.set_yycursor (lex_conf_string ()); return; } -#line 1478 "src/parse/lex_conf.cc" -yy326: - yych = (unsigned char)*++cur; - if (yych == 'a') goto yy350; - goto yy13; -yy327: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy351; - goto yy13; -yy328: - yych = (unsigned char)*++cur; - if (yych == 'D') goto yy352; - goto yy13; -yy329: - yych = (unsigned char)*++cur; - if (yych == 'T') goto yy353; - goto yy13; -yy330: - yych = (unsigned char)*++cur; - if (yych == 'A') goto yy354; - goto yy13; -yy331: - ++cur; -#line 109 "../src/parse/lex_conf.re" - { opts.set_yymarker (lex_conf_string ()); return; } -#line 1503 "src/parse/lex_conf.cc" -yy333: - yych = (unsigned char)*++cur; - if (yych == 'E') goto yy355; - goto yy13; -yy334: - yych = (unsigned char)*++cur; - if (yych == 'D') goto yy357; - goto yy13; -yy335: - yych = (unsigned char)*++cur; - if (yych == 'T') goto yy358; - goto yy13; -yy336: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy359; - goto yy13; -yy337: - ++cur; -#line 91 "../src/parse/lex_conf.re" - { opts.set_bUseStateNext (lex_conf_number () != 0); return; } -#line 1524 "src/parse/lex_conf.cc" -yy339: - yych = (unsigned char)*++cur; - if (yych == 'p') goto yy360; - goto yy13; -yy340: - yych = (unsigned char)*++cur; - if (yych == 'l') goto yy361; - goto yy13; -yy341: - yych = (unsigned char)*++cur; - if (yych == 'l') goto yy362; - goto yy13; -yy342: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy363; - goto yy13; -yy343: - ++cur; -#line 137 "../src/parse/lex_conf.re" - { opts.set_yychConversion (lex_conf_number () != 0); return; } -#line 1545 "src/parse/lex_conf.cc" -yy345: - yych = (unsigned char)*++cur; - if (yych == 'r') goto yy364; - goto yy13; -yy346: - yych = (unsigned char)*++cur; - if (yych == 'd') goto yy366; - goto yy13; -yy347: - yych = (unsigned char)*++cur; - if (yych == 'T') goto yy368; - goto yy13; -yy348: - yych = (unsigned char)*++cur; - if (yych == 'E') goto yy369; - goto yy13; -yy349: - yych = (unsigned char)*++cur; - if (yych == 'E') goto yy371; - goto yy13; -yy350: - yych = (unsigned char)*++cur; - if (yych == 'k') goto yy372; - goto yy13; -yy351: - yych = (unsigned char)*++cur; - if (yych == 'n') goto yy373; - goto yy13; -yy352: - yych = (unsigned char)*++cur; - if (yych == 'I') goto yy375; - goto yy13; -yy353: - yych = (unsigned char)*++cur; - if (yych == 'E') goto yy376; - goto yy13; -yy354: - yych = (unsigned char)*++cur; - if (yych == 'N') goto yy378; - goto yy13; -yy355: - yyaccept = 6; - yych = (unsigned char)*(ptr = ++cur); - if (yych == 'C') goto yy380; -yy356: -#line 117 "../src/parse/lex_conf.re" - { opts.set_yyrestore (lex_conf_string ()); return; } -#line 1593 "src/parse/lex_conf.cc" -yy357: - yych = (unsigned char)*++cur; - if (yych == 'I') goto yy381; - goto yy13; -yy358: - yych = (unsigned char)*++cur; - if (yych == 'E') goto yy382; - goto yy13; -yy359: - yych = (unsigned char)*++cur; - if (yych == 'l') goto yy384; - goto yy13; -yy360: - yych = (unsigned char)*++cur; - if (yych == 't') goto yy386; - goto yy13; -yy361: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy388; - goto yy13; -yy362: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy390; - goto yy13; -yy363: - yych = (unsigned char)*++cur; - if (yych == 't') goto yy392; - goto yy13; -yy364: - ++cur; -#line 143 "../src/parse/lex_conf.re" - { opts.set_fill_arg_use (lex_conf_number () != 0); return; } -#line 1626 "src/parse/lex_conf.cc" -yy366: - ++cur; -#line 78 "../src/parse/lex_conf.re" - { opts.set_condDividerParam (lex_conf_string ()); return; } -#line 1631 "src/parse/lex_conf.cc" -yy368: - yych = (unsigned char)*++cur; - if (yych == 'X') goto yy394; - goto yy13; -yy369: - ++cur; -#line 69 "../src/parse/lex_conf.re" - { opts.set_yycondtype (lex_conf_string ()); return; } -#line 1640 "src/parse/lex_conf.cc" -yy371: - yych = (unsigned char)*++cur; - if (yych == 'R') goto yy396; - goto yy13; -yy372: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy398; - goto yy13; -yy373: - ++cur; -#line 142 "../src/parse/lex_conf.re" - { opts.set_fill_arg (lex_conf_string ()); return; } -#line 1653 "src/parse/lex_conf.cc" -yy375: - yych = (unsigned char)*++cur; - if (yych == 'T') goto yy399; - goto yy13; -yy376: - yyaccept = 7; - yych = (unsigned char)*(ptr = ++cur); - if (yych == ':') goto yy400; -yy377: -#line 83 "../src/parse/lex_conf.re" - { opts.set_state_get (lex_conf_string ()); return; } -#line 1665 "src/parse/lex_conf.cc" -yy378: - ++cur; -#line 119 "../src/parse/lex_conf.re" - { opts.set_yylessthan (lex_conf_string ()); return; } -#line 1670 "src/parse/lex_conf.cc" -yy380: - yych = (unsigned char)*++cur; - if (yych == 'T') goto yy401; - goto yy13; -yy381: - yych = (unsigned char)*++cur; - if (yych == 'T') goto yy402; - goto yy13; -yy382: - yyaccept = 8; - yych = (unsigned char)*(ptr = ++cur); - if (yych == ':') goto yy403; - if (yych == '@') goto yy404; -yy383: -#line 85 "../src/parse/lex_conf.re" - { opts.set_state_set (lex_conf_string ()); return; } -#line 1687 "src/parse/lex_conf.cc" -yy384: - ++cur; -#line 88 "../src/parse/lex_conf.re" - { opts.set_yyfilllabel (lex_conf_string ()); return; } -#line 1692 "src/parse/lex_conf.cc" -yy386: - ++cur; -#line 92 "../src/parse/lex_conf.re" - { opts.set_yyaccept (lex_conf_string ()); return; } -#line 1697 "src/parse/lex_conf.cc" -yy388: - ++cur; -#line 81 "../src/parse/lex_conf.re" - { opts.set_yyctable (lex_conf_string ()); return; } -#line 1702 "src/parse/lex_conf.cc" -yy390: - ++cur; -#line 154 "../src/parse/lex_conf.re" - { lex_conf_string (); return; } -#line 1707 "src/parse/lex_conf.cc" -yy392: - ++cur; -#line 106 "../src/parse/lex_conf.re" - { opts.set_yytarget (lex_conf_string ()); return; } -#line 1712 "src/parse/lex_conf.cc" -yy394: - ++cur; -#line 116 "../src/parse/lex_conf.re" - { opts.set_yybackupctx (lex_conf_string ()); return; } -#line 1717 "src/parse/lex_conf.cc" -yy396: - ++cur; -#line 110 "../src/parse/lex_conf.re" - { opts.set_yyctxmarker (lex_conf_string ()); return; } -#line 1722 "src/parse/lex_conf.cc" -yy398: - yych = (unsigned char)*++cur; - if (yych == 'd') goto yy405; - goto yy13; -yy399: - yych = (unsigned char)*++cur; - if (yych == 'I') goto yy407; - goto yy13; -yy400: - yych = (unsigned char)*++cur; - if (yych == 'n') goto yy408; - goto yy13; -yy401: - yych = (unsigned char)*++cur; - if (yych == 'X') goto yy409; - goto yy13; -yy402: - yych = (unsigned char)*++cur; - if (yych == 'I') goto yy411; - goto yy13; -yy403: - yych = (unsigned char)*++cur; - if (yych == 'n') goto yy412; - goto yy13; -yy404: - yych = (unsigned char)*++cur; - if (yych == 's') goto yy413; - goto yy13; -yy405: - ++cur; -#line 144 "../src/parse/lex_conf.re" - { opts.set_fill_naked (lex_conf_number () != 0); return; } -#line 1755 "src/parse/lex_conf.cc" -yy407: - yych = (unsigned char)*++cur; - if (yych == 'O') goto yy414; - goto yy13; -yy408: - yych = (unsigned char)*++cur; - if (yych == 'a') goto yy415; - goto yy13; -yy409: - ++cur; -#line 118 "../src/parse/lex_conf.re" - { opts.set_yyrestorectx (lex_conf_string ()); return; } -#line 1768 "src/parse/lex_conf.cc" -yy411: - yych = (unsigned char)*++cur; - if (yych == 'O') goto yy416; - goto yy13; -yy412: - yych = (unsigned char)*++cur; - if (yych == 'a') goto yy417; - goto yy13; -yy413: - yych = (unsigned char)*++cur; - if (yych == 't') goto yy418; - goto yy13; -yy414: - yych = (unsigned char)*++cur; - if (yych == 'N') goto yy419; - goto yy13; -yy415: - yych = (unsigned char)*++cur; - if (yych == 'k') goto yy421; - goto yy13; -yy416: - yych = (unsigned char)*++cur; - if (yych == 'N') goto yy422; - goto yy13; -yy417: - yych = (unsigned char)*++cur; - if (yych == 'k') goto yy424; - goto yy13; -yy418: - yych = (unsigned char)*++cur; - if (yych == 'a') goto yy425; - goto yy13; -yy419: - yyaccept = 9; - yych = (unsigned char)*(ptr = ++cur); - if (yych == ':') goto yy426; -yy420: -#line 70 "../src/parse/lex_conf.re" - { opts.set_cond_get (lex_conf_string ()); return; } -#line 1808 "src/parse/lex_conf.cc" -yy421: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy427; - goto yy13; -yy422: - yyaccept = 10; - yych = (unsigned char)*(ptr = ++cur); - if (yych == ':') goto yy428; - if (yych == '@') goto yy429; -yy423: -#line 72 "../src/parse/lex_conf.re" - { opts.set_cond_set (lex_conf_string ()); return; } -#line 1821 "src/parse/lex_conf.cc" -yy424: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy430; - goto yy13; -yy425: - yych = (unsigned char)*++cur; - if (yych == 't') goto yy431; - goto yy13; -yy426: - yych = (unsigned char)*++cur; - if (yych == 'n') goto yy432; - goto yy13; -yy427: - yych = (unsigned char)*++cur; - if (yych == 'd') goto yy433; - goto yy13; -yy428: - yych = (unsigned char)*++cur; - if (yych == 'n') goto yy435; - goto yy13; -yy429: - yych = (unsigned char)*++cur; - if (yych == 'c') goto yy436; - goto yy13; -yy430: - yych = (unsigned char)*++cur; - if (yych == 'd') goto yy437; - goto yy13; -yy431: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy439; - goto yy13; -yy432: - yych = (unsigned char)*++cur; - if (yych == 'a') goto yy441; - goto yy13; -yy433: - ++cur; -#line 84 "../src/parse/lex_conf.re" - { opts.set_state_get_naked (lex_conf_number () != 0); return; } -#line 1862 "src/parse/lex_conf.cc" -yy435: - yych = (unsigned char)*++cur; - if (yych == 'a') goto yy442; - goto yy13; -yy436: - yych = (unsigned char)*++cur; - if (yych == 'o') goto yy443; - goto yy13; -yy437: - ++cur; -#line 86 "../src/parse/lex_conf.re" - { opts.set_state_set_naked (lex_conf_number () != 0); return; } -#line 1875 "src/parse/lex_conf.cc" -yy439: - ++cur; -#line 87 "../src/parse/lex_conf.re" - { opts.set_state_set_arg (lex_conf_string ()); return; } -#line 1880 "src/parse/lex_conf.cc" -yy441: - yych = (unsigned char)*++cur; - if (yych == 'k') goto yy444; - goto yy13; -yy442: - yych = (unsigned char)*++cur; - if (yych == 'k') goto yy445; - goto yy13; -yy443: - yych = (unsigned char)*++cur; - if (yych == 'n') goto yy446; - goto yy13; -yy444: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy447; - goto yy13; -yy445: - yych = (unsigned char)*++cur; - if (yych == 'e') goto yy448; - goto yy13; -yy446: - yych = (unsigned char)*++cur; - if (yych == 'd') goto yy449; - goto yy13; -yy447: - yych = (unsigned char)*++cur; - if (yych == 'd') goto yy451; - goto yy13; -yy448: - yych = (unsigned char)*++cur; - if (yych == 'd') goto yy453; - goto yy13; -yy449: - ++cur; -#line 73 "../src/parse/lex_conf.re" - { opts.set_cond_set_arg (lex_conf_string ()); return; } -#line 1917 "src/parse/lex_conf.cc" -yy451: - ++cur; -#line 71 "../src/parse/lex_conf.re" - { opts.set_cond_get_naked (lex_conf_number () != 0); return; } -#line 1922 "src/parse/lex_conf.cc" -yy453: - ++cur; -#line 74 "../src/parse/lex_conf.re" - { opts.set_cond_set_naked (lex_conf_number () != 0); return; } -#line 1927 "src/parse/lex_conf.cc" -} -#line 155 "../src/parse/lex_conf.re" - -} - -void Scanner::lex_conf_assign () -{ - -#line 1936 "src/parse/lex_conf.cc" -{ - unsigned char yych; - static const unsigned char yybm[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 128, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 128, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }; - if ((lim - cur) < 2) fill(2); - yych = (unsigned char)*cur; - if (yych <= 0x1F) { - if (yych == '\t') goto yy459; - } else { - if (yych <= ' ') goto yy459; - if (yych == '=') goto yy460; - } - ++cur; -yy458: -#line 161 "../src/parse/lex_conf.re" - { fatal ("missing '=' in configuration"); } -#line 1985 "src/parse/lex_conf.cc" -yy459: - yych = (unsigned char)*(ptr = ++cur); - if (yych <= 0x1F) { - if (yych == '\t') goto yy463; - goto yy458; - } else { - if (yych <= ' ') goto yy463; - if (yych != '=') goto yy458; - } -yy460: - ++cur; - if (lim <= cur) fill(1); - yych = (unsigned char)*cur; - if (yybm[0+yych] & 128) { - goto yy460; - } -#line 162 "../src/parse/lex_conf.re" - { return; } -#line 2004 "src/parse/lex_conf.cc" -yy463: - ++cur; - if (lim <= cur) fill(1); - yych = (unsigned char)*cur; - if (yych <= 0x1F) { - if (yych == '\t') goto yy463; - } else { - if (yych <= ' ') goto yy463; - if (yych == '=') goto yy460; - } - cur = ptr; - goto yy458; -} -#line 163 "../src/parse/lex_conf.re" - -} - -void Scanner::lex_conf_semicolon () -{ - -#line 2025 "src/parse/lex_conf.cc" -{ - unsigned char yych; - static const unsigned char yybm[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 128, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 128, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }; - if ((lim - cur) < 2) fill(2); - yych = (unsigned char)*cur; - if (yych <= 0x1F) { - if (yych == '\t') goto yy470; - } else { - if (yych <= ' ') goto yy470; - if (yych == ';') goto yy471; - } - ++cur; -yy469: -#line 169 "../src/parse/lex_conf.re" - { fatal ("missing ending ';' in configuration"); } -#line 2074 "src/parse/lex_conf.cc" -yy470: - yych = (unsigned char)*(ptr = ++cur); - if (yybm[0+yych] & 128) { - goto yy473; - } - if (yych != ';') goto yy469; -yy471: - ++cur; -#line 170 "../src/parse/lex_conf.re" - { return; } -#line 2085 "src/parse/lex_conf.cc" -yy473: - ++cur; - if (lim <= cur) fill(1); - yych = (unsigned char)*cur; - if (yybm[0+yych] & 128) { - goto yy473; - } - if (yych == ';') goto yy471; - cur = ptr; - goto yy469; -} -#line 171 "../src/parse/lex_conf.re" - -} - -int32_t Scanner::lex_conf_number () -{ - lex_conf_assign (); - tok = cur; - -#line 2106 "src/parse/lex_conf.cc" -{ - unsigned char yych; - static const unsigned char yybm[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - }; - if ((lim - cur) < 2) fill(2); - yych = (unsigned char)*cur; - if (yych <= '/') { - if (yych == '-') goto yy479; - } else { - if (yych <= '0') goto yy480; - if (yych <= '9') goto yy482; - } -yy478: -yy479: - yych = (unsigned char)*++cur; - if (yych <= '0') goto yy478; - if (yych <= '9') goto yy482; - goto yy478; -yy480: - ++cur; -yy481: -#line 180 "../src/parse/lex_conf.re" - { - int32_t n = 0; - if (!s_to_i32_unsafe (tok, cur, n)) - { - fatal ("configuration value overflow"); - } - lex_conf_semicolon (); - return n; - } -#line 2170 "src/parse/lex_conf.cc" -yy482: - ++cur; - if (lim <= cur) fill(1); - yych = (unsigned char)*cur; - if (yybm[0+yych] & 128) { - goto yy482; - } - goto yy481; -} -#line 189 "../src/parse/lex_conf.re" - -} - -std::string Scanner::lex_conf_string () -{ - lex_conf_assign (); - std::string s; - tok = cur; - -#line 2190 "src/parse/lex_conf.cc" -{ - unsigned char yych; - static const unsigned char yybm[] = { - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 0, 0, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - }; - if (lim <= cur) fill(1); - yych = (unsigned char)*cur; - if (yych <= '!') { - if (yych <= '\n') { - if (yych <= 0x08) goto yy487; - } else { - if (yych != ' ') goto yy487; - } - } else { - if (yych <= '\'') { - if (yych <= '"') goto yy489; - if (yych <= '&') goto yy487; - goto yy489; - } else { - if (yych != ';') goto yy487; - } - } -yy486: -#line 212 "../src/parse/lex_conf.re" - { - s = std::string(tok, tok_len()); - goto end; - } -#line 2250 "src/parse/lex_conf.cc" -yy487: - ++cur; - if (lim <= cur) fill(1); - yych = (unsigned char)*cur; - if (yybm[0+yych] & 128) { - goto yy487; - } - goto yy486; -yy489: - ++cur; -#line 198 "../src/parse/lex_conf.re" - { - const char quote = tok[0]; - for (bool end;;) { - const uint32_t c = lex_str_chr(quote, end); - if (end) { - goto end; - } - if (c > 0xFF) { - fatalf ("multibyte character in configuration string: 0x%X", c); - } else { - s += static_cast(c); - } - } - } -#line 2276 "src/parse/lex_conf.cc" -} -#line 216 "../src/parse/lex_conf.re" - -end: - lex_conf_semicolon (); - return s; -} - -} // end namespace re2c diff --git a/bootstrap/src/parse/parser.cc b/bootstrap/src/parse/parser.cc deleted file mode 100644 index 8a79532..0000000 --- a/bootstrap/src/parse/parser.cc +++ /dev/null @@ -1,2464 +0,0 @@ -/* A Bison parser, made by GNU Bison 2.4.3. */ - -/* Skeleton implementation for Bison's Yacc-like parsers in C - - Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006, - 2009, 2010 Free Software Foundation, Inc. - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . */ - -/* As a special exception, you may create a larger work that contains - part or all of the Bison parser skeleton and distribute that work - under terms of your choice, so long as that work isn't itself a - parser generator using the skeleton or a modified version thereof - as a parser skeleton. Alternatively, if you modify or redistribute - the parser skeleton itself, you may (at your option) remove this - special exception, which will cause the skeleton and the resulting - Bison output files to be licensed under the GNU General Public - License without this special exception. - - This special exception was added by the Free Software Foundation in - version 2.2 of Bison. */ - -/* C LALR(1) parser skeleton written by Richard Stallman, by - simplifying the original so-called "semantic" parser. */ - -/* All symbols defined below should begin with yy or YY, to avoid - infringing on user name space. This should be done even for local - variables, as they might otherwise be expanded by user macros. - There are some unavoidable exceptions within include files to - define necessary library symbols; they are noted "INFRINGES ON - USER NAME SPACE" below. */ - -/* Identify Bison output. */ -#define YYBISON 1 - -/* Bison version. */ -#define YYBISON_VERSION "2.4.3" - -/* Skeleton name. */ -#define YYSKELETON_NAME "yacc.c" - -/* Pure parsers. */ -#define YYPURE 0 - -/* Push parsers. */ -#define YYPUSH 0 - -/* Pull parsers. */ -#define YYPULL 1 - -/* Using locations. */ -#define YYLSP_NEEDED 0 - - - -/* Copy the first part of user declarations. */ - - - -#include "src/util/c99_stdint.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "src/codegen/output.h" -#include "src/conf/opt.h" -#include "src/globals.h" -#include "src/ir/compile.h" -#include "src/ir/adfa/adfa.h" -#include "src/ir/regexp/encoding/enc.h" -#include "src/ir/regexp/encoding/range_suffix.h" -#include "src/ir/regexp/regexp.h" -#include "src/ir/regexp/regexp_cat.h" -#include "src/ir/regexp/regexp_close.h" -#include "src/ir/regexp/regexp_null.h" -#include "src/ir/regexp/regexp_rule.h" -#include "src/ir/rule_rank.h" -#include "src/ir/skeleton/skeleton.h" -#include "src/parse/code.h" -#include "src/parse/extop.h" -#include "src/parse/loc.h" -#include "src/parse/parser.h" -#include "src/parse/scanner.h" -#include "src/parse/spec.h" -#include "src/util/counter.h" -#include "src/util/free_list.h" -#include "src/util/range.h" -#include "src/util/smart_ptr.h" - -#define YYMALLOC malloc -#define YYFREE free - -using namespace re2c; - -extern "C" -{ -int yylex(); -void yyerror(const char*); -} - -static counter_t rank_counter; -static std::vector condnames; -static re2c::SpecMap specMap; -static Spec spec; -static RuleOp *specNone = NULL; -static RuleOpList specStar; -static RuleOp * star_default = NULL; -static Scanner *in = NULL; -static Scanner::ParseMode parseMode; -static SetupMap ruleSetupMap; -static bool foundRules; -static symbol_table_t symbol_table; - -/* Bison version 1.875 emits a definition that is not working - * with several g++ version. Hence we disable it here. - */ -#if defined(__GNUC__) -#define __attribute__(x) -#endif - -void context_check(CondList *clist) -{ - if (!opts->cFlag) - { - delete clist; - in->fatal("conditions are only allowed when using -c switch"); - } -} - -void context_none(CondList *clist) -{ - delete clist; - context_check(NULL); - in->fatal("no expression specified"); -} - -void context_rule - ( CondList * clist - , const Loc & loc - , RegExp * expr - , RegExp * look - , const Code * code - , const std::string * newcond - ) -{ - context_check(clist); - for(CondList::const_iterator it = clist->begin(); it != clist->end(); ++it) - { - if (specMap.find(*it) == specMap.end()) - { - condnames.push_back (*it); - } - - RuleOp * rule = new RuleOp - ( loc - , expr - , look - , rank_counter.next () - , code - , newcond - ); - specMap[*it].add (rule); - } - delete clist; - delete newcond; -} - -void setup_rule(CondList *clist, const Code * code) -{ - assert(clist); - assert(code); - context_check(clist); - for(CondList::const_iterator it = clist->begin(); it != clist->end(); ++it) - { - if (ruleSetupMap.find(*it) != ruleSetupMap.end()) - { - in->fatalf_at(code->loc.line, "code to setup rule '%s' is already defined", it->c_str()); - } - ruleSetupMap[*it] = std::make_pair(code->loc.line, code->text); - } - delete clist; -} - -void default_rule(CondList *clist, const Code * code) -{ - assert(clist); - assert(code); - context_check(clist); - for(CondList::const_iterator it = clist->begin(); it != clist->end(); ++it) - { - RuleOp * def = new RuleOp - ( code->loc - , in->mkDefault () - , new NullOp - , rule_rank_t::def () - , code - , NULL - ); - if (!specMap[*it].add_def (def)) - { - in->fatalf_at(code->loc.line, "code to default rule '%s' is already defined", it->c_str()); - } - } - delete clist; -} - - - - -/* Enabling traces. */ -#ifndef YYDEBUG -# define YYDEBUG 0 -#endif - -/* Enabling verbose error messages. */ -#ifdef YYERROR_VERBOSE -# undef YYERROR_VERBOSE -# define YYERROR_VERBOSE 1 -#else -# define YYERROR_VERBOSE 0 -#endif - -/* Enabling the token table. */ -#ifndef YYTOKEN_TABLE -# define YYTOKEN_TABLE 0 -#endif - - -/* Tokens. */ -#ifndef YYTOKENTYPE -# define YYTOKENTYPE - /* Put the tokens into the symbol table, so that GDB and other debuggers - know about them. */ - enum yytokentype { - TOKEN_CLOSE = 258, - TOKEN_CLOSESIZE = 259, - TOKEN_CODE = 260, - TOKEN_CONF = 261, - TOKEN_ID = 262, - TOKEN_FID = 263, - TOKEN_FID_END = 264, - TOKEN_NOCOND = 265, - TOKEN_REGEXP = 266, - TOKEN_SETUP = 267, - TOKEN_STAR = 268 - }; -#endif - - - -#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED -typedef union YYSTYPE -{ - - - re2c::RegExp * regexp; - const re2c::Code * code; - char op; - re2c::ExtOp extop; - std::string * str; - re2c::CondList * clist; - - - -} YYSTYPE; -# define YYSTYPE_IS_TRIVIAL 1 -# define yystype YYSTYPE /* obsolescent; will be withdrawn */ -# define YYSTYPE_IS_DECLARED 1 -#endif - - -/* Copy the second part of user declarations. */ - - - -#ifdef short -# undef short -#endif - -#ifdef YYTYPE_UINT8 -typedef YYTYPE_UINT8 yytype_uint8; -#else -typedef unsigned char yytype_uint8; -#endif - -#ifdef YYTYPE_INT8 -typedef YYTYPE_INT8 yytype_int8; -#elif (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -typedef signed char yytype_int8; -#else -typedef short int yytype_int8; -#endif - -#ifdef YYTYPE_UINT16 -typedef YYTYPE_UINT16 yytype_uint16; -#else -typedef unsigned short int yytype_uint16; -#endif - -#ifdef YYTYPE_INT16 -typedef YYTYPE_INT16 yytype_int16; -#else -typedef short int yytype_int16; -#endif - -#ifndef YYSIZE_T -# ifdef __SIZE_TYPE__ -# define YYSIZE_T __SIZE_TYPE__ -# elif defined size_t -# define YYSIZE_T size_t -# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -# include /* INFRINGES ON USER NAME SPACE */ -# define YYSIZE_T size_t -# else -# define YYSIZE_T unsigned int -# endif -#endif - -#define YYSIZE_MAXIMUM ((YYSIZE_T) -1) - -#ifndef YY_ -# if defined YYENABLE_NLS && YYENABLE_NLS -# if ENABLE_NLS -# include /* INFRINGES ON USER NAME SPACE */ -# define YY_(msgid) dgettext ("bison-runtime", msgid) -# endif -# endif -# ifndef YY_ -# define YY_(msgid) msgid -# endif -#endif - -/* Suppress unused-variable warnings by "using" E. */ -#if ! defined lint || defined __GNUC__ -# define YYUSE(e) ((void) (e)) -#else -# define YYUSE(e) /* empty */ -#endif - -/* Identity function, used to suppress warnings about constant conditions. */ -#ifndef lint -# define YYID(n) (n) -#else -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static int -YYID (int yyi) -#else -static int -YYID (yyi) - int yyi; -#endif -{ - return yyi; -} -#endif - -#if ! defined yyoverflow || YYERROR_VERBOSE - -/* The parser invokes alloca or malloc; define the necessary symbols. */ - -# ifdef YYSTACK_USE_ALLOCA -# if YYSTACK_USE_ALLOCA -# ifdef __GNUC__ -# define YYSTACK_ALLOC __builtin_alloca -# elif defined __BUILTIN_VA_ARG_INCR -# include /* INFRINGES ON USER NAME SPACE */ -# elif defined _AIX -# define YYSTACK_ALLOC __alloca -# elif defined _MSC_VER -# include /* INFRINGES ON USER NAME SPACE */ -# define alloca _alloca -# else -# define YYSTACK_ALLOC alloca -# if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 -# endif -# endif -# endif -# endif -# endif - -# ifdef YYSTACK_ALLOC - /* Pacify GCC's `empty if-body' warning. */ -# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0)) -# ifndef YYSTACK_ALLOC_MAXIMUM - /* The OS might guarantee only one guard page at the bottom of the stack, - and a page size can be as small as 4096 bytes. So we cannot safely - invoke alloca (N) if N exceeds 4096. Use a slightly smaller number - to allow for a few compiler-allocated temporary stack slots. */ -# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */ -# endif -# else -# define YYSTACK_ALLOC YYMALLOC -# define YYSTACK_FREE YYFREE -# ifndef YYSTACK_ALLOC_MAXIMUM -# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM -# endif -# if (defined __cplusplus && ! defined _STDLIB_H \ - && ! ((defined YYMALLOC || defined malloc) \ - && (defined YYFREE || defined free))) -# include /* INFRINGES ON USER NAME SPACE */ -# ifndef _STDLIB_H -# define _STDLIB_H 1 -# endif -# endif -# ifndef YYMALLOC -# define YYMALLOC malloc -# if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# ifndef YYFREE -# define YYFREE free -# if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -void free (void *); /* INFRINGES ON USER NAME SPACE */ -# endif -# endif -# endif -#endif /* ! defined yyoverflow || YYERROR_VERBOSE */ - - -#if (! defined yyoverflow \ - && (! defined __cplusplus \ - || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))) - -/* A type that is properly aligned for any stack member. */ -union yyalloc -{ - yytype_int16 yyss_alloc; - YYSTYPE yyvs_alloc; -}; - -/* The size of the maximum gap between one aligned stack and the next. */ -# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) - -/* The size of an array large to enough to hold all stacks, each with - N elements. */ -# define YYSTACK_BYTES(N) \ - ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \ - + YYSTACK_GAP_MAXIMUM) - -/* Copy COUNT objects from FROM to TO. The source and destination do - not overlap. */ -# ifndef YYCOPY -# if defined __GNUC__ && 1 < __GNUC__ -# define YYCOPY(To, From, Count) \ - __builtin_memcpy (To, From, (Count) * sizeof (*(From))) -# else -# define YYCOPY(To, From, Count) \ - do \ - { \ - YYSIZE_T yyi; \ - for (yyi = 0; yyi < (Count); yyi++) \ - (To)[yyi] = (From)[yyi]; \ - } \ - while (YYID (0)) -# endif -# endif - -/* Relocate STACK from its old location to the new one. The - local variables YYSIZE and YYSTACKSIZE give the old and new number of - elements in the stack, and YYPTR gives the new location of the - stack. Advance YYPTR to a properly aligned location for the next - stack. */ -# define YYSTACK_RELOCATE(Stack_alloc, Stack) \ - do \ - { \ - YYSIZE_T yynewbytes; \ - YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \ - Stack = &yyptr->Stack_alloc; \ - yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ - yyptr += yynewbytes / sizeof (*yyptr); \ - } \ - while (YYID (0)) - -#endif - -/* YYFINAL -- State number of the termination state. */ -#define YYFINAL 2 -/* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 104 - -/* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 25 -/* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 14 -/* YYNRULES -- Number of rules. */ -#define YYNRULES 49 -/* YYNRULES -- Number of states. */ -#define YYNSTATES 92 - -/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ -#define YYUNDEFTOK 2 -#define YYMAXUTOK 268 - -#define YYTRANSLATE(YYX) \ - ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) - -/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ -static const yytype_uint8 yytranslate[] = -{ - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 23, 24, 2, 2, 20, 2, 2, 16, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 19, 15, - 17, 14, 18, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 22, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 21, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, - 5, 6, 7, 8, 9, 10, 11, 12, 13 -}; - -#if YYDEBUG -/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in - YYRHS. */ -static const yytype_uint8 yyprhs[] = -{ - 0, 0, 3, 4, 7, 10, 15, 19, 24, 28, - 30, 34, 37, 45, 53, 60, 67, 73, 81, 89, - 96, 103, 109, 113, 117, 122, 127, 128, 130, 132, - 136, 137, 141, 142, 145, 147, 151, 153, 157, 159, - 162, 164, 167, 170, 172, 174, 177, 180, 182, 184 -}; - -/* YYRHS -- A `-1'-separated list of the rules' RHS. */ -static const yytype_int8 yyrhs[] = -{ - 26, 0, -1, -1, 26, 28, -1, 26, 27, -1, - 7, 14, 33, 15, -1, 8, 33, 9, -1, 7, - 14, 33, 16, -1, 8, 33, 16, -1, 6, -1, - 33, 32, 5, -1, 13, 5, -1, 17, 29, 18, - 33, 32, 31, 5, -1, 17, 29, 18, 33, 32, - 19, 31, -1, 17, 29, 18, 32, 31, 5, -1, - 17, 29, 18, 32, 19, 31, -1, 17, 29, 18, - 13, 5, -1, 17, 13, 18, 33, 32, 31, 5, - -1, 17, 13, 18, 33, 32, 19, 31, -1, 17, - 13, 18, 32, 31, 5, -1, 17, 13, 18, 32, - 19, 31, -1, 17, 13, 18, 13, 5, -1, 10, - 31, 5, -1, 10, 19, 31, -1, 12, 13, 18, - 5, -1, 12, 29, 18, 5, -1, -1, 30, -1, - 7, -1, 30, 20, 7, -1, -1, 14, 18, 7, - -1, -1, 16, 33, -1, 34, -1, 33, 21, 34, - -1, 35, -1, 34, 22, 35, -1, 36, -1, 35, - 36, -1, 38, -1, 38, 37, -1, 38, 4, -1, - 3, -1, 13, -1, 37, 3, -1, 37, 13, -1, - 7, -1, 11, -1, 23, 33, 24, -1 -}; - -/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ -static const yytype_uint16 yyrline[] = -{ - 0, 193, 193, 195, 199, 203, 211, 219, 223, 227, - 231, 247, 264, 268, 274, 279, 285, 289, 303, 319, - 324, 330, 345, 362, 381, 387, 395, 398, 405, 411, - 421, 424, 432, 435, 442, 446, 453, 457, 464, 468, - 475, 479, 494, 513, 517, 521, 525, 532, 542, 546 -}; -#endif - -#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE -/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. - First, the terminals, then, starting at YYNTOKENS, nonterminals. */ -static const char *const yytname[] = -{ - "$end", "error", "$undefined", "TOKEN_CLOSE", "TOKEN_CLOSESIZE", - "TOKEN_CODE", "TOKEN_CONF", "TOKEN_ID", "TOKEN_FID", "TOKEN_FID_END", - "TOKEN_NOCOND", "TOKEN_REGEXP", "TOKEN_SETUP", "TOKEN_STAR", "'='", - "';'", "'/'", "'<'", "'>'", "':'", "','", "'|'", "'\\\\'", "'('", "')'", - "$accept", "spec", "decl", "rule", "cond", "clist", "newcond", "look", - "expr", "diff", "term", "factor", "close", "primary", 0 -}; -#endif - -# ifdef YYPRINT -/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to - token YYLEX-NUM. */ -static const yytype_uint16 yytoknum[] = -{ - 0, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 265, 266, 267, 268, 61, 59, 47, 60, 62, 58, - 44, 124, 92, 40, 41 -}; -# endif - -/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ -static const yytype_uint8 yyr1[] = -{ - 0, 25, 26, 26, 26, 27, 27, 27, 27, 27, - 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, - 28, 28, 28, 28, 28, 28, 29, 29, 30, 30, - 31, 31, 32, 32, 33, 33, 34, 34, 35, 35, - 36, 36, 36, 37, 37, 37, 37, 38, 38, 38 -}; - -/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ -static const yytype_uint8 yyr2[] = -{ - 0, 2, 0, 2, 2, 4, 3, 4, 3, 1, - 3, 2, 7, 7, 6, 6, 5, 7, 7, 6, - 6, 5, 3, 3, 4, 4, 0, 1, 1, 3, - 0, 3, 0, 2, 1, 3, 1, 3, 1, 2, - 1, 2, 2, 1, 1, 2, 2, 1, 1, 3 -}; - -/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state - STATE-NUM when YYTABLE doesn't specify something else to do. Zero - means the default is an error. */ -static const yytype_uint8 yydefact[] = -{ - 2, 0, 1, 9, 47, 0, 30, 48, 26, 0, - 26, 0, 4, 3, 32, 34, 36, 38, 40, 0, - 47, 0, 0, 30, 0, 28, 0, 0, 27, 11, - 0, 0, 0, 0, 0, 0, 0, 39, 43, 42, - 44, 41, 0, 6, 8, 0, 23, 22, 0, 0, - 0, 32, 32, 49, 33, 35, 10, 37, 45, 46, - 5, 7, 31, 24, 25, 29, 0, 30, 32, 0, - 30, 32, 21, 30, 0, 30, 16, 30, 0, 30, - 20, 19, 30, 0, 15, 14, 30, 0, 18, 17, - 13, 12 -}; - -/* YYDEFGOTO[NTERM-NUM]. */ -static const yytype_int8 yydefgoto[] = -{ - -1, 1, 12, 13, 27, 28, 24, 35, 14, 15, - 16, 17, 41, 18 -}; - -/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing - STATE-NUM. */ -#define YYPACT_NINF -43 -static const yytype_int8 yypact[] = -{ - -43, 11, -43, -43, -11, 30, 47, -43, 25, 10, - 33, 30, -43, -43, 48, 17, 30, -43, 1, 30, - -43, 4, 40, 60, 70, -43, 61, 63, 42, -43, - 64, 66, 59, 30, 30, 73, 30, -43, -43, -43, - -43, 32, -9, -43, -43, 78, -43, -43, 81, 82, - 83, 20, 44, -43, 67, 17, -43, 30, -43, -43, - -43, -43, -43, -43, -43, -43, 84, 51, 48, 86, - 54, 48, -43, 60, 87, 57, -43, 60, 88, 58, - -43, -43, 60, 89, -43, -43, 60, 90, -43, -43, - -43, -43 -}; - -/* YYPGOTO[NTERM-NUM]. */ -static const yytype_int8 yypgoto[] = -{ - -43, -43, -43, -43, 91, -43, -23, -42, -3, 62, - 68, -15, -43, -43 -}; - -/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If - positive, shift that token. If negative, reduce the rule which - number is the opposite. If zero, do what YYDEFACT says. - If YYTABLE_NINF, syntax error. */ -#define YYTABLE_NINF -1 -static const yytype_uint8 yytable[] = -{ - 46, 37, 21, 19, 38, 39, 60, 61, 32, 67, - 70, 2, 34, 43, 40, 29, 42, 3, 4, 5, - 44, 6, 7, 8, 9, 34, 75, 20, 10, 79, - 54, 7, 25, 66, 11, 58, 33, 20, 26, 36, - 25, 7, 37, 11, 74, 59, 30, 78, 68, 71, - 80, 20, 83, 11, 84, 7, 87, 69, 45, 88, - 33, 22, 50, 90, 33, 22, 23, 11, 22, 34, - 73, 22, 22, 77, 22, 47, 82, 86, 56, 48, - 34, 49, 51, 53, 52, 62, 63, 64, 34, 72, - 65, 76, 81, 85, 89, 91, 55, 0, 0, 0, - 0, 31, 0, 0, 57 -}; - -static const yytype_int8 yycheck[] = -{ - 23, 16, 5, 14, 3, 4, 15, 16, 11, 51, - 52, 0, 21, 9, 13, 5, 19, 6, 7, 8, - 16, 10, 11, 12, 13, 21, 68, 7, 17, 71, - 33, 11, 7, 13, 23, 3, 16, 7, 13, 22, - 7, 11, 57, 23, 67, 13, 13, 70, 51, 52, - 73, 7, 75, 23, 77, 11, 79, 13, 18, 82, - 16, 14, 20, 86, 16, 14, 19, 23, 14, 21, - 19, 14, 14, 19, 14, 5, 19, 19, 5, 18, - 21, 18, 18, 24, 18, 7, 5, 5, 21, 5, - 7, 5, 5, 5, 5, 5, 34, -1, -1, -1, - -1, 10, -1, -1, 36 -}; - -/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing - symbol of state STATE-NUM. */ -static const yytype_uint8 yystos[] = -{ - 0, 26, 0, 6, 7, 8, 10, 11, 12, 13, - 17, 23, 27, 28, 33, 34, 35, 36, 38, 14, - 7, 33, 14, 19, 31, 7, 13, 29, 30, 5, - 13, 29, 33, 16, 21, 32, 22, 36, 3, 4, - 13, 37, 33, 9, 16, 18, 31, 5, 18, 18, - 20, 18, 18, 24, 33, 34, 5, 35, 3, 13, - 15, 16, 7, 5, 5, 7, 13, 32, 33, 13, - 32, 33, 5, 19, 31, 32, 5, 19, 31, 32, - 31, 5, 19, 31, 31, 5, 19, 31, 31, 5, - 31, 5 -}; - -#define yyerrok (yyerrstatus = 0) -#define yyclearin (yychar = YYEMPTY) -#define YYEMPTY (-2) -#define YYEOF 0 - -#define YYACCEPT goto yyacceptlab -#define YYABORT goto yyabortlab -#define YYERROR goto yyerrorlab - - -/* Like YYERROR except do call yyerror. This remains here temporarily - to ease the transition to the new meaning of YYERROR, for GCC. - Once GCC version 2 has supplanted version 1, this can go. However, - YYFAIL appears to be in use. Nevertheless, it is formally deprecated - in Bison 2.4.2's NEWS entry, where a plan to phase it out is - discussed. */ - -#define YYFAIL goto yyerrlab -#if defined YYFAIL - /* This is here to suppress warnings from the GCC cpp's - -Wunused-macros. Normally we don't worry about that warning, but - some users do, and we want to make it easy for users to remove - YYFAIL uses, which will produce warnings from Bison 2.5. */ -#endif - -#define YYRECOVERING() (!!yyerrstatus) - -#define YYBACKUP(Token, Value) \ -do \ - if (yychar == YYEMPTY && yylen == 1) \ - { \ - yychar = (Token); \ - yylval = (Value); \ - yytoken = YYTRANSLATE (yychar); \ - YYPOPSTACK (1); \ - goto yybackup; \ - } \ - else \ - { \ - yyerror (YY_("syntax error: cannot back up")); \ - YYERROR; \ - } \ -while (YYID (0)) - - -#define YYTERROR 1 -#define YYERRCODE 256 - - -/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N]. - If N is 0, then set CURRENT to the empty location which ends - the previous symbol: RHS[0] (always defined). */ - -#define YYRHSLOC(Rhs, K) ((Rhs)[K]) -#ifndef YYLLOC_DEFAULT -# define YYLLOC_DEFAULT(Current, Rhs, N) \ - do \ - if (YYID (N)) \ - { \ - (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \ - (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \ - (Current).last_line = YYRHSLOC (Rhs, N).last_line; \ - (Current).last_column = YYRHSLOC (Rhs, N).last_column; \ - } \ - else \ - { \ - (Current).first_line = (Current).last_line = \ - YYRHSLOC (Rhs, 0).last_line; \ - (Current).first_column = (Current).last_column = \ - YYRHSLOC (Rhs, 0).last_column; \ - } \ - while (YYID (0)) -#endif - - -/* YY_LOCATION_PRINT -- Print the location on the stream. - This macro was not mandated originally: define only if we know - we won't break user code: when these are the locations we know. */ - -#ifndef YY_LOCATION_PRINT -# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL -# define YY_LOCATION_PRINT(File, Loc) \ - fprintf (File, "%d.%d-%d.%d", \ - (Loc).first_line, (Loc).first_column, \ - (Loc).last_line, (Loc).last_column) -# else -# define YY_LOCATION_PRINT(File, Loc) ((void) 0) -# endif -#endif - - -/* YYLEX -- calling `yylex' with the right arguments. */ - -#ifdef YYLEX_PARAM -# define YYLEX yylex (YYLEX_PARAM) -#else -# define YYLEX yylex () -#endif - -/* Enable debugging if requested. */ -#if YYDEBUG - -# ifndef YYFPRINTF -# include /* INFRINGES ON USER NAME SPACE */ -# define YYFPRINTF fprintf -# endif - -# define YYDPRINTF(Args) \ -do { \ - if (yydebug) \ - YYFPRINTF Args; \ -} while (YYID (0)) - -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \ -do { \ - if (yydebug) \ - { \ - YYFPRINTF (stderr, "%s ", Title); \ - yy_symbol_print (stderr, \ - Type, Value); \ - YYFPRINTF (stderr, "\n"); \ - } \ -} while (YYID (0)) - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else -static void -yy_symbol_value_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif -{ - if (!yyvaluep) - return; -# ifdef YYPRINT - if (yytype < YYNTOKENS) - YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); -# else - YYUSE (yyoutput); -# endif - switch (yytype) - { - default: - break; - } -} - - -/*--------------------------------. -| Print this symbol on YYOUTPUT. | -`--------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep) -#else -static void -yy_symbol_print (yyoutput, yytype, yyvaluep) - FILE *yyoutput; - int yytype; - YYSTYPE const * const yyvaluep; -#endif -{ - if (yytype < YYNTOKENS) - YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); - else - YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); - - yy_symbol_value_print (yyoutput, yytype, yyvaluep); - YYFPRINTF (yyoutput, ")"); -} - -/*------------------------------------------------------------------. -| yy_stack_print -- Print the state stack from its BOTTOM up to its | -| TOP (included). | -`------------------------------------------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_stack_print (yytype_int16 *yybottom, yytype_int16 *yytop) -#else -static void -yy_stack_print (yybottom, yytop) - yytype_int16 *yybottom; - yytype_int16 *yytop; -#endif -{ - YYFPRINTF (stderr, "Stack now"); - for (; yybottom <= yytop; yybottom++) - { - int yybot = *yybottom; - YYFPRINTF (stderr, " %d", yybot); - } - YYFPRINTF (stderr, "\n"); -} - -# define YY_STACK_PRINT(Bottom, Top) \ -do { \ - if (yydebug) \ - yy_stack_print ((Bottom), (Top)); \ -} while (YYID (0)) - - -/*------------------------------------------------. -| Report that the YYRULE is going to be reduced. | -`------------------------------------------------*/ - -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yy_reduce_print (YYSTYPE *yyvsp, int yyrule) -#else -static void -yy_reduce_print (yyvsp, yyrule) - YYSTYPE *yyvsp; - int yyrule; -#endif -{ - int yynrhs = yyr2[yyrule]; - int yyi; - unsigned long int yylno = yyrline[yyrule]; - YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n", - yyrule - 1, yylno); - /* The symbols being reduced. */ - for (yyi = 0; yyi < yynrhs; yyi++) - { - YYFPRINTF (stderr, " $%d = ", yyi + 1); - yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi], - &(yyvsp[(yyi + 1) - (yynrhs)]) - ); - YYFPRINTF (stderr, "\n"); - } -} - -# define YY_REDUCE_PRINT(Rule) \ -do { \ - if (yydebug) \ - yy_reduce_print (yyvsp, Rule); \ -} while (YYID (0)) - -/* Nonzero means print parse trace. It is left uninitialized so that - multiple parsers can coexist. */ -int yydebug; -#else /* !YYDEBUG */ -# define YYDPRINTF(Args) -# define YY_SYMBOL_PRINT(Title, Type, Value, Location) -# define YY_STACK_PRINT(Bottom, Top) -# define YY_REDUCE_PRINT(Rule) -#endif /* !YYDEBUG */ - - -/* YYINITDEPTH -- initial size of the parser's stacks. */ -#ifndef YYINITDEPTH -# define YYINITDEPTH 200 -#endif - -/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only - if the built-in stack extension method is used). - - Do not make this value too large; the results are undefined if - YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH) - evaluated with infinite-precision integer arithmetic. */ - -#ifndef YYMAXDEPTH -# define YYMAXDEPTH 10000 -#endif - - - -#if YYERROR_VERBOSE - -# ifndef yystrlen -# if defined __GLIBC__ && defined _STRING_H -# define yystrlen strlen -# else -/* Return the length of YYSTR. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static YYSIZE_T -yystrlen (const char *yystr) -#else -static YYSIZE_T -yystrlen (yystr) - const char *yystr; -#endif -{ - YYSIZE_T yylen; - for (yylen = 0; yystr[yylen]; yylen++) - continue; - return yylen; -} -# endif -# endif - -# ifndef yystpcpy -# if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE -# define yystpcpy stpcpy -# else -/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in - YYDEST. */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static char * -yystpcpy (char *yydest, const char *yysrc) -#else -static char * -yystpcpy (yydest, yysrc) - char *yydest; - const char *yysrc; -#endif -{ - char *yyd = yydest; - const char *yys = yysrc; - - while ((*yyd++ = *yys++) != '\0') - continue; - - return yyd - 1; -} -# endif -# endif - -# ifndef yytnamerr -/* Copy to YYRES the contents of YYSTR after stripping away unnecessary - quotes and backslashes, so that it's suitable for yyerror. The - heuristic is that double-quoting is unnecessary unless the string - contains an apostrophe, a comma, or backslash (other than - backslash-backslash). YYSTR is taken from yytname. If YYRES is - null, do not copy; instead, return the length of what the result - would have been. */ -static YYSIZE_T -yytnamerr (char *yyres, const char *yystr) -{ - if (*yystr == '"') - { - YYSIZE_T yyn = 0; - char const *yyp = yystr; - - for (;;) - switch (*++yyp) - { - case '\'': - case ',': - goto do_not_strip_quotes; - - case '\\': - if (*++yyp != '\\') - goto do_not_strip_quotes; - /* Fall through. */ - default: - if (yyres) - yyres[yyn] = *yyp; - yyn++; - break; - - case '"': - if (yyres) - yyres[yyn] = '\0'; - return yyn; - } - do_not_strip_quotes: ; - } - - if (! yyres) - return yystrlen (yystr); - - return yystpcpy (yyres, yystr) - yyres; -} -# endif - -/* Copy into YYRESULT an error message about the unexpected token - YYCHAR while in state YYSTATE. Return the number of bytes copied, - including the terminating null byte. If YYRESULT is null, do not - copy anything; just return the number of bytes that would be - copied. As a special case, return 0 if an ordinary "syntax error" - message will do. Return YYSIZE_MAXIMUM if overflow occurs during - size calculation. */ -static YYSIZE_T -yysyntax_error (char *yyresult, int yystate, int yychar) -{ - int yyn = yypact[yystate]; - - if (! (YYPACT_NINF < yyn && yyn <= YYLAST)) - return 0; - else - { - int yytype = YYTRANSLATE (yychar); - YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]); - YYSIZE_T yysize = yysize0; - YYSIZE_T yysize1; - int yysize_overflow = 0; - enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 }; - char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM]; - int yyx; - -# if 0 - /* This is so xgettext sees the translatable formats that are - constructed on the fly. */ - YY_("syntax error, unexpected %s"); - YY_("syntax error, unexpected %s, expecting %s"); - YY_("syntax error, unexpected %s, expecting %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s"); - YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s"); -# endif - char *yyfmt; - char const *yyf; - static char const yyunexpected[] = "syntax error, unexpected %s"; - static char const yyexpecting[] = ", expecting %s"; - static char const yyor[] = " or %s"; - char yyformat[sizeof yyunexpected - + sizeof yyexpecting - 1 - + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2) - * (sizeof yyor - 1))]; - char const *yyprefix = yyexpecting; - - /* Start YYX at -YYN if negative to avoid negative indexes in - YYCHECK. */ - int yyxbegin = yyn < 0 ? -yyn : 0; - - /* Stay within bounds of both yycheck and yytname. */ - int yychecklim = YYLAST - yyn + 1; - int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; - int yycount = 1; - - yyarg[0] = yytname[yytype]; - yyfmt = yystpcpy (yyformat, yyunexpected); - - for (yyx = yyxbegin; yyx < yyxend; ++yyx) - if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) - { - if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM) - { - yycount = 1; - yysize = yysize0; - yyformat[sizeof yyunexpected - 1] = '\0'; - break; - } - yyarg[yycount++] = yytname[yyx]; - yysize1 = yysize + yytnamerr (0, yytname[yyx]); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - yyfmt = yystpcpy (yyfmt, yyprefix); - yyprefix = yyor; - } - - yyf = YY_(yyformat); - yysize1 = yysize + yystrlen (yyf); - yysize_overflow |= (yysize1 < yysize); - yysize = yysize1; - - if (yysize_overflow) - return YYSIZE_MAXIMUM; - - if (yyresult) - { - /* Avoid sprintf, as that infringes on the user's name space. - Don't have undefined behavior even if the translation - produced a string with the wrong number of "%s"s. */ - char *yyp = yyresult; - int yyi = 0; - while ((*yyp = *yyf) != '\0') - { - if (*yyp == '%' && yyf[1] == 's' && yyi < yycount) - { - yyp += yytnamerr (yyp, yyarg[yyi++]); - yyf += 2; - } - else - { - yyp++; - yyf++; - } - } - } - return yysize; - } -} -#endif /* YYERROR_VERBOSE */ - - -/*-----------------------------------------------. -| Release the memory associated to this symbol. | -`-----------------------------------------------*/ - -/*ARGSUSED*/ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -static void -yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep) -#else -static void -yydestruct (yymsg, yytype, yyvaluep) - const char *yymsg; - int yytype; - YYSTYPE *yyvaluep; -#endif -{ - YYUSE (yyvaluep); - - if (!yymsg) - yymsg = "Deleting"; - YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp); - - switch (yytype) - { - - default: - break; - } -} - -/* Prevent warnings from -Wmissing-prototypes. */ -#ifdef YYPARSE_PARAM -#if defined __STDC__ || defined __cplusplus -int yyparse (void *YYPARSE_PARAM); -#else -int yyparse (); -#endif -#else /* ! YYPARSE_PARAM */ -#if defined __STDC__ || defined __cplusplus -int yyparse (void); -#else -int yyparse (); -#endif -#endif /* ! YYPARSE_PARAM */ - - -/* The lookahead symbol. */ -int yychar; - -/* The semantic value of the lookahead symbol. */ -YYSTYPE yylval; - -/* Number of syntax errors so far. */ -int yynerrs; - - - -/*-------------------------. -| yyparse or yypush_parse. | -`-------------------------*/ - -#ifdef YYPARSE_PARAM -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void *YYPARSE_PARAM) -#else -int -yyparse (YYPARSE_PARAM) - void *YYPARSE_PARAM; -#endif -#else /* ! YYPARSE_PARAM */ -#if (defined __STDC__ || defined __C99__FUNC__ \ - || defined __cplusplus || defined _MSC_VER) -int -yyparse (void) -#else -int -yyparse () - -#endif -#endif -{ - - - int yystate; - /* Number of tokens to shift before error messages enabled. */ - int yyerrstatus; - - /* The stacks and their tools: - `yyss': related to states. - `yyvs': related to semantic values. - - Refer to the stacks thru separate pointers, to allow yyoverflow - to reallocate them elsewhere. */ - - /* The state stack. */ - yytype_int16 yyssa[YYINITDEPTH]; - yytype_int16 *yyss; - yytype_int16 *yyssp; - - /* The semantic value stack. */ - YYSTYPE yyvsa[YYINITDEPTH]; - YYSTYPE *yyvs; - YYSTYPE *yyvsp; - - YYSIZE_T yystacksize; - - int yyn; - int yyresult; - /* Lookahead token as an internal (translated) token number. */ - int yytoken; - /* The variables used to return semantic value and location from the - action routines. */ - YYSTYPE yyval; - -#if YYERROR_VERBOSE - /* Buffer for error messages, and its allocated size. */ - char yymsgbuf[128]; - char *yymsg = yymsgbuf; - YYSIZE_T yymsg_alloc = sizeof yymsgbuf; -#endif - -#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)) - - /* The number of symbols on the RHS of the reduced rule. - Keep to zero when no symbol should be popped. */ - int yylen = 0; - - yytoken = 0; - yyss = yyssa; - yyvs = yyvsa; - yystacksize = YYINITDEPTH; - - YYDPRINTF ((stderr, "Starting parse\n")); - - yystate = 0; - yyerrstatus = 0; - yynerrs = 0; - yychar = YYEMPTY; /* Cause a token to be read. */ - - /* Initialize stack pointers. - Waste one element of value and location stack - so that they stay on the same level as the state stack. - The wasted elements are never initialized. */ - yyssp = yyss; - yyvsp = yyvs; - - goto yysetstate; - -/*------------------------------------------------------------. -| yynewstate -- Push a new state, which is found in yystate. | -`------------------------------------------------------------*/ - yynewstate: - /* In all cases, when you get here, the value and location stacks - have just been pushed. So pushing a state here evens the stacks. */ - yyssp++; - - yysetstate: - *yyssp = yystate; - - if (yyss + yystacksize - 1 <= yyssp) - { - /* Get the current used size of the three stacks, in elements. */ - YYSIZE_T yysize = yyssp - yyss + 1; - -#ifdef yyoverflow - { - /* Give user a chance to reallocate the stack. Use copies of - these so that the &'s don't force the real ones into - memory. */ - YYSTYPE *yyvs1 = yyvs; - yytype_int16 *yyss1 = yyss; - - /* Each stack pointer address is followed by the size of the - data in use in that stack, in bytes. This used to be a - conditional around just the two extra args, but that might - be undefined if yyoverflow is a macro. */ - yyoverflow (YY_("memory exhausted"), - &yyss1, yysize * sizeof (*yyssp), - &yyvs1, yysize * sizeof (*yyvsp), - &yystacksize); - - yyss = yyss1; - yyvs = yyvs1; - } -#else /* no yyoverflow */ -# ifndef YYSTACK_RELOCATE - goto yyexhaustedlab; -# else - /* Extend the stack our own way. */ - if (YYMAXDEPTH <= yystacksize) - goto yyexhaustedlab; - yystacksize *= 2; - if (YYMAXDEPTH < yystacksize) - yystacksize = YYMAXDEPTH; - - { - yytype_int16 *yyss1 = yyss; - union yyalloc *yyptr = - (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); - if (! yyptr) - goto yyexhaustedlab; - YYSTACK_RELOCATE (yyss_alloc, yyss); - YYSTACK_RELOCATE (yyvs_alloc, yyvs); -# undef YYSTACK_RELOCATE - if (yyss1 != yyssa) - YYSTACK_FREE (yyss1); - } -# endif -#endif /* no yyoverflow */ - - yyssp = yyss + yysize - 1; - yyvsp = yyvs + yysize - 1; - - YYDPRINTF ((stderr, "Stack size increased to %lu\n", - (unsigned long int) yystacksize)); - - if (yyss + yystacksize - 1 <= yyssp) - YYABORT; - } - - YYDPRINTF ((stderr, "Entering state %d\n", yystate)); - - if (yystate == YYFINAL) - YYACCEPT; - - goto yybackup; - -/*-----------. -| yybackup. | -`-----------*/ -yybackup: - - /* Do appropriate processing given the current state. Read a - lookahead token if we need one and don't already have one. */ - - /* First try to decide what to do without reference to lookahead token. */ - yyn = yypact[yystate]; - if (yyn == YYPACT_NINF) - goto yydefault; - - /* Not known => get a lookahead token if don't already have one. */ - - /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ - if (yychar == YYEMPTY) - { - YYDPRINTF ((stderr, "Reading a token: ")); - yychar = YYLEX; - } - - if (yychar <= YYEOF) - { - yychar = yytoken = YYEOF; - YYDPRINTF ((stderr, "Now at end of input.\n")); - } - else - { - yytoken = YYTRANSLATE (yychar); - YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc); - } - - /* If the proper action on seeing token YYTOKEN is to reduce or to - detect an error, take that action. */ - yyn += yytoken; - if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) - goto yydefault; - yyn = yytable[yyn]; - if (yyn <= 0) - { - if (yyn == 0 || yyn == YYTABLE_NINF) - goto yyerrlab; - yyn = -yyn; - goto yyreduce; - } - - /* Count tokens shifted since error; after three, turn off error - status. */ - if (yyerrstatus) - yyerrstatus--; - - /* Shift the lookahead token. */ - YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc); - - /* Discard the shifted token. */ - yychar = YYEMPTY; - - yystate = yyn; - *++yyvsp = yylval; - - goto yynewstate; - - -/*-----------------------------------------------------------. -| yydefault -- do the default action for the current state. | -`-----------------------------------------------------------*/ -yydefault: - yyn = yydefact[yystate]; - if (yyn == 0) - goto yyerrlab; - goto yyreduce; - - -/*-----------------------------. -| yyreduce -- Do a reduction. | -`-----------------------------*/ -yyreduce: - /* yyn is the number of a rule to reduce with. */ - yylen = yyr2[yyn]; - - /* If YYLEN is nonzero, implement the default value of the action: - `$$ = $1'. - - Otherwise, the following line sets YYVAL to garbage. - This behavior is undocumented and Bison - users should not rely upon it. Assigning to YYVAL - unconditionally makes the parser a bit smaller, and it avoids a - GCC warning that YYVAL may be used uninitialized. */ - yyval = yyvsp[1-yylen]; - - - YY_REDUCE_PRINT (yyn); - switch (yyn) - { - case 2: - - { - ;} - break; - - case 3: - - { - foundRules = true; - ;} - break; - - case 5: - - { - if (!symbol_table.insert (std::make_pair (* (yyvsp[(1) - (4)].str), (yyvsp[(3) - (4)].regexp))).second) - { - in->fatal("sym already defined"); - } - delete (yyvsp[(1) - (4)].str); - ;} - break; - - case 6: - - { - if (!symbol_table.insert (std::make_pair (* (yyvsp[(1) - (3)].str), (yyvsp[(2) - (3)].regexp))).second) - { - in->fatal("sym already defined"); - } - delete (yyvsp[(1) - (3)].str); - ;} - break; - - case 7: - - { - in->fatal("trailing contexts are not allowed in named definitions"); - ;} - break; - - case 8: - - { - in->fatal("trailing contexts are not allowed in named definitions"); - ;} - break; - - case 9: - - {;} - break; - - case 10: - - { - if (opts->cFlag) - { - in->fatal("condition or '<*>' required when using -c switch"); - } - RuleOp * rule = new RuleOp - ( (yyvsp[(3) - (3)].code)->loc - , (yyvsp[(1) - (3)].regexp) - , (yyvsp[(2) - (3)].regexp) - , rank_counter.next () - , (yyvsp[(3) - (3)].code) - , NULL - ); - spec.add (rule); - ;} - break; - - case 11: - - { - if (opts->cFlag) - in->fatal("condition or '<*>' required when using -c switch"); - RuleOp * def = new RuleOp - ( (yyvsp[(2) - (2)].code)->loc - , in->mkDefault () - , new NullOp - , rule_rank_t::def () - , (yyvsp[(2) - (2)].code) - , NULL - ); - if (!spec.add_def (def)) - { - in->fatal("code to default rule is already defined"); - } - ;} - break; - - case 12: - - { - context_rule ((yyvsp[(2) - (7)].clist), (yyvsp[(7) - (7)].code)->loc, (yyvsp[(4) - (7)].regexp), (yyvsp[(5) - (7)].regexp), (yyvsp[(7) - (7)].code), (yyvsp[(6) - (7)].str)); - ;} - break; - - case 13: - - { - assert((yyvsp[(7) - (7)].str)); - Loc loc (in->get_fname (), in->get_cline ()); - context_rule ((yyvsp[(2) - (7)].clist), loc, (yyvsp[(4) - (7)].regexp), (yyvsp[(5) - (7)].regexp), NULL, (yyvsp[(7) - (7)].str)); - ;} - break; - - case 14: - - { - context_none((yyvsp[(2) - (6)].clist)); - delete (yyvsp[(5) - (6)].str); - ;} - break; - - case 15: - - { - assert((yyvsp[(6) - (6)].str)); - context_none((yyvsp[(2) - (6)].clist)); - delete (yyvsp[(6) - (6)].str); - ;} - break; - - case 16: - - { - default_rule((yyvsp[(2) - (5)].clist), (yyvsp[(5) - (5)].code)); - ;} - break; - - case 17: - - { - context_check(NULL); - RuleOp * rule = new RuleOp - ( (yyvsp[(7) - (7)].code)->loc - , (yyvsp[(4) - (7)].regexp) - , (yyvsp[(5) - (7)].regexp) - , rank_counter.next () - , (yyvsp[(7) - (7)].code) - , (yyvsp[(6) - (7)].str) - ); - specStar.push_back (rule); - delete (yyvsp[(6) - (7)].str); - ;} - break; - - case 18: - - { - assert((yyvsp[(7) - (7)].str)); - context_check(NULL); - Loc loc (in->get_fname (), in->get_cline ()); - RuleOp * rule = new RuleOp - ( loc - , (yyvsp[(4) - (7)].regexp) - , (yyvsp[(5) - (7)].regexp) - , rank_counter.next () - , NULL - , (yyvsp[(7) - (7)].str) - ); - specStar.push_back (rule); - delete (yyvsp[(7) - (7)].str); - ;} - break; - - case 19: - - { - context_none(NULL); - delete (yyvsp[(5) - (6)].str); - ;} - break; - - case 20: - - { - assert((yyvsp[(6) - (6)].str)); - context_none(NULL); - delete (yyvsp[(6) - (6)].str); - ;} - break; - - case 21: - - { - if (star_default) - { - in->fatal ("code to default rule '*' is already defined"); - } - star_default = new RuleOp - ( (yyvsp[(5) - (5)].code)->loc - , in->mkDefault () - , new NullOp - , rule_rank_t::def () - , (yyvsp[(5) - (5)].code) - , NULL - ); - ;} - break; - - case 22: - - { - context_check(NULL); - if (specNone) - { - in->fatal("code to handle illegal condition already defined"); - } - (yyval.regexp) = specNone = new RuleOp - ( (yyvsp[(3) - (3)].code)->loc - , new NullOp - , new NullOp - , rank_counter.next () - , (yyvsp[(3) - (3)].code) - , (yyvsp[(2) - (3)].str) - ); - delete (yyvsp[(2) - (3)].str); - ;} - break; - - case 23: - - { - assert((yyvsp[(3) - (3)].str)); - context_check(NULL); - if (specNone) - { - in->fatal("code to handle illegal condition already defined"); - } - Loc loc (in->get_fname (), in->get_cline ()); - (yyval.regexp) = specNone = new RuleOp - ( loc - , new NullOp - , new NullOp - , rank_counter.next () - , NULL - , (yyvsp[(3) - (3)].str) - ); - delete (yyvsp[(3) - (3)].str); - ;} - break; - - case 24: - - { - CondList *clist = new CondList(); - clist->insert("*"); - setup_rule(clist, (yyvsp[(4) - (4)].code)); - ;} - break; - - case 25: - - { - setup_rule((yyvsp[(2) - (4)].clist), (yyvsp[(4) - (4)].code)); - ;} - break; - - case 26: - - { - in->fatal("unnamed condition not supported"); - ;} - break; - - case 27: - - { - (yyval.clist) = (yyvsp[(1) - (1)].clist); - ;} - break; - - case 28: - - { - (yyval.clist) = new CondList(); - (yyval.clist)->insert(* (yyvsp[(1) - (1)].str)); - delete (yyvsp[(1) - (1)].str); - ;} - break; - - case 29: - - { - (yyvsp[(1) - (3)].clist)->insert(* (yyvsp[(3) - (3)].str)); - delete (yyvsp[(3) - (3)].str); - (yyval.clist) = (yyvsp[(1) - (3)].clist); - ;} - break; - - case 30: - - { - (yyval.str) = NULL; - ;} - break; - - case 31: - - { - (yyval.str) = (yyvsp[(3) - (3)].str); - ;} - break; - - case 32: - - { - (yyval.regexp) = new NullOp; - ;} - break; - - case 33: - - { - (yyval.regexp) = (yyvsp[(2) - (2)].regexp); - ;} - break; - - case 34: - - { - (yyval.regexp) = (yyvsp[(1) - (1)].regexp); - ;} - break; - - case 35: - - { - (yyval.regexp) = mkAlt((yyvsp[(1) - (3)].regexp), (yyvsp[(3) - (3)].regexp)); - ;} - break; - - case 36: - - { - (yyval.regexp) = (yyvsp[(1) - (1)].regexp); - ;} - break; - - case 37: - - { - (yyval.regexp) = in->mkDiff((yyvsp[(1) - (3)].regexp), (yyvsp[(3) - (3)].regexp)); - ;} - break; - - case 38: - - { - (yyval.regexp) = (yyvsp[(1) - (1)].regexp); - ;} - break; - - case 39: - - { - (yyval.regexp) = new CatOp((yyvsp[(1) - (2)].regexp), (yyvsp[(2) - (2)].regexp)); - ;} - break; - - case 40: - - { - (yyval.regexp) = (yyvsp[(1) - (1)].regexp); - ;} - break; - - case 41: - - { - switch((yyvsp[(2) - (2)].op)) - { - case '*': - (yyval.regexp) = new CloseOp((yyvsp[(1) - (2)].regexp)); - break; - case '+': - (yyval.regexp) = new CatOp (new CloseOp((yyvsp[(1) - (2)].regexp)), (yyvsp[(1) - (2)].regexp)); - break; - case '?': - (yyval.regexp) = mkAlt((yyvsp[(1) - (2)].regexp), new NullOp()); - break; - } - ;} - break; - - case 42: - - { - if ((yyvsp[(2) - (2)].extop).max == std::numeric_limits::max()) - { - (yyval.regexp) = repeat_from ((yyvsp[(1) - (2)].regexp), (yyvsp[(2) - (2)].extop).min); - } - else if ((yyvsp[(2) - (2)].extop).min == (yyvsp[(2) - (2)].extop).max) - { - (yyval.regexp) = repeat ((yyvsp[(1) - (2)].regexp), (yyvsp[(2) - (2)].extop).min); - } - else - { - (yyval.regexp) = repeat_from_to ((yyvsp[(1) - (2)].regexp), (yyvsp[(2) - (2)].extop).min, (yyvsp[(2) - (2)].extop).max); - } - (yyval.regexp) = (yyval.regexp) ? (yyval.regexp) : new NullOp; - ;} - break; - - case 43: - - { - (yyval.op) = (yyvsp[(1) - (1)].op); - ;} - break; - - case 44: - - { - (yyval.op) = (yyvsp[(1) - (1)].op); - ;} - break; - - case 45: - - { - (yyval.op) = ((yyvsp[(1) - (2)].op) == (yyvsp[(2) - (2)].op)) ? (yyvsp[(1) - (2)].op) : '*'; - ;} - break; - - case 46: - - { - (yyval.op) = ((yyvsp[(1) - (2)].op) == (yyvsp[(2) - (2)].op)) ? (yyvsp[(1) - (2)].op) : '*'; - ;} - break; - - case 47: - - { - symbol_table_t::iterator i = symbol_table.find (* (yyvsp[(1) - (1)].str)); - delete (yyvsp[(1) - (1)].str); - if (i == symbol_table.end ()) - { - in->fatal("can't find symbol"); - } - (yyval.regexp) = i->second; - ;} - break; - - case 48: - - { - (yyval.regexp) = (yyvsp[(1) - (1)].regexp); - ;} - break; - - case 49: - - { - (yyval.regexp) = (yyvsp[(2) - (3)].regexp); - ;} - break; - - - - default: break; - } - YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); - - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - - *++yyvsp = yyval; - - /* Now `shift' the result of the reduction. Determine what state - that goes to, based on the state we popped back to and the rule - number reduced by. */ - - yyn = yyr1[yyn]; - - yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; - if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) - yystate = yytable[yystate]; - else - yystate = yydefgoto[yyn - YYNTOKENS]; - - goto yynewstate; - - -/*------------------------------------. -| yyerrlab -- here on detecting error | -`------------------------------------*/ -yyerrlab: - /* If not already recovering from an error, report this error. */ - if (!yyerrstatus) - { - ++yynerrs; -#if ! YYERROR_VERBOSE - yyerror (YY_("syntax error")); -#else - { - YYSIZE_T yysize = yysyntax_error (0, yystate, yychar); - if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM) - { - YYSIZE_T yyalloc = 2 * yysize; - if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM)) - yyalloc = YYSTACK_ALLOC_MAXIMUM; - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); - yymsg = (char *) YYSTACK_ALLOC (yyalloc); - if (yymsg) - yymsg_alloc = yyalloc; - else - { - yymsg = yymsgbuf; - yymsg_alloc = sizeof yymsgbuf; - } - } - - if (0 < yysize && yysize <= yymsg_alloc) - { - (void) yysyntax_error (yymsg, yystate, yychar); - yyerror (yymsg); - } - else - { - yyerror (YY_("syntax error")); - if (yysize != 0) - goto yyexhaustedlab; - } - } -#endif - } - - - - if (yyerrstatus == 3) - { - /* If just tried and failed to reuse lookahead token after an - error, discard it. */ - - if (yychar <= YYEOF) - { - /* Return failure if at end of input. */ - if (yychar == YYEOF) - YYABORT; - } - else - { - yydestruct ("Error: discarding", - yytoken, &yylval); - yychar = YYEMPTY; - } - } - - /* Else will try to reuse lookahead token after shifting the error - token. */ - goto yyerrlab1; - - -/*---------------------------------------------------. -| yyerrorlab -- error raised explicitly by YYERROR. | -`---------------------------------------------------*/ -yyerrorlab: - - /* Pacify compilers like GCC when the user code never invokes - YYERROR and the label yyerrorlab therefore never appears in user - code. */ - if (/*CONSTCOND*/ 0) - goto yyerrorlab; - - /* Do not reclaim the symbols of the rule which action triggered - this YYERROR. */ - YYPOPSTACK (yylen); - yylen = 0; - YY_STACK_PRINT (yyss, yyssp); - yystate = *yyssp; - goto yyerrlab1; - - -/*-------------------------------------------------------------. -| yyerrlab1 -- common code for both syntax error and YYERROR. | -`-------------------------------------------------------------*/ -yyerrlab1: - yyerrstatus = 3; /* Each real token shifted decrements this. */ - - for (;;) - { - yyn = yypact[yystate]; - if (yyn != YYPACT_NINF) - { - yyn += YYTERROR; - if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) - { - yyn = yytable[yyn]; - if (0 < yyn) - break; - } - } - - /* Pop the current state because it cannot handle the error token. */ - if (yyssp == yyss) - YYABORT; - - - yydestruct ("Error: popping", - yystos[yystate], yyvsp); - YYPOPSTACK (1); - yystate = *yyssp; - YY_STACK_PRINT (yyss, yyssp); - } - - *++yyvsp = yylval; - - - /* Shift the error token. */ - YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp); - - yystate = yyn; - goto yynewstate; - - -/*-------------------------------------. -| yyacceptlab -- YYACCEPT comes here. | -`-------------------------------------*/ -yyacceptlab: - yyresult = 0; - goto yyreturn; - -/*-----------------------------------. -| yyabortlab -- YYABORT comes here. | -`-----------------------------------*/ -yyabortlab: - yyresult = 1; - goto yyreturn; - -#if !defined(yyoverflow) || YYERROR_VERBOSE -/*-------------------------------------------------. -| yyexhaustedlab -- memory exhaustion comes here. | -`-------------------------------------------------*/ -yyexhaustedlab: - yyerror (YY_("memory exhausted")); - yyresult = 2; - /* Fall through. */ -#endif - -yyreturn: - if (yychar != YYEMPTY) - yydestruct ("Cleanup: discarding lookahead", - yytoken, &yylval); - /* Do not reclaim the symbols of the rule which action triggered - this YYABORT or YYACCEPT. */ - YYPOPSTACK (yylen); - YY_STACK_PRINT (yyss, yyssp); - while (yyssp != yyss) - { - yydestruct ("Cleanup: popping", - yystos[*yyssp], yyvsp); - YYPOPSTACK (1); - } -#ifndef yyoverflow - if (yyss != yyssa) - YYSTACK_FREE (yyss); -#endif -#if YYERROR_VERBOSE - if (yymsg != yymsgbuf) - YYSTACK_FREE (yymsg); -#endif - /* Make sure YYID is used. */ - return YYID (yyresult); -} - - - - - -extern "C" { -void yyerror(const char* s) -{ - in->fatal(s); -} - -int yylex(){ - return in ? in->scan() : 0; -} -} // end extern "C" - -namespace re2c -{ - -void parse(Scanner& i, Output & o) -{ - std::map > dfa_map; - ScannerState rules_state; - - in = &i; - - o.source.wversion_time () - .wline_info (in->get_cline (), in->get_fname ().c_str ()); - if (opts->target == opt_t::SKELETON) - { - Skeleton::emit_prolog (o.source); - } - - Enc encodingOld = opts->encoding; - - while ((parseMode = i.echo()) != Scanner::Stop) - { - o.source.new_block (); - bool bPrologBrace = false; - ScannerState curr_state; - - i.save_state(curr_state); - foundRules = false; - - if (opts->rFlag && parseMode == Scanner::Rules && dfa_map.size()) - { - in->fatal("cannot have a second 'rules:re2c' block"); - } - if (parseMode == Scanner::Reuse) - { - if (dfa_map.empty()) - { - in->fatal("got 'use:re2c' without 'rules:re2c'"); - } - } - else if (parseMode == Scanner::Rules) - { - i.save_state(rules_state); - } - else - { - dfa_map.clear(); - } - rank_counter.reset (); - spec.clear (); - in->set_in_parse(true); - yyparse(); - in->set_in_parse(false); - if (opts->rFlag && parseMode == Scanner::Reuse) - { - if (foundRules || opts->encoding != encodingOld) - { - // Re-parse rules - parseMode = Scanner::Parse; - i.restore_state(rules_state); - i.reuse(); - dfa_map.clear(); - parse_cleanup(); - spec.clear (); - rank_counter.reset (); - in->set_in_parse(true); - yyparse(); - in->set_in_parse(false); - - // Now append potential new rules - i.restore_state(curr_state); - parseMode = Scanner::Parse; - in->set_in_parse(true); - yyparse(); - in->set_in_parse(false); - } - encodingOld = opts->encoding; - } - o.source.set_block_line (in->get_cline ()); - uint32_t ind = opts->topIndent; - if (opts->cFlag) - { - SpecMap::iterator it; - SetupMap::const_iterator itRuleSetup; - - if (parseMode != Scanner::Reuse) - { - // <*> rules must have the lowest priority - // now that all rules have been parsed, we can fix it - for (RuleOpList::const_iterator itOp = specStar.begin(); itOp != specStar.end(); ++itOp) - { - (*itOp)->rank = rank_counter.next (); - } - // merge <*> rules to all conditions - for (it = specMap.begin(); it != specMap.end(); ++it) - { - for (RuleOpList::const_iterator itOp = specStar.begin(); itOp != specStar.end(); ++itOp) - { - it->second.add (*itOp); - } - if (star_default) - { - it->second.add_def (star_default); - } - } - - if (specNone) - { - specMap["0"].add (specNone); - // Note that "0" inserts first, which is important. - condnames.insert (condnames.begin (), "0"); - } - o.types = condnames; - } - - size_t nCount = specMap.size(); - - for (it = specMap.begin(); it != specMap.end(); ++it) - { - if (parseMode != Scanner::Reuse) - { - itRuleSetup = ruleSetupMap.find(it->first); - if (itRuleSetup != ruleSetupMap.end()) - { - yySetupRule = itRuleSetup->second.second; - } - else - { - itRuleSetup = ruleSetupMap.find("*"); - if (itRuleSetup != ruleSetupMap.end()) - { - yySetupRule = itRuleSetup->second.second; - } - else - { - yySetupRule = ""; - } - } - - dfa_map[it->first] = compile(it->second, o, it->first, opts->encoding.nCodeUnits ()); - } - if (parseMode != Scanner::Rules && dfa_map.find(it->first) != dfa_map.end()) - { - dfa_map[it->first]->emit(o, ind, !--nCount, bPrologBrace); - } - } - } - else - { - if (spec.re || !dfa_map.empty()) - { - if (parseMode != Scanner::Reuse) - { - dfa_map[""] = compile(spec, o, "", opts->encoding.nCodeUnits ()); - } - if (parseMode != Scanner::Rules && dfa_map.find("") != dfa_map.end()) - { - dfa_map[""]->emit(o, ind, 0, bPrologBrace); - } - } - } - o.source.wline_info (in->get_cline (), in->get_fname ().c_str ()); - /* restore original char handling mode*/ - opts.reset_encoding (encodingOld); - } - - if (opts->cFlag) - { - SetupMap::const_iterator itRuleSetup; - for (itRuleSetup = ruleSetupMap.begin(); itRuleSetup != ruleSetupMap.end(); ++itRuleSetup) - { - if (itRuleSetup->first != "*" && specMap.find(itRuleSetup->first) == specMap.end()) - { - in->fatalf_at(itRuleSetup->second.first, "setup for non existing rule '%s' found", itRuleSetup->first.c_str()); - } - } - if (specMap.size() < ruleSetupMap.size()) - { - uint32_t line = in->get_cline(); - itRuleSetup = ruleSetupMap.find("*"); - if (itRuleSetup != ruleSetupMap.end()) - { - line = itRuleSetup->second.first; - } - in->fatalf_at(line, "setup for all rules with '*' not possible when all rules are setup explicitly"); - } - } - - if (opts->target == opt_t::SKELETON) - { - Skeleton::emit_epilog (o.source, o.skeletons); - } - - parse_cleanup(); - in = NULL; -} - -void parse_cleanup() -{ - RegExp::vFreeList.clear(); - Range::vFreeList.clear(); - RangeSuffix::freeList.clear(); - Code::freelist.clear(); - symbol_table.clear (); - condnames.clear (); - specMap.clear(); - specStar.clear(); - star_default = NULL; - specNone = NULL; -} - -} // end namespace re2c - diff --git a/build.sh b/build.sh deleted file mode 100755 index 44055ce..0000000 --- a/build.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -builddir=.build -rm -rf $builddir -mkdir $builddir - -cd $builddir -../configure && \ -make -j5 -cd .. diff --git a/build_mingw.sh b/build_mingw.sh deleted file mode 100755 index 765e80e..0000000 --- a/build_mingw.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/sh - -builddir=.build_mingw -rm -rf $builddir -mkdir $builddir - -cd $builddir -../configure --host i686-w64-mingw32 && \ -make -j5 -cd .. diff --git a/compile b/compile new file mode 100755 index 0000000..2ab71e4 --- /dev/null +++ b/compile @@ -0,0 +1,348 @@ +#! /bin/sh +# Wrapper for compilers which do not understand '-c -o'. + +scriptversion=2016-01-11.22; # UTC + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +nl=' +' + +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent tools from complaining about whitespace usage. +IFS=" "" $nl" + +file_conv= + +# func_file_conv build_file lazy +# Convert a $build file to $host form and store it in $file +# Currently only supports Windows hosts. If the determined conversion +# type is listed in (the comma separated) LAZY, no conversion will +# take place. +func_file_conv () +{ + file=$1 + case $file in + / | /[!/]*) # absolute file, and not a UNC file + if test -z "$file_conv"; then + # lazily determine how to convert abs files + case `uname -s` in + MINGW*) + file_conv=mingw + ;; + CYGWIN*) + file_conv=cygwin + ;; + *) + file_conv=wine + ;; + esac + fi + case $file_conv/,$2, in + *,$file_conv,*) + ;; + mingw/*) + file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` + ;; + cygwin/*) + file=`cygpath -m "$file" || echo "$file"` + ;; + wine/*) + file=`winepath -w "$file" || echo "$file"` + ;; + esac + ;; + esac +} + +# func_cl_dashL linkdir +# Make cl look for libraries in LINKDIR +func_cl_dashL () +{ + func_file_conv "$1" + if test -z "$lib_path"; then + lib_path=$file + else + lib_path="$lib_path;$file" + fi + linker_opts="$linker_opts -LIBPATH:$file" +} + +# func_cl_dashl library +# Do a library search-path lookup for cl +func_cl_dashl () +{ + lib=$1 + found=no + save_IFS=$IFS + IFS=';' + for dir in $lib_path $LIB + do + IFS=$save_IFS + if $shared && test -f "$dir/$lib.dll.lib"; then + found=yes + lib=$dir/$lib.dll.lib + break + fi + if test -f "$dir/$lib.lib"; then + found=yes + lib=$dir/$lib.lib + break + fi + if test -f "$dir/lib$lib.a"; then + found=yes + lib=$dir/lib$lib.a + break + fi + done + IFS=$save_IFS + + if test "$found" != yes; then + lib=$lib.lib + fi +} + +# func_cl_wrapper cl arg... +# Adjust compile command to suit cl +func_cl_wrapper () +{ + # Assume a capable shell + lib_path= + shared=: + linker_opts= + for arg + do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + eat=1 + case $2 in + *.o | *.[oO][bB][jJ]) + func_file_conv "$2" + set x "$@" -Fo"$file" + shift + ;; + *) + func_file_conv "$2" + set x "$@" -Fe"$file" + shift + ;; + esac + ;; + -I) + eat=1 + func_file_conv "$2" mingw + set x "$@" -I"$file" + shift + ;; + -I*) + func_file_conv "${1#-I}" mingw + set x "$@" -I"$file" + shift + ;; + -l) + eat=1 + func_cl_dashl "$2" + set x "$@" "$lib" + shift + ;; + -l*) + func_cl_dashl "${1#-l}" + set x "$@" "$lib" + shift + ;; + -L) + eat=1 + func_cl_dashL "$2" + ;; + -L*) + func_cl_dashL "${1#-L}" + ;; + -static) + shared=false + ;; + -Wl,*) + arg=${1#-Wl,} + save_ifs="$IFS"; IFS=',' + for flag in $arg; do + IFS="$save_ifs" + linker_opts="$linker_opts $flag" + done + IFS="$save_ifs" + ;; + -Xlinker) + eat=1 + linker_opts="$linker_opts $2" + ;; + -*) + set x "$@" "$1" + shift + ;; + *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) + func_file_conv "$1" + set x "$@" -Tp"$file" + shift + ;; + *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) + func_file_conv "$1" mingw + set x "$@" "$file" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift + done + if test -n "$linker_opts"; then + linker_opts="-link$linker_opts" + fi + exec "$@" $linker_opts + exit 1 +} + +eat= + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: compile [--help] [--version] PROGRAM [ARGS] + +Wrapper for compilers which do not understand '-c -o'. +Remove '-o dest.o' from ARGS, run PROGRAM with the remaining +arguments, and rename the output as expected. + +If you are trying to build a whole package this is not the +right script to run: please start by reading the file 'INSTALL'. + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "compile $scriptversion" + exit $? + ;; + cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ + icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) + func_cl_wrapper "$@" # Doesn't return... + ;; +esac + +ofile= +cfile= + +for arg +do + if test -n "$eat"; then + eat= + else + case $1 in + -o) + # configure might choose to run compile as 'compile cc -o foo foo.c'. + # So we strip '-o arg' only if arg is an object. + eat=1 + case $2 in + *.o | *.obj) + ofile=$2 + ;; + *) + set x "$@" -o "$2" + shift + ;; + esac + ;; + *.c) + cfile=$1 + set x "$@" "$1" + shift + ;; + *) + set x "$@" "$1" + shift + ;; + esac + fi + shift +done + +if test -z "$ofile" || test -z "$cfile"; then + # If no '-o' option was seen then we might have been invoked from a + # pattern rule where we don't need one. That is ok -- this is a + # normal compilation that the losing compiler can handle. If no + # '.c' file was seen then we are probably linking. That is also + # ok. + exec "$@" +fi + +# Name of file we expect compiler to create. +cofile=`echo "$cfile" | sed 's|^.*[\\/]||; s|^[a-zA-Z]:||; s/\.c$/.o/'` + +# Create the lock directory. +# Note: use '[/\\:.-]' here to ensure that we don't use the same name +# that we are using for the .o file. Also, base the name on the expected +# object file name, since that is what matters with a parallel build. +lockdir=`echo "$cofile" | sed -e 's|[/\\:.-]|_|g'`.d +while true; do + if mkdir "$lockdir" >/dev/null 2>&1; then + break + fi + sleep 1 +done +# FIXME: race condition here if user kills between mkdir and trap. +trap "rmdir '$lockdir'; exit 1" 1 2 15 + +# Run the compile. +"$@" +ret=$? + +if test -f "$cofile"; then + test "$cofile" = "$ofile" || mv "$cofile" "$ofile" +elif test -f "${cofile}bj"; then + test "${cofile}bj" = "$ofile" || mv "${cofile}bj" "$ofile" +fi + +rmdir "$lockdir" +exit $ret + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/config.h.in b/config.h.in new file mode 100644 index 0000000..9dc3aba --- /dev/null +++ b/config.h.in @@ -0,0 +1,58 @@ +/* config.h.in. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* The size of `0i8', as computed by sizeof. */ +#undef SIZEOF_0I8 + +/* The size of `0l', as computed by sizeof. */ +#undef SIZEOF_0L + +/* The size of `0ll', as computed by sizeof. */ +#undef SIZEOF_0LL + +/* The size of `char', as computed by sizeof. */ +#undef SIZEOF_CHAR + +/* The size of `int', as computed by sizeof. */ +#undef SIZEOF_INT + +/* The size of `long', as computed by sizeof. */ +#undef SIZEOF_LONG + +/* The size of `long long', as computed by sizeof. */ +#undef SIZEOF_LONG_LONG + +/* The size of `short', as computed by sizeof. */ +#undef SIZEOF_SHORT + +/* The size of `void *', as computed by sizeof. */ +#undef SIZEOF_VOID_P + +/* The size of `__int64', as computed by sizeof. */ +#undef SIZEOF___INT64 + +/* Version number of package */ +#undef VERSION diff --git a/configure b/configure new file mode 100755 index 0000000..43da575 --- /dev/null +++ b/configure @@ -0,0 +1,6690 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for re2c 1.0.3. +# +# Report bugs to . +# +# +# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. +# +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + +# Use a proper internal environment variable to ensure we don't fall + # into an infinite loop, continuously re-executing ourselves. + if test x"${_as_can_reexec}" != xno && test "x$CONFIG_SHELL" != x; then + _as_can_reexec=no; export _as_can_reexec; + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +as_fn_exit 255 + fi + # We don't want this to propagate to other subprocesses. + { _as_can_reexec=; unset _as_can_reexec;} +if test "x$CONFIG_SHELL" = x; then + as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which + # is contrary to our usage. Disable this feature. + alias -g '\${1+\"\$@\"}'='\"\$@\"' + setopt NO_GLOB_SUBST +else + case \`(set -o) 2>/dev/null\` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi +" + as_required="as_fn_return () { (exit \$1); } +as_fn_success () { as_fn_return 0; } +as_fn_failure () { as_fn_return 1; } +as_fn_ret_success () { return 0; } +as_fn_ret_failure () { return 1; } + +exitcode=0 +as_fn_success || { exitcode=1; echo as_fn_success failed.; } +as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } +as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } +as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } +if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : + +else + exitcode=1; echo positional parameters were not saved. +fi +test x\$exitcode = x0 || exit 1 +test -x / || exit 1" + as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO + as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO + eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && + test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 +test \$(( 1 + 1 )) = 2 || exit 1" + if (eval "$as_required") 2>/dev/null; then : + as_have_required=yes +else + as_have_required=no +fi + if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : + +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +as_found=false +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_found=: + case $as_dir in #( + /*) + for as_base in sh bash ksh sh5; do + # Try only shells that exist, to save several forks. + as_shell=$as_dir/$as_base + if { test -f "$as_shell" || test -f "$as_shell.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : + CONFIG_SHELL=$as_shell as_have_required=yes + if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : + break 2 +fi +fi + done;; + esac + as_found=false +done +$as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && + { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : + CONFIG_SHELL=$SHELL as_have_required=yes +fi; } +IFS=$as_save_IFS + + + if test "x$CONFIG_SHELL" != x; then : + export CONFIG_SHELL + # We cannot yet assume a decent shell, so we have to provide a +# neutralization value for shells without unset; and this also +# works around shells that cannot unset nonexistent variables. +# Preserve -v and -x to the replacement shell. +BASH_ENV=/dev/null +ENV=/dev/null +(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV +case $- in # (((( + *v*x* | *x*v* ) as_opts=-vx ;; + *v* ) as_opts=-v ;; + *x* ) as_opts=-x ;; + * ) as_opts= ;; +esac +exec $CONFIG_SHELL $as_opts "$as_myself" ${1+"$@"} +# Admittedly, this is quite paranoid, since all the known shells bail +# out after a failed `exec'. +$as_echo "$0: could not re-execute with $CONFIG_SHELL" >&2 +exit 255 +fi + + if test x$as_have_required = xno; then : + $as_echo "$0: This script requires a shell more modern than all" + $as_echo "$0: the shells that I found on your system." + if test x${ZSH_VERSION+set} = xset ; then + $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" + $as_echo "$0: be upgraded to zsh 4.3.4 or later." + else + $as_echo "$0: Please tell bug-autoconf@gnu.org and +$0: re2c-general@lists.sourceforge.net about your system, +$0: including any error possibly output before this +$0: message. Then install a modern shell, or manually run +$0: the script under such a shell if you do have one." + fi + exit 1 +fi +fi +fi +SHELL=${CONFIG_SHELL-/bin/sh} +export SHELL +# Unset more variables known to interfere with behavior of common tools. +CLICOLOR_FORCE= GREP_OPTIONS= +unset CLICOLOR_FORCE GREP_OPTIONS + +## --------------------- ## +## M4sh Shell Functions. ## +## --------------------- ## +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + + + as_lineno_1=$LINENO as_lineno_1a=$LINENO + as_lineno_2=$LINENO as_lineno_2a=$LINENO + eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && + test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { + # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) + sed -n ' + p + /[$]LINENO/= + ' <$as_myself | + sed ' + s/[$]LINENO.*/&-/ + t lineno + b + :lineno + N + :loop + s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ + t loop + s/-\n.*// + ' >$as_me.lineno && + chmod +x "$as_me.lineno" || + { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } + + # If we had to re-execute with $CONFIG_SHELL, we're ensured to have + # already done that, so ensure we don't try to do so again and fall + # in an infinite loop. This has already happened in practice. + _as_can_reexec=no; export _as_can_reexec + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensitive to this). + . "./$as_me.lineno" + # Exit status is that of the last command. + exit +} + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +test -n "$DJDIR" || exec 7<&0 &1 + +# Name of the host. +# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_clean_files= +ac_config_libobj_dir=. +LIBOBJS= +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= + +# Identity of this package. +PACKAGE_NAME='re2c' +PACKAGE_TARNAME='re2c' +PACKAGE_VERSION='1.0.3' +PACKAGE_STRING='re2c 1.0.3' +PACKAGE_BUGREPORT='re2c-general@lists.sourceforge.net' +PACKAGE_URL='' + +ac_unique_file="src/main.cc" +ac_subst_vars='am__EXEEXT_FALSE +am__EXEEXT_TRUE +LTLIBOBJS +LIBOBJS +CXXFLAGSDEFAULT +am__fastdepCXX_FALSE +am__fastdepCXX_TRUE +CXXDEPMODE +ac_ct_CXX +CXXFLAGS +CXX +am__fastdepCC_FALSE +am__fastdepCC_TRUE +CCDEPMODE +am__nodep +AMDEPBACKSLASH +AMDEP_FALSE +AMDEP_TRUE +am__quote +am__include +DEPDIR +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +BISON +RST2MAN +REBUILD_DOCS_FALSE +REBUILD_DOCS_TRUE +PACKAGE_RELEASE +PACKAGE_DATE +AM_BACKSLASH +AM_DEFAULT_VERBOSITY +AM_DEFAULT_V +AM_V +am__untar +am__tar +AMTAR +am__leading_dot +SET_MAKE +AWK +mkdir_p +MKDIR_P +INSTALL_STRIP_PROGRAM +STRIP +install_sh +MAKEINFO +AUTOHEADER +AUTOMAKE +AUTOCONF +ACLOCAL +VERSION +PACKAGE +CYGPATH_W +am__isrc +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +target_alias +host_alias +build_alias +LIBS +ECHO_T +ECHO_N +ECHO_C +DEFS +mandir +localedir +libdir +psdir +pdfdir +dvidir +htmldir +infodir +docdir +oldincludedir +includedir +localstatedir +sharedstatedir +sysconfdir +datadir +datarootdir +libexecdir +sbindir +bindir +program_transform_name +prefix +exec_prefix +PACKAGE_URL +PACKAGE_BUGREPORT +PACKAGE_STRING +PACKAGE_VERSION +PACKAGE_TARNAME +PACKAGE_NAME +PATH_SEPARATOR +SHELL' +ac_subst_files='' +ac_user_opts=' +enable_option_checking +enable_silent_rules +enable_docs +enable_dependency_tracking +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +CXX +CXXFLAGS +CCC' + + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +ac_unrecognized_opts= +ac_unrecognized_sep= +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +# (The list follows the same order as the GNU Coding Standards.) +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datarootdir='${prefix}/share' +datadir='${datarootdir}' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +includedir='${prefix}/include' +oldincludedir='/usr/include' +docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' +infodir='${datarootdir}/info' +htmldir='${docdir}' +dvidir='${docdir}' +pdfdir='${docdir}' +psdir='${docdir}' +libdir='${exec_prefix}/lib' +localedir='${datarootdir}/locale' +mandir='${datarootdir}/man' + +ac_prev= +ac_dashdash= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval $ac_prev=\$ac_option + ac_prev= + continue + fi + + case $ac_option in + *=?*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; + *=) ac_optarg= ;; + *) ac_optarg=yes ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_dashdash$ac_option in + --) + ac_dashdash=yes ;; + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=*) + datadir=$ac_optarg ;; + + -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ + | --dataroo | --dataro | --datar) + ac_prev=datarootdir ;; + -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ + | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) + datarootdir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=no ;; + + -docdir | --docdir | --docdi | --doc | --do) + ac_prev=docdir ;; + -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) + docdir=$ac_optarg ;; + + -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) + ac_prev=dvidir ;; + -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) + dvidir=$ac_optarg ;; + + -enable-* | --enable-*) + ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid feature name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"enable_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval enable_$ac_useropt=\$ac_optarg ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) + ac_prev=htmldir ;; + -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ + | --ht=*) + htmldir=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localedir | --localedir | --localedi | --localed | --locale) + ac_prev=localedir ;; + -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) + localedir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst | --locals) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) + ac_prev=pdfdir ;; + -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) + pdfdir=$ac_optarg ;; + + -psdir | --psdir | --psdi | --psd | --ps) + ac_prev=psdir ;; + -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) + psdir=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=\$ac_optarg ;; + + -without-* | --without-*) + ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && + as_fn_error $? "invalid package name: $ac_useropt" + ac_useropt_orig=$ac_useropt + ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` + case $ac_user_opts in + *" +"with_$ac_useropt" +"*) ;; + *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" + ac_unrecognized_sep=', ';; + esac + eval with_$ac_useropt=no ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) as_fn_error $? "unrecognized option: \`$ac_option' +Try \`$0 --help' for more information" + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + case $ac_envvar in #( + '' | [0-9]* | *[!_$as_cr_alnum]* ) + as_fn_error $? "invalid variable name: \`$ac_envvar'" ;; + esac + eval $ac_envvar=\$ac_optarg + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : "${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}" + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + as_fn_error $? "missing argument to $ac_option" +fi + +if test -n "$ac_unrecognized_opts"; then + case $enable_option_checking in + no) ;; + fatal) as_fn_error $? "unrecognized options: $ac_unrecognized_opts" ;; + *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; + esac +fi + +# Check all directory arguments for consistency. +for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ + datadir sysconfdir sharedstatedir localstatedir includedir \ + oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ + libdir localedir mandir +do + eval ac_val=\$$ac_var + # Remove trailing slashes. + case $ac_val in + */ ) + ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` + eval $ac_var=\$ac_val;; + esac + # Be sure to have absolute directory names. + case $ac_val in + [\\/$]* | ?:[\\/]* ) continue;; + NONE | '' ) case $ac_var in *prefix ) continue;; esac;; + esac + as_fn_error $? "expected an absolute directory name for --$ac_var: $ac_val" +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +ac_pwd=`pwd` && test -n "$ac_pwd" && +ac_ls_di=`ls -di .` && +ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || + as_fn_error $? "working directory cannot be determined" +test "X$ac_ls_di" = "X$ac_pwd_ls_di" || + as_fn_error $? "pwd does not report name of working directory" + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then the parent directory. + ac_confdir=`$as_dirname -- "$as_myself" || +$as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_myself" : 'X\(//\)[^/]' \| \ + X"$as_myself" : 'X\(//\)$' \| \ + X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_myself" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r "$srcdir/$ac_unique_file"; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r "$srcdir/$ac_unique_file"; then + test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." + as_fn_error $? "cannot find sources ($ac_unique_file) in $srcdir" +fi +ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" +ac_abs_confdir=`( + cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error $? "$ac_msg" + pwd)` +# When building in place, set srcdir=. +if test "$ac_abs_confdir" = "$ac_pwd"; then + srcdir=. +fi +# Remove unnecessary trailing slashes from srcdir. +# Double slashes in file names in object file debugging info +# mess up M-x gdb in Emacs. +case $srcdir in +*/) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; +esac +for ac_var in $ac_precious_vars; do + eval ac_env_${ac_var}_set=\${${ac_var}+set} + eval ac_env_${ac_var}_value=\$${ac_var} + eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} + eval ac_cv_env_${ac_var}_value=\$${ac_var} +done + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures re2c 1.0.3 to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking ...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] + --datadir=DIR read-only architecture-independent data [DATAROOTDIR] + --infodir=DIR info documentation [DATAROOTDIR/info] + --localedir=DIR locale-dependent data [DATAROOTDIR/locale] + --mandir=DIR man documentation [DATAROOTDIR/man] + --docdir=DIR documentation root [DATAROOTDIR/doc/re2c] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of re2c 1.0.3:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-option-checking ignore unrecognized --enable/--with options + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --enable-silent-rules less verbose build output (undo: "make V=1") + --disable-silent-rules verbose build output (undo: "make V=0") + --enable-docs regenerate manpage + --enable-dependency-tracking + do not reject slow dependency extractors + --disable-dependency-tracking + speeds up one-time build + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + LIBS libraries to pass to the linker, e.g. -l + CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if + you have headers in a nonstandard directory + CXX C++ compiler command + CXXFLAGS C++ compiler flags + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +ac_status=$? +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d "$ac_dir" || + { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || + continue + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + cd "$ac_dir" || { ac_status=$?; continue; } + # Check for guested configure. + if test -f "$ac_srcdir/configure.gnu"; then + echo && + $SHELL "$ac_srcdir/configure.gnu" --help=recursive + elif test -f "$ac_srcdir/configure"; then + echo && + $SHELL "$ac_srcdir/configure" --help=recursive + else + $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi || ac_status=$? + cd "$ac_pwd" || { ac_status=$?; break; } + done +fi + +test -n "$ac_init_help" && exit $ac_status +if $ac_init_version; then + cat <<\_ACEOF +re2c configure 1.0.3 +generated by GNU Autoconf 2.69 + +Copyright (C) 2012 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit +fi + +## ------------------------ ## +## Autoconf initialization. ## +## ------------------------ ## + +# ac_fn_c_try_compile LINENO +# -------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_c_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_compile + +# ac_fn_cxx_try_compile LINENO +# ---------------------------- +# Try to compile conftest.$ac_ext, and return whether this succeeded. +ac_fn_cxx_try_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + rm -f conftest.$ac_objext + if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + grep -v '^ *+' conftest.err >conftest.er1 + cat conftest.er1 >&5 + mv -f conftest.er1 conftest.err + fi + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { + test -z "$ac_cxx_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then : + ac_retval=0 +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=1 +fi + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_cxx_try_compile + +# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES +# ------------------------------------------------------- +# Tests whether HEADER exists and can be compiled using the include files in +# INCLUDES, setting the cache variable VAR accordingly. +ac_fn_c_check_header_compile () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 +$as_echo_n "checking for $2... " >&6; } +if eval \${$3+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +#include <$2> +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + eval "$3=yes" +else + eval "$3=no" +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +eval ac_res=\$$3 + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 +$as_echo "$ac_res" >&6; } + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + +} # ac_fn_c_check_header_compile + +# ac_fn_c_try_run LINENO +# ---------------------- +# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes +# that executables *can* be run. +ac_fn_c_try_run () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then : + ac_retval=0 +else + $as_echo "$as_me: program exited with status $ac_status" >&5 + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_retval=$ac_status +fi + rm -rf conftest.dSYM conftest_ipa8_conftest.oo + eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno + as_fn_set_status $ac_retval + +} # ac_fn_c_try_run + +# ac_fn_c_compute_int LINENO EXPR VAR INCLUDES +# -------------------------------------------- +# Tries to find the compile-time value of EXPR in a program that includes +# INCLUDES, setting VAR accordingly. Returns whether the value could be +# computed +ac_fn_c_compute_int () +{ + as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + if test "$cross_compiling" = yes; then + # Depending upon the size, compute the lo and hi bounds. +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= 0)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=0 ac_mid=0 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid; break +else + as_fn_arith $ac_mid + 1 && ac_lo=$as_val + if test $ac_lo -le $ac_mid; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid + 1 && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) < 0)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=-1 ac_mid=-1 + while :; do + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) >= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_lo=$ac_mid; break +else + as_fn_arith '(' $ac_mid ')' - 1 && ac_hi=$as_val + if test $ac_mid -le $ac_hi; then + ac_lo= ac_hi= + break + fi + as_fn_arith 2 '*' $ac_mid && ac_mid=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + done +else + ac_lo= ac_hi= +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +# Binary search between lo and hi bounds. +while test "x$ac_lo" != "x$ac_hi"; do + as_fn_arith '(' $ac_hi - $ac_lo ')' / 2 + $ac_lo && ac_mid=$as_val + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +int +main () +{ +static int test_array [1 - 2 * !(($2) <= $ac_mid)]; +test_array [0] = 0; +return test_array [0]; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_hi=$ac_mid +else + as_fn_arith '(' $ac_mid ')' + 1 && ac_lo=$as_val +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +done +case $ac_lo in #(( +?*) eval "$3=\$ac_lo"; ac_retval=0 ;; +'') ac_retval=1 ;; +esac + else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +$4 +static long int longval () { return $2; } +static unsigned long int ulongval () { return $2; } +#include +#include +int +main () +{ + + FILE *f = fopen ("conftest.val", "w"); + if (! f) + return 1; + if (($2) < 0) + { + long int i = longval (); + if (i != ($2)) + return 1; + fprintf (f, "%ld", i); + } + else + { + unsigned long int i = ulongval (); + if (i != ($2)) + return 1; + fprintf (f, "%lu", i); + } + /* Do not output a trailing newline, as this causes \r\n confusion + on some platforms. */ + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + echo >>conftest.val; read $3 config.log <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by re2c $as_me 1.0.3, which was +generated by GNU Autoconf 2.69. Invocation command line was + + $ $0 $@ + +_ACEOF +exec 5>>config.log +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +/usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + $as_echo "PATH: $as_dir" + done +IFS=$as_save_IFS + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *\'*) + ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; + 2) + as_fn_append ac_configure_args1 " '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + as_fn_append ac_configure_args " '$ac_arg'" + ;; + esac + done +done +{ ac_configure_args0=; unset ac_configure_args0;} +{ ac_configure_args1=; unset ac_configure_args1;} + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Use '\'' to represent an apostrophe within the trap. +# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + $as_echo "## ---------------- ## +## Cache variables. ## +## ---------------- ##" + echo + # The following way of writing the cache mishandles newlines in values, +( + for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + (set) 2>&1 | + case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + sed -n \ + "s/'\''/'\''\\\\'\'''\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" + ;; #( + *) + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) + echo + + $as_echo "## ----------------- ## +## Output variables. ## +## ----------------- ##" + echo + for ac_var in $ac_subst_vars + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + + if test -n "$ac_subst_files"; then + $as_echo "## ------------------- ## +## File substitutions. ## +## ------------------- ##" + echo + for ac_var in $ac_subst_files + do + eval ac_val=\$$ac_var + case $ac_val in + *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; + esac + $as_echo "$ac_var='\''$ac_val'\''" + done | sort + echo + fi + + if test -s confdefs.h; then + $as_echo "## ----------- ## +## confdefs.h. ## +## ----------- ##" + echo + cat confdefs.h + echo + fi + test "$ac_signal" != 0 && + $as_echo "$as_me: caught signal $ac_signal" + $as_echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core core.conftest.* && + rm -f -r conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status +' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -f -r conftest* confdefs.h + +$as_echo "/* confdefs.h */" > confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_URL "$PACKAGE_URL" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer an explicitly selected file to automatically selected ones. +ac_site_file1=NONE +ac_site_file2=NONE +if test -n "$CONFIG_SITE"; then + # We do not want a PATH search for config.site. + case $CONFIG_SITE in #(( + -*) ac_site_file1=./$CONFIG_SITE;; + */*) ac_site_file1=$CONFIG_SITE;; + *) ac_site_file1=./$CONFIG_SITE;; + esac +elif test "x$prefix" != xNONE; then + ac_site_file1=$prefix/share/config.site + ac_site_file2=$prefix/etc/config.site +else + ac_site_file1=$ac_default_prefix/share/config.site + ac_site_file2=$ac_default_prefix/etc/config.site +fi +for ac_site_file in "$ac_site_file1" "$ac_site_file2" +do + test "x$ac_site_file" = xNONE && continue + if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 +$as_echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" \ + || { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "failed to load site script $ac_site_file +See \`config.log' for more details" "$LINENO" 5; } + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special files + # actually), so we avoid doing that. DJGPP emulates it as a regular file. + if test /dev/null != "$cache_file" && test -f "$cache_file"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 +$as_echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . "$cache_file";; + *) . "./$cache_file";; + esac + fi +else + { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 +$as_echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in $ac_precious_vars; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val=\$ac_cv_env_${ac_var}_value + eval ac_new_val=\$ac_env_${ac_var}_value + case $ac_old_set,$ac_new_set in + set,) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 +$as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + # differences in whitespace do not lead to failure. + ac_old_val_w=`echo x $ac_old_val` + ac_new_val_w=`echo x $ac_new_val` + if test "$ac_old_val_w" != "$ac_new_val_w"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 +$as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + ac_cache_corrupted=: + else + { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 +$as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} + eval $ac_var=\$ac_old_val + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 +$as_echo "$as_me: former value: \`$ac_old_val'" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 +$as_echo "$as_me: current value: \`$ac_new_val'" >&2;} + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) as_fn_append ac_configure_args " '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} + { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 +$as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} + as_fn_error $? "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 +fi +## -------------------- ## +## Main body of script. ## +## -------------------- ## + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +am__api_version='1.15' + +ac_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do + if test -f "$ac_dir/install-sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f "$ac_dir/install.sh"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f "$ac_dir/shtool"; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + as_fn_error $? "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 +fi + +# These three variables are undocumented and unsupported, +# and are intended to be withdrawn in a future Autoconf release. +# They can cause serious problems if a builder's source tree is in a directory +# whose full name contains unusual characters. +ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. +ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. +ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. + + +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether build environment is sane" >&5 +$as_echo_n "checking whether build environment is sane... " >&6; } +# Reject unsafe characters in $srcdir or the absolute working directory +# name. Accept space and tab only in the latter. +am_lf=' +' +case `pwd` in + *[\\\"\#\$\&\'\`$am_lf]*) + as_fn_error $? "unsafe absolute working directory name" "$LINENO" 5;; +esac +case $srcdir in + *[\\\"\#\$\&\'\`$am_lf\ \ ]*) + as_fn_error $? "unsafe srcdir value: '$srcdir'" "$LINENO" 5;; +esac + +# Do 'set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + am_has_slept=no + for am_try in 1 2; do + echo "timestamp, slept: $am_has_slept" > conftest.file + set X `ls -Lt "$srcdir/configure" conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t "$srcdir/configure" conftest.file` + fi + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + as_fn_error $? "ls -t appears to fail. Make sure there is not a broken + alias in your environment" "$LINENO" 5 + fi + if test "$2" = conftest.file || test $am_try -eq 2; then + break + fi + # Just in case. + sleep 1 + am_has_slept=yes + done + test "$2" = conftest.file + ) +then + # Ok. + : +else + as_fn_error $? "newly created file is older than distributed files! +Check your system clock" "$LINENO" 5 +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +# If we didn't sleep, we still need to ensure time stamps of config.status and +# generated files are strictly newer. +am_sleep_pid= +if grep 'slept: no' conftest.file >/dev/null 2>&1; then + ( sleep 1 ) & + am_sleep_pid=$! +fi + +rm -f conftest.file + +test "$program_prefix" != NONE && + program_transform_name="s&^&$program_prefix&;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s&\$&$program_suffix&;$program_transform_name" +# Double any \ or $. +# By default was `s,x,x', remove it if useless. +ac_script='s/[\\$]/&&/g;s/;s,x,x,$//' +program_transform_name=`$as_echo "$program_transform_name" | sed "$ac_script"` + +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` + +if test x"${MISSING+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + MISSING="\${SHELL} \"$am_aux_dir/missing\"" ;; + *) + MISSING="\${SHELL} $am_aux_dir/missing" ;; + esac +fi +# Use eval to expand $SHELL +if eval "$MISSING --is-lightweight"; then + am_missing_run="$MISSING " +else + am_missing_run= + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing" >&5 +$as_echo "$as_me: WARNING: 'missing' script is too old or missing" >&2;} +fi + +if test x"${install_sh+set}" != xset; then + case $am_aux_dir in + *\ * | *\ *) + install_sh="\${SHELL} '$am_aux_dir/install-sh'" ;; + *) + install_sh="\${SHELL} $am_aux_dir/install-sh" + esac +fi + +# Installed binaries are usually stripped using 'strip' when the user +# run "make install-strip". However 'strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the 'STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $STRIP" >&5 +$as_echo "$STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_STRIP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP" >&5 +$as_echo "$ac_ct_STRIP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_STRIP" = x; then + STRIP=":" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + STRIP=$ac_ct_STRIP + fi +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\$(install_sh) -c -s" + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p" >&5 +$as_echo_n "checking for a thread-safe mkdir -p... " >&6; } +if test -z "$MKDIR_P"; then + if ${ac_cv_path_mkdir+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_prog in mkdir gmkdir; do + for ac_exec_ext in '' $ac_executable_extensions; do + as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext" || continue + case `"$as_dir/$ac_prog$ac_exec_ext" --version 2>&1` in #( + 'mkdir (GNU coreutils) '* | \ + 'mkdir (coreutils) '* | \ + 'mkdir (fileutils) '4.1*) + ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext + break 3;; + esac + done + done + done +IFS=$as_save_IFS + +fi + + test -d ./--version && rmdir ./--version + if test "${ac_cv_path_mkdir+set}" = set; then + MKDIR_P="$ac_cv_path_mkdir -p" + else + # As a last resort, use the slow shell script. Don't cache a + # value for MKDIR_P within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + MKDIR_P="$ac_install_sh -d" + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKDIR_P" >&5 +$as_echo "$MKDIR_P" >&6; } + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_AWK+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $AWK" >&5 +$as_echo "$AWK" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$AWK" && break +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +$as_echo_n "checking whether ${MAKE-make} sets \$(MAKE)... " >&6; } +set x ${MAKE-make} +ac_make=`$as_echo "$2" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'` +if eval \${ac_cv_prog_make_${ac_make}_set+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat >conftest.make <<\_ACEOF +SHELL = /bin/sh +all: + @echo '@@@%%%=$(MAKE)=@@@%%%' +_ACEOF +# GNU make sometimes prints "make[1]: Entering ...", which would confuse us. +case `${MAKE-make} -f conftest.make 2>/dev/null` in + *@@@%%%=?*=@@@%%%*) + eval ac_cv_prog_make_${ac_make}_set=yes;; + *) + eval ac_cv_prog_make_${ac_make}_set=no;; +esac +rm -f conftest.make +fi +if eval test \$ac_cv_prog_make_${ac_make}_set = yes; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + SET_MAKE= +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=1;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + +if test "`cd $srcdir && pwd`" != "`pwd`"; then + # Use -I$(srcdir) only when $(srcdir) != ., so that make's output + # is not polluted with repeated "-I." + am__isrc=' -I$(srcdir)' + # test to see if srcdir already configured + if test -f $srcdir/config.status; then + as_fn_error $? "source directory already configured; run \"make distclean\" there first" "$LINENO" 5 + fi +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='re2c' + VERSION='1.0.3' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + +# For better backward compatibility. To be removed once Automake 1.9.x +# dies out for good. For more background, see: +# +# +mkdir_p='$(MKDIR_P)' + +# We need awk for the "check" target (and possibly the TAP driver). The +# system "awk" is bad on some platforms. +# Always define AMTAR for backward compatibility. Yes, it's still used +# in the wild :-( We should find a proper way to deprecate it ... +AMTAR='$${TAR-tar}' + + +# We'll loop over all known methods to create a tar archive until one works. +_am_tools='gnutar pax cpio none' + +am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' + + + + + + +# POSIX will say in a future version that running "rm -f" with no argument +# is OK; and we want to be able to make that assumption in our Makefile +# recipes. So use an aggressive probe to check that the usage we want is +# actually supported "in the wild" to an acceptable degree. +# See automake bug#10828. +# To make any issue more visible, cause the running configure to be aborted +# by default if the 'rm' program in use doesn't match our expectations; the +# user can still override this though. +if rm -f && rm -fr && rm -rf; then : OK; else + cat >&2 <<'END' +Oops! + +Your 'rm' program seems unable to run without file operands specified +on the command line, even when the '-f' option is present. This is contrary +to the behaviour of most rm programs out there, and not conforming with +the upcoming POSIX standard: + +Please tell bug-automake@gnu.org about your system, including the value +of your $PATH and any error possibly output before this message. This +can help us improve future automake versions. + +END + if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then + echo 'Configuration will proceed anyway, since you have set the' >&2 + echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2 + echo >&2 + else + cat >&2 <<'END' +Aborting the configuration process, to ensure you take notice of the issue. + +You can download and install GNU coreutils to get an 'rm' implementation +that behaves properly: . + +If you want to complete the configuration process using your problematic +'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM +to "yes", and re-run configure. + +END + as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5 + fi +fi + +# Check whether --enable-silent-rules was given. +if test "${enable_silent_rules+set}" = set; then : + enableval=$enable_silent_rules; +fi + +case $enable_silent_rules in # ((( + yes) AM_DEFAULT_VERBOSITY=0;; + no) AM_DEFAULT_VERBOSITY=1;; + *) AM_DEFAULT_VERBOSITY=0;; +esac +am_make=${MAKE-make} +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables" >&5 +$as_echo_n "checking whether $am_make supports nested variables... " >&6; } +if ${am_cv_make_support_nested_variables+:} false; then : + $as_echo_n "(cached) " >&6 +else + if $as_echo 'TRUE=$(BAR$(V)) +BAR0=false +BAR1=true +V=1 +am__doit: + @$(TRUE) +.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then + am_cv_make_support_nested_variables=yes +else + am_cv_make_support_nested_variables=no +fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables" >&5 +$as_echo "$am_cv_make_support_nested_variables" >&6; } +if test $am_cv_make_support_nested_variables = yes; then + AM_V='$(V)' + AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' +else + AM_V=$AM_DEFAULT_VERBOSITY + AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY +fi +AM_BACKSLASH='\' + + + + +ac_config_headers="$ac_config_headers config.h" + + + +PACKAGE_DATE=`date +'%d %b %Y'` + + + + +PACKAGE_RELEASE=${PACKAGE_RELEASE:-1} + + + +# --enable-docs +# Check whether --enable-docs was given. +if test "${enable_docs+set}" = set; then : + enableval=$enable_docs; +fi + + if test "x$enable_docs" = "xyes"; then + REBUILD_DOCS_TRUE= + REBUILD_DOCS_FALSE='#' +else + REBUILD_DOCS_TRUE='#' + REBUILD_DOCS_FALSE= +fi + +if test -z "$REBUILD_DOCS_TRUE"; then : + + for ac_prog in rst2man rst2man.py +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_RST2MAN+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$RST2MAN"; then + ac_cv_prog_RST2MAN="$RST2MAN" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RST2MAN="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +RST2MAN=$ac_cv_prog_RST2MAN +if test -n "$RST2MAN"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $RST2MAN" >&5 +$as_echo "$RST2MAN" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$RST2MAN" && break +done +test -n "$RST2MAN" || RST2MAN="no" + + if test "x$RST2MAN" = "xno"; then : + + as_fn_error $? "need rst2man or rst2man.py for --enable-docs" "$LINENO" 5 + +fi + +fi + + +# checks for programs +# Extract the first word of "bison", so it can be a program name with args. +set dummy bison; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_path_BISON+:} false; then : + $as_echo_n "(cached) " >&6 +else + case $BISON in + [\\/]* | ?:[\\/]*) + ac_cv_path_BISON="$BISON" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_BISON="$as_dir/$ac_word$ac_exec_ext" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + + test -z "$ac_cv_path_BISON" && ac_cv_path_BISON="no" + ;; +esac +fi +BISON=$ac_cv_path_BISON +if test -n "$BISON"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $BISON" >&5 +$as_echo "$BISON" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + fi +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl.exe + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 +$as_echo "$CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl.exe +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 +$as_echo "$ac_ct_CC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CC" && break +done + + if test "x$ac_ct_CC" = x; then + CC="" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CC=$ac_ct_CC + fi +fi + +fi + + +test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "no acceptable C compiler found in \$PATH +See \`config.log' for more details" "$LINENO" 5; } + +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 +$as_echo_n "checking whether the C compiler works... " >&6; } +ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` + +# The possible output files: +ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" + +ac_rmfiles= +for ac_file in $ac_files +do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + * ) ac_rmfiles="$ac_rmfiles $ac_file";; + esac +done +rm -f $ac_rmfiles + +if { { ac_try="$ac_link_default" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link_default") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. +# So ignore a value of `no', otherwise this would lead to `EXEEXT = no' +# in a Makefile. We should not override ac_cv_exeext if it was cached, +# so that the user can short-circuit this test for compilers unknown to +# Autoconf. +for ac_file in $ac_files '' +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; + then :; else + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + fi + # We set ac_cv_exeext here because the later test for it is not + # safe: cross compilers may not add the suffix if given an `-o' + # argument, so we may need to know it at that point already. + # Even if this section looks crufty: it has the advantage of + # actually working. + break;; + * ) + break;; + esac +done +test "$ac_cv_exeext" = no && ac_cv_exeext= + +else + ac_file='' +fi +if test -z "$ac_file"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +$as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "C compiler cannot create executables +See \`config.log' for more details" "$LINENO" 5; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 +$as_echo_n "checking for C compiler default output file name... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 +$as_echo "$ac_file" >&6; } +ac_exeext=$ac_cv_exeext + +rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 +$as_echo_n "checking for suffix of executables... " >&6; } +if { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + break;; + * ) break;; + esac +done +else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest conftest$ac_cv_exeext +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 +$as_echo "$ac_cv_exeext" >&6; } + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +int +main () +{ +FILE *f = fopen ("conftest.out", "w"); + return ferror (f) || fclose (f) != 0; + + ; + return 0; +} +_ACEOF +ac_clean_files="$ac_clean_files conftest.out" +# Check that the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 +$as_echo_n "checking whether we are cross compiling... " >&6; } +if test "$cross_compiling" != yes; then + { { ac_try="$ac_link" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_link") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } + if { ac_try='./conftest$ac_cv_exeext' + { { case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_try") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details" "$LINENO" 5; } + fi + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 +$as_echo "$cross_compiling" >&6; } + +rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out +ac_clean_files=$ac_clean_files_save +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 +$as_echo_n "checking for suffix of object files... " >&6; } +if ${ac_cv_objext+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { { ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compile") 2>&5 + ac_status=$? + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; }; then : + for ac_file in conftest.o conftest.obj conftest.*; do + test -f "$ac_file" || continue; + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + $as_echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error $? "cannot compute suffix of object files: cannot compile +See \`config.log' for more details" "$LINENO" 5; } +fi +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 +$as_echo "$ac_cv_objext" >&6; } +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 +$as_echo_n "checking whether we are using the GNU C compiler... " >&6; } +if ${ac_cv_c_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 +$as_echo "$ac_cv_c_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GCC=yes +else + GCC= +fi +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 +$as_echo_n "checking whether $CC accepts -g... " >&6; } +if ${ac_cv_prog_cc_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_c_werror_flag=$ac_c_werror_flag + ac_c_werror_flag=yes + ac_cv_prog_cc_g=no + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +else + CFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + +else + ac_c_werror_flag=$ac_save_c_werror_flag + CFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_c_werror_flag=$ac_save_c_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 +$as_echo "$ac_cv_prog_cc_g" >&6; } +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 +$as_echo_n "checking for $CC option to accept ISO C89... " >&6; } +if ${ac_cv_prog_cc_c89+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_cv_prog_cc_c89=no +ac_save_CC=$CC +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +#include +#include +struct stat; +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters + inside strings and character constants. */ +#define FOO(x) 'x' +int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ + -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + if ac_fn_c_try_compile "$LINENO"; then : + ac_cv_prog_cc_c89=$ac_arg +fi +rm -f core conftest.err conftest.$ac_objext + test "x$ac_cv_prog_cc_c89" != "xno" && break +done +rm -f conftest.$ac_ext +CC=$ac_save_CC + +fi +# AC_CACHE_VAL +case "x$ac_cv_prog_cc_c89" in + x) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 +$as_echo "none needed" >&6; } ;; + xno) + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 +$as_echo "unsupported" >&6; } ;; + *) + CC="$CC $ac_cv_prog_cc_c89" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 +$as_echo "$ac_cv_prog_cc_c89" >&6; } ;; +esac +if test "x$ac_cv_prog_cc_c89" != xno; then : + +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5 +$as_echo_n "checking whether $CC understands -c and -o together... " >&6; } +if ${am_cv_prog_cc_c_o+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF + # Make sure it works both with $CC and with simple cc. + # Following AC_PROG_CC_C_O, we do the test twice because some + # compilers refuse to overwrite an existing .o file with -o, + # though they will create one. + am_cv_prog_cc_c_o=yes + for am_i in 1 2; do + if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5 + ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } \ + && test -f conftest2.$ac_objext; then + : OK + else + am_cv_prog_cc_c_o=no + break + fi + done + rm -f core conftest* + unset am_i +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5 +$as_echo "$am_cv_prog_cc_c_o" >&6; } +if test "$am_cv_prog_cc_c_o" != yes; then + # Losing compiler, so override with the script. + # FIXME: It is wrong to rewrite CC. + # But if we don't then we get into trouble of one sort or another. + # A longer-term fix would be to have automake use am__CC in this case, + # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)" + CC="$am_aux_dir/compile $CC" +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +DEPDIR="${am__leading_dot}deps" + +ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo this is the am__doit target +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make" >&5 +$as_echo_n "checking for style of include used by $am_make... " >&6; } +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# Ignore all kinds of additional output from 'make'. +case `$am_make -s -f confmf 2> /dev/null` in #( +*the\ am__doit\ target*) + am__include=include + am__quote= + _am_result=GNU + ;; +esac +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + case `$am_make -s -f confmf 2> /dev/null` in #( + *the\ am__doit\ target*) + am__include=.include + am__quote="\"" + _am_result=BSD + ;; + esac +fi + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $_am_result" >&5 +$as_echo "$_am_result" >&6; } +rm -f confinc confmf + +# Check whether --enable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then : + enableval=$enable_dependency_tracking; +fi + +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' + am__nodep='_no' +fi + if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +depcc="$CC" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CC_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CC_dependencies_compiler_type" >&6; } +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + # used in skeleton tests +ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -z "$CXX"; then + if test -n "$CCC"; then + CXX=$CCC + else + if test -n "$ac_tool_prefix"; then + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CXX" >&5 +$as_echo "$CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in g++ c++ gpp aCC CC cxx cc++ cl.exe FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_ac_ct_CXX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done + done +IFS=$as_save_IFS + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CXX" >&5 +$as_echo "$ac_ct_CXX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + test -n "$ac_ct_CXX" && break +done + + if test "x$ac_ct_CXX" = x; then + CXX="g++" + else + case $cross_compiling:$ac_tool_warned in +yes:) +{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +ac_tool_warned=yes ;; +esac + CXX=$ac_ct_CXX + fi +fi + + fi +fi +# Provide some information about the compiler. +$as_echo "$as_me:${as_lineno-$LINENO}: checking for C++ compiler version" >&5 +set X $ac_compile +ac_compiler=$2 +for ac_option in --version -v -V -qversion; do + { { ac_try="$ac_compiler $ac_option >&5" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" +$as_echo "$ac_try_echo"; } >&5 + (eval "$ac_compiler $ac_option >&5") 2>conftest.err + ac_status=$? + if test -s conftest.err; then + sed '10a\ +... rest of stderr output deleted ... + 10q' conftest.err >conftest.er1 + cat conftest.er1 >&5 + fi + rm -f conftest.er1 conftest.err + $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 + test $ac_status = 0; } +done + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C++ compiler" >&5 +$as_echo_n "checking whether we are using the GNU C++ compiler... " >&6; } +if ${ac_cv_cxx_compiler_gnu+:} false; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_compiler_gnu=yes +else + ac_compiler_gnu=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_cxx_compiler_gnu" >&5 +$as_echo "$ac_cv_cxx_compiler_gnu" >&6; } +if test $ac_compiler_gnu = yes; then + GXX=yes +else + GXX= +fi +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CXX accepts -g" >&5 +$as_echo_n "checking whether $CXX accepts -g... " >&6; } +if ${ac_cv_prog_cxx_g+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_save_cxx_werror_flag=$ac_cxx_werror_flag + ac_cxx_werror_flag=yes + ac_cv_prog_cxx_g=no + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +else + CXXFLAGS="" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + +else + ac_cxx_werror_flag=$ac_save_cxx_werror_flag + CXXFLAGS="-g" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + ac_cv_prog_cxx_g=yes +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_cxx_werror_flag=$ac_save_cxx_werror_flag +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cxx_g" >&5 +$as_echo "$ac_cv_prog_cxx_g" >&6; } +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc" >&5 +$as_echo_n "checking dependency style of $depcc... " >&6; } +if ${am_cv_CXX_dependencies_compiler_type+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named 'D' -- because '-MD' means "put the output + # in D". + rm -rf conftest.dir + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + am__universal=false + case " $depcc " in #( + *\ -arch\ *\ -arch\ *) am__universal=true ;; + esac + + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using ": > sub/conftst$i.h" creates only sub/conftst1.h with + # Solaris 10 /bin/sh. + echo '/* dummy */' > sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + # We check with '-c' and '-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle '-M -o', and we need to detect this. Also, some Intel + # versions had trouble with output in subdirs. + am__obj=sub/conftest.${OBJEXT-o} + am__minus_obj="-o $am__obj" + case $depmode in + gcc) + # This depmode causes a compiler race in universal mode. + test "$am__universal" = false || continue + ;; + nosideeffect) + # After this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested. + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + msvc7 | msvc7msys | msvisualcpp | msvcmsys) + # This compiler won't grok '-c -o', but also, the minuso test has + # not run yet. These depmodes are late enough in the game, and + # so weak that their functioning should not be impacted. + am__obj=conftest.${OBJEXT-o} + am__minus_obj= + ;; + none) break ;; + esac + if depmode=$depmode \ + source=sub/conftest.c object=$am__obj \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep $am__obj sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_CXX_dependencies_compiler_type" >&5 +$as_echo "$am_cv_CXX_dependencies_compiler_type" >&6; } +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + + + +# checks for C++ compiler flags + +# TRY_CXXFLAG (flag [implied-flags]) +# Iff C++ compiler recognizes 'flag', append 'flag' and 'implied-flags' to CXXFLAGSDEFAULT +# (Second param 'implied-flags' is needed for warning suppressions '-Wno-': +# GCC warns about unrecognized suppressions options only in presence of other warnings, +# which makes it hard to test for them with autoconf.) + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking C++ compiler flag -std=c++98" >&5 +$as_echo_n "checking C++ compiler flag -std=c++98... " >&6; } + CXXFLAGS_BACKUP="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -std=c++98" + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + + TRY_CXXFLAG_RESULT=yes + CXXFLAGSDEFAULT="$CXXFLAGSDEFAULT -std=c++98 " + +else + TRY_CXXFLAG_RESULT=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + CXXFLAGS="$CXXFLAGS_BACKUP" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TRY_CXXFLAG_RESULT" >&5 +$as_echo "$TRY_CXXFLAG_RESULT" >&6; } + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking C++ compiler flag -W" >&5 +$as_echo_n "checking C++ compiler flag -W... " >&6; } + CXXFLAGS_BACKUP="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -W" + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + + TRY_CXXFLAG_RESULT=yes + CXXFLAGSDEFAULT="$CXXFLAGSDEFAULT -W " + +else + TRY_CXXFLAG_RESULT=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + CXXFLAGS="$CXXFLAGS_BACKUP" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TRY_CXXFLAG_RESULT" >&5 +$as_echo "$TRY_CXXFLAG_RESULT" >&6; } + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking C++ compiler flag -Wall" >&5 +$as_echo_n "checking C++ compiler flag -Wall... " >&6; } + CXXFLAGS_BACKUP="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -Wall" + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + + TRY_CXXFLAG_RESULT=yes + CXXFLAGSDEFAULT="$CXXFLAGSDEFAULT -Wall " + +else + TRY_CXXFLAG_RESULT=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + CXXFLAGS="$CXXFLAGS_BACKUP" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TRY_CXXFLAG_RESULT" >&5 +$as_echo "$TRY_CXXFLAG_RESULT" >&6; } + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking C++ compiler flag -Wextra" >&5 +$as_echo_n "checking C++ compiler flag -Wextra... " >&6; } + CXXFLAGS_BACKUP="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -Wextra" + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + + TRY_CXXFLAG_RESULT=yes + CXXFLAGSDEFAULT="$CXXFLAGSDEFAULT -Wextra " + +else + TRY_CXXFLAG_RESULT=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + CXXFLAGS="$CXXFLAGS_BACKUP" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TRY_CXXFLAG_RESULT" >&5 +$as_echo "$TRY_CXXFLAG_RESULT" >&6; } + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking C++ compiler flag -Weffc++" >&5 +$as_echo_n "checking C++ compiler flag -Weffc++... " >&6; } + CXXFLAGS_BACKUP="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -Weffc++" + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + + TRY_CXXFLAG_RESULT=yes + CXXFLAGSDEFAULT="$CXXFLAGSDEFAULT -Weffc++ " + +else + TRY_CXXFLAG_RESULT=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + CXXFLAGS="$CXXFLAGS_BACKUP" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TRY_CXXFLAG_RESULT" >&5 +$as_echo "$TRY_CXXFLAG_RESULT" >&6; } + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking C++ compiler flag -pedantic" >&5 +$as_echo_n "checking C++ compiler flag -pedantic... " >&6; } + CXXFLAGS_BACKUP="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -pedantic" + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + + TRY_CXXFLAG_RESULT=yes + CXXFLAGSDEFAULT="$CXXFLAGSDEFAULT -pedantic " + +else + TRY_CXXFLAG_RESULT=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + CXXFLAGS="$CXXFLAGS_BACKUP" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TRY_CXXFLAG_RESULT" >&5 +$as_echo "$TRY_CXXFLAG_RESULT" >&6; } + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking C++ compiler flag -Wformat=2" >&5 +$as_echo_n "checking C++ compiler flag -Wformat=2... " >&6; } + CXXFLAGS_BACKUP="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -Wformat=2" + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + + TRY_CXXFLAG_RESULT=yes + CXXFLAGSDEFAULT="$CXXFLAGSDEFAULT -Wformat=2 " + +else + TRY_CXXFLAG_RESULT=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + CXXFLAGS="$CXXFLAGS_BACKUP" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TRY_CXXFLAG_RESULT" >&5 +$as_echo "$TRY_CXXFLAG_RESULT" >&6; } + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking C++ compiler flag -Wredundant-decls" >&5 +$as_echo_n "checking C++ compiler flag -Wredundant-decls... " >&6; } + CXXFLAGS_BACKUP="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -Wredundant-decls" + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + + TRY_CXXFLAG_RESULT=yes + CXXFLAGSDEFAULT="$CXXFLAGSDEFAULT -Wredundant-decls " + +else + TRY_CXXFLAG_RESULT=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + CXXFLAGS="$CXXFLAGS_BACKUP" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TRY_CXXFLAG_RESULT" >&5 +$as_echo "$TRY_CXXFLAG_RESULT" >&6; } + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking C++ compiler flag -Wsuggest-attribute=format" >&5 +$as_echo_n "checking C++ compiler flag -Wsuggest-attribute=format... " >&6; } + CXXFLAGS_BACKUP="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -Wsuggest-attribute=format" + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + + TRY_CXXFLAG_RESULT=yes + CXXFLAGSDEFAULT="$CXXFLAGSDEFAULT -Wsuggest-attribute=format " + +else + TRY_CXXFLAG_RESULT=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + CXXFLAGS="$CXXFLAGS_BACKUP" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TRY_CXXFLAG_RESULT" >&5 +$as_echo "$TRY_CXXFLAG_RESULT" >&6; } + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking C++ compiler flag -Wconversion" >&5 +$as_echo_n "checking C++ compiler flag -Wconversion... " >&6; } + CXXFLAGS_BACKUP="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -Wconversion" + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + + TRY_CXXFLAG_RESULT=yes + CXXFLAGSDEFAULT="$CXXFLAGSDEFAULT -Wconversion " + +else + TRY_CXXFLAG_RESULT=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + CXXFLAGS="$CXXFLAGS_BACKUP" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TRY_CXXFLAG_RESULT" >&5 +$as_echo "$TRY_CXXFLAG_RESULT" >&6; } + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking C++ compiler flag -Wsign-conversion" >&5 +$as_echo_n "checking C++ compiler flag -Wsign-conversion... " >&6; } + CXXFLAGS_BACKUP="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -Wsign-conversion" + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + + TRY_CXXFLAG_RESULT=yes + CXXFLAGSDEFAULT="$CXXFLAGSDEFAULT -Wsign-conversion " + +else + TRY_CXXFLAG_RESULT=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + CXXFLAGS="$CXXFLAGS_BACKUP" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TRY_CXXFLAG_RESULT" >&5 +$as_echo "$TRY_CXXFLAG_RESULT" >&6; } + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking C++ compiler flag -O2" >&5 +$as_echo_n "checking C++ compiler flag -O2... " >&6; } + CXXFLAGS_BACKUP="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -O2" + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + + TRY_CXXFLAG_RESULT=yes + CXXFLAGSDEFAULT="$CXXFLAGSDEFAULT -O2 " + +else + TRY_CXXFLAG_RESULT=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + CXXFLAGS="$CXXFLAGS_BACKUP" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TRY_CXXFLAG_RESULT" >&5 +$as_echo "$TRY_CXXFLAG_RESULT" >&6; } + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking C++ compiler flag -Weverything" >&5 +$as_echo_n "checking C++ compiler flag -Weverything... " >&6; } + CXXFLAGS_BACKUP="$CXXFLAGS" + CXXFLAGS="$CXXFLAGS -Weverything" + ac_ext=cpp +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +if ac_fn_cxx_try_compile "$LINENO"; then : + + TRY_CXXFLAG_RESULT=yes + CXXFLAGSDEFAULT="$CXXFLAGSDEFAULT -Weverything -Wno-unknown-warning-option -Wno-reserved-id-macro -Wno-padded -Wno-old-style-cast -Wno-nested-anon-types -Wno-global-constructors" + +else + TRY_CXXFLAG_RESULT=no + +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + CXXFLAGS="$CXXFLAGS_BACKUP" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $TRY_CXXFLAG_RESULT" >&5 +$as_echo "$TRY_CXXFLAG_RESULT" >&6; } + + +# needed by src/c99_stdint.h +# avoid AC_INCLUDES_DEFAULT + +for ac_header in stdint.h +do : + ac_fn_c_check_header_compile "$LINENO" "stdint.h" "ac_cv_header_stdint_h" " +" +if test "x$ac_cv_header_stdint_h" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_STDINT_H 1 +_ACEOF + +fi + +done + +# list of possible types to use in typedefs +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of char" >&5 +$as_echo_n "checking size of char... " >&6; } +if ${ac_cv_sizeof_char+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (char))" "ac_cv_sizeof_char" " +"; then : + +else + if test "$ac_cv_type_char" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (char) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_char=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_char" >&5 +$as_echo "$ac_cv_sizeof_char" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_CHAR $ac_cv_sizeof_char +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of short" >&5 +$as_echo_n "checking size of short... " >&6; } +if ${ac_cv_sizeof_short+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (short))" "ac_cv_sizeof_short" " +"; then : + +else + if test "$ac_cv_type_short" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (short) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_short=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_short" >&5 +$as_echo "$ac_cv_sizeof_short" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_SHORT $ac_cv_sizeof_short +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of int" >&5 +$as_echo_n "checking size of int... " >&6; } +if ${ac_cv_sizeof_int+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (int))" "ac_cv_sizeof_int" " +"; then : + +else + if test "$ac_cv_type_int" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (int) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_int=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_int" >&5 +$as_echo "$ac_cv_sizeof_int" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_INT $ac_cv_sizeof_int +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long" >&5 +$as_echo_n "checking size of long... " >&6; } +if ${ac_cv_sizeof_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long))" "ac_cv_sizeof_long" " +"; then : + +else + if test "$ac_cv_type_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (long) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long" >&5 +$as_echo "$ac_cv_sizeof_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG $ac_cv_sizeof_long +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of long long" >&5 +$as_echo_n "checking size of long long... " >&6; } +if ${ac_cv_sizeof_long_long+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (long long))" "ac_cv_sizeof_long_long" " +"; then : + +else + if test "$ac_cv_type_long_long" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (long long) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_long_long=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_long_long" >&5 +$as_echo "$ac_cv_sizeof_long_long" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_LONG_LONG $ac_cv_sizeof_long_long +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of __int64" >&5 +$as_echo_n "checking size of __int64... " >&6; } +if ${ac_cv_sizeof___int64+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (__int64))" "ac_cv_sizeof___int64" " +"; then : + +else + if test "$ac_cv_type___int64" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (__int64) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof___int64=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof___int64" >&5 +$as_echo "$ac_cv_sizeof___int64" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF___INT64 $ac_cv_sizeof___int64 +_ACEOF + + +# size of pointers +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of void *" >&5 +$as_echo_n "checking size of void *... " >&6; } +if ${ac_cv_sizeof_void_p+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (void *))" "ac_cv_sizeof_void_p" " +"; then : + +else + if test "$ac_cv_type_void_p" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (void *) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_void_p=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_void_p" >&5 +$as_echo "$ac_cv_sizeof_void_p" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_VOID_P $ac_cv_sizeof_void_p +_ACEOF + + +# 64-bit integer constant suffix +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of 0l" >&5 +$as_echo_n "checking size of 0l... " >&6; } +if ${ac_cv_sizeof_0l+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (0l))" "ac_cv_sizeof_0l" " +"; then : + +else + if test "$ac_cv_type_0l" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (0l) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_0l=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_0l" >&5 +$as_echo "$ac_cv_sizeof_0l" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_0L $ac_cv_sizeof_0l +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of 0ll" >&5 +$as_echo_n "checking size of 0ll... " >&6; } +if ${ac_cv_sizeof_0ll+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (0ll))" "ac_cv_sizeof_0ll" " +"; then : + +else + if test "$ac_cv_type_0ll" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (0ll) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_0ll=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_0ll" >&5 +$as_echo "$ac_cv_sizeof_0ll" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_0LL $ac_cv_sizeof_0ll +_ACEOF + + +# The cast to long int works around a bug in the HP C Compiler +# version HP92453-01 B.11.11.23709.GP, which incorrectly rejects +# declarations like `int a3[[(sizeof (unsigned char)) >= 0]];'. +# This bug is HP SR number 8606223364. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking size of 0i8" >&5 +$as_echo_n "checking size of 0i8... " >&6; } +if ${ac_cv_sizeof_0i8+:} false; then : + $as_echo_n "(cached) " >&6 +else + if ac_fn_c_compute_int "$LINENO" "(long int) (sizeof (0i8))" "ac_cv_sizeof_0i8" " +"; then : + +else + if test "$ac_cv_type_0i8" = yes; then + { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 +$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} +as_fn_error 77 "cannot compute sizeof (0i8) +See \`config.log' for more details" "$LINENO" 5; } + else + ac_cv_sizeof_0i8=0 + fi +fi + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_sizeof_0i8" >&5 +$as_echo "$ac_cv_sizeof_0i8" >&6; } + + + +cat >>confdefs.h <<_ACEOF +#define SIZEOF_0I8 $ac_cv_sizeof_0i8 +_ACEOF + + + + +ac_config_files="$ac_config_files Makefile doc/manpage.rst doc/help.rst" + +ac_config_files="$ac_config_files run_tests.sh" + + + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, we kill variables containing newlines. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +( + for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do + eval ac_val=\$$ac_var + case $ac_val in #( + *${as_nl}*) + case $ac_var in #( + *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 +$as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; + esac + case $ac_var in #( + _ | IFS | as_nl) ;; #( + BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( + *) { eval $ac_var=; unset $ac_var;} ;; + esac ;; + esac + done + + (set) 2>&1 | + case $as_nl`(ac_space=' '; set) 2>&1` in #( + *${as_nl}ac_space=\ *) + # `set' does not quote correctly, so add quotes: double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \. + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; #( + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" + ;; + esac | + sort +) | + sed ' + /^ac_cv_env_/b end + t clear + :clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + :end' >>confcache +if diff "$cache_file" confcache >/dev/null 2>&1; then :; else + if test -w "$cache_file"; then + if test "x$cache_file" != "x/dev/null"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 +$as_echo "$as_me: updating cache $cache_file" >&6;} + if test ! -f "$cache_file" || test -h "$cache_file"; then + cat confcache >"$cache_file" + else + case $cache_file in #( + */* | ?:*) + mv -f confcache "$cache_file"$$ && + mv -f "$cache_file"$$ "$cache_file" ;; #( + *) + mv -f confcache "$cache_file" ;; + esac + fi + fi + else + { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 +$as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +U= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' + ac_i=`$as_echo "$ac_i" | sed "$ac_script"` + # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR + # will be set to the directory where LIBOBJS objects are built. + as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" + as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure" >&5 +$as_echo_n "checking that generated files are newer than configure... " >&6; } + if test -n "$am_sleep_pid"; then + # Hide warnings about reused PIDs. + wait $am_sleep_pid 2>/dev/null + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: done" >&5 +$as_echo "done" >&6; } + if test -n "$EXEEXT"; then + am__EXEEXT_TRUE= + am__EXEEXT_FALSE='#' +else + am__EXEEXT_TRUE='#' + am__EXEEXT_FALSE= +fi + +if test -z "${REBUILD_DOCS_TRUE}" && test -z "${REBUILD_DOCS_FALSE}"; then + as_fn_error $? "conditional \"REBUILD_DOCS\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + as_fn_error $? "conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + as_fn_error $? "conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." "$LINENO" 5 +fi + +: "${CONFIG_STATUS=./config.status}" +ac_write_fail=0 +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 +$as_echo "$as_me: creating $CONFIG_STATUS" >&6;} +as_write_fail=0 +cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false + +SHELL=\${CONFIG_SHELL-$SHELL} +export SHELL +_ASEOF +cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 +## -------------------- ## +## M4sh Initialization. ## +## -------------------- ## + +# Be more Bourne compatible +DUALCASE=1; export DUALCASE # for MKS sh +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : + emulate sh + NULLCMD=: + # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' + setopt NO_GLOB_SUBST +else + case `(set -o) 2>/dev/null` in #( + *posix*) : + set -o posix ;; #( + *) : + ;; +esac +fi + + +as_nl=' +' +export as_nl +# Printing a long string crashes Solaris 7 /usr/bin/printf. +as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo +as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo +# Prefer a ksh shell builtin over an external printf program on Solaris, +# but without wasting forks for bash or zsh. +if test -z "$BASH_VERSION$ZSH_VERSION" \ + && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='print -r --' + as_echo_n='print -rn --' +elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then + as_echo='printf %s\n' + as_echo_n='printf %s' +else + if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then + as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' + as_echo_n='/usr/ucb/echo -n' + else + as_echo_body='eval expr "X$1" : "X\\(.*\\)"' + as_echo_n_body='eval + arg=$1; + case $arg in #( + *"$as_nl"*) + expr "X$arg" : "X\\(.*\\)$as_nl"; + arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; + esac; + expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" + ' + export as_echo_n_body + as_echo_n='sh -c $as_echo_n_body as_echo' + fi + export as_echo_body + as_echo='sh -c $as_echo_body as_echo' +fi + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + PATH_SEPARATOR=: + (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { + (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || + PATH_SEPARATOR=';' + } +fi + + +# IFS +# We need space, tab and new line, in precisely that order. Quoting is +# there to prevent editors from complaining about space-tab. +# (If _AS_PATH_WALK were called with IFS unset, it would disable word +# splitting by setting IFS to empty value.) +IFS=" "" $as_nl" + +# Find who we are. Look in the path if we contain no directory separator. +as_myself= +case $0 in #(( + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break + done +IFS=$as_save_IFS + + ;; +esac +# We did not find ourselves, most probably we were run as `sh COMMAND' +# in which case we are not to be found in the path. +if test "x$as_myself" = x; then + as_myself=$0 +fi +if test ! -f "$as_myself"; then + $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 + exit 1 +fi + +# Unset variables that we do not need and which cause bugs (e.g. in +# pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" +# suppresses any "Segmentation fault" message there. '((' could +# trigger a bug in pdksh 5.2.14. +for as_var in BASH_ENV ENV MAIL MAILPATH +do eval test x\${$as_var+set} = xset \ + && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : +done +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +LC_ALL=C +export LC_ALL +LANGUAGE=C +export LANGUAGE + +# CDPATH. +(unset CDPATH) >/dev/null 2>&1 && unset CDPATH + + +# as_fn_error STATUS ERROR [LINENO LOG_FD] +# ---------------------------------------- +# Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are +# provided, also output the error to LOG_FD, referencing LINENO. Then exit the +# script with STATUS, using 1 if that was 0. +as_fn_error () +{ + as_status=$1; test $as_status -eq 0 && as_status=1 + if test "$4"; then + as_lineno=${as_lineno-"$3"} as_lineno_stack=as_lineno_stack=$as_lineno_stack + $as_echo "$as_me:${as_lineno-$LINENO}: error: $2" >&$4 + fi + $as_echo "$as_me: error: $2" >&2 + as_fn_exit $as_status +} # as_fn_error + + +# as_fn_set_status STATUS +# ----------------------- +# Set $? to STATUS, without forking. +as_fn_set_status () +{ + return $1 +} # as_fn_set_status + +# as_fn_exit STATUS +# ----------------- +# Exit the shell with STATUS, even in a "trap 0" or "set -e" context. +as_fn_exit () +{ + set +e + as_fn_set_status $1 + exit $1 +} # as_fn_exit + +# as_fn_unset VAR +# --------------- +# Portably unset VAR. +as_fn_unset () +{ + { eval $1=; unset $1;} +} +as_unset=as_fn_unset +# as_fn_append VAR VALUE +# ---------------------- +# Append the text in VALUE to the end of the definition contained in VAR. Take +# advantage of any shell optimizations that allow amortized linear growth over +# repeated appends, instead of the typical quadratic growth present in naive +# implementations. +if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : + eval 'as_fn_append () + { + eval $1+=\$2 + }' +else + as_fn_append () + { + eval $1=\$$1\$2 + } +fi # as_fn_append + +# as_fn_arith ARG... +# ------------------ +# Perform arithmetic evaluation on the ARGs, and store the result in the +# global $as_val. Take advantage of shells that can avoid forks. The arguments +# must be portable across $(()) and expr. +if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : + eval 'as_fn_arith () + { + as_val=$(( $* )) + }' +else + as_fn_arith () + { + as_val=`expr "$@" || test $? -eq 1` + } +fi # as_fn_arith + + +if expr a : '\(a\)' >/dev/null 2>&1 && + test "X`expr 00001 : '.*\(...\)'`" = X001; then + as_expr=expr +else + as_expr=false +fi + +if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + +if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then + as_dirname=dirname +else + as_dirname=false +fi + +as_me=`$as_basename -- "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ + s//\1/ + q + } + /^X\/\(\/\/\)$/{ + s//\1/ + q + } + /^X\/\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +ECHO_C= ECHO_N= ECHO_T= +case `echo -n x` in #((((( +-n*) + case `echo 'xy\c'` in + *c*) ECHO_T=' ';; # ECHO_T is single tab character. + xy) ECHO_C='\c';; + *) echo `echo ksh88 bug on AIX 6.1` > /dev/null + ECHO_T=' ';; + esac;; +*) + ECHO_N='-n';; +esac + +rm -f conf$$ conf$$.exe conf$$.file +if test -d conf$$.dir; then + rm -f conf$$.dir/conf$$.file +else + rm -f conf$$.dir + mkdir conf$$.dir 2>/dev/null +fi +if (echo >conf$$.file) 2>/dev/null; then + if ln -s conf$$.file conf$$ 2>/dev/null; then + as_ln_s='ln -s' + # ... but there are two gotchas: + # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. + # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. + # In both cases, we have to default to `cp -pR'. + ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || + as_ln_s='cp -pR' + elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln + else + as_ln_s='cp -pR' + fi +else + as_ln_s='cp -pR' +fi +rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file +rmdir conf$$.dir 2>/dev/null + + +# as_fn_mkdir_p +# ------------- +# Create "$as_dir" as a directory, including parents if necessary. +as_fn_mkdir_p () +{ + + case $as_dir in #( + -*) as_dir=./$as_dir;; + esac + test -d "$as_dir" || eval $as_mkdir_p || { + as_dirs= + while :; do + case $as_dir in #( + *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( + *) as_qdir=$as_dir;; + esac + as_dirs="'$as_qdir' $as_dirs" + as_dir=`$as_dirname -- "$as_dir" || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + test -d "$as_dir" && break + done + test -z "$as_dirs" || eval "mkdir $as_dirs" + } || test -d "$as_dir" || as_fn_error $? "cannot create directory $as_dir" + + +} # as_fn_mkdir_p +if mkdir -p . 2>/dev/null; then + as_mkdir_p='mkdir -p "$as_dir"' +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + + +# as_fn_executable_p FILE +# ----------------------- +# Test if FILE is an executable regular file. +as_fn_executable_p () +{ + test -f "$1" && test -x "$1" +} # as_fn_executable_p +as_test_x='test -x' +as_executable_p=as_fn_executable_p + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +exec 6>&1 +## ----------------------------------- ## +## Main body of $CONFIG_STATUS script. ## +## ----------------------------------- ## +_ASEOF +test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# Save the log message, to keep $0 and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. +ac_log=" +This file was extended by re2c $as_me 1.0.3, which was +generated by GNU Autoconf 2.69. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +on `(hostname || uname -n) 2>/dev/null | sed 1q` +" + +_ACEOF + +case $ac_config_files in *" +"*) set x $ac_config_files; shift; ac_config_files=$*;; +esac + +case $ac_config_headers in *" +"*) set x $ac_config_headers; shift; ac_config_headers=$*;; +esac + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" +config_headers="$ac_config_headers" +config_commands="$ac_config_commands" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +ac_cs_usage="\ +\`$as_me' instantiates files and other configuration actions +from templates according to the current configuration. Unless the files +and actions are specified as TAGs, all are instantiated by default. + +Usage: $0 [OPTION]... [TAG]... + + -h, --help print this help, then exit + -V, --version print version number and configuration settings, then exit + --config print configuration, then exit + -q, --quiet, --silent + do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" +ac_cs_version="\\ +re2c config.status 1.0.3 +configured by $0, generated by GNU Autoconf 2.69, + with options \\"\$ac_cs_config\\" + +Copyright (C) 2012 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." + +ac_pwd='$ac_pwd' +srcdir='$srcdir' +INSTALL='$INSTALL' +MKDIR_P='$MKDIR_P' +AWK='$AWK' +test -n "\$AWK" || AWK=awk +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# The default lists apply if the user does not specify any file. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=?*) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` + ac_shift=: + ;; + --*=) + ac_option=`expr "X$1" : 'X\([^=]*\)='` + ac_optarg= + ac_shift=: + ;; + *) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + esac + + case $ac_option in + # Handling of the options. + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) + $as_echo "$ac_cs_version"; exit ;; + --config | --confi | --conf | --con | --co | --c ) + $as_echo "$ac_cs_config"; exit ;; + --debug | --debu | --deb | --de | --d | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + '') as_fn_error $? "missing file argument" ;; + esac + as_fn_append CONFIG_FILES " '$ac_optarg'" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + case $ac_optarg in + *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + as_fn_append CONFIG_HEADERS " '$ac_optarg'" + ac_need_defaults=false;; + --he | --h) + # Conflict between --help and --header + as_fn_error $? "ambiguous option: \`$1' +Try \`$0 --help' for more information.";; + --help | --hel | -h ) + $as_echo "$ac_cs_usage"; exit ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) as_fn_error $? "unrecognized option: \`$1' +Try \`$0 --help' for more information." ;; + + *) as_fn_append ac_config_targets " $1" + ac_need_defaults=false ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +if \$ac_cs_recheck; then + set X $SHELL '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion + shift + \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 + CONFIG_SHELL='$SHELL' + export CONFIG_SHELL + exec "\$@" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX + $as_echo "$ac_log" +} >&5 + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# +# INIT-COMMANDS +# +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" + +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + +# Handling of arguments. +for ac_config_target in $ac_config_targets +do + case $ac_config_target in + "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; + "depfiles") CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "doc/manpage.rst") CONFIG_FILES="$CONFIG_FILES doc/manpage.rst" ;; + "doc/help.rst") CONFIG_FILES="$CONFIG_FILES doc/help.rst" ;; + "run_tests.sh") CONFIG_FILES="$CONFIG_FILES run_tests.sh" ;; + + *) as_fn_error $? "invalid argument: \`$ac_config_target'" "$LINENO" 5;; + esac +done + + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason against having it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Hook for its removal unless debugging. +# Note that there is a small window in which the directory will not be cleaned: +# after its creation but before its name has been assigned to `$tmp'. +$debug || +{ + tmp= ac_tmp= + trap 'exit_status=$? + : "${ac_tmp:=$tmp}" + { test ! -d "$ac_tmp" || rm -fr "$ac_tmp"; } && exit $exit_status +' 0 + trap 'as_fn_exit 1' 1 2 13 15 +} +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && + test -d "$tmp" +} || +{ + tmp=./conf$$-$RANDOM + (umask 077 && mkdir "$tmp") +} || as_fn_error $? "cannot create a temporary directory in ." "$LINENO" 5 +ac_tmp=$tmp + +# Set up the scripts for CONFIG_FILES section. +# No need to generate them if there are no CONFIG_FILES. +# This happens for instance with `./config.status config.h'. +if test -n "$CONFIG_FILES"; then + + +ac_cr=`echo X | tr X '\015'` +# On cygwin, bash can eat \r inside `` if the user requested igncr. +# But we know of no other shell where ac_cr would be empty at this +# point, so we can use a bashism as a fallback. +if test "x$ac_cr" = x; then + eval ac_cr=\$\'\\r\' +fi +ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` +if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then + ac_cs_awk_cr='\\r' +else + ac_cs_awk_cr=$ac_cr +fi + +echo 'BEGIN {' >"$ac_tmp/subs1.awk" && +_ACEOF + + +{ + echo "cat >conf$$subs.awk <<_ACEOF" && + echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && + echo "_ACEOF" +} >conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 +ac_delim_num=`echo "$ac_subst_vars" | grep -c '^'` +ac_delim='%!_!# ' +for ac_last_try in false false false false false :; do + . ./conf$$subs.sh || + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + + ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` + if test $ac_delim_n = $ac_delim_num; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_STATUS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done +rm -f conf$$subs.sh + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +cat >>"\$ac_tmp/subs1.awk" <<\\_ACAWK && +_ACEOF +sed -n ' +h +s/^/S["/; s/!.*/"]=/ +p +g +s/^[^!]*!// +:repl +t repl +s/'"$ac_delim"'$// +t delim +:nl +h +s/\(.\{148\}\)..*/\1/ +t more1 +s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ +p +n +b repl +:more1 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t nl +:delim +h +s/\(.\{148\}\)..*/\1/ +t more2 +s/["\\]/\\&/g; s/^/"/; s/$/"/ +p +b +:more2 +s/["\\]/\\&/g; s/^/"/; s/$/"\\/ +p +g +s/.\{148\}// +t delim +' >$CONFIG_STATUS || ac_write_fail=1 +rm -f conf$$subs.awk +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +_ACAWK +cat >>"\$ac_tmp/subs1.awk" <<_ACAWK && + for (key in S) S_is_set[key] = 1 + FS = "" + +} +{ + line = $ 0 + nfields = split(line, field, "@") + substed = 0 + len = length(field[1]) + for (i = 2; i < nfields; i++) { + key = field[i] + keylen = length(key) + if (S_is_set[key]) { + value = S[key] + line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) + len += length(value) + length(field[++i]) + substed = 1 + } else + len += 1 + keylen + } + + print line +} + +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then + sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" +else + cat +fi < "$ac_tmp/subs1.awk" > "$ac_tmp/subs.awk" \ + || as_fn_error $? "could not setup config files machinery" "$LINENO" 5 +_ACEOF + +# VPATH may cause trouble with some makes, so we remove sole $(srcdir), +# ${srcdir} and @srcdir@ entries from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[ ]*/{ +h +s/// +s/^/:/ +s/[ ]*$/:/ +s/:\$(srcdir):/:/g +s/:\${srcdir}:/:/g +s/:@srcdir@:/:/g +s/^:*// +s/:*$// +x +s/\(=[ ]*\).*/\1/ +G +s/\n// +s/^[^=]*=[ ]*$// +}' +fi + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +fi # test -n "$CONFIG_FILES" + +# Set up the scripts for CONFIG_HEADERS section. +# No need to generate them if there are no CONFIG_HEADERS. +# This happens for instance with `./config.status Makefile'. +if test -n "$CONFIG_HEADERS"; then +cat >"$ac_tmp/defines.awk" <<\_ACAWK || +BEGIN { +_ACEOF + +# Transform confdefs.h into an awk script `defines.awk', embedded as +# here-document in config.status, that substitutes the proper values into +# config.h.in to produce config.h. + +# Create a delimiter string that does not exist in confdefs.h, to ease +# handling of long lines. +ac_delim='%!_!# ' +for ac_last_try in false false :; do + ac_tt=`sed -n "/$ac_delim/p" confdefs.h` + if test -z "$ac_tt"; then + break + elif $ac_last_try; then + as_fn_error $? "could not make $CONFIG_HEADERS" "$LINENO" 5 + else + ac_delim="$ac_delim!$ac_delim _$ac_delim!! " + fi +done + +# For the awk script, D is an array of macro values keyed by name, +# likewise P contains macro parameters if any. Preserve backslash +# newline sequences. + +ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* +sed -n ' +s/.\{148\}/&'"$ac_delim"'/g +t rset +:rset +s/^[ ]*#[ ]*define[ ][ ]*/ / +t def +d +:def +s/\\$// +t bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3"/p +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p +d +:bsnl +s/["\\]/\\&/g +s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ +D["\1"]=" \3\\\\\\n"\\/p +t cont +s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p +t cont +d +:cont +n +s/.\{148\}/&'"$ac_delim"'/g +t clear +:clear +s/\\$// +t bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/"/p +d +:bsnlc +s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p +b cont +' >$CONFIG_STATUS || ac_write_fail=1 + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + for (key in D) D_is_set[key] = 1 + FS = "" +} +/^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { + line = \$ 0 + split(line, arg, " ") + if (arg[1] == "#") { + defundef = arg[2] + mac1 = arg[3] + } else { + defundef = substr(arg[1], 2) + mac1 = arg[2] + } + split(mac1, mac2, "(") #) + macro = mac2[1] + prefix = substr(line, 1, index(line, defundef) - 1) + if (D_is_set[macro]) { + # Preserve the white space surrounding the "#". + print prefix "define", macro P[macro] D[macro] + next + } else { + # Replace #undef with comments. This is necessary, for example, + # in the case of _POSIX_SOURCE, which is predefined and required + # on some systems where configure will not decide to define it. + if (defundef == "undef") { + print "/*", prefix defundef, macro, "*/" + next + } + } +} +{ print } +_ACAWK +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 + as_fn_error $? "could not setup config headers machinery" "$LINENO" 5 +fi # test -n "$CONFIG_HEADERS" + + +eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS :C $CONFIG_COMMANDS" +shift +for ac_tag +do + case $ac_tag in + :[FHLC]) ac_mode=$ac_tag; continue;; + esac + case $ac_mode$ac_tag in + :[FHL]*:*);; + :L* | :C*:*) as_fn_error $? "invalid tag \`$ac_tag'" "$LINENO" 5;; + :[FH]-) ac_tag=-:-;; + :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; + esac + ac_save_IFS=$IFS + IFS=: + set x $ac_tag + IFS=$ac_save_IFS + shift + ac_file=$1 + shift + + case $ac_mode in + :L) ac_source=$1;; + :[FH]) + ac_file_inputs= + for ac_f + do + case $ac_f in + -) ac_f="$ac_tmp/stdin";; + *) # Look for the file first in the build tree, then in the source tree + # (if the path is not absolute). The absolute path cannot be DOS-style, + # because $ac_f cannot contain `:'. + test -f "$ac_f" || + case $ac_f in + [\\/$]*) false;; + *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; + esac || + as_fn_error 1 "cannot find input file: \`$ac_f'" "$LINENO" 5;; + esac + case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac + as_fn_append ac_file_inputs " '$ac_f'" + done + + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + configure_input='Generated from '` + $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' + `' by configure.' + if test x"$ac_file" != x-; then + configure_input="$ac_file. $configure_input" + { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 +$as_echo "$as_me: creating $ac_file" >&6;} + fi + # Neutralize special characters interpreted by sed in replacement strings. + case $configure_input in #( + *\&* | *\|* | *\\* ) + ac_sed_conf_input=`$as_echo "$configure_input" | + sed 's/[\\\\&|]/\\\\&/g'`;; #( + *) ac_sed_conf_input=$configure_input;; + esac + + case $ac_tag in + *:-:* | *:-) cat >"$ac_tmp/stdin" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 ;; + esac + ;; + esac + + ac_dir=`$as_dirname -- "$ac_file" || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir="$ac_dir"; as_fn_mkdir_p + ac_builddir=. + +case "$ac_dir" in +.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; +*) + ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` + # A ".." for each directory in $ac_dir_suffix. + ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` + case $ac_top_builddir_sub in + "") ac_top_builddir_sub=. ac_top_build_prefix= ;; + *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; + esac ;; +esac +ac_abs_top_builddir=$ac_pwd +ac_abs_builddir=$ac_pwd$ac_dir_suffix +# for backward compatibility: +ac_top_builddir=$ac_top_build_prefix + +case $srcdir in + .) # We are building in place. + ac_srcdir=. + ac_top_srcdir=$ac_top_builddir_sub + ac_abs_top_srcdir=$ac_pwd ;; + [\\/]* | ?:[\\/]* ) # Absolute name. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir + ac_abs_top_srcdir=$srcdir ;; + *) # Relative name. + ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_build_prefix$srcdir + ac_abs_top_srcdir=$ac_pwd/$srcdir ;; +esac +ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix + + + case $ac_mode in + :F) + # + # CONFIG_FILE + # + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; + esac + ac_MKDIR_P=$MKDIR_P + case $MKDIR_P in + [\\/$]* | ?:[\\/]* ) ;; + */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;; + esac +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +# If the template does not know about datarootdir, expand it. +# FIXME: This hack should be removed a few years after 2.60. +ac_datarootdir_hack=; ac_datarootdir_seen= +ac_sed_dataroot=' +/datarootdir/ { + p + q +} +/@datadir@/p +/@docdir@/p +/@infodir@/p +/@localedir@/p +/@mandir@/p' +case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in +*datarootdir*) ac_datarootdir_seen=yes;; +*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 +$as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 + ac_datarootdir_hack=' + s&@datadir@&$datadir&g + s&@docdir@&$docdir&g + s&@infodir@&$infodir&g + s&@localedir@&$localedir&g + s&@mandir@&$mandir&g + s&\\\${datarootdir}&$datarootdir&g' ;; +esac +_ACEOF + +# Neutralize VPATH when `$srcdir' = `.'. +# Shell code in configure.ac might set extrasub. +# FIXME: do we really want to maintain this feature? +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +ac_sed_extra="$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s|@configure_input@|$ac_sed_conf_input|;t t +s&@top_builddir@&$ac_top_builddir_sub&;t t +s&@top_build_prefix@&$ac_top_build_prefix&;t t +s&@srcdir@&$ac_srcdir&;t t +s&@abs_srcdir@&$ac_abs_srcdir&;t t +s&@top_srcdir@&$ac_top_srcdir&;t t +s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t +s&@builddir@&$ac_builddir&;t t +s&@abs_builddir@&$ac_abs_builddir&;t t +s&@abs_top_builddir@&$ac_abs_top_builddir&;t t +s&@INSTALL@&$ac_INSTALL&;t t +s&@MKDIR_P@&$ac_MKDIR_P&;t t +$ac_datarootdir_hack +" +eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$ac_tmp/subs.awk" \ + >$ac_tmp/out || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + +test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && + { ac_out=`sed -n '/\${datarootdir}/p' "$ac_tmp/out"`; test -n "$ac_out"; } && + { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' \ + "$ac_tmp/out"`; test -z "$ac_out"; } && + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&5 +$as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' +which seems to be undefined. Please make sure it is defined" >&2;} + + rm -f "$ac_tmp/stdin" + case $ac_file in + -) cat "$ac_tmp/out" && rm -f "$ac_tmp/out";; + *) rm -f "$ac_file" && mv "$ac_tmp/out" "$ac_file";; + esac \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + ;; + :H) + # + # CONFIG_HEADER + # + if test x"$ac_file" != x-; then + { + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" + } >"$ac_tmp/config.h" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + if diff "$ac_file" "$ac_tmp/config.h" >/dev/null 2>&1; then + { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 +$as_echo "$as_me: $ac_file is unchanged" >&6;} + else + rm -f "$ac_file" + mv "$ac_tmp/config.h" "$ac_file" \ + || as_fn_error $? "could not create $ac_file" "$LINENO" 5 + fi + else + $as_echo "/* $configure_input */" \ + && eval '$AWK -f "$ac_tmp/defines.awk"' "$ac_file_inputs" \ + || as_fn_error $? "could not create -" "$LINENO" 5 + fi +# Compute "$ac_file"'s index in $config_headers. +_am_arg="$ac_file" +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $_am_arg | $_am_arg:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $_am_arg" >`$as_dirname -- "$_am_arg" || +$as_expr X"$_am_arg" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$_am_arg" : 'X\(//\)[^/]' \| \ + X"$_am_arg" : 'X\(//\)$' \| \ + X"$_am_arg" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$_am_arg" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'`/stamp-h$_am_stamp_count + ;; + + :C) { $as_echo "$as_me:${as_lineno-$LINENO}: executing $ac_file commands" >&5 +$as_echo "$as_me: executing $ac_file commands" >&6;} + ;; + esac + + + case $ac_file$ac_mode in + "depfiles":C) test x"$AMDEP_TRUE" != x"" || { + # Older Autoconf quotes --file arguments for eval, but not when files + # are listed without --file. Let's play safe and only enable the eval + # if we detect the quoting. + case $CONFIG_FILES in + *\'*) eval set x "$CONFIG_FILES" ;; + *) set x $CONFIG_FILES ;; + esac + shift + for mf + do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named 'Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # Grep'ing the whole file is not good either: AIX grep has a line + # limit of 2048, but all sed's we know have understand at least 4000. + if sed -n 's,^#.*generated by automake.*,X,p' "$mf" | grep X >/dev/null 2>&1; then + dirpart=`$as_dirname -- "$mf" || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + else + continue + fi + # Extract the definition of DEPDIR, am__include, and am__quote + # from the Makefile without running 'make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + am__include=`sed -n 's/^am__include = //p' < "$mf"` + test -z "$am__include" && continue + am__quote=`sed -n 's/^am__quote = //p' < "$mf"` + # Find all dependency output files, they are included files with + # $(DEPDIR) in their names. We invoke sed twice because it is the + # simplest approach to changing $(DEPDIR) to its actual value in the + # expansion. + for file in `sed -n " + s/^$am__include $am__quote\(.*(DEPDIR).*\)$am__quote"'$/\1/p' <"$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`$as_dirname -- "$file" || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| . 2>/dev/null || +$as_echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ + s//\1/ + q + } + /^X\(\/\/\)[^/].*/{ + s//\1/ + q + } + /^X\(\/\/\)$/{ + s//\1/ + q + } + /^X\(\/\).*/{ + s//\1/ + q + } + s/.*/./; q'` + as_dir=$dirpart/$fdir; as_fn_mkdir_p + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done + done +} + ;; + "run_tests.sh":F) chmod +x run_tests.sh ;; + + esac +done # for ac_tag + + +as_fn_exit 0 +_ACEOF +ac_clean_files=$ac_clean_files_save + +test $ac_write_fail = 0 || + as_fn_error $? "write failure creating $CONFIG_STATUS" "$LINENO" 5 + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || as_fn_exit 1 +fi +if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 +$as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} +fi + diff --git a/configure.ac b/configure.ac index 87ff212..ac73c5c 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -AC_INIT([re2c],[0.16],[re2c-general@lists.sourceforge.net]) +AC_INIT([re2c],[1.0.3],[re2c-general@lists.sourceforge.net]) AM_INIT_AUTOMAKE([foreign subdir-objects]) AM_SILENT_RULES([yes]) @@ -56,6 +56,7 @@ AC_DEFUN([TRY_CXXFLAG], [ AS_VAR_SET([CXXFLAGS], ["$CXXFLAGS_BACKUP"]) AC_MSG_RESULT([$TRY_CXXFLAG_RESULT]) ]) +TRY_CXXFLAG([-std=c++98]) TRY_CXXFLAG([-W]) TRY_CXXFLAG([-Wall]) TRY_CXXFLAG([-Wextra]) @@ -70,9 +71,10 @@ TRY_CXXFLAG([-O2]) TRY_CXXFLAG([-Weverything], m4_join([ ], [-Wno-unknown-warning-option], dnl CLANG eats some GCC options only to warn they are unknown [-Wno-reserved-id-macro], dnl to allow header guards of the form '_RE2C_PATH_TO_HEADER_BASENAME_' - [-Wno-padded], dnl perhaps later + [-Wno-padded], [-Wno-old-style-cast], dnl RE2C-generated lexer has lots of C-syle casts because of 're2c:yych:conversion = 1;' - [-Wno-covered-switch-default])) dnl GCC reports false positives in some cases + [-Wno-nested-anon-types], + [-Wno-global-constructors])) dnl initialization of global constants with std::numeric_limits<...> (mostly for size_t) # needed by src/c99_stdint.h @@ -96,6 +98,7 @@ AC_CHECK_SIZEOF([0i8], [], [[]]) AC_CONFIG_FILES([\ Makefile \ doc/manpage.rst \ + doc/help.rst \ ]) AC_CONFIG_FILES([run_tests.sh], [chmod +x run_tests.sh]) diff --git a/depcomp b/depcomp new file mode 100755 index 0000000..b39f98f --- /dev/null +++ b/depcomp @@ -0,0 +1,791 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2016-01-11.22; # UTC + +# Copyright (C) 1999-2017 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try '$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by 'PROGRAMS ARGS'. + object Object file output by 'PROGRAMS ARGS'. + DEPDIR directory where to store dependencies. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputting dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit $? + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit $? + ;; +esac + +# Get the directory component of the given path, and save it in the +# global variables '$dir'. Note that this directory component will +# be either empty or ending with a '/' character. This is deliberate. +set_dir_from () +{ + case $1 in + */*) dir=`echo "$1" | sed -e 's|/[^/]*$|/|'`;; + *) dir=;; + esac +} + +# Get the suffix-stripped basename of the given path, and save it the +# global variable '$base'. +set_base_from () +{ + base=`echo "$1" | sed -e 's|^.*/||' -e 's/\.[^.]*$//'` +} + +# If no dependency file was actually created by the compiler invocation, +# we still have to create a dummy depfile, to avoid errors with the +# Makefile "include basename.Plo" scheme. +make_dummy_depfile () +{ + echo "#dummy" > "$depfile" +} + +# Factor out some common post-processing of the generated depfile. +# Requires the auxiliary global variable '$tmpdepfile' to be set. +aix_post_process_depfile () +{ + # If the compiler actually managed to produce a dependency file, + # post-process it. + if test -f "$tmpdepfile"; then + # Each line is of the form 'foo.o: dependency.h'. + # Do two passes, one to just change these to + # $object: dependency.h + # and one to simply output + # dependency.h: + # which is needed to avoid the deleted-header problem. + { sed -e "s,^.*\.[$lower]*:,$object:," < "$tmpdepfile" + sed -e "s,^.*\.[$lower]*:[$tab ]*,," -e 's,$,:,' < "$tmpdepfile" + } > "$depfile" + rm -f "$tmpdepfile" + else + make_dummy_depfile + fi +} + +# A tabulation character. +tab=' ' +# A newline character. +nl=' +' +# Character ranges might be problematic outside the C locale. +# These definitions help. +upper=ABCDEFGHIJKLMNOPQRSTUVWXYZ +lower=abcdefghijklmnopqrstuvwxyz +digits=0123456789 +alpha=${upper}${lower} + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi + +# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po. +depfile=${depfile-`echo "$object" | + sed 's|[^\\/]*$|'${DEPDIR-.deps}'/&|;s|\.\([^.]*\)$|.P\1|;s|Pobj$|Po|'`} +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Avoid interferences from the environment. +gccflag= dashmflag= + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +cygpath_u="cygpath -u -f -" +if test "$depmode" = msvcmsys; then + # This is just like msvisualcpp but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvisualcpp +fi + +if test "$depmode" = msvc7msys; then + # This is just like msvc7 but w/o cygpath translation. + # Just convert the backslash-escaped backslashes to single forward + # slashes to satisfy depend.m4 + cygpath_u='sed s,\\\\,/,g' + depmode=msvc7 +fi + +if test "$depmode" = xlc; then + # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information. + gccflag=-qmakedep=gcc,-MF + depmode=gcc +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. +## Unfortunately, FreeBSD c89 acceptance of flags depends upon +## the command line argument order; so add the flags where they +## appear in depend2.am. Note that the slowdown incurred here +## affects only configure: in makefiles, %FASTDEP% shortcuts this. + for arg + do + case $arg in + -c) set fnord "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" "$arg" ;; + *) set fnord "$@" "$arg" ;; + esac + shift # fnord + shift # $arg + done + "$@" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## Note that this doesn't just cater to obsosete pre-3.x GCC compilers. +## but also to in-use compilers like IMB xlc/xlC and the HP C compiler. +## (see the conditional assignment to $gccflag above). +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). Also, it might not be +## supported by the other compilers which use the 'gcc' depmode. +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The second -e expression handles DOS-style file names with drive + # letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the "deleted header file" problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. +## Some versions of gcc put a space before the ':'. On the theory +## that the space means something, we add a space to the output as +## well. hp depmode also adds that space, but also prefixes the VPATH +## to the object. Take care to not repeat it in the output. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e "s|.*$object$||" -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like '#:fec' to the end of the + # dependency line. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' \ + | tr "$nl" ' ' >> "$depfile" + echo >> "$depfile" + # The second pass generates a dummy entry for each header file. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" + ;; + +xlc) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts '$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.u + tmpdepfile2=$base.u + tmpdepfile3=$dir.libs/$base.u + "$@" -Wc,-M + else + tmpdepfile1=$dir$base.u + tmpdepfile2=$dir$base.u + tmpdepfile3=$dir$base.u + "$@" -M + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + aix_post_process_depfile + ;; + +tcc) + # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26 + # FIXME: That version still under development at the moment of writing. + # Make that this statement remains true also for stable, released + # versions. + # It will wrap lines (doesn't matter whether long or short) with a + # trailing '\', as in: + # + # foo.o : \ + # foo.c \ + # foo.h \ + # + # It will put a trailing '\' even on the last line, and will use leading + # spaces rather than leading tabs (at least since its commit 0394caf7 + # "Emit spaces for -MD"). + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each non-empty line is of the form 'foo.o : \' or ' dep.h \'. + # We have to change lines of the first kind to '$object: \'. + sed -e "s|.*:|$object :|" < "$tmpdepfile" > "$depfile" + # And for each line of the second kind, we have to emit a 'dep.h:' + # dummy dependency, to avoid the deleted-header problem. + sed -n -e 's|^ *\(.*\) *\\$|\1:|p' < "$tmpdepfile" >> "$depfile" + rm -f "$tmpdepfile" + ;; + +## The order of this option in the case statement is important, since the +## shell code in configure will try each of these formats in the order +## listed in this file. A plain '-MD' option would be understood by many +## compilers, so we must ensure this comes after the gcc and icc options. +pgcc) + # Portland's C compiler understands '-MD'. + # Will always output deps to 'file.d' where file is the root name of the + # source file under compilation, even if file resides in a subdirectory. + # The object file name does not affect the name of the '.d' file. + # pgcc 10.2 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using '\' : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + set_dir_from "$object" + # Use the source, not the object, to determine the base name, since + # that's sadly what pgcc will do too. + set_base_from "$source" + tmpdepfile=$base.d + + # For projects that build the same source file twice into different object + # files, the pgcc approach of using the *source* file root name can cause + # problems in parallel builds. Use a locking strategy to avoid stomping on + # the same $tmpdepfile. + lockdir=$base.d-lock + trap " + echo '$0: caught signal, cleaning up...' >&2 + rmdir '$lockdir' + exit 1 + " 1 2 13 15 + numtries=100 + i=$numtries + while test $i -gt 0; do + # mkdir is a portable test-and-set. + if mkdir "$lockdir" 2>/dev/null; then + # This process acquired the lock. + "$@" -MD + stat=$? + # Release the lock. + rmdir "$lockdir" + break + else + # If the lock is being held by a different process, wait + # until the winning process is done or we timeout. + while test -d "$lockdir" && test $i -gt 0; do + sleep 1 + i=`expr $i - 1` + done + fi + i=`expr $i - 1` + done + trap - 1 2 13 15 + if test $i -le 0; then + echo "$0: failed to acquire lock after $numtries attempts" >&2 + echo "$0: check lockdir '$lockdir'" >&2 + exit 1 + fi + + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp2) + # The "hp" stanza above does not work with aCC (C++) and HP's ia64 + # compilers, which have integrated preprocessors. The correct option + # to use with these is +Maked; it writes dependencies to a file named + # 'foo.d', which lands next to the object file, wherever that + # happens to be. + # Much of this is similar to the tru64 case; see comments there. + set_dir_from "$object" + set_base_from "$object" + if test "$libtool" = yes; then + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir.libs/$base.d + "$@" -Wc,+Maked + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + "$@" +Maked + fi + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" + do + test -f "$tmpdepfile" && break + done + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[$lower]*:,$object:," "$tmpdepfile" > "$depfile" + # Add 'dependent.h:' lines. + sed -ne '2,${ + s/^ *// + s/ \\*$// + s/$/:/ + p + }' "$tmpdepfile" >> "$depfile" + else + make_dummy_depfile + fi + rm -f "$tmpdepfile" "$tmpdepfile2" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. 'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in 'foo.d' instead, so we check for that too. + # Subdirectories are respected. + set_dir_from "$object" + set_base_from "$object" + + if test "$libtool" = yes; then + # Libtool generates 2 separate objects for the 2 libraries. These + # two compilations output dependencies in $dir.libs/$base.o.d and + # in $dir$base.o.d. We have to check for both files, because + # one of the two compilations can be disabled. We should prefer + # $dir$base.o.d over $dir.libs/$base.o.d because the latter is + # automatically cleaned when .libs/ is deleted, while ignoring + # the former would cause a distcleancheck panic. + tmpdepfile1=$dir$base.o.d # libtool 1.5 + tmpdepfile2=$dir.libs/$base.o.d # Likewise. + tmpdepfile3=$dir.libs/$base.d # Compaq CCC V6.2-504 + "$@" -Wc,-MD + else + tmpdepfile1=$dir$base.d + tmpdepfile2=$dir$base.d + tmpdepfile3=$dir$base.d + "$@" -MD + fi + + stat=$? + if test $stat -ne 0; then + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + for tmpdepfile in "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + do + test -f "$tmpdepfile" && break + done + # Same post-processing that is required for AIX mode. + aix_post_process_depfile + ;; + +msvc7) + if test "$libtool" = yes; then + showIncludes=-Wc,-showIncludes + else + showIncludes=-showIncludes + fi + "$@" $showIncludes > "$tmpdepfile" + stat=$? + grep -v '^Note: including file: ' "$tmpdepfile" + if test $stat -ne 0; then + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + # The first sed program below extracts the file names and escapes + # backslashes for cygpath. The second sed program outputs the file + # name when reading, but also accumulates all include files in the + # hold buffer in order to output them again at the end. This only + # works with sed implementations that can handle large buffers. + sed < "$tmpdepfile" -n ' +/^Note: including file: *\(.*\)/ { + s//\1/ + s/\\/\\\\/g + p +}' | $cygpath_u | sort -u | sed -n ' +s/ /\\ /g +s/\(.*\)/'"$tab"'\1 \\/p +s/.\(.*\) \\/\1:/ +H +$ { + s/.*/'"$tab"'/ + G + p +}' >> "$depfile" + echo >> "$depfile" # make sure the fragment doesn't end with a backslash + rm -f "$tmpdepfile" + ;; + +msvc7msys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for ':' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise. + "$@" $dashmflag | + sed "s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |" > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this sed invocation + # correctly. Breaking it into two sed invocations is a workaround. + tr ' ' "$nl" < "$tmpdepfile" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no eat=no + for arg + do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + if test $eat = yes; then + eat=no + continue + fi + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -arch) + eat=yes ;; + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix=`echo "$object" | sed 's/^.*\././'` + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + # makedepend may prepend the VPATH from the source file name to the object. + # No need to regex-escape $object, excess matching of '.' is harmless. + sed "s|^.*\($object *:\)|\1|" "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process the last invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed '1,2d' "$tmpdepfile" \ + | tr ' ' "$nl" \ + | sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' \ + | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + # Remove '-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E \ + | sed -n -e '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + -e '/^#line [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' \ + | sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test "X$1" != 'X--mode=compile'; do + shift + done + shift + fi + + IFS=" " + for arg + do + case "$arg" in + -o) + shift + ;; + $object) + shift + ;; + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E 2>/dev/null | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::\1:p' | $cygpath_u | sort -u > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::'"$tab"'\1 \\:p' >> "$depfile" + echo "$tab" >> "$depfile" + sed < "$tmpdepfile" -n -e 's% %\\ %g' -e '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvcmsys) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/distcheck.sh b/distcheck.sh deleted file mode 100755 index 4916e52..0000000 --- a/distcheck.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash - -set -e - -if [ $# -ne 1 ] -then - echo "usage: ./distcheck.sh " - exit 1 -fi -builddir="$1" - -./autogen.sh - -# try to be portable on various MAKEs -for make_prog in make bmake -do - rm -rf $builddir - mkdir $builddir - cd $builddir - ../configure --enable-docs && \ - $make_prog bootstrap -j5 - $make_prog distcheck -j5 - cd .. -done diff --git a/doc/help.rst b/doc/help.rst new file mode 100644 index 0000000..48bdd93 --- /dev/null +++ b/doc/help.rst @@ -0,0 +1,5 @@ +.. include:: ../../doc/manual/options/options_list.rst + +.. include:: ../../doc/manual/warnings/warnings_general.rst + +.. include:: ../../doc/manual/warnings/warnings_list.rst diff --git a/doc/help.rst.in b/doc/help.rst.in new file mode 100644 index 0000000..1751456 --- /dev/null +++ b/doc/help.rst.in @@ -0,0 +1,5 @@ +.. include:: @top_srcdir@/doc/manual/options/options_list.rst + +.. include:: @top_srcdir@/doc/manual/warnings/warnings_general.rst + +.. include:: @top_srcdir@/doc/manual/warnings/warnings_list.rst diff --git a/doc/manpage.rst.in b/doc/manpage.rst.in index fa40d28..c682807 100644 --- a/doc/manpage.rst.in +++ b/doc/manpage.rst.in @@ -21,1001 +21,102 @@ specifications inside of C/C++ comments and replaces them with a hard-coded DFA. The user must supply some interface code in order to control and customize the generated DFA. + OPTIONS ------- -``-? -h --help`` - Invoke a short help. - -``-b --bit-vectors`` - Implies ``-s``. Use bit vectors as well in the - attempt to coax better code out of the compiler. Most useful for - specifications with more than a few keywords (e.g. for most programming - languages). - -``-c --conditions`` - Used to support (f)lex-like condition support. - -``-d --debug-output`` - Creates a parser that dumps information about - the current position and in which state the parser is while parsing the - input. This is useful to debug parser issues and states. If you use this - switch you need to define a macro ``YYDEBUG`` that is called like a - function with two parameters: ``void YYDEBUG (int state, char current)``. - The first parameter receives the state or ``-1`` and the second parameter - receives the input at the current cursor. - -``-D --emit-dot`` - Emit Graphviz dot data. It can then be processed - with e.g. ``dot -Tpng input.dot > output.png``. Please note that - scanners with many states may crash dot. - -``-e --ecb`` - Generate a parser that supports EBCDIC. The generated - code can deal with any character up to 0xFF. In this mode ``re2c`` assumes - that input character size is 1 byte. This switch is incompatible with - ``-w``, ``-x``, ``-u`` and ``-8``. - -``-f --storable-state`` - Generate a scanner with support for storable state. - -``-F --flex-syntax`` - Partial support for flex syntax. When this flag - is active then named definitions must be surrounded by curly braces and - can be defined without an equal sign and the terminating semi colon. - Instead names are treated as direct double quoted strings. - -``-g --computed-gotos`` - Generate a scanner that utilizes GCC's - computed goto feature. That is ``re2c`` generates jump tables whenever a - decision is of a certain complexity (e.g. a lot of if conditions are - otherwise necessary). This is only useable with GCC and produces output - that cannot be compiled with any other compiler. Note that this implies - ``-b`` and that the complexity threshold can be configured using the - inplace configuration ``cgoto:threshold``. - -``-i --no-debug-info`` - Do not output ``#line`` information. This is - useful when you want use a CMS tool with the ``re2c`` output which you - might want if you do not require your users to have ``re2c`` themselves - when building from your source. - -``-o OUTPUT --output=OUTPUT`` - Specify the ``OUTPUT`` file. - -``-r --reusable`` - Allows reuse of scanner definitions with ``/*!use:re2c */`` after ``/*!rules:re2c */``. - In this mode no ``/*!re2c */`` block and exactly one ``/*!rules:re2c */`` must be present. - The rules are being saved and used by every ``/*!use:re2c */`` block that follows. - These blocks can contain inplace configurations, especially ``re2c:flags:e``, - ``re2c:flags:w``, ``re2c:flags:x``, ``re2c:flags:u`` and ``re2c:flags:8``. - That way it is possible to create the same scanner multiple times for - different character types, different input mechanisms or different output mechanisms. - The ``/*!use:re2c */`` blocks can also contain additional rules that will be appended - to the set of rules in ``/*!rules:re2c */``. - -``-s --nested-ifs`` - Generate nested ifs for some switches. Many - compilers need this assist to generate better code. - -``-t HEADER --type-header=HEADER`` - Create a ``HEADER`` file that - contains types for the (f)lex-like condition support. This can only be - activated when ``-c`` is in use. - -``-u --unicode`` - Generate a parser that supports UTF-32. The generated - code can deal with any valid Unicode character up to 0x10FFFF. In this - mode ``re2c`` assumes that input character size is 4 bytes. This switch is - incompatible with ``-e``, ``-w``, ``-x`` and ``-8``. This implies ``-s``. - -``-v --version`` - Show version information. - -``-V --vernum`` - Show the version as a number XXYYZZ. - -``-w --wide-chars`` - Generate a parser that supports UCS-2. The - generated code can deal with any valid Unicode character up to 0xFFFF. - In this mode ``re2c`` assumes that input character size is 2 bytes. This - switch is incompatible with ``-e``, ``-x``, ``-u`` and ``-8``. This implies - ``-s``. - -``-x --utf-16`` - Generate a parser that supports UTF-16. The generated - code can deal with any valid Unicode character up to 0x10FFFF. In this - mode ``re2c`` assumes that input character size is 2 bytes. This switch is - incompatible with ``-e``, ``-w``, ``-u`` and ``-8``. This implies ``-s``. - -``-8 --utf-8`` - Generate a parser that supports UTF-8. The generated - code can deal with any valid Unicode character up to 0x10FFFF. In this - mode ``re2c`` assumes that input character size is 1 byte. This switch is - incompatible with ``-e``, ``-w``, ``-x`` and ``-u``. - -``--case-insensitive`` - All strings are case insensitive, so all - "-expressions are treated in the same way '-expressions are. - -``--case-inverted`` - Invert the meaning of single and double quoted - strings. With this switch single quotes are case sensitive and double - quotes are case insensitive. - -``--no-generation-date`` - Suppress date output in the generated file. - -``--no-generation-date`` - Suppress version output in the generated file. - -``--encoding-policy POLICY`` - Specify how ``re2c`` must treat Unicode - surrogates. ``POLICY`` can be one of the following: ``fail`` (abort with - error when surrogate encountered), ``substitute`` (silently substitute - surrogate with error code point 0xFFFD), ``ignore`` (treat surrogates as - normal code points). By default ``re2c`` ignores surrogates (for backward - compatibility). Unicode standard says that standalone surrogates are - invalid code points, but different libraries and programs treat them - differently. - -``--input INPUT`` - Specify re2c input API. ``INPUT`` can be one of the - following: ``default``, ``custom``. +.. include:: @top_srcdir@/doc/manual/options/options_list.rst -``-S --skeleton`` - Instead of embedding re2c-generated code into C/C++ - source, generate a self-contained program for the same DFA. Most useful - for correctness and performance testing. - -``--empty-class POLICY`` - What to do if user inputs empty character - class. ``POLICY`` can be one of the following: ``match-empty`` (match empty - input: pretty illogical, but this is the default for backwards - compatibility reason), ``match-none`` (fail to match on any input), - ``error`` (compilation error). Note that there are various ways to - construct empty class, e.g: [], [^\\x00-\\xFF], - [\\x00-\\xFF][\\x00-\\xFF]. - -``--dfa-minimization
`` - Internal algorithm used by re2c to minimize DFA (defaults to ``moore``). - Both table filling and Moore's algorithms should produce identical DFA (up to states relabelling). - Table filling algorithm is much simpler and slower; it serves as a reference implementation. - -``-1 --single-pass`` - Deprecated and does nothing (single pass is by default now). - -``-W`` - Turn on all warnings. - -``-Werror`` - Turn warnings into errors. Note that this option along - doesn't turn on any warnings, it only affects those warnings that have - been turned on so far or will be turned on later. - -``-W`` - Turn on individual ``warning``. - -``-Wno-`` - Turn off individual ``warning``. - -``-Werror-`` - Turn on individual ``warning`` and treat it as error (this implies ``-W``). - -``-Wno-error-`` - Don't treat this particular ``warning`` as error. This doesn't turn off - the warning itself. - -``-Wcondition-order`` - Warn if the generated program makes implicit - assumptions about condition numbering. One should use either ``-t, --type-header`` option or - ``/*!types:re2c*/`` directive to generate mapping of condition names to numbers and use - autogenerated condition names. - -``-Wempty-character-class`` - Warn if regular expression contains empty - character class. From the rational point of view trying to match empty - character class makes no sense: it should always fail. However, for - backwards compatibility reasons ``re2c`` allows empty character class and - treats it as empty string. Use ``--empty-class`` option to change default - behaviour. - -``-Wmatch-empty-string`` - Warn if regular expression in a rule is - nullable (matches empty string). If DFA runs in a loop and empty match - is unintentional (input position in not advanced manually), lexer may - get stuck in eternal loop. - -``-Wswapped-range`` - Warn if range lower bound is greater that upper - bound. Default ``re2c`` behaviour is to silently swap range bounds. - -``-Wundefined-control-flow`` - Warn if some input strings cause undefined - control flow in lexer (the faulty patterns are reported). This is the - most dangerous and common mistake. It can be easily fixed by adding - default rule ``*`` (this rule has the lowest priority, matches any code unit and consumes - exactly one code unit). - -``-Wuseless-escape`` - Warn if a symbol is escaped when it shouldn't be. - By default re2c silently ignores escape, but this may as well indicate a - typo or an error in escape sequence. +.. include:: @top_srcdir@/doc/manual/warnings/warnings_general.rst +.. include:: @top_srcdir@/doc/manual/warnings/warnings_list.rst INTERFACE CODE -------------- -The user must supply interface code either in the form of C/C++ code -(macros, functions, variables, etc.) or in the form of ``INPLACE CONFIGURATIONS``. -Which symbols must be defined and which are optional -depends on a particular use case. - -``YYCONDTYPE`` - In ``-c`` mode you can use ``-t`` to generate a file that - contains the enumeration used as conditions. Each of the values refers - to a condition of a rule set. - -``YYCTXMARKER`` - l-value of type ``YYCTYPE *``. - The generated code saves trailing context backtracking information in - ``YYCTXMARKER``. The user only needs to define this macro if a scanner - specification uses trailing context in one or more of its regular - expressions. - -``YYCTYPE`` - Type used to hold an input symbol (code unit). Usually - ``char`` or ``unsigned char`` for ASCII, EBCDIC and UTF-8, ``unsigned short`` - for UTF-16 or UCS-2 and ``unsigned int`` for UTF-32. - -``YYCURSOR`` - l-value of type ``YYCTYPE *`` that points to the current input symbol. The generated code advances - ``YYCURSOR`` as symbols are matched. On entry, ``YYCURSOR`` is assumed to - point to the first character of the current token. On exit, ``YYCURSOR`` - will point to the first character of the following token. - -``YYDEBUG (state, current)`` - This is only needed if the ``-d`` flag was - specified. It allows one to easily debug the generated parser by calling a - user defined function for every state. The function should have the - following signature: ``void YYDEBUG (int state, char current)``. The first - parameter receives the state or -1 and the second parameter receives the - input at the current cursor. - -``YYFILL (n)`` - The generated code "calls"" ``YYFILL (n)`` when the - buffer needs (re)filling: at least ``n`` additional characters should be - provided. ``YYFILL (n)`` should adjust ``YYCURSOR``, ``YYLIMIT``, ``YYMARKER`` - and ``YYCTXMARKER`` as needed. Note that for typical programming languages - ``n`` will be the length of the longest keyword plus one. The user can - place a comment of the form ``/*!max:re2c*/`` to insert ``YYMAXFILL`` definition that is set to the maximum - length value. - -``YYGETCONDITION ()`` - This define is used to get the condition prior to - entering the scanner code when using ``-c`` switch. The value must be - initialized with a value from the enumeration ``YYCONDTYPE`` type. - -``YYGETSTATE ()`` - The user only needs to define this macro if the ``-f`` - flag was specified. In that case, the generated code "calls" - ``YYGETSTATE ()`` at the very beginning of the scanner in order to obtain - the saved state. ``YYGETSTATE ()`` must return a signed integer. The value - must be either -1, indicating that the scanner is entered for the first - time, or a value previously saved by ``YYSETSTATE (s)``. In the second - case, the scanner will resume operations right after where the last - ``YYFILL (n)`` was called. - -``YYLIMIT`` - Expression of type ``YYCTYPE *`` that marks the end of the buffer ``YYLIMIT[-1]`` - is the last character in the buffer). The generated code repeatedly - compares ``YYCURSOR`` to ``YYLIMIT`` to determine when the buffer needs - (re)filling. - -``YYMARKER`` - l-value of type ``YYCTYPE *``. - The generated code saves backtracking information in ``YYMARKER``. Some - easy scanners might not use this. - -``YYMAXFILL`` - This will be automatically defined by ``/*!max:re2c*/`` blocks as explained above. - -``YYSETCONDITION (c)`` - This define is used to set the condition in - transition rules. This is only being used when ``-c`` is active and - transition rules are being used. - -``YYSETSTATE (s)`` - The user only needs to define this macro if the ``-f`` - flag was specified. In that case, the generated code "calls" - ``YYSETSTATE`` just before calling ``YYFILL (n)``. The parameter to - ``YYSETSTATE`` is a signed integer that uniquely identifies the specific - instance of ``YYFILL (n)`` that is about to be called. Should the user - wish to save the state of the scanner and have ``YYFILL (n)`` return to - the caller, all he has to do is store that unique identifer in a - variable. Later, when the scannered is called again, it will call - ``YYGETSTATE ()`` and resume execution right where it left off. The - generated code will contain both ``YYSETSTATE (s)`` and ``YYGETSTATE`` even - if ``YYFILL (n)`` is being disabled. - +.. include:: @top_srcdir@/doc/manual/syntax/interface.rst_ SYNTAX ------ -Code for ``re2c`` consists of a set of ``RULES``, ``NAMED DEFINITIONS`` and -``INPLACE CONFIGURATIONS``. +A program can contain any number of ``re2c`` blocks. +Each block consists of a sequence of ``RULES``, ``NAMED DEFINITIONS`` and ``INPLACE CONFIGURATIONS``. RULES ~~~~~ -Rules consist of a regular expression (see ``REGULAR EXPRESSIONS``) along with a block of C/C++ code -that is to be executed when the associated regular expression is -matched. You can either start the code with an opening curly brace or -the sequence ``:=``. When the code with a curly brace then ``re2c`` counts the brace depth -and stops looking for code automatically. Otherwise curly braces are not -allowed and ``re2c`` stops looking for code at the first line that does -not begin with whitespace. If two or more rules overlap, the first rule -is preferred. - - ``regular-expression { C/C++ code }`` - - ``regular-expression := C/C++ code`` - -There is one special rule: default rule ``*`` - - ``* { C/C++ code }`` - - ``* := C/C++ code`` - -Note that default rule ``*`` differs from ``[^]``: default rule has the lowest priority, -matches any code unit (either valid or invalid) and always consumes one character; -while ``[^]`` matches any valid code point (not code unit) and can consume multiple -code units. In fact, when variable-length encoding is used, ``*`` -is the only possible way to match invalid input character (see ``ENCODINGS`` for details). - -If ``-c`` is active then each regular expression is preceded by a list -of comma separated condition names. Besides normal naming rules there -are two special cases: ``<*>`` (such rules are merged to all conditions) -and ``<>`` (such the rule cannot have an associated regular expression, -its code is merged to all actions). Non empty rules may further more specify the new -condition. In that case ``re2c`` will generate the necessary code to -change the condition automatically. Rules can use ``:=>`` as a shortcut -to automatically generate code that not only sets the -new condition state but also continues execution with the new state. A -shortcut rule should not be used in a loop where there is code between -the start of the loop and the ``re2c`` block unless ``re2c:cond:goto`` -is changed to ``continue``. If code is necessary before all rules (though not simple jumps) you -can doso by using ```` pseudo-rules. - - `` regular-expression { C/C++ code }`` - - `` regular-expression := C/C++ code`` - - `` * { C/C++ code }`` - - `` * := C/C++ code`` - - `` regular-expression => condition { C/C++ code }`` - - `` regular-expression => condition := C/C++ code`` - - `` * => condition { C/C++ code }`` - - `` * => condition := C/C++ code`` - - `` regular-expression :=> condition`` - - - ``<*> regular-expression { C/C++ code }`` - - ``<*> regular-expression := C/C++ code`` - - ``<*> * { C/C++ code }`` - - ``<*> * := C/C++ code`` - - ``<*> regular-expression => condition { C/C++ code }`` - - ``<*> regular-expression => condition := C/C++ code`` - - ``<*> * => condition { C/C++ code }`` - - ``<*> * => condition := C/C++ code`` - - ``<*> regular-expression :=> condition`` - - - ``<> { C/C++ code }`` - - ``<> := C/C++ code`` - - ``<> => condition { C/C++ code }`` - - ``<> => condition := C/C++ code`` - - ``<> :=> condition`` - - ``<> :=> condition`` - - - `` { C/C++ code }`` - - `` := C/C++ code`` - - `` { C/C++ code }`` - - `` := C/C++ code`` - +.. include:: @top_srcdir@/doc/manual/syntax/rules.rst_ NAMED DEFINITIONS ~~~~~~~~~~~~~~~~~ -Named definitions are of the form: - - ``name = regular-expression;`` - -If ``-F`` is active, then named definitions are also of the form: - - ``name { regular-expression }`` +.. include:: @top_srcdir@/doc/manual/syntax/named_definitions.rst_ INPLACE CONFIGURATIONS ~~~~~~~~~~~~~~~~~~~~~~ -``re2c:condprefix = yyc;`` - Allows one to specify the prefix used for - condition labels. That is this text is prepended to any condition label - in the generated output file. - -``re2c:condenumprefix = yyc;`` - Allows one to specify the prefix used for - condition values. That is this text is prepended to any condition enum - value in the generated output file. - -``re2c:cond:divider = "/* *********************************** */";`` - Allows one to customize the devider for condition blocks. You can use ``@@`` - to put the name of the condition or customize the placeholder using - ``re2c:cond:divider@cond``. - -``re2c:cond:divider@cond = @@;`` - Specifies the placeholder that will be - replaced with the condition name in ``re2c:cond:divider``. - -``re2c:cond:goto = "goto @@;";`` - Allows one to customize the condition goto statements used with ``:=>`` style rules. You can use ``@@`` - to put the name of the condition or ustomize the placeholder using - ``re2c:cond:goto@cond``. You can also change this to ``continue;``, which - would allow you to continue with the next loop cycle including any code - between loop start and re2c block. - -``re2c:cond:goto@cond = @@;`` - Spcifies the placeholder that will be replaced with the condition label in ``re2c:cond:goto``. - -``re2c:indent:top = 0;`` - Specifies the minimum number of indentation to - use. Requires a numeric value greater than or equal zero. - -``re2c:indent:string = "\t";`` - Specifies the string to use for indentation. Requires a string that should - contain only whitespace unless you need this for external tools. The easiest - way to specify spaces is to enclude them in single or double quotes. - If you do not want any indentation at all you can simply set this to "". - -``re2c:yych:conversion = 0;`` - When this setting is non zero, then ``re2c`` automatically generates - conversion code whenever yych gets read. In this case the type must be - defined using ``re2c:define:YYCTYPE``. - -``re2c:yych:emit = 1;`` - Generation of ``yych`` can be suppressed by setting this to 0. - -``re2c:yybm:hex = 0;`` - If set to zero then a decimal table is being used else a hexadecimal table will be generated. - -``re2c:yyfill:enable = 1;`` - Set this to zero to suppress generation of ``YYFILL (n)``. When using this be sure to verify that the generated - scanner does not read behind input. Allowing this behavior might - introduce sever security issues to you programs. - -``re2c:yyfill:check = 1;`` - This can be set 0 to suppress output of the - pre condition using ``YYCURSOR`` and ``YYLIMIT`` which becomes useful when - ``YYLIMIT + YYMAXFILL`` is always accessible. - -``re2c:define:YYFILL = "YYFILL";`` - Substitution for ``YYFILL``. Note - that by default ``re2c`` generates argument in braces and semicolon after - ``YYFILL``. If you need to make ``YYFILL`` an arbitrary statement rather - than a call, set ``re2c:define:YYFILL:naked`` to non-zero and use - ``re2c:define:YYFILL@len`` to denote formal parameter inside of ``YYFILL`` - body. - -``re2c:define:YYFILL@len = "@@";`` - Any occurrence of this text - inside of ``YYFILL`` will be replaced with the actual argument. - -``re2c:yyfill:parameter = 1;`` - Controls argument in braces after - ``YYFILL``. If zero, agrument is omitted. If non-zero, argument is - generated unless ``re2c:define:YYFILL:naked`` is set to non-zero. - -``re2c:define:YYFILL:naked = 0;`` - Controls argument in braces and - semicolon after ``YYFILL``. If zero, both agrument and semicolon are - omitted. If non-zero, argument is generated unless - ``re2c:yyfill:parameter`` is set to zero and semicolon is generated - unconditionally. - -``re2c:startlabel = 0;`` - If set to a non zero integer then the start - label of the next scanner blocks will be generated even if not used by - the scanner itself. Otherwise the normal ``yy0`` like start label is only - being generated if needed. If set to a text value then a label with that - text will be generated regardless of whether the normal start label is - being used or not. This setting is being reset to 0 after a start - label has been generated. - -``re2c:labelprefix = "yy";`` - Allows one to change the prefix of numbered - labels. The default is ``yy`` and can be set any string that is a valid - label. - -``re2c:state:abort = 0;`` - When not zero and switch ``-f`` is active then - the ``YYGETSTATE`` block will contain a default case that aborts and a -1 - case is used for initialization. - -``re2c:state:nextlabel = 0;`` - Used when ``-f`` is active to control - whether the ``YYGETSTATE`` block is followed by a ``yyNext:`` label line. - Instead of using ``yyNext`` you can usually also use configuration - ``startlabel`` to force a specific start label or default to ``yy0`` as - start label. Instead of using a dedicated label it is often better to - separate the ``YYGETSTATE`` code from the actual scanner code by placing a - ``/*!getstate:re2c*/`` comment. - -``re2c:cgoto:threshold = 9;`` - When ``-g`` is active this value specifies - the complexity threshold that triggers generation of jump tables rather - than using nested if's and decision bitfields. The threshold is compared - against a calculated estimation of if-s needed where every used bitmap - divides the threshold by 2. - -``re2c:yych:conversion = 0;`` - When the input uses signed characters and - ``-s`` or ``-b`` switches are in effect re2c allows one to automatically convert - to the unsigned character type that is then necessary for its internal - single character. When this setting is zero or an empty string the - conversion is disabled. Using a non zero number the conversion is taken - from ``YYCTYPE``. If that is given by an inplace configuration that value - is being used. Otherwise it will be ``(YYCTYPE)`` and changes to that - configuration are no longer possible. When this setting is a string the - braces must be specified. Now assuming your input is a ``char *`` - buffer and you are using above mentioned switches you can set - ``YYCTYPE`` to ``unsigned char`` and this setting to either 1 or ``(unsigned char)``. - -``re2c:define:YYCONDTYPE = "YYCONDTYPE";`` - Enumeration used for condition support with ``-c`` mode. - -``re2c:define:YYCTXMARKER = "YYCTXMARKER";`` - Allows one to overwrite the - define ``YYCTXMARKER`` and thus avoiding it by setting the value to the - actual code needed. - -``re2c:define:YYCTYPE = "YYCTYPE";`` - Allows one to overwrite the define - ``YYCTYPE`` and thus avoiding it by setting the value to the actual code - needed. - -``re2c:define:YYCURSOR = "YYCURSOR";`` - Allows one to overwrite the define - ``YYCURSOR`` and thus avoiding it by setting the value to the actual code - needed. - -``re2c:define:YYDEBUG = "YYDEBUG";`` - Allows one to overwrite the define - ``YYDEBUG`` and thus avoiding it by setting the value to the actual code - needed. - -``re2c:define:YYGETCONDITION = "YYGETCONDITION";`` - Substitution for - ``YYGETCONDITION``. Note that by default ``re2c`` generates braces after - ``YYGETCONDITION``. Set ``re2c:define:YYGETCONDITION:naked`` to non-zero to - omit braces. - -``re2c:define:YYGETCONDITION:naked = 0;`` - Controls braces after - ``YYGETCONDITION``. If zero, braces are omitted. If non-zero, braces are - generated. - -``re2c:define:YYSETCONDITION = "YYSETCONDITION";`` - Substitution for - ``YYSETCONDITION``. Note that by default ``re2c`` generates argument in - braces and semicolon after ``YYSETCONDITION``. If you need to make - ``YYSETCONDITION`` an arbitrary statement rather than a call, set - ``re2c:define:YYSETCONDITION:naked`` to non-zero and use - ``re2c:define:YYSETCONDITION@cond`` to denote formal parameter inside of - ``YYSETCONDITION`` body. - -``re2c:define:YYSETCONDITION@cond = "@@";`` - Any occurrence of this - text inside of ``YYSETCONDITION`` will be replaced with the actual - argument. - -``re2c:define:YYSETCONDITION:naked = 0;`` - Controls argument in braces - and semicolon after ``YYSETCONDITION``. If zero, both agrument and - semicolon are omitted. If non-zero, both argument and semicolon are - generated. - -``re2c:define:YYGETSTATE = "YYGETSTATE";`` - Substitution for - ``YYGETSTATE``. Note that by default ``re2c`` generates braces after - ``YYGETSTATE``. Set ``re2c:define:YYGETSTATE:naked`` to non-zero to omit - braces. - -``re2c:define:YYGETSTATE:naked = 0;`` - Controls braces after - ``YYGETSTATE``. If zero, braces are omitted. If non-zero, braces are - generated. - -``re2c:define:YYSETSTATE = "YYSETSTATE";`` - Substitution for - ``YYSETSTATE``. Note that by default ``re2c`` generates argument in braces - and semicolon after ``YYSETSTATE``. If you need to make ``YYSETSTATE`` an - arbitrary statement rather than a call, set - ``re2c:define:YYSETSTATE:naked`` to non-zero and use - ``re2c:define:YYSETSTATE@cond`` to denote formal parameter inside of - ``YYSETSTATE`` body. - -``re2c:define:YYSETSTATE@state = "@@";`` - Any occurrence of this text - inside of ``YYSETSTATE`` will be replaced with the actual argument. - -``re2c:define:YYSETSTATE:naked = 0;`` - Controls argument in braces and - semicolon after ``YYSETSTATE``. If zero, both agrument and semicolon are - omitted. If non-zero, both argument and semicolon are generated. - -``re2c:define:YYLIMIT = "YYLIMIT";`` - Allows one to overwrite the define - ``YYLIMIT`` and thus avoiding it by setting the value to the actual code - needed. - -``re2c:define:YYMARKER = "YYMARKER";`` - Allows one to overwrite the define - ``YYMARKER`` and thus avoiding it by setting the value to the actual code - needed. - -``re2c:label:yyFillLabel = "yyFillLabel";`` - Allows one to overwrite the name of the label ``yyFillLabel``. - -``re2c:label:yyNext = "yyNext";`` - Allows one to overwrite the name of the label ``yyNext``. - -``re2c:variable:yyaccept = yyaccept;`` - Allows one to overwrite the name of the variable ``yyaccept``. - -``re2c:variable:yybm = "yybm";`` - Allows one to overwrite the name of the variable ``yybm``. - -``re2c:variable:yych = "yych";`` - Allows one to overwrite the name of the variable ``yych``. - -``re2c:variable:yyctable = "yyctable";`` - When both ``-c`` and ``-g`` are active then ``re2c`` uses this variable to generate a static jump table - for ``YYGETCONDITION``. - -``re2c:variable:yystable = "yystable";`` - Deprecated. - -``re2c:variable:yytarget = "yytarget";`` - Allows one to overwrite the name of the variable ``yytarget``. - +.. include:: @top_srcdir@/doc/manual/syntax/configurations.rst_ REGULAR EXPRESSIONS ~~~~~~~~~~~~~~~~~~~ -``"foo"`` - literal string ``"foo"``. ANSI-C escape sequences can be used. - -``'foo'`` - literal string ``"foo"`` (characters [a-zA-Z] treated - case-insensitive). ANSI-C escape sequences can be used. - -``[xyz]`` - character class; in this case, regular expression matches either ``x``, ``y``, or ``z``. - -``[abj-oZ]`` - character class with a range in it; matches ``a``, ``b``, any letter from ``j`` through ``o`` or ``Z``. - -``[^class]`` - inverted character class. - -``r \ s`` - match any ``r`` which isn't ``s``. ``r`` and ``s`` must be regular expressions - which can be expressed as character classes. - -``r*`` - zero or more occurrences of ``r``. - -``r+`` - one or more occurrences of ``r``. +.. include:: @top_srcdir@/doc/manual/syntax/regular_expressions.rst_ -``r?`` - optional ``r``. -``(r)`` - ``r``; parentheses are used to override precedence. - -``r s`` - ``r`` followed by ``s`` (concatenation). - -``r | s`` - either ``r`` or ``s`` (alternative). - -``r`` / ``s`` - ``r`` but only if it is followed by ``s``. Note that ``s`` is not - part of the matched text. This type of regular expression is called - "trailing context". Trailing context can only be the end of a rule - and not part of a named definition. - -``r{n}`` - matches ``r`` exactly ``n`` times. - -``r{n,}`` - matches ``r`` at least ``n`` times. - -``r{n,m}`` - matches ``r`` at least ``n`` times, but not more than ``m`` times. - -``.`` - match any character except newline. - -``name`` - matches named definition as specified by ``name`` only if ``-F`` is - off. If ``-F`` is active then this behaves like it was enclosed in double - quotes and matches the string "name". - -Character classes and string literals may contain octal or hexadecimal -character definitions and the following set of escape sequences: -``\a``, ``\b``, ``\f``, ``\n``, ``\r``, ``\t``, ``\v``, ``\\``. An octal character is defined by a backslash -followed by its three octal digits (e.g. ``\377``). -Hexadecimal characters from 0 to 0xFF are defined by backslash, a lower -cased ``x`` and two hexadecimal digits (e.g. ``\x12``). Hexadecimal characters from 0x100 to 0xFFFF are defined by backslash, a lower cased -``\u`` or an upper cased ``\X`` and four hexadecimal digits (e.g. ``\u1234``). -Hexadecimal characters from 0x10000 to 0xFFFFffff are defined by backslash, an upper cased ``\U`` -and eight hexadecimal digits (e.g. ``\U12345678``). - -The only portable "any" rule is the default rule ``*``. - - - -SCANNER WITH STORABLE STATES ----------------------------- - -When the ``-f`` flag is specified, ``re2c`` generates a scanner that can -store its current state, return to the caller, and later resume -operations exactly where it left off. - -The default operation of ``re2c`` is a -"pull" model, where the scanner asks for extra input whenever it needs it. However, this mode of operation assumes that the scanner is the "owner" -the parsing loop, and that may not always be convenient. - -Typically, if there is a preprocessor ahead of the scanner in the -stream, or for that matter any other procedural source of data, the -scanner cannot "ask" for more data unless both scanner and source -live in a separate threads. - -The ``-f`` flag is useful for just this situation: it lets users design -scanners that work in a "push" model, i.e. where data is fed to the -scanner chunk by chunk. When the scanner runs out of data to consume, it -just stores its state, and return to the caller. When more input data is -fed to the scanner, it resumes operations exactly where it left off. - -Changes needed compared to the "pull" model: - -* User has to supply macros ``YYSETSTATE ()`` and ``YYGETSTATE (state)``. - -* The ``-f`` option inhibits declaration of ``yych`` and ``yyaccept``. So the - user has to declare these. Also the user has to save and restore these. - In the example ``examples/push_model/push.re`` these are declared as - fields of the (C++) class of which the scanner is a method, so they do - not need to be saved/restored explicitly. For C they could e.g. be made - macros that select fields from a structure passed in as parameter. - Alternatively, they could be declared as local variables, saved with - ``YYFILL (n)`` when it decides to return and restored at entry to the - function. Also, it could be more efficient to save the state from - ``YYFILL (n)`` because ``YYSETSTATE (state)`` is called unconditionally. - ``YYFILL (n)`` however does not get ``state`` as parameter, so we would have - to store state in a local variable by ``YYSETSTATE (state)``. - -* Modify ``YYFILL (n)`` to return (from the function calling it) if more input is needed. - -* Modify caller to recognise if more input is needed and respond appropriately. - -* The generated code will contain a switch block that is used to - restores the last state by jumping behind the corrspoding ``YYFILL (n)`` - call. This code is automatically generated in the epilog of the first ``/*!re2c */`` - block. It is possible to trigger generation of the ``YYGETSTATE ()`` - block earlier by placing a ``/*!getstate:re2c*/`` comment. This is especially useful when the scanner code should be - wrapped inside a loop. - -Please see ``examples/push_model/push.re`` for "push" model scanner. The -generated code can be tweaked using inplace configurations ``state:abort`` -and ``state:nextlabel``. +SUBMATCH EXTRACTION +------------------- +.. include:: @top_srcdir@/doc/manual/features/submatch/submatch.rst_ -SCANNER WITH CONDITION SUPPORT ------------------------------- +STORABLE STATE +-------------- -You can preceed regular expressions with a list of condition names when -using the ``-c`` switch. In this case ``re2c`` generates scanner blocks for -each conditon. Where each of the generated blocks has its own -precondition. The precondition is given by the interface define -``YYGETCONDITON()`` and must be of type ``YYCONDTYPE``. +.. include:: @top_srcdir@/doc/manual/features/state/state.rst_ -There are two special rule types. First, the rules of the condition ``<*>`` -are merged to all conditions (note that they have lower priority than -other rules of that condition). And second the empty condition list -allows one to provide a code block that does not have a scanner part. -Meaning it does not allow any regular expression. The condition value -referring to this special block is always the one with the enumeration -value 0. This way the code of this special rule can be used to -initialize a scanner. It is in no way necessary to have these rules: but -sometimes it is helpful to have a dedicated uninitialized condition -state. -Non empty rules allow one to specify the new condition, which makes them -transition rules. Besides generating calls for the define -``YYSETCONDTITION`` no other special code is generated. -There is another kind of special rules that allow one to prepend code to any -code block of all rules of a certain set of conditions or to all code -blocks to all rules. This can be helpful when some operation is common -among rules. For instance this can be used to store the length of the -scanned string. These special setup rules start with an exclamation mark -followed by either a list of conditions ```` or a star -````. When ``re2c`` generates the code for a rule whose state does not have a -setup rule and a star'd setup rule is present, than that code will be -used as setup code. +CONDITIONS +---------- +.. include:: @top_srcdir@/doc/manual/features/conditions/conditions.rst_ ENCODINGS --------- -``re2c`` supports the following encodings: ASCII (default), EBCDIC (``-e``), -UCS-2 (``-w``), UTF-16 (``-x``), UTF-32 (``-u``) and UTF-8 (``-8``). -See also inplace configuration ``re2c:flags``. - -The following concepts should be clarified when talking about encoding. -Code point is an abstract number, which represents single encoding -symbol. Code unit is the smallest unit of memory, which is used in the -encoded text (it corresponds to one character in the input stream). One -or more code units can be needed to represent a single code point, -depending on the encoding. In fixed-length encoding, each code point -is represented with equal number of code units. In variable-length -encoding, different code points can be represented with different number -of code units. - -ASCII - is a fixed-length encoding. Its code space includes 0x100 - code points, from 0 to 0xFF. One code point is represented with exactly one - 1-byte code unit, which has the same value as the code point. Size of - ``YYCTYPE`` must be 1 byte. - -EBCDIC - is a fixed-length encoding. Its code space includes 0x100 - code points, from 0 to 0xFF. One code point is represented with exactly - one 1-byte code unit, which has the same value as the code point. Size - of ``YYCTYPE`` must be 1 byte. - -UCS-2 - is a fixed-length encoding. Its code space includes 0x10000 - code points, from 0 to 0xFFFF. One code point is represented with - exactly one 2-byte code unit, which has the same value as the code - point. Size of ``YYCTYPE`` must be 2 bytes. - -UTF-16 - is a variable-length encoding. Its code space includes all - Unicode code points, from 0 to 0xD7FF and from 0xE000 to 0x10FFFF. One - code point is represented with one or two 2-byte code units. Size of - ``YYCTYPE`` must be 2 bytes. - -UTF-32 - is a fixed-length encoding. Its code space includes all - Unicode code points, from 0 to 0xD7FF and from 0xE000 to 0x10FFFF. One - code point is represented with exactly one 4-byte code unit. Size of - ``YYCTYPE`` must be 4 bytes. - -UTF-8 - is a variable-length encoding. Its code space includes all - Unicode code points, from 0 to 0xD7FF and from 0xE000 to 0x10FFFF. One - code point is represented with sequence of one, two, three or four - 1-byte code units. Size of ``YYCTYPE`` must be 1 byte. - -In Unicode, values from range 0xD800 to 0xDFFF (surrogates) are not -valid Unicode code points, any encoded sequence of code units, that -would map to Unicode code points in the range 0xD800-0xDFFF, is -ill-formed. The user can control how ``re2c`` treats such ill-formed -sequences with ``--encoding-policy `` flag (see ``OPTIONS`` -for full explanation). - -For some encodings, there are code units, that never occur in valid -encoded stream (e.g. 0xFF byte in UTF-8). If the generated scanner must -check for invalid input, the only true way to do so is to use default -rule ``*``. Note, that full range rule ``[^]`` won't catch invalid code units when variable-length encoding is used -(``[^]`` means "all valid code points", while default rule ``*`` means "all possible code units"). - - - -GENERIC INPUT API ------------------ +.. include:: @top_srcdir@/doc/manual/features/encodings/encodings.rst_ -``re2c`` usually operates on input using pointer-like primitives -``YYCURSOR``, ``YYMARKER``, ``YYCTXMARKER`` and ``YYLIMIT``. -Generic input API (enabled with ``--input custom`` switch) allows one to -customize input operations. In this mode, ``re2c`` will express all -operations on input in terms of the following primitives: - - +---------------------+-----------------------------------------------------+ - | ``YYPEEK ()`` | get current input character | - +---------------------+-----------------------------------------------------+ - | ``YYSKIP ()`` | advance to the next character | - +---------------------+-----------------------------------------------------+ - | ``YYBACKUP ()`` | backup current input position | - +---------------------+-----------------------------------------------------+ - | ``YYBACKUPCTX ()`` | backup current input position for trailing context | - +---------------------+-----------------------------------------------------+ - | ``YYRESTORE ()`` | restore current input position | - +---------------------+-----------------------------------------------------+ - | ``YYRESTORECTX ()`` | restore current input position for trailing context | - +---------------------+-----------------------------------------------------+ - | ``YYLESSTHAN (n)`` | check if less than ``n`` input characters are left | - +---------------------+-----------------------------------------------------+ - -A couple of useful links that provide some examples: - -1. http://skvadrik.github.io/aleph_null/posts/re2c/2015-01-13-input_model.html -2. http://skvadrik.github.io/aleph_null/posts/re2c/2015-01-15-input_model_custom.html +GENERIC API +----------- +.. include:: @top_srcdir@/doc/manual/features/generic_api/generic_api.rst_ SEE ALSO -------- -You can find more information about ``re2c`` on the website: http://re2c.org. +You can find more information about ``re2c`` at: http://re2c.org. See also: flex(1), lex(1), quex (http://quex.sourceforge.net). - AUTHORS ------- -Peter Bumbulis peter@csg.uwaterloo.ca - -Brian Young bayoung@acm.org - -Dan Nuffer nuffer@users.sourceforge.net - -Marcus Boerger helly@users.sourceforge.net - -Hartmut Kaiser hkaiser@users.sourceforge.net - -Emmanuel Mogenet mgix@mgix.com - -Ulya Trofimovich skvadrik@gmail.com +Originaly written by Peter Bumbulis in 1993; +developed and maintained by Brain Young, Marcus Boerger, Dan Nuffer and Ulya Trofimovich. +Below is a (more or less) full list of contributors retrieved from the Git history and mailing lists: +.. include:: @top_srcdir@/doc/manual/contributors.rst_ VERSION INFORMATION @@ -1023,4 +124,3 @@ VERSION INFORMATION This manpage describes ``re2c`` version @PACKAGE_VERSION@, package date @PACKAGE_DATE@. - diff --git a/doc/manual/contributors.rst_ b/doc/manual/contributors.rst_ new file mode 100644 index 0000000..541be10 --- /dev/null +++ b/doc/manual/contributors.rst_ @@ -0,0 +1,34 @@ +Abs62, +asmwarrior, +Ben Smith, +Brian Young, +CRCinAU, +Dan Nuffer, +Derick Rethans, +Dimitri John Ledkov, +Eldar Zakirov, +Emmanuel Mogenet, +Hartmut Kaiser, +jcfp, +Jean-Claude Wippler, +Jeff Trull, +Jérôme Dumesnil, +Jesse Buesking, +joscherl, +Julian Andres Klode, +Marcus Boerger, +Mike Gilbert, +nuno-lopes, +Oleksii Taran, +paulmcq, +Paulo Custodio, +Perry E. Metzger, +philippschaefer, +Ross Burton, +Rui Maciel, +Ryan Mast, +Samuel006, +Sergei Trofimovich, +sirzooro, +Tim Kelly, +Ulya Trofimovich diff --git a/doc/manual/features/conditions/conditions.rst_ b/doc/manual/features/conditions/conditions.rst_ new file mode 100644 index 0000000..3edfcdd --- /dev/null +++ b/doc/manual/features/conditions/conditions.rst_ @@ -0,0 +1,52 @@ +*Conditions* are enabled with ``-c`` ``--conditions``. +This option allows to encode multiple interrelated lexers within the same re2c block. + +Each lexer corresponds to a single *condition*. +It starts with a label of the form ``yyc_name``, +where ``name`` is *condition* name +and ``yyc`` prefix can be adjusted with configuration ``re2c:condprefix``. +Different lexers are separated with a comment ``/* *********************************** */`` +which can be adjusted with configuration ``re2c:cond:divider``. + +Furthermore, each *condition* has a unique identifier of the form ``yycname``, +where ``name`` is condition name +and ``yyc`` prefix can be adjusted with configuration ``re2c:condenumprefix``. +Identifiers have the type ``YYCONDTYPE`` and should be generated with ``/*!types:re2c*/`` directive or ``-t`` ``--type-header`` option. +Users shouldn't define these identifiers manually, as the order of *conditions* is not specified. + +Before all *conditions* re2c generates entry code that checks the current *condition* identifier +and transfers control flow to the start label of the active *condition*. +After matching some rule of this *condition*, +lexer may either transfer control flow back to the entry code (after executing the associated action and optionally setting another *condition* with ``=>``), +or use ``:=>`` shortcut and transition directly to the start label of another *condition* (skipping the action and the entry code). +Configuration ``re2c:cond:goto`` allows to change the default behavior. + +Syntactically each rule must be preceded with a list of comma-separated *condition* names or a wildcard ``*`` +enclosed in angle brackets ``<`` and ``>``. +Wildcard means "any condition" and is semantically equivalent to listing all condition names. +Here ``regexp`` is a regular expression, ``default`` refers to the *default rule* ``*``, +and ``action`` is a block of C/C++ code. + +* `` regexp-or-default action`` + +* `` regexp-or-default => condition action`` + +* `` regexp-or-default :=> condition`` + +Rules with an exclamation mark ``!`` in front of condition list have a special meaning: +they have no regular expression, +and the associated action is merged as an entry code to actions of normal rules. +This might be a convenient place to peform a routine task that is common to all rules. + +* `` action`` + +Another special form of rules with an empty condition list ``<>`` and no regular expression +allows to specify an "entry condition" that can be used to execute code before entering the lexer. +It is semantically equivalent to a condition with number zero, name ``0`` and an empty regular expression. + +* ``<> action`` + +* ``<> => condition action`` + +* ``<> :=> condition`` + diff --git a/doc/manual/features/encodings/encodings.rst_ b/doc/manual/features/encodings/encodings.rst_ new file mode 100644 index 0000000..5a66f94 --- /dev/null +++ b/doc/manual/features/encodings/encodings.rst_ @@ -0,0 +1,56 @@ +``re2c`` supports the following encodings: ASCII (default), EBCDIC (``-e``), +UCS-2 (``-w``), UTF-16 (``-x``), UTF-32 (``-u``) and UTF-8 (``-8``). +See also inplace configuration ``re2c:flags``. + +The following concepts should be clarified when talking about encodings. +A *code point* is an abstract number that represents a single symbol. +A *code unit* is the smallest unit of memory, which is used in the +encoded text (it corresponds to one character in the input stream). One +or more code units may be needed to represent a single code point, +depending on the encoding. In a *fixed-length* encoding, each code point +is represented with an equal number of code units. In *variable-length* +encodings, different code points can be represented with different number +of code units. + +* ASCII is a fixed-length encoding. Its code space includes 0x100 + code points, from 0 to 0xFF. A code point is represented with exactly one + 1-byte code unit, which has the same value as the code point. The size of + ``YYCTYPE`` must be 1 byte. + +* EBCDIC is a fixed-length encoding. Its code space includes 0x100 + code points, from 0 to 0xFF. A code point is represented with exactly + one 1-byte code unit, which has the same value as the code point. The size + of ``YYCTYPE`` must be 1 byte. + +* UCS-2 is a fixed-length encoding. Its code space includes 0x10000 + code points, from 0 to 0xFFFF. One code point is represented with + exactly one 2-byte code unit, which has the same value as the code + point. The size of ``YYCTYPE`` must be 2 bytes. + +* UTF-16 is a variable-length encoding. Its code space includes all + Unicode code points, from 0 to 0xD7FF and from 0xE000 to 0x10FFFF. One + code point is represented with one or two 2-byte code units. The size of + ``YYCTYPE`` must be 2 bytes. + +* UTF-32 is a fixed-length encoding. Its code space includes all + Unicode code points, from 0 to 0xD7FF and from 0xE000 to 0x10FFFF. One + code point is represented with exactly one 4-byte code unit. The size of + ``YYCTYPE`` must be 4 bytes. + +* UTF-8 is a variable-length encoding. Its code space includes all + Unicode code points, from 0 to 0xD7FF and from 0xE000 to 0x10FFFF. One + code point is represented with a sequence of one, two, three, or four + 1-byte code units. The size of ``YYCTYPE`` must be 1 byte. + +In Unicode, values from range 0xD800 to 0xDFFF (surrogates) are not +valid Unicode code points. Any encoded sequence of code units that +would map to Unicode code points in the range 0xD800-0xDFFF, is +ill-formed. The user can control how ``re2c`` treats such ill-formed +sequences with the ``--encoding-policy `` switch. + +For some encodings, there are code units that never occur in a valid +encoded stream (e.g., 0xFF byte in UTF-8). If the generated scanner must +check for invalid input, the only correct way to do so is to use the default +rule (``*``). Note that the full range rule (``[^]``) won't catch invalid code units when a variable-length encoding is used +(``[^]`` means "any valid code point", whereas the default rule (``*``) means "any possible code unit"). + diff --git a/doc/manual/features/generic_api/generic_api.rst_ b/doc/manual/features/generic_api/generic_api.rst_ new file mode 100644 index 0000000..d239a8b --- /dev/null +++ b/doc/manual/features/generic_api/generic_api.rst_ @@ -0,0 +1,54 @@ + +By default ``re2c`` operates on input using pointer-like primitives +``YYCURSOR``, ``YYMARKER``, ``YYCTXMARKER``, and ``YYLIMIT``. +Normally pointer-like primitives are defined as variables of type ``YYCTYPE*``, +but it is possible to use STL iterators or any other abstraction as long as it syntactically fits into the following use cases: + +* ``++YYCURSOR;`` +* ``yych = *YYCURSOR;`` +* ``yych = *++YYCURSOR;`` +* ``yych = *(YYMARKER = YYCURSOR);`` +* ``yych = *(YYMARKER = ++YCURSOR);`` +* ``YYMARKER = YYCURSOR;`` +* ``YYMARKER = ++YYCURSOR;`` +* ``YYCURSOR = YYMARKER;`` +* ``YYCTXMARKER = YYCURSOR + 1;`` +* ``YYCURSOR = YYCTXMARKER;`` +* ``if (YYLIMIT <= YYCURSOR) ...`` +* ``if ((YYLIMIT - YYCURSOR) < n) ...`` +* ``YYDEBUG (label, *YYCURSOR);`` + + +If this input model is too restrictive, then it is possible to use generic input API enabled with ``--input custom`` option. +In this mode all input operations are expressed in terms of the primitives below. +These primitives can be defined in any suitable way; one doesn't have to stick to the pointer semantics. +For example, it is possible to read input directly from file without any buffering, +or to disable ``YYFILL`` mechanism and perform end-of-input checking on each input character from inside of ``YYPEEK`` or ``YYSKIP``. + +* ``YYPEEK ()`` +* ``YYSKIP ()`` +* ``YYBACKUP ()`` +* ``YYBACKUPCTX ()`` +* ``YYSTAGP (t)`` +* ``YYSTAGN (t)`` +* ``YYMTAGP (t)`` +* ``YYMTAGN (t)`` +* ``YYRESTORE ()`` +* ``YYRESTORECTX ()`` +* ``YYRESTORETAG (t)`` +* ``YYLESSTHAN (n)`` + +Default input model can be expressed in terms of generic API as follows +(except for ``YMTAGP`` and ``YYMTAGN``, which have no default implementation): + +* ``#define YYPEEK () *YYCURSOR`` +* ``#define YYSKIP () ++YYCURSOR`` +* ``#define YYBACKUP () YYMARKER = YYCURSOR`` +* ``#define YYBACKUPCTX () YYCTXMARKER = YYCURSOR`` +* ``#define YYRESTORE () YYCURSOR = YYMARKER`` +* ``#define YYRESTORECTX () YYCURSOR = YYCTXMARKER`` +* ``#define YYRESTORERAG (t) YYCURSOR = t`` +* ``#define YYLESSTHAN (n) YYLIMIT - YYCURSOR < n`` +* ``#define YYSTAGP (t) t = YYCURSOR`` +* ``#define YYSTAGN (t) t = NULL`` + diff --git a/doc/manual/features/state/state.rst_ b/doc/manual/features/state/state.rst_ new file mode 100644 index 0000000..880fa00 --- /dev/null +++ b/doc/manual/features/state/state.rst_ @@ -0,0 +1,28 @@ +With ``-f`` ``--storable-state`` option re2c generates a lexer that can +store its current state, return to the caller, and later resume operations exactly where it left off. +The default mode of operation in re2c is a "pull" model, where the lexer "pulls" more input whenever it needs it. +However, this mode of operation assumes that the lexer is the owner of the parsing loop, and that may not always be convenient. + +Storable state is useful exactly for situations like that: it allows to construct +lexers that work in a "push" model, where data is fed to the lexer chunk by chunk. +When the lexer needs more input, it stores its state and returns to the caller. +Later, when more input becomes available, it resumes operations exactly where it stopped. + +Changes needed compared to the "pull" model: + +* Define ``YYSETSTATE ()`` and ``YYGETSTATE (state)``. + +* Define ``yych``, ``yyaccept`` and ``state`` variables as a part of persistent lexer state. + ``state`` should be initialized to ``-1``. + +* ``YYFILL`` should return to the outer program instead of trying to supply more input. + Return code should indicate that lexer needs more input. + +* The outer program should recognize situations when lexer needs more input + and respond appropriately. + +* Use ``/*!getstate:re2c*/`` directive if it is necessary to execute any code + before entering the lexer. + +* Use configurations ``state:abort`` and ``state:nextlabel`` to tweak the generated code. + diff --git a/doc/manual/features/submatch/submatch.rst_ b/doc/manual/features/submatch/submatch.rst_ new file mode 100644 index 0000000..6995ebc --- /dev/null +++ b/doc/manual/features/submatch/submatch.rst_ @@ -0,0 +1,68 @@ +``re2c`` supports two kinds of submatch extraction. + + +The first option is ``-P --posix-captures``: it enables POSIX-compliant capturing groups. +In this mode parentheses in regular expressions denote the beginning and the end of capturing groups; +the whole regular expression is group number zero. +The number of groups for the matching rule is stored in a variable ``yynmatch``, +and submatch results are stored in ``yypmatch`` array. +Both ``yynmatch`` and ``yypmatch`` should be defined by the user; +note that ``yypmatch`` size must be at least ``[yynmatch * 2]``. +``re2c`` provides a directive ``/*!maxnmatch:re2c*/`` that defines a constant ``YYMAXNMATCH``: the maximal value of ``yynmatch`` among all rules. +Note that ``re2c`` implements POSIX-compliant disambiguation: +each subexpression matches as long as possible, +and subexpressions that start earlier in regular expression have priority over those starting later. + + +Second option is ``-T --tags``. +With this option one can use standalone tags of the form ``@stag`` and ``#mtag`` instead of capturing parentheses, +where ``stag`` and ``mtag`` are arbitrary used-defined names. +Tags can be used anywhere inside of a regular expression; semantically they are just position markers. +Tags of the form ``@stag`` are called *s-tags*: they denote a single submatch value (the last input position where this tag matched). +Tags of the form ``#mtag`` are called *m-tags*: they denote multiple submatch values (the whole history of repetitions of this tag). +All tags should be defined by the user as variables with the corresponding names. +With standalone tags ``re2c`` uses leftmost greedy disambiguation: +submatch positions correspond to the leftmost matching path through the regular expression. + + +With both ``--posix-captures`` and ``--tags`` options ``re2c`` generates a number of tag variables +that are used by the lexer to track multiple possible versions of each tag +(multiple versions are caused by possible ambiguity of submatch). +When a rule matches, ambiguity is resolved and all tags of this rule (or capturing parentheses, which are also implemented as tags) +are initialized with the values of appropriate tag variables. +Note that there is no one-to-one correspondence between tag variables and tags: +the same tag variable may be reused for different tags, and one tag may require multiple tag variables to hold all its ambiguous versions. +The exact number of tag variables is unknown to the user; this number is determined by ``re2c``. +However, tag variables should be defined by the user, because it might be necessary to update them in ``YYFILL`` +and store them between invocations of lexer with ``--storable-state`` option. +Therefore ``re2c`` provides directives ``/*!stags:re2c ... */`` and ``/*!mtags:re2c ... */`` +that can be used to declare, initialize and manipulate tag variables. + +*S-tags* must support the following operations: + +* save input position to *s-tag*: + ``t = YYCURSOR`` with default API, or user-defined operation ``YYSTAGP (t)`` with generic API +* save default value to *s-tag*: + ``t = NULL`` with default API, or user-defined operation ``YYSTAGN (t)`` with generic API +* copy one *s-tag* to another: + ``t1 = t2`` + +*M-tags* must support the following operations: + +* append input position to *m-tag*: + user-defined operation ``YYMTAGP (t)`` with both default and generic API +* append default value to *m-tag*: + user-defined operation ``YYMTAGN (t)`` with both default and generic API +* copy one *m-tag* to another: + ``t1 = t2`` + +*S-tags* can be implemented as scalar values (pointers or offsets). +*M-tags* need a more complex representation, as they need to store a sequence of tag values. +The most naive and inefficient representation of *m-tag* is a list (array, vector) of tag values; +a more efficient representation is to store all *m-tags* in a prefix-tree +represented as array of nodes ``(v, p)``, where ``v`` is tag value and ``p`` is a pointer to parent node. + + +For further details see ``http://re2c.org/examples/examples.html`` page on the website +or ``re2c/examples/`` subdirectory of ``re2c`` distribution. + diff --git a/doc/manual/options/options_list.rst b/doc/manual/options/options_list.rst new file mode 100644 index 0000000..1ecebb5 --- /dev/null +++ b/doc/manual/options/options_list.rst @@ -0,0 +1,171 @@ +``-? -h --help`` + Show help message. + +``-b --bit-vectors`` + Optimize conditional jumps using bit masks. Implies ``-s``. + +``-c --conditions`` + Enable support of Flex-like "conditions": multiple interrelated lexers within one block. + +``-d --debug-output`` + Emit ``YYDEBUG`` in the generated code. + ``YYDEBUG`` should be defined by the user in the form of a void function with two parameters: + ``state`` (lexer state or -1) and ``symbol`` (current input symbol of type ``YYCTYPE``). + +``-D --emit-dot`` + Instead of normal output generate lexer graph in DOT format. + The output can be converted to PNG with the help of Graphviz (something like ``dot -Tpng -odfa.png dfa.dot``). + Note that large graphs may crash Graphviz. + +``-e --ecb`` + Generate a lexer that reads input in EBCDIC encoding. + ``re2c`` assumes that character range is 0 -- 0xFF an character size is 1 byte. + +``-f --storable-state`` + Generate a lexer which can store its inner state. + This is useful in push-model lexers which are stopped by an outer program when there is not enough input, + and then resumed when more input becomes available. + In this mode users should additionally define + ``YYGETSTATE ()`` and ``YYSETSTATE (state)`` macros + and variables ``yych``, ``yyaccept`` and the ``state`` as part of the lexer state. + +``-F --flex-syntax`` + Partial support for Flex syntax: + in this mode named definitions don't need the equal sign and the terminating semicolon, + and when used they must be surrounded by curly braces. + Names without curly braces are treated as double-quoted strings. + +``-g --computed-gotos`` + Optimize conditional jumps using non-standard "computed goto" extension (must be supported by C/C++ compiler). + ``re2c`` generates jump tables only in complex cases with a lot of conditional branches. + Complexity threshold can be configured with ``cgoto:threshold`` configuration. + This option implies ``-b``. + +``-i --no-debug-info`` + Do not output ``#line`` information. + This is useful when the generated code is tracked by some version control system. + +``-o OUTPUT --output=OUTPUT`` + Specify the ``OUTPUT`` file. + +``-r --reusable`` + Allows reuse of ``re2c`` rules with ``/*!rules:re2c */`` and ``/*!use:re2c */`` blocks. + In this mode simple ``/*!re2c */`` blocks are not allowed + and exactly one ``/*!rules:re2c */`` block must be present. + The rules are saved and used by every ``/*!use:re2c */`` block that follows (which may add rules of their own). + This option allows to reuse the same set of rules with different configurations. + +``-s --nested-ifs`` + Use nested ``if`` statements instead of ``switch`` statements in conditional jumps. + This usually results in more efficient code with non-optimizing C/C++ compilers. + +``-t HEADER --type-header=HEADER`` + Generate a ``HEADER`` file that contains enum with condition names. + Requires ``-c`` option. + +``-T --tags`` + Enable submatch extraction with tags. + +``-P --posix-captures`` + Enable submatch extraction with POSIX-style capturing groups. + +``-u --unicode`` + Generate a lexer that reads input in UTF-32 encoding. + ``re2c`` assumes that character range is 0 -- 0x10FFFF and character size is 4 bytes. + Implies ``-s``. + +``-v --version`` + Show version information. + +``-V --vernum`` + Show version information in ``MMmmpp`` format (major, minor, patch). + +``-w --wide-chars`` + Generate a lexer that reads input in UCS-2 encoding. + ``re2c`` assumes that character range is 0 -- 0xFFFF and character size is 2 bytes. + Implies ``-s``. + +``-x --utf-16`` + Generate a lexer that reads input in UTF-16 encoding. + ``re2c`` assumes that character range is 0 -- 0x10FFFF and character size is 2 bytes. + Implies ``-s``. + +``-8 --utf-8`` + Generate a lexer that reads input in UTF-8 encoding. + ``re2c`` assumes that character range is 0 -- 0x10FFFF and character size is 1 byte. + +``--case-insensitive`` + Treat single-quoted and double-quoted strings as case-insensitive. + +``--case-inverted`` + Invert the meaning of single-quoted and double-quoted strings: + treat single-quoted strings as case-sensitive and double-quoted strings as case-insensitive. + +``--no-generation-date`` + Suppress date output in the generated file. + +``--no-lookahead`` + Use TDFA(0) instead of TDFA(1). + This option only has effect with ``--tags`` or ``--posix-captures`` options. + +``--no-optimize-tags`` + Suppress optimization of tag variables (useful for debugging or benchmarking). + +``--no-version`` + Suppress version output in the generated file. + +``--encoding-policy POLICY`` + Define the way ``re2c`` treats Unicode surrogates. + ``POLICY`` can be one of the following: ``fail`` (abort with an error when a surrogate is encountered), + ``substitute`` (silently replace surrogates with the error code point 0xFFFD), + ``ignore`` (default, treat surrogates as normal code points). + The Unicode standard says that standalone surrogates are invalid, + but real-world libraries and programs behave in different ways. + +``--input INPUT`` + Specify ``re2c`` input API. ``INPUT`` can be either ``default`` or ``custom`` (enables the use of generic API). + +``-S --skeleton`` + Ignore user-defined interface code and generate a self-contained "skeleton" program. + Additionally, generate input files with strings derived from the regular grammar + and compressed match results that are used to verify "skeleton" behavior on all inputs. + This option is useful for finding bugs in optimizations and code generation. + +``--empty-class POLICY`` + Define the way ``re2c`` treats empty character classes. + ``POLICY`` can be one of the following: ``match-empty`` (match empty input: illogical, but default behavior for backwards compatibility reasons), + ``match-none`` (fail to match on any input), + ``error`` (compilation error). + +``--dfa-minimization ALGORITHM`` + The internal algorithm used by re2c to minimize the DFA. + ``ALGORITHM`` can be either ``moore`` (Moore algorithm, the default) or ``table`` (table filling algorithm). + Both algorithms should produce the same DFA up to states relabeling; + table filling is much slower and serves as a reference implementation. + +``--eager-skip`` + Make the generated lexer advance the input position "eagerly": + immediately after reading input symbol. + By default this happens after transition to the next state. + Implied by ``--no-lookahead``. + +``--dump-nfa`` + Generate representation of NFA in DOT format and dump it on stderr. + +``--dump-dfa-raw`` + Generate representation of DFA in DOT format under construction and dump it on stderr. + +``--dump-dfa-det`` + Generate representation of DFA in DOT format immediately after determinization and dump it on stderr. + +``--dump-dfa-tagopt`` + Generate representation of DFA in DOT format after tag optimizations and dump it on stderr. + +``--dump-dfa-min`` + Generate representation of DFA in DOT format after minimization and dump it on stderr. + +``--dump-adfa`` + Generate representation of DFA in DOT format after tunneling and dump it on stderr. + +``-1 --single-pass`` + Deprecated. Does nothing (single pass is the default now). diff --git a/doc/manual/syntax/configurations.rst_ b/doc/manual/syntax/configurations.rst_ new file mode 100644 index 0000000..bacf409 --- /dev/null +++ b/doc/manual/syntax/configurations.rst_ @@ -0,0 +1,308 @@ +``re2c:cgoto:threshold = 9;`` + With ``-g`` ``--computed-gotos`` option this value specifies + the complexity threshold that triggers the generation of jump tables rather + than nested ``if`` statements and bit masks. + +``re2c:cond:divider = '/* *********************************** */';`` + Allows to customize the divider for condition blocks. One can use ``@@`` to insert condition name. + +``re2c:cond:divider@cond = @@;`` + Specifies the placeholder that will be replaced with condition name in ``re2c:cond:divider``. + +``re2c:condenumprefix = yyc;`` + Specifies the prefix used for condition identifiers. + +``re2c:cond:goto@cond = @@;`` + Specifies the placeholder that will be replaced with condition label in ``re2c:cond:goto``. + +``re2c:cond:goto = 'goto @@;';`` + Allows to customize ``goto`` statements used with ``:=>`` style rules. + One can use ``@@`` to insert the condition name. + +``re2c:condprefix = yyc;`` + Specifies the prefix used for condition labels. + +``re2c:define:YYBACKUPCTX = 'YYBACKUPCTX';`` + Replaces ``YYBACKUPCTX`` identifier with the specified string. + +``re2c:define:YYBACKUP = 'YYBACKUP';`` + Replaces ``YYBACKUP`` identifier with the specified string. + +``re2c:define:YYCONDTYPE = 'YYCONDTYPE';`` + Enumeration type used for condition identifiers. + +``re2c:define:YYCTXMARKER = 'YYCTXMARKER';`` + Replaces the ``YYCTXMARKER`` placeholder with the specified identifier. + +``re2c:define:YYCTYPE = 'YYCTYPE';`` + Replaces the ``YYCTYPE`` placeholder with the specified type. + +``re2c:define:YYCURSOR = 'YYCURSOR';`` + Replaces the ``YYCURSOR`` placeholder with the specified identifier. + +``re2c:define:YYDEBUG = 'YYDEBUG';`` + Replaces the ``YYDEBUG`` placeholder with the specified identifier. + +``re2c:define:YYFILL@len = '@@';`` + Any occurrence of this text inside of a ``YYFILL`` will be replaced with the actual argument. + +``re2c:define:YYFILL:naked = 0;`` + Controls the argument in the parentheses after ``YYFILL`` and the following semicolon. + If zero, both the argument and the semicolon are omitted. + If non-zero, the argument is generated unless ``re2c:yyfill:parameter`` is set to zero; + the semicolon is generated unconditionally. + +``re2c:define:YYFILL = 'YYFILL';`` + Define a substitution for ``YYFILL``. + By default re2c generates an argument in parentheses and a semicolon after ``YYFILL``. + If you need to make ``YYFILL`` an arbitrary statement rather than a call, + set ``re2c:define:YYFILL:naked`` to a non-zero value. + +``re2c:define:YYGETCONDITION:naked = 0;`` + Controls the parentheses after ``YYGETCONDITION``. + If zero, the parentheses are omitted. If non-zero, the parentheses are generated. + +``re2c:define:YYGETCONDITION = 'YYGETCONDITION';`` + Substitution for ``YYGETCONDITION``. + By default re2c generates parentheses after ``YYGETCONDITION``. + Set ``re2c:define:YYGETCONDITION:naked`` to non-zero in order to omit the parentheses. + +``re2c:define:YYGETSTATE:naked = 0;`` + Controls the parentheses that follow ``YYGETSTATE``. + If zero, the parentheses are omitted. If non-zero, they are generated. + +``re2c:define:YYGETSTATE = 'YYGETSTATE';`` + Substitution for ``YYGETSTATE``. + By default re2c generates parentheses after ``YYGETSTATE``. + Set ``re2c:define:YYGETSTATE:naked`` to non-zero to omit the parentheses. + +``re2c:define:YYLESSTHAN = 'YYLESSTHAN';`` + Replaces ``YYLESSTHAN`` identifier with the specified string. + +``re2c:define:YYLIMIT = 'YYLIMIT';`` + Replaces the ``YYLIMIT`` placeholder with the specified identifier. + +``re2c:define:YYMARKER = 'YYMARKER';`` + Replaces the ``YYMARKER`` placeholder with the specified identifier. + +``re2c:define:YYMTAGN = 'YYMTAGN';`` + Replaces ``YYMTAGN`` identifier with the specified string. + +``re2c:define:YYMTAGP = 'YYMTAGP';`` + Replaces ``YYMTAGP`` identifier with the specified string. + +``re2c:define:YYPEEK = 'YYPEEK';`` + Replaces ``YYPEEK`` identifier with the specified string. + +``re2c:define:YYRESTORECTX = 'YYRESTORECTX';`` + Replaces ``YYRESTORECTX`` identifier with the specified string. + +``re2c:define:YYRESTORE = 'YYRESTORE';`` + Replaces ``YYRESTORE`` identifier with the specified string. + +``re2c:define:YYRESTORETAG = 'YYRESTORETAG';`` + Replaces ``YYRESTORETAG`` identifier with the specified string. + +``re2c:define:YYSETCONDITION@cond = '@@';`` + Any occurrence of this + text inside of ``YYSETCONDITION`` will be replaced with the actual argument. + +``re2c:define:YYSETCONDITION:naked = 0;`` + Controls the argument in parentheses + and the semicolon after ``YYSETCONDITION``. If zero, both the argument and + the semicolon are omitted. If non-zero, both the argument and the semicolon are + generated. + +``re2c:define:YYSETCONDITION = 'YYSETCONDITION';`` + Substitution for + ``YYSETCONDITION``. By default re2c generates an argument in + parentheses followed by semicolon after ``YYSETCONDITION``. If you need to make + ``YYSETCONDITION`` an arbitrary statement rather than a call, set + ``re2c:define:YYSETCONDITION:naked`` to non-zero. + +``re2c:define:YYSETSTATE:naked = 0;`` + Controls the argument in parentheses and the + semicolon after ``YYSETSTATE``. If zero, both argument and the semicolon are + omitted. If non-zero, both the argument and the semicolon are generated. + +``re2c:define:YYSETSTATE@state = '@@';`` + Any occurrence of this text + inside of ``YYSETSTATE`` will be replaced with the actual argument. + +``re2c:define:YYSETSTATE = 'YYSETSTATE';`` + Substitution for + ``YYSETSTATE``. By default re2c generates an argument in parentheses + followed by a semicolon after ``YYSETSTATE``. If you need to make ``YYSETSTATE`` an + arbitrary statement rather than a call, set + ``re2c:define:YYSETSTATE:naked`` to non-zero. + +``re2c:define:YYSKIP = 'YYSKIP';`` + Replaces ``YYSKIP`` identifier with the specified string. + +``re2c:define:YYSTAGN = 'YYSTAGN';`` + Replaces ``YYSTAGN`` identifier with the specified string. + +``re2c:define:YYSTAGP = 'YYSTAGP';`` + Replaces ``YYSTAGP`` identifier with the specified string. + +``re2c:flags:8`` or ``re2c:flags:utf-8`` + Same as ``-8 --utf-8`` command-line option. + +``re2c:flags:b`` or ``re2c:flags:bit-vectors`` + Same as ``-b --bit-vectors`` command-line option. + +``re2c:flags:case-insensitive = 0;`` + Same as ``--case-insensitive`` command-line option. + +``re2c:flags:case-inverted = 0;`` + Same as ``--case-inverted`` command-line option. + +``re2c:flags:d`` or ``re2c:flags:debug-output`` + Same as ``-d --debug-output`` command-line option. + +``re2c:flags:dfa-minimization = 'moore';`` + Same as ``--dfa-minimization`` command-line option. + +``re2c:flags:eager-skip = 0;`` + Same as ``--eager-skip`` command-line option. + +``re2c:flags:e`` or ``re2c:flags:ecb`` + Same as ``-e --ecb`` command-line option. + +``re2c:flags:empty-class = 'match-empty';`` + Same as ``--empty-class`` command-line option. + +``re2c:flags:encoding-policy = 'ignore';`` + Same as ``--encoding-policy`` command-line option. + +``re2c:flags:g`` or ``re2c:flags:computed-gotos`` + Same as ``-g --computed-gotos`` command-line option. + +``re2c:flags:i`` or ``re2c:flags:no-debug-info`` + Same as ``-i --no-debug-info`` command-line option. + +``re2c:flags:input = 'default';`` + Same as ``--input`` command-line option. + +``re2c:flags:lookahead = 1;`` + Same as inverted ``--no-lookahead`` command-line option. + +``re2c:flags:optimize-tags = 1;`` + Same as inverted ``--no-optimize-tags`` command-line option. + +``re2c:flags:P`` or ``re2c:flags:posix-captures`` + Same as ``-P --posix-captures`` command-line option. + +``re2c:flags:s`` or ``re2c:flags:nested-ifs`` + Same as ``-s --nested-ifs`` command-line option. + +``re2c:flags:T`` or ``re2c:flags:tags`` + Same as ``-T --tags`` command-line option. + +``re2c:flags:u`` or ``re2c:flags:unicode`` + Same as ``-u --unicode`` command-line option. + +``re2c:flags:w`` or ``re2c:flags:wide-chars`` + Same as ``-w --wide-chars`` command-line option. + +``re2c:flags:x`` or ``re2c:flags:utf-16`` + Same as ``-x --utf-16`` command-line option. + +``re2c:indent:string = '\t';`` + Specifies the string to use for indentation. Requires a string that contains + only whitespace (unless you need something else for external tools). The easiest + way to specify spaces is to enclose them in single or double quotes. + If you do not want any indentation at all, you can set this to ''. + +``re2c:indent:top = 0;`` + Specifies the minimum amount of indentation to + use. Requires a numeric value greater than or equal to zero. + +``re2c:labelprefix = 'yy';`` + Allows to change the prefix of numbered + labels. The default is ``yy``. Can be set any string that is valid in + a label name. + +``re2c:label:yyFillLabel = 'yyFillLabel';`` + Overrides the name of the ``yyFillLabel`` label. + +``re2c:label:yyNext = 'yyNext';`` + Overrides the name of the ``yyNext`` label. + +``re2c:startlabel = 0;`` + If set to a non zero integer, then the start + label of the next scanner block will be generated even if it isn't used by + the scanner itself. Otherwise, the normal ``yy0``-like start label is only + generated if needed. If set to a text value, then a label with that + text will be generated regardless of whether the normal start label is + used or not. This setting is reset to 0 after a start label has been generated. + +``re2c:state:abort = 0;`` + When not zero and the ``-f`` ``--storable-state`` switch is active, then + the ``YYGETSTATE`` block will contain a default case that aborts and a -1 + case will be used for initialization. + +``re2c:state:nextlabel = 0;`` + Used when ``-f`` ``--storable-state`` is active to control + whether the ``YYGETSTATE`` block is followed by a ``yyNext:`` label line. + Instead of using ``yyNext``, you can usually also use configuration + ``startlabel`` to force a specific start label or default to ``yy0`` as + a start label. Instead of using a dedicated label, it is often better to + separate the ``YYGETSTATE`` code from the actual scanner code by placing a + ``/*!getstate:re2c*/`` comment. + +``re2c:tags:expression = '@@';`` + Allows to customize the way re2c addresses tag variables: + by default it emits expressions of the form ``yyt``, + but this might be inconvenient if tag variables are defined as fields in a struct, + or for any other reason require special accessors. + For example, setting ``re2c:tags:expression = p->@@`` will result in ``p->yyt``. + +``re2c:tags:prefix = 'yyt';`` + Allows to override prefix of tag variables. + +``re2c:variable:yyaccept = yyaccept;`` + Overrides the name of the ``yyaccept`` variable. + +``re2c:variable:yybm = 'yybm';`` + Overrides the name of the ``yybm`` variable. + +``re2c:variable:yych = 'yych';`` + Overrides the name of the ``yych`` variable. + +``re2c:variable:yyctable = 'yyctable';`` + When both ``-c`` ``--conditions`` and ``-g`` ``--computed-gotos`` are active, + re2c will use this variable to generate a static jump table + for ``YYGETCONDITION``. + +``re2c:variable:yystable = 'yystable';`` + Deprecated. + +``re2c:variable:yytarget = 'yytarget';`` + Overrides the name of the ``yytarget`` variable. + +``re2c:yybm:hex = 0;`` + If set to zero, a decimal table will be used. Otherwise, a hexadecimal table will be generated. + +``re2c:yych:conversion = 0;`` + When this setting is non zero, re2c automatically generates + conversion code whenever yych gets read. In this case, the type must be + defined using ``re2c:define:YYCTYPE``. + +``re2c:yych:emit = 1;`` + Set this to zero to suppress the generation of *yych*. + +``re2c:yyfill:check = 1;`` + This can be set to 0 to suppress the generations of + ``YYCURSOR`` and ``YYLIMIT`` based precondition checks. This option is useful when + ``YYLIMIT + YYMAXFILL`` is always accessible. + +``re2c:yyfill:enable = 1;`` + Set this to zero to suppress the generation of ``YYFILL (n)``. When using this, be sure to verify that the generated + scanner does not read beyond the available input, as allowing such behavior might + introduce severe security issues to your programs. + +``re2c:yyfill:parameter = 1;`` + Controls the argument in the parentheses that follow ``YYFILL``. If zero, the argument is omitted. + If non-zero, the argument is generated unless ``re2c:define:YYFILL:naked`` is set to non-zero. + diff --git a/doc/manual/syntax/interface.rst_ b/doc/manual/syntax/interface.rst_ new file mode 100644 index 0000000..39c1236 --- /dev/null +++ b/doc/manual/syntax/interface.rst_ @@ -0,0 +1,119 @@ +Below is the list of all symbols which may be used by the lexer in order to interact with the outer world. +These symbols should be defined by the user, +either in the form of inplace configurations, +or as C/C++ variables, functions, macros and other language constructs. +Which primitives are necessary depends on the particular use case. + +``yyaccept`` + L-value of unsigned integral type that is used to hold the number of the last matched rule. + Explicit definition by the user is necessary only with ``-f`` ``--storable-state`` option. + +``YYBACKUP ()`` + Backup current input position (used only with ``--input custom`` option). + +``YYBACKUPCTX ()`` + Backup current input position for trailing context (used only with ``--input custom`` option). + +``yych`` + L-value of type ``YYCTYPE`` that is used to hold current input character. + Explicit definition by the user is necessary only with ``-f`` ``--storable-state`` option. + +``YYCONDTYPE`` + The type of *condition* identifiers (used only with ``-c`` ``--conditions`` option). + Should be generated either with ``/*!types:re2c*/`` directive, or with ``-t`` ``--type-header`` option. + +``YYCTXMARKER`` + L-value of type ``YYCTYPE *`` that is used to backup input position of trailing context. + It is needed only if regular expressions use the lookahead operator ``/``. + +``YYCTYPE`` + The type of the input characters (*code units*). + Usually it should be ``unsigned char`` for ASCII, EBCDIC and UTF-8 encodings, + ``unsigned short`` for UTF-16 or UCS-2 encodings, + and ``unsigned int`` for UTF-32 encoding. + +``YYCURSOR`` + L-value of type ``YYCTYPE *`` that is used as a pointer to the current input symbol. + Initially ``YYCURSOR`` points to the first character and is advanced by the lexer during matching. + When a rule matches, ``YYCURSOR`` points past the last character of the matched string. + +``YYDEBUG (state, symbol)`` + A function-like primitive that is used to dump debug information (only used with ``-d`` ``--debug-output`` option). + ``YYDEBUG`` should return no value and accept two arguments: + ``state`` (either lexer state or ``-1``) and ``symbol`` (current input symbol). + +``YYFILL (n)`` + A function-like primitive that is called by the lexer when there is not enough input. + ``YYFILL`` should return no value and supply at least ``n`` additional characters. + Maximal value of ``n`` equals ``YYMAXFILL``, which can be obtained with the ``/*!max:re2c*/`` directive. + +``YYGETCONDITION ()`` + R-value of type ``YYCONDTYPE`` that represents current *condition* identifier (used only with ``-c`` ``--conditions`` option). + +``YYGETSTATE ()`` + R-value of signed integral type that represents current lexer state (used only with ``-f`` ``--storable-state`` option). + Initial value of lexer state should be ``-1``. + +``YYLESSTHAN (n)`` + R-value of boolean type that is ``true`` if and only if there is less than ``n`` input characters left (used only with ``--input custom`` option). + +``YYLIMIT`` + R-value of type ``YYCTYPE *`` that marks the end of input (``YYLIMIT[-1]`` should be the last input character). + Lexer compares ``YYCURSOR`` and ``YYLIMIT`` in order to determine if there is enough input characters left. + +``YYMARKER`` + L-value of type ``YYCTYPE *`` used to backup input position of successful match. + This might be necessary if there is an overlapping longer rule that might also match. + +``YYMTAGP (t)`` + Append current input position to the history of *m-tag* ``t`` (used only with ``-T`` ``--tags`` option). + +``YYMTAGN (t)`` + Append default value to the history of *m-tag* ``t`` (used only with ``-T`` ``--tags`` option). + +``YYMAXFILL`` + Integral constant that denotes maximal value of ``YYFILL`` argument + and is autogenerated by ``/*!max:re2c*/`` directive. + +``YYMAXNMATCH`` + Integral constant that denotes maximal number of capturing groups in a rule + and is autogenerated by ``/*!maxnmatch:re2c*/`` directive (used only with ``--posix-captures`` option). + +``yynmatch`` + L-value of unsigned integral type that is used to hold the number of capturing groups in the matching rule. + Used only with ``-P`` ``--posix-captures`` option. + +``YYPEEK ()`` + R-value of type ``YYCTYPE`` that denotes current input character (used only with ``--input custom`` option). + +``yypmatch`` + An array of l-values that are used to hold the values of *s-tags* + corresponding to the capturing parentheses in the matching rule. + The length of array must be at least ``yynmatch * 2`` (ideally ``YYMAXNMATCH * 2``). + Used only with ``-P`` ``--posix-captures`` option. + +``YYRESTORE ()`` + Restore input position (used only with ``--input custom`` option). + +``YYRESTORECTX ()`` + Restore input position from the value of trailing context (used only with ``--input custom`` option). + +``YYRESTORETAG (t)`` + Restore input position from the value of *s-tag* ``t`` (used only with ``--input custom`` option). + +``YYSETCONDITION (condition)`` + Set current *condition* identifier to ``condition`` (used only with ``-c`` ``--conditions`` option). + +``YYSETSTATE (state)`` + Set current lexer state to ``state`` (used only with ``-f`` ``--storable-state`` option). + Parameter ``state`` is of signed integral type. + +``YYSKIP ()`` + Advance input position to the next character (used only with generic API). + +``YYSTAGP (t)`` + Save current input position to *s-tag* ``t`` (used only with ``-T`` ``--tags`` and ``--input custom`` option). + +``YYSTAGN (t)`` + Save default value to *s-tag* ``t`` (used only with ``-T`` ``--tags`` and ``--input custom`` options). + diff --git a/doc/manual/syntax/named_definitions.rst_ b/doc/manual/syntax/named_definitions.rst_ new file mode 100644 index 0000000..e92fef5 --- /dev/null +++ b/doc/manual/syntax/named_definitions.rst_ @@ -0,0 +1,6 @@ + +Named definitions are of the form ``name = regexp ;`` +where ``name`` is an identifier that consists of letters, digits and underscores, +and ``regexp`` is a regular expression. +With ``-F`` ``--flex-syntax`` option named definitions are also of the form ``name regexp``. +Each name should be defined before it is used. diff --git a/doc/manual/syntax/regular_expressions.rst_ b/doc/manual/syntax/regular_expressions.rst_ new file mode 100644 index 0000000..c455f41 --- /dev/null +++ b/doc/manual/syntax/regular_expressions.rst_ @@ -0,0 +1,44 @@ + +re2c uses the following syntax for regular expressions: + +* ``"foo"`` case-sensitive string literal + +* ``'foo'`` case-insensitive string literal + +* ``[a-xyz]``, ``[^a-xyz]`` character class (possibly negated) + +* ``.`` any character except newline + +* ``R \ S`` difference of character classes ``R`` and ``S`` + +* ``R*`` zero or more occurrences of ``R`` + +* ``R+`` one or more occurrences of ``R`` + +* ``R?`` optional ``R`` + +* ``R{n}`` repetition of ``R`` exactly ``n`` times + +* ``R{n,}`` repetition of ``R`` at least ``n`` times + +* ``R{n,m}`` repetition of ``R`` from ``n`` to ``m`` times + +* ``(R)`` just ``R``; parentheses are used to override precedence or for POSIX-style submatch + +* ``R S`` concatenation: ``R`` followed by ``S`` + +* ``R | S`` alternative: ``R or S`` + +* ``R / S`` loohakead: ``R`` followed by ``S``, but ``S`` is not consumed + +* ``name`` the regular expression defined as ``name`` (or literal string ``"name"`` in Flex compatibility mode) + +* ``{name}`` the regular expression defined as ``name`` in Flex compatibility mode + +* ``@stag`` an *s-tag*: saves the last input position at which ``@stag`` matches in a variable named ``stag`` + +* ``#mtag`` an *m-tag*: saves all input positions at which ``#mtag`` matches in a variable named ``mtag`` + +Character classes and string literals may contain the following escape sequences: +``\a``, ``\b``, ``\f``, ``\n``, ``\r``, ``\t``, ``\v``, ``\\``, octal escapes ``\ooo`` and hexadecimal escapes ``\xhh``, ``\uhhhh`` and ``\Uhhhhhhhh``. + diff --git a/doc/manual/syntax/rules.rst_ b/doc/manual/syntax/rules.rst_ new file mode 100644 index 0000000..772a6ac --- /dev/null +++ b/doc/manual/syntax/rules.rst_ @@ -0,0 +1,17 @@ + +Rules consist of a regular expression followed by a user-defined action: +a block of C/C++ code that is executed in case of sucessful match. +Action can be either an arbitrary block of code enclosed in curly braces ``{`` and ``}`` +or a block of code without curly braces preceded with ``:=`` and ended with a newline that is not followed by a whitespace. + +If multiple rules match, ``re2c`` prefers the longest match. +If rules match the same string, the earlier rule has priority. + +There is one special kind of rule: the *default rule* with ``*`` instead of the regular expression. +It always has the lowest priority, matches any *code unit* (either valid or invalid) and consumes exactly one *code unit*. +Note that *default rule* is not the same as ``[^]``, which +matches any valid *code point* and can consume multiple *code units*. +In case of variable-length encodings ``*`` is the only possible way to match invalid input character. + +If ``-c`` ``--conditions`` option is used, then rules have more complex form +described in the section about conditions. diff --git a/doc/manual/warnings/warnings_general.rst b/doc/manual/warnings/warnings_general.rst new file mode 100644 index 0000000..5797db2 --- /dev/null +++ b/doc/manual/warnings/warnings_general.rst @@ -0,0 +1,22 @@ + +``-W`` + Turn on all warnings. + +``-Werror`` + Turn warnings into errors. Note that this option alone + doesn't turn on any warnings; it only affects those warnings that have + been turned on so far or will be turned on later. + +``-W`` + Turn on ``warning``. + +``-Wno-`` + Turn off ``warning``. + +``-Werror-`` + Turn on ``warning`` and treat it as an error (this implies ``-W``). + +``-Wno-error-`` + Don't treat this particular ``warning`` as an error. This doesn't turn off + the warning itself. + diff --git a/doc/manual/warnings/warnings_list.rst b/doc/manual/warnings/warnings_list.rst new file mode 100644 index 0000000..ae381bf --- /dev/null +++ b/doc/manual/warnings/warnings_list.rst @@ -0,0 +1,40 @@ +``-Wcondition-order`` + Warn if the generated program makes implicit + assumptions about condition numbering. One should use either the ``-t, --type-header`` option or + the ``/*!types:re2c*/`` directive to generate a mapping of condition names to numbers and then use + the autogenerated condition names. + +``-Wempty-character-class`` + Warn if a regular expression contains an empty + character class. Trying to match an empty character class makes no sense: it should always fail. + However, for backwards compatibility reasons ``re2c`` allows empty character classes and + treats them as empty strings. Use the ``--empty-class`` option to change the default + behavior. + +``-Wmatch-empty-string`` + Warn if a rule is nullable (matches an empty string). + If the lexer runs in a loop and the empty match is unintentional, + the lexer may unexpectedly hang in an infinite loop. + +``-Wswapped-range`` + Warn if the lower bound of a range is greater than its upper + bound. The default behavior is to silently swap the range bounds. + +``-Wundefined-control-flow`` + Warn if some input strings cause undefined + control flow in the lexer (the faulty patterns are reported). This is the + most dangerous and most common mistake. It can be easily fixed by adding + the default rule ``*`` which has the lowest priority, matches any code unit, and consumes + exactly one code unit. + +``-Wunreachable-rules`` + Warn about rules that are shadowed by other rules and will never match. + +``-Wuseless-escape`` + Warn if a symbol is escaped when it shouldn't be. + By default, re2c silently ignores such escapes, but this may as well indicate a + typo or an error in the escape sequence. + +``-Wnondeterministic-tags`` + Warn if a tag has ``n``-th degree of nondeterminism, where ``n`` is greater than 1. + diff --git a/doc/tdfa/tdfa.pdf b/doc/tdfa/tdfa.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1622016c2625fc8bb64fbb9667f0752d5b9ffac3 GIT binary patch literal 836087 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⁢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 z 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

=O10>UmL@-@YCor$Be>xW?Y(zhMZp0U~%t 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Ū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

$R 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

lR-iBGF{}g|Vnx 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

S2=z~b7YsF7dfr$Zo(;df( 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

<<2>DslxL;}x7gWUb9;Re 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�H*+j^^uG)UU? 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

usw)_78? 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�NC;E)Rt* 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®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 z

    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 test.c - -Then use your compiler to compile that code and run it. If you are using gcc -you simply do the following: - - gcc -o test.o test.c - ./test.o - -If you are using windows you might want to read till the end of this lesson. - -When you want to debug the code it helps to make re2c generate working #line -information. To do so you simply specify the output file using the -o switch -followed by the output filename: - - re2c -o test.c calc_001.re - -The input files *.re each contain basic step by comments that explain what is -going on and what you can see in the examples. - -In order to optimize the generated code we will use the -s command line switch -of re2c. This tells re2c to generate code that uses if statements rather -then endless switch/case expressions where appropriate. Note that the file name -extension is actually '.s.re' to tell the test system to use the -s switch. To -invoke re2 you do the following: - - re2c -s -o test.c calc_006.s.re - -Finally we use the -b switch to have the code use a decision table. The -b -switch also contains the -s behavior. - - re2c -b -o test.c calc_007.b.re - - - -------------------------------------------------------------------------------- - -For windows users Lynn Allan provided some additional stuff to get you started -in the Microsoft world. This addon resides in the windows subdirectory and -gives you something to expereiment with. The code in that directory is based -on the first step and has the following changes: - -* vc6 .dsp/.dsw and vc7/vc8 .sln/.vcproj project files that have "Custom Build -Steps" that can tell when main.re changes, and know how to generate main.c -from main.re. They assume that you unpacked the zip package and have re2c -itself build or installed in Release and Release-2005 directory respectively. -If re2c cannot be found you need to modify the custom build step and correct -the path to re2c. - -* BuildAndRun.bat to do command line rec2 and then cl and then run the -executable (discontinues with message if errors). - -* built-in cppunit-like test to confirm it worked as expected. - -* array of test strings "fed" to scan rather than file contents to facilitate -testing and also reduce the newbie learning curve. - -* HiResTimer output for 10,000 loops and 100,000 loops. While this might be -excessive for this lesson, it illustrates how to do it for subsequent lessons -and your own stuff using windows. Also it shows that Release build is as fast -as strncmp for this test and can probably be made significantly faster. - -* If you want to build the other steps of this lesson using windows tools -simply copy the *.re files into the windows directory as main.re and rebuild. - - -------------------------------------------------------------------------------- -Sidenote: UPN is the german translation of RPN, somehow hardcoded into the -authors brain :-) diff --git a/examples/001_upn_calculator/calc_001.re b/examples/001_upn_calculator/calc_001.re deleted file mode 100644 index fe8d3ae..0000000 --- a/examples/001_upn_calculator/calc_001.re +++ /dev/null @@ -1,84 +0,0 @@ -/* re2c lesson 001_upn_calculator, calc_001, (c) M. Boerger 2006 - 2007 */ -/*!ignore:re2c - -- basic interface for string reading - - . We define the macros YYCTYPE, YYCURSOR, YYLIMIT, YYMARKER, YYFILL - . YYCTYPE is the type re2c operates on or in other words the type that - it generates code for. While it is not a big difference when we were - using 'unsigned char' here we would need to run re2c with option -w - to fully support types with sieof() > 1. - . YYCURSOR is used internally and holds the current scanner position. In - expression handlers, the code blocks after re2c expressions, this can be - used to identify the end of the token. - . YYMARKER is not always being used so we set an initial value to avoid - a compiler warning. Here we could also omit it compleley. - . YYLIMIT stores the end of the input. Unfortunatley we have to use strlen() - in this lesson. In the next example we see one way to get rid of it. - . We use a 'for(;;)'-loop around the scanner block. We could have used a - 'while(1)'-loop instead but some compilers generate a warning for it. - . To make the output more readable we use 're2c:indent:top' scanner - configuration that configures re2c to prepend a single tab (the default) - to the beginning of each output line. - . The following lines are expressions and for each expression we output the - token name and continue the scanner loop. - . The second last token detects the end of our input, the terminating zero in - our input string. In other scanners detecting the end of input may vary. - For example binary code may contain \0 as valid input. - . The last expression accepts any input character. It tells re2c to accept - the opposit of the empty range. This includes numbers and our tokens but - as re2c goes from top to botton when evaluating the expressions this is no - problem. - . The first three rules show that re2c actually prioritizes the expressions - from top to bottom. Octal number require a starting "0" and the actual - number. Normal numbers start with a digit greater 0. And zero is finally a - special case. A single "0" is detected by the last rule of this set. And - valid ocal number is already being detected by the first rule. This even - includes multi "0" sequences that in octal notation also means zero. - Another way would be to only use two rules: - "0" [0-9]+ - "0" | ( [1-9] [0-9]* ) - A full description of re2c rule syntax can be found in the manual. -*/ - -#include -#include -#include - -int scan(char *s, int l) -{ - char *p = s; - char *q = 0; -#define YYCTYPE char -#define YYCURSOR p -#define YYLIMIT (s+l) -#define YYMARKER q -#define YYFILL(n) - - for(;;) - { -/*!re2c - re2c:indent:top = 2; - "0"[0-9]+ { printf("Oct\n"); continue; } - [1-9][0-9]* { printf("Num\n"); continue; } - "0" { printf("Num\n"); continue; } - "+" { printf("+\n"); continue; } - "-" { printf("-\n"); continue; } - "\000" { printf("EOF\n"); return 0; } - [^] { printf("ERR\n"); return 1; } -*/ - } -} - -int main(int argc, char **argv) -{ - if (argc > 1) - { - return scan(argv[1], strlen(argv[1])); - } - else - { - fprintf(stderr, "%s \n", argv[0]); - return 1; - } -} diff --git a/examples/001_upn_calculator/calc_002.re b/examples/001_upn_calculator/calc_002.re deleted file mode 100644 index 417e9f3..0000000 --- a/examples/001_upn_calculator/calc_002.re +++ /dev/null @@ -1,69 +0,0 @@ -/* re2c lesson 001_upn_calculator, calc_002, (c) M. Boerger 2006 - 2007 */ -/*!ignore:re2c - -- making use of YYFILL - - . Here we modified the scanner to not require strlen() on the call. Instead - we compute limit on the fly. That is whenever more input is needed we - search for the terminating \0 in the next n chars the scanner needs. - . If there is not enough input we quit the scanner. - . Note that in lesson_001 YYLIMIT was a character pointer computed only once. - Here is of course also of type YYCTYPE but a variable that gets reevaluated - by YYFILL(). - . To make the code smaller we take advantage of the fact that our loop has no - break so far. This allows us to use break here and have the code that is - used for YYFILL() not contain the printf in every occurence. That way the - generated code gets smaller. - -*/ - -#include -#include -#include - -int fill(char *p, int n, char **l) -{ - while (*++p && n--) ; - * l = p; - return n <= 0; -} - -int scan(char *s) -{ - char *p = s; - char *l = s; - char *q = 0; -#define YYCTYPE char -#define YYCURSOR p -#define YYLIMIT l -#define YYMARKER q -#define YYFILL(n) { if (!fill(p, n, &l)) break; } - - for(;;) - { -/*!re2c - re2c:indent:top = 2; - "0"[0-9]+ { printf("Oct\n"); continue; } - [1-9][0-9]* { printf("Num\n"); continue; } - "0" { printf("Num\n"); continue; } - "+" { printf("+\n"); continue; } - "-" { printf("+\n"); continue; } - "\000" { printf("EOF\n"); return 0; } - [^] { printf("ERR\n"); return 1; } -*/ - } - printf("OOD\n"); return 2; -} - -int main(int argc, char **argv) -{ - if (argc > 1) - { - return scan(argv[1]); - } - else - { - fprintf(stderr, "%s \n", argv[0]); - return 0; - } -} diff --git a/examples/001_upn_calculator/calc_003.re b/examples/001_upn_calculator/calc_003.re deleted file mode 100644 index e48aec9..0000000 --- a/examples/001_upn_calculator/calc_003.re +++ /dev/null @@ -1,61 +0,0 @@ -/* re2c lesson 001_upn_calculator, calc_003, (c) M. Boerger 2006 - 2007 */ -/*!ignore:re2c - -- making use of YYFILL - - . Again provide the length of the input to generate the limit only once. Now - we can use YYFILL() to detect the end and simply return since YYFILL() is - only being used if the next scanner run might use more chars then YYLIMIT - allows. - . Note that we now use (s+l+2) instead of (s+l) as we did in lesson_001. In - the first lesson we did not quit from YYFILL() and used a special rule to - detect the end of input. Here we use the fact that we know the exact end - of input and that this length does not include the terminating zero. Since - YYLIMIT points to the first character behind the used buffer we use "+ 2". - If we would use "+1" we could drop the "\000" rule but could no longer - distinguish between end of input and out of data. - -*/ - -#include -#include -#include - -int scan(char *s, int l) -{ - char *p = s; - char *q = 0; -#define YYCTYPE char -#define YYCURSOR p -#define YYLIMIT (s+l+2) -#define YYMARKER q -#define YYFILL(n) { printf("OOD\n"); return 2; } - - for(;;) - { -/*!re2c - re2c:indent:top = 2; - "0"[0-9]+ { printf("Oct\n"); continue; } - [1-9][0-9]* { printf("Num\n"); continue; } - "0" { printf("Num\n"); continue; } - "+" { printf("+\n"); continue; } - "-" { printf("+\n"); continue; } - "\000" { printf("EOF\n"); return 0; } - [^] { printf("ERR\n"); return 1; } -*/ - } - return 0; -} - -int main(int argc, char **argv) -{ - if (argc > 1) - { - return scan(argv[1], strlen(argv[1])); - } - else - { - fprintf(stderr, "%s \n", argv[0]); - return 0; - } -} diff --git a/examples/001_upn_calculator/calc_004.re b/examples/001_upn_calculator/calc_004.re deleted file mode 100644 index 977e438..0000000 --- a/examples/001_upn_calculator/calc_004.re +++ /dev/null @@ -1,78 +0,0 @@ -/* re2c lesson 001_upn_calculator, calc_004, (c) M. Boerger 2006 - 2007 */ -/*!ignore:re2c - -- making use of definitions - . We provide complex rules as definitions. We can even have definitions made - up from other definitions. And we could also use definitions as part of - rules and not only as full rules as shown in this lesson. - -- showing the tokens - . re2c does not store the beginning of a token on its own but we can easily - do this by providing variable, in our case t, that is set to YYCURSOR on - every loop. If we were not using a loop here the token, we could have used - s instead of a new variable instead. - . As we use the token for an output function that requires a terminating zero - we copy the token. Alternatively we could store the end of the token, then - replace it with a zero character and replace it after the token has been - used. However that approach is not always acceptable. - -*/ - -#include -#include -#include - -char * tokendup(const char *t, const char *l) -{ - size_t n = l -t + 1; - char *r = (char*)malloc(n); - - memmove(r, t, n-1); - r[n] = '\0'; - return r; -} - -int scan(char *s, int l) -{ - char *p = s; - char *q = 0; - char *t; -#define YYCTYPE char -#define YYCURSOR p -#define YYLIMIT (s+l+2) -#define YYMARKER q -#define YYFILL(n) { printf("OOD\n"); return 2; } - - for(;;) - { - t = p; -/*!re2c - re2c:indent:top = 2; - - DIGIT = [0-9] ; - OCT = "0" DIGIT+ ; - INT = "0" | ( [1-9] DIGIT* ) ; - - OCT { t = tokendup(t, p); printf("Oct: %s\n", t); free(t); continue; } - INT { t = tokendup(t, p); printf("Num: %s\n", t); free(t); continue; } - "+" { printf("+\n"); continue; } - "-" { printf("+\n"); continue; } - "\000" { printf("EOF\n"); return 0; } - [^] { printf("ERR\n"); return 1; } -*/ - } - return 0; -} - -int main(int argc, char **argv) -{ - if (argc > 1) - { - return scan(argv[1], strlen(argv[1])); - } - else - { - fprintf(stderr, "%s \n", argv[0]); - return 0; - } -} diff --git a/examples/001_upn_calculator/calc_005.re b/examples/001_upn_calculator/calc_005.re deleted file mode 100644 index 6ae2a48..0000000 --- a/examples/001_upn_calculator/calc_005.re +++ /dev/null @@ -1,144 +0,0 @@ -/* re2c lesson 001_upn_calculator, calc_005, (c) M. Boerger 2006 - 2007 */ -/*!ignore:re2c - -- turning this lesson into an easy calculator - . We are going to write an UPN calculator so we need an additional rule to - ignore white space. - . Then we need to store the scanned input somewhere and do our math on it. - . Also we need to scan all arguments since the main c code gets the input - split up into chunks. - . In contrast to what we did before we now add a variable res that holds the - scanner state. We initialize that variable to 0 and quit the loop when it - is non zero. This will also be our return value so that we can use it in - function main to generate error information. - . To support operating systems where ' and " get passed in program arguments - we check for them being first and last input character. If so we correct - input pointer and input length. Since now our scanner might not see a - terminating zero we change YYLIMIT again and drop the special zero rule. -*/ - -#include -#include -#include - -#define DEBUG(stmt) stmt - -int stack[4]; -int depth = 0; - -int push_num(const char *t, const char *l, int radix) -{ - int num = 0; - - if (depth >= sizeof(stack)) - { - return 3; - } - - --t; - while(++t < l) - { - num = num * radix + (*t - '0'); - } - DEBUG(printf("Num: %d\n", num)); - - stack[depth++] = num; - return 0; -} - -int stack_add() -{ - if (depth < 2) return 4; - - --depth; - stack[depth-1] = stack[depth-1] + stack[depth]; - return 0; -} - -int stack_sub() -{ - if (depth < 2) return 4; - - --depth; - stack[depth-1] = stack[depth-1] - stack[depth]; - return 0; -} - -int scan(char *s, int l) -{ - char *p = s; - char *q = 0; - char *t; - int res = 0; - -#define YYCTYPE char -#define YYCURSOR p -#define YYLIMIT (s+l+1) -#define YYMARKER q -#define YYFILL(n) { return depth == 1 ? 0 : 2; } - - while(!res) - { - t = p; -/*!re2c - re2c:indent:top = 2; - - DIGIT = [0-9] ; - OCT = "0" DIGIT+ ; - INT = "0" | ( [1-9] DIGIT* ) ; - WS = [ \t]+ ; - - WS { continue; } - OCT { res = push_num(t, p, 8); continue; } - INT { res = push_num(t, p, 10); continue; } - "+" { res = stack_add(); continue; } - "-" { res = stack_sub(); continue; } - [^] { res = 1; continue; } -*/ - } - return res; -} - -int main(int argc, char **argv) -{ - if (argc > 1) - { - char *inp; - int res = 0, argp = 0, len; - - while(!res && ++argp < argc) - { - inp = argv[argp]; - len = strlen(inp); - if (inp[0] == '\"' && inp[len-1] == '\"') - { - ++inp; - len -=2; - } - res = scan(inp, len); - } - switch(res) - { - case 0: - printf("Result: %d\n", stack[0]); - return 0; - case 1: - fprintf(stderr, "Illegal character in input.\n"); - return 1; - case 2: - fprintf(stderr, "Premature end of input.\n"); - return 2; - case 3: - fprintf(stderr, "Stack overflow.\n"); - return 3; - case 4: - fprintf(stderr, "Stack underflow.\n"); - return 4; - } - } - else - { - fprintf(stderr, "%s \n", argv[0]); - return 0; - } -} diff --git a/examples/001_upn_calculator/calc_006.s.re b/examples/001_upn_calculator/calc_006.s.re deleted file mode 100644 index 10da31c..0000000 --- a/examples/001_upn_calculator/calc_006.s.re +++ /dev/null @@ -1,162 +0,0 @@ -/* re2c lesson 001_upn_calculator, calc_006, (c) M. Boerger 2006 - 2007 */ -/*!ignore:re2c - -- avoiding YYFILL() - . We use the inplace configuration re2c:yyfill to suppress generation of - YYFILL() blocks. This of course means we no longer have to provide the - macro. - . We also drop the YYMARKER stuff since we know that re2c does not generate - it for this example. - . Since re2c does no longer check for out of data situations we must do this. - For that reason we first reintroduce our zero rule and second we need to - ensure that the scanner does not take more than one bytes in one go. - - In the example suppose "0" is passed. The scanner reads the first "0" and - then is in an undecided state. The scanner can earliest decide on the next - char what the token is. In case of a zero the input ends and it was a - number, 0 to be precise. In case of a digit it is an octal number and the - next character needs to be read. In case of any other character the scanner - will detect an error with the any rule [^]. - - Now the above shows that the scanner may read two characters directly. But - only if the first is a "0". So we could easily check that if the first char - is "0" and the next char is a digit then yet another charcter is present. - But we require our inut to be zero terminated. And that means we do not - have to check anything for this scanner. - - However with other rule sets re2c might read more then one character in a - row. In those cases it is normally hard to impossible to avoid YYFILL. - -- optimizing the generated code by using -s command line switch of re2c - . This tells re2c to generate code that uses if statements rather - then endless switch/case expressions where appropriate. Note that the - generated code now requires the input to be unsigned char rather than char - due to the way comparisons are generated. -*/ - -#include -#include -#include - -#define DEBUG(stmt) stmt - -int stack[4]; -int depth = 0; - -int push_num(const unsigned char *t, const unsigned char *l, int radix) -{ - int num = 0; - - if (depth >= sizeof(stack)) - { - return 3; - } - - --t; - while(++t < l) - { - num = num * radix + (*t - (unsigned char)'0'); - } - DEBUG(printf("Num: %d\n", num)); - - stack[depth++] = num; - return 0; -} - -int stack_add() -{ - if (depth < 2) return 4; - - --depth; - stack[depth-1] = stack[depth-1] + stack[depth]; - DEBUG(printf("+\n")); - return 0; -} - -int stack_sub() -{ - if (depth < 2) return 4; - - --depth; - stack[depth-1] = stack[depth-1] - stack[depth]; - DEBUG(printf("-\n")); - return 0; -} - -int scan(char *s) -{ - unsigned char *p = (unsigned char*)s; - unsigned char *t; - int res = 0; - -#define YYCTYPE unsigned char -#define YYCURSOR p - - while(!res) - { - t = p; -/*!re2c - re2c:indent:top = 2; - re2c:yyfill:enable = 0; - - DIGIT = [0-9] ; - OCT = "0" DIGIT+ ; - INT = "0" | ( [1-9] DIGIT* ) ; - WS = [ \t]+ ; - - WS { continue; } - OCT { res = push_num(t, p, 8); continue; } - INT { res = push_num(t, p, 10); continue; } - "+" { res = stack_add(); continue; } - "-" { res = stack_sub(); continue; } - "\000" { res = depth == 1 ? 0 : 2; break; } - [^] { res = 1; continue; } -*/ - } - return res; -} - -int main(int argc, char **argv) -{ - if (argc > 1) - { - char *inp; - int res = 0, argp = 0, len; - - while(!res && ++argp < argc) - { - inp = strdup(argv[argp]); - len = strlen(inp); - if (inp[0] == '\"' && inp[len-1] == '\"') - { - inp[len - 1] = '\0'; - ++inp; - } - res = scan(inp); - free(inp); - } - switch(res) - { - case 0: - printf("Result: %d\n", stack[0]); - return 0; - case 1: - fprintf(stderr, "Illegal character in input.\n"); - return 1; - case 2: - fprintf(stderr, "Premature end of input.\n"); - return 2; - case 3: - fprintf(stderr, "Stack overflow.\n"); - return 3; - case 4: - fprintf(stderr, "Stack underflow.\n"); - return 4; - } - } - else - { - fprintf(stderr, "%s \n", argv[0]); - return 0; - } -} diff --git a/examples/001_upn_calculator/calc_007.b.re b/examples/001_upn_calculator/calc_007.b.re deleted file mode 100644 index 5238196..0000000 --- a/examples/001_upn_calculator/calc_007.b.re +++ /dev/null @@ -1,135 +0,0 @@ -/* re2c lesson 001_upn_calculator, calc_007, (c) M. Boerger 2006 - 2007 */ -/*!ignore:re2c - -- optimizing the generated code by using -b command line switch of re2c - . This tells re2c to generate code that uses a decision table. The -b switch - also contains the -s behavior. And -b also requires the input to be - unsigned chars. -*/ - -#include -#include -#include - -#define DEBUG(stmt) stmt - -int stack[4]; -int depth = 0; - -int push_num(const unsigned char *t, const unsigned char *l, int radix) -{ - int num = 0; - - if (depth >= sizeof(stack)) - { - return 3; - } - - --t; - while(++t < l) - { - num = num * radix + (*t - (unsigned char)'0'); - } - DEBUG(printf("Num: %d\n", num)); - - stack[depth++] = num; - return 0; -} - -int stack_add() -{ - if (depth < 2) return 4; - - --depth; - stack[depth-1] = stack[depth-1] + stack[depth]; - DEBUG(printf("+\n")); - return 0; -} - -int stack_sub() -{ - if (depth < 2) return 4; - - --depth; - stack[depth-1] = stack[depth-1] - stack[depth]; - DEBUG(printf("+\n")); - return 0; -} - -int scan(char *s) -{ - unsigned char *p = (unsigned char*)s; - unsigned char *t; - int res = 0; - -#define YYCTYPE unsigned char -#define YYCURSOR p - - while(!res) - { - t = p; -/*!re2c - re2c:indent:top = 2; - re2c:yyfill:enable = 0; - - DIGIT = [0-9] ; - OCT = "0" DIGIT+ ; - INT = "0" | ( [1-9] DIGIT* ) ; - WS = [ \t]+ ; - - WS { continue; } - OCT { res = push_num(t, p, 8); continue; } - INT { res = push_num(t, p, 10); continue; } - "+" { res = stack_add(); continue; } - "-" { res = stack_sub(); continue; } - "\000" { res = depth == 1 ? 0 : 2; break; } - [^] { res = 1; continue; } -*/ - } - return res; -} - -int main(int argc, char **argv) -{ - if (argc > 1) - { - char *inp; - int res = 0, argp = 0, len; - - while(!res && ++argp < argc) - { - inp = strdup(argv[argp]); - len = strlen(inp); - if (inp[0] == '\"' && inp[len-1] == '\"') - { - inp[len - 1] = '\0'; - ++inp; - } - res = scan(inp); - free(inp); - } - switch(res) - { - case 0: - printf("Result: %d\n", stack[0]); - return 0; - case 1: - fprintf(stderr, "Illegal character in input.\n"); - return 1; - case 2: - fprintf(stderr, "Premature end of input.\n"); - return 2; - case 3: - fprintf(stderr, "Stack overflow.\n"); - return 3; - case 4: - fprintf(stderr, "Stack underflow.\n"); - return 4; - } - } - else - { - fprintf(stderr, "%s \n", argv[0]); - return 0; - } -} diff --git a/examples/001_upn_calculator/calc_008.b.re b/examples/001_upn_calculator/calc_008.b.re deleted file mode 100644 index ed1a088..0000000 --- a/examples/001_upn_calculator/calc_008.b.re +++ /dev/null @@ -1,158 +0,0 @@ -/* re2c lesson 001_upn_calculator, calc_008, (c) M. Boerger 2006 - 2007 */ -/*!ignore:re2c - -- using -b with signed character input - . Since the code is being generated with -b switch re2c requires the internal - character variable yych to use an unsigned character type. For that reason - the previous lessons had a conversion at the beginning of their scan() - function. Other re2c generated code often have the scanners work completely - on unsigned input. Thus requesting a conversion. - - To avoid the conversion on input, re2c allows to do the conversion when - reading the internal yych variable. To enable that conversion you need to - use the implace configuration 're2c:yych:conversion' and set it to 1. This - will change the generated code to insert conversions to YYCTYPE whenever - yych is being read. - -- More inplace configurations for better/nicer code - . re2c allows to overwrite the generation of any define, label or variable - used in the generated code. For example we overwrite the 'yych' variable - name to 'curr' using inplace configuration 're2c:variable:yych = curr;'. - - . We further more use inplace configurations instead of defines. This allows - to use correct conversions to 'unsigned char' instead of having to convert - to 'YYCTYPE' when placing 're2c:define:YYCTYPE = "unsigned char";' infront - of 're2c:yych:conversion'. Note that we have to use apostrophies for the - first setting as it contains a space. - - . Last but not least we use 're2c:labelprefix = scan' to change the prefix - of generated labels. -*/ - -#include -#include -#include - -#define DEBUG(stmt) stmt - -int stack[4]; -int depth = 0; - -int push_num(const char *t, const char *l, int radix) -{ - int num = 0; - - if (depth >= sizeof(stack)) - { - return 3; - } - - --t; - while(++t < l) - { - num = num * radix + (*t - '0'); - } - DEBUG(printf("Num: %d\n", num)); - - stack[depth++] = num; - return 0; -} - -int stack_add() -{ - if (depth < 2) return 4; - - --depth; - stack[depth-1] = stack[depth-1] + stack[depth]; - DEBUG(printf("+\n")); - return 0; -} - -int stack_sub() -{ - if (depth < 2) return 4; - - --depth; - stack[depth-1] = stack[depth-1] - stack[depth]; - DEBUG(printf("+\n")); - return 0; -} - -int scan(char *p) -{ - char *t; - int res = 0; - - while(!res) - { - t = p; -/*!re2c - re2c:define:YYCTYPE = "unsigned char"; - re2c:define:YYCURSOR = p; - re2c:variable:yych = curr; - re2c:indent:top = 2; - re2c:yyfill:enable = 0; - re2c:yych:conversion = 1; - re2c:labelprefix = scan; - - DIGIT = [0-9] ; - OCT = "0" DIGIT+ ; - INT = "0" | ( [1-9] DIGIT* ) ; - WS = [ \t]+ ; - - WS { continue; } - OCT { res = push_num(t, p, 8); continue; } - INT { res = push_num(t, p, 10); continue; } - "+" { res = stack_add(); continue; } - "-" { res = stack_sub(); continue; } - "\000" { res = depth == 1 ? 0 : 2; break; } - [^] { res = 1; continue; } -*/ - } - return res; -} - -int main(int argc, char **argv) -{ - if (argc > 1) - { - char *inp; - int res = 0, argp = 0, len; - - while(!res && ++argp < argc) - { - inp = strdup(argv[argp]); - len = strlen(inp); - if (inp[0] == '\"' && inp[len-1] == '\"') - { - inp[len - 1] = '\0'; - ++inp; - } - res = scan(inp); - free(inp); - } - switch(res) - { - case 0: - printf("Result: %d\n", stack[0]); - return 0; - case 1: - fprintf(stderr, "Illegal character in input.\n"); - return 1; - case 2: - fprintf(stderr, "Premature end of input.\n"); - return 2; - case 3: - fprintf(stderr, "Stack overflow.\n"); - return 3; - case 4: - fprintf(stderr, "Stack underflow.\n"); - return 4; - } - } - else - { - fprintf(stderr, "%s \n", argv[0]); - return 0; - } -} diff --git a/examples/001_upn_calculator/windows/HiResTimer.h b/examples/001_upn_calculator/windows/HiResTimer.h deleted file mode 100644 index 585a1d9..0000000 --- a/examples/001_upn_calculator/windows/HiResTimer.h +++ /dev/null @@ -1,54 +0,0 @@ -/** - * @file HiResTimer.h - * @brief - * @note - */ - -#ifndef _HI_RES_TIMER_H_ -#define _HI_RES_TIMER_H_ - -#ifdef WIN32 -#include // probably already done in stdafx.h -static LARGE_INTEGER start; -static LARGE_INTEGER stop; -static LARGE_INTEGER freq; -static _int64 elapsedCounts; -static double elapsedMillis; -static double elapsedMicros; -static HANDLE processHandle; -static DWORD prevPriorityClass; - -void HrtInit() -{ - processHandle = GetCurrentProcess(); - prevPriorityClass = GetPriorityClass(processHandle); - QueryPerformanceFrequency(&freq); -} - -void HrtStart() -{ - QueryPerformanceCounter(&start); -} - -void HrtSetPriority(DWORD priority) -{ - int flag; - prevPriorityClass = GetPriorityClass(processHandle); - flag = SetPriorityClass(processHandle, priority); -} - -void HrtResetPriority(void) -{ - int flag = SetPriorityClass(processHandle, prevPriorityClass); -} - -double HrtElapsedMillis() -{ - QueryPerformanceCounter(&stop); - elapsedCounts = (stop.QuadPart - start.QuadPart); - elapsedMillis = ((elapsedCounts * 1000.0) / freq.QuadPart); - return elapsedMillis; -} - -#endif -#endif \ No newline at end of file diff --git a/examples/001_upn_calculator/windows/main.b.re b/examples/001_upn_calculator/windows/main.b.re deleted file mode 100644 index 1600b83..0000000 --- a/examples/001_upn_calculator/windows/main.b.re +++ /dev/null @@ -1,291 +0,0 @@ -/* re2c lesson 001_upn_calculator, main.b.re, (c) M. Boerger, L. Allan 2006 */ -/*!ignore:re2c - -- basic interface for string reading - - . We define the macros YYCTYPE, YYCURSOR, YYLIMIT, YYMARKER, YYFILL - . YYCTYPE is the type re2c operates on or in other words the type that - it generates code for. While it is not a big difference when we were - using 'unsigned char' here we would need to run re2c with option -w - to fully support types with sieof() > 1. - . YYCURSOR is used internally and holds the current scanner position. In - expression handlers, the code blocks after re2c expressions, this can be - used to identify the end of the token. - . YYMARKER is not always being used so we set an initial value to avoid - a compiler warning. - . YYLIMIT stores the end of the input. Unfortunatley we have to use strlen() - in this lesson. In the next example we see one way to get rid of it. - . We use a 'for(;;)'-loop around the scanner block. We could have used a - 'while(1)'-loop instead but some compilers generate a warning for it. - . To make the output more readable we use 're2c:indent:top' scanner - configuration that configures re2c to prepend a single tab (the default) - to the beginning of each output line. - . The following lines are expressions and for each expression we output the - token name and continue the scanner loop. - . The second last token detects the end of our input, the terminating zero in - our input string. In other scanners detecting the end of input may vary. - For example binary code may contain \0 as valid input. - . The last expression accepts any input character. It tells re2c to accept - the opposit of the empty range. This includes numbers and our tokens but - as re2c goes from top to botton when evaluating the expressions this is no - problem. - . The first three rules show that re2c actually prioritizes the expressions - from top to bottom. Octal number require a starting "0" and the actual - number. Normal numbers start with a digit greater 0. And zero is finally a - special case. A single "0" is detected by the last rule of this set. And - valid ocal number is already being detected by the first rule. This even - includes multi "0" sequences that in octal notation also means zero. - Another way would be to only use two rules: - "0" [0-9]+ - "0" | ( [1-9] [0-9]* ) - A full description of re2c rule syntax can be found in the manual. -*/ - -#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers - -#if _MSC_VER > 1200 -#define WINVER 0x0400 // Change this to the appropriate value to target Windows 98 and Windows 2000 or later. -#endif // Prevents warning from vc7.1 complaining about redefinition - -#include -#include -#include -#include -#include -#include "HiResTimer.h" - -static char gTestBuf[1000] = ""; - -/** - * @brief Setup HiResolution timer and confirm it is working ok - */ -void InitHiResTimerAndVerifyWorking(void) -{ - double elapsed; - HrtInit(); - HrtSetPriority(ABOVE_NORMAL_PRIORITY_CLASS); - HrtStart(); - Sleep(100); - elapsed = HrtElapsedMillis(); - if ((elapsed < 90) || (elapsed > 110)) { - printf("HiResTimer misbehaving: %f\n", elapsed); - exit(2); - } -} - -/** - * @brief Scan for numbers in different formats - */ -int ScanFullSpeed(char *pzStrToScan, size_t lenStrToScan) -{ - unsigned char *pzCurScanPos = (unsigned char*)pzStrToScan; - unsigned char *pzBacktrackInfo = 0; -#define YYCTYPE unsigned char -#define YYCURSOR pzCurScanPos -#define YYLIMIT (pzStrToScan+lenStrToScan) -#define YYMARKER pzBacktrackInfo -#define YYFILL(n) - - for(;;) - { -/*!re2c - re2c:indent:top = 2; - [1-9][0-9]* { continue; } - [0][0-9]+ { continue; } - "+" { continue; } - "-" { continue; } - "\000" { return 0; } - [^] { return 1; } -*/ - } -} - -/** - * @brief Scan for numbers in different formats - */ -int scan(char *pzStrToScan, size_t lenStrToScan) -{ - unsigned char *pzCurScanPos = (unsigned char*)pzStrToScan; - unsigned char *pzBacktrackInfo = 0; -#define YYCTYPE unsigned char -#define YYCURSOR pzCurScanPos -#define YYLIMIT (pzStrToScan+lenStrToScan) -#define YYMARKER pzBacktrackInfo -#define YYFILL(n) - - for(;;) - { -/*!re2c - re2c:indent:top = 2; - [1-9][0-9]* { printf("Num\n"); strcat(gTestBuf, "Num "); continue; } - [0][0-9]+ { printf("Oct\n"); strcat(gTestBuf, "Oct "); continue; } - "+" { printf("+\n"); strcat(gTestBuf, "+ "); continue; } - "-" { printf("-\n"); strcat(gTestBuf, "- "); continue; } - "\000" { printf("EOF\n"); return 0; } - [^] { printf("ERR\n"); strcat(gTestBuf, "ERR "); return 1; } -*/ - } -} - -/** - * @brief Show high resolution elapsed time for 10,000 and 100,000 loops - */ -void DoTimingsOfStrnCmp(void) -{ - char testStr[] = "Hello, world"; - int totLoops = 10000; - int totFoundCount = 0; - int foundCount = 0; - int loop; - int rc; - const int progressAnd = 0xFFFFF000; - double elapsed; - - printf("\n\n%d loops with * every %d loops to confirm\n", totLoops, ((~progressAnd) + 1)); - - HrtStart(); - for (loop = 0; loop < totLoops; ++loop) { - foundCount = 0; - rc = strncmp(testStr, "Hello", 5); - if (rc == 0) { - foundCount++; - totFoundCount++; - if ((totFoundCount & progressAnd) == totFoundCount) { - printf("*"); - } - } - } - elapsed = HrtElapsedMillis(); - printf("\nstrncmp Elapsed for %7d loops milliseconds: %7.3f\n", totLoops, elapsed); - printf("FoundCount each loop: %d\n", foundCount); - printf("TotalFoundCount for all loops: %d\n", totFoundCount); - - totLoops = 100000; - HrtStart(); - for (loop = 0; loop < totLoops; ++loop) { - foundCount = 0; - rc = strncmp(testStr, "Hello", 5); - if (rc == 0) { - foundCount++; - totFoundCount++; - if ((totFoundCount & progressAnd) == totFoundCount) { - printf("*"); - } - } - } - elapsed = HrtElapsedMillis(); - printf("\nstrncmp Elapsed for %7d loops milliseconds: %7.3f\n", totLoops, elapsed); - printf("FoundCount each loop: %d\n", foundCount); - printf("TotalFoundCount for all loops: %d\n", totFoundCount); -} - -/** - * @brief Show high resolution elapsed time for 10,000 and 100,000 loops - */ -void DoTimingsOfRe2c(void) -{ - char* testStrings[] = { "123", "1234", "+123", "01234", "-04321", "abc", "123abc" }; - const int testCount = sizeof(testStrings) / sizeof(testStrings[0]); - int i; - int totLoops = 10000 / testCount; // Doing more than one per loop - int totFoundCount = 0; - int foundCount = 0; - int loop; - int rc; - const int progressAnd = 0xFFFFF000; - double elapsed; - - printf("\n\n%d loops with * every %d loops to confirm\n", totLoops, ((~progressAnd) + 1)); - - HrtStart(); - for (loop = 0; loop < totLoops; ++loop) { - foundCount = 0; - strcpy(gTestBuf, ""); - for (i = 0; i < testCount; ++i) { - char* pzCurStr = testStrings[i]; - size_t len = strlen(pzCurStr); // Calc of strlen slows things down ... std::string? - rc = ScanFullSpeed(pzCurStr, len); - if (rc == 0) { - foundCount++; - totFoundCount++; - if ((totFoundCount & progressAnd) == totFoundCount) { - printf("*"); - } - } - } - } - elapsed = HrtElapsedMillis(); - printf("\nRe2c Elapsed for %7d loops milliseconds: %7.3f\n", totLoops, elapsed); - printf("FoundCount each loop: %d\n", foundCount); - printf("TotalFoundCount for all loops: %d\n", totFoundCount); - - totLoops = 100000 / testCount; - printf("\n\n%d loops with * every %d loops to confirm\n", totLoops, ((~progressAnd) + 1)); - - HrtStart(); - for (loop = 0; loop < totLoops; ++loop) { - foundCount = 0; - strcpy(gTestBuf, ""); - for (i = 0; i < testCount; ++i) { - char* pzCurStr = testStrings[i]; - size_t len = strlen(pzCurStr); // Calc of strlen slows things down ... std::string? - rc = ScanFullSpeed(pzCurStr, len); - if (rc == 0) { - foundCount++; - totFoundCount++; - if ((totFoundCount & progressAnd) == totFoundCount) { - printf("*"); - } - } - } - } - elapsed = HrtElapsedMillis(); - printf("\nRe2c Elapsed for %7d loops milliseconds: %7.3f\n", totLoops, elapsed); - printf("FoundCount each loop: %d\n", foundCount); - printf("TotalFoundCount for all loops: %d\n", totFoundCount); -} - -/** - * @brief Entry point for console app - */ -int main(int argc, char **argv) -{ - char testStr_A[] = "123"; - char* testStr_B = "456"; - char* testStrings[] = { "123", "1234", "+123", "01234", "-04321", "abc", "123abc" }; - const int testCount = sizeof(testStrings) / sizeof(testStrings[0]); - int i; - - int rc = scan(testStr_A, 3); - printf("rc: %d\n", rc); - - rc = scan(testStr_B, 3); - printf("rc: %d\n", rc); - - rc = scan("789", 3); - printf("rc: %d\n", rc); - - strcpy(gTestBuf, ""); - for (i = 0; i < testCount; ++i) { - char* pzCurStr = testStrings[i]; - size_t len = strlen(pzCurStr); - scan(pzCurStr, len); - } - printf("%s\n", gTestBuf); - rc = strcmp(gTestBuf, "Num Num + Num Oct - Oct ERR Num ERR "); - if (rc == 0) { - printf("Success\n"); - } - else { - printf("Failure\n"); - } - assert(0 == rc); // Doesn't work with Release build - - InitHiResTimerAndVerifyWorking(); - - DoTimingsOfStrnCmp(); - - DoTimingsOfRe2c(); - - return 0; -} diff --git a/examples/002_strip_comments/README b/examples/002_strip_comments/README deleted file mode 100644 index 353d669..0000000 --- a/examples/002_strip_comments/README +++ /dev/null @@ -1,21 +0,0 @@ -re2c lesson 002_strip_comments, (c) M. Boerger 2006 - -In this lesson you will learn how to use multiple scanner blocks and how to -read the input from a file instead of a zero terminated string. In the end you -will have a scanner that filters comments out of c source files but keeps re2c -comments. - -The first scanner can be generated with: - - re2c -s -o t.c strip_001.s.re - -In the second step we will learn about YYMARKER that stores backtracking -information. - - re2c -s -0 t.c strip_002.b.re - -The third step brings trailing contexts that are stored in YYCTXMARKER. We also -change to use -b instead of -s option since the scanner gets more and more -complex. - - re2c -b -0 t.c strip_002.b.re diff --git a/examples/002_strip_comments/strip_001.s.re b/examples/002_strip_comments/strip_001.s.re deleted file mode 100644 index 5525ae3..0000000 --- a/examples/002_strip_comments/strip_001.s.re +++ /dev/null @@ -1,147 +0,0 @@ -/* re2c lesson 002_strip_comments, strip_001.s, (c) M. Boerger 2006 - 2007 */ -/*!ignore:re2c - -- basic interface for file reading - . This scanner will read chunks of input from a file. The easiest way would - be to read the whole file into a memory buffer and use that a zero - terminated string. - . Instead we want to read input chunks of a reasonable size as they are neede - by the scanner. Thus we basically need YYFILL(n) to call fread(n). - . Before we provide a buffer that we constantly reallocate we instead use - one buffer that we get from the stack or global memory just once. When we - reach the end of the buffer we simply move the beginning of our input - that is somewhere in our buffer to the beginning of our buffer and then - append the next chunk of input to the correct end inside our buffer. - . As re2c scanners might read more than one character we need to ensure our - buffer is long enough. We can use re2c to inform about the maximum size - by placing a "!max:re2c" comment somewhere. This gets translated to a - "#define YYMAXFILL " line where is the maximum length value. This - define can be used as precompiler condition. - -- multiple scanner blocks - . We use a main scanner block that outputs every input character unless the - input is two /s or a / followed by a *. In the latter two cases we switch - to a special c++ comment and a comment block respectively. - . Both special blocks simply detect their end ignore any other character. - . The c++ block is a bit special. Since the terminating new line needs to - be output and that can either be a new line or a carridge return followed - by a new line. - . In order to ensure that we do not read behind our buffer we reset the token - pointer to the cursor on every scanner run. -*/ - -#include -#include -#include - -/*!max:re2c */ -#define BSIZE 128 - -#if BSIZE < YYMAXFILL -# error BSIZE must be greater YYMAXFILL -#endif - -#define YYCTYPE unsigned char -#define YYCURSOR s.cur -#define YYLIMIT s.lim -#define YYFILL(n) { if ((res = fill(&s, n)) >= 0) break; } - -typedef struct Scanner -{ - FILE *fp; - unsigned char *cur, *tok, *lim, *eof; - unsigned char buffer[BSIZE]; -} Scanner; - -int fill(Scanner *s, int len) -{ - if (!len) - { - s->cur = s->tok = s->lim = s->buffer; - s->eof = 0; - } - if (!s->eof) - { - int got, cnt = s->tok - s->buffer; - - if (cnt > 0) - { - memcpy(s->buffer, s->tok, s->lim - s->tok); - s->tok -= cnt; - s->cur -= cnt; - s->lim -= cnt; - } - cnt = BSIZE - cnt; - if ((got = fread(s->lim, 1, cnt, s->fp)) != cnt) - { - s->eof = &s->lim[got]; - } - s->lim += got; - } - else if (s->cur + len > s->eof) - { - return 0; /* not enough input data */ - } - return -1; -} - -int scan(FILE *fp) -{ - int res = 0; - Scanner s; - - if (!fp) - { - return 1; /* no file was opened */ - } - - s.fp = fp; - - fill(&s, 0); - - for(;;) - { - s.tok = s.cur; -/*!re2c - re2c:indent:top = 2; - - NL = "\r"? "\n" ; - ANY = [^] ; - - "/" "/" { goto cppcomment; } - "/" "*" { goto comment; } - ANY { fputc(*s.tok, stdout); continue; } -*/ -comment: - s.tok = s.cur; -/*!re2c - "*" "/" { continue; } - ANY { goto comment; } -*/ -cppcomment: - s.tok = s.cur; -/*!re2c - NL { fwrite(s.tok, 1, s.cur - s.tok, stdout); continue; } - ANY { goto cppcomment; } -*/ - } - - if (fp != stdin) - { - fclose(fp); /* close only if not stdin */ - } - return res; /* return result */ -} - -int main(int argc, char **argv) -{ - if (argc > 1) - { - return scan(!strcmp(argv[1], "-") ? stdin : fopen(argv[1], "r")); - } - else - { - fprintf(stderr, "%s \n", argv[0]); - return 1; - } -} diff --git a/examples/002_strip_comments/strip_002.s.re b/examples/002_strip_comments/strip_002.s.re deleted file mode 100644 index 3c2a6cf..0000000 --- a/examples/002_strip_comments/strip_002.s.re +++ /dev/null @@ -1,162 +0,0 @@ -/* re2c lesson 002_strip_comments, strip_002.s, (c) M. Boerger 2006 - 2007 */ -/*!ignore:re2c - -- complexity - . When a comment is preceeded by a new line and followed by whitespace and a - new line then we can drop the trailing whitespace and new line. - . Additional to what we strip out already what about two consequtive comment - blocks? When two comments are only separated by whitespace we want to drop - both. In other words when detecting the end of a comment block we need to - check whether it is followed by only whitespace and the a new comment in - which case we continure ignoring the input. If it is followed only by white - space and a new line we strip out the new white space and new line. In any - other case we start outputting all that follows. - But we cannot simply use the following two rules: - "*" "/" WS* "/" "*" { continue; } - "*" "/" WS* NL { continue; } - The main problem is that WS* can get bigger then our buffer, so we need a - new scanner. - . Meanwhile our scanner gets a bit more complex and we have to add two more - things. First the scanner code now uses a YYMARKER to store backtracking - information. - -- backtracking information - . When the scanner has two rules that can have the same beginning but a - different ending then it needs to store the position that identifies the - common part. This is called backtracking. As mentioned above re2c expects - you to provide compiler define YYMARKER and a pointer variable. - . When shifting buffer contents as done in our fill function the marker needs - to be corrected, too. - -*/ - -#include -#include -#include - -/*!max:re2c */ -#define BSIZE 128 - -#if BSIZE < YYMAXFILL -# error BSIZE must be greater YYMAXFILL -#endif - -#define YYCTYPE unsigned char -#define YYCURSOR s.cur -#define YYLIMIT s.lim -#define YYMARKER s.mrk -#define YYFILL(n) { if ((res = fill(&s, n)) >= 0) break; } - -typedef struct Scanner -{ - FILE *fp; - unsigned char *cur, *tok, *lim, *eof, *mrk; - unsigned char buffer[BSIZE]; -} Scanner; - -int fill(Scanner *s, int len) -{ - if (!len) - { - s->cur = s->tok = s->lim = s->mrk = s->buffer; - s->eof = 0; - } - if (!s->eof) - { - int got, cnt = s->tok - s->buffer; - - if (cnt > 0) - { - memcpy(s->buffer, s->tok, s->lim - s->tok); - s->tok -= cnt; - s->cur -= cnt; - s->lim -= cnt; - s->mrk -= cnt; - } - cnt = BSIZE - cnt; - if ((got = fread(s->lim, 1, cnt, s->fp)) != cnt) - { - s->eof = &s->lim[got]; - } - s->lim += got; - } - else if (s->cur + len > s->eof) - { - return 0; /* not enough input data */ - } - return -1; -} - -void echo(Scanner *s) -{ - fwrite(s->tok, 1, s->cur - s->tok, stdout); -} - -int scan(FILE *fp) -{ - int res = 0; - Scanner s; - - if (!fp) - { - return 1; /* no file was opened */ - } - - s.fp = fp; - - fill(&s, 0); - - for(;;) - { - s.tok = s.cur; -/*!re2c - re2c:indent:top = 2; - - NL = "\r"? "\n" ; - WS = [\r\n\t ] ; - ANY = [^] ; - - "/" "/" { goto cppcomment; } - "/" "*" { goto comment; } - ANY { fputc(*s.tok, stdout); continue; } -*/ -comment: - s.tok = s.cur; -/*!re2c - "*" "/" { goto commentws; } - ANY { goto comment; } -*/ -commentws: - s.tok = s.cur; -/*!re2c - NL { echo(&s); continue; } - WS { goto commentws; } - ANY { echo(&s); continue; } -*/ -cppcomment: - s.tok = s.cur; -/*!re2c - NL { echo(&s); continue; } - ANY { goto cppcomment; } -*/ - } - - if (fp != stdin) - { - fclose(fp); /* close only if not stdin */ - } - return res; /* return result */ -} - -int main(int argc, char **argv) -{ - if (argc > 1) - { - return scan(!strcmp(argv[1], "-") ? stdin : fopen(argv[1], "r")); - } - else - { - fprintf(stderr, "%s \n", argv[0]); - return 1; - } -} diff --git a/examples/002_strip_comments/strip_003.b.re b/examples/002_strip_comments/strip_003.b.re deleted file mode 100644 index a7b1a5c..0000000 --- a/examples/002_strip_comments/strip_003.b.re +++ /dev/null @@ -1,179 +0,0 @@ -/* re2c lesson 002_strip_comments, strip_003.b, (c) M. Boerger 2006 - 2007 */ -/*!ignore:re2c - -- more complexity - . Right now we strip out trailing white space and new lines after a comment - block. This can be a problem when the comment block was not preceeded by - a new line. - . The solution is to use trailing contexts. - -- trailing contexts - . Re2c allows to check for a portion of input and only recognize it when it - is followed by another portion. This is called a trailing context. - . The trailing context is not part of the identified input. That means that - it follows exactly at the cursor. A consequence is that the scanner has - already read more input and on the next run you need to restore begining - of input, in our case s.tok, from the cursor, here s.cur, rather then - restoring to the beginning of the buffer. This way the scanner can reuse - the portion it has already read. - . The position of the trailing context is stored in YYCTXMARKER for which - a pointer variable needs to be provided. - . As with YYMARKER the corrsponding variable needs to be corrected if we - shift in some buffer. - . Still this is not all we need to solve the problem. What is left is that - the information whether we detected a trailing context was detected has to - be stored somewhere. This is done by the new variable nlcomment. - -- formatting - . Until now we only used single line expression code and we always had the - opening { on the same line as the rule itself. If we have multiline rule - code and care for formatting we can no longer rely on re2c. Now we have - to indent the rule code ourself. Also we need to take care of the opening - {. If we keep it on the same line as the rule then re2c will indent it - correctly and the emitted #line informations will be correct. If we place - it on the next line then the #line directive will also point to that line - and not to the rule. -*/ - -#include -#include -#include - -/*!max:re2c */ -#define BSIZE 128 - -#if BSIZE < YYMAXFILL -# error BSIZE must be greater YYMAXFILL -#endif - -#define YYCTYPE unsigned char -#define YYCURSOR s.cur -#define YYLIMIT s.lim -#define YYMARKER s.mrk -#define YYCTXMARKER s.ctx -#define YYFILL(n) { if ((res = fill(&s, n)) >= 0) break; } - -typedef struct Scanner -{ - FILE *fp; - unsigned char *cur, *tok, *lim, *eof, *ctx, *mrk; - unsigned char buffer[BSIZE]; -} Scanner; - -int fill(Scanner *s, int len) -{ - if (!len) - { - s->cur = s->tok = s->lim = s->mrk = s->buffer; - s->eof = 0; - } - if (!s->eof) - { - int got, cnt = s->tok - s->buffer; - - if (cnt > 0) - { - memcpy(s->buffer, s->tok, s->lim - s->tok); - s->tok -= cnt; - s->cur -= cnt; - s->lim -= cnt; - s->mrk -= cnt; - s->ctx -= cnt; - } - cnt = BSIZE - cnt; - if ((got = fread(s->lim, 1, cnt, s->fp)) != cnt) - { - s->eof = &s->lim[got]; - } - s->lim += got; - } - else if (s->cur + len > s->eof) - { - return 0; /* not enough input data */ - } - return -1; -} - -void echo(Scanner *s) -{ - fwrite(s->tok, 1, s->cur - s->tok, stdout); -} - -int scan(FILE *fp) -{ - int res = 0; - int nlcomment = 0; - Scanner s; - - if (!fp) - { - return 1; /* no file was opened */ - } - - s.fp = fp; - - fill(&s, 0); - - for(;;) - { - s.tok = s.cur; -/*!re2c - re2c:indent:top = 2; - - NL = "\r"? "\n" ; - WS = [\r\n\t ] ; - ANY = [^] ; - - "/" "/" { goto cppcomment; } - NL / "/""*" { echo(&s); nlcomment = 1; continue; } - "/" "*" { goto comment; } - ANY { fputc(*s.tok, stdout); continue; } -*/ -comment: - s.tok = s.cur; -/*!re2c - "*" "/" { goto commentws; } - ANY { goto comment; } -*/ -commentws: - s.tok = s.cur; -/*!re2c - NL? "/" "*" { goto comment; } - NL { - if (!nlcomment) - { - echo(&s); - } - nlcomment = 0; - continue; - } - WS { goto commentws; } - ANY { echo(&s); nlcomment = 0; continue; } -*/ -cppcomment: - s.tok = s.cur; -/*!re2c - NL { echo(&s); continue; } - ANY { goto cppcomment; } -*/ - } - - if (fp != stdin) - { - fclose(fp); /* close only if not stdin */ - } - return res; /* return result */ -} - -int main(int argc, char **argv) -{ - if (argc > 1) - { - return scan(!strcmp(argv[1], "-") ? stdin : fopen(argv[1], "r")); - } - else - { - fprintf(stderr, "%s \n", argv[0]); - return 1; - } -} diff --git a/examples/01_recognizing_integers.i.c b/examples/01_recognizing_integers.i.c new file mode 100644 index 0000000..84e3c9e --- /dev/null +++ b/examples/01_recognizing_integers.i.c @@ -0,0 +1,171 @@ +/* Generated by re2c */ +#include + +enum num_t { ERR, BIN, OCT, DEC, HEX }; + +static num_t lex(const char *YYCURSOR) +{ + const char *YYMARKER; + +{ + char yych; + yych = *YYCURSOR; + switch (yych) { + case '0': goto yy4; + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy5; + default: goto yy2; + } +yy2: + ++YYCURSOR; +yy3: + { return ERR; } +yy4: + yych = *(YYMARKER = ++YYCURSOR); + switch (yych) { + case 0x00: goto yy6; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': goto yy8; + case 'B': + case 'b': goto yy11; + case 'X': + case 'x': goto yy12; + default: goto yy3; + } +yy5: + yych = *(YYMARKER = ++YYCURSOR); + switch (yych) { + case 0x00: goto yy13; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy15; + default: goto yy3; + } +yy6: + ++YYCURSOR; + { return OCT; } +yy8: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: goto yy6; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': goto yy8; + default: goto yy10; + } +yy10: + YYCURSOR = YYMARKER; + goto yy3; +yy11: + yych = *++YYCURSOR; + if (yych <= 0x00) goto yy10; + goto yy18; +yy12: + yych = *++YYCURSOR; + if (yych <= 0x00) goto yy10; + goto yy20; +yy13: + ++YYCURSOR; + { return DEC; } +yy15: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: goto yy13; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy15; + default: goto yy10; + } +yy17: + yych = *++YYCURSOR; +yy18: + switch (yych) { + case 0x00: goto yy21; + case '0': + case '1': goto yy17; + default: goto yy10; + } +yy19: + yych = *++YYCURSOR; +yy20: + switch (yych) { + case 0x00: goto yy23; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy19; + default: goto yy10; + } +yy21: + ++YYCURSOR; + { return BIN; } +yy23: + ++YYCURSOR; + { return HEX; } +} + +} + +int main(int argc, char **argv) +{ + for (int i = 1; i < argc; ++i) { + switch (lex(argv[i])) { + case ERR: printf("error\n"); break; + case BIN: printf("binary\n"); break; + case OCT: printf("octal\n"); break; + case DEC: printf("decimal\n"); break; + case HEX: printf("hexadecimal\n"); break; + } + } + return 0; +} diff --git a/examples/01_recognizing_integers.i.re b/examples/01_recognizing_integers.i.re new file mode 100644 index 0000000..47c1320 --- /dev/null +++ b/examples/01_recognizing_integers.i.re @@ -0,0 +1,38 @@ +#include + +enum num_t { ERR, BIN, OCT, DEC, HEX }; + +static num_t lex(const char *YYCURSOR) +{ + const char *YYMARKER; + /*!re2c + re2c:define:YYCTYPE = char; + re2c:yyfill:enable = 0; + + end = "\x00"; + bin = '0b' [01]+; + oct = "0" [0-7]*; + dec = [1-9][0-9]*; + hex = '0x' [0-9a-fA-F]+; + + * { return ERR; } + bin end { return BIN; } + oct end { return OCT; } + dec end { return DEC; } + hex end { return HEX; } + */ +} + +int main(int argc, char **argv) +{ + for (int i = 1; i < argc; ++i) { + switch (lex(argv[i])) { + case ERR: printf("error\n"); break; + case BIN: printf("binary\n"); break; + case OCT: printf("octal\n"); break; + case DEC: printf("decimal\n"); break; + case HEX: printf("hexadecimal\n"); break; + } + } + return 0; +} diff --git a/examples/02_recognizing_strings.i.c b/examples/02_recognizing_strings.i.c new file mode 100644 index 0000000..7767398 --- /dev/null +++ b/examples/02_recognizing_strings.i.c @@ -0,0 +1,72 @@ +/* Generated by re2c */ +#include +#include + +#define YYMAXFILL 1 + + +struct input_t { + size_t len; + char *str; + + input_t(const char *s) + : len(strlen(s)) + , str(new char[len + YYMAXFILL]) + { + memcpy(str, s, len); + memset(str + len, 'a', YYMAXFILL); + } + ~input_t() + { + delete[]str; + } +}; + +static bool lex(const input_t & input) +{ + const char *YYCURSOR = input.str; + const char *const YYLIMIT = input.str + input.len + YYMAXFILL; + +{ + char yych; + if (YYLIMIT <= YYCURSOR) return false; + yych = *YYCURSOR; + switch (yych) { + case '"': goto yy4; + case '\'': goto yy6; + default: goto yy2; + } +yy2: + ++YYCURSOR; + { return false; } +yy4: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) return false; + yych = *YYCURSOR; + switch (yych) { + case '"': goto yy8; + default: goto yy4; + } +yy6: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) return false; + yych = *YYCURSOR; + switch (yych) { + case '\'': goto yy8; + default: goto yy6; + } +yy8: + ++YYCURSOR; + { return YYLIMIT - YYCURSOR == YYMAXFILL; } +} + +} + +int main(int argc, char **argv) +{ + for (int i = 1; i < argc; ++i) { + input_t arg(argv[i]); + printf("%s: %s\n", lex(arg) ? "str" : "err", argv[i]); + } + return 0; +} diff --git a/examples/02_recognizing_strings.i.re b/examples/02_recognizing_strings.i.re new file mode 100644 index 0000000..ec9d683 --- /dev/null +++ b/examples/02_recognizing_strings.i.re @@ -0,0 +1,47 @@ +#include +#include + +/*!max:re2c*/ + +struct input_t { + size_t len; + char *str; + + input_t(const char *s) + : len(strlen(s)) + , str(new char[len + YYMAXFILL]) + { + memcpy(str, s, len); + memset(str + len, 'a', YYMAXFILL); + } + ~input_t() + { + delete[]str; + } +}; + +static bool lex(const input_t & input) +{ + const char *YYCURSOR = input.str; + const char *const YYLIMIT = input.str + input.len + YYMAXFILL; + /*!re2c + re2c:define:YYCTYPE = char; + re2c:define:YYFILL = "return false;"; + re2c:define:YYFILL:naked = 1; + + sstr = "'" [^']* "'"; + dstr = "\"" [^"]* "\""; + + * { return false; } + (sstr | dstr) { return YYLIMIT - YYCURSOR == YYMAXFILL; } + */ +} + +int main(int argc, char **argv) +{ + for (int i = 1; i < argc; ++i) { + input_t arg(argv[i]); + printf("%s: %s\n", lex(arg) ? "str" : "err", argv[i]); + } + return 0; +} diff --git a/examples/03_arbitrary_large_input.i.c b/examples/03_arbitrary_large_input.i.c new file mode 100644 index 0000000..cd72624 --- /dev/null +++ b/examples/03_arbitrary_large_input.i.c @@ -0,0 +1,121 @@ +/* Generated by re2c */ +#include +#include + +#define YYMAXFILL 1 + +static const size_t SIZE = 16; + +struct input_t { + char buf[SIZE + YYMAXFILL]; + char *lim; + char *cur; + char *tok; + bool eof; + + input_t() + : buf() + , lim(buf + SIZE) + , cur(lim) + , tok(lim) + , eof(false) + {} + bool fill(size_t need) + { + if (eof) { + return false; + } + const size_t free = tok - buf; + if (free < need) { + return false; + } + memmove(buf, tok, lim - tok); + lim -= free; + cur -= free; + tok -= free; + lim += fread(lim, 1, free, stdin); + if (lim < buf + SIZE) { + eof = true; + memset(lim, 0, YYMAXFILL); + lim += YYMAXFILL; + } + return true; + } +}; + +static bool lex(input_t & in, unsigned int &count) +{ + for (count = 0;;) { + in.tok = in.cur; + +{ + char yych; + if (in.lim <= in.cur) if (!in.fill(1)) return false; + yych = *in.cur; + switch (yych) { + case 0x00: goto yy2; + case '\n': goto yy6; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy9; + default: goto yy4; + } +yy2: + ++in.cur; + { return YYMAXFILL == in.lim - in.tok; } +yy4: + ++in.cur; + { return false; } +yy6: + ++in.cur; + if (in.lim <= in.cur) if (!in.fill(1)) return false; + yych = *in.cur; + switch (yych) { + case '\n': goto yy6; + default: goto yy8; + } +yy8: + { continue; } +yy9: + ++in.cur; + if (in.lim <= in.cur) if (!in.fill(1)) return false; + yych = *in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy9; + default: goto yy11; + } +yy11: + { ++count; continue; } +} + + } +} + +int main() +{ + input_t in; + unsigned int count; + if (lex(in, count)) { + printf("glorious %u numbers!\n", count); + } else { + printf("error\n"); + } + + return 0; +} diff --git a/examples/03_arbitrary_large_input.i.re b/examples/03_arbitrary_large_input.i.re new file mode 100644 index 0000000..506ca41 --- /dev/null +++ b/examples/03_arbitrary_large_input.i.re @@ -0,0 +1,78 @@ +#include +#include + +/*!max:re2c*/ +static const size_t SIZE = 16; + +struct input_t { + char buf[SIZE + YYMAXFILL]; + char *lim; + char *cur; + char *tok; + bool eof; + + input_t() + : buf() + , lim(buf + SIZE) + , cur(lim) + , tok(lim) + , eof(false) + {} + bool fill(size_t need) + { + if (eof) { + return false; + } + const size_t free = tok - buf; + if (free < need) { + return false; + } + memmove(buf, tok, lim - tok); + lim -= free; + cur -= free; + tok -= free; + lim += fread(lim, 1, free, stdin); + if (lim < buf + SIZE) { + eof = true; + memset(lim, 0, YYMAXFILL); + lim += YYMAXFILL; + } + return true; + } +}; + +static bool lex(input_t & in, unsigned int &count) +{ + for (count = 0;;) { + in.tok = in.cur; + /*!re2c + re2c:define:YYCTYPE = char; + re2c:define:YYCURSOR = in.cur; + re2c:define:YYLIMIT = in.lim; + re2c:define:YYFILL = "if (!in.fill(@@)) return false;"; + re2c:define:YYFILL:naked = 1; + + end = "\x00"; + wsp = [\n]+; + num = [0-9]+; + + * { return false; } + end { return YYMAXFILL == in.lim - in.tok; } + wsp { continue; } + num { ++count; continue; } + */ + } +} + +int main() +{ + input_t in; + unsigned int count; + if (lex(in, count)) { + printf("glorious %u numbers!\n", count); + } else { + printf("error\n"); + } + + return 0; +} diff --git a/examples/04_parsing_integers_blocks.i.c b/examples/04_parsing_integers_blocks.i.c new file mode 100644 index 0000000..c635aa3 --- /dev/null +++ b/examples/04_parsing_integers_blocks.i.c @@ -0,0 +1,251 @@ +/* Generated by re2c */ +#include +#include + +template +static bool adddgt(unsigned long &u, unsigned int d) +{ + if (u > (ULONG_MAX - d) / base) { + return false; + } + u = u * base + d; + return true; +} + +static bool lex(const char *s, unsigned long &u) +{ + const char *YYMARKER; + const char *YYCTXMARKER; + u = 0; + + + + +{ + char yych; + yych = *s; + switch (yych) { + case '0': goto yy4; + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy6; + default: goto yy2; + } +yy2: + ++s; + { return false; } +yy4: + yych = *(YYMARKER = ++s); + switch (yych) { + case 'B': + case 'b': goto yy8; + case 'X': + case 'x': goto yy10; + default: goto yy5; + } +yy5: + { goto oct; } +yy6: + ++s; + s -= 1; + { goto dec; } +yy8: + yych = *++s; + switch (yych) { + case '0': + case '1': goto yy11; + default: goto yy9; + } +yy9: + s = YYMARKER; + goto yy5; +yy10: + yych = *++s; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy13; + default: goto yy9; + } +yy11: + ++s; + s -= 1; + { goto bin; } +yy13: + ++s; + s -= 1; + { goto hex; } +} + + +bin: + +{ + char yych; + yych = *s; + switch (yych) { + case 0x00: goto yy17; + case '0': + case '1': goto yy21; + default: goto yy19; + } +yy17: + ++s; + { return true; } +yy19: + ++s; + { return false; } +yy21: + ++s; + { if (!adddgt<2>(u, s[-1] - '0')) return false; goto bin; } +} + + +oct: + +{ + char yych; + yych = *s; + switch (yych) { + case 0x00: goto yy25; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': goto yy29; + default: goto yy27; + } +yy25: + ++s; + { return true; } +yy27: + ++s; + { return false; } +yy29: + ++s; + { if (!adddgt<8>(u, s[-1] - '0')) return false; goto oct; } +} + + +dec: + +{ + char yych; + yych = *s; + switch (yych) { + case 0x00: goto yy33; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy37; + default: goto yy35; + } +yy33: + ++s; + { return true; } +yy35: + ++s; + { return false; } +yy37: + ++s; + { if (!adddgt<10>(u, s[-1] - '0')) return false; goto dec; } +} + + +hex: + +{ + char yych; + yych = *s; + switch (yych) { + case 0x00: goto yy41; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy45; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': goto yy47; + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy49; + default: goto yy43; + } +yy41: + ++s; + { return true; } +yy43: + ++s; + { return false; } +yy45: + ++s; + { if (!adddgt<16>(u, s[-1] - '0')) return false; goto hex; } +yy47: + ++s; + { if (!adddgt<16>(u, s[-1] - 'A' + 10)) return false; goto hex; } +yy49: + ++s; + { if (!adddgt<16>(u, s[-1] - 'a' + 10)) return false; goto hex; } +} + +} + +int main(int argc, char **argv) +{ + for (int i = 1; i < argc; ++i) { + unsigned long u; + if (lex(argv[i], u)) { + printf("%lu\n", u); + } else { + printf("error\n"); + } + } + return 0; +} +re2c: warning: line 32: rule matches empty string [-Wmatch-empty-string] diff --git a/examples/04_parsing_integers_blocks.i.re b/examples/04_parsing_integers_blocks.i.re new file mode 100644 index 0000000..20bf9de --- /dev/null +++ b/examples/04_parsing_integers_blocks.i.re @@ -0,0 +1,78 @@ +#include +#include + +template +static bool adddgt(unsigned long &u, unsigned int d) +{ + if (u > (ULONG_MAX - d) / base) { + return false; + } + u = u * base + d; + return true; +} + +static bool lex(const char *s, unsigned long &u) +{ + const char *YYMARKER; + const char *YYCTXMARKER; + u = 0; + + /*!re2c + re2c:yyfill:enable = 0; + re2c:define:YYCTYPE = char; + re2c:define:YYCURSOR = s; + + end = "\x00"; + */ + + /*!re2c + * { return false; } + '0b' / [01] { goto bin; } + "0" { goto oct; } + "" / [1-9] { goto dec; } + '0x' / [0-9a-fA-F] { goto hex; } + */ + +bin: + /*!re2c + * { return false; } + end { return true; } + [01] { if (!adddgt<2>(u, s[-1] - '0')) return false; goto bin; } + */ + +oct: + /*!re2c + * { return false; } + end { return true; } + [0-7] { if (!adddgt<8>(u, s[-1] - '0')) return false; goto oct; } + */ + +dec: + /*!re2c + * { return false; } + end { return true; } + [0-9] { if (!adddgt<10>(u, s[-1] - '0')) return false; goto dec; } + */ + +hex: + /*!re2c + * { return false; } + end { return true; } + [0-9] { if (!adddgt<16>(u, s[-1] - '0')) return false; goto hex; } + [a-f] { if (!adddgt<16>(u, s[-1] - 'a' + 10)) return false; goto hex; } + [A-F] { if (!adddgt<16>(u, s[-1] - 'A' + 10)) return false; goto hex; } + */ +} + +int main(int argc, char **argv) +{ + for (int i = 1; i < argc; ++i) { + unsigned long u; + if (lex(argv[i], u)) { + printf("%lu\n", u); + } else { + printf("error\n"); + } + } + return 0; +} diff --git a/examples/05_parsing_integers_conditions.ci.c b/examples/05_parsing_integers_conditions.ci.c new file mode 100644 index 0000000..177f295 --- /dev/null +++ b/examples/05_parsing_integers_conditions.ci.c @@ -0,0 +1,251 @@ +/* Generated by re2c */ +#include +#include + +template +static bool adddgt(unsigned long &u, unsigned int d) +{ + if (u > (ULONG_MAX - d) / base) { + return false; + } + u = u * base + d; + return true; +} + +enum YYCONDTYPE { + yycinit, + yycbin, + yycdec, + yychex, + yycoct, +}; + + +static bool lex(const char *s, unsigned long &u) +{ + const char *YYMARKER; + const char *YYCTXMARKER; + int c = yycinit; + u = 0; + +{ + char yych; + switch (c) { + case yycinit: goto yyc_init; + case yycbin: goto yyc_bin; + case yycdec: goto yyc_dec; + case yychex: goto yyc_hex; + case yycoct: goto yyc_oct; + } +/* *********************************** */ +yyc_init: + yych = *s; + switch (yych) { + case '0': goto yy5; + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy7; + default: goto yy3; + } +yy3: + ++s; + { return false; } +yy5: + yych = *(YYMARKER = ++s); + switch (yych) { + case 'B': + case 'b': goto yy9; + case 'X': + case 'x': goto yy11; + default: goto yy6; + } +yy6: + c = yycoct; + goto yyc_oct; +yy7: + ++s; + s -= 1; + c = yycdec; + goto yyc_dec; +yy9: + yych = *++s; + switch (yych) { + case '0': + case '1': goto yy12; + default: goto yy10; + } +yy10: + s = YYMARKER; + goto yy6; +yy11: + yych = *++s; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy14; + default: goto yy10; + } +yy12: + ++s; + s -= 1; + c = yycbin; + goto yyc_bin; +yy14: + ++s; + s -= 1; + c = yychex; + goto yyc_hex; +/* *********************************** */ +yyc_bin: + yych = *s; + switch (yych) { + case 0x00: goto yy18; + case '0': + case '1': goto yy22; + default: goto yy20; + } +yy18: + ++s; + { return true; } +yy20: + ++s; + { return false; } +yy22: + ++s; + { if (!adddgt<2>(u, s[-1] - '0')) return false; goto yyc_bin; } +/* *********************************** */ +yyc_dec: + yych = *s; + switch (yych) { + case 0x00: goto yy26; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy30; + default: goto yy28; + } +yy26: + ++s; + { return true; } +yy28: + ++s; + { return false; } +yy30: + ++s; + { if (!adddgt<10>(u, s[-1] - '0')) return false; goto yyc_dec; } +/* *********************************** */ +yyc_hex: + yych = *s; + switch (yych) { + case 0x00: goto yy34; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy38; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': goto yy40; + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy42; + default: goto yy36; + } +yy34: + ++s; + { return true; } +yy36: + ++s; + { return false; } +yy38: + ++s; + { if (!adddgt<16>(u, s[-1] - '0')) return false; goto yyc_hex; } +yy40: + ++s; + { if (!adddgt<16>(u, s[-1] - 'A' + 10)) return false; goto yyc_hex; } +yy42: + ++s; + { if (!adddgt<16>(u, s[-1] - 'a' + 10)) return false; goto yyc_hex; } +/* *********************************** */ +yyc_oct: + yych = *s; + switch (yych) { + case 0x00: goto yy46; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': goto yy50; + default: goto yy48; + } +yy46: + ++s; + { return true; } +yy48: + ++s; + { return false; } +yy50: + ++s; + { if (!adddgt<8>(u, s[-1] - '0')) return false; goto yyc_oct; } +} + +} + +int main(int argc, char **argv) +{ + for (int i = 1; i < argc; ++i) { + unsigned long u; + if (lex(argv[i], u)) { + printf("%lu\n", u); + } else { + printf("error\n"); + } + } + return 0; +} +re2c: warning: line 35: rule in condition 'init' matches empty string [-Wmatch-empty-string] diff --git a/examples/05_parsing_integers_conditions.ci.re b/examples/05_parsing_integers_conditions.ci.re new file mode 100644 index 0000000..9fbc0fd --- /dev/null +++ b/examples/05_parsing_integers_conditions.ci.re @@ -0,0 +1,59 @@ +#include +#include + +template +static bool adddgt(unsigned long &u, unsigned int d) +{ + if (u > (ULONG_MAX - d) / base) { + return false; + } + u = u * base + d; + return true; +} + +/*!types:re2c*/ + +static bool lex(const char *s, unsigned long &u) +{ + const char *YYMARKER; + const char *YYCTXMARKER; + int c = yycinit; + u = 0; + /*!re2c + re2c:yyfill:enable = 0; + re2c:define:YYCTYPE = char; + re2c:define:YYCURSOR = s; + re2c:define:YYGETCONDITION = "c"; + re2c:define:YYGETCONDITION:naked = 1; + re2c:define:YYSETCONDITION = "c = @@;"; + re2c:define:YYSETCONDITION:naked = 1; + + <*> * { return false; } + + '0b' / [01] :=> bin + "0" :=> oct + "" / [1-9] :=> dec + '0x' / [0-9a-fA-F] :=> hex + + "\x00" { return true; } + [01] { if (!adddgt<2>(u, s[-1] - '0')) return false; goto yyc_bin; } + [0-7] { if (!adddgt<8>(u, s[-1] - '0')) return false; goto yyc_oct; } + [0-9] { if (!adddgt<10>(u, s[-1] - '0')) return false; goto yyc_dec; } + [0-9] { if (!adddgt<16>(u, s[-1] - '0')) return false; goto yyc_hex; } + [a-f] { if (!adddgt<16>(u, s[-1] - 'a' + 10)) return false; goto yyc_hex; } + [A-F] { if (!adddgt<16>(u, s[-1] - 'A' + 10)) return false; goto yyc_hex; } + */ +} + +int main(int argc, char **argv) +{ + for (int i = 1; i < argc; ++i) { + unsigned long u; + if (lex(argv[i], u)) { + printf("%lu\n", u); + } else { + printf("error\n"); + } + } + return 0; +} diff --git a/examples/06_braille.cr8i.c b/examples/06_braille.cr8i.c new file mode 100644 index 0000000..f2fe8ee --- /dev/null +++ b/examples/06_braille.cr8i.c @@ -0,0 +1,1701 @@ +/* Generated by re2c */ +#include +#include + +template +struct input_t { + size_t len; + char_t *str; + + input_t(FILE *f) : len(0), str(NULL) + { + fseek(f, 0, SEEK_END); + len = ftell(f) / sizeof(char_t); + fseek(f, 0, SEEK_SET); + str = new char_t[len + 1]; + fread(str, sizeof(char_t), len, f); + str[len] = 0; + } + ~input_t() + { + delete[]str; + } +}; + +typedef input_t iutf8_t; +typedef input_t iutf16_t; +typedef input_t iutf32_t; +typedef input_t iucs2_t; + +struct out_t { + bool caps; + + out_t() : caps(false) {} + void prt(char c) + { + printf("%c", caps ? toupper(c) : c); + caps = false; + } + void err() + { + printf(" ... error\n"); + } +}; + + + +enum YYCONDTYPE { + yycl, + yycn, +}; + + +static void lex_utf8(const iutf8_t & in) +{ + const unsigned char *YYCURSOR = in.str; + const unsigned char *YYMARKER; + int c = yycl; + out_t out; + +{ + unsigned char yych; + switch (c) { + case yycl: goto yyc_l; + case yycn: goto yyc_n; + } +/* *********************************** */ +yyc_l: + yych = *YYCURSOR; + switch (yych) { + case 0x00: goto yy3; + case '\n': goto yy7; + case ' ': goto yy9; + case 0xE2: goto yy11; + default: goto yy5; + } +yy3: + ++YYCURSOR; + { if (YYCURSOR != in.str + in.len + 1) out.err(); return; } +yy5: + ++YYCURSOR; +yy6: + { out.err(); return; } +yy7: + yych = *++YYCURSOR; + switch (yych) { + case '\r': goto yy12; + default: goto yy8; + } +yy8: + { out.prt('\n'); goto yyc_l; } +yy9: + ++YYCURSOR; + { out.prt(' '); goto yyc_l; } +yy11: + yych = *(YYMARKER = ++YYCURSOR); + switch (yych) { + case 0xA0: goto yy13; + default: goto yy6; + } +yy12: + ++YYCURSOR; + goto yy8; +yy13: + yych = *++YYCURSOR; + switch (yych) { + case 0x80: goto yy9; + case 0x81: goto yy15; + case 0x82: goto yy17; + case 0x83: goto yy19; + case 0x84: goto yy21; + case 0x85: goto yy23; + case 0x86: goto yy25; + case 0x87: goto yy27; + case 0x89: goto yy29; + case 0x8A: goto yy31; + case 0x8B: goto yy33; + case 0x8D: goto yy35; + case 0x8E: goto yy37; + case 0x8F: goto yy39; + case 0x91: goto yy41; + case 0x92: goto yy43; + case 0x93: goto yy45; + case 0x94: goto yy47; + case 0x95: goto yy49; + case 0x96: goto yy51; + case 0x97: goto yy53; + case 0x99: goto yy55; + case 0x9A: goto yy57; + case 0x9B: goto yy59; + case 0x9D: goto yy61; + case 0x9E: goto yy63; + case 0x9F: goto yy65; + case 0xA0: goto yy67; + case 0xA4: goto yy69; + case 0xA5: goto yy71; + case 0xA6: goto yy73; + case 0xA7: goto yy75; + case 0xAD: goto yy77; + case 0xB0: goto yy79; + case 0xB2: goto yy81; + case 0xB5: goto yy83; + case 0xBA: goto yy85; + case 0xBC: goto yy87; + case 0xBD: goto yy89; + default: goto yy14; + } +yy14: + YYCURSOR = YYMARKER; + goto yy6; +yy15: + ++YYCURSOR; + { out.prt('a'); goto yyc_l; } +yy17: + ++YYCURSOR; + { out.prt(','); goto yyc_l; } +yy19: + ++YYCURSOR; + { out.prt('b'); goto yyc_l; } +yy21: + ++YYCURSOR; + { out.prt('\''); goto yyc_l; } +yy23: + ++YYCURSOR; + { out.prt('k'); goto yyc_l; } +yy25: + ++YYCURSOR; + { out.prt(';'); goto yyc_l; } +yy27: + ++YYCURSOR; + { out.prt('l'); goto yyc_l; } +yy29: + ++YYCURSOR; + { out.prt('c'); goto yyc_l; } +yy31: + ++YYCURSOR; + { out.prt('i'); goto yyc_l; } +yy33: + ++YYCURSOR; + { out.prt('f'); goto yyc_l; } +yy35: + ++YYCURSOR; + { out.prt('m'); goto yyc_l; } +yy37: + ++YYCURSOR; + { out.prt('s'); goto yyc_l; } +yy39: + ++YYCURSOR; + { out.prt('p'); goto yyc_l; } +yy41: + ++YYCURSOR; + { out.prt('e'); goto yyc_l; } +yy43: + ++YYCURSOR; + { out.prt(':'); goto yyc_l; } +yy45: + ++YYCURSOR; + { out.prt('h'); goto yyc_l; } +yy47: + ++YYCURSOR; + { out.prt('*'); goto yyc_l; } +yy49: + ++YYCURSOR; + { out.prt('o'); goto yyc_l; } +yy51: + ++YYCURSOR; + { out.prt('!'); goto yyc_l; } +yy53: + ++YYCURSOR; + { out.prt('r'); goto yyc_l; } +yy55: + ++YYCURSOR; + { out.prt('d'); goto yyc_l; } +yy57: + ++YYCURSOR; + { out.prt('j'); goto yyc_l; } +yy59: + ++YYCURSOR; + { out.prt('g'); goto yyc_l; } +yy61: + ++YYCURSOR; + { out.prt('n'); goto yyc_l; } +yy63: + ++YYCURSOR; + { out.prt('t'); goto yyc_l; } +yy65: + ++YYCURSOR; + { out.prt('q'); goto yyc_l; } +yy67: + ++YYCURSOR; + { out.caps = true; goto yyc_l; } +yy69: + ++YYCURSOR; + { out.prt('-'); goto yyc_l; } +yy71: + ++YYCURSOR; + { out.prt('u'); goto yyc_l; } +yy73: + ++YYCURSOR; + { out.prt('?'); goto yyc_l; } +yy75: + ++YYCURSOR; + { out.prt('v'); goto yyc_l; } +yy77: + ++YYCURSOR; + { out.prt('x'); goto yyc_l; } +yy79: + ++YYCURSOR; + goto yyc_l; +yy81: + ++YYCURSOR; + { out.prt('.'); goto yyc_l; } +yy83: + ++YYCURSOR; + { out.prt('z'); goto yyc_l; } +yy85: + ++YYCURSOR; + { out.prt('w'); goto yyc_l; } +yy87: + ++YYCURSOR; + c = yycn; + goto yyc_n; +yy89: + ++YYCURSOR; + { out.prt('y'); goto yyc_l; } +/* *********************************** */ +yyc_n: + yych = *YYCURSOR; + switch (yych) { + case 0x00: goto yy93; + case '\n': goto yy97; + case ' ': goto yy99; + case 0xE2: goto yy101; + default: goto yy95; + } +yy93: + ++YYCURSOR; + { if (YYCURSOR != in.str + in.len + 1) out.err(); return; } +yy95: + ++YYCURSOR; +yy96: + { out.err(); return; } +yy97: + yych = *++YYCURSOR; + switch (yych) { + case '\r': goto yy102; + default: goto yy98; + } +yy98: + { out.prt('\n'); goto yyc_l; } +yy99: + ++YYCURSOR; + { out.prt(' '); goto yyc_l; } +yy101: + yych = *(YYMARKER = ++YYCURSOR); + switch (yych) { + case 0xA0: goto yy103; + default: goto yy96; + } +yy102: + ++YYCURSOR; + goto yy98; +yy103: + yych = *++YYCURSOR; + switch (yych) { + case 0x80: goto yy99; + case 0x81: goto yy105; + case 0x82: goto yy107; + case 0x83: goto yy109; + case 0x84: goto yy111; + case 0x86: goto yy113; + case 0x89: goto yy115; + case 0x8A: goto yy117; + case 0x8B: goto yy119; + case 0x91: goto yy121; + case 0x92: goto yy123; + case 0x93: goto yy125; + case 0x94: goto yy127; + case 0x96: goto yy129; + case 0x99: goto yy131; + case 0x9A: goto yy133; + case 0x9B: goto yy135; + case 0xA0: goto yy137; + case 0xA4: goto yy139; + case 0xA6: goto yy141; + case 0xB0: goto yy143; + case 0xB2: goto yy145; + case 0xBC: goto yy147; + default: goto yy104; + } +yy104: + YYCURSOR = YYMARKER; + goto yy96; +yy105: + ++YYCURSOR; + { out.prt('1'); goto yyc_n; } +yy107: + ++YYCURSOR; + { out.prt(','); goto yyc_l; } +yy109: + ++YYCURSOR; + { out.prt('2'); goto yyc_n; } +yy111: + ++YYCURSOR; + { out.prt('\''); goto yyc_l; } +yy113: + ++YYCURSOR; + { out.prt(';'); goto yyc_l; } +yy115: + ++YYCURSOR; + { out.prt('3'); goto yyc_n; } +yy117: + ++YYCURSOR; + { out.prt('9'); goto yyc_n; } +yy119: + ++YYCURSOR; + { out.prt('6'); goto yyc_n; } +yy121: + ++YYCURSOR; + { out.prt('5'); goto yyc_n; } +yy123: + ++YYCURSOR; + { out.prt(':'); goto yyc_l; } +yy125: + ++YYCURSOR; + { out.prt('8'); goto yyc_n; } +yy127: + ++YYCURSOR; + { out.prt('*'); goto yyc_l; } +yy129: + ++YYCURSOR; + { out.prt('!'); goto yyc_l; } +yy131: + ++YYCURSOR; + { out.prt('4'); goto yyc_n; } +yy133: + ++YYCURSOR; + { out.prt('0'); goto yyc_n; } +yy135: + ++YYCURSOR; + { out.prt('7'); goto yyc_n; } +yy137: + ++YYCURSOR; + { out.caps = true; goto yyc_l; } +yy139: + ++YYCURSOR; + { out.prt('-'); goto yyc_l; } +yy141: + ++YYCURSOR; + { out.prt('?'); goto yyc_l; } +yy143: + ++YYCURSOR; + c = yycl; + goto yyc_l; +yy145: + ++YYCURSOR; + { out.prt('.'); goto yyc_l; } +yy147: + ++YYCURSOR; + goto yyc_n; +} + +} + +static void lex_utf16(const iutf16_t & in) +{ + const unsigned short *YYCURSOR = in.str; + int c = yycl; + out_t out; + +{ + unsigned int yych; + if (c < 1) { + goto yyc_l; + } else { + goto yyc_n; + } +/* *********************************** */ +yyc_l: + yych = *YYCURSOR; + if (yych <= 0x2816) { + if (yych <= 0x2807) { + if (yych <= 0x2800) { + if (yych <= '\n') { + if (yych <= 0x0000) goto yy3; + if (yych <= '\t') goto yy5; + goto yy7; + } else { + if (yych == ' ') goto yy9; + if (yych <= 0x27FF) goto yy5; + goto yy9; + } + } else { + if (yych <= 0x2803) { + if (yych <= 0x2801) goto yy11; + if (yych <= 0x2802) goto yy13; + goto yy15; + } else { + if (yych <= 0x2804) goto yy17; + if (yych <= 0x2805) goto yy19; + if (yych <= 0x2806) goto yy21; + goto yy23; + } + } + } else { + if (yych <= 0x280E) { + if (yych <= 0x280A) { + if (yych <= 0x2808) goto yy5; + if (yych <= 0x2809) goto yy25; + goto yy27; + } else { + if (yych <= 0x280B) goto yy29; + if (yych <= 0x280C) goto yy5; + if (yych <= 0x280D) goto yy31; + goto yy33; + } + } else { + if (yych <= 0x2812) { + if (yych <= 0x280F) goto yy35; + if (yych <= 0x2810) goto yy5; + if (yych <= 0x2811) goto yy37; + goto yy39; + } else { + if (yych <= 0x2813) goto yy41; + if (yych <= 0x2814) goto yy43; + if (yych <= 0x2815) goto yy45; + goto yy47; + } + } + } + } else { + if (yych <= 0x2826) { + if (yych <= 0x281D) { + if (yych <= 0x2819) { + if (yych <= 0x2817) goto yy49; + if (yych <= 0x2818) goto yy5; + goto yy51; + } else { + if (yych <= 0x281A) goto yy53; + if (yych <= 0x281B) goto yy55; + if (yych <= 0x281C) goto yy5; + goto yy57; + } + } else { + if (yych <= 0x2820) { + if (yych <= 0x281E) goto yy59; + if (yych <= 0x281F) goto yy61; + goto yy63; + } else { + if (yych <= 0x2823) goto yy5; + if (yych <= 0x2824) goto yy65; + if (yych <= 0x2825) goto yy67; + goto yy69; + } + } + } else { + if (yych <= 0x2832) { + if (yych <= 0x282D) { + if (yych <= 0x2827) goto yy71; + if (yych <= 0x282C) goto yy5; + goto yy73; + } else { + if (yych == 0x2830) goto yy75; + if (yych <= 0x2831) goto yy5; + goto yy77; + } + } else { + if (yych <= 0x283A) { + if (yych == 0x2835) goto yy79; + if (yych <= 0x2839) goto yy5; + goto yy81; + } else { + if (yych <= 0x283B) goto yy5; + if (yych <= 0x283C) goto yy83; + if (yych <= 0x283D) goto yy85; + goto yy5; + } + } + } + } +yy3: + ++YYCURSOR; + { if (YYCURSOR != in.str + in.len + 1) out.err(); return; } +yy5: + ++YYCURSOR; + { out.err(); return; } +yy7: + yych = *++YYCURSOR; + if (yych == '\r') goto yy87; +yy8: + { out.prt('\n'); goto yyc_l; } +yy9: + ++YYCURSOR; + { out.prt(' '); goto yyc_l; } +yy11: + ++YYCURSOR; + { out.prt('a'); goto yyc_l; } +yy13: + ++YYCURSOR; + { out.prt(','); goto yyc_l; } +yy15: + ++YYCURSOR; + { out.prt('b'); goto yyc_l; } +yy17: + ++YYCURSOR; + { out.prt('\''); goto yyc_l; } +yy19: + ++YYCURSOR; + { out.prt('k'); goto yyc_l; } +yy21: + ++YYCURSOR; + { out.prt(';'); goto yyc_l; } +yy23: + ++YYCURSOR; + { out.prt('l'); goto yyc_l; } +yy25: + ++YYCURSOR; + { out.prt('c'); goto yyc_l; } +yy27: + ++YYCURSOR; + { out.prt('i'); goto yyc_l; } +yy29: + ++YYCURSOR; + { out.prt('f'); goto yyc_l; } +yy31: + ++YYCURSOR; + { out.prt('m'); goto yyc_l; } +yy33: + ++YYCURSOR; + { out.prt('s'); goto yyc_l; } +yy35: + ++YYCURSOR; + { out.prt('p'); goto yyc_l; } +yy37: + ++YYCURSOR; + { out.prt('e'); goto yyc_l; } +yy39: + ++YYCURSOR; + { out.prt(':'); goto yyc_l; } +yy41: + ++YYCURSOR; + { out.prt('h'); goto yyc_l; } +yy43: + ++YYCURSOR; + { out.prt('*'); goto yyc_l; } +yy45: + ++YYCURSOR; + { out.prt('o'); goto yyc_l; } +yy47: + ++YYCURSOR; + { out.prt('!'); goto yyc_l; } +yy49: + ++YYCURSOR; + { out.prt('r'); goto yyc_l; } +yy51: + ++YYCURSOR; + { out.prt('d'); goto yyc_l; } +yy53: + ++YYCURSOR; + { out.prt('j'); goto yyc_l; } +yy55: + ++YYCURSOR; + { out.prt('g'); goto yyc_l; } +yy57: + ++YYCURSOR; + { out.prt('n'); goto yyc_l; } +yy59: + ++YYCURSOR; + { out.prt('t'); goto yyc_l; } +yy61: + ++YYCURSOR; + { out.prt('q'); goto yyc_l; } +yy63: + ++YYCURSOR; + { out.caps = true; goto yyc_l; } +yy65: + ++YYCURSOR; + { out.prt('-'); goto yyc_l; } +yy67: + ++YYCURSOR; + { out.prt('u'); goto yyc_l; } +yy69: + ++YYCURSOR; + { out.prt('?'); goto yyc_l; } +yy71: + ++YYCURSOR; + { out.prt('v'); goto yyc_l; } +yy73: + ++YYCURSOR; + { out.prt('x'); goto yyc_l; } +yy75: + ++YYCURSOR; + goto yyc_l; +yy77: + ++YYCURSOR; + { out.prt('.'); goto yyc_l; } +yy79: + ++YYCURSOR; + { out.prt('z'); goto yyc_l; } +yy81: + ++YYCURSOR; + { out.prt('w'); goto yyc_l; } +yy83: + ++YYCURSOR; + c = yycn; + goto yyc_n; +yy85: + ++YYCURSOR; + { out.prt('y'); goto yyc_l; } +yy87: + ++YYCURSOR; + goto yy8; +/* *********************************** */ +yyc_n: + yych = *YYCURSOR; + if (yych <= 0x2812) { + if (yych <= 0x2803) { + if (yych <= ' ') { + if (yych <= '\t') { + if (yych >= 0x0001) goto yy92; + } else { + if (yych <= '\n') goto yy94; + if (yych <= 0x001F) goto yy92; + goto yy96; + } + } else { + if (yych <= 0x2800) { + if (yych <= 0x27FF) goto yy92; + goto yy96; + } else { + if (yych <= 0x2801) goto yy98; + if (yych <= 0x2802) goto yy100; + goto yy102; + } + } + } else { + if (yych <= 0x2809) { + if (yych <= 0x2805) { + if (yych <= 0x2804) goto yy104; + goto yy92; + } else { + if (yych <= 0x2806) goto yy106; + if (yych <= 0x2808) goto yy92; + goto yy108; + } + } else { + if (yych <= 0x280B) { + if (yych <= 0x280A) goto yy110; + goto yy112; + } else { + if (yych <= 0x2810) goto yy92; + if (yych <= 0x2811) goto yy114; + goto yy116; + } + } + } + } else { + if (yych <= 0x2820) { + if (yych <= 0x2818) { + if (yych <= 0x2814) { + if (yych <= 0x2813) goto yy118; + goto yy120; + } else { + if (yych == 0x2816) goto yy122; + goto yy92; + } + } else { + if (yych <= 0x281A) { + if (yych <= 0x2819) goto yy124; + goto yy126; + } else { + if (yych <= 0x281B) goto yy128; + if (yych <= 0x281F) goto yy92; + goto yy130; + } + } + } else { + if (yych <= 0x282F) { + if (yych <= 0x2824) { + if (yych <= 0x2823) goto yy92; + goto yy132; + } else { + if (yych == 0x2826) goto yy134; + goto yy92; + } + } else { + if (yych <= 0x2832) { + if (yych <= 0x2830) goto yy136; + if (yych <= 0x2831) goto yy92; + goto yy138; + } else { + if (yych == 0x283C) goto yy140; + goto yy92; + } + } + } + } + ++YYCURSOR; + { if (YYCURSOR != in.str + in.len + 1) out.err(); return; } +yy92: + ++YYCURSOR; + { out.err(); return; } +yy94: + yych = *++YYCURSOR; + if (yych == '\r') goto yy142; +yy95: + { out.prt('\n'); goto yyc_l; } +yy96: + ++YYCURSOR; + { out.prt(' '); goto yyc_l; } +yy98: + ++YYCURSOR; + { out.prt('1'); goto yyc_n; } +yy100: + ++YYCURSOR; + { out.prt(','); goto yyc_l; } +yy102: + ++YYCURSOR; + { out.prt('2'); goto yyc_n; } +yy104: + ++YYCURSOR; + { out.prt('\''); goto yyc_l; } +yy106: + ++YYCURSOR; + { out.prt(';'); goto yyc_l; } +yy108: + ++YYCURSOR; + { out.prt('3'); goto yyc_n; } +yy110: + ++YYCURSOR; + { out.prt('9'); goto yyc_n; } +yy112: + ++YYCURSOR; + { out.prt('6'); goto yyc_n; } +yy114: + ++YYCURSOR; + { out.prt('5'); goto yyc_n; } +yy116: + ++YYCURSOR; + { out.prt(':'); goto yyc_l; } +yy118: + ++YYCURSOR; + { out.prt('8'); goto yyc_n; } +yy120: + ++YYCURSOR; + { out.prt('*'); goto yyc_l; } +yy122: + ++YYCURSOR; + { out.prt('!'); goto yyc_l; } +yy124: + ++YYCURSOR; + { out.prt('4'); goto yyc_n; } +yy126: + ++YYCURSOR; + { out.prt('0'); goto yyc_n; } +yy128: + ++YYCURSOR; + { out.prt('7'); goto yyc_n; } +yy130: + ++YYCURSOR; + { out.caps = true; goto yyc_l; } +yy132: + ++YYCURSOR; + { out.prt('-'); goto yyc_l; } +yy134: + ++YYCURSOR; + { out.prt('?'); goto yyc_l; } +yy136: + ++YYCURSOR; + c = yycl; + goto yyc_l; +yy138: + ++YYCURSOR; + { out.prt('.'); goto yyc_l; } +yy140: + ++YYCURSOR; + goto yyc_n; +yy142: + ++YYCURSOR; + goto yy95; +} + +} + +static void lex_utf32(const iutf32_t & in) +{ + const unsigned int *YYCURSOR = in.str; + int c = yycl; + out_t out; + +{ + unsigned int yych; + if (c < 1) { + goto yyc_l; + } else { + goto yyc_n; + } +/* *********************************** */ +yyc_l: + yych = *YYCURSOR; + if (yych <= 0x00002816) { + if (yych <= 0x00002807) { + if (yych <= 0x00002800) { + if (yych <= '\n') { + if (yych <= 0x00000000) goto yy3; + if (yych <= '\t') goto yy5; + goto yy7; + } else { + if (yych == ' ') goto yy9; + if (yych <= 0x000027FF) goto yy5; + goto yy9; + } + } else { + if (yych <= 0x00002803) { + if (yych <= 0x00002801) goto yy11; + if (yych <= 0x00002802) goto yy13; + goto yy15; + } else { + if (yych <= 0x00002804) goto yy17; + if (yych <= 0x00002805) goto yy19; + if (yych <= 0x00002806) goto yy21; + goto yy23; + } + } + } else { + if (yych <= 0x0000280E) { + if (yych <= 0x0000280A) { + if (yych <= 0x00002808) goto yy5; + if (yych <= 0x00002809) goto yy25; + goto yy27; + } else { + if (yych <= 0x0000280B) goto yy29; + if (yych <= 0x0000280C) goto yy5; + if (yych <= 0x0000280D) goto yy31; + goto yy33; + } + } else { + if (yych <= 0x00002812) { + if (yych <= 0x0000280F) goto yy35; + if (yych <= 0x00002810) goto yy5; + if (yych <= 0x00002811) goto yy37; + goto yy39; + } else { + if (yych <= 0x00002813) goto yy41; + if (yych <= 0x00002814) goto yy43; + if (yych <= 0x00002815) goto yy45; + goto yy47; + } + } + } + } else { + if (yych <= 0x00002826) { + if (yych <= 0x0000281D) { + if (yych <= 0x00002819) { + if (yych <= 0x00002817) goto yy49; + if (yych <= 0x00002818) goto yy5; + goto yy51; + } else { + if (yych <= 0x0000281A) goto yy53; + if (yych <= 0x0000281B) goto yy55; + if (yych <= 0x0000281C) goto yy5; + goto yy57; + } + } else { + if (yych <= 0x00002820) { + if (yych <= 0x0000281E) goto yy59; + if (yych <= 0x0000281F) goto yy61; + goto yy63; + } else { + if (yych <= 0x00002823) goto yy5; + if (yych <= 0x00002824) goto yy65; + if (yych <= 0x00002825) goto yy67; + goto yy69; + } + } + } else { + if (yych <= 0x00002832) { + if (yych <= 0x0000282D) { + if (yych <= 0x00002827) goto yy71; + if (yych <= 0x0000282C) goto yy5; + goto yy73; + } else { + if (yych == 0x00002830) goto yy75; + if (yych <= 0x00002831) goto yy5; + goto yy77; + } + } else { + if (yych <= 0x0000283A) { + if (yych == 0x00002835) goto yy79; + if (yych <= 0x00002839) goto yy5; + goto yy81; + } else { + if (yych <= 0x0000283B) goto yy5; + if (yych <= 0x0000283C) goto yy83; + if (yych <= 0x0000283D) goto yy85; + goto yy5; + } + } + } + } +yy3: + ++YYCURSOR; + { if (YYCURSOR != in.str + in.len + 1) out.err(); return; } +yy5: + ++YYCURSOR; + { out.err(); return; } +yy7: + yych = *++YYCURSOR; + if (yych == '\r') goto yy87; +yy8: + { out.prt('\n'); goto yyc_l; } +yy9: + ++YYCURSOR; + { out.prt(' '); goto yyc_l; } +yy11: + ++YYCURSOR; + { out.prt('a'); goto yyc_l; } +yy13: + ++YYCURSOR; + { out.prt(','); goto yyc_l; } +yy15: + ++YYCURSOR; + { out.prt('b'); goto yyc_l; } +yy17: + ++YYCURSOR; + { out.prt('\''); goto yyc_l; } +yy19: + ++YYCURSOR; + { out.prt('k'); goto yyc_l; } +yy21: + ++YYCURSOR; + { out.prt(';'); goto yyc_l; } +yy23: + ++YYCURSOR; + { out.prt('l'); goto yyc_l; } +yy25: + ++YYCURSOR; + { out.prt('c'); goto yyc_l; } +yy27: + ++YYCURSOR; + { out.prt('i'); goto yyc_l; } +yy29: + ++YYCURSOR; + { out.prt('f'); goto yyc_l; } +yy31: + ++YYCURSOR; + { out.prt('m'); goto yyc_l; } +yy33: + ++YYCURSOR; + { out.prt('s'); goto yyc_l; } +yy35: + ++YYCURSOR; + { out.prt('p'); goto yyc_l; } +yy37: + ++YYCURSOR; + { out.prt('e'); goto yyc_l; } +yy39: + ++YYCURSOR; + { out.prt(':'); goto yyc_l; } +yy41: + ++YYCURSOR; + { out.prt('h'); goto yyc_l; } +yy43: + ++YYCURSOR; + { out.prt('*'); goto yyc_l; } +yy45: + ++YYCURSOR; + { out.prt('o'); goto yyc_l; } +yy47: + ++YYCURSOR; + { out.prt('!'); goto yyc_l; } +yy49: + ++YYCURSOR; + { out.prt('r'); goto yyc_l; } +yy51: + ++YYCURSOR; + { out.prt('d'); goto yyc_l; } +yy53: + ++YYCURSOR; + { out.prt('j'); goto yyc_l; } +yy55: + ++YYCURSOR; + { out.prt('g'); goto yyc_l; } +yy57: + ++YYCURSOR; + { out.prt('n'); goto yyc_l; } +yy59: + ++YYCURSOR; + { out.prt('t'); goto yyc_l; } +yy61: + ++YYCURSOR; + { out.prt('q'); goto yyc_l; } +yy63: + ++YYCURSOR; + { out.caps = true; goto yyc_l; } +yy65: + ++YYCURSOR; + { out.prt('-'); goto yyc_l; } +yy67: + ++YYCURSOR; + { out.prt('u'); goto yyc_l; } +yy69: + ++YYCURSOR; + { out.prt('?'); goto yyc_l; } +yy71: + ++YYCURSOR; + { out.prt('v'); goto yyc_l; } +yy73: + ++YYCURSOR; + { out.prt('x'); goto yyc_l; } +yy75: + ++YYCURSOR; + goto yyc_l; +yy77: + ++YYCURSOR; + { out.prt('.'); goto yyc_l; } +yy79: + ++YYCURSOR; + { out.prt('z'); goto yyc_l; } +yy81: + ++YYCURSOR; + { out.prt('w'); goto yyc_l; } +yy83: + ++YYCURSOR; + c = yycn; + goto yyc_n; +yy85: + ++YYCURSOR; + { out.prt('y'); goto yyc_l; } +yy87: + ++YYCURSOR; + goto yy8; +/* *********************************** */ +yyc_n: + yych = *YYCURSOR; + if (yych <= 0x00002812) { + if (yych <= 0x00002803) { + if (yych <= ' ') { + if (yych <= '\t') { + if (yych >= 0x00000001) goto yy92; + } else { + if (yych <= '\n') goto yy94; + if (yych <= 0x0000001F) goto yy92; + goto yy96; + } + } else { + if (yych <= 0x00002800) { + if (yych <= 0x000027FF) goto yy92; + goto yy96; + } else { + if (yych <= 0x00002801) goto yy98; + if (yych <= 0x00002802) goto yy100; + goto yy102; + } + } + } else { + if (yych <= 0x00002809) { + if (yych <= 0x00002805) { + if (yych <= 0x00002804) goto yy104; + goto yy92; + } else { + if (yych <= 0x00002806) goto yy106; + if (yych <= 0x00002808) goto yy92; + goto yy108; + } + } else { + if (yych <= 0x0000280B) { + if (yych <= 0x0000280A) goto yy110; + goto yy112; + } else { + if (yych <= 0x00002810) goto yy92; + if (yych <= 0x00002811) goto yy114; + goto yy116; + } + } + } + } else { + if (yych <= 0x00002820) { + if (yych <= 0x00002818) { + if (yych <= 0x00002814) { + if (yych <= 0x00002813) goto yy118; + goto yy120; + } else { + if (yych == 0x00002816) goto yy122; + goto yy92; + } + } else { + if (yych <= 0x0000281A) { + if (yych <= 0x00002819) goto yy124; + goto yy126; + } else { + if (yych <= 0x0000281B) goto yy128; + if (yych <= 0x0000281F) goto yy92; + goto yy130; + } + } + } else { + if (yych <= 0x0000282F) { + if (yych <= 0x00002824) { + if (yych <= 0x00002823) goto yy92; + goto yy132; + } else { + if (yych == 0x00002826) goto yy134; + goto yy92; + } + } else { + if (yych <= 0x00002832) { + if (yych <= 0x00002830) goto yy136; + if (yych <= 0x00002831) goto yy92; + goto yy138; + } else { + if (yych == 0x0000283C) goto yy140; + goto yy92; + } + } + } + } + ++YYCURSOR; + { if (YYCURSOR != in.str + in.len + 1) out.err(); return; } +yy92: + ++YYCURSOR; + { out.err(); return; } +yy94: + yych = *++YYCURSOR; + if (yych == '\r') goto yy142; +yy95: + { out.prt('\n'); goto yyc_l; } +yy96: + ++YYCURSOR; + { out.prt(' '); goto yyc_l; } +yy98: + ++YYCURSOR; + { out.prt('1'); goto yyc_n; } +yy100: + ++YYCURSOR; + { out.prt(','); goto yyc_l; } +yy102: + ++YYCURSOR; + { out.prt('2'); goto yyc_n; } +yy104: + ++YYCURSOR; + { out.prt('\''); goto yyc_l; } +yy106: + ++YYCURSOR; + { out.prt(';'); goto yyc_l; } +yy108: + ++YYCURSOR; + { out.prt('3'); goto yyc_n; } +yy110: + ++YYCURSOR; + { out.prt('9'); goto yyc_n; } +yy112: + ++YYCURSOR; + { out.prt('6'); goto yyc_n; } +yy114: + ++YYCURSOR; + { out.prt('5'); goto yyc_n; } +yy116: + ++YYCURSOR; + { out.prt(':'); goto yyc_l; } +yy118: + ++YYCURSOR; + { out.prt('8'); goto yyc_n; } +yy120: + ++YYCURSOR; + { out.prt('*'); goto yyc_l; } +yy122: + ++YYCURSOR; + { out.prt('!'); goto yyc_l; } +yy124: + ++YYCURSOR; + { out.prt('4'); goto yyc_n; } +yy126: + ++YYCURSOR; + { out.prt('0'); goto yyc_n; } +yy128: + ++YYCURSOR; + { out.prt('7'); goto yyc_n; } +yy130: + ++YYCURSOR; + { out.caps = true; goto yyc_l; } +yy132: + ++YYCURSOR; + { out.prt('-'); goto yyc_l; } +yy134: + ++YYCURSOR; + { out.prt('?'); goto yyc_l; } +yy136: + ++YYCURSOR; + c = yycl; + goto yyc_l; +yy138: + ++YYCURSOR; + { out.prt('.'); goto yyc_l; } +yy140: + ++YYCURSOR; + goto yyc_n; +yy142: + ++YYCURSOR; + goto yy95; +} + +} + +static void lex_ucs2(const iucs2_t & in) +{ + const unsigned short *YYCURSOR = in.str; + int c = yycl; + out_t out; + +{ + unsigned int yych; + if (c < 1) { + goto yyc_l; + } else { + goto yyc_n; + } +/* *********************************** */ +yyc_l: + yych = *YYCURSOR; + if (yych <= 0x2816) { + if (yych <= 0x2807) { + if (yych <= 0x2800) { + if (yych <= '\n') { + if (yych <= 0x0000) goto yy3; + if (yych <= '\t') goto yy5; + goto yy7; + } else { + if (yych == ' ') goto yy9; + if (yych <= 0x27FF) goto yy5; + goto yy9; + } + } else { + if (yych <= 0x2803) { + if (yych <= 0x2801) goto yy11; + if (yych <= 0x2802) goto yy13; + goto yy15; + } else { + if (yych <= 0x2804) goto yy17; + if (yych <= 0x2805) goto yy19; + if (yych <= 0x2806) goto yy21; + goto yy23; + } + } + } else { + if (yych <= 0x280E) { + if (yych <= 0x280A) { + if (yych <= 0x2808) goto yy5; + if (yych <= 0x2809) goto yy25; + goto yy27; + } else { + if (yych <= 0x280B) goto yy29; + if (yych <= 0x280C) goto yy5; + if (yych <= 0x280D) goto yy31; + goto yy33; + } + } else { + if (yych <= 0x2812) { + if (yych <= 0x280F) goto yy35; + if (yych <= 0x2810) goto yy5; + if (yych <= 0x2811) goto yy37; + goto yy39; + } else { + if (yych <= 0x2813) goto yy41; + if (yych <= 0x2814) goto yy43; + if (yych <= 0x2815) goto yy45; + goto yy47; + } + } + } + } else { + if (yych <= 0x2826) { + if (yych <= 0x281D) { + if (yych <= 0x2819) { + if (yych <= 0x2817) goto yy49; + if (yych <= 0x2818) goto yy5; + goto yy51; + } else { + if (yych <= 0x281A) goto yy53; + if (yych <= 0x281B) goto yy55; + if (yych <= 0x281C) goto yy5; + goto yy57; + } + } else { + if (yych <= 0x2820) { + if (yych <= 0x281E) goto yy59; + if (yych <= 0x281F) goto yy61; + goto yy63; + } else { + if (yych <= 0x2823) goto yy5; + if (yych <= 0x2824) goto yy65; + if (yych <= 0x2825) goto yy67; + goto yy69; + } + } + } else { + if (yych <= 0x2832) { + if (yych <= 0x282D) { + if (yych <= 0x2827) goto yy71; + if (yych <= 0x282C) goto yy5; + goto yy73; + } else { + if (yych == 0x2830) goto yy75; + if (yych <= 0x2831) goto yy5; + goto yy77; + } + } else { + if (yych <= 0x283A) { + if (yych == 0x2835) goto yy79; + if (yych <= 0x2839) goto yy5; + goto yy81; + } else { + if (yych <= 0x283B) goto yy5; + if (yych <= 0x283C) goto yy83; + if (yych <= 0x283D) goto yy85; + goto yy5; + } + } + } + } +yy3: + ++YYCURSOR; + { if (YYCURSOR != in.str + in.len + 1) out.err(); return; } +yy5: + ++YYCURSOR; + { out.err(); return; } +yy7: + yych = *++YYCURSOR; + if (yych == '\r') goto yy87; +yy8: + { out.prt('\n'); goto yyc_l; } +yy9: + ++YYCURSOR; + { out.prt(' '); goto yyc_l; } +yy11: + ++YYCURSOR; + { out.prt('a'); goto yyc_l; } +yy13: + ++YYCURSOR; + { out.prt(','); goto yyc_l; } +yy15: + ++YYCURSOR; + { out.prt('b'); goto yyc_l; } +yy17: + ++YYCURSOR; + { out.prt('\''); goto yyc_l; } +yy19: + ++YYCURSOR; + { out.prt('k'); goto yyc_l; } +yy21: + ++YYCURSOR; + { out.prt(';'); goto yyc_l; } +yy23: + ++YYCURSOR; + { out.prt('l'); goto yyc_l; } +yy25: + ++YYCURSOR; + { out.prt('c'); goto yyc_l; } +yy27: + ++YYCURSOR; + { out.prt('i'); goto yyc_l; } +yy29: + ++YYCURSOR; + { out.prt('f'); goto yyc_l; } +yy31: + ++YYCURSOR; + { out.prt('m'); goto yyc_l; } +yy33: + ++YYCURSOR; + { out.prt('s'); goto yyc_l; } +yy35: + ++YYCURSOR; + { out.prt('p'); goto yyc_l; } +yy37: + ++YYCURSOR; + { out.prt('e'); goto yyc_l; } +yy39: + ++YYCURSOR; + { out.prt(':'); goto yyc_l; } +yy41: + ++YYCURSOR; + { out.prt('h'); goto yyc_l; } +yy43: + ++YYCURSOR; + { out.prt('*'); goto yyc_l; } +yy45: + ++YYCURSOR; + { out.prt('o'); goto yyc_l; } +yy47: + ++YYCURSOR; + { out.prt('!'); goto yyc_l; } +yy49: + ++YYCURSOR; + { out.prt('r'); goto yyc_l; } +yy51: + ++YYCURSOR; + { out.prt('d'); goto yyc_l; } +yy53: + ++YYCURSOR; + { out.prt('j'); goto yyc_l; } +yy55: + ++YYCURSOR; + { out.prt('g'); goto yyc_l; } +yy57: + ++YYCURSOR; + { out.prt('n'); goto yyc_l; } +yy59: + ++YYCURSOR; + { out.prt('t'); goto yyc_l; } +yy61: + ++YYCURSOR; + { out.prt('q'); goto yyc_l; } +yy63: + ++YYCURSOR; + { out.caps = true; goto yyc_l; } +yy65: + ++YYCURSOR; + { out.prt('-'); goto yyc_l; } +yy67: + ++YYCURSOR; + { out.prt('u'); goto yyc_l; } +yy69: + ++YYCURSOR; + { out.prt('?'); goto yyc_l; } +yy71: + ++YYCURSOR; + { out.prt('v'); goto yyc_l; } +yy73: + ++YYCURSOR; + { out.prt('x'); goto yyc_l; } +yy75: + ++YYCURSOR; + goto yyc_l; +yy77: + ++YYCURSOR; + { out.prt('.'); goto yyc_l; } +yy79: + ++YYCURSOR; + { out.prt('z'); goto yyc_l; } +yy81: + ++YYCURSOR; + { out.prt('w'); goto yyc_l; } +yy83: + ++YYCURSOR; + c = yycn; + goto yyc_n; +yy85: + ++YYCURSOR; + { out.prt('y'); goto yyc_l; } +yy87: + ++YYCURSOR; + goto yy8; +/* *********************************** */ +yyc_n: + yych = *YYCURSOR; + if (yych <= 0x2812) { + if (yych <= 0x2803) { + if (yych <= ' ') { + if (yych <= '\t') { + if (yych >= 0x0001) goto yy92; + } else { + if (yych <= '\n') goto yy94; + if (yych <= 0x001F) goto yy92; + goto yy96; + } + } else { + if (yych <= 0x2800) { + if (yych <= 0x27FF) goto yy92; + goto yy96; + } else { + if (yych <= 0x2801) goto yy98; + if (yych <= 0x2802) goto yy100; + goto yy102; + } + } + } else { + if (yych <= 0x2809) { + if (yych <= 0x2805) { + if (yych <= 0x2804) goto yy104; + goto yy92; + } else { + if (yych <= 0x2806) goto yy106; + if (yych <= 0x2808) goto yy92; + goto yy108; + } + } else { + if (yych <= 0x280B) { + if (yych <= 0x280A) goto yy110; + goto yy112; + } else { + if (yych <= 0x2810) goto yy92; + if (yych <= 0x2811) goto yy114; + goto yy116; + } + } + } + } else { + if (yych <= 0x2820) { + if (yych <= 0x2818) { + if (yych <= 0x2814) { + if (yych <= 0x2813) goto yy118; + goto yy120; + } else { + if (yych == 0x2816) goto yy122; + goto yy92; + } + } else { + if (yych <= 0x281A) { + if (yych <= 0x2819) goto yy124; + goto yy126; + } else { + if (yych <= 0x281B) goto yy128; + if (yych <= 0x281F) goto yy92; + goto yy130; + } + } + } else { + if (yych <= 0x282F) { + if (yych <= 0x2824) { + if (yych <= 0x2823) goto yy92; + goto yy132; + } else { + if (yych == 0x2826) goto yy134; + goto yy92; + } + } else { + if (yych <= 0x2832) { + if (yych <= 0x2830) goto yy136; + if (yych <= 0x2831) goto yy92; + goto yy138; + } else { + if (yych == 0x283C) goto yy140; + goto yy92; + } + } + } + } + ++YYCURSOR; + { if (YYCURSOR != in.str + in.len + 1) out.err(); return; } +yy92: + ++YYCURSOR; + { out.err(); return; } +yy94: + yych = *++YYCURSOR; + if (yych == '\r') goto yy142; +yy95: + { out.prt('\n'); goto yyc_l; } +yy96: + ++YYCURSOR; + { out.prt(' '); goto yyc_l; } +yy98: + ++YYCURSOR; + { out.prt('1'); goto yyc_n; } +yy100: + ++YYCURSOR; + { out.prt(','); goto yyc_l; } +yy102: + ++YYCURSOR; + { out.prt('2'); goto yyc_n; } +yy104: + ++YYCURSOR; + { out.prt('\''); goto yyc_l; } +yy106: + ++YYCURSOR; + { out.prt(';'); goto yyc_l; } +yy108: + ++YYCURSOR; + { out.prt('3'); goto yyc_n; } +yy110: + ++YYCURSOR; + { out.prt('9'); goto yyc_n; } +yy112: + ++YYCURSOR; + { out.prt('6'); goto yyc_n; } +yy114: + ++YYCURSOR; + { out.prt('5'); goto yyc_n; } +yy116: + ++YYCURSOR; + { out.prt(':'); goto yyc_l; } +yy118: + ++YYCURSOR; + { out.prt('8'); goto yyc_n; } +yy120: + ++YYCURSOR; + { out.prt('*'); goto yyc_l; } +yy122: + ++YYCURSOR; + { out.prt('!'); goto yyc_l; } +yy124: + ++YYCURSOR; + { out.prt('4'); goto yyc_n; } +yy126: + ++YYCURSOR; + { out.prt('0'); goto yyc_n; } +yy128: + ++YYCURSOR; + { out.prt('7'); goto yyc_n; } +yy130: + ++YYCURSOR; + { out.caps = true; goto yyc_l; } +yy132: + ++YYCURSOR; + { out.prt('-'); goto yyc_l; } +yy134: + ++YYCURSOR; + { out.prt('?'); goto yyc_l; } +yy136: + ++YYCURSOR; + c = yycl; + goto yyc_l; +yy138: + ++YYCURSOR; + { out.prt('.'); goto yyc_l; } +yy140: + ++YYCURSOR; + goto yyc_n; +yy142: + ++YYCURSOR; + goto yy95; +} + +} + +int main() +{ + FILE *f; + + f = fopen("06_braille.utf8.txt", "rb"); + if (f) { + printf("utf8:\n"); + iutf8_t in(f); + lex_utf8(in); + fclose(f); + } + + f = fopen("06_braille.utf16.txt", "rb"); + if (f) { + printf("utf16:\n"); + iutf16_t in(f); + lex_utf16(in); + fclose(f); + } + + f = fopen("06_braille.utf32.txt", "rb"); + if (f) { + printf("utf32:\n"); + iutf32_t in(f); + lex_utf32(in); + fclose(f); + } + + f = fopen("06_braille.ucs2.txt", "rb"); + if (f) { + printf("ucs2:\n"); + iucs2_t in(f); + lex_ucs2(in); + fclose(f); + } + + return 0; +} diff --git a/examples/06_braille.cr8i.re b/examples/06_braille.cr8i.re new file mode 100644 index 0000000..5fa429e --- /dev/null +++ b/examples/06_braille.cr8i.re @@ -0,0 +1,229 @@ +#include +#include + +template +struct input_t { + size_t len; + char_t *str; + + input_t(FILE *f) : len(0), str(NULL) + { + fseek(f, 0, SEEK_END); + len = ftell(f) / sizeof(char_t); + fseek(f, 0, SEEK_SET); + str = new char_t[len + 1]; + fread(str, sizeof(char_t), len, f); + str[len] = 0; + } + ~input_t() + { + delete[]str; + } +}; + +typedef input_t iutf8_t; +typedef input_t iutf16_t; +typedef input_t iutf32_t; +typedef input_t iucs2_t; + +struct out_t { + bool caps; + + out_t() : caps(false) {} + void prt(char c) + { + printf("%c", caps ? toupper(c) : c); + caps = false; + } + void err() + { + printf(" ... error\n"); + } +}; + +/*!rules:re2c + re2c:yyfill:enable = 0; + + // letters + l = "\u2830"; + la = "\u2801"; lb = "\u2803"; lc = "\u2809"; ld = "\u2819"; le = "\u2811"; + lf = "\u280b"; lg = "\u281b"; lh = "\u2813"; li = "\u280a"; lj = "\u281a"; + lk = "\u2805"; ll = "\u2807"; lm = "\u280d"; ln = "\u281d"; lo = "\u2815"; + lp = "\u280f"; lq = "\u281f"; lr = "\u2817"; ls = "\u280e"; lt = "\u281e"; + lu = "\u2825"; lv = "\u2827"; lw = "\u283a"; lx = "\u282d"; ly = "\u283d"; + lz = "\u2835"; + + // numbers + n = "\u283c"; + n1 = "\u2801"; n2 = "\u2803"; n3 = "\u2809"; n4 = "\u2819"; n5 = "\u2811"; + n6 = "\u280b"; n7 = "\u281b"; n8 = "\u2813"; n9 = "\u280a"; n0 = "\u281a"; + + // punctuation + pcom = "\u2802"; psem = "\u2806"; pcln = "\u2812"; + pdot = "\u2832"; pxcl = "\u2816"; pqst = "\u2826"; + past = "\u2814"; pdsh = "\u2804"; phyp = "\u2824"; + + // formatting + fcp = "\u2820"; fsp = "\u2800" | "\x20"; fnl = "\n" | "\n\r"; + + <*> * { out.err(); return; } + <*> "\x00" { if (YYCURSOR != in.str + in.len + 1) out.err(); return; } + + <*> l :=> l + la { out.prt('a'); goto yyc_l; } + lb { out.prt('b'); goto yyc_l; } + lc { out.prt('c'); goto yyc_l; } + ld { out.prt('d'); goto yyc_l; } + le { out.prt('e'); goto yyc_l; } + lf { out.prt('f'); goto yyc_l; } + lg { out.prt('g'); goto yyc_l; } + lh { out.prt('h'); goto yyc_l; } + li { out.prt('i'); goto yyc_l; } + lj { out.prt('j'); goto yyc_l; } + lk { out.prt('k'); goto yyc_l; } + ll { out.prt('l'); goto yyc_l; } + lm { out.prt('m'); goto yyc_l; } + ln { out.prt('n'); goto yyc_l; } + lo { out.prt('o'); goto yyc_l; } + lp { out.prt('p'); goto yyc_l; } + lq { out.prt('q'); goto yyc_l; } + lr { out.prt('r'); goto yyc_l; } + ls { out.prt('s'); goto yyc_l; } + lt { out.prt('t'); goto yyc_l; } + lu { out.prt('u'); goto yyc_l; } + lv { out.prt('v'); goto yyc_l; } + lw { out.prt('w'); goto yyc_l; } + lx { out.prt('x'); goto yyc_l; } + ly { out.prt('y'); goto yyc_l; } + lz { out.prt('z'); goto yyc_l; } + + <*> n :=> n + n1 { out.prt('1'); goto yyc_n; } + n2 { out.prt('2'); goto yyc_n; } + n3 { out.prt('3'); goto yyc_n; } + n4 { out.prt('4'); goto yyc_n; } + n5 { out.prt('5'); goto yyc_n; } + n6 { out.prt('6'); goto yyc_n; } + n7 { out.prt('7'); goto yyc_n; } + n8 { out.prt('8'); goto yyc_n; } + n9 { out.prt('9'); goto yyc_n; } + n0 { out.prt('0'); goto yyc_n; } + + <*> pcom { out.prt(','); goto yyc_l; } + <*> psem { out.prt(';'); goto yyc_l; } + <*> pcln { out.prt(':'); goto yyc_l; } + <*> pdot { out.prt('.'); goto yyc_l; } + <*> pxcl { out.prt('!'); goto yyc_l; } + <*> pqst { out.prt('?'); goto yyc_l; } + <*> past { out.prt('*'); goto yyc_l; } + <*> pdsh { out.prt('\''); goto yyc_l; } + <*> phyp { out.prt('-'); goto yyc_l; } + + <*> fcp { out.caps = true; goto yyc_l; } + <*> fsp { out.prt(' '); goto yyc_l; } + <*> fnl { out.prt('\n'); goto yyc_l; } +*/ + +/*!types:re2c*/ + +static void lex_utf8(const iutf8_t & in) +{ + const unsigned char *YYCURSOR = in.str; + const unsigned char *YYMARKER; + int c = yycl; + out_t out; + /*!use:re2c + re2c:define:YYCTYPE = "unsigned char"; + re2c:define:YYGETCONDITION = "c"; + re2c:define:YYGETCONDITION:naked = 1; + re2c:define:YYSETCONDITION = "c = @@;"; + re2c:define:YYSETCONDITION:naked = 1; + */ +} + +static void lex_utf16(const iutf16_t & in) +{ + const unsigned short *YYCURSOR = in.str; + int c = yycl; + out_t out; + /*!use:re2c + re2c:define:YYCTYPE = "unsigned int"; + re2c:define:YYGETCONDITION = "c"; + re2c:define:YYGETCONDITION:naked = 1; + re2c:define:YYSETCONDITION = "c = @@;"; + re2c:define:YYSETCONDITION:naked = 1; + re2c:flags:8 = 0; + re2c:flags:x = 1; + */ +} + +static void lex_utf32(const iutf32_t & in) +{ + const unsigned int *YYCURSOR = in.str; + int c = yycl; + out_t out; + /*!use:re2c + re2c:define:YYCTYPE = "unsigned int"; + re2c:define:YYGETCONDITION = "c"; + re2c:define:YYGETCONDITION:naked = 1; + re2c:define:YYSETCONDITION = "c = @@;"; + re2c:define:YYSETCONDITION:naked = 1; + re2c:flags:x = 0; + re2c:flags:u = 1; + */ +} + +static void lex_ucs2(const iucs2_t & in) +{ + const unsigned short *YYCURSOR = in.str; + int c = yycl; + out_t out; + /*!use:re2c + re2c:define:YYCTYPE = "unsigned int"; + re2c:define:YYGETCONDITION = "c"; + re2c:define:YYGETCONDITION:naked = 1; + re2c:define:YYSETCONDITION = "c = @@;"; + re2c:define:YYSETCONDITION:naked = 1; + re2c:flags:u = 0; + re2c:flags:w = 1; + */ +} + +int main() +{ + FILE *f; + + f = fopen("06_braille.utf8.txt", "rb"); + if (f) { + printf("utf8:\n"); + iutf8_t in(f); + lex_utf8(in); + fclose(f); + } + + f = fopen("06_braille.utf16.txt", "rb"); + if (f) { + printf("utf16:\n"); + iutf16_t in(f); + lex_utf16(in); + fclose(f); + } + + f = fopen("06_braille.utf32.txt", "rb"); + if (f) { + printf("utf32:\n"); + iutf32_t in(f); + lex_utf32(in); + fclose(f); + } + + f = fopen("06_braille.ucs2.txt", "rb"); + if (f) { + printf("ucs2:\n"); + iucs2_t in(f); + lex_ucs2(in); + fclose(f); + } + + return 0; +} diff --git a/examples/07_cxx98.i.c b/examples/07_cxx98.i.c new file mode 100644 index 0000000..c5f088c --- /dev/null +++ b/examples/07_cxx98.i.c @@ -0,0 +1,8332 @@ +/* Generated by re2c */ +#include +#include +#include +#include + +#define YYMAXFILL 17 + +static const size_t SIZE = 64 * 1024; + +struct input_t { + unsigned char buf[SIZE + YYMAXFILL]; + unsigned char *lim; + unsigned char *cur; + unsigned char *mar; + unsigned char *tok; + bool eof; + + FILE *const file; + + input_t(FILE *f) + : buf() + , lim(buf + SIZE) + , cur(lim) + , mar(lim) + , tok(lim) + , eof(false) + , file(f) + {} + bool fill(size_t need) + { + if (eof) { + return false; + } + const size_t free = tok - buf; + if (free < need) { + return false; + } + memmove(buf, tok, lim - tok); + lim -= free; + cur -= free; + mar -= free; + tok -= free; + lim += fread(lim, 1, free, file); + if (lim < buf + SIZE) { + eof = true; + memset(lim, 0, YYMAXFILL); + lim += YYMAXFILL; + } + return true; + } +}; + + + +template +static bool adddgt(unsigned long &u, unsigned long d) +{ + if (u > (ULONG_MAX - d) / base) { + return false; + } + u = u * base + d; + return true; +} + +static bool lex_oct(const unsigned char *s, const unsigned char *e, unsigned long &u) +{ + for (u = 0, ++s; s < e; ++s) { + if (!adddgt<8>(u, *s - 0x30u)) { + return false; + } + } + return true; +} + +static bool lex_dec(const unsigned char *s, const unsigned char *e, unsigned long &u) +{ + for (u = 0; s < e; ++s) { + if (!adddgt<10>(u, *s - 0x30u)) { + return false; + } + } + return true; +} + +static bool lex_hex(const unsigned char *s, const unsigned char *e, unsigned long &u) +{ + for (u = 0, s += 2; s < e;) { + +{ + unsigned char yych; + yych = *s; + switch (yych) { + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': goto yy4; + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy6; + default: goto yy2; + } +yy2: + ++s; + { if (!adddgt<16>(u, s[-1] - 0x30u)) return false; continue; } +yy4: + ++s; + { if (!adddgt<16>(u, s[-1] - 0x41u + 10)) return false; continue; } +yy6: + ++s; + { if (!adddgt<16>(u, s[-1] - 0x61u + 10)) return false; continue; } +} + + } + return true; +} + +static bool lex_str(input_t &in, unsigned char q) +{ + printf("%c", q); + for (unsigned long u = q;; printf("\\x%lx", u)) { + in.tok = in.cur; + +{ + unsigned char yych; + if ((in.lim - in.cur) < 10) if (!in.fill(10)) return false; + yych = *in.cur; + switch (yych) { + case '\n': goto yy12; + case '\\': goto yy14; + default: goto yy10; + } +yy10: + ++in.cur; + { u = in.tok[0]; if (u == q) break; continue; } +yy12: + ++in.cur; +yy13: + { return false; } +yy14: + yych = *(in.mar = ++in.cur); + switch (yych) { + case '"': goto yy15; + case '\'': goto yy17; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': goto yy19; + case '?': goto yy21; + case 'U': goto yy23; + case '\\': goto yy25; + case 'a': goto yy27; + case 'b': goto yy29; + case 'f': goto yy31; + case 'n': goto yy33; + case 'r': goto yy35; + case 't': goto yy37; + case 'u': goto yy39; + case 'v': goto yy40; + case 'x': goto yy42; + default: goto yy13; + } +yy15: + ++in.cur; + { u = '"'; continue; } +yy17: + ++in.cur; + { u = '\''; continue; } +yy19: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': goto yy43; + default: goto yy20; + } +yy20: + { lex_oct(in.tok, in.cur, u); continue; } +yy21: + ++in.cur; + { u = '?'; continue; } +yy23: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy44; + default: goto yy24; + } +yy24: + in.cur = in.mar; + goto yy13; +yy25: + ++in.cur; + { u = '\\'; continue; } +yy27: + ++in.cur; + { u = '\a'; continue; } +yy29: + ++in.cur; + { u = '\b'; continue; } +yy31: + ++in.cur; + { u = '\f'; continue; } +yy33: + ++in.cur; + { u = '\n'; continue; } +yy35: + ++in.cur; + { u = '\r'; continue; } +yy37: + ++in.cur; + { u = '\t'; continue; } +yy39: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy45; + default: goto yy24; + } +yy40: + ++in.cur; + { u = '\v'; continue; } +yy42: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy46; + default: goto yy24; + } +yy43: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': goto yy49; + default: goto yy20; + } +yy44: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy50; + default: goto yy24; + } +yy45: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy51; + default: goto yy24; + } +yy46: + ++in.cur; + if (in.lim <= in.cur) if (!in.fill(1)) return false; + yych = *in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy46; + default: goto yy48; + } +yy48: + { if (!lex_hex(in.tok, in.cur, u)) return false; continue; } +yy49: + ++in.cur; + goto yy20; +yy50: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy52; + default: goto yy24; + } +yy51: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy53; + default: goto yy24; + } +yy52: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy54; + default: goto yy24; + } +yy53: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy55; + default: goto yy24; + } +yy54: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy57; + default: goto yy24; + } +yy55: + ++in.cur; + { lex_hex(in.tok, in.cur, u); continue; } +yy57: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy58; + default: goto yy24; + } +yy58: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy59; + default: goto yy24; + } +yy59: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy60; + default: goto yy24; + } +yy60: + ++in.cur; + { lex_hex(in.tok, in.cur, u); continue; } +} + + } + printf("%c", q); + return true; +} + +static bool lex_flt(const unsigned char *s) +{ + double d = 0; + double x = 1; + int e = 0; + +mant_int: + +{ + unsigned char yych; + yych = *s; + switch (yych) { + case '.': goto yy66; + case 'E': + case 'e': goto yy68; + default: goto yy64; + } +yy64: + ++s; + { d = (d * 10) + (s[-1] - '0'); goto mant_int; } +yy66: + ++s; + { goto mant_frac; } +yy68: + ++s; + { goto exp_sign; } +} + +mant_frac: + +{ + unsigned char yych; + yych = *s; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy73; + case 'E': + case 'e': goto yy75; + default: goto yy72; + } +yy72: + { goto sfx; } +yy73: + ++s; + { d += (x /= 10) * (s[-1] - '0'); goto mant_frac; } +yy75: + ++s; + { goto exp_sign; } +} + +exp_sign: + +{ + unsigned char yych; + yych = *s; + switch (yych) { + case '+': goto yy80; + case '-': goto yy81; + default: goto yy79; + } +yy79: + { x = 1e+1; goto exp; } +yy80: + ++s; + goto yy79; +yy81: + ++s; + { x = 1e-1; goto exp; } +} + +exp: + +{ + unsigned char yych; + yych = *s; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy86; + default: goto yy85; + } +yy85: + { for (; e > 0; --e) d *= x; goto sfx; } +yy86: + ++s; + { e = (e * 10) + (s[-1] - '0'); goto exp; } +} + +sfx: + +{ + unsigned char yych; + yych = *s; + switch (yych) { + case 'F': + case 'f': goto yy92; + default: goto yy90; + } +yy90: + ++s; + { goto end; } +yy92: + ++s; + { if (d > FLT_MAX) return false; goto end; } +} + +end: + printf("%g", d); + return true; +} + +static bool lex(input_t &in) +{ + unsigned long u; + for (;;) { + in.tok = in.cur; + +{ + unsigned char yych; + unsigned int yyaccept = 0; + if ((in.lim - in.cur) < 17) if (!in.fill(17)) return false; + yych = *in.cur; + switch (yych) { + case 0x00: goto yy96; + case '\t': + case '\n': + case '\v': + case '\r': + case ' ': goto yy100; + case '!': goto yy103; + case '"': goto yy105; + case '#': goto yy107; + case '%': goto yy109; + case '&': goto yy111; + case '\'': goto yy113; + case '(': goto yy114; + case ')': goto yy116; + case '*': goto yy118; + case '+': goto yy120; + case ',': goto yy122; + case '-': goto yy124; + case '.': goto yy126; + case '/': goto yy128; + case '0': goto yy130; + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy132; + case ':': goto yy135; + case ';': goto yy137; + case '<': goto yy139; + case '=': goto yy141; + case '>': goto yy143; + case '?': goto yy145; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'h': + case 'j': + case 'k': + case 'q': + case 'y': + case 'z': goto yy147; + case 'L': goto yy150; + case '[': goto yy151; + case ']': goto yy153; + case '^': goto yy155; + case 'a': goto yy157; + case 'b': goto yy158; + case 'c': goto yy159; + case 'd': goto yy160; + case 'e': goto yy161; + case 'f': goto yy162; + case 'g': goto yy163; + case 'i': goto yy164; + case 'l': goto yy165; + case 'm': goto yy166; + case 'n': goto yy167; + case 'o': goto yy168; + case 'p': goto yy169; + case 'r': goto yy170; + case 's': goto yy171; + case 't': goto yy172; + case 'u': goto yy173; + case 'v': goto yy174; + case 'w': goto yy175; + case 'x': goto yy176; + case '{': goto yy177; + case '|': goto yy179; + case '}': goto yy181; + case '~': goto yy183; + default: goto yy98; + } +yy96: + ++in.cur; + { return in.lim - in.tok == YYMAXFILL; } +yy98: + ++in.cur; + { return false; } +yy100: + yyaccept = 0; + in.mar = ++in.cur; + if (in.lim <= in.cur) if (!in.fill(1)) return false; + yych = *in.cur; + switch (yych) { + case '\t': + case '\n': + case '\v': + case '\r': + case ' ': goto yy100; + case '/': goto yy185; + default: goto yy102; + } +yy102: + { printf(" "); continue; } +yy103: + yych = *++in.cur; + switch (yych) { + case '=': goto yy187; + default: goto yy104; + } +yy104: + { printf("!"); continue; } +yy105: + ++in.cur; +yy106: + { if (!lex_str(in, in.cur[-1])) return false; continue; } +yy107: + ++in.cur; + if (in.lim <= in.cur) if (!in.fill(1)) return false; + yych = *in.cur; + switch (yych) { + case '\n': goto yy189; + case '\\': goto yy191; + default: goto yy107; + } +yy109: + yych = *++in.cur; + switch (yych) { + case ':': goto yy107; + case '=': goto yy193; + case '>': goto yy181; + default: goto yy110; + } +yy110: + { printf("%%"); continue; } +yy111: + yych = *++in.cur; + switch (yych) { + case '&': goto yy195; + case '=': goto yy197; + default: goto yy112; + } +yy112: + { printf("&"); continue; } +yy113: + yych = *++in.cur; + switch (yych) { + case '\'': goto yy199; + default: goto yy106; + } +yy114: + ++in.cur; + { printf("("); continue; } +yy116: + ++in.cur; + { printf(")"); continue; } +yy118: + yych = *++in.cur; + switch (yych) { + case '=': goto yy201; + default: goto yy119; + } +yy119: + { printf("*"); continue; } +yy120: + yych = *++in.cur; + switch (yych) { + case '+': goto yy203; + case '=': goto yy205; + default: goto yy121; + } +yy121: + { printf("+"); continue; } +yy122: + ++in.cur; + { printf(","); continue; } +yy124: + yych = *++in.cur; + switch (yych) { + case '-': goto yy207; + case '=': goto yy209; + case '>': goto yy211; + default: goto yy125; + } +yy125: + { printf("-"); continue; } +yy126: + yyaccept = 1; + yych = *(in.mar = ++in.cur); + switch (yych) { + case '*': goto yy213; + case '.': goto yy215; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy216; + default: goto yy127; + } +yy127: + { printf("."); continue; } +yy128: + yych = *++in.cur; + switch (yych) { + case '*': goto yy219; + case '/': goto yy221; + case '=': goto yy223; + default: goto yy129; + } +yy129: + { printf("/"); continue; } +yy130: + yyaccept = 2; + yych = *(in.mar = ++in.cur); + switch (yych) { + case 'X': + case 'x': goto yy230; + default: goto yy226; + } +yy131: + { if (!lex_oct(in.tok, in.cur, u)) return false; goto sfx; } +yy132: + yyaccept = 3; + in.mar = ++in.cur; + if ((in.lim - in.cur) < 3) if (!in.fill(3)) return false; + yych = *in.cur; + switch (yych) { + case '.': goto yy216; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy132; + case 'E': + case 'e': goto yy229; + default: goto yy134; + } +yy134: + { if (!lex_dec(in.tok, in.cur, u)) return false; goto sfx; } +yy135: + yych = *++in.cur; + switch (yych) { + case ':': goto yy231; + case '>': goto yy153; + default: goto yy136; + } +yy136: + { printf(":"); continue; } +yy137: + ++in.cur; + { printf(";"); continue; } +yy139: + yych = *++in.cur; + switch (yych) { + case '%': goto yy177; + case ':': goto yy151; + case '<': goto yy233; + case '=': goto yy235; + default: goto yy140; + } +yy140: + { printf("<"); continue; } +yy141: + yych = *++in.cur; + switch (yych) { + case '=': goto yy237; + default: goto yy142; + } +yy142: + { printf("="); continue; } +yy143: + yych = *++in.cur; + switch (yych) { + case '=': goto yy239; + case '>': goto yy241; + default: goto yy144; + } +yy144: + { printf(">"); continue; } +yy145: + ++in.cur; + { printf("?"); continue; } +yy147: + ++in.cur; + if (in.lim <= in.cur) if (!in.fill(1)) return false; + yych = *in.cur; +yy148: + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy149; + } +yy149: + { printf("%.*s", in.cur - in.tok, in.tok); continue; } +yy150: + yych = *++in.cur; + switch (yych) { + case '"': goto yy105; + case '\'': goto yy113; + default: goto yy148; + } +yy151: + ++in.cur; + { printf("["); continue; } +yy153: + ++in.cur; + { printf("]"); continue; } +yy155: + yych = *++in.cur; + switch (yych) { + case '=': goto yy243; + default: goto yy156; + } +yy156: + { printf("^"); continue; } +yy157: + yych = *++in.cur; + switch (yych) { + case 'n': goto yy245; + case 's': goto yy246; + case 'u': goto yy247; + default: goto yy148; + } +yy158: + yych = *++in.cur; + switch (yych) { + case 'i': goto yy248; + case 'o': goto yy249; + case 'r': goto yy250; + default: goto yy148; + } +yy159: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy251; + case 'h': goto yy252; + case 'l': goto yy253; + case 'o': goto yy254; + default: goto yy148; + } +yy160: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy255; + case 'o': goto yy256; + case 'y': goto yy258; + default: goto yy148; + } +yy161: + yych = *++in.cur; + switch (yych) { + case 'l': goto yy259; + case 'n': goto yy260; + case 'x': goto yy261; + default: goto yy148; + } +yy162: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy262; + case 'l': goto yy263; + case 'o': goto yy264; + case 'r': goto yy265; + default: goto yy148; + } +yy163: + yych = *++in.cur; + switch (yych) { + case 'o': goto yy266; + default: goto yy148; + } +yy164: + yych = *++in.cur; + switch (yych) { + case 'f': goto yy267; + case 'n': goto yy269; + default: goto yy148; + } +yy165: + yych = *++in.cur; + switch (yych) { + case 'o': goto yy270; + default: goto yy148; + } +yy166: + yych = *++in.cur; + switch (yych) { + case 'u': goto yy271; + default: goto yy148; + } +yy167: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy272; + case 'e': goto yy273; + case 'o': goto yy274; + default: goto yy148; + } +yy168: + yych = *++in.cur; + switch (yych) { + case 'p': goto yy275; + case 'r': goto yy276; + default: goto yy148; + } +yy169: + yych = *++in.cur; + switch (yych) { + case 'r': goto yy278; + case 'u': goto yy279; + default: goto yy148; + } +yy170: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy280; + default: goto yy148; + } +yy171: + yych = *++in.cur; + switch (yych) { + case 'h': goto yy281; + case 'i': goto yy282; + case 't': goto yy283; + case 'w': goto yy284; + default: goto yy148; + } +yy172: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy285; + case 'h': goto yy286; + case 'r': goto yy287; + case 'y': goto yy288; + default: goto yy148; + } +yy173: + yych = *++in.cur; + switch (yych) { + case 'n': goto yy289; + case 's': goto yy290; + default: goto yy148; + } +yy174: + yych = *++in.cur; + switch (yych) { + case 'i': goto yy291; + case 'o': goto yy292; + default: goto yy148; + } +yy175: + yych = *++in.cur; + switch (yych) { + case 'c': goto yy293; + case 'h': goto yy294; + default: goto yy148; + } +yy176: + yych = *++in.cur; + switch (yych) { + case 'o': goto yy295; + default: goto yy148; + } +yy177: + ++in.cur; + { printf("{"); continue; } +yy179: + yych = *++in.cur; + switch (yych) { + case '=': goto yy296; + case '|': goto yy298; + default: goto yy180; + } +yy180: + { printf("|"); continue; } +yy181: + ++in.cur; + { printf("}"); continue; } +yy183: + ++in.cur; +yy184: + { printf("~"); continue; } +yy185: + ++in.cur; + if (in.lim <= in.cur) if (!in.fill(1)) return false; + yych = *in.cur; + switch (yych) { + case '*': goto yy219; + case '/': goto yy221; + default: goto yy186; + } +yy186: + in.cur = in.mar; + switch (yyaccept) { + case 0: goto yy102; + case 1: goto yy127; + case 2: goto yy131; + case 3: goto yy134; + default: goto yy218; + } +yy187: + ++in.cur; +yy188: + { printf("!="); continue; } +yy189: + ++in.cur; + { continue; } +yy191: + ++in.cur; + if (in.lim <= in.cur) if (!in.fill(1)) return false; + yych = *in.cur; + switch (yych) { + case '\\': goto yy191; + default: goto yy107; + } +yy193: + ++in.cur; + { printf("%%="); continue; } +yy195: + ++in.cur; +yy196: + { printf("&&"); continue; } +yy197: + ++in.cur; +yy198: + { printf("&="); continue; } +yy199: + ++in.cur; + { return false; } +yy201: + ++in.cur; + { printf("*="); continue; } +yy203: + ++in.cur; + { printf("++"); continue; } +yy205: + ++in.cur; + { printf("+="); continue; } +yy207: + ++in.cur; + { printf("--"); continue; } +yy209: + ++in.cur; + { printf("-="); continue; } +yy211: + yych = *++in.cur; + switch (yych) { + case '*': goto yy299; + default: goto yy212; + } +yy212: + { printf("->"); continue; } +yy213: + ++in.cur; + { printf("."); continue; } +yy215: + yych = *++in.cur; + switch (yych) { + case '.': goto yy301; + default: goto yy186; + } +yy216: + yyaccept = 4; + in.mar = ++in.cur; + if ((in.lim - in.cur) < 3) if (!in.fill(3)) return false; + yych = *in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy216; + case 'E': + case 'e': goto yy229; + case 'F': + case 'L': + case 'f': + case 'l': goto yy303; + default: goto yy218; + } +yy218: + { if (lex_flt(in.tok)) continue; return false; } +yy219: + ++in.cur; + if (in.lim <= in.cur) if (!in.fill(1)) return false; + yych = *in.cur; + switch (yych) { + case '*': goto yy304; + default: goto yy219; + } +yy221: + ++in.cur; + if (in.lim <= in.cur) if (!in.fill(1)) return false; + yych = *in.cur; + switch (yych) { + case '\n': goto yy100; + default: goto yy221; + } +yy223: + ++in.cur; + { printf("/="); continue; } +yy225: + yyaccept = 2; + in.mar = ++in.cur; + if ((in.lim - in.cur) < 3) if (!in.fill(3)) return false; + yych = *in.cur; +yy226: + switch (yych) { + case '.': goto yy216; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': goto yy225; + case '8': + case '9': goto yy227; + case 'E': + case 'e': goto yy229; + default: goto yy131; + } +yy227: + ++in.cur; + if ((in.lim - in.cur) < 3) if (!in.fill(3)) return false; + yych = *in.cur; + switch (yych) { + case '.': goto yy216; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy227; + case 'E': + case 'e': goto yy229; + default: goto yy186; + } +yy229: + yych = *++in.cur; + switch (yych) { + case '+': + case '-': goto yy305; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy306; + default: goto yy186; + } +yy230: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy308; + default: goto yy186; + } +yy231: + ++in.cur; + { printf("::"); continue; } +yy233: + yych = *++in.cur; + switch (yych) { + case '=': goto yy311; + default: goto yy234; + } +yy234: + { printf("<<"); continue; } +yy235: + ++in.cur; + { printf("<="); continue; } +yy237: + ++in.cur; + { printf("=="); continue; } +yy239: + ++in.cur; + { printf(">="); continue; } +yy241: + yych = *++in.cur; + switch (yych) { + case '=': goto yy313; + default: goto yy242; + } +yy242: + { printf(">>"); continue; } +yy243: + ++in.cur; +yy244: + { printf("^="); continue; } +yy245: + yych = *++in.cur; + switch (yych) { + case 'd': goto yy315; + default: goto yy148; + } +yy246: + yych = *++in.cur; + switch (yych) { + case 'm': goto yy316; + default: goto yy148; + } +yy247: + yych = *++in.cur; + switch (yych) { + case 't': goto yy318; + default: goto yy148; + } +yy248: + yych = *++in.cur; + switch (yych) { + case 't': goto yy319; + default: goto yy148; + } +yy249: + yych = *++in.cur; + switch (yych) { + case 'o': goto yy320; + default: goto yy148; + } +yy250: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy321; + default: goto yy148; + } +yy251: + yych = *++in.cur; + switch (yych) { + case 's': goto yy322; + case 't': goto yy323; + default: goto yy148; + } +yy252: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy324; + default: goto yy148; + } +yy253: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy325; + default: goto yy148; + } +yy254: + yych = *++in.cur; + switch (yych) { + case 'm': goto yy326; + case 'n': goto yy327; + default: goto yy148; + } +yy255: + yych = *++in.cur; + switch (yych) { + case 'f': goto yy328; + case 'l': goto yy329; + default: goto yy148; + } +yy256: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + case 'u': goto yy330; + default: goto yy257; + } +yy257: + { printf("DO"); continue; } +yy258: + yych = *++in.cur; + switch (yych) { + case 'n': goto yy331; + default: goto yy148; + } +yy259: + yych = *++in.cur; + switch (yych) { + case 's': goto yy332; + default: goto yy148; + } +yy260: + yych = *++in.cur; + switch (yych) { + case 'u': goto yy333; + default: goto yy148; + } +yy261: + yych = *++in.cur; + switch (yych) { + case 'p': goto yy334; + case 't': goto yy335; + default: goto yy148; + } +yy262: + yych = *++in.cur; + switch (yych) { + case 'l': goto yy336; + default: goto yy148; + } +yy263: + yych = *++in.cur; + switch (yych) { + case 'o': goto yy337; + default: goto yy148; + } +yy264: + yych = *++in.cur; + switch (yych) { + case 'r': goto yy338; + default: goto yy148; + } +yy265: + yych = *++in.cur; + switch (yych) { + case 'i': goto yy340; + default: goto yy148; + } +yy266: + yych = *++in.cur; + switch (yych) { + case 't': goto yy341; + default: goto yy148; + } +yy267: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy268; + } +yy268: + { printf("IF"); continue; } +yy269: + yych = *++in.cur; + switch (yych) { + case 'l': goto yy342; + case 't': goto yy343; + default: goto yy148; + } +yy270: + yych = *++in.cur; + switch (yych) { + case 'n': goto yy345; + default: goto yy148; + } +yy271: + yych = *++in.cur; + switch (yych) { + case 't': goto yy346; + default: goto yy148; + } +yy272: + yych = *++in.cur; + switch (yych) { + case 'm': goto yy347; + default: goto yy148; + } +yy273: + yych = *++in.cur; + switch (yych) { + case 'w': goto yy348; + default: goto yy148; + } +yy274: + yych = *++in.cur; + switch (yych) { + case 't': goto yy350; + default: goto yy148; + } +yy275: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy351; + default: goto yy148; + } +yy276: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + case '_': goto yy352; + default: goto yy277; + } +yy277: + { printf("||"); continue; } +yy278: + yych = *++in.cur; + switch (yych) { + case 'i': goto yy353; + case 'o': goto yy354; + default: goto yy148; + } +yy279: + yych = *++in.cur; + switch (yych) { + case 'b': goto yy355; + default: goto yy148; + } +yy280: + yych = *++in.cur; + switch (yych) { + case 'g': goto yy356; + case 'i': goto yy357; + case 't': goto yy358; + default: goto yy148; + } +yy281: + yych = *++in.cur; + switch (yych) { + case 'o': goto yy359; + default: goto yy148; + } +yy282: + yych = *++in.cur; + switch (yych) { + case 'g': goto yy360; + case 'z': goto yy361; + default: goto yy148; + } +yy283: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy362; + case 'r': goto yy363; + default: goto yy148; + } +yy284: + yych = *++in.cur; + switch (yych) { + case 'i': goto yy364; + default: goto yy148; + } +yy285: + yych = *++in.cur; + switch (yych) { + case 'm': goto yy365; + default: goto yy148; + } +yy286: + yych = *++in.cur; + switch (yych) { + case 'i': goto yy366; + case 'r': goto yy367; + default: goto yy148; + } +yy287: + yych = *++in.cur; + switch (yych) { + case 'u': goto yy368; + case 'y': goto yy369; + default: goto yy148; + } +yy288: + yych = *++in.cur; + switch (yych) { + case 'p': goto yy371; + default: goto yy148; + } +yy289: + yych = *++in.cur; + switch (yych) { + case 'i': goto yy372; + case 's': goto yy373; + default: goto yy148; + } +yy290: + yych = *++in.cur; + switch (yych) { + case 'i': goto yy374; + default: goto yy148; + } +yy291: + yych = *++in.cur; + switch (yych) { + case 'r': goto yy375; + default: goto yy148; + } +yy292: + yych = *++in.cur; + switch (yych) { + case 'i': goto yy376; + case 'l': goto yy377; + default: goto yy148; + } +yy293: + yych = *++in.cur; + switch (yych) { + case 'h': goto yy378; + default: goto yy148; + } +yy294: + yych = *++in.cur; + switch (yych) { + case 'i': goto yy379; + default: goto yy148; + } +yy295: + yych = *++in.cur; + switch (yych) { + case 'r': goto yy380; + default: goto yy148; + } +yy296: + ++in.cur; +yy297: + { printf("|="); continue; } +yy298: + ++in.cur; + goto yy277; +yy299: + ++in.cur; + { printf("->*"); continue; } +yy301: + ++in.cur; + { printf("..."); continue; } +yy303: + ++in.cur; + goto yy218; +yy304: + ++in.cur; + if (in.lim <= in.cur) if (!in.fill(1)) return false; + yych = *in.cur; + switch (yych) { + case '/': goto yy100; + default: goto yy219; + } +yy305: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy306; + default: goto yy186; + } +yy306: + ++in.cur; + if (in.lim <= in.cur) if (!in.fill(1)) return false; + yych = *in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy306; + case 'F': + case 'L': + case 'f': + case 'l': goto yy303; + default: goto yy218; + } +yy308: + ++in.cur; + if (in.lim <= in.cur) if (!in.fill(1)) return false; + yych = *in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy308; + default: goto yy310; + } +yy310: + { if (!lex_hex(in.tok, in.cur, u)) return false; goto sfx; } +yy311: + ++in.cur; + { printf("<<="); continue; } +yy313: + ++in.cur; + { printf(">>="); continue; } +yy315: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + case '_': goto yy381; + default: goto yy196; + } +yy316: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy317; + } +yy317: + { printf("ASM"); continue; } +yy318: + yych = *++in.cur; + switch (yych) { + case 'o': goto yy382; + default: goto yy148; + } +yy319: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy384; + case 'o': goto yy385; + default: goto yy148; + } +yy320: + yych = *++in.cur; + switch (yych) { + case 'l': goto yy386; + default: goto yy148; + } +yy321: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy388; + default: goto yy148; + } +yy322: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy389; + default: goto yy148; + } +yy323: + yych = *++in.cur; + switch (yych) { + case 'c': goto yy391; + default: goto yy148; + } +yy324: + yych = *++in.cur; + switch (yych) { + case 'r': goto yy392; + default: goto yy148; + } +yy325: + yych = *++in.cur; + switch (yych) { + case 's': goto yy394; + default: goto yy148; + } +yy326: + yych = *++in.cur; + switch (yych) { + case 'p': goto yy395; + default: goto yy148; + } +yy327: + yych = *++in.cur; + switch (yych) { + case 's': goto yy396; + case 't': goto yy397; + default: goto yy148; + } +yy328: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy398; + default: goto yy148; + } +yy329: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy399; + default: goto yy148; + } +yy330: + yych = *++in.cur; + switch (yych) { + case 'b': goto yy400; + default: goto yy148; + } +yy331: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy401; + default: goto yy148; + } +yy332: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy402; + default: goto yy148; + } +yy333: + yych = *++in.cur; + switch (yych) { + case 'm': goto yy404; + default: goto yy148; + } +yy334: + yych = *++in.cur; + switch (yych) { + case 'l': goto yy406; + case 'o': goto yy407; + default: goto yy148; + } +yy335: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy408; + default: goto yy148; + } +yy336: + yych = *++in.cur; + switch (yych) { + case 's': goto yy409; + default: goto yy148; + } +yy337: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy410; + default: goto yy148; + } +yy338: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy339; + } +yy339: + { printf("FOR"); continue; } +yy340: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy411; + default: goto yy148; + } +yy341: + yych = *++in.cur; + switch (yych) { + case 'o': goto yy412; + default: goto yy148; + } +yy342: + yych = *++in.cur; + switch (yych) { + case 'i': goto yy414; + default: goto yy148; + } +yy343: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy344; + } +yy344: + { printf("INT"); continue; } +yy345: + yych = *++in.cur; + switch (yych) { + case 'g': goto yy415; + default: goto yy148; + } +yy346: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy417; + default: goto yy148; + } +yy347: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy418; + default: goto yy148; + } +yy348: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy349; + } +yy349: + { printf("new"); continue; } +yy350: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + case '_': goto yy419; + default: goto yy104; + } +yy351: + yych = *++in.cur; + switch (yych) { + case 'r': goto yy420; + default: goto yy148; + } +yy352: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy421; + default: goto yy148; + } +yy353: + yych = *++in.cur; + switch (yych) { + case 'v': goto yy422; + default: goto yy148; + } +yy354: + yych = *++in.cur; + switch (yych) { + case 't': goto yy423; + default: goto yy148; + } +yy355: + yych = *++in.cur; + switch (yych) { + case 'l': goto yy424; + default: goto yy148; + } +yy356: + yych = *++in.cur; + switch (yych) { + case 'i': goto yy425; + default: goto yy148; + } +yy357: + yych = *++in.cur; + switch (yych) { + case 'n': goto yy426; + default: goto yy148; + } +yy358: + yych = *++in.cur; + switch (yych) { + case 'u': goto yy427; + default: goto yy148; + } +yy359: + yych = *++in.cur; + switch (yych) { + case 'r': goto yy428; + default: goto yy148; + } +yy360: + yych = *++in.cur; + switch (yych) { + case 'n': goto yy429; + default: goto yy148; + } +yy361: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy430; + default: goto yy148; + } +yy362: + yych = *++in.cur; + switch (yych) { + case 't': goto yy431; + default: goto yy148; + } +yy363: + yych = *++in.cur; + switch (yych) { + case 'u': goto yy432; + default: goto yy148; + } +yy364: + yych = *++in.cur; + switch (yych) { + case 't': goto yy433; + default: goto yy148; + } +yy365: + yych = *++in.cur; + switch (yych) { + case 'p': goto yy434; + default: goto yy148; + } +yy366: + yych = *++in.cur; + switch (yych) { + case 's': goto yy435; + default: goto yy148; + } +yy367: + yych = *++in.cur; + switch (yych) { + case 'o': goto yy437; + default: goto yy148; + } +yy368: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy438; + default: goto yy148; + } +yy369: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy370; + } +yy370: + { printf("TRY"); continue; } +yy371: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy440; + default: goto yy148; + } +yy372: + yych = *++in.cur; + switch (yych) { + case 'o': goto yy441; + default: goto yy148; + } +yy373: + yych = *++in.cur; + switch (yych) { + case 'i': goto yy442; + default: goto yy148; + } +yy374: + yych = *++in.cur; + switch (yych) { + case 'n': goto yy443; + default: goto yy148; + } +yy375: + yych = *++in.cur; + switch (yych) { + case 't': goto yy444; + default: goto yy148; + } +yy376: + yych = *++in.cur; + switch (yych) { + case 'd': goto yy445; + default: goto yy148; + } +yy377: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy447; + default: goto yy148; + } +yy378: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy448; + default: goto yy148; + } +yy379: + yych = *++in.cur; + switch (yych) { + case 'l': goto yy449; + default: goto yy148; + } +yy380: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + case '_': goto yy450; + default: goto yy156; + } +yy381: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy451; + default: goto yy148; + } +yy382: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy383; + } +yy383: + { printf("AUTO"); continue; } +yy384: + yych = *++in.cur; + switch (yych) { + case 'n': goto yy452; + default: goto yy148; + } +yy385: + yych = *++in.cur; + switch (yych) { + case 'r': goto yy453; + default: goto yy148; + } +yy386: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy387; + } +yy387: + { printf("BOOL"); continue; } +yy388: + yych = *++in.cur; + switch (yych) { + case 'k': goto yy454; + default: goto yy148; + } +yy389: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy390; + } +yy390: + { printf("CASE"); continue; } +yy391: + yych = *++in.cur; + switch (yych) { + case 'h': goto yy456; + default: goto yy148; + } +yy392: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy393; + } +yy393: + { printf("CHAR"); continue; } +yy394: + yych = *++in.cur; + switch (yych) { + case 's': goto yy458; + default: goto yy148; + } +yy395: + yych = *++in.cur; + switch (yych) { + case 'l': goto yy460; + default: goto yy148; + } +yy396: + yych = *++in.cur; + switch (yych) { + case 't': goto yy461; + default: goto yy148; + } +yy397: + yych = *++in.cur; + switch (yych) { + case 'i': goto yy463; + default: goto yy148; + } +yy398: + yych = *++in.cur; + switch (yych) { + case 'u': goto yy464; + default: goto yy148; + } +yy399: + yych = *++in.cur; + switch (yych) { + case 't': goto yy465; + default: goto yy148; + } +yy400: + yych = *++in.cur; + switch (yych) { + case 'l': goto yy466; + default: goto yy148; + } +yy401: + yych = *++in.cur; + switch (yych) { + case 'm': goto yy467; + default: goto yy148; + } +yy402: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy403; + } +yy403: + { printf("ELSE"); continue; } +yy404: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy405; + } +yy405: + { printf("ENUM"); continue; } +yy406: + yych = *++in.cur; + switch (yych) { + case 'i': goto yy468; + default: goto yy148; + } +yy407: + yych = *++in.cur; + switch (yych) { + case 'r': goto yy469; + default: goto yy148; + } +yy408: + yych = *++in.cur; + switch (yych) { + case 'r': goto yy470; + default: goto yy148; + } +yy409: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy471; + default: goto yy148; + } +yy410: + yych = *++in.cur; + switch (yych) { + case 't': goto yy473; + default: goto yy148; + } +yy411: + yych = *++in.cur; + switch (yych) { + case 'n': goto yy475; + default: goto yy148; + } +yy412: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy413; + } +yy413: + { printf("GOTO"); continue; } +yy414: + yych = *++in.cur; + switch (yych) { + case 'n': goto yy476; + default: goto yy148; + } +yy415: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy416; + } +yy416: + { printf("LONG"); continue; } +yy417: + yych = *++in.cur; + switch (yych) { + case 'b': goto yy477; + default: goto yy148; + } +yy418: + yych = *++in.cur; + switch (yych) { + case 's': goto yy478; + default: goto yy148; + } +yy419: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy479; + default: goto yy148; + } +yy420: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy480; + default: goto yy148; + } +yy421: + yych = *++in.cur; + switch (yych) { + case 'q': goto yy481; + default: goto yy148; + } +yy422: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy482; + default: goto yy148; + } +yy423: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy483; + default: goto yy148; + } +yy424: + yych = *++in.cur; + switch (yych) { + case 'i': goto yy484; + default: goto yy148; + } +yy425: + yych = *++in.cur; + switch (yych) { + case 's': goto yy485; + default: goto yy148; + } +yy426: + yych = *++in.cur; + switch (yych) { + case 't': goto yy486; + default: goto yy148; + } +yy427: + yych = *++in.cur; + switch (yych) { + case 'r': goto yy487; + default: goto yy148; + } +yy428: + yych = *++in.cur; + switch (yych) { + case 't': goto yy488; + default: goto yy148; + } +yy429: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy490; + default: goto yy148; + } +yy430: + yych = *++in.cur; + switch (yych) { + case 'o': goto yy491; + default: goto yy148; + } +yy431: + yych = *++in.cur; + switch (yych) { + case 'i': goto yy492; + default: goto yy148; + } +yy432: + yych = *++in.cur; + switch (yych) { + case 'c': goto yy493; + default: goto yy148; + } +yy433: + yych = *++in.cur; + switch (yych) { + case 'c': goto yy494; + default: goto yy148; + } +yy434: + yych = *++in.cur; + switch (yych) { + case 'l': goto yy495; + default: goto yy148; + } +yy435: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy436; + } +yy436: + { printf("THIS"); continue; } +yy437: + yych = *++in.cur; + switch (yych) { + case 'w': goto yy496; + default: goto yy148; + } +yy438: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy439; + } +yy439: + { printf("true"); continue; } +yy440: + yych = *++in.cur; + switch (yych) { + case 'd': goto yy498; + case 'i': goto yy499; + case 'n': goto yy500; + default: goto yy148; + } +yy441: + yych = *++in.cur; + switch (yych) { + case 'n': goto yy501; + default: goto yy148; + } +yy442: + yych = *++in.cur; + switch (yych) { + case 'g': goto yy503; + default: goto yy148; + } +yy443: + yych = *++in.cur; + switch (yych) { + case 'g': goto yy504; + default: goto yy148; + } +yy444: + yych = *++in.cur; + switch (yych) { + case 'u': goto yy506; + default: goto yy148; + } +yy445: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy446; + } +yy446: + { printf("VOID"); continue; } +yy447: + yych = *++in.cur; + switch (yych) { + case 't': goto yy507; + default: goto yy148; + } +yy448: + yych = *++in.cur; + switch (yych) { + case 'r': goto yy508; + default: goto yy148; + } +yy449: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy509; + default: goto yy148; + } +yy450: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy511; + default: goto yy148; + } +yy451: + yych = *++in.cur; + switch (yych) { + case 'q': goto yy512; + default: goto yy148; + } +yy452: + yych = *++in.cur; + switch (yych) { + case 'd': goto yy513; + default: goto yy148; + } +yy453: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy180; + } +yy454: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy455; + } +yy455: + { printf("BREAK"); continue; } +yy456: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy457; + } +yy457: + { printf("CATCH"); continue; } +yy458: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy459; + } +yy459: + { printf("CLASS"); continue; } +yy460: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy184; + } +yy461: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + case '_': goto yy514; + default: goto yy462; + } +yy462: + { printf("CONST"); continue; } +yy463: + yych = *++in.cur; + switch (yych) { + case 'n': goto yy515; + default: goto yy148; + } +yy464: + yych = *++in.cur; + switch (yych) { + case 'l': goto yy516; + default: goto yy148; + } +yy465: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy517; + default: goto yy148; + } +yy466: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy519; + default: goto yy148; + } +yy467: + yych = *++in.cur; + switch (yych) { + case 'i': goto yy521; + default: goto yy148; + } +yy468: + yych = *++in.cur; + switch (yych) { + case 'c': goto yy522; + default: goto yy148; + } +yy469: + yych = *++in.cur; + switch (yych) { + case 't': goto yy523; + default: goto yy148; + } +yy470: + yych = *++in.cur; + switch (yych) { + case 'n': goto yy525; + default: goto yy148; + } +yy471: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy472; + } +yy472: + { printf("false"); continue; } +yy473: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy474; + } +yy474: + { printf("FLOAT"); continue; } +yy475: + yych = *++in.cur; + switch (yych) { + case 'd': goto yy527; + default: goto yy148; + } +yy476: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy529; + default: goto yy148; + } +yy477: + yych = *++in.cur; + switch (yych) { + case 'l': goto yy531; + default: goto yy148; + } +yy478: + yych = *++in.cur; + switch (yych) { + case 'p': goto yy532; + default: goto yy148; + } +yy479: + yych = *++in.cur; + switch (yych) { + case 'q': goto yy533; + default: goto yy148; + } +yy480: + yych = *++in.cur; + switch (yych) { + case 't': goto yy534; + default: goto yy148; + } +yy481: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy297; + } +yy482: + yych = *++in.cur; + switch (yych) { + case 't': goto yy535; + default: goto yy148; + } +yy483: + yych = *++in.cur; + switch (yych) { + case 'c': goto yy536; + default: goto yy148; + } +yy484: + yych = *++in.cur; + switch (yych) { + case 'c': goto yy537; + default: goto yy148; + } +yy485: + yych = *++in.cur; + switch (yych) { + case 't': goto yy539; + default: goto yy148; + } +yy486: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy540; + default: goto yy148; + } +yy487: + yych = *++in.cur; + switch (yych) { + case 'n': goto yy541; + default: goto yy148; + } +yy488: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy489; + } +yy489: + { printf("SHORT"); continue; } +yy490: + yych = *++in.cur; + switch (yych) { + case 'd': goto yy543; + default: goto yy148; + } +yy491: + yych = *++in.cur; + switch (yych) { + case 'f': goto yy545; + default: goto yy148; + } +yy492: + yych = *++in.cur; + switch (yych) { + case 'c': goto yy547; + default: goto yy148; + } +yy493: + yych = *++in.cur; + switch (yych) { + case 't': goto yy549; + default: goto yy148; + } +yy494: + yych = *++in.cur; + switch (yych) { + case 'h': goto yy551; + default: goto yy148; + } +yy495: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy553; + default: goto yy148; + } +yy496: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy497; + } +yy497: + { printf("THROW"); continue; } +yy498: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy554; + default: goto yy148; + } +yy499: + yych = *++in.cur; + switch (yych) { + case 'd': goto yy555; + default: goto yy148; + } +yy500: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy557; + default: goto yy148; + } +yy501: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy502; + } +yy502: + { printf("UNION"); continue; } +yy503: + yych = *++in.cur; + switch (yych) { + case 'n': goto yy558; + default: goto yy148; + } +yy504: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy505; + } +yy505: + { printf("USING"); continue; } +yy506: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy559; + default: goto yy148; + } +yy507: + yych = *++in.cur; + switch (yych) { + case 'i': goto yy560; + default: goto yy148; + } +yy508: + yych = *++in.cur; + switch (yych) { + case '_': goto yy561; + default: goto yy148; + } +yy509: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy510; + } +yy510: + { printf("WHILE"); continue; } +yy511: + yych = *++in.cur; + switch (yych) { + case 'q': goto yy562; + default: goto yy148; + } +yy512: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy198; + } +yy513: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy112; + } +yy514: + yych = *++in.cur; + switch (yych) { + case 'c': goto yy563; + default: goto yy148; + } +yy515: + yych = *++in.cur; + switch (yych) { + case 'u': goto yy564; + default: goto yy148; + } +yy516: + yych = *++in.cur; + switch (yych) { + case 't': goto yy565; + default: goto yy148; + } +yy517: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy518; + } +yy518: + { printf("delete"); continue; } +yy519: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy520; + } +yy520: + { printf("DOUBLE"); continue; } +yy521: + yych = *++in.cur; + switch (yych) { + case 'c': goto yy567; + default: goto yy148; + } +yy522: + yych = *++in.cur; + switch (yych) { + case 'i': goto yy568; + default: goto yy148; + } +yy523: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy524; + } +yy524: + { printf("EXPORT"); continue; } +yy525: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy526; + } +yy526: + { printf("EXTERN"); continue; } +yy527: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy528; + } +yy528: + { printf("FRIEND"); continue; } +yy529: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy530; + } +yy530: + { printf("INLINE"); continue; } +yy531: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy569; + default: goto yy148; + } +yy532: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy571; + default: goto yy148; + } +yy533: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy188; + } +yy534: + yych = *++in.cur; + switch (yych) { + case 'o': goto yy572; + default: goto yy148; + } +yy535: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy573; + default: goto yy148; + } +yy536: + yych = *++in.cur; + switch (yych) { + case 't': goto yy575; + default: goto yy148; + } +yy537: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy538; + } +yy538: + { printf("PUBLIC"); continue; } +yy539: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy576; + default: goto yy148; + } +yy540: + yych = *++in.cur; + switch (yych) { + case 'r': goto yy577; + default: goto yy148; + } +yy541: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy542; + } +yy542: + { printf("RETURN"); continue; } +yy543: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy544; + } +yy544: + { printf("SIGNED"); continue; } +yy545: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy546; + } +yy546: + { printf("SIZEOF"); continue; } +yy547: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + case '_': goto yy578; + default: goto yy548; + } +yy548: + { printf("STATIC"); continue; } +yy549: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy550; + } +yy550: + { printf("STRUCT"); continue; } +yy551: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy552; + } +yy552: + { printf("SWITCH"); continue; } +yy553: + yych = *++in.cur; + switch (yych) { + case 't': goto yy579; + default: goto yy148; + } +yy554: + yych = *++in.cur; + switch (yych) { + case 'f': goto yy580; + default: goto yy148; + } +yy555: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy556; + } +yy556: + { printf("TYPEID"); continue; } +yy557: + yych = *++in.cur; + switch (yych) { + case 'm': goto yy582; + default: goto yy148; + } +yy558: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy583; + default: goto yy148; + } +yy559: + yych = *++in.cur; + switch (yych) { + case 'l': goto yy584; + default: goto yy148; + } +yy560: + yych = *++in.cur; + switch (yych) { + case 'l': goto yy586; + default: goto yy148; + } +yy561: + yych = *++in.cur; + switch (yych) { + case 't': goto yy587; + default: goto yy148; + } +yy562: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy244; + } +yy563: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy589; + default: goto yy148; + } +yy564: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy590; + default: goto yy148; + } +yy565: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy566; + } +yy566: + { printf("DEFAULT"); continue; } +yy567: + yych = *++in.cur; + switch (yych) { + case '_': goto yy592; + default: goto yy148; + } +yy568: + yych = *++in.cur; + switch (yych) { + case 't': goto yy593; + default: goto yy148; + } +yy569: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy570; + } +yy570: + { printf("MUTABLE"); continue; } +yy571: + yych = *++in.cur; + switch (yych) { + case 'c': goto yy595; + default: goto yy148; + } +yy572: + yych = *++in.cur; + switch (yych) { + case 'r': goto yy596; + default: goto yy148; + } +yy573: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy574; + } +yy574: + { printf("PRIVATE"); continue; } +yy575: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy598; + default: goto yy148; + } +yy576: + yych = *++in.cur; + switch (yych) { + case 'r': goto yy599; + default: goto yy148; + } +yy577: + yych = *++in.cur; + switch (yych) { + case 'p': goto yy601; + default: goto yy148; + } +yy578: + yych = *++in.cur; + switch (yych) { + case 'c': goto yy602; + default: goto yy148; + } +yy579: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy603; + default: goto yy148; + } +yy580: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy581; + } +yy581: + { printf("TYPEDEF"); continue; } +yy582: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy605; + default: goto yy148; + } +yy583: + yych = *++in.cur; + switch (yych) { + case 'd': goto yy607; + default: goto yy148; + } +yy584: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy585; + } +yy585: + { printf("VIRTUAL"); continue; } +yy586: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy609; + default: goto yy148; + } +yy587: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy588; + } +yy588: + { printf("WCHAR_T"); continue; } +yy589: + yych = *++in.cur; + switch (yych) { + case 's': goto yy611; + default: goto yy148; + } +yy590: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy591; + } +yy591: + { printf("CONTINUE"); continue; } +yy592: + yych = *++in.cur; + switch (yych) { + case 'c': goto yy612; + default: goto yy148; + } +yy593: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy594; + } +yy594: + { printf("EXPLICIT"); continue; } +yy595: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy613; + default: goto yy148; + } +yy596: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy597; + } +yy597: + { printf("OPERATOR"); continue; } +yy598: + yych = *++in.cur; + switch (yych) { + case 'd': goto yy615; + default: goto yy148; + } +yy599: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy600; + } +yy600: + { printf("REGISTER"); continue; } +yy601: + yych = *++in.cur; + switch (yych) { + case 'r': goto yy617; + default: goto yy148; + } +yy602: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy618; + default: goto yy148; + } +yy603: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy604; + } +yy604: + { printf("TEMPLATE"); continue; } +yy605: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy606; + } +yy606: + { printf("TYPENAME"); continue; } +yy607: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy608; + } +yy608: + { printf("UNSIGNED"); continue; } +yy609: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy610; + } +yy610: + { printf("VOLATILE"); continue; } +yy611: + yych = *++in.cur; + switch (yych) { + case 't': goto yy619; + default: goto yy148; + } +yy612: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy621; + default: goto yy148; + } +yy613: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy614; + } +yy614: + { printf("NAMESPACE"); continue; } +yy615: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy616; + } +yy616: + { printf("PROTECTED"); continue; } +yy617: + yych = *++in.cur; + switch (yych) { + case 'e': goto yy622; + default: goto yy148; + } +yy618: + yych = *++in.cur; + switch (yych) { + case 's': goto yy623; + default: goto yy148; + } +yy619: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy620; + } +yy620: + { printf("CONST_CAST"); continue; } +yy621: + yych = *++in.cur; + switch (yych) { + case 's': goto yy624; + default: goto yy148; + } +yy622: + yych = *++in.cur; + switch (yych) { + case 't': goto yy625; + default: goto yy148; + } +yy623: + yych = *++in.cur; + switch (yych) { + case 't': goto yy626; + default: goto yy148; + } +yy624: + yych = *++in.cur; + switch (yych) { + case 't': goto yy628; + default: goto yy148; + } +yy625: + yych = *++in.cur; + switch (yych) { + case '_': goto yy630; + default: goto yy148; + } +yy626: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy627; + } +yy627: + { printf("STATIC_CAST"); continue; } +yy628: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy629; + } +yy629: + { printf("DYNAMIC_CAST"); continue; } +yy630: + yych = *++in.cur; + switch (yych) { + case 'c': goto yy631; + default: goto yy148; + } +yy631: + yych = *++in.cur; + switch (yych) { + case 'a': goto yy632; + default: goto yy148; + } +yy632: + yych = *++in.cur; + switch (yych) { + case 's': goto yy633; + default: goto yy148; + } +yy633: + yych = *++in.cur; + switch (yych) { + case 't': goto yy634; + default: goto yy148; + } +yy634: + yych = *++in.cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy147; + default: goto yy635; + } +yy635: + { printf("REINTERPRET_CAST"); continue; } +} + +sfx: + +{ + unsigned char yych; + if ((in.lim - in.cur) < 2) if (!in.fill(2)) return false; + yych = *in.cur; + switch (yych) { + case 'L': + case 'l': goto yy639; + case 'U': + case 'u': goto yy641; + default: goto yy638; + } +yy638: + { if (u > INT_MAX) return false; printf("%d", static_cast(u)); continue; } +yy639: + yych = *++in.cur; + switch (yych) { + case 'U': + case 'u': goto yy643; + default: goto yy640; + } +yy640: + { if (u > LONG_MAX) return false; printf("%ld", static_cast(u)); continue; } +yy641: + yych = *++in.cur; + switch (yych) { + case 'L': + case 'l': goto yy643; + default: goto yy642; + } +yy642: + { if (u > UINT_MAX) return false; printf("%u", static_cast(u)); continue; } +yy643: + ++in.cur; + { printf("%lu", u); continue; } +} + + } +} + +int main(int argc, char **argv) +{ + if (argc != 2) { + printf ("usage: ./example \n"); + return 1; + } + + FILE *file = fopen(argv[1], "rb"); + if (!file) { + printf("error: cannot open file: %s\n", argv[1]); + return 1; + } + + input_t in(file); + if (!lex(in)) { + printf("... error\n"); + } else { + printf("\n"); + } + + fclose(file); + return 0; +} +re2c: warning: line 150: rule matches empty string [-Wmatch-empty-string] +re2c: warning: line 156: rule matches empty string [-Wmatch-empty-string] +re2c: warning: line 161: rule matches empty string [-Wmatch-empty-string] +re2c: warning: line 344: rule matches empty string [-Wmatch-empty-string] diff --git a/examples/07_cxx98.i.re b/examples/07_cxx98.i.re new file mode 100644 index 0000000..ac2e352 --- /dev/null +++ b/examples/07_cxx98.i.re @@ -0,0 +1,374 @@ +#include +#include +#include +#include + +/*!max:re2c*/ +static const size_t SIZE = 64 * 1024; + +struct input_t { + unsigned char buf[SIZE + YYMAXFILL]; + unsigned char *lim; + unsigned char *cur; + unsigned char *mar; + unsigned char *tok; + bool eof; + + FILE *const file; + + input_t(FILE *f) + : buf() + , lim(buf + SIZE) + , cur(lim) + , mar(lim) + , tok(lim) + , eof(false) + , file(f) + {} + bool fill(size_t need) + { + if (eof) { + return false; + } + const size_t free = tok - buf; + if (free < need) { + return false; + } + memmove(buf, tok, lim - tok); + lim -= free; + cur -= free; + mar -= free; + tok -= free; + lim += fread(lim, 1, free, file); + if (lim < buf + SIZE) { + eof = true; + memset(lim, 0, YYMAXFILL); + lim += YYMAXFILL; + } + return true; + } +}; + +/*!re2c re2c:define:YYCTYPE = "unsigned char"; */ + +template +static bool adddgt(unsigned long &u, unsigned long d) +{ + if (u > (ULONG_MAX - d) / base) { + return false; + } + u = u * base + d; + return true; +} + +static bool lex_oct(const unsigned char *s, const unsigned char *e, unsigned long &u) +{ + for (u = 0, ++s; s < e; ++s) { + if (!adddgt<8>(u, *s - 0x30u)) { + return false; + } + } + return true; +} + +static bool lex_dec(const unsigned char *s, const unsigned char *e, unsigned long &u) +{ + for (u = 0; s < e; ++s) { + if (!adddgt<10>(u, *s - 0x30u)) { + return false; + } + } + return true; +} + +static bool lex_hex(const unsigned char *s, const unsigned char *e, unsigned long &u) +{ + for (u = 0, s += 2; s < e;) { + /*!re2c + re2c:yyfill:enable = 0; + re2c:define:YYCURSOR = s; + * { if (!adddgt<16>(u, s[-1] - 0x30u)) return false; continue; } + [a-f] { if (!adddgt<16>(u, s[-1] - 0x61u + 10)) return false; continue; } + [A-F] { if (!adddgt<16>(u, s[-1] - 0x41u + 10)) return false; continue; } + */ + } + return true; +} + +static bool lex_str(input_t &in, unsigned char q) +{ + printf("%c", q); + for (unsigned long u = q;; printf("\\x%lx", u)) { + in.tok = in.cur; + /*!re2c + re2c:define:YYCURSOR = in.cur; + re2c:define:YYMARKER = in.mar; + re2c:define:YYLIMIT = in.lim; + re2c:yyfill:enable = 1; + re2c:define:YYFILL = "if (!in.fill(@@)) return false;"; + re2c:define:YYFILL:naked = 1; + * { return false; } + [^\n\\] { u = in.tok[0]; if (u == q) break; continue; } + "\\a" { u = '\a'; continue; } + "\\b" { u = '\b'; continue; } + "\\f" { u = '\f'; continue; } + "\\n" { u = '\n'; continue; } + "\\r" { u = '\r'; continue; } + "\\t" { u = '\t'; continue; } + "\\v" { u = '\v'; continue; } + "\\\\" { u = '\\'; continue; } + "\\'" { u = '\''; continue; } + "\\\"" { u = '"'; continue; } + "\\?" { u = '?'; continue; } + "\\" [0-7]{1,3} { lex_oct(in.tok, in.cur, u); continue; } + "\\u" [0-9a-fA-F]{4} { lex_hex(in.tok, in.cur, u); continue; } + "\\U" [0-9a-fA-F]{8} { lex_hex(in.tok, in.cur, u); continue; } + "\\x" [0-9a-fA-F]+ { if (!lex_hex(in.tok, in.cur, u)) return false; continue; } + */ + } + printf("%c", q); + return true; +} + +static bool lex_flt(const unsigned char *s) +{ + double d = 0; + double x = 1; + int e = 0; + /*!re2c + re2c:yyfill:enable = 0; + re2c:define:YYCURSOR = s; + */ +mant_int: + /*!re2c + "." { goto mant_frac; } + [eE] { goto exp_sign; } + * { d = (d * 10) + (s[-1] - '0'); goto mant_int; } + */ +mant_frac: + /*!re2c + "" { goto sfx; } + [eE] { goto exp_sign; } + [0-9] { d += (x /= 10) * (s[-1] - '0'); goto mant_frac; } + */ +exp_sign: + /*!re2c + "+"? { x = 1e+1; goto exp; } + "-" { x = 1e-1; goto exp; } + */ +exp: + /*!re2c + "" { for (; e > 0; --e) d *= x; goto sfx; } + [0-9] { e = (e * 10) + (s[-1] - '0'); goto exp; } + */ +sfx: + /*!re2c + * { goto end; } + [fF] { if (d > FLT_MAX) return false; goto end; } + */ +end: + printf("%g", d); + return true; +} + +static bool lex(input_t &in) +{ + unsigned long u; + for (;;) { + in.tok = in.cur; + /*!re2c + re2c:define:YYCURSOR = in.cur; + re2c:define:YYMARKER = in.mar; + re2c:define:YYLIMIT = in.lim; + re2c:yyfill:enable = 1; + re2c:define:YYFILL = "if (!in.fill(@@)) return false;"; + re2c:define:YYFILL:naked = 1; + + end = "\x00"; + + * { return false; } + end { return in.lim - in.tok == YYMAXFILL; } + + // macros + macro = ("#" | "%:") ([^\n] | "\\\n")* "\n"; + macro { continue; } + + // whitespaces + mcm = "/*" ([^*] | ("*" [^/]))* "*""/"; + scm = "//" [^\n]* "\n"; + wsp = ([ \t\v\n\r] | scm | mcm)+; + wsp { printf(" "); continue; } + + // character and string literals + "L"? ['"] { if (!lex_str(in, in.cur[-1])) return false; continue; } + "L"? "''" { return false; } + + // integer literals + oct = "0" [0-7]*; + dec = [1-9][0-9]*; + hex = '0x' [0-9a-fA-F]+; + oct { if (!lex_oct(in.tok, in.cur, u)) return false; goto sfx; } + dec { if (!lex_dec(in.tok, in.cur, u)) return false; goto sfx; } + hex { if (!lex_hex(in.tok, in.cur, u)) return false; goto sfx; } + + // floating literals + frc = [0-9]* "." [0-9]+ | [0-9]+ "."; + exp = 'e' [+-]? [0-9]+; + flt = (frc exp? | [0-9]+ exp) [fFlL]?; + flt { if (lex_flt(in.tok)) continue; return false; } + + // boolean literals + "false" { printf("false"); continue; } + "true" { printf("true"); continue; } + + // keywords + "asm" { printf("ASM"); continue; } + "auto" { printf("AUTO"); continue; } + "bool" { printf("BOOL"); continue; } + "break" { printf("BREAK"); continue; } + "case" { printf("CASE"); continue; } + "catch" { printf("CATCH"); continue; } + "char" { printf("CHAR"); continue; } + "class" { printf("CLASS"); continue; } + "const" { printf("CONST"); continue; } + "const_cast" { printf("CONST_CAST"); continue; } + "continue" { printf("CONTINUE"); continue; } + "default" { printf("DEFAULT"); continue; } + "do" { printf("DO"); continue; } + "double" { printf("DOUBLE"); continue; } + "dynamic_cast" { printf("DYNAMIC_CAST"); continue; } + "else" { printf("ELSE"); continue; } + "enum" { printf("ENUM"); continue; } + "explicit" { printf("EXPLICIT"); continue; } + "export" { printf("EXPORT"); continue; } + "extern" { printf("EXTERN"); continue; } + "float" { printf("FLOAT"); continue; } + "for" { printf("FOR"); continue; } + "friend" { printf("FRIEND"); continue; } + "goto" { printf("GOTO"); continue; } + "if" { printf("IF"); continue; } + "inline" { printf("INLINE"); continue; } + "int" { printf("INT"); continue; } + "long" { printf("LONG"); continue; } + "mutable" { printf("MUTABLE"); continue; } + "namespace" { printf("NAMESPACE"); continue; } + "operator" { printf("OPERATOR"); continue; } + "private" { printf("PRIVATE"); continue; } + "protected" { printf("PROTECTED"); continue; } + "public" { printf("PUBLIC"); continue; } + "register" { printf("REGISTER"); continue; } + "reinterpret_cast" { printf("REINTERPRET_CAST"); continue; } + "return" { printf("RETURN"); continue; } + "short" { printf("SHORT"); continue; } + "signed" { printf("SIGNED"); continue; } + "sizeof" { printf("SIZEOF"); continue; } + "static" { printf("STATIC"); continue; } + "static_cast" { printf("STATIC_CAST"); continue; } + "struct" { printf("STRUCT"); continue; } + "switch" { printf("SWITCH"); continue; } + "template" { printf("TEMPLATE"); continue; } + "this" { printf("THIS"); continue; } + "throw" { printf("THROW"); continue; } + "try" { printf("TRY"); continue; } + "typedef" { printf("TYPEDEF"); continue; } + "typeid" { printf("TYPEID"); continue; } + "typename" { printf("TYPENAME"); continue; } + "union" { printf("UNION"); continue; } + "unsigned" { printf("UNSIGNED"); continue; } + "using" { printf("USING"); continue; } + "virtual" { printf("VIRTUAL"); continue; } + "void" { printf("VOID"); continue; } + "volatile" { printf("VOLATILE"); continue; } + "wchar_t" { printf("WCHAR_T"); continue; } + "while" { printf("WHILE"); continue; } + + // operators and punctuation (including preprocessor) + ("{" | "<%") { printf("{"); continue; } + ("}" | "%>") { printf("}"); continue; } + ("[" | "<:") { printf("["); continue; } + ("]" | ":>") { printf("]"); continue; } + "(" { printf("("); continue; } + ")" { printf(")"); continue; } + ";" { printf(";"); continue; } + ":" { printf(":"); continue; } + "..." { printf("..."); continue; } + "new" { printf("new"); continue; } + "delete" { printf("delete"); continue; } + "?" { printf("?"); continue; } + "::" { printf("::"); continue; } + "." { printf("."); continue; } + ".*" { printf("."); continue; } + "+" { printf("+"); continue; } + "-" { printf("-"); continue; } + "*" { printf("*"); continue; } + "/" { printf("/"); continue; } + "%" { printf("%%"); continue; } + ("^" | "xor") { printf("^"); continue; } + ("&" | "bitand") { printf("&"); continue; } + ("|" | "bitor") { printf("|"); continue; } + ("~" | "compl") { printf("~"); continue; } + ("!" | "not") { printf("!"); continue; } + "=" { printf("="); continue; } + "<" { printf("<"); continue; } + ">" { printf(">"); continue; } + "+=" { printf("+="); continue; } + "-=" { printf("-="); continue; } + "*=" { printf("*="); continue; } + "/=" { printf("/="); continue; } + "%=" { printf("%%="); continue; } + ("^=" | "xor_eq") { printf("^="); continue; } + ("&=" | "and_eq") { printf("&="); continue; } + ("|=" | "or_eq") { printf("|="); continue; } + "<<" { printf("<<"); continue; } + ">>" { printf(">>"); continue; } + ">>=" { printf(">>="); continue; } + "<<=" { printf("<<="); continue; } + "==" { printf("=="); continue; } + ("!=" | "not_eq") { printf("!="); continue; } + "<=" { printf("<="); continue; } + ">=" { printf(">="); continue; } + ("&&" | "and") { printf("&&"); continue; } + ("||" | "or") { printf("||"); continue; } + "++" { printf("++"); continue; } + "--" { printf("--"); continue; } + "," { printf(","); continue; } + "->*" { printf("->*"); continue; } + "->" { printf("->"); continue; } + + // identifiers + id = [a-zA-Z_][a-zA-Z_0-9]*; + id { printf("%.*s", in.cur - in.tok, in.tok); continue; } + */ +sfx: + /*!re2c + "" { if (u > INT_MAX) return false; printf("%d", static_cast(u)); continue; } + 'u' { if (u > UINT_MAX) return false; printf("%u", static_cast(u)); continue; } + 'l' { if (u > LONG_MAX) return false; printf("%ld", static_cast(u)); continue; } + 'ul' | 'lu' { printf("%lu", u); continue; } + */ + } +} + +int main(int argc, char **argv) +{ + if (argc != 2) { + printf ("usage: ./example \n"); + return 1; + } + + FILE *file = fopen(argv[1], "rb"); + if (!file) { + printf("error: cannot open file: %s\n", argv[1]); + return 1; + } + + input_t in(file); + if (!lex(in)) { + printf("... error\n"); + } else { + printf("\n"); + } + + fclose(file); + return 0; +} diff --git a/examples/08_ipv4.i--tags.c b/examples/08_ipv4.i--tags.c new file mode 100644 index 0000000..e0812e5 --- /dev/null +++ b/examples/08_ipv4.i--tags.c @@ -0,0 +1,253 @@ +/* Generated by re2c */ +#include + +static int lex(const char *YYCURSOR) +{ + const char *YYMARKER, *o1, *o2, *o3, *o4; + const char *yyt1;const char *yyt2;const char *yyt3;const char *yyt4; + +{ + char yych; + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + yyt1 = YYCURSOR; + goto yy4; + default: goto yy2; + } +yy2: + ++YYCURSOR; +yy3: + { printf("error\n"); return 1; } +yy4: + yych = *(YYMARKER = ++YYCURSOR); + switch (yych) { + case '.': goto yy5; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy7; + default: goto yy3; + } +yy5: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + yyt2 = YYCURSOR; + goto yy8; + default: goto yy6; + } +yy6: + YYCURSOR = YYMARKER; + goto yy3; +yy7: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy5; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy9; + default: goto yy6; + } +yy8: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy10; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy11; + default: goto yy6; + } +yy9: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy5; + default: goto yy6; + } +yy10: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + yyt3 = YYCURSOR; + goto yy12; + default: goto yy6; + } +yy11: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy10; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy13; + default: goto yy6; + } +yy12: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy14; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy15; + default: goto yy6; + } +yy13: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy10; + default: goto yy6; + } +yy14: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + yyt4 = YYCURSOR; + goto yy16; + default: goto yy6; + } +yy15: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy14; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy18; + default: goto yy6; + } +yy16: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy19; + default: goto yy17; + } +yy17: + o1 = yyt1; + o2 = yyt2; + o3 = yyt3; + o4 = yyt4; + { + printf("parsed: %.*s, %.*s, %.*s, %*s!\n", + (int)(o2 - o1 - 1), o1, + (int)(o3 - o2 - 1), o2, + (int)(o4 - o3 - 1), o3, + (int)(YYCURSOR - o4), o4); + return 0; + } +yy18: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy14; + default: goto yy6; + } +yy19: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy20; + default: goto yy17; + } +yy20: + ++YYCURSOR; + goto yy17; +} + +} + +int main(int argc, char **argv) +{ + for (int i = 1; i < argc; ++i) lex(argv[i]); + return 0; +} diff --git a/examples/08_ipv4.i--tags.re b/examples/08_ipv4.i--tags.re new file mode 100644 index 0000000..c9e5c19 --- /dev/null +++ b/examples/08_ipv4.i--tags.re @@ -0,0 +1,32 @@ +#include + +static int lex(const char *YYCURSOR) +{ + const char *YYMARKER, *o1, *o2, *o3, *o4; + /*!stags:re2c format = 'const char *@@;'; */ + /*!re2c + re2c:define:YYCTYPE = char; + re2c:yyfill:enable = 0; + + end = "\x00"; + oct = [0-9]{1,3}; + dot = "."; + + * { printf("error\n"); return 1; } + + @o1 oct dot @o2 oct dot @o3 oct dot @o4 oct { + printf("parsed: %.*s, %.*s, %.*s, %*s!\n", + (int)(o2 - o1 - 1), o1, + (int)(o3 - o2 - 1), o2, + (int)(o4 - o3 - 1), o3, + (int)(YYCURSOR - o4), o4); + return 0; + } + */ +} + +int main(int argc, char **argv) +{ + for (int i = 1; i < argc; ++i) lex(argv[i]); + return 0; +} diff --git a/examples/09_etc_passwd.i--tags.c b/examples/09_etc_passwd.i--tags.c new file mode 100644 index 0000000..20f3adf --- /dev/null +++ b/examples/09_etc_passwd.i--tags.c @@ -0,0 +1,238 @@ +/* Generated by re2c */ +#include +#include + +#define YYMAXFILL 4 + + +static int lex(const char *YYCURSOR) +{ + const char *YYMARKER, *n, *p, *u, *g, *i, *h, *c; + const char *yyt1;const char *yyt2;const char *yyt3;const char *yyt4;const char *yyt5;const char *yyt6;const char *yyt7; +loop: + +{ + char yych; + yych = *YYCURSOR; + switch (yych) { + case 0x00: goto yy2; + case '\n': + case ':': goto yy6; + default: + yyt1 = YYCURSOR; + goto yy4; + } +yy2: + ++YYCURSOR; + { return 0; } +yy4: + yych = *(YYMARKER = ++YYCURSOR); + switch (yych) { + case 0x00: + case '\n': goto yy5; + default: goto yy8; + } +yy5: + { printf("error\n"); return 1; } +yy6: + ++YYCURSOR; + goto yy5; +yy7: + yych = *++YYCURSOR; +yy8: + switch (yych) { + case 0x00: + case '\n': goto yy9; + case ':': goto yy10; + default: goto yy7; + } +yy9: + YYCURSOR = YYMARKER; + goto yy5; +yy10: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: + case '\n': goto yy9; + case ':': + yyt2 = YYCURSOR; + goto yy13; + default: + yyt2 = YYCURSOR; + goto yy11; + } +yy11: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: + case '\n': goto yy9; + case ':': goto yy13; + default: goto yy11; + } +yy13: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + yyt3 = YYCURSOR; + goto yy14; + default: goto yy9; + } +yy14: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy14; + case ':': goto yy16; + default: goto yy9; + } +yy16: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + yyt4 = YYCURSOR; + goto yy17; + default: goto yy9; + } +yy17: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy17; + case ':': goto yy19; + default: goto yy9; + } +yy19: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: + case '\n': goto yy9; + case ':': + yyt5 = YYCURSOR; + goto yy22; + default: + yyt5 = YYCURSOR; + goto yy20; + } +yy20: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: + case '\n': goto yy9; + case ':': goto yy22; + default: goto yy20; + } +yy22: + yych = *++YYCURSOR; + switch (yych) { + case '/': + yyt6 = YYCURSOR; + goto yy23; + default: goto yy9; + } +yy23: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: + case '\n': goto yy9; + case ':': goto yy25; + default: goto yy23; + } +yy25: + yych = *++YYCURSOR; + switch (yych) { + case '/': + yyt7 = YYCURSOR; + goto yy26; + default: goto yy9; + } +yy26: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: + case ':': goto yy9; + case '\n': goto yy28; + default: goto yy26; + } +yy28: + ++YYCURSOR; + n = yyt1; + p = yyt2; + u = yyt3; + g = yyt4; + i = yyt5; + h = yyt6; + c = yyt7; + { + printf("user: %.*s\n", (int)(p - n) - 1, n); + printf("password: %.*s\n", (int)(u - p) - 1, p); + printf("UID: %.*s\n", (int)(g - u) - 1, u); + printf("GID: %.*s\n", (int)(i - g) - 1, g); + printf("info: %.*s\n", (int)(h - i) - 1, i); + printf("home: %.*s\n", (int)(c - h) - 1, h); + printf("command: %.*s\n", (int)(YYCURSOR - c - 1), c); + printf("\n"); + goto loop; + } +} + +} + +int main(int argc, char **argv) +{ + if (argc < 2) { + fprintf(stderr, "no input files\n"); + return 1; + } + + FILE *file = fopen(argv[1], "r"); + + fseek(file, 0, SEEK_END); + const size_t fsize = (size_t) ftell(file); + fseek(file, 0, SEEK_SET); + + char *buffer = (char*) malloc(fsize + 1); + + fread(buffer, 1, fsize, file); + buffer[fsize] = 0; + + const int status = lex(buffer); + + fclose(file); + free(buffer); + + return status; +} diff --git a/examples/09_etc_passwd.i--tags.re b/examples/09_etc_passwd.i--tags.re new file mode 100644 index 0000000..6564110 --- /dev/null +++ b/examples/09_etc_passwd.i--tags.re @@ -0,0 +1,74 @@ +#include +#include + +/*!max:re2c*/ + +static int lex(const char *YYCURSOR) +{ + const char *YYMARKER, *n, *p, *u, *g, *i, *h, *c; + /*!stags:re2c format = 'const char *@@;'; */ +loop: + /*!re2c + re2c:define:YYCTYPE = char; + re2c:yyfill:enable = 0; + + end = "\x00"; + eol = "\n"; + sep = [:]; + char = [^] \ (end | eol | sep); + user = char+; + pass = char*; + uid = [0-9]+; + gid = [0-9]+; + info = char*; + home = "/" char*; + cmd = "/" char*; + + * { printf("error\n"); return 1; } + end { return 0; } + + @n user sep + @p pass sep + @u uid sep + @g gid sep + @i info sep + @h home sep + @c cmd eol { + printf("user: %.*s\n", (int)(p - n) - 1, n); + printf("password: %.*s\n", (int)(u - p) - 1, p); + printf("UID: %.*s\n", (int)(g - u) - 1, u); + printf("GID: %.*s\n", (int)(i - g) - 1, g); + printf("info: %.*s\n", (int)(h - i) - 1, i); + printf("home: %.*s\n", (int)(c - h) - 1, h); + printf("command: %.*s\n", (int)(YYCURSOR - c - 1), c); + printf("\n"); + goto loop; + } + */ +} + +int main(int argc, char **argv) +{ + if (argc < 2) { + fprintf(stderr, "no input files\n"); + return 1; + } + + FILE *file = fopen(argv[1], "r"); + + fseek(file, 0, SEEK_END); + const size_t fsize = (size_t) ftell(file); + fseek(file, 0, SEEK_SET); + + char *buffer = (char*) malloc(fsize + 1); + + fread(buffer, 1, fsize, file); + buffer[fsize] = 0; + + const int status = lex(buffer); + + fclose(file); + free(buffer); + + return status; +} diff --git a/examples/10_uri_rfc3986.i--tags.c b/examples/10_uri_rfc3986.i--tags.c new file mode 100644 index 0000000..7ceaac3 --- /dev/null +++ b/examples/10_uri_rfc3986.i--tags.c @@ -0,0 +1,7935 @@ +/* Generated by re2c */ +#include +#include +#include + +#define YYMAXFILL 72 + +static const size_t SIZE = 4096; + +typedef struct { + FILE *file; + char *buf; + char *lim; + char *cur; + char *mar; + char *tok; + char *yyt1; +char *yyt10; +char *yyt11; +char *yyt12; +char *yyt13; +char *yyt14; +char *yyt15; +char *yyt16; +char *yyt17; +char *yyt18; +char *yyt19; +char *yyt2; +char *yyt20; +char *yyt3; +char *yyt4; +char *yyt5; +char *yyt6; +char *yyt7; +char *yyt8; +char *yyt9; + + int eof; +} input_t; + +static void init_input(input_t *in, const char *fname) +{ + in->file = fopen(fname, "r"); + in->buf = (char*) malloc(SIZE + YYMAXFILL); + in->lim = in->buf + SIZE; + in->cur = in->lim; + in->mar = in->lim; + in->tok = in->lim; + in->yyt1 = 0; +in->yyt10 = 0; +in->yyt11 = 0; +in->yyt12 = 0; +in->yyt13 = 0; +in->yyt14 = 0; +in->yyt15 = 0; +in->yyt16 = 0; +in->yyt17 = 0; +in->yyt18 = 0; +in->yyt19 = 0; +in->yyt2 = 0; +in->yyt20 = 0; +in->yyt3 = 0; +in->yyt4 = 0; +in->yyt5 = 0; +in->yyt6 = 0; +in->yyt7 = 0; +in->yyt8 = 0; +in->yyt9 = 0; + + in->eof = 0; +} + +static void free_input(input_t *in) +{ + free(in->buf); + fclose(in->file); +} + +static int fill(input_t *in, size_t need) +{ + size_t free; + if (in->eof) return 1; + + free = in->tok - in->buf; + if (free < need) return 2; + + memmove(in->buf, in->tok, in->lim - in->tok); + in->lim -= free; + in->cur -= free; + in->mar -= free; + in->tok -= free; + if (in->yyt1) in->yyt1 -= free; +if (in->yyt10) in->yyt10 -= free; +if (in->yyt11) in->yyt11 -= free; +if (in->yyt12) in->yyt12 -= free; +if (in->yyt13) in->yyt13 -= free; +if (in->yyt14) in->yyt14 -= free; +if (in->yyt15) in->yyt15 -= free; +if (in->yyt16) in->yyt16 -= free; +if (in->yyt17) in->yyt17 -= free; +if (in->yyt18) in->yyt18 -= free; +if (in->yyt19) in->yyt19 -= free; +if (in->yyt2) in->yyt2 -= free; +if (in->yyt20) in->yyt20 -= free; +if (in->yyt3) in->yyt3 -= free; +if (in->yyt4) in->yyt4 -= free; +if (in->yyt5) in->yyt5 -= free; +if (in->yyt6) in->yyt6 -= free; +if (in->yyt7) in->yyt7 -= free; +if (in->yyt8) in->yyt8 -= free; +if (in->yyt9) in->yyt9 -= free; + + in->lim += fread(in->lim, 1, free, in->file); + if (in->lim < in->buf + SIZE) { + in->eof = 1; + memset(in->lim, 0, YYMAXFILL); + in->lim += YYMAXFILL; + } + return 0; +} + +static int lex(input_t *in, long *count) +{ + const char + *s1, *u1, *h1, *h3, *h5, *r1, *p1, *p3, *q1, *f1, + *s2, *u2, *h2, *h4, *h6, *r2, *p2, *p4, *q2, *f2; + long c; + + c = 0; +loop: + in->tok = in->cur; + +{ + char yych; + unsigned int yyaccept = 0; + if ((in->lim - in->cur) < 72) if (fill(in, 72) != 0) return 2; + yych = *in->cur; + switch (yych) { + case 0x00: goto yy2; + case '\n': goto yy6; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + in->yyt1 = in->cur; + goto yy8; + default: goto yy4; + } +yy2: + ++in->cur; + { *count = c; return 0; } +yy4: + ++in->cur; +yy5: + { return 1; } +yy6: + ++in->cur; + { goto loop; } +yy8: + yyaccept = 0; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '+': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy10; + default: goto yy5; + } +yy9: + ++in->cur; + if ((in->lim - in->cur) < 71) if (fill(in, 71) != 0) return 2; + yych = *in->cur; +yy10: + switch (yych) { + case '+': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy9; + case ':': + in->yyt2 = in->cur; + goto yy12; + default: goto yy11; + } +yy11: + in->cur = in->mar; + switch (yyaccept) { + case 0: goto yy5; + case 1: + in->yyt3 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt9 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = NULL; + in->yyt4 = in->yyt5 = in->cur; + goto yy13; + case 2: + in->yyt3 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt9 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = NULL; + in->yyt5 = in->cur; + goto yy13; + case 3: + in->yyt7 = in->yyt8 = in->cur; + goto yy13; + case 4: + in->yyt7 = in->yyt8 = NULL; + in->yyt6 = in->yyt20 = in->cur; + goto yy13; + case 5: + in->yyt8 = in->cur; + goto yy13; + case 6: + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt9 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt15 = in->yyt16 = in->yyt19 = in->cur; + goto yy13; + case 7: + in->yyt7 = in->yyt8 = NULL; + in->yyt6 = in->cur; + goto yy13; + case 8: + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt16 = in->yyt19 = in->cur; + goto yy13; + case 9: + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt20 = NULL; + in->yyt3 = in->cur; + goto yy13; + case 10: + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt20 = NULL; + in->yyt3 = in->yyt17 = in->yyt18 = in->yyt19 = in->cur; + goto yy13; + case 11: + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt15 = in->yyt16 = in->yyt19 = in->cur; + goto yy13; + case 12: + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt20 = NULL; + in->yyt3 = in->yyt18 = in->yyt19 = in->cur; + goto yy13; + case 13: + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt16 = in->yyt19 = in->cur; + goto yy13; + case 14: + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy13; + default: + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy13; + } +yy12: + yyaccept = 1; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case ';': + case '=': + case '@': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': + in->yyt4 = in->cur; + goto yy14; + case '#': + in->yyt3 = in->yyt6 = in->yyt9 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = NULL; + in->yyt4 = in->yyt5 = in->cur; + goto yy16; + case '%': + in->yyt4 = in->cur; + goto yy17; + case '/': + in->yyt4 = in->cur; + goto yy18; + case '?': + in->yyt3 = in->yyt9 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = NULL; + in->yyt4 = in->yyt5 = in->cur; + goto yy19; + default: + in->yyt3 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt9 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = NULL; + in->yyt4 = in->yyt5 = in->cur; + goto yy13; + } +yy13: + s1 = in->yyt1; + s2 = in->yyt2; + u1 = in->yyt9; + u2 = in->yyt10; + h1 = in->yyt11; + h2 = in->yyt12; + h3 = in->yyt13; + h4 = in->yyt14; + h5 = in->yyt15; + h6 = in->yyt16; + r1 = in->yyt17; + r2 = in->yyt18; + p1 = in->yyt19; + p2 = in->yyt3; + p3 = in->yyt4; + p4 = in->yyt5; + q1 = in->yyt20; + q2 = in->yyt6; + f1 = in->yyt7; + f2 = in->yyt8; + { + ++c; + printf("URI %ld:\n", c); + printf(" scheme: %.*s\n", (int)(s2 - s1), s1); + if (u1) printf(" userinfo: %.*s\n", (int)(u2 - u1), u1); + if (h1) printf(" host: %.*s (IP literal)\n", (int)(h2 - h1), h1); + if (h3) printf(" host: %.*s (IPv4)\n", (int)(h4 - h3), h3); + if (h5) printf(" host: %.*s (name)\n", (int)(h6 - h5), h5); + if (r1) printf(" port: %.*s\n", (int)(r2 - r1), r1); + if (p1) printf(" path: %.*s\n", (int)(p2 - p1), p1); + if (p3) printf(" path: %.*s\n", (int)(p4 - p3), p3); + if (q1) printf(" query: %.*s\n", (int)(q2 - q1), q1); + if (f1) printf(" fragment: %.*s\n", (int)(f2 - f1), f1); + printf("\n"); + goto loop; + } +yy14: + yyaccept = 2; + in->mar = ++in->cur; + if ((in->lim - in->cur) < 3) if (fill(in, 3) != 0) return 2; + yych = *in->cur; +yy15: + switch (yych) { + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '/': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case ';': + case '=': + case '@': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy14; + case '#': + in->yyt3 = in->yyt6 = in->yyt9 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = NULL; + in->yyt5 = in->cur; + goto yy16; + case '%': goto yy17; + case '?': + in->yyt3 = in->yyt9 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = NULL; + in->yyt5 = in->cur; + goto yy19; + default: + in->yyt3 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt9 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = NULL; + in->yyt5 = in->cur; + goto yy13; + } +yy16: + yyaccept = 3; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '/': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case ';': + case '=': + case '?': + case '@': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': + in->yyt7 = in->cur; + goto yy20; + case '%': + in->yyt7 = in->cur; + goto yy22; + default: + in->yyt7 = in->yyt8 = in->cur; + goto yy13; + } +yy17: + ++in->cur; + if (in->lim <= in->cur) if (fill(in, 1) != 0) return 2; + yych = *in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy23; + default: goto yy11; + } +yy18: + yyaccept = 2; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '/': goto yy24; + default: goto yy15; + } +yy19: + yyaccept = 4; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '/': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case ';': + case '=': + case '?': + case '@': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': + in->yyt20 = in->cur; + goto yy25; + case '#': + in->yyt6 = in->yyt20 = in->cur; + goto yy16; + case '%': + in->yyt20 = in->cur; + goto yy27; + default: + in->yyt7 = in->yyt8 = NULL; + in->yyt6 = in->yyt20 = in->cur; + goto yy13; + } +yy20: + yyaccept = 5; + in->mar = ++in->cur; + if (in->lim <= in->cur) if (fill(in, 1) != 0) return 2; + yych = *in->cur; + switch (yych) { + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '/': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case ';': + case '=': + case '?': + case '@': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy20; + case '%': goto yy22; + default: + in->yyt8 = in->cur; + goto yy13; + } +yy22: + ++in->cur; + if (in->lim <= in->cur) if (fill(in, 1) != 0) return 2; + yych = *in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy28; + default: goto yy11; + } +yy23: + ++in->cur; + if (in->lim <= in->cur) if (fill(in, 1) != 0) return 2; + yych = *in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy14; + default: goto yy11; + } +yy24: + yyaccept = 6; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': + in->yyt9 = in->yyt10 = NULL; + in->yyt3 = in->yyt15 = in->cur; + goto yy29; + case '#': + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt9 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt15 = in->yyt16 = in->yyt19 = in->cur; + goto yy16; + case '%': + in->yyt9 = in->yyt10 = NULL; + in->yyt3 = in->yyt15 = in->cur; + goto yy31; + case '/': + in->yyt9 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt17 = in->yyt18 = NULL; + in->yyt15 = in->yyt16 = in->yyt19 = in->cur; + goto yy32; + case '0': + in->yyt9 = in->yyt10 = NULL; + in->yyt3 = in->yyt13 = in->yyt15 = in->cur; + goto yy34; + case '1': + in->yyt9 = in->yyt10 = NULL; + in->yyt3 = in->yyt13 = in->yyt15 = in->cur; + goto yy35; + case '2': + in->yyt9 = in->yyt10 = NULL; + in->yyt3 = in->yyt13 = in->yyt15 = in->cur; + goto yy36; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + in->yyt9 = in->yyt10 = NULL; + in->yyt3 = in->yyt13 = in->yyt15 = in->cur; + goto yy37; + case ':': + in->yyt9 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = NULL; + in->yyt3 = in->yyt15 = in->yyt16 = in->cur; + goto yy38; + case '?': + in->yyt4 = in->yyt5 = in->yyt9 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt17 = in->yyt18 = NULL; + in->yyt3 = in->yyt15 = in->yyt16 = in->yyt19 = in->cur; + goto yy19; + case '@': + in->yyt3 = in->yyt10 = in->cur; + goto yy39; + case '[': + in->yyt9 = in->yyt10 = NULL; + in->yyt11 = in->cur; + goto yy40; + default: + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt9 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt15 = in->yyt16 = in->yyt19 = in->cur; + goto yy13; + } +yy25: + yyaccept = 7; + in->mar = ++in->cur; + if ((in->lim - in->cur) < 2) if (fill(in, 2) != 0) return 2; + yych = *in->cur; + switch (yych) { + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '/': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case ';': + case '=': + case '?': + case '@': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy25; + case '#': + in->yyt6 = in->cur; + goto yy16; + case '%': goto yy27; + default: + in->yyt7 = in->yyt8 = NULL; + in->yyt6 = in->cur; + goto yy13; + } +yy27: + ++in->cur; + if (in->lim <= in->cur) if (fill(in, 1) != 0) return 2; + yych = *in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy41; + default: goto yy11; + } +yy28: + ++in->cur; + if (in->lim <= in->cur) if (fill(in, 1) != 0) return 2; + yych = *in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy20; + default: goto yy11; + } +yy29: + yyaccept = 8; + in->mar = ++in->cur; + if ((in->lim - in->cur) < 53) if (fill(in, 53) != 0) return 2; + yych = *in->cur; +yy30: + switch (yych) { + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy29; + case '#': + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt16 = in->yyt19 = in->cur; + goto yy16; + case '%': goto yy31; + case '/': + in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt17 = in->yyt18 = NULL; + in->yyt16 = in->yyt19 = in->cur; + goto yy32; + case ':': + in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = NULL; + in->yyt16 = in->cur; + goto yy38; + case '?': + in->yyt4 = in->yyt5 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt17 = in->yyt18 = NULL; + in->yyt3 = in->yyt16 = in->yyt19 = in->cur; + goto yy19; + case '@': + in->yyt10 = in->cur; + goto yy39; + default: + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt16 = in->yyt19 = in->cur; + goto yy13; + } +yy31: + ++in->cur; + if (in->lim <= in->cur) if (fill(in, 1) != 0) return 2; + yych = *in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy42; + default: goto yy11; + } +yy32: + yyaccept = 9; + in->mar = ++in->cur; + if ((in->lim - in->cur) < 3) if (fill(in, 3) != 0) return 2; + yych = *in->cur; + switch (yych) { + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '/': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case ';': + case '=': + case '@': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy32; + case '#': + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt20 = NULL; + in->yyt3 = in->cur; + goto yy16; + case '%': goto yy43; + case '?': + in->yyt4 = in->yyt5 = NULL; + in->yyt3 = in->cur; + goto yy19; + default: + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt20 = NULL; + in->yyt3 = in->cur; + goto yy13; + } +yy34: + yyaccept = 8; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy44; + default: goto yy30; + } +yy35: + yyaccept = 8; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy44; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy37; + default: goto yy30; + } +yy36: + yyaccept = 8; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy44; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy37; + case '5': goto yy45; + case '6': + case '7': + case '8': + case '9': goto yy34; + default: goto yy30; + } +yy37: + yyaccept = 8; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy44; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy34; + default: goto yy30; + } +yy38: + yyaccept = 10; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '!': + case '$': + case '%': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case ':': + case ';': + case '=': + case '@': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy47; + case '#': + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt20 = NULL; + in->yyt3 = in->yyt17 = in->yyt18 = in->yyt19 = in->cur; + goto yy16; + case '/': + in->yyt17 = in->yyt18 = in->yyt19 = in->cur; + goto yy32; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + in->yyt17 = in->cur; + goto yy49; + case '?': + in->yyt4 = in->yyt5 = NULL; + in->yyt3 = in->yyt17 = in->yyt18 = in->yyt19 = in->cur; + goto yy19; + default: + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt20 = NULL; + in->yyt3 = in->yyt17 = in->yyt18 = in->yyt19 = in->cur; + goto yy13; + } +yy39: + yyaccept = 11; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': + in->yyt15 = in->cur; + goto yy51; + case '#': + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt15 = in->yyt16 = in->yyt19 = in->cur; + goto yy16; + case '%': + in->yyt15 = in->cur; + goto yy53; + case '/': + in->yyt9 = in->yyt3; + in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt17 = in->yyt18 = NULL; + in->yyt15 = in->yyt16 = in->yyt19 = in->cur; + goto yy32; + case '0': + in->yyt13 = in->yyt15 = in->cur; + goto yy54; + case '1': + in->yyt13 = in->yyt15 = in->cur; + goto yy55; + case '2': + in->yyt13 = in->yyt15 = in->cur; + goto yy56; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + in->yyt13 = in->yyt15 = in->cur; + goto yy57; + case ':': + in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = NULL; + in->yyt15 = in->yyt16 = in->cur; + goto yy58; + case '?': + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt17 = in->yyt18 = NULL; + in->yyt3 = in->yyt15 = in->yyt16 = in->yyt19 = in->cur; + goto yy19; + case '[': + in->yyt9 = in->yyt3; + in->yyt11 = in->cur; + goto yy40; + default: + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt15 = in->yyt16 = in->yyt19 = in->cur; + goto yy13; + } +yy40: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy59; + case ':': goto yy60; + case 'v': goto yy61; + default: goto yy11; + } +yy41: + ++in->cur; + if (in->lim <= in->cur) if (fill(in, 1) != 0) return 2; + yych = *in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy25; + default: goto yy11; + } +yy42: + ++in->cur; + if (in->lim <= in->cur) if (fill(in, 1) != 0) return 2; + yych = *in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy29; + default: goto yy11; + } +yy43: + ++in->cur; + if (in->lim <= in->cur) if (fill(in, 1) != 0) return 2; + yych = *in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy62; + default: goto yy11; + } +yy44: + yyaccept = 8; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '0': goto yy63; + case '1': goto yy64; + case '2': goto yy65; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy66; + default: goto yy30; + } +yy45: + yyaccept = 8; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy44; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy34; + default: goto yy30; + } +yy46: + ++in->cur; + if ((in->lim - in->cur) < 52) if (fill(in, 52) != 0) return 2; + yych = *in->cur; +yy47: + switch (yych) { + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy46; + case '%': goto yy48; + case '@': + in->yyt10 = in->cur; + goto yy39; + default: goto yy11; + } +yy48: + ++in->cur; + if (in->lim <= in->cur) if (fill(in, 1) != 0) return 2; + yych = *in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy67; + default: goto yy11; + } +yy49: + yyaccept = 12; + in->mar = ++in->cur; + if ((in->lim - in->cur) < 52) if (fill(in, 52) != 0) return 2; + yych = *in->cur; + switch (yych) { + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case ':': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy46; + case '#': + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt20 = NULL; + in->yyt3 = in->yyt18 = in->yyt19 = in->cur; + goto yy16; + case '%': goto yy48; + case '/': + in->yyt18 = in->yyt19 = in->cur; + goto yy32; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy49; + case '?': + in->yyt4 = in->yyt5 = NULL; + in->yyt3 = in->yyt18 = in->yyt19 = in->cur; + goto yy19; + case '@': + in->yyt10 = in->cur; + goto yy39; + default: + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt20 = NULL; + in->yyt3 = in->yyt18 = in->yyt19 = in->cur; + goto yy13; + } +yy51: + yyaccept = 13; + in->mar = ++in->cur; + if ((in->lim - in->cur) < 4) if (fill(in, 4) != 0) return 2; + yych = *in->cur; +yy52: + switch (yych) { + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy51; + case '#': + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt16 = in->yyt19 = in->cur; + goto yy16; + case '%': goto yy53; + case '/': + in->yyt9 = in->yyt3; + in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt17 = in->yyt18 = NULL; + in->yyt16 = in->yyt19 = in->cur; + goto yy32; + case ':': + in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = NULL; + in->yyt16 = in->cur; + goto yy58; + case '?': + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt17 = in->yyt18 = NULL; + in->yyt3 = in->yyt16 = in->yyt19 = in->cur; + goto yy19; + default: + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt16 = in->yyt19 = in->cur; + goto yy13; + } +yy53: + ++in->cur; + if (in->lim <= in->cur) if (fill(in, 1) != 0) return 2; + yych = *in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy68; + default: goto yy11; + } +yy54: + yyaccept = 13; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy69; + default: goto yy52; + } +yy55: + yyaccept = 13; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy69; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy57; + default: goto yy52; + } +yy56: + yyaccept = 13; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy69; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy57; + case '5': goto yy70; + case '6': + case '7': + case '8': + case '9': goto yy54; + default: goto yy52; + } +yy57: + yyaccept = 13; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy69; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy54; + default: goto yy52; + } +yy58: + yych = *++in->cur; + switch (yych) { + case '#': + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt20 = NULL; + in->yyt3 = in->yyt17 = in->yyt18 = in->yyt19 = in->cur; + goto yy16; + case '/': + in->yyt9 = in->yyt3; + in->yyt17 = in->yyt18 = in->yyt19 = in->cur; + goto yy32; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + in->yyt17 = in->cur; + goto yy71; + case '?': + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = NULL; + in->yyt3 = in->yyt17 = in->yyt18 = in->yyt19 = in->cur; + goto yy19; + default: + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt20 = NULL; + in->yyt3 = in->yyt17 = in->yyt18 = in->yyt19 = in->cur; + goto yy13; + } +yy59: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy73; + case ':': goto yy74; + default: goto yy11; + } +yy60: + yych = *++in->cur; + switch (yych) { + case ':': goto yy75; + default: goto yy11; + } +yy61: + yych = *++in->cur; + switch (yych) { + case '.': goto yy11; + default: goto yy77; + } +yy62: + ++in->cur; + if (in->lim <= in->cur) if (fill(in, 1) != 0) return 2; + yych = *in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy32; + default: goto yy11; + } +yy63: + yyaccept = 8; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy78; + default: goto yy30; + } +yy64: + yyaccept = 8; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy78; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy66; + default: goto yy30; + } +yy65: + yyaccept = 8; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy78; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy66; + case '5': goto yy79; + case '6': + case '7': + case '8': + case '9': goto yy63; + default: goto yy30; + } +yy66: + yyaccept = 8; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy78; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy63; + default: goto yy30; + } +yy67: + ++in->cur; + if (in->lim <= in->cur) if (fill(in, 1) != 0) return 2; + yych = *in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy46; + default: goto yy11; + } +yy68: + ++in->cur; + if (in->lim <= in->cur) if (fill(in, 1) != 0) return 2; + yych = *in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy51; + default: goto yy11; + } +yy69: + yyaccept = 13; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '0': goto yy80; + case '1': goto yy81; + case '2': goto yy82; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy83; + default: goto yy52; + } +yy70: + yyaccept = 13; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy69; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy54; + default: goto yy52; + } +yy71: + ++in->cur; + if ((in->lim - in->cur) < 3) if (fill(in, 3) != 0) return 2; + yych = *in->cur; + switch (yych) { + case '#': + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt20 = NULL; + in->yyt3 = in->yyt18 = in->yyt19 = in->cur; + goto yy16; + case '/': + in->yyt9 = in->yyt3; + in->yyt18 = in->yyt19 = in->cur; + goto yy32; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy71; + case '?': + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = NULL; + in->yyt3 = in->yyt18 = in->yyt19 = in->cur; + goto yy19; + default: + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt20 = NULL; + in->yyt3 = in->yyt18 = in->yyt19 = in->cur; + goto yy13; + } +yy73: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy84; + case ':': goto yy74; + default: goto yy11; + } +yy74: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy85; + case ':': goto yy86; + default: goto yy11; + } +yy75: + yych = *++in->cur; + switch (yych) { + case '0': goto yy87; + case '1': goto yy88; + case '2': goto yy89; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy90; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy91; + case ']': goto yy92; + default: goto yy11; + } +yy76: + ++in->cur; + if ((in->lim - in->cur) < 2) if (fill(in, 2) != 0) return 2; + yych = *in->cur; +yy77: + switch (yych) { + case '.': goto yy93; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy76; + default: goto yy11; + } +yy78: + yyaccept = 8; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '0': goto yy94; + case '1': goto yy95; + case '2': goto yy96; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy97; + default: goto yy30; + } +yy79: + yyaccept = 8; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy78; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy63; + default: goto yy30; + } +yy80: + yyaccept = 13; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy98; + default: goto yy52; + } +yy81: + yyaccept = 13; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy98; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy83; + default: goto yy52; + } +yy82: + yyaccept = 13; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy98; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy83; + case '5': goto yy99; + case '6': + case '7': + case '8': + case '9': goto yy80; + default: goto yy52; + } +yy83: + yyaccept = 13; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy98; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy80; + default: goto yy52; + } +yy84: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy100; + case ':': goto yy74; + default: goto yy11; + } +yy85: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy101; + case ':': goto yy102; + default: goto yy11; + } +yy86: + yych = *++in->cur; + switch (yych) { + case '0': goto yy103; + case '1': goto yy104; + case '2': goto yy105; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy106; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy107; + case ']': goto yy92; + default: goto yy11; + } +yy87: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy109; + case ':': goto yy110; + case ']': goto yy92; + default: goto yy11; + } +yy88: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy111; + case ':': goto yy110; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy109; + case ']': goto yy92; + default: goto yy11; + } +yy89: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy111; + case '5': goto yy112; + case '6': + case '7': + case '8': + case '9': goto yy113; + case ':': goto yy110; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy109; + case ']': goto yy92; + default: goto yy11; + } +yy90: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy113; + case ':': goto yy110; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy109; + case ']': goto yy92; + default: goto yy11; + } +yy91: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy109; + case ':': goto yy110; + case ']': goto yy92; + default: goto yy11; + } +yy92: + yych = *++in->cur; + switch (yych) { + case '#': + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt12 = in->yyt19 = in->cur; + goto yy16; + case '/': + in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = NULL; + in->yyt12 = in->yyt19 = in->cur; + goto yy32; + case ':': + in->yyt3 = in->yyt9; + in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = NULL; + in->yyt12 = in->cur; + goto yy58; + case '?': + in->yyt4 = in->yyt5 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = NULL; + in->yyt3 = in->yyt12 = in->yyt19 = in->cur; + goto yy19; + default: + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt12 = in->yyt19 = in->cur; + goto yy13; + } +yy93: + yych = *++in->cur; + switch (yych) { + case ']': goto yy11; + default: goto yy115; + } +yy94: + yyaccept = 8; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy116; + default: goto yy30; + } +yy95: + yyaccept = 8; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy116; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy97; + default: goto yy30; + } +yy96: + yyaccept = 8; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy116; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy97; + case '5': goto yy117; + case '6': + case '7': + case '8': + case '9': goto yy94; + default: goto yy30; + } +yy97: + yyaccept = 8; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy116; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy94; + default: goto yy30; + } +yy98: + yyaccept = 13; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '0': goto yy118; + case '1': goto yy119; + case '2': goto yy120; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy121; + default: goto yy52; + } +yy99: + yyaccept = 13; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy98; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy80; + default: goto yy52; + } +yy100: + yych = *++in->cur; + switch (yych) { + case ':': goto yy74; + default: goto yy11; + } +yy101: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy122; + case ':': goto yy102; + default: goto yy11; + } +yy102: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy123; + case ':': goto yy124; + default: goto yy11; + } +yy103: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy125; + case ':': goto yy126; + case ']': goto yy92; + default: goto yy11; + } +yy104: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy127; + case ':': goto yy126; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy125; + case ']': goto yy92; + default: goto yy11; + } +yy105: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy127; + case '5': goto yy128; + case '6': + case '7': + case '8': + case '9': goto yy129; + case ':': goto yy126; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy125; + case ']': goto yy92; + default: goto yy11; + } +yy106: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy129; + case ':': goto yy126; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy125; + case ']': goto yy92; + default: goto yy11; + } +yy107: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy125; + case ':': goto yy126; + case ']': goto yy92; + default: goto yy11; + } +yy108: + yych = *++in->cur; + switch (yych) { + case '0': goto yy130; + case '1': goto yy131; + case '2': goto yy132; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy133; + default: goto yy11; + } +yy109: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy134; + case ':': goto yy110; + case ']': goto yy92; + default: goto yy11; + } +yy110: + yych = *++in->cur; + switch (yych) { + case '0': goto yy103; + case '1': goto yy104; + case '2': goto yy105; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy106; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy107; + default: goto yy11; + } +yy111: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy135; + case ':': goto yy110; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy134; + case ']': goto yy92; + default: goto yy11; + } +yy112: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy135; + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy134; + case ':': goto yy110; + case ']': goto yy92; + default: goto yy11; + } +yy113: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy134; + case ':': goto yy110; + case ']': goto yy92; + default: goto yy11; + } +yy114: + ++in->cur; + if ((in->lim - in->cur) < 5) if (fill(in, 5) != 0) return 2; + yych = *in->cur; +yy115: + switch (yych) { + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy114; + case ']': goto yy92; + default: goto yy11; + } +yy116: + yyaccept = 8; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '0': goto yy136; + case '1': goto yy137; + case '2': goto yy138; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy139; + default: goto yy30; + } +yy117: + yyaccept = 8; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy116; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy94; + default: goto yy30; + } +yy118: + yyaccept = 13; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy140; + default: goto yy52; + } +yy119: + yyaccept = 13; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy140; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy121; + default: goto yy52; + } +yy120: + yyaccept = 13; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy140; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy121; + case '5': goto yy141; + case '6': + case '7': + case '8': + case '9': goto yy118; + default: goto yy52; + } +yy121: + yyaccept = 13; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy140; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy118; + default: goto yy52; + } +yy122: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy142; + case ':': goto yy102; + default: goto yy11; + } +yy123: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy143; + case ':': goto yy144; + default: goto yy11; + } +yy124: + yych = *++in->cur; + switch (yych) { + case '0': goto yy145; + case '1': goto yy146; + case '2': goto yy147; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy148; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy149; + case ']': goto yy92; + default: goto yy11; + } +yy125: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy150; + case ':': goto yy126; + case ']': goto yy92; + default: goto yy11; + } +yy126: + yych = *++in->cur; + switch (yych) { + case '0': goto yy145; + case '1': goto yy146; + case '2': goto yy147; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy148; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy149; + default: goto yy11; + } +yy127: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy151; + case ':': goto yy126; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy150; + case ']': goto yy92; + default: goto yy11; + } +yy128: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy151; + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy150; + case ':': goto yy126; + case ']': goto yy92; + default: goto yy11; + } +yy129: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy150; + case ':': goto yy126; + case ']': goto yy92; + default: goto yy11; + } +yy130: + yych = *++in->cur; + switch (yych) { + case '.': goto yy152; + default: goto yy11; + } +yy131: + yych = *++in->cur; + switch (yych) { + case '.': goto yy152; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy133; + default: goto yy11; + } +yy132: + yych = *++in->cur; + switch (yych) { + case '.': goto yy152; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy133; + case '5': goto yy153; + case '6': + case '7': + case '8': + case '9': goto yy130; + default: goto yy11; + } +yy133: + yych = *++in->cur; + switch (yych) { + case '.': goto yy152; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy130; + default: goto yy11; + } +yy134: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy154; + case ':': goto yy110; + case ']': goto yy92; + default: goto yy11; + } +yy135: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy154; + case ':': goto yy110; + case ']': goto yy92; + default: goto yy11; + } +yy136: + yyaccept = 14; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '!': + case '$': + case '%': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ';': + case '=': + case '@': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy30; + case '#': + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy16; + case '/': + in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = NULL; + in->yyt14 = in->yyt19 = in->cur; + goto yy32; + case ':': + in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = NULL; + in->yyt14 = in->cur; + goto yy38; + case '?': + in->yyt4 = in->yyt5 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy19; + default: + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy13; + } +yy137: + yyaccept = 14; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '!': + case '$': + case '%': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case ';': + case '=': + case '@': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy30; + case '#': + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy16; + case '/': + in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = NULL; + in->yyt14 = in->yyt19 = in->cur; + goto yy32; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy139; + case ':': + in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = NULL; + in->yyt14 = in->cur; + goto yy38; + case '?': + in->yyt4 = in->yyt5 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy19; + default: + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy13; + } +yy138: + yyaccept = 14; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '!': + case '$': + case '%': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case ';': + case '=': + case '@': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy30; + case '#': + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy16; + case '/': + in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = NULL; + in->yyt14 = in->yyt19 = in->cur; + goto yy32; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy139; + case '5': goto yy155; + case '6': + case '7': + case '8': + case '9': goto yy136; + case ':': + in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = NULL; + in->yyt14 = in->cur; + goto yy38; + case '?': + in->yyt4 = in->yyt5 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy19; + default: + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy13; + } +yy139: + yyaccept = 14; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '!': + case '$': + case '%': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case ';': + case '=': + case '@': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy30; + case '#': + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy16; + case '/': + in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = NULL; + in->yyt14 = in->yyt19 = in->cur; + goto yy32; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy136; + case ':': + in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = NULL; + in->yyt14 = in->cur; + goto yy38; + case '?': + in->yyt4 = in->yyt5 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy19; + default: + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy13; + } +yy140: + yyaccept = 13; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '0': goto yy156; + case '1': goto yy157; + case '2': goto yy158; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy159; + default: goto yy52; + } +yy141: + yyaccept = 13; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '.': goto yy140; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy118; + default: goto yy52; + } +yy142: + yych = *++in->cur; + switch (yych) { + case ':': goto yy102; + default: goto yy11; + } +yy143: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy160; + case ':': goto yy144; + default: goto yy11; + } +yy144: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy161; + case ':': goto yy162; + default: goto yy11; + } +yy145: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy163; + case ':': goto yy164; + case ']': goto yy92; + default: goto yy11; + } +yy146: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy165; + case ':': goto yy164; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy163; + case ']': goto yy92; + default: goto yy11; + } +yy147: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy165; + case '5': goto yy166; + case '6': + case '7': + case '8': + case '9': goto yy167; + case ':': goto yy164; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy163; + case ']': goto yy92; + default: goto yy11; + } +yy148: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy167; + case ':': goto yy164; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy163; + case ']': goto yy92; + default: goto yy11; + } +yy149: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy163; + case ':': goto yy164; + case ']': goto yy92; + default: goto yy11; + } +yy150: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy168; + case ':': goto yy126; + case ']': goto yy92; + default: goto yy11; + } +yy151: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy168; + case ':': goto yy126; + case ']': goto yy92; + default: goto yy11; + } +yy152: + yych = *++in->cur; + switch (yych) { + case '0': goto yy169; + case '1': goto yy170; + case '2': goto yy171; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy172; + default: goto yy11; + } +yy153: + yych = *++in->cur; + switch (yych) { + case '.': goto yy152; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy130; + default: goto yy11; + } +yy154: + yych = *++in->cur; + switch (yych) { + case ':': goto yy110; + case ']': goto yy92; + default: goto yy11; + } +yy155: + yyaccept = 14; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '!': + case '$': + case '%': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '6': + case '7': + case '8': + case '9': + case ';': + case '=': + case '@': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy30; + case '#': + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy16; + case '/': + in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = NULL; + in->yyt14 = in->yyt19 = in->cur; + goto yy32; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy136; + case ':': + in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = NULL; + in->yyt14 = in->cur; + goto yy38; + case '?': + in->yyt4 = in->yyt5 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy19; + default: + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy13; + } +yy156: + yyaccept = 15; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '!': + case '$': + case '%': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy52; + case '#': + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy16; + case '/': + in->yyt9 = in->yyt3; + in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = NULL; + in->yyt14 = in->yyt19 = in->cur; + goto yy32; + case ':': + in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = NULL; + in->yyt14 = in->cur; + goto yy58; + case '?': + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy19; + default: + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy13; + } +yy157: + yyaccept = 15; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '!': + case '$': + case '%': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy52; + case '#': + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy16; + case '/': + in->yyt9 = in->yyt3; + in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = NULL; + in->yyt14 = in->yyt19 = in->cur; + goto yy32; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy159; + case ':': + in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = NULL; + in->yyt14 = in->cur; + goto yy58; + case '?': + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy19; + default: + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy13; + } +yy158: + yyaccept = 15; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '!': + case '$': + case '%': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy52; + case '#': + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy16; + case '/': + in->yyt9 = in->yyt3; + in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = NULL; + in->yyt14 = in->yyt19 = in->cur; + goto yy32; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy159; + case '5': goto yy173; + case '6': + case '7': + case '8': + case '9': goto yy156; + case ':': + in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = NULL; + in->yyt14 = in->cur; + goto yy58; + case '?': + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy19; + default: + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy13; + } +yy159: + yyaccept = 15; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '!': + case '$': + case '%': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy52; + case '#': + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy16; + case '/': + in->yyt9 = in->yyt3; + in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = NULL; + in->yyt14 = in->yyt19 = in->cur; + goto yy32; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy156; + case ':': + in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = NULL; + in->yyt14 = in->cur; + goto yy58; + case '?': + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy19; + default: + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy13; + } +yy160: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy174; + case ':': goto yy144; + default: goto yy11; + } +yy161: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy175; + case ':': goto yy176; + default: goto yy11; + } +yy162: + yych = *++in->cur; + switch (yych) { + case '0': goto yy177; + case '1': goto yy178; + case '2': goto yy179; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy180; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy181; + case ']': goto yy92; + default: goto yy11; + } +yy163: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy182; + case ':': goto yy164; + case ']': goto yy92; + default: goto yy11; + } +yy164: + yych = *++in->cur; + switch (yych) { + case '0': goto yy177; + case '1': goto yy178; + case '2': goto yy179; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy180; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy181; + default: goto yy11; + } +yy165: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy183; + case ':': goto yy164; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy182; + case ']': goto yy92; + default: goto yy11; + } +yy166: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy183; + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy182; + case ':': goto yy164; + case ']': goto yy92; + default: goto yy11; + } +yy167: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy182; + case ':': goto yy164; + case ']': goto yy92; + default: goto yy11; + } +yy168: + yych = *++in->cur; + switch (yych) { + case ':': goto yy126; + case ']': goto yy92; + default: goto yy11; + } +yy169: + yych = *++in->cur; + switch (yych) { + case '.': goto yy184; + default: goto yy11; + } +yy170: + yych = *++in->cur; + switch (yych) { + case '.': goto yy184; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy172; + default: goto yy11; + } +yy171: + yych = *++in->cur; + switch (yych) { + case '.': goto yy184; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy172; + case '5': goto yy185; + case '6': + case '7': + case '8': + case '9': goto yy169; + default: goto yy11; + } +yy172: + yych = *++in->cur; + switch (yych) { + case '.': goto yy184; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy169; + default: goto yy11; + } +yy173: + yyaccept = 15; + yych = *(in->mar = ++in->cur); + switch (yych) { + case '!': + case '$': + case '%': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '6': + case '7': + case '8': + case '9': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy52; + case '#': + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy16; + case '/': + in->yyt9 = in->yyt3; + in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = NULL; + in->yyt14 = in->yyt19 = in->cur; + goto yy32; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy156; + case ':': + in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = NULL; + in->yyt14 = in->cur; + goto yy58; + case '?': + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy19; + default: + in->yyt9 = in->yyt3; + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt11 = in->yyt12 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt20 = NULL; + in->yyt3 = in->yyt14 = in->yyt19 = in->cur; + goto yy13; + } +yy174: + yych = *++in->cur; + switch (yych) { + case ':': goto yy144; + default: goto yy11; + } +yy175: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy186; + case ':': goto yy176; + default: goto yy11; + } +yy176: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy187; + case ':': goto yy188; + default: goto yy11; + } +yy177: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy189; + case ':': goto yy190; + case ']': goto yy92; + default: goto yy11; + } +yy178: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy191; + case ':': goto yy190; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy189; + case ']': goto yy92; + default: goto yy11; + } +yy179: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy191; + case '5': goto yy192; + case '6': + case '7': + case '8': + case '9': goto yy193; + case ':': goto yy190; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy189; + case ']': goto yy92; + default: goto yy11; + } +yy180: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy193; + case ':': goto yy190; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy189; + case ']': goto yy92; + default: goto yy11; + } +yy181: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy189; + case ':': goto yy190; + case ']': goto yy92; + default: goto yy11; + } +yy182: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy194; + case ':': goto yy164; + case ']': goto yy92; + default: goto yy11; + } +yy183: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy194; + case ':': goto yy164; + case ']': goto yy92; + default: goto yy11; + } +yy184: + yych = *++in->cur; + switch (yych) { + case '0': goto yy195; + case '1': goto yy196; + case '2': goto yy197; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy198; + default: goto yy11; + } +yy185: + yych = *++in->cur; + switch (yych) { + case '.': goto yy184; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy169; + default: goto yy11; + } +yy186: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy199; + case ':': goto yy176; + default: goto yy11; + } +yy187: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy200; + case ':': goto yy201; + default: goto yy11; + } +yy188: + yych = *++in->cur; + switch (yych) { + case '0': goto yy202; + case '1': goto yy203; + case '2': goto yy204; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy205; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy206; + case ']': goto yy92; + default: goto yy11; + } +yy189: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy207; + case ':': goto yy190; + case ']': goto yy92; + default: goto yy11; + } +yy190: + yych = *++in->cur; + switch (yych) { + case '0': goto yy202; + case '1': goto yy203; + case '2': goto yy204; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy205; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy206; + default: goto yy11; + } +yy191: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy208; + case ':': goto yy190; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy207; + case ']': goto yy92; + default: goto yy11; + } +yy192: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy208; + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy207; + case ':': goto yy190; + case ']': goto yy92; + default: goto yy11; + } +yy193: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy207; + case ':': goto yy190; + case ']': goto yy92; + default: goto yy11; + } +yy194: + yych = *++in->cur; + switch (yych) { + case ':': goto yy164; + case ']': goto yy92; + default: goto yy11; + } +yy195: + yych = *++in->cur; + switch (yych) { + case ']': goto yy92; + default: goto yy11; + } +yy196: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy198; + case ']': goto yy92; + default: goto yy11; + } +yy197: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': goto yy198; + case '5': goto yy209; + case '6': + case '7': + case '8': + case '9': goto yy195; + case ']': goto yy92; + default: goto yy11; + } +yy198: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy195; + case ']': goto yy92; + default: goto yy11; + } +yy199: + yych = *++in->cur; + switch (yych) { + case ':': goto yy176; + default: goto yy11; + } +yy200: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy210; + case ':': goto yy201; + default: goto yy11; + } +yy201: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy211; + case ':': goto yy212; + default: goto yy11; + } +yy202: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy213; + case ':': goto yy214; + case ']': goto yy92; + default: goto yy11; + } +yy203: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy215; + case ':': goto yy214; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy213; + case ']': goto yy92; + default: goto yy11; + } +yy204: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy215; + case '5': goto yy216; + case '6': + case '7': + case '8': + case '9': goto yy217; + case ':': goto yy214; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy213; + case ']': goto yy92; + default: goto yy11; + } +yy205: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy217; + case ':': goto yy214; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy213; + case ']': goto yy92; + default: goto yy11; + } +yy206: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy213; + case ':': goto yy214; + case ']': goto yy92; + default: goto yy11; + } +yy207: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy218; + case ':': goto yy190; + case ']': goto yy92; + default: goto yy11; + } +yy208: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy218; + case ':': goto yy190; + case ']': goto yy92; + default: goto yy11; + } +yy209: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy195; + case ']': goto yy92; + default: goto yy11; + } +yy210: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy219; + case ':': goto yy201; + default: goto yy11; + } +yy211: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy220; + case ':': goto yy221; + default: goto yy11; + } +yy212: + yych = *++in->cur; + switch (yych) { + case '0': goto yy222; + case '1': goto yy223; + case '2': goto yy224; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy225; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy226; + case ']': goto yy92; + default: goto yy11; + } +yy213: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy227; + case ':': goto yy214; + case ']': goto yy92; + default: goto yy11; + } +yy214: + yych = *++in->cur; + switch (yych) { + case '0': goto yy222; + case '1': goto yy223; + case '2': goto yy224; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy225; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy226; + default: goto yy11; + } +yy215: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy228; + case ':': goto yy214; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy227; + case ']': goto yy92; + default: goto yy11; + } +yy216: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy228; + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy227; + case ':': goto yy214; + case ']': goto yy92; + default: goto yy11; + } +yy217: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy227; + case ':': goto yy214; + case ']': goto yy92; + default: goto yy11; + } +yy218: + yych = *++in->cur; + switch (yych) { + case ':': goto yy190; + case ']': goto yy92; + default: goto yy11; + } +yy219: + yych = *++in->cur; + switch (yych) { + case ':': goto yy201; + default: goto yy11; + } +yy220: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy229; + case ':': goto yy221; + default: goto yy11; + } +yy221: + yych = *++in->cur; + switch (yych) { + case '0': goto yy230; + case '1': goto yy231; + case '2': goto yy232; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy233; + case ':': goto yy234; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy235; + default: goto yy11; + } +yy222: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy236; + case ':': goto yy237; + case ']': goto yy92; + default: goto yy11; + } +yy223: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy238; + case ':': goto yy237; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy236; + case ']': goto yy92; + default: goto yy11; + } +yy224: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy238; + case '5': goto yy239; + case '6': + case '7': + case '8': + case '9': goto yy240; + case ':': goto yy237; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy236; + case ']': goto yy92; + default: goto yy11; + } +yy225: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy240; + case ':': goto yy237; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy236; + case ']': goto yy92; + default: goto yy11; + } +yy226: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy236; + case ':': goto yy237; + case ']': goto yy92; + default: goto yy11; + } +yy227: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy241; + case ':': goto yy214; + case ']': goto yy92; + default: goto yy11; + } +yy228: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy241; + case ':': goto yy214; + case ']': goto yy92; + default: goto yy11; + } +yy229: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy242; + case ':': goto yy221; + default: goto yy11; + } +yy230: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy243; + case ':': goto yy244; + default: goto yy11; + } +yy231: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy245; + case ':': goto yy244; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy243; + default: goto yy11; + } +yy232: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy245; + case '5': goto yy246; + case '6': + case '7': + case '8': + case '9': goto yy247; + case ':': goto yy244; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy243; + default: goto yy11; + } +yy233: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy247; + case ':': goto yy244; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy243; + default: goto yy11; + } +yy234: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy248; + case ']': goto yy92; + default: goto yy11; + } +yy235: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy243; + case ':': goto yy244; + default: goto yy11; + } +yy236: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy249; + case ':': goto yy237; + case ']': goto yy92; + default: goto yy11; + } +yy237: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy248; + default: goto yy11; + } +yy238: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy250; + case ':': goto yy237; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy249; + case ']': goto yy92; + default: goto yy11; + } +yy239: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy250; + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy249; + case ':': goto yy237; + case ']': goto yy92; + default: goto yy11; + } +yy240: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy249; + case ':': goto yy237; + case ']': goto yy92; + default: goto yy11; + } +yy241: + yych = *++in->cur; + switch (yych) { + case ':': goto yy214; + case ']': goto yy92; + default: goto yy11; + } +yy242: + yych = *++in->cur; + switch (yych) { + case ':': goto yy221; + default: goto yy11; + } +yy243: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy251; + case ':': goto yy244; + default: goto yy11; + } +yy244: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy248; + case ':': goto yy195; + default: goto yy11; + } +yy245: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy252; + case ':': goto yy244; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy251; + default: goto yy11; + } +yy246: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy252; + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy251; + case ':': goto yy244; + default: goto yy11; + } +yy247: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy251; + case ':': goto yy244; + default: goto yy11; + } +yy248: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy253; + case ']': goto yy92; + default: goto yy11; + } +yy249: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy254; + case ':': goto yy237; + case ']': goto yy92; + default: goto yy11; + } +yy250: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy254; + case ':': goto yy237; + case ']': goto yy92; + default: goto yy11; + } +yy251: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy255; + case ':': goto yy244; + default: goto yy11; + } +yy252: + yych = *++in->cur; + switch (yych) { + case '.': goto yy108; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy255; + case ':': goto yy244; + default: goto yy11; + } +yy253: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy256; + case ']': goto yy92; + default: goto yy11; + } +yy254: + yych = *++in->cur; + switch (yych) { + case ':': goto yy237; + case ']': goto yy92; + default: goto yy11; + } +yy255: + yych = *++in->cur; + switch (yych) { + case ':': goto yy244; + default: goto yy11; + } +yy256: + yych = *++in->cur; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy195; + case ']': goto yy92; + default: goto yy11; + } +} + +} + +int main(int argc, char **argv) +{ + long count; + input_t in; + init_input(&in, argv[1]); + + switch (lex(&in, &count)) { + case 0: fprintf(stderr, "ok, parsed %ld URIs\n", count); break; + case 1: fprintf(stderr, "syntax error\n"); break; + case 2: fprintf(stderr, "yyfill error\n"); break; + default: fprintf(stderr, "panic\n"); break; + } + + free_input(&in); + return 0; +} +re2c: warning: line 135: tag 'u1' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 135: tag 'u2' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 135: tag 'h1' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 135: tag 'h2' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 135: tag 'h3' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 135: tag 'h4' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 135: tag 'h5' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 135: tag 'h6' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 135: tag 'r1' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 135: tag 'p3' has 2nd degree of nondeterminism [-Wnondeterministic-tags] diff --git a/examples/10_uri_rfc3986.i--tags.re b/examples/10_uri_rfc3986.i--tags.re new file mode 100644 index 0000000..c143813 --- /dev/null +++ b/examples/10_uri_rfc3986.i--tags.re @@ -0,0 +1,169 @@ +#include +#include +#include + +/*!max:re2c*/ +static const size_t SIZE = 4096; + +typedef struct { + FILE *file; + char *buf; + char *lim; + char *cur; + char *mar; + char *tok; + /*!stags:re2c format = "char *@@;\n"; */ + int eof; +} input_t; + +static void init_input(input_t *in, const char *fname) +{ + in->file = fopen(fname, "r"); + in->buf = (char*) malloc(SIZE + YYMAXFILL); + in->lim = in->buf + SIZE; + in->cur = in->lim; + in->mar = in->lim; + in->tok = in->lim; + /*!stags:re2c format = "in->@@ = 0;\n"; */ + in->eof = 0; +} + +static void free_input(input_t *in) +{ + free(in->buf); + fclose(in->file); +} + +static int fill(input_t *in, size_t need) +{ + size_t free; + if (in->eof) return 1; + + free = in->tok - in->buf; + if (free < need) return 2; + + memmove(in->buf, in->tok, in->lim - in->tok); + in->lim -= free; + in->cur -= free; + in->mar -= free; + in->tok -= free; + /*!stags:re2c format = "if (in->@@) in->@@ -= free;\n"; */ + in->lim += fread(in->lim, 1, free, in->file); + if (in->lim < in->buf + SIZE) { + in->eof = 1; + memset(in->lim, 0, YYMAXFILL); + in->lim += YYMAXFILL; + } + return 0; +} + +static int lex(input_t *in, long *count) +{ + const char + *s1, *u1, *h1, *h3, *h5, *r1, *p1, *p3, *q1, *f1, + *s2, *u2, *h2, *h4, *h6, *r2, *p2, *p4, *q2, *f2; + long c; + + c = 0; +loop: + in->tok = in->cur; +/*!re2c + + re2c:define:YYCTYPE = char; + re2c:define:YYCURSOR = in->cur; + re2c:define:YYMARKER = in->mar; + re2c:define:YYLIMIT = in->lim; + re2c:define:YYFILL = "if (fill(in, @@) != 0) return 2;"; + re2c:define:YYFILL:naked = 1; + re2c:tags:expression = "in->@@"; + + end = "\x00"; + eol = "\n"; + + alpha = [a-zA-Z]; + digit = [0-9]; + hexdigit = [0-9a-fA-F]; + unreserved = alpha | digit | [-._~]; + pct_encoded = "%" hexdigit{2}; + sub_delims = [!$&'()*+,;=]; + pchar = unreserved | pct_encoded | sub_delims | [:@]; + + scheme = @s1 alpha (alpha | digit | [-+.])* @s2; + userinfo = @u1 (unreserved | pct_encoded | sub_delims | ":")* @u2; + dec_octet + = digit + | [\x31-\x39] digit + | "1" digit{2} + | "2" [\x30-\x34] digit + | "25" [\x30-\x35]; + ipv4address = dec_octet "." dec_octet "." dec_octet "." dec_octet; + h16 = hexdigit{1,4}; + ls32 = h16 ":" h16 | ipv4address; + ipv6address + = (h16 ":"){6} ls32 + | "::" (h16 ":"){5} ls32 + | ( h16)? "::" (h16 ":"){4} ls32 + | ((h16 ":"){0,1} h16)? "::" (h16 ":"){3} ls32 + | ((h16 ":"){0,2} h16)? "::" (h16 ":"){2} ls32 + | ((h16 ":"){0,3} h16)? "::" h16 ":" ls32 + | ((h16 ":"){0,4} h16)? "::" ls32 + | ((h16 ":"){0,5} h16)? "::" h16 + | ((h16 ":"){0,6} h16)? "::"; + ipvfuture = "v" hexdigit+ "." (unreserved | sub_delims | ":" )+; + ip_literal = "[" ( ipv6address | ipvfuture ) "]"; + reg_name = (unreserved | pct_encoded | sub_delims)*; + host + = @h1 ip_literal @h2 + | @h3 ipv4address @h4 + | @h5 reg_name @h6; + port = @r1 digit* @r2; + authority = (userinfo "@")? host (":" port)?; + path_abempty = ("/" pchar*)*; + path_absolute = "/" (pchar+ ("/" pchar*)*)?; + path_rootless = pchar+ ("/" pchar*)*; + path_empty = ""; + hier_part + = "//" authority @p1 path_abempty @p2 + | @p3 (path_absolute | path_rootless | path_empty) @p4; + query = @q1 (pchar | [/?])* @q2; + fragment = @f1 (pchar | [/?])* @f2; + uri = scheme ":" hier_part ("?" query)? ("#" fragment)?; + + * { return 1; } + end { *count = c; return 0; } + eol { goto loop; } + uri { + ++c; + printf("URI %ld:\n", c); + printf(" scheme: %.*s\n", (int)(s2 - s1), s1); + if (u1) printf(" userinfo: %.*s\n", (int)(u2 - u1), u1); + if (h1) printf(" host: %.*s (IP literal)\n", (int)(h2 - h1), h1); + if (h3) printf(" host: %.*s (IPv4)\n", (int)(h4 - h3), h3); + if (h5) printf(" host: %.*s (name)\n", (int)(h6 - h5), h5); + if (r1) printf(" port: %.*s\n", (int)(r2 - r1), r1); + if (p1) printf(" path: %.*s\n", (int)(p2 - p1), p1); + if (p3) printf(" path: %.*s\n", (int)(p4 - p3), p3); + if (q1) printf(" query: %.*s\n", (int)(q2 - q1), q1); + if (f1) printf(" fragment: %.*s\n", (int)(f2 - f1), f1); + printf("\n"); + goto loop; + } +*/ +} + +int main(int argc, char **argv) +{ + long count; + input_t in; + init_input(&in, argv[1]); + + switch (lex(&in, &count)) { + case 0: fprintf(stderr, "ok, parsed %ld URIs\n", count); break; + case 1: fprintf(stderr, "syntax error\n"); break; + case 2: fprintf(stderr, "yyfill error\n"); break; + default: fprintf(stderr, "panic\n"); break; + } + + free_input(&in); + return 0; +} diff --git a/examples/11_http_rfc7230.i--tags.c b/examples/11_http_rfc7230.i--tags.c new file mode 100644 index 0000000..0d0c8a5 --- /dev/null +++ b/examples/11_http_rfc7230.i--tags.c @@ -0,0 +1,13267 @@ +/* Generated by re2c */ +#include +#include +#include + +typedef struct mtag_t { + struct mtag_t *pred; + long dist; +} mtag_t; + +typedef struct mtagpool_t { + mtag_t *head; + mtag_t *next; + mtag_t *last; +} mtagpool_t; + +typedef struct { + FILE *file; + char *buf; + char *lim; + char *cur; + char *mar; + char *tok; + char *yyt1; +char *yyt10; +char *yyt11; +char *yyt12; +char *yyt13; +char *yyt14; +char *yyt15; +char *yyt16; +char *yyt17; +char *yyt18; +char *yyt19; +char *yyt2; +char *yyt20; +char *yyt21; +char *yyt22; +char *yyt23; +char *yyt24; +char *yyt25; +char *yyt26; +char *yyt27; +char *yyt28; +char *yyt29; +char *yyt3; +char *yyt30; +char *yyt31; +char *yyt32; +char *yyt33; +char *yyt34; +char *yyt35; +char *yyt4; +char *yyt5; +char *yyt6; +char *yyt7; +char *yyt8; +char *yyt9; + + mtag_t *yyt36; +mtag_t *yyt37; +mtag_t *yyt38; +mtag_t *yyt39; +mtag_t *yyt40; +mtag_t *yyt41; +mtag_t *yyt42; + + mtagpool_t mtp; + int eof; +} input_t; + +static void mtagpool_clear(mtagpool_t *mtp, input_t *in) +{ + mtp->next = mtp->head; + in->yyt36 = 0; +in->yyt37 = 0; +in->yyt38 = 0; +in->yyt39 = 0; +in->yyt40 = 0; +in->yyt41 = 0; +in->yyt42 = 0; + +} + +static void mtagpool_init(mtagpool_t *mtp) +{ + static const unsigned size = 1024 * 1024; + mtp->head = (mtag_t*)malloc(size * sizeof(mtag_t)); + mtp->next = mtp->head; + mtp->last = mtp->head + size; +} + +static void mtagpool_free(mtagpool_t *mtp) +{ + free(mtp->head); + mtp->head = mtp->next = mtp->last = NULL; +} + +static mtag_t *mtagpool_next(mtagpool_t *mtp) +{ + unsigned size; + mtag_t *head; + + if (mtp->next < mtp->last) return mtp->next++; + + size = mtp->last - mtp->head; + head = (mtag_t*)malloc(2 * size * sizeof(mtag_t)); + memcpy(head, mtp->head, size * sizeof(mtag_t)); + free(mtp->head); + mtp->head = head; + mtp->next = head + size; + mtp->last = head + size * 2; + return mtp->next++; +} + +static void mtag(mtag_t **pmt, const char *b, const char *t, mtagpool_t *mtp) +{ + mtag_t *mt = mtagpool_next(mtp); + mt->pred = *pmt; + mt->dist = t - b; + *pmt = mt; +} + +#define YYMAXFILL 66 + +static const size_t SIZE = 4096; + +static void init_input(input_t *in, const char *fname) +{ + in->file = fopen(fname, "r"); + in->buf = (char*) malloc(SIZE + YYMAXFILL); + in->lim = in->buf + SIZE; + in->cur = in->lim; + in->mar = in->lim; + in->tok = in->lim; + in->yyt1 = 0; +in->yyt10 = 0; +in->yyt11 = 0; +in->yyt12 = 0; +in->yyt13 = 0; +in->yyt14 = 0; +in->yyt15 = 0; +in->yyt16 = 0; +in->yyt17 = 0; +in->yyt18 = 0; +in->yyt19 = 0; +in->yyt2 = 0; +in->yyt20 = 0; +in->yyt21 = 0; +in->yyt22 = 0; +in->yyt23 = 0; +in->yyt24 = 0; +in->yyt25 = 0; +in->yyt26 = 0; +in->yyt27 = 0; +in->yyt28 = 0; +in->yyt29 = 0; +in->yyt3 = 0; +in->yyt30 = 0; +in->yyt31 = 0; +in->yyt32 = 0; +in->yyt33 = 0; +in->yyt34 = 0; +in->yyt35 = 0; +in->yyt4 = 0; +in->yyt5 = 0; +in->yyt6 = 0; +in->yyt7 = 0; +in->yyt8 = 0; +in->yyt9 = 0; + + in->yyt36 = 0; +in->yyt37 = 0; +in->yyt38 = 0; +in->yyt39 = 0; +in->yyt40 = 0; +in->yyt41 = 0; +in->yyt42 = 0; + + mtagpool_init(&in->mtp); + in->eof = 0; +} + +static void free_input(input_t *in) +{ + fclose(in->file); + free(in->buf); + mtagpool_free(&in->mtp); +} + +static int fill(input_t *in, size_t need) +{ + size_t free; + if (in->eof) return 1; + + free = in->tok - in->buf; + if (free < need) return 2; + + memmove(in->buf, in->tok, in->lim - in->tok); + in->lim -= free; + in->cur -= free; + in->mar -= free; + in->tok -= free; + if (in->yyt1) in->yyt1 -= free; +if (in->yyt10) in->yyt10 -= free; +if (in->yyt11) in->yyt11 -= free; +if (in->yyt12) in->yyt12 -= free; +if (in->yyt13) in->yyt13 -= free; +if (in->yyt14) in->yyt14 -= free; +if (in->yyt15) in->yyt15 -= free; +if (in->yyt16) in->yyt16 -= free; +if (in->yyt17) in->yyt17 -= free; +if (in->yyt18) in->yyt18 -= free; +if (in->yyt19) in->yyt19 -= free; +if (in->yyt2) in->yyt2 -= free; +if (in->yyt20) in->yyt20 -= free; +if (in->yyt21) in->yyt21 -= free; +if (in->yyt22) in->yyt22 -= free; +if (in->yyt23) in->yyt23 -= free; +if (in->yyt24) in->yyt24 -= free; +if (in->yyt25) in->yyt25 -= free; +if (in->yyt26) in->yyt26 -= free; +if (in->yyt27) in->yyt27 -= free; +if (in->yyt28) in->yyt28 -= free; +if (in->yyt29) in->yyt29 -= free; +if (in->yyt3) in->yyt3 -= free; +if (in->yyt30) in->yyt30 -= free; +if (in->yyt31) in->yyt31 -= free; +if (in->yyt32) in->yyt32 -= free; +if (in->yyt33) in->yyt33 -= free; +if (in->yyt34) in->yyt34 -= free; +if (in->yyt35) in->yyt35 -= free; +if (in->yyt4) in->yyt4 -= free; +if (in->yyt5) in->yyt5 -= free; +if (in->yyt6) in->yyt6 -= free; +if (in->yyt7) in->yyt7 -= free; +if (in->yyt8) in->yyt8 -= free; +if (in->yyt9) in->yyt9 -= free; + + in->lim += fread(in->lim, 1, free, in->file); + if (in->lim < in->buf + SIZE) { + in->eof = 1; + memset(in->lim, 0, YYMAXFILL); + in->lim += YYMAXFILL; + } + return 0; +} + +static void print_headers(const char *tok, + const mtag_t *h1, const mtag_t *h2, + const mtag_t *h3, const mtag_t *h4, + const mtag_t *h5) +{ + if (!h1) return; + print_headers(tok, h1->pred, h2->pred, h3->pred, h4->pred, h5->pred); + printf("%.*s%.*s%.*s%.*s\n", + (int)(h2->dist - h1->dist), tok + h1->dist, + (int)(h3->dist - h2->dist), tok + h2->dist, + (int)(h4->dist - h3->dist), tok + h3->dist, + (int)(h5->dist - h4->dist), tok + h4->dist); +} + +#define YYCTYPE char +#define YYCURSOR in->cur +#define YYMARKER in->mar +#define YYLIMIT in->lim +#define YYMTAGP(mt) mtag(&mt, in->tok, in->cur, &in->mtp) +#define YYMTAGN(mt) mtag(&mt, in->tok, NULL, &in->mtp) +#define YYFILL(n) if (fill(in, n) != 0) return 2; + +static int lex(input_t *in, long *count) +{ + const char *of, *au, *at, + *hs1, *hs3, *m1, *p1, *p3, *p5, *q1, *q3, + *hs2, *hs4, *m2, *p2, *p4, *p6, *q2, *q4, + *r1, *r3, *rp1, *s1, *st1, *u1, *u3, *v1, *v3, + *r2, *r4, *rp2, *s2, *st2, *u2, *u4, *v2, *v4; + mtag_t *h1, *h2, *h3, *h4, *h5; + long c; + + c = 0;; + of = au = at + = hs1 = hs3 = m1 = p1 = p3 = p5 = q1 = q3 + = hs2 = hs4 = m2 = p2 = p4 = p6 = q2 = q4 + = r1 = r3 = rp1 = s1 = st1 = u1 = u3 = v1 = v3 + = r2 = r4 = rp2 = s2 = st2 = u2 = u4 = v2 = v4 = NULL; +loop: + in->tok = in->cur; + +{ + YYCTYPE yych; + if ((YYLIMIT - YYCURSOR) < 66) YYFILL(66); + yych = *YYCURSOR; + switch (yych) { + case 0x00: goto yy2; + case '\n': goto yy6; + case '!': + case '#': + case '$': + case '%': + case '&': + case '\'': + case '*': + case '+': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '^': + case '_': + case '`': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '|': + case '~': + in->yyt1 = YYCURSOR; + goto yy8; + case 'H': + in->yyt1 = in->yyt30 = YYCURSOR; + goto yy9; + default: goto yy4; + } +yy2: + ++YYCURSOR; + { *count = c; return 0; } +yy4: + ++YYCURSOR; +yy5: + { return 1; } +yy6: + ++YYCURSOR; + { goto loop; } +yy8: + yych = *(YYMARKER = ++YYCURSOR); + switch (yych) { + case ' ': + case '!': + case '#': + case '$': + case '%': + case '&': + case '\'': + case '*': + case '+': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '^': + case '_': + case '`': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '|': + case '~': goto yy13; + default: goto yy5; + } +yy9: + yych = *(YYMARKER = ++YYCURSOR); + switch (yych) { + case ' ': + case '!': + case '#': + case '$': + case '%': + case '&': + case '\'': + case '*': + case '+': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '^': + case '_': + case '`': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '|': + case '~': goto yy13; + case 'T': goto yy14; + default: goto yy5; + } +yy10: + yych = *++YYCURSOR; + switch (yych) { + case ' ': + in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt10 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt3 = in->yyt11 = in->yyt12 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ';': + case '=': + case '_': + case '~': + in->yyt4 = in->yyt10 = NULL; + in->yyt3 = in->yyt5 = in->yyt11 = YYCURSOR; + goto yy16; + case '%': + in->yyt4 = in->yyt10 = NULL; + in->yyt3 = in->yyt5 = in->yyt11 = YYCURSOR; + goto yy18; + case '/': + in->yyt27 = YYCURSOR; + goto yy19; + case ':': + in->yyt4 = in->yyt10 = NULL; + in->yyt3 = in->yyt5 = in->yyt11 = in->yyt12 = YYCURSOR; + goto yy21; + case '?': + in->yyt27 = in->yyt28 = YYCURSOR; + goto yy22; + case '@': + in->yyt3 = in->yyt5 = in->yyt10 = YYCURSOR; + goto yy23; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + in->yyt4 = in->yyt10 = NULL; + in->yyt3 = in->yyt5 = in->yyt11 = in->yyt14 = YYCURSOR; + goto yy24; + case '[': + in->yyt4 = in->yyt10 = NULL; + in->yyt3 = in->yyt11 = YYCURSOR; + goto yy26; + default: goto yy11; + } +yy11: + YYCURSOR = YYMARKER; + goto yy5; +yy12: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 62) YYFILL(62); + yych = *YYCURSOR; +yy13: + switch (yych) { + case ' ': + in->yyt2 = YYCURSOR; + goto yy10; + case '!': + case '#': + case '$': + case '%': + case '&': + case '\'': + case '*': + case '+': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '^': + case '_': + case '`': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '|': + case '~': goto yy12; + default: goto yy11; + } +yy14: + yych = *++YYCURSOR; + switch (yych) { + case 'T': goto yy27; + default: goto yy13; + } +yy15: + yych = *++YYCURSOR; + switch (yych) { + case 'H': + in->yyt8 = YYCURSOR; + goto yy28; + default: goto yy11; + } +yy16: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 61) YYFILL(61); + yych = *YYCURSOR; + switch (yych) { + case ' ': + in->yyt5 = in->yyt6 = in->yyt7 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt12 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy16; + case '%': goto yy18; + case ':': + in->yyt12 = YYCURSOR; + goto yy21; + case '@': + in->yyt10 = YYCURSOR; + goto yy23; + default: goto yy11; + } +yy18: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy29; + default: goto yy11; + } +yy19: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 12) YYFILL(12); + yych = *YYCURSOR; + switch (yych) { + case ' ': + in->yyt3 = in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt29 = NULL; + in->yyt28 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '/': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case ';': + case '=': + case '@': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy19; + case '%': goto yy30; + case '?': + in->yyt28 = YYCURSOR; + goto yy22; + default: goto yy11; + } +yy21: + yych = *++YYCURSOR; + switch (yych) { + case ' ': + in->yyt6 = in->yyt7 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt5 = in->yyt13 = YYCURSOR; + goto yy15; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + in->yyt13 = YYCURSOR; + goto yy34; + default: goto yy32; + } +yy22: + yych = *++YYCURSOR; + switch (yych) { + case ' ': + in->yyt3 = in->yyt4 = in->yyt5 = in->yyt6 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = in->yyt24 = in->yyt25 = in->yyt26 = NULL; + in->yyt7 = in->yyt29 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '/': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case ';': + case '=': + case '?': + case '@': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': + in->yyt29 = YYCURSOR; + goto yy36; + case '%': + in->yyt29 = YYCURSOR; + goto yy38; + default: goto yy11; + } +yy23: + yych = *++YYCURSOR; + switch (yych) { + case ' ': + in->yyt4 = in->yyt5; + in->yyt5 = in->yyt6 = in->yyt7 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt11 = in->yyt12 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': + in->yyt11 = YYCURSOR; + goto yy39; + case '%': + in->yyt11 = YYCURSOR; + goto yy41; + case ':': + in->yyt11 = in->yyt12 = YYCURSOR; + goto yy42; + case '[': + in->yyt4 = in->yyt5; + in->yyt11 = YYCURSOR; + goto yy26; + default: goto yy11; + } +yy24: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 65) YYFILL(65); + yych = *YYCURSOR; + switch (yych) { + case ' ': + in->yyt5 = in->yyt6 = in->yyt7 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt12 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case ',': + case ';': + case '=': + case '_': + case '~': goto yy16; + case '%': goto yy18; + case '+': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy24; + case ':': + in->yyt12 = in->yyt15 = YYCURSOR; + goto yy43; + case '@': + in->yyt10 = YYCURSOR; + goto yy23; + default: goto yy11; + } +yy26: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy44; + case ':': goto yy45; + case 'v': goto yy46; + default: goto yy11; + } +yy27: + yych = *++YYCURSOR; + switch (yych) { + case 'P': goto yy47; + default: goto yy13; + } +yy28: + yych = *++YYCURSOR; + switch (yych) { + case 'T': goto yy48; + default: goto yy11; + } +yy29: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy16; + default: goto yy11; + } +yy30: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy49; + default: goto yy11; + } +yy31: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 60) YYFILL(60); + yych = *YYCURSOR; +yy32: + switch (yych) { + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy31; + case '%': goto yy33; + case '@': + in->yyt10 = YYCURSOR; + goto yy23; + default: goto yy11; + } +yy33: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy50; + default: goto yy11; + } +yy34: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 60) YYFILL(60); + yych = *YYCURSOR; + switch (yych) { + case ' ': + in->yyt6 = in->yyt7 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt5 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case ':': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy31; + case '%': goto yy33; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy34; + case '@': + in->yyt10 = YYCURSOR; + goto yy23; + default: goto yy11; + } +yy36: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 11) YYFILL(11); + yych = *YYCURSOR; + switch (yych) { + case ' ': + in->yyt3 = in->yyt4 = in->yyt5 = in->yyt6 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = in->yyt24 = in->yyt25 = in->yyt26 = NULL; + in->yyt7 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '/': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case ';': + case '=': + case '?': + case '@': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy36; + case '%': goto yy38; + default: goto yy11; + } +yy38: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy51; + default: goto yy11; + } +yy39: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 12) YYFILL(12); + yych = *YYCURSOR; + switch (yych) { + case ' ': + in->yyt4 = in->yyt5; + in->yyt5 = in->yyt6 = in->yyt7 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt12 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy39; + case '%': goto yy41; + case ':': + in->yyt12 = YYCURSOR; + goto yy42; + default: goto yy11; + } +yy41: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy52; + default: goto yy11; + } +yy42: + yych = *++YYCURSOR; + switch (yych) { + case ' ': + in->yyt4 = in->yyt5; + in->yyt6 = in->yyt7 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt5 = in->yyt13 = YYCURSOR; + goto yy15; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + in->yyt13 = YYCURSOR; + goto yy53; + default: goto yy11; + } +yy43: + yych = *++YYCURSOR; + switch (yych) { + case ' ': + in->yyt6 = in->yyt7 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt5 = in->yyt13 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case ':': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': + in->yyt24 = YYCURSOR; + goto yy55; + case '%': + in->yyt24 = YYCURSOR; + goto yy57; + case '/': + in->yyt24 = YYCURSOR; + goto yy58; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + in->yyt13 = in->yyt24 = YYCURSOR; + goto yy59; + case '?': + in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = NULL; + in->yyt24 = in->yyt25 = YYCURSOR; + goto yy61; + case '@': + in->yyt10 = in->yyt24 = YYCURSOR; + goto yy62; + default: goto yy11; + } +yy44: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy63; + case ':': goto yy64; + default: goto yy11; + } +yy45: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy65; + default: goto yy11; + } +yy46: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy11; + default: goto yy67; + } +yy47: + yych = *++YYCURSOR; + switch (yych) { + case '/': goto yy68; + default: goto yy13; + } +yy48: + yych = *++YYCURSOR; + switch (yych) { + case 'T': goto yy69; + default: goto yy11; + } +yy49: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy19; + default: goto yy11; + } +yy50: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy31; + default: goto yy11; + } +yy51: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy36; + default: goto yy11; + } +yy52: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy39; + default: goto yy11; + } +yy53: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 11) YYFILL(11); + yych = *YYCURSOR; + switch (yych) { + case ' ': + in->yyt4 = in->yyt5; + in->yyt6 = in->yyt7 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt5 = YYCURSOR; + goto yy15; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy53; + default: goto yy11; + } +yy55: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 60) YYFILL(60); + yych = *YYCURSOR; + switch (yych) { + case ' ': + in->yyt3 = in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt25 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy55; + case '%': goto yy57; + case '/': goto yy70; + case '?': + in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = NULL; + in->yyt25 = YYCURSOR; + goto yy61; + case '@': + in->yyt10 = YYCURSOR; + goto yy62; + default: goto yy11; + } +yy57: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy72; + default: goto yy11; + } +yy58: + yych = *++YYCURSOR; + switch (yych) { + case '/': goto yy74; + default: goto yy71; + } +yy59: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 60) YYFILL(60); + yych = *YYCURSOR; + switch (yych) { + case ' ': + in->yyt6 = in->yyt7 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt5 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case ':': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy55; + case '%': goto yy57; + case '/': goto yy70; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy59; + case '?': + in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = NULL; + in->yyt25 = YYCURSOR; + goto yy61; + case '@': + in->yyt10 = YYCURSOR; + goto yy62; + default: goto yy11; + } +yy61: + yych = *++YYCURSOR; + switch (yych) { + case ' ': + in->yyt3 = in->yyt4 = in->yyt5 = in->yyt7 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt6 = in->yyt26 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '/': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case ';': + case '=': + case '?': + case '@': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': + in->yyt26 = YYCURSOR; + goto yy75; + case '%': + in->yyt26 = YYCURSOR; + goto yy77; + default: goto yy11; + } +yy62: + yych = *++YYCURSOR; + switch (yych) { + case ' ': + in->yyt4 = in->yyt5; + in->yyt5 = in->yyt6 = in->yyt7 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt11 = in->yyt12 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': + in->yyt11 = YYCURSOR; + goto yy78; + case '%': + in->yyt11 = YYCURSOR; + goto yy80; + case ':': + in->yyt11 = in->yyt12 = YYCURSOR; + goto yy81; + case '[': + in->yyt4 = in->yyt5; + in->yyt11 = YYCURSOR; + goto yy26; + default: goto yy79; + } +yy63: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy82; + case ':': goto yy64; + default: goto yy11; + } +yy64: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy83; + case ':': goto yy84; + default: goto yy11; + } +yy65: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy85; + case '1': goto yy86; + case '2': goto yy87; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy88; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy89; + case ']': goto yy90; + default: goto yy11; + } +yy66: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; +yy67: + switch (yych) { + case '.': goto yy91; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy66; + default: goto yy11; + } +yy68: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy92; + default: goto yy11; + } +yy69: + yych = *++YYCURSOR; + switch (yych) { + case 'P': goto yy93; + default: goto yy11; + } +yy70: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 12) YYFILL(12); + yych = *YYCURSOR; +yy71: + switch (yych) { + case ' ': + in->yyt3 = in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt25 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '/': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case ';': + case '=': + case '@': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy70; + case '%': goto yy73; + case '?': + in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = NULL; + in->yyt25 = YYCURSOR; + goto yy61; + default: goto yy11; + } +yy72: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy55; + default: goto yy11; + } +yy73: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy94; + default: goto yy11; + } +yy74: + yych = *++YYCURSOR; + switch (yych) { + case ' ': + in->yyt3 = in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt16 = in->yyt17 = in->yyt20 = in->yyt21 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt18 = in->yyt19 = in->yyt22 = in->yyt23 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': + in->yyt16 = in->yyt17 = NULL; + in->yyt3 = in->yyt18 = YYCURSOR; + goto yy95; + case '%': + in->yyt16 = in->yyt17 = NULL; + in->yyt3 = in->yyt18 = YYCURSOR; + goto yy97; + case '/': + in->yyt16 = in->yyt17 = in->yyt20 = in->yyt21 = NULL; + in->yyt18 = in->yyt19 = in->yyt22 = YYCURSOR; + goto yy98; + case ':': + in->yyt16 = in->yyt17 = NULL; + in->yyt3 = in->yyt18 = in->yyt19 = YYCURSOR; + goto yy100; + case '?': + in->yyt16 = in->yyt17 = in->yyt20 = in->yyt21 = in->yyt24 = in->yyt25 = NULL; + in->yyt18 = in->yyt19 = in->yyt22 = in->yyt23 = YYCURSOR; + goto yy61; + case '@': + in->yyt3 = in->yyt17 = YYCURSOR; + goto yy101; + case '[': + in->yyt16 = in->yyt17 = NULL; + in->yyt18 = YYCURSOR; + goto yy102; + default: goto yy11; + } +yy75: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 11) YYFILL(11); + yych = *YYCURSOR; + switch (yych) { + case ' ': + in->yyt3 = in->yyt4 = in->yyt5 = in->yyt7 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt6 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '/': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case ';': + case '=': + case '?': + case '@': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy75; + case '%': goto yy77; + default: goto yy11; + } +yy77: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy103; + default: goto yy11; + } +yy78: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 13) YYFILL(13); + yych = *YYCURSOR; +yy79: + switch (yych) { + case ' ': + in->yyt4 = in->yyt5; + in->yyt5 = in->yyt6 = in->yyt7 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt12 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy78; + case '%': goto yy80; + case '/': + case '@': goto yy70; + case ':': + in->yyt12 = YYCURSOR; + goto yy81; + case '?': + in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = NULL; + in->yyt25 = YYCURSOR; + goto yy61; + default: goto yy11; + } +yy80: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy104; + default: goto yy11; + } +yy81: + yych = *++YYCURSOR; + switch (yych) { + case ' ': + in->yyt4 = in->yyt5; + in->yyt6 = in->yyt7 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt5 = in->yyt13 = YYCURSOR; + goto yy15; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + in->yyt13 = YYCURSOR; + goto yy105; + default: goto yy71; + } +yy82: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy107; + case ':': goto yy64; + default: goto yy11; + } +yy83: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy108; + case ':': goto yy109; + default: goto yy11; + } +yy84: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy110; + case '1': goto yy111; + case '2': goto yy112; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy113; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy114; + case ']': goto yy90; + default: goto yy11; + } +yy85: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy116; + case ':': goto yy117; + case ']': goto yy90; + default: goto yy11; + } +yy86: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy118; + case ':': goto yy117; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy116; + case ']': goto yy90; + default: goto yy11; + } +yy87: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy118; + case '5': goto yy119; + case '6': + case '7': + case '8': + case '9': goto yy120; + case ':': goto yy117; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy116; + case ']': goto yy90; + default: goto yy11; + } +yy88: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy120; + case ':': goto yy117; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy116; + case ']': goto yy90; + default: goto yy11; + } +yy89: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy116; + case ':': goto yy117; + case ']': goto yy90; + default: goto yy11; + } +yy90: + yych = *++YYCURSOR; + switch (yych) { + case ' ': + in->yyt5 = in->yyt6 = in->yyt7 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt12 = YYCURSOR; + goto yy15; + case ':': + in->yyt5 = in->yyt4; + in->yyt12 = YYCURSOR; + goto yy42; + default: goto yy11; + } +yy91: + yych = *++YYCURSOR; + switch (yych) { + case ']': goto yy11; + default: goto yy122; + } +yy92: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy123; + default: goto yy11; + } +yy93: + yych = *++YYCURSOR; + switch (yych) { + case '/': goto yy124; + default: goto yy11; + } +yy94: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy70; + default: goto yy11; + } +yy95: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 62) YYFILL(62); + yych = *YYCURSOR; + switch (yych) { + case ' ': + in->yyt3 = in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt20 = in->yyt21 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt19 = in->yyt22 = in->yyt23 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy95; + case '%': goto yy97; + case '/': + in->yyt20 = in->yyt21 = NULL; + in->yyt19 = in->yyt22 = YYCURSOR; + goto yy98; + case ':': + in->yyt19 = YYCURSOR; + goto yy100; + case '?': + in->yyt20 = in->yyt21 = in->yyt24 = in->yyt25 = NULL; + in->yyt19 = in->yyt22 = in->yyt23 = YYCURSOR; + goto yy61; + case '@': + in->yyt17 = YYCURSOR; + goto yy101; + default: goto yy11; + } +yy97: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy125; + default: goto yy11; + } +yy98: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 12) YYFILL(12); + yych = *YYCURSOR; + switch (yych) { + case ' ': + in->yyt3 = in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt23 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '/': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case ';': + case '=': + case '@': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy98; + case '%': goto yy126; + case '?': + in->yyt24 = in->yyt25 = NULL; + in->yyt23 = YYCURSOR; + goto yy61; + default: goto yy11; + } +yy100: + yych = *++YYCURSOR; + switch (yych) { + case ' ': + in->yyt3 = in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = YYCURSOR; + goto yy15; + case '/': + in->yyt20 = in->yyt21 = in->yyt22 = YYCURSOR; + goto yy98; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + in->yyt20 = YYCURSOR; + goto yy130; + case '?': + in->yyt24 = in->yyt25 = NULL; + in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = YYCURSOR; + goto yy61; + default: goto yy128; + } +yy101: + yych = *++YYCURSOR; + switch (yych) { + case ' ': + in->yyt16 = in->yyt3; + in->yyt3 = in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt20 = in->yyt21 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt18 = in->yyt19 = in->yyt22 = in->yyt23 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': + in->yyt18 = YYCURSOR; + goto yy132; + case '%': + in->yyt18 = YYCURSOR; + goto yy134; + case '/': + in->yyt16 = in->yyt3; + in->yyt20 = in->yyt21 = NULL; + in->yyt18 = in->yyt19 = in->yyt22 = YYCURSOR; + goto yy98; + case ':': + in->yyt18 = in->yyt19 = YYCURSOR; + goto yy135; + case '?': + in->yyt16 = in->yyt3; + in->yyt20 = in->yyt21 = in->yyt24 = in->yyt25 = NULL; + in->yyt18 = in->yyt19 = in->yyt22 = in->yyt23 = YYCURSOR; + goto yy61; + case '[': + in->yyt16 = in->yyt3; + in->yyt18 = YYCURSOR; + goto yy102; + default: goto yy11; + } +yy102: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy136; + case ':': goto yy137; + case 'v': goto yy138; + default: goto yy11; + } +yy103: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy75; + default: goto yy11; + } +yy104: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy78; + default: goto yy11; + } +yy105: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 12) YYFILL(12); + yych = *YYCURSOR; + switch (yych) { + case ' ': + in->yyt4 = in->yyt5; + in->yyt6 = in->yyt7 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt5 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '/': + case ':': + case ';': + case '=': + case '@': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy70; + case '%': goto yy73; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy105; + case '?': + in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = NULL; + in->yyt25 = YYCURSOR; + goto yy61; + default: goto yy11; + } +yy107: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy64; + default: goto yy11; + } +yy108: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy139; + case ':': goto yy109; + default: goto yy11; + } +yy109: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy140; + case ':': goto yy141; + default: goto yy11; + } +yy110: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy142; + case ':': goto yy143; + case ']': goto yy90; + default: goto yy11; + } +yy111: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy144; + case ':': goto yy143; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy142; + case ']': goto yy90; + default: goto yy11; + } +yy112: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy144; + case '5': goto yy145; + case '6': + case '7': + case '8': + case '9': goto yy146; + case ':': goto yy143; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy142; + case ']': goto yy90; + default: goto yy11; + } +yy113: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy146; + case ':': goto yy143; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy142; + case ']': goto yy90; + default: goto yy11; + } +yy114: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy142; + case ':': goto yy143; + case ']': goto yy90; + default: goto yy11; + } +yy115: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy147; + case '1': goto yy148; + case '2': goto yy149; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy150; + default: goto yy11; + } +yy116: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy151; + case ':': goto yy117; + case ']': goto yy90; + default: goto yy11; + } +yy117: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy110; + case '1': goto yy111; + case '2': goto yy112; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy113; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy114; + default: goto yy11; + } +yy118: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy152; + case ':': goto yy117; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy151; + case ']': goto yy90; + default: goto yy11; + } +yy119: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy152; + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy151; + case ':': goto yy117; + case ']': goto yy90; + default: goto yy11; + } +yy120: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy151; + case ':': goto yy117; + case ']': goto yy90; + default: goto yy11; + } +yy121: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 13) YYFILL(13); + yych = *YYCURSOR; +yy122: + switch (yych) { + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy121; + case ']': goto yy90; + default: goto yy11; + } +yy123: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy153; + default: goto yy11; + } +yy124: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy154; + default: goto yy11; + } +yy125: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy95; + default: goto yy11; + } +yy126: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy155; + default: goto yy11; + } +yy127: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 61) YYFILL(61); + yych = *YYCURSOR; +yy128: + switch (yych) { + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy127; + case '%': goto yy129; + case '@': + in->yyt17 = YYCURSOR; + goto yy101; + default: goto yy11; + } +yy129: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy156; + default: goto yy11; + } +yy130: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 61) YYFILL(61); + yych = *YYCURSOR; + switch (yych) { + case ' ': + in->yyt3 = in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt21 = in->yyt22 = in->yyt23 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case ':': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy127; + case '%': goto yy129; + case '/': + in->yyt21 = in->yyt22 = YYCURSOR; + goto yy98; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy130; + case '?': + in->yyt24 = in->yyt25 = NULL; + in->yyt21 = in->yyt22 = in->yyt23 = YYCURSOR; + goto yy61; + case '@': + in->yyt17 = YYCURSOR; + goto yy101; + default: goto yy11; + } +yy132: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 13) YYFILL(13); + yych = *YYCURSOR; + switch (yych) { + case ' ': + in->yyt16 = in->yyt3; + in->yyt3 = in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt20 = in->yyt21 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt19 = in->yyt22 = in->yyt23 = YYCURSOR; + goto yy15; + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy132; + case '%': goto yy134; + case '/': + in->yyt16 = in->yyt3; + in->yyt20 = in->yyt21 = NULL; + in->yyt19 = in->yyt22 = YYCURSOR; + goto yy98; + case ':': + in->yyt19 = YYCURSOR; + goto yy135; + case '?': + in->yyt16 = in->yyt3; + in->yyt20 = in->yyt21 = in->yyt24 = in->yyt25 = NULL; + in->yyt19 = in->yyt22 = in->yyt23 = YYCURSOR; + goto yy61; + default: goto yy11; + } +yy134: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy157; + default: goto yy11; + } +yy135: + yych = *++YYCURSOR; + switch (yych) { + case ' ': + in->yyt16 = in->yyt3; + in->yyt3 = in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = YYCURSOR; + goto yy15; + case '/': + in->yyt16 = in->yyt3; + in->yyt20 = in->yyt21 = in->yyt22 = YYCURSOR; + goto yy98; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + in->yyt20 = YYCURSOR; + goto yy158; + case '?': + in->yyt16 = in->yyt3; + in->yyt24 = in->yyt25 = NULL; + in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = YYCURSOR; + goto yy61; + default: goto yy11; + } +yy136: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy160; + case ':': goto yy161; + default: goto yy11; + } +yy137: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy162; + default: goto yy11; + } +yy138: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy11; + default: goto yy164; + } +yy139: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy165; + case ':': goto yy109; + default: goto yy11; + } +yy140: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy166; + case ':': goto yy167; + default: goto yy11; + } +yy141: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy168; + case '1': goto yy169; + case '2': goto yy170; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy171; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy172; + case ']': goto yy90; + default: goto yy11; + } +yy142: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy173; + case ':': goto yy143; + case ']': goto yy90; + default: goto yy11; + } +yy143: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy168; + case '1': goto yy169; + case '2': goto yy170; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy171; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy172; + default: goto yy11; + } +yy144: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy174; + case ':': goto yy143; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy173; + case ']': goto yy90; + default: goto yy11; + } +yy145: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy174; + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy173; + case ':': goto yy143; + case ']': goto yy90; + default: goto yy11; + } +yy146: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy173; + case ':': goto yy143; + case ']': goto yy90; + default: goto yy11; + } +yy147: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy175; + default: goto yy11; + } +yy148: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy175; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy150; + default: goto yy11; + } +yy149: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy175; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy150; + case '5': goto yy176; + case '6': + case '7': + case '8': + case '9': goto yy147; + default: goto yy11; + } +yy150: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy175; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy147; + default: goto yy11; + } +yy151: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy177; + case ':': goto yy117; + case ']': goto yy90; + default: goto yy11; + } +yy152: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy177; + case ':': goto yy117; + case ']': goto yy90; + default: goto yy11; + } +yy153: + yych = *++YYCURSOR; + switch (yych) { + case ' ': + in->yyt31 = YYCURSOR; + goto yy178; + default: goto yy11; + } +yy154: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy179; + default: goto yy11; + } +yy155: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy98; + default: goto yy11; + } +yy156: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy127; + default: goto yy11; + } +yy157: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy132; + default: goto yy11; + } +yy158: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 12) YYFILL(12); + yych = *YYCURSOR; + switch (yych) { + case ' ': + in->yyt16 = in->yyt3; + in->yyt3 = in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt21 = in->yyt22 = in->yyt23 = YYCURSOR; + goto yy15; + case '/': + in->yyt16 = in->yyt3; + in->yyt21 = in->yyt22 = YYCURSOR; + goto yy98; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy158; + case '?': + in->yyt16 = in->yyt3; + in->yyt24 = in->yyt25 = NULL; + in->yyt21 = in->yyt22 = in->yyt23 = YYCURSOR; + goto yy61; + default: goto yy11; + } +yy160: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy180; + case ':': goto yy161; + default: goto yy11; + } +yy161: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy181; + case ':': goto yy182; + default: goto yy11; + } +yy162: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy183; + case '1': goto yy184; + case '2': goto yy185; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy186; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy187; + case ']': goto yy188; + default: goto yy11; + } +yy163: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; +yy164: + switch (yych) { + case '.': goto yy189; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy163; + default: goto yy11; + } +yy165: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy109; + default: goto yy11; + } +yy166: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy190; + case ':': goto yy167; + default: goto yy11; + } +yy167: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy191; + case ':': goto yy192; + default: goto yy11; + } +yy168: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy193; + case ':': goto yy194; + case ']': goto yy90; + default: goto yy11; + } +yy169: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy195; + case ':': goto yy194; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy193; + case ']': goto yy90; + default: goto yy11; + } +yy170: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy195; + case '5': goto yy196; + case '6': + case '7': + case '8': + case '9': goto yy197; + case ':': goto yy194; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy193; + case ']': goto yy90; + default: goto yy11; + } +yy171: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy197; + case ':': goto yy194; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy193; + case ']': goto yy90; + default: goto yy11; + } +yy172: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy193; + case ':': goto yy194; + case ']': goto yy90; + default: goto yy11; + } +yy173: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy198; + case ':': goto yy143; + case ']': goto yy90; + default: goto yy11; + } +yy174: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy198; + case ':': goto yy143; + case ']': goto yy90; + default: goto yy11; + } +yy175: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy199; + case '1': goto yy200; + case '2': goto yy201; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy202; + default: goto yy11; + } +yy176: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy175; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy147; + default: goto yy11; + } +yy177: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy117; + case ']': goto yy90; + default: goto yy11; + } +yy178: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + in->yyt32 = YYCURSOR; + goto yy203; + default: goto yy11; + } +yy179: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy204; + default: goto yy11; + } +yy180: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy205; + case ':': goto yy161; + default: goto yy11; + } +yy181: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy206; + case ':': goto yy207; + default: goto yy11; + } +yy182: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy208; + case '1': goto yy209; + case '2': goto yy210; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy211; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy212; + case ']': goto yy188; + default: goto yy11; + } +yy183: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy214; + case ':': goto yy215; + case ']': goto yy188; + default: goto yy11; + } +yy184: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy216; + case ':': goto yy215; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy214; + case ']': goto yy188; + default: goto yy11; + } +yy185: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy216; + case '5': goto yy217; + case '6': + case '7': + case '8': + case '9': goto yy218; + case ':': goto yy215; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy214; + case ']': goto yy188; + default: goto yy11; + } +yy186: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy218; + case ':': goto yy215; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy214; + case ']': goto yy188; + default: goto yy11; + } +yy187: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy214; + case ':': goto yy215; + case ']': goto yy188; + default: goto yy11; + } +yy188: + yych = *++YYCURSOR; + switch (yych) { + case ' ': + in->yyt3 = in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt20 = in->yyt21 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + in->yyt19 = in->yyt22 = in->yyt23 = YYCURSOR; + goto yy15; + case '/': + in->yyt20 = in->yyt21 = NULL; + in->yyt19 = in->yyt22 = YYCURSOR; + goto yy98; + case ':': + in->yyt3 = in->yyt16; + in->yyt19 = YYCURSOR; + goto yy135; + case '?': + in->yyt20 = in->yyt21 = in->yyt24 = in->yyt25 = NULL; + in->yyt19 = in->yyt22 = in->yyt23 = YYCURSOR; + goto yy61; + default: goto yy11; + } +yy189: + yych = *++YYCURSOR; + switch (yych) { + case ']': goto yy11; + default: goto yy220; + } +yy190: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy221; + case ':': goto yy167; + default: goto yy11; + } +yy191: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy222; + case ':': goto yy223; + default: goto yy11; + } +yy192: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy224; + case '1': goto yy225; + case '2': goto yy226; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy227; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy228; + case ']': goto yy90; + default: goto yy11; + } +yy193: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy229; + case ':': goto yy194; + case ']': goto yy90; + default: goto yy11; + } +yy194: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy224; + case '1': goto yy225; + case '2': goto yy226; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy227; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy228; + default: goto yy11; + } +yy195: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy230; + case ':': goto yy194; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy229; + case ']': goto yy90; + default: goto yy11; + } +yy196: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy230; + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy229; + case ':': goto yy194; + case ']': goto yy90; + default: goto yy11; + } +yy197: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy229; + case ':': goto yy194; + case ']': goto yy90; + default: goto yy11; + } +yy198: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy143; + case ']': goto yy90; + default: goto yy11; + } +yy199: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy231; + default: goto yy11; + } +yy200: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy231; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy202; + default: goto yy11; + } +yy201: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy231; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy202; + case '5': goto yy232; + case '6': + case '7': + case '8': + case '9': goto yy199; + default: goto yy11; + } +yy202: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy231; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy199; + default: goto yy11; + } +yy203: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy233; + default: goto yy11; + } +yy204: + yych = *++YYCURSOR; + switch (yych) { + case '\n': + in->yyt9 = YYCURSOR; + goto yy234; + default: goto yy11; + } +yy205: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy161; + default: goto yy11; + } +yy206: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy235; + case ':': goto yy207; + default: goto yy11; + } +yy207: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy236; + case ':': goto yy237; + default: goto yy11; + } +yy208: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy238; + case ':': goto yy239; + case ']': goto yy188; + default: goto yy11; + } +yy209: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy240; + case ':': goto yy239; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy238; + case ']': goto yy188; + default: goto yy11; + } +yy210: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy240; + case '5': goto yy241; + case '6': + case '7': + case '8': + case '9': goto yy242; + case ':': goto yy239; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy238; + case ']': goto yy188; + default: goto yy11; + } +yy211: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy242; + case ':': goto yy239; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy238; + case ']': goto yy188; + default: goto yy11; + } +yy212: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy238; + case ':': goto yy239; + case ']': goto yy188; + default: goto yy11; + } +yy213: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy243; + case '1': goto yy244; + case '2': goto yy245; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy246; + default: goto yy11; + } +yy214: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy247; + case ':': goto yy215; + case ']': goto yy188; + default: goto yy11; + } +yy215: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy208; + case '1': goto yy209; + case '2': goto yy210; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy211; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy212; + default: goto yy11; + } +yy216: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy248; + case ':': goto yy215; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy247; + case ']': goto yy188; + default: goto yy11; + } +yy217: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy248; + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy247; + case ':': goto yy215; + case ']': goto yy188; + default: goto yy11; + } +yy218: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy247; + case ':': goto yy215; + case ']': goto yy188; + default: goto yy11; + } +yy219: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 14) YYFILL(14); + yych = *YYCURSOR; +yy220: + switch (yych) { + case '!': + case '$': + case '&': + case '\'': + case '(': + case ')': + case '*': + case '+': + case ',': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case ':': + case ';': + case '=': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '~': goto yy219; + case ']': goto yy188; + default: goto yy11; + } +yy221: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy167; + default: goto yy11; + } +yy222: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy249; + case ':': goto yy223; + default: goto yy11; + } +yy223: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy250; + case ':': goto yy251; + default: goto yy11; + } +yy224: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy252; + case ':': goto yy253; + case ']': goto yy90; + default: goto yy11; + } +yy225: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy254; + case ':': goto yy253; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy252; + case ']': goto yy90; + default: goto yy11; + } +yy226: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy254; + case '5': goto yy255; + case '6': + case '7': + case '8': + case '9': goto yy256; + case ':': goto yy253; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy252; + case ']': goto yy90; + default: goto yy11; + } +yy227: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy256; + case ':': goto yy253; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy252; + case ']': goto yy90; + default: goto yy11; + } +yy228: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy252; + case ':': goto yy253; + case ']': goto yy90; + default: goto yy11; + } +yy229: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy257; + case ':': goto yy194; + case ']': goto yy90; + default: goto yy11; + } +yy230: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy257; + case ':': goto yy194; + case ']': goto yy90; + default: goto yy11; + } +yy231: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy258; + case '1': goto yy259; + case '2': goto yy260; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy261; + default: goto yy11; + } +yy232: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy231; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy199; + default: goto yy11; + } +yy233: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy262; + default: goto yy11; + } +yy234: + yych = *++YYCURSOR; + switch (yych) { + case '\n': + YYMTAGN (in->yyt40); + YYMTAGN (in->yyt39); + YYMTAGN (in->yyt38); + YYMTAGN (in->yyt37); + YYMTAGN (in->yyt36); + in->yyt30 = in->yyt31 = in->yyt32 = in->yyt33 = in->yyt34 = in->yyt35 = NULL; + goto yy263; + case '!': + case '#': + case '$': + case '%': + case '&': + case '\'': + case '*': + case '+': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '^': + case '_': + case '`': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '|': + case '~': + YYMTAGP (in->yyt36); + in->yyt30 = in->yyt31 = in->yyt32 = in->yyt33 = in->yyt34 = in->yyt35 = NULL; + goto yy265; + default: goto yy11; + } +yy235: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy267; + case ':': goto yy207; + default: goto yy11; + } +yy236: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy268; + case ':': goto yy269; + default: goto yy11; + } +yy237: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy270; + case '1': goto yy271; + case '2': goto yy272; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy273; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy274; + case ']': goto yy188; + default: goto yy11; + } +yy238: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy275; + case ':': goto yy239; + case ']': goto yy188; + default: goto yy11; + } +yy239: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy270; + case '1': goto yy271; + case '2': goto yy272; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy273; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy274; + default: goto yy11; + } +yy240: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy276; + case ':': goto yy239; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy275; + case ']': goto yy188; + default: goto yy11; + } +yy241: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy276; + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy275; + case ':': goto yy239; + case ']': goto yy188; + default: goto yy11; + } +yy242: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy275; + case ':': goto yy239; + case ']': goto yy188; + default: goto yy11; + } +yy243: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy277; + default: goto yy11; + } +yy244: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy277; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy246; + default: goto yy11; + } +yy245: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy277; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy246; + case '5': goto yy278; + case '6': + case '7': + case '8': + case '9': goto yy243; + default: goto yy11; + } +yy246: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy277; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy243; + default: goto yy11; + } +yy247: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy279; + case ':': goto yy215; + case ']': goto yy188; + default: goto yy11; + } +yy248: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy279; + case ':': goto yy215; + case ']': goto yy188; + default: goto yy11; + } +yy249: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy280; + case ':': goto yy223; + default: goto yy11; + } +yy250: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy281; + case ':': goto yy282; + default: goto yy11; + } +yy251: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy283; + case '1': goto yy284; + case '2': goto yy285; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy286; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy287; + case ']': goto yy90; + default: goto yy11; + } +yy252: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy288; + case ':': goto yy253; + case ']': goto yy90; + default: goto yy11; + } +yy253: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy283; + case '1': goto yy284; + case '2': goto yy285; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy286; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy287; + default: goto yy11; + } +yy254: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy289; + case ':': goto yy253; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy288; + case ']': goto yy90; + default: goto yy11; + } +yy255: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy289; + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy288; + case ':': goto yy253; + case ']': goto yy90; + default: goto yy11; + } +yy256: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy288; + case ':': goto yy253; + case ']': goto yy90; + default: goto yy11; + } +yy257: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy194; + case ']': goto yy90; + default: goto yy11; + } +yy258: + yych = *++YYCURSOR; + switch (yych) { + case ']': goto yy90; + default: goto yy11; + } +yy259: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy261; + case ']': goto yy90; + default: goto yy11; + } +yy260: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': goto yy261; + case '5': goto yy290; + case '6': + case '7': + case '8': + case '9': goto yy258; + case ']': goto yy90; + default: goto yy11; + } +yy261: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy258; + case ']': goto yy90; + default: goto yy11; + } +yy262: + yych = *++YYCURSOR; + switch (yych) { + case ' ': + in->yyt33 = YYCURSOR; + goto yy291; + default: goto yy11; + } +yy263: + ++YYCURSOR; + m1 = in->yyt1; + m2 = in->yyt2; + at = in->yyt3; + u3 = in->yyt4; + u4 = in->yyt10; + hs3 = in->yyt11; + hs4 = in->yyt12; + r3 = in->yyt13; + r4 = in->yyt5; + au = in->yyt14; + s1 = in->yyt14; + s2 = in->yyt15; + u1 = in->yyt16; + u2 = in->yyt17; + hs1 = in->yyt18; + hs2 = in->yyt19; + r1 = in->yyt20; + r2 = in->yyt21; + p1 = in->yyt22; + p2 = in->yyt23; + p3 = in->yyt24; + p4 = in->yyt25; + q1 = in->yyt26; + q2 = in->yyt6; + of = in->yyt27; + p5 = in->yyt27; + p6 = in->yyt28; + q3 = in->yyt29; + q4 = in->yyt7; + v3 = in->yyt8; + v4 = in->yyt9; + v1 = in->yyt30; + v2 = in->yyt31; + st1 = in->yyt32; + st2 = in->yyt33; + rp1 = in->yyt34; + rp2 = in->yyt35; + h1 = in->yyt36; + h2 = in->yyt37; + h3 = in->yyt38; + h4 = in->yyt39; + h5 = in->yyt40; + { + ++c; + if (st1) { + printf("%.*s %.*s %.*s\n", + (int)(v2 - v1), v1, + (int)(st2 - st1), st1, + (int)(rp2 - rp1), rp1); + } else if (m1) { + printf("%.*s ", (int)(m2 - m1), m1); + if (of) { + printf("%.*s", (int)(p6 - p5), p5); + if (q3) printf("?%.*s", (int)(q4 - q3), q3); + } else if (au) { + printf("%.*s:", (int)(s2 - s1), s1); + if (p1) printf("//"); + if (u1) printf("%.*s@", (int)(u2 - u1), u1); + printf("%.*s", (int)(hs2 - hs1), hs1); + if (r1) printf(":%.*s", (int)(r2 - r1), r1); + if (p1) printf("%.*s", (int)(p2 - p1), p1); + if (p3) printf("%.*s", (int)(p4 - p3), p3); + if (q1) printf("?%.*s", (int)(q2 - q1), q1); + } else if (at) { + if (u3) printf("%.*s@", (int)(u4 - u3), u3); + printf("%.*s", (int)(hs4 - hs3), hs3); + if (r3) printf(":%.*s", (int)(r4 - r3), r3); + } else { + printf("*"); + } + printf(" %.*s\n", (int)(v4 - v3), v3); + } + print_headers(in->tok, h1, h2, h3, h4, h5); + printf("\n"); + mtagpool_clear(&in->mtp, in); + goto loop; + } +yy265: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '!': + case '#': + case '$': + case '%': + case '&': + case '\'': + case '*': + case '+': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '^': + case '_': + case '`': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '|': + case '~': goto yy265; + case ':': + YYMTAGP (in->yyt37); + goto yy292; + default: goto yy11; + } +yy267: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy207; + default: goto yy11; + } +yy268: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy294; + case ':': goto yy269; + default: goto yy11; + } +yy269: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy295; + case ':': goto yy296; + default: goto yy11; + } +yy270: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy297; + case ':': goto yy298; + case ']': goto yy188; + default: goto yy11; + } +yy271: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy299; + case ':': goto yy298; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy297; + case ']': goto yy188; + default: goto yy11; + } +yy272: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy299; + case '5': goto yy300; + case '6': + case '7': + case '8': + case '9': goto yy301; + case ':': goto yy298; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy297; + case ']': goto yy188; + default: goto yy11; + } +yy273: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy301; + case ':': goto yy298; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy297; + case ']': goto yy188; + default: goto yy11; + } +yy274: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy297; + case ':': goto yy298; + case ']': goto yy188; + default: goto yy11; + } +yy275: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy302; + case ':': goto yy239; + case ']': goto yy188; + default: goto yy11; + } +yy276: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy302; + case ':': goto yy239; + case ']': goto yy188; + default: goto yy11; + } +yy277: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy303; + case '1': goto yy304; + case '2': goto yy305; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy306; + default: goto yy11; + } +yy278: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy277; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy243; + default: goto yy11; + } +yy279: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy215; + case ']': goto yy188; + default: goto yy11; + } +yy280: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy223; + default: goto yy11; + } +yy281: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy307; + case ':': goto yy282; + default: goto yy11; + } +yy282: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy308; + case ':': goto yy309; + default: goto yy11; + } +yy283: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy310; + case ':': goto yy311; + case ']': goto yy90; + default: goto yy11; + } +yy284: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy312; + case ':': goto yy311; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy310; + case ']': goto yy90; + default: goto yy11; + } +yy285: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy312; + case '5': goto yy313; + case '6': + case '7': + case '8': + case '9': goto yy314; + case ':': goto yy311; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy310; + case ']': goto yy90; + default: goto yy11; + } +yy286: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy314; + case ':': goto yy311; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy310; + case ']': goto yy90; + default: goto yy11; + } +yy287: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy310; + case ':': goto yy311; + case ']': goto yy90; + default: goto yy11; + } +yy288: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy315; + case ':': goto yy253; + case ']': goto yy90; + default: goto yy11; + } +yy289: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy315; + case ':': goto yy253; + case ']': goto yy90; + default: goto yy11; + } +yy290: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy258; + case ']': goto yy90; + default: goto yy11; + } +yy291: + yych = *++YYCURSOR; + switch (yych) { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case '\v': + case '\f': + case '\r': + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x7F: goto yy11; + case '\n': + in->yyt34 = in->yyt35 = YYCURSOR; + goto yy318; + default: + in->yyt34 = YYCURSOR; + goto yy316; + } +yy292: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case '\v': + case '\f': + case '\r': + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x7F: goto yy11; + case '\t': + case ' ': goto yy292; + case '\n': + in->yyt41 = in->yyt40; + YYMTAGP (in->yyt41); + in->yyt42 = in->yyt39; + YYMTAGP (in->yyt42); + YYMTAGP (in->yyt38); + goto yy319; + default: + YYMTAGP (in->yyt38); + goto yy320; + } +yy294: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy322; + case ':': goto yy269; + default: goto yy11; + } +yy295: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy323; + case ':': goto yy324; + default: goto yy11; + } +yy296: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy325; + case '1': goto yy326; + case '2': goto yy327; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy328; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy329; + case ']': goto yy188; + default: goto yy11; + } +yy297: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy330; + case ':': goto yy298; + case ']': goto yy188; + default: goto yy11; + } +yy298: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy325; + case '1': goto yy326; + case '2': goto yy327; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy328; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy329; + default: goto yy11; + } +yy299: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy331; + case ':': goto yy298; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy330; + case ']': goto yy188; + default: goto yy11; + } +yy300: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy331; + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy330; + case ':': goto yy298; + case ']': goto yy188; + default: goto yy11; + } +yy301: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy330; + case ':': goto yy298; + case ']': goto yy188; + default: goto yy11; + } +yy302: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy239; + case ']': goto yy188; + default: goto yy11; + } +yy303: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy332; + default: goto yy11; + } +yy304: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy332; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy306; + default: goto yy11; + } +yy305: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy332; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy306; + case '5': goto yy333; + case '6': + case '7': + case '8': + case '9': goto yy303; + default: goto yy11; + } +yy306: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy332; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy303; + default: goto yy11; + } +yy307: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy334; + case ':': goto yy282; + default: goto yy11; + } +yy308: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy335; + case ':': goto yy336; + default: goto yy11; + } +yy309: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy337; + case '1': goto yy338; + case '2': goto yy339; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy340; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy341; + case ']': goto yy90; + default: goto yy11; + } +yy310: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy342; + case ':': goto yy311; + case ']': goto yy90; + default: goto yy11; + } +yy311: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy337; + case '1': goto yy338; + case '2': goto yy339; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy340; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy341; + default: goto yy11; + } +yy312: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy343; + case ':': goto yy311; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy342; + case ']': goto yy90; + default: goto yy11; + } +yy313: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy343; + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy342; + case ':': goto yy311; + case ']': goto yy90; + default: goto yy11; + } +yy314: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy342; + case ':': goto yy311; + case ']': goto yy90; + default: goto yy11; + } +yy315: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy253; + case ']': goto yy90; + default: goto yy11; + } +yy316: + ++YYCURSOR; + if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; + switch (yych) { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case '\v': + case '\f': + case '\r': + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x7F: goto yy11; + case '\n': + in->yyt35 = YYCURSOR; + goto yy318; + default: goto yy316; + } +yy318: + yych = *++YYCURSOR; + switch (yych) { + case '\n': + YYMTAGN (in->yyt40); + YYMTAGN (in->yyt39); + YYMTAGN (in->yyt38); + YYMTAGN (in->yyt37); + YYMTAGN (in->yyt36); + in->yyt1 = in->yyt2 = in->yyt3 = in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt9 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + goto yy263; + case '!': + case '#': + case '$': + case '%': + case '&': + case '\'': + case '*': + case '+': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '^': + case '_': + case '`': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '|': + case '~': + YYMTAGP (in->yyt36); + in->yyt1 = in->yyt2 = in->yyt3 = in->yyt4 = in->yyt5 = in->yyt6 = in->yyt7 = in->yyt8 = in->yyt9 = in->yyt10 = in->yyt11 = in->yyt12 = in->yyt13 = in->yyt14 = in->yyt15 = in->yyt16 = in->yyt17 = in->yyt18 = in->yyt19 = in->yyt20 = in->yyt21 = in->yyt22 = in->yyt23 = in->yyt24 = in->yyt25 = in->yyt26 = in->yyt27 = in->yyt28 = in->yyt29 = NULL; + goto yy265; + default: goto yy11; + } +yy319: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '\t': + case ' ': goto yy344; + case '\n': + in->yyt39 = in->yyt42; + in->yyt40 = in->yyt41; + goto yy263; + case '!': + case '#': + case '$': + case '%': + case '&': + case '\'': + case '*': + case '+': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '^': + case '_': + case '`': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '|': + case '~': + in->yyt39 = in->yyt42; + in->yyt40 = in->yyt41; + YYMTAGP (in->yyt36); + goto yy265; + default: goto yy11; + } +yy320: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case '\v': + case '\f': + case '\r': + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x7F: goto yy11; + case '\t': + in->yyt42 = in->yyt39; + YYMTAGP (in->yyt42); + goto yy346; + case '\n': + in->yyt41 = in->yyt40; + YYMTAGP (in->yyt41); + in->yyt42 = in->yyt39; + YYMTAGP (in->yyt42); + goto yy319; + case ' ': goto yy348; + default: goto yy320; + } +yy322: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy269; + default: goto yy11; + } +yy323: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy350; + case ':': goto yy324; + default: goto yy11; + } +yy324: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy351; + case ':': goto yy352; + default: goto yy11; + } +yy325: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy353; + case ':': goto yy354; + case ']': goto yy188; + default: goto yy11; + } +yy326: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy355; + case ':': goto yy354; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy353; + case ']': goto yy188; + default: goto yy11; + } +yy327: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy355; + case '5': goto yy356; + case '6': + case '7': + case '8': + case '9': goto yy357; + case ':': goto yy354; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy353; + case ']': goto yy188; + default: goto yy11; + } +yy328: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy357; + case ':': goto yy354; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy353; + case ']': goto yy188; + default: goto yy11; + } +yy329: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy353; + case ':': goto yy354; + case ']': goto yy188; + default: goto yy11; + } +yy330: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy358; + case ':': goto yy298; + case ']': goto yy188; + default: goto yy11; + } +yy331: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy358; + case ':': goto yy298; + case ']': goto yy188; + default: goto yy11; + } +yy332: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy359; + case '1': goto yy360; + case '2': goto yy361; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy362; + default: goto yy11; + } +yy333: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy332; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy303; + default: goto yy11; + } +yy334: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy282; + default: goto yy11; + } +yy335: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy363; + case ':': goto yy336; + default: goto yy11; + } +yy336: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy364; + case '1': goto yy365; + case '2': goto yy366; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy367; + case ':': goto yy368; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy369; + default: goto yy11; + } +yy337: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy370; + case ':': goto yy371; + case ']': goto yy90; + default: goto yy11; + } +yy338: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy372; + case ':': goto yy371; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy370; + case ']': goto yy90; + default: goto yy11; + } +yy339: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy372; + case '5': goto yy373; + case '6': + case '7': + case '8': + case '9': goto yy374; + case ':': goto yy371; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy370; + case ']': goto yy90; + default: goto yy11; + } +yy340: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy374; + case ':': goto yy371; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy370; + case ']': goto yy90; + default: goto yy11; + } +yy341: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy370; + case ':': goto yy371; + case ']': goto yy90; + default: goto yy11; + } +yy342: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy375; + case ':': goto yy311; + case ']': goto yy90; + default: goto yy11; + } +yy343: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy375; + case ':': goto yy311; + case ']': goto yy90; + default: goto yy11; + } +yy344: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case '\v': + case '\f': + case '\r': + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x7F: goto yy11; + case '\t': + case ' ': goto yy344; + case '\n': + in->yyt41 = in->yyt40; + YYMTAGP (in->yyt41); + in->yyt42 = in->yyt39; + YYMTAGP (in->yyt42); + goto yy319; + default: goto yy320; + } +yy346: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case '\v': + case '\f': + case '\r': + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x7F: goto yy11; + case '\t': goto yy346; + case '\n': + YYMTAGP (in->yyt40); + goto yy376; + case ' ': goto yy348; + default: goto yy377; + } +yy348: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case '\v': + case '\f': + case '\r': + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x7F: goto yy11; + case '\t': + in->yyt42 = in->yyt39; + YYMTAGP (in->yyt42); + goto yy346; + case '\n': + in->yyt41 = in->yyt40; + YYMTAGP (in->yyt41); + in->yyt42 = in->yyt39; + YYMTAGP (in->yyt42); + goto yy319; + case ' ': goto yy348; + default: goto yy378; + } +yy350: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy379; + case ':': goto yy324; + default: goto yy11; + } +yy351: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy380; + case ':': goto yy381; + default: goto yy11; + } +yy352: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy382; + case '1': goto yy383; + case '2': goto yy384; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy385; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy386; + case ']': goto yy188; + default: goto yy11; + } +yy353: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy387; + case ':': goto yy354; + case ']': goto yy188; + default: goto yy11; + } +yy354: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy382; + case '1': goto yy383; + case '2': goto yy384; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy385; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy386; + default: goto yy11; + } +yy355: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy388; + case ':': goto yy354; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy387; + case ']': goto yy188; + default: goto yy11; + } +yy356: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy388; + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy387; + case ':': goto yy354; + case ']': goto yy188; + default: goto yy11; + } +yy357: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy387; + case ':': goto yy354; + case ']': goto yy188; + default: goto yy11; + } +yy358: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy298; + case ']': goto yy188; + default: goto yy11; + } +yy359: + yych = *++YYCURSOR; + switch (yych) { + case ']': goto yy188; + default: goto yy11; + } +yy360: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy362; + case ']': goto yy188; + default: goto yy11; + } +yy361: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': goto yy362; + case '5': goto yy389; + case '6': + case '7': + case '8': + case '9': goto yy359; + case ']': goto yy188; + default: goto yy11; + } +yy362: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy359; + case ']': goto yy188; + default: goto yy11; + } +yy363: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy390; + case ':': goto yy336; + default: goto yy11; + } +yy364: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy391; + case ':': goto yy392; + default: goto yy11; + } +yy365: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy393; + case ':': goto yy392; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy391; + default: goto yy11; + } +yy366: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy393; + case '5': goto yy394; + case '6': + case '7': + case '8': + case '9': goto yy395; + case ':': goto yy392; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy391; + default: goto yy11; + } +yy367: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy395; + case ':': goto yy392; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy391; + default: goto yy11; + } +yy368: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy396; + case ']': goto yy90; + default: goto yy11; + } +yy369: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy391; + case ':': goto yy392; + default: goto yy11; + } +yy370: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy397; + case ':': goto yy371; + case ']': goto yy90; + default: goto yy11; + } +yy371: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy396; + default: goto yy11; + } +yy372: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy398; + case ':': goto yy371; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy397; + case ']': goto yy90; + default: goto yy11; + } +yy373: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy398; + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy397; + case ':': goto yy371; + case ']': goto yy90; + default: goto yy11; + } +yy374: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy397; + case ':': goto yy371; + case ']': goto yy90; + default: goto yy11; + } +yy375: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy311; + case ']': goto yy90; + default: goto yy11; + } +yy376: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '\n': + in->yyt39 = in->yyt42; + goto yy263; + case '!': + case '#': + case '$': + case '%': + case '&': + case '\'': + case '*': + case '+': + case '-': + case '.': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '^': + case '_': + case '`': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '|': + case '~': + in->yyt39 = in->yyt42; + YYMTAGP (in->yyt36); + goto yy265; + default: goto yy11; + } +yy377: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case '\v': + case '\f': + case '\r': + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x7F: goto yy11; + case '\t': + YYMTAGP (in->yyt39); + goto yy399; + case '\n': + in->yyt41 = in->yyt40; + YYMTAGP (in->yyt41); + in->yyt42 = in->yyt39; + YYMTAGP (in->yyt42); + goto yy319; + default: goto yy320; + } +yy378: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case '\v': + case '\f': + case '\r': + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x7F: goto yy11; + case '\t': + in->yyt42 = in->yyt39; + YYMTAGP (in->yyt42); + goto yy401; + case '\n': + in->yyt41 = in->yyt40; + YYMTAGP (in->yyt41); + in->yyt42 = in->yyt39; + YYMTAGP (in->yyt42); + goto yy319; + default: goto yy320; + } +yy379: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy324; + default: goto yy11; + } +yy380: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy403; + case ':': goto yy381; + default: goto yy11; + } +yy381: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy404; + case ':': goto yy405; + default: goto yy11; + } +yy382: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy406; + case ':': goto yy407; + case ']': goto yy188; + default: goto yy11; + } +yy383: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy408; + case ':': goto yy407; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy406; + case ']': goto yy188; + default: goto yy11; + } +yy384: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy408; + case '5': goto yy409; + case '6': + case '7': + case '8': + case '9': goto yy410; + case ':': goto yy407; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy406; + case ']': goto yy188; + default: goto yy11; + } +yy385: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy410; + case ':': goto yy407; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy406; + case ']': goto yy188; + default: goto yy11; + } +yy386: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy406; + case ':': goto yy407; + case ']': goto yy188; + default: goto yy11; + } +yy387: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy411; + case ':': goto yy354; + case ']': goto yy188; + default: goto yy11; + } +yy388: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy411; + case ':': goto yy354; + case ']': goto yy188; + default: goto yy11; + } +yy389: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy359; + case ']': goto yy188; + default: goto yy11; + } +yy390: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy336; + default: goto yy11; + } +yy391: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy412; + case ':': goto yy392; + default: goto yy11; + } +yy392: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy396; + case ':': goto yy258; + default: goto yy11; + } +yy393: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy413; + case ':': goto yy392; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy412; + default: goto yy11; + } +yy394: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy413; + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy412; + case ':': goto yy392; + default: goto yy11; + } +yy395: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy412; + case ':': goto yy392; + default: goto yy11; + } +yy396: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy414; + case ']': goto yy90; + default: goto yy11; + } +yy397: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy415; + case ':': goto yy371; + case ']': goto yy90; + default: goto yy11; + } +yy398: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy415; + case ':': goto yy371; + case ']': goto yy90; + default: goto yy11; + } +yy399: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case '\t': + case ' ': goto yy399; + case '\n': + in->yyt42 = in->yyt39; + YYMTAGP (in->yyt40); + goto yy376; + default: goto yy11; + } +yy401: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case '\v': + case '\f': + case '\r': + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x7F: goto yy11; + case '\t': goto yy401; + case '\n': + YYMTAGP (in->yyt40); + goto yy376; + case ' ': goto yy416; + default: goto yy377; + } +yy403: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy418; + case ':': goto yy381; + default: goto yy11; + } +yy404: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy419; + case ':': goto yy420; + default: goto yy11; + } +yy405: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy421; + case '1': goto yy422; + case '2': goto yy423; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy424; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy425; + case ']': goto yy188; + default: goto yy11; + } +yy406: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy426; + case ':': goto yy407; + case ']': goto yy188; + default: goto yy11; + } +yy407: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy421; + case '1': goto yy422; + case '2': goto yy423; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy424; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy425; + default: goto yy11; + } +yy408: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy427; + case ':': goto yy407; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy426; + case ']': goto yy188; + default: goto yy11; + } +yy409: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy427; + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy426; + case ':': goto yy407; + case ']': goto yy188; + default: goto yy11; + } +yy410: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy426; + case ':': goto yy407; + case ']': goto yy188; + default: goto yy11; + } +yy411: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy354; + case ']': goto yy188; + default: goto yy11; + } +yy412: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy428; + case ':': goto yy392; + default: goto yy11; + } +yy413: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy115; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy428; + case ':': goto yy392; + default: goto yy11; + } +yy414: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy429; + case ']': goto yy90; + default: goto yy11; + } +yy415: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy371; + case ']': goto yy90; + default: goto yy11; + } +yy416: + ++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + switch (yych) { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case '\v': + case '\f': + case '\r': + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x7F: goto yy11; + case '\t': goto yy401; + case '\n': + in->yyt41 = in->yyt40; + YYMTAGP (in->yyt41); + goto yy319; + case ' ': goto yy416; + default: goto yy378; + } +yy418: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy381; + default: goto yy11; + } +yy419: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy430; + case ':': goto yy420; + default: goto yy11; + } +yy420: + yych = *++YYCURSOR; + switch (yych) { + case '0': goto yy431; + case '1': goto yy432; + case '2': goto yy433; + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy434; + case ':': goto yy435; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy436; + default: goto yy11; + } +yy421: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy437; + case ':': goto yy438; + case ']': goto yy188; + default: goto yy11; + } +yy422: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy439; + case ':': goto yy438; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy437; + case ']': goto yy188; + default: goto yy11; + } +yy423: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy439; + case '5': goto yy440; + case '6': + case '7': + case '8': + case '9': goto yy441; + case ':': goto yy438; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy437; + case ']': goto yy188; + default: goto yy11; + } +yy424: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy441; + case ':': goto yy438; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy437; + case ']': goto yy188; + default: goto yy11; + } +yy425: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy437; + case ':': goto yy438; + case ']': goto yy188; + default: goto yy11; + } +yy426: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy442; + case ':': goto yy407; + case ']': goto yy188; + default: goto yy11; + } +yy427: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy442; + case ':': goto yy407; + case ']': goto yy188; + default: goto yy11; + } +yy428: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy392; + default: goto yy11; + } +yy429: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy258; + case ']': goto yy90; + default: goto yy11; + } +yy430: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy443; + case ':': goto yy420; + default: goto yy11; + } +yy431: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy444; + case ':': goto yy445; + default: goto yy11; + } +yy432: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy446; + case ':': goto yy445; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy444; + default: goto yy11; + } +yy433: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': goto yy446; + case '5': goto yy447; + case '6': + case '7': + case '8': + case '9': goto yy448; + case ':': goto yy445; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy444; + default: goto yy11; + } +yy434: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy448; + case ':': goto yy445; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy444; + default: goto yy11; + } +yy435: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy449; + case ']': goto yy188; + default: goto yy11; + } +yy436: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy444; + case ':': goto yy445; + default: goto yy11; + } +yy437: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy450; + case ':': goto yy438; + case ']': goto yy188; + default: goto yy11; + } +yy438: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy449; + default: goto yy11; + } +yy439: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy451; + case ':': goto yy438; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy450; + case ']': goto yy188; + default: goto yy11; + } +yy440: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy451; + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy450; + case ':': goto yy438; + case ']': goto yy188; + default: goto yy11; + } +yy441: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy450; + case ':': goto yy438; + case ']': goto yy188; + default: goto yy11; + } +yy442: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy407; + case ']': goto yy188; + default: goto yy11; + } +yy443: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy420; + default: goto yy11; + } +yy444: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy452; + case ':': goto yy445; + default: goto yy11; + } +yy445: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy449; + case ':': goto yy359; + default: goto yy11; + } +yy446: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy453; + case ':': goto yy445; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy452; + default: goto yy11; + } +yy447: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': goto yy453; + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy452; + case ':': goto yy445; + default: goto yy11; + } +yy448: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy452; + case ':': goto yy445; + default: goto yy11; + } +yy449: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy454; + case ']': goto yy188; + default: goto yy11; + } +yy450: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy455; + case ':': goto yy438; + case ']': goto yy188; + default: goto yy11; + } +yy451: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy455; + case ':': goto yy438; + case ']': goto yy188; + default: goto yy11; + } +yy452: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy456; + case ':': goto yy445; + default: goto yy11; + } +yy453: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy213; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy456; + case ':': goto yy445; + default: goto yy11; + } +yy454: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy457; + case ']': goto yy188; + default: goto yy11; + } +yy455: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy438; + case ']': goto yy188; + default: goto yy11; + } +yy456: + yych = *++YYCURSOR; + switch (yych) { + case ':': goto yy445; + default: goto yy11; + } +yy457: + yych = *++YYCURSOR; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': goto yy359; + case ']': goto yy188; + default: goto yy11; + } +} + +} + +int main(int argc, char **argv) +{ + long count; + input_t in; + init_input(&in, argv[1]); + + switch (lex(&in, &count)) { + case 0: fprintf(stderr, "ok, parsed %ld HTTPs\n", count); break; + case 1: fprintf(stderr, "syntax error\n"); break; + case 2: fprintf(stderr, "yyfill error\n"); break; + default: fprintf(stderr, "panic!\n"); break; + } + + free_input(&in); + return 0; +} +re2c: warning: line 243: tag 'm1' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 243: tag 'at' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 243: tag 'u3' has 3rd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 243: tag 'u4' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 243: tag 'hs3' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 243: tag 'hs4' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 243: tag 'r3' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 243: tag 'au' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 243: tag 's1' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 243: tag 's2' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 243: tag 'u1' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 243: tag 'u2' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 243: tag 'hs1' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 243: tag 'hs2' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 243: tag 'r1' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 243: tag 'p3' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 243: tag 'v1' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 243: tag 'h3' has 3rd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 243: tag 'h4' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 243: tag 'h5' has 2nd degree of nondeterminism [-Wnondeterministic-tags] diff --git a/examples/11_http_rfc7230.i--tags.re b/examples/11_http_rfc7230.i--tags.re new file mode 100644 index 0000000..ed14b91 --- /dev/null +++ b/examples/11_http_rfc7230.i--tags.re @@ -0,0 +1,296 @@ +#include +#include +#include + +typedef struct mtag_t { + struct mtag_t *pred; + long dist; +} mtag_t; + +typedef struct mtagpool_t { + mtag_t *head; + mtag_t *next; + mtag_t *last; +} mtagpool_t; + +typedef struct { + FILE *file; + char *buf; + char *lim; + char *cur; + char *mar; + char *tok; + /*!stags:re2c format = "char *@@;\n"; */ + /*!mtags:re2c format = "mtag_t *@@;\n"; */ + mtagpool_t mtp; + int eof; +} input_t; + +static void mtagpool_clear(mtagpool_t *mtp, input_t *in) +{ + mtp->next = mtp->head; + /*!mtags:re2c format = "in->@@ = 0;\n"; */ +} + +static void mtagpool_init(mtagpool_t *mtp) +{ + static const unsigned size = 1024 * 1024; + mtp->head = (mtag_t*)malloc(size * sizeof(mtag_t)); + mtp->next = mtp->head; + mtp->last = mtp->head + size; +} + +static void mtagpool_free(mtagpool_t *mtp) +{ + free(mtp->head); + mtp->head = mtp->next = mtp->last = NULL; +} + +static mtag_t *mtagpool_next(mtagpool_t *mtp) +{ + unsigned size; + mtag_t *head; + + if (mtp->next < mtp->last) return mtp->next++; + + size = mtp->last - mtp->head; + head = (mtag_t*)malloc(2 * size * sizeof(mtag_t)); + memcpy(head, mtp->head, size * sizeof(mtag_t)); + free(mtp->head); + mtp->head = head; + mtp->next = head + size; + mtp->last = head + size * 2; + return mtp->next++; +} + +static void mtag(mtag_t **pmt, const char *b, const char *t, mtagpool_t *mtp) +{ + mtag_t *mt = mtagpool_next(mtp); + mt->pred = *pmt; + mt->dist = t - b; + *pmt = mt; +} + +/*!max:re2c*/ +static const size_t SIZE = 4096; + +static void init_input(input_t *in, const char *fname) +{ + in->file = fopen(fname, "r"); + in->buf = (char*) malloc(SIZE + YYMAXFILL); + in->lim = in->buf + SIZE; + in->cur = in->lim; + in->mar = in->lim; + in->tok = in->lim; + /*!stags:re2c format = "in->@@ = 0;\n"; */ + /*!mtags:re2c format = "in->@@ = 0;\n"; */ + mtagpool_init(&in->mtp); + in->eof = 0; +} + +static void free_input(input_t *in) +{ + fclose(in->file); + free(in->buf); + mtagpool_free(&in->mtp); +} + +static int fill(input_t *in, size_t need) +{ + size_t free; + if (in->eof) return 1; + + free = in->tok - in->buf; + if (free < need) return 2; + + memmove(in->buf, in->tok, in->lim - in->tok); + in->lim -= free; + in->cur -= free; + in->mar -= free; + in->tok -= free; + /*!stags:re2c format = "if (in->@@) in->@@ -= free;\n"; */ + in->lim += fread(in->lim, 1, free, in->file); + if (in->lim < in->buf + SIZE) { + in->eof = 1; + memset(in->lim, 0, YYMAXFILL); + in->lim += YYMAXFILL; + } + return 0; +} + +static void print_headers(const char *tok, + const mtag_t *h1, const mtag_t *h2, + const mtag_t *h3, const mtag_t *h4, + const mtag_t *h5) +{ + if (!h1) return; + print_headers(tok, h1->pred, h2->pred, h3->pred, h4->pred, h5->pred); + printf("%.*s%.*s%.*s%.*s\n", + (int)(h2->dist - h1->dist), tok + h1->dist, + (int)(h3->dist - h2->dist), tok + h2->dist, + (int)(h4->dist - h3->dist), tok + h3->dist, + (int)(h5->dist - h4->dist), tok + h4->dist); +} + +#define YYCTYPE char +#define YYCURSOR in->cur +#define YYMARKER in->mar +#define YYLIMIT in->lim +#define YYMTAGP(mt) mtag(&mt, in->tok, in->cur, &in->mtp) +#define YYMTAGN(mt) mtag(&mt, in->tok, NULL, &in->mtp) +#define YYFILL(n) if (fill(in, n) != 0) return 2; + +static int lex(input_t *in, long *count) +{ + const char *of, *au, *at, + *hs1, *hs3, *m1, *p1, *p3, *p5, *q1, *q3, + *hs2, *hs4, *m2, *p2, *p4, *p6, *q2, *q4, + *r1, *r3, *rp1, *s1, *st1, *u1, *u3, *v1, *v3, + *r2, *r4, *rp2, *s2, *st2, *u2, *u4, *v2, *v4; + mtag_t *h1, *h2, *h3, *h4, *h5; + long c; + + c = 0;; + of = au = at + = hs1 = hs3 = m1 = p1 = p3 = p5 = q1 = q3 + = hs2 = hs4 = m2 = p2 = p4 = p6 = q2 = q4 + = r1 = r3 = rp1 = s1 = st1 = u1 = u3 = v1 = v3 + = r2 = r4 = rp2 = s2 = st2 = u2 = u4 = v2 = v4 = NULL; +loop: + in->tok = in->cur; +/*!re2c + re2c:tags:expression = "in->@@"; + + end = "\x00"; + eol = "\n"; + + crlf = eol; + sp = " "; + htab = "\t"; + ows = (sp | htab)*; + digit = [0-9]; + alpha = [a-zA-Z]; + hexdigit = [0-9a-fA-F]; + unreserved = alpha | digit | [-._~]; + pct_encoded = "%" hexdigit{2}; + sub_delims = [!$&'()*+,;=]; + pchar = unreserved | pct_encoded | sub_delims | [:@]; + vchar = [\x1f-\x7e]; + tchar = [-!#$%&'*+.^_`|~] | digit | alpha; + + obs_fold = crlf (sp | htab)+; + obs_text = [\x80-\xff]; + field_name = tchar+; + field_vchar = vchar | obs_text; + field_content = field_vchar ((sp | htab)+ field_vchar)?; + field_value = (field_content | obs_fold)*; + header_field = #h1 field_name #h2 ":" ows #h3 field_value #h4 ows #h5; + scheme = alpha (alpha | digit | [-+.])*; + userinfo = (unreserved | pct_encoded | sub_delims | ":")*; + dec_octet + = digit + | [\x31-\x39] digit + | "1" digit{2} + | "2" [\x30-\x34] digit + | "25" [\x30-\x35]; + ipv4address = dec_octet "." dec_octet "." dec_octet "." dec_octet; + h16 = hexdigit{1,4}; + ls32 = h16 ":" h16 | ipv4address; + ipv6address + = (h16 ":"){6} ls32 + | "::" (h16 ":"){5} ls32 + | ( h16)? "::" (h16 ":"){4} ls32 + | ((h16 ":"){0,1} h16)? "::" (h16 ":"){3} ls32 + | ((h16 ":"){0,2} h16)? "::" (h16 ":"){2} ls32 + | ((h16 ":"){0,3} h16)? "::" h16 ":" ls32 + | ((h16 ":"){0,4} h16)? "::" ls32 + | ((h16 ":"){0,5} h16)? "::" h16 + | ((h16 ":"){0,6} h16)? "::"; + ipvfuture = "v" hexdigit+ "." (unreserved | sub_delims | ":" )+; + ip_literal = "[" ( ipv6address | ipvfuture ) "]"; + reg_name = (unreserved | pct_encoded | sub_delims)*; + path_abempty = ("/" pchar*)*; + path_absolute = "/" (pchar+ ("/" pchar*)*)?; + path_rootless = pchar+ ("/" pchar*)*; + path_empty = ""; + host = ip_literal | ipv4address | reg_name; + port = digit*; + query = (pchar | [/?])*; + absolute_uri = @s1 scheme @s2 ":" + ( "//" (@u1 userinfo @u2 "@")? @hs1 host @hs2 (":" @r1 port @r2)? @p1 path_abempty @p2 + | @p3 (path_absolute | path_rootless | path_empty) @p4 + ) ("?" @q1 query @q2)?; + authority = (@u3 userinfo @u4 "@")? @hs3 host @hs4 (":" @r3 port @r4)?; + origin_form = @p5 path_abempty @p6 ("?" @q3 query @q4)?; + http_name = "HTTP"; + http_version = http_name "/" digit "." digit; + request_target + = @at authority + | @au absolute_uri + | @of origin_form + | "*"; + method = tchar+; + request_line = @m1 method @m2 sp request_target sp @v3 http_version @v4 crlf; + status_code = digit{3}; + reason_phrase = (htab | sp | vchar | obs_text)*; + status_line = @v1 http_version @v2 sp @st1 status_code @st2 sp @rp1 reason_phrase @rp2 crlf; + start_line = (request_line | status_line); + message_head = start_line (header_field crlf)* crlf; + + * { return 1; } + end { *count = c; return 0; } + eol { goto loop; } + message_head { + ++c; + if (st1) { + printf("%.*s %.*s %.*s\n", + (int)(v2 - v1), v1, + (int)(st2 - st1), st1, + (int)(rp2 - rp1), rp1); + } else if (m1) { + printf("%.*s ", (int)(m2 - m1), m1); + if (of) { + printf("%.*s", (int)(p6 - p5), p5); + if (q3) printf("?%.*s", (int)(q4 - q3), q3); + } else if (au) { + printf("%.*s:", (int)(s2 - s1), s1); + if (p1) printf("//"); + if (u1) printf("%.*s@", (int)(u2 - u1), u1); + printf("%.*s", (int)(hs2 - hs1), hs1); + if (r1) printf(":%.*s", (int)(r2 - r1), r1); + if (p1) printf("%.*s", (int)(p2 - p1), p1); + if (p3) printf("%.*s", (int)(p4 - p3), p3); + if (q1) printf("?%.*s", (int)(q2 - q1), q1); + } else if (at) { + if (u3) printf("%.*s@", (int)(u4 - u3), u3); + printf("%.*s", (int)(hs4 - hs3), hs3); + if (r3) printf(":%.*s", (int)(r4 - r3), r3); + } else { + printf("*"); + } + printf(" %.*s\n", (int)(v4 - v3), v3); + } + print_headers(in->tok, h1, h2, h3, h4, h5); + printf("\n"); + mtagpool_clear(&in->mtp, in); + goto loop; + } +*/ +} + +int main(int argc, char **argv) +{ + long count; + input_t in; + init_input(&in, argv[1]); + + switch (lex(&in, &count)) { + case 0: fprintf(stderr, "ok, parsed %ld HTTPs\n", count); break; + case 1: fprintf(stderr, "syntax error\n"); break; + case 2: fprintf(stderr, "yyfill error\n"); break; + default: fprintf(stderr, "panic!\n"); break; + } + + free_input(&in); + return 0; +} diff --git a/examples/13_records.i--tags.c b/examples/13_records.i--tags.c new file mode 100644 index 0000000..b3b3426 --- /dev/null +++ b/examples/13_records.i--tags.c @@ -0,0 +1,1226 @@ +/* Generated by re2c */ +#include +#include +#include + +struct mtag_t +{ + int pred; + const char *tag; +}; + +typedef std::vector mtagpool_t; + +static void mtag(int *pt, const char *t, mtagpool_t *tp) +{ + mtag_t l = {*pt, t}; + *pt = (int) tp->size(); + tp->push_back(l); +} + +static void print_channels(const mtagpool_t &tp, int x, int y) +{ + if (x == -1) return; + print_channels(tp, tp[x].pred, tp[y].pred); + const char *px = tp[x].tag, *py = tp[y].tag; + printf(" %.*s\n", (int) (py - px), px); +} + +#define YYMTAGP(t) mtag(&t, YYCURSOR, &tp) +#define YYMTAGN(t) mtag(&t, NULL, &tp) + +static int lex(const char *YYCURSOR) +{ + const char *YYMARKER, *n1, *n2, *a1, *a2, *c1, *c2; + mtagpool_t tp; + int h1, h2; + const char *yyt1;const char *yyt2;const char *yyt3;const char *yyt4;const char *yyt5;const char *yyt6; + int yyt7;int yyt8; +loop: + tp.clear(); + yyt7 = -1;yyt8 = -1; + +{ + char yych; + yych = *YYCURSOR; + switch (yych) { + case 0x00: goto yy2; + case '\t': + case ' ': goto yy6; + case '\n': goto yy9; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + yyt1 = YYCURSOR; + goto yy10; + default: goto yy4; + } +yy2: + ++YYCURSOR; + { return 0; } +yy4: + ++YYCURSOR; +yy5: + { printf("error: %s\n", YYCURSOR); return 1; } +yy6: + yych = *++YYCURSOR; + switch (yych) { + case '\t': + case ' ': goto yy6; + default: goto yy8; + } +yy8: + { goto loop; } +yy9: + ++YYCURSOR; + goto yy8; +yy10: + yych = *(YYMARKER = ++YYCURSOR); + switch (yych) { + case '\t': + case ' ': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + case '{': goto yy15; + default: goto yy5; + } +yy11: + yych = *++YYCURSOR; + switch (yych) { + case '\t': + case ' ': goto yy11; + case '{': goto yy16; + default: goto yy13; + } +yy13: + YYCURSOR = YYMARKER; + goto yy5; +yy14: + yych = *++YYCURSOR; +yy15: + switch (yych) { + case '\t': + case ' ': + yyt2 = YYCURSOR; + goto yy11; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy14; + case '{': + yyt2 = YYCURSOR; + goto yy16; + default: goto yy13; + } +yy16: + yych = *++YYCURSOR; + switch (yych) { + case '\t': + case ' ': goto yy16; + case '\n': goto yy18; + default: goto yy13; + } +yy18: + yych = *++YYCURSOR; + switch (yych) { + case '\t': + case ' ': goto yy18; + case 'n': goto yy20; + default: goto yy13; + } +yy20: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy21; + default: goto yy13; + } +yy21: + yych = *++YYCURSOR; + switch (yych) { + case 'm': goto yy22; + default: goto yy13; + } +yy22: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy23; + default: goto yy13; + } +yy23: + yych = *++YYCURSOR; + switch (yych) { + case '\t': + case ' ': goto yy23; + case '=': goto yy25; + default: goto yy13; + } +yy25: + yych = *++YYCURSOR; + switch (yych) { + case '\t': + case ' ': goto yy25; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + yyt3 = YYCURSOR; + goto yy27; + default: goto yy13; + } +yy27: + yych = *++YYCURSOR; + switch (yych) { + case '.': goto yy28; + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy29; + default: goto yy13; + } +yy28: + yych = *++YYCURSOR; + switch (yych) { + case '\t': + case ' ': + yyt4 = YYCURSOR; + goto yy31; + case '\n': + yyt4 = YYCURSOR; + goto yy33; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': goto yy27; + default: goto yy13; + } +yy29: + yych = *++YYCURSOR; + switch (yych) { + case '\t': + case ' ': + yyt4 = YYCURSOR; + goto yy31; + case '\n': + yyt4 = YYCURSOR; + goto yy33; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': goto yy27; + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy29; + default: goto yy13; + } +yy31: + yych = *++YYCURSOR; + switch (yych) { + case '\t': + case ' ': goto yy31; + case '\n': goto yy33; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': goto yy27; + default: goto yy13; + } +yy33: + yych = *++YYCURSOR; + switch (yych) { + case '\t': + case ' ': goto yy33; + case 'c': goto yy35; + default: goto yy13; + } +yy35: + yych = *++YYCURSOR; + switch (yych) { + case 'o': goto yy36; + default: goto yy13; + } +yy36: + yych = *++YYCURSOR; + switch (yych) { + case 'u': goto yy37; + default: goto yy13; + } +yy37: + yych = *++YYCURSOR; + switch (yych) { + case 'n': goto yy38; + default: goto yy13; + } +yy38: + yych = *++YYCURSOR; + switch (yych) { + case 't': goto yy39; + default: goto yy13; + } +yy39: + yych = *++YYCURSOR; + switch (yych) { + case 'r': goto yy40; + default: goto yy13; + } +yy40: + yych = *++YYCURSOR; + switch (yych) { + case 'y': goto yy41; + default: goto yy13; + } +yy41: + yych = *++YYCURSOR; + switch (yych) { + case '\t': + case ' ': goto yy41; + case '=': goto yy43; + default: goto yy13; + } +yy43: + yych = *++YYCURSOR; + switch (yych) { + case '\t': goto yy43; + case ' ': + yyt5 = YYCURSOR; + goto yy45; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + yyt5 = YYCURSOR; + goto yy47; + default: goto yy13; + } +yy45: + yych = *++YYCURSOR; + switch (yych) { + case '\t': + yyt6 = YYCURSOR; + goto yy49; + case '\n': + yyt6 = YYCURSOR; + goto yy51; + case ' ': + yyt5 = YYCURSOR; + goto yy45; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + yyt5 = YYCURSOR; + goto yy47; + default: goto yy13; + } +yy47: + yych = *++YYCURSOR; + switch (yych) { + case '\t': + yyt6 = YYCURSOR; + goto yy53; + case '\n': + yyt6 = YYCURSOR; + goto yy51; + case ' ': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy47; + default: goto yy13; + } +yy49: + yych = *++YYCURSOR; + switch (yych) { + case '\t': goto yy49; + case '\n': goto yy51; + case ' ': + yyt5 = YYCURSOR; + goto yy45; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + yyt5 = YYCURSOR; + goto yy47; + default: goto yy13; + } +yy51: + yych = *++YYCURSOR; + switch (yych) { + case '\t': + case ' ': goto yy51; + case 'c': goto yy55; + default: goto yy13; + } +yy53: + yych = *++YYCURSOR; + switch (yych) { + case '\t': + case ' ': goto yy53; + case '\n': goto yy51; + default: goto yy13; + } +yy55: + yych = *++YYCURSOR; + switch (yych) { + case 'h': goto yy56; + default: goto yy13; + } +yy56: + yych = *++YYCURSOR; + switch (yych) { + case 'a': goto yy57; + default: goto yy13; + } +yy57: + yych = *++YYCURSOR; + switch (yych) { + case 'n': goto yy58; + default: goto yy13; + } +yy58: + yych = *++YYCURSOR; + switch (yych) { + case 'n': goto yy59; + default: goto yy13; + } +yy59: + yych = *++YYCURSOR; + switch (yych) { + case 'e': goto yy60; + default: goto yy13; + } +yy60: + yych = *++YYCURSOR; + switch (yych) { + case 'l': goto yy61; + default: goto yy13; + } +yy61: + yych = *++YYCURSOR; + switch (yych) { + case 's': goto yy62; + default: goto yy13; + } +yy62: + yych = *++YYCURSOR; + switch (yych) { + case '\t': + case ' ': goto yy62; + case '=': goto yy64; + default: goto yy13; + } +yy64: + yych = *++YYCURSOR; + switch (yych) { + case '\t': + case ' ': goto yy64; + case '\n': + YYMTAGN (yyt8); + YYMTAGN (yyt7); + goto yy66; + case '#': + YYMTAGP (yyt7); + goto yy68; + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + YYMTAGP (yyt7); + goto yy69; + default: goto yy13; + } +yy66: + yych = *++YYCURSOR; + switch (yych) { + case '\t': + case ' ': goto yy66; + case '}': goto yy71; + default: goto yy13; + } +yy68: + yych = *++YYCURSOR; + switch (yych) { + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy73; + default: goto yy13; + } +yy69: + yych = *++YYCURSOR; + switch (yych) { + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy69; + case '/': goto yy75; + default: goto yy13; + } +yy71: + ++YYCURSOR; + n1 = yyt1; + n2 = yyt2; + a1 = yyt3; + a2 = yyt4; + c1 = yyt5; + c2 = yyt6; + h1 = yyt7; + h2 = yyt8; + { + printf("\n%.*s\n", (int) (n2 - n1), n1); + printf(" name: %.*s\n", (int) (a2 - a1), a1); + printf(" country: %.*s\n", (int) (c2 - c1), c1); + printf(" channels:\n"); + print_channels(tp, h1, h2); + goto loop; + } +yy73: + yych = *++YYCURSOR; + switch (yych) { + case '\t': + case ' ': + YYMTAGP (yyt8); + goto yy76; + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy73; + case ';': + YYMTAGP (yyt8); + goto yy78; + default: goto yy13; + } +yy75: + yych = *++YYCURSOR; + switch (yych) { + case '#': goto yy68; + default: goto yy13; + } +yy76: + yych = *++YYCURSOR; + switch (yych) { + case '\t': + case ' ': goto yy76; + case ';': goto yy78; + default: goto yy13; + } +yy78: + yych = *++YYCURSOR; + switch (yych) { + case '\t': + case ' ': goto yy78; + case '\n': goto yy66; + case '#': + YYMTAGP (yyt7); + goto yy68; + case '-': + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': + YYMTAGP (yyt7); + goto yy69; + default: goto yy13; + } +} + +} + +int main(int argc, char **argv) +{ + if (argc < 2) { + fprintf(stderr, "no input files\n"); + return 1; + } + + FILE *file = fopen(argv[1], "r"); + + fseek(file, 0, SEEK_END); + const size_t fsize = (size_t) ftell(file); + fseek(file, 0, SEEK_SET); + + char *buffer = (char*) malloc(fsize + 1); + + fread(buffer, 1, fsize, file); + buffer[fsize] = 0; + + const int status = lex(buffer); + + fclose(file); + free(buffer); + + return status; +} +re2c: warning: line 57: rule matches empty string [-Wmatch-empty-string] +re2c: warning: line 63: tag 'a2' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 63: tag 'c1' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 63: tag 'c2' has 2nd degree of nondeterminism [-Wnondeterministic-tags] diff --git a/examples/13_records.i--tags.re b/examples/13_records.i--tags.re new file mode 100644 index 0000000..7b41ff5 --- /dev/null +++ b/examples/13_records.i--tags.re @@ -0,0 +1,98 @@ +#include +#include +#include + +struct mtag_t +{ + int pred; + const char *tag; +}; + +typedef std::vector mtagpool_t; + +static void mtag(int *pt, const char *t, mtagpool_t *tp) +{ + mtag_t l = {*pt, t}; + *pt = (int) tp->size(); + tp->push_back(l); +} + +static void print_channels(const mtagpool_t &tp, int x, int y) +{ + if (x == -1) return; + print_channels(tp, tp[x].pred, tp[y].pred); + const char *px = tp[x].tag, *py = tp[y].tag; + printf(" %.*s\n", (int) (py - px), px); +} + +#define YYMTAGP(t) mtag(&t, YYCURSOR, &tp) +#define YYMTAGN(t) mtag(&t, NULL, &tp) + +static int lex(const char *YYCURSOR) +{ + const char *YYMARKER, *n1, *n2, *a1, *a2, *c1, *c2; + mtagpool_t tp; + int h1, h2; + /*!stags:re2c format = "const char *@@;"; */ + /*!mtags:re2c format = "int @@;"; */ +loop: + tp.clear(); + /*!mtags:re2c format = "@@ = -1;"; */ + /*!re2c + re2c:define:YYCTYPE = char; + re2c:yyfill:enable = 0; + + end = "\x00"; + eol = "\n"; + wsp = [ \t]*; + eq = wsp "=" wsp; + nick = [a-zA-Z0-9_]+; + name = [A-Z] ("." | [a-z]+); + names = name (wsp name)*; + country = [A-Za-z ]+; + channel = ([a-z0-9-]+ "/")? "#" [a-z0-9-]+; + + * { printf("error: %s\n", YYCURSOR); return 1; } + end { return 0; } + wsp | eol { goto loop; } + + @n1 nick @n2 wsp "{" wsp eol + wsp "name" eq @a1 names @a2 wsp eol + wsp "country" eq @c1 country @c2 wsp eol + wsp "channels" eq (wsp #h1 channel #h2 wsp ";")* wsp eol + wsp "}" { + printf("\n%.*s\n", (int) (n2 - n1), n1); + printf(" name: %.*s\n", (int) (a2 - a1), a1); + printf(" country: %.*s\n", (int) (c2 - c1), c1); + printf(" channels:\n"); + print_channels(tp, h1, h2); + goto loop; + } + */ +} + +int main(int argc, char **argv) +{ + if (argc < 2) { + fprintf(stderr, "no input files\n"); + return 1; + } + + FILE *file = fopen(argv[1], "r"); + + fseek(file, 0, SEEK_END); + const size_t fsize = (size_t) ftell(file); + fseek(file, 0, SEEK_SET); + + char *buffer = (char*) malloc(fsize + 1); + + fread(buffer, 1, fsize, file); + buffer[fsize] = 0; + + const int status = lex(buffer); + + fclose(file); + free(buffer); + + return status; +} diff --git a/examples/14_options.i--tags.c b/examples/14_options.i--tags.c new file mode 100644 index 0000000..228f9b3 --- /dev/null +++ b/examples/14_options.i--tags.c @@ -0,0 +1,1636 @@ +/* Generated by re2c */ +#include +#include +#include + +typedef std::vector > unknown_t; + +struct options_t +{ + std::string date; + std::string path; + std::string format; + std::string limit; + bool verbose; +}; + +static void show(const options_t &o, const unknown_t &u) +{ + printf("\noptions:\n"); + printf(" date: %s\n", o.date.c_str()); + printf(" path: %s\n", o.path.c_str()); + printf(" format: %s\n", o.format.c_str()); + printf(" limit: %s\n", o.limit.c_str()); + printf(" verbose: %s\n", o.verbose ? "yes" : "no"); + + printf("\nunknown:\n"); + unknown_t::const_iterator i = u.begin(), e = u.end(); + for (; i != e; ++i) { + printf(" %s: '%s'\n", i->first.c_str(), i->second.c_str()); + } +} + +static void bad_arg(const char *k, const char *v, const char *e) +{ + printf("bad argument '%.*s' to option %.*s\n", + (int) (e - v), v, (int) (v - k), k); +} + +static int lex(const char *s) +{ + options_t o; + unknown_t u; + const char *m, *k, *v; + const char *yyt1;const char *yyt2;const char *yyt3;const char *yyt4;const char *yyt5; +loop: + +{ + char yych; + unsigned int yyaccept = 0; + yych = *s; + switch (yych) { + case 0x00: goto yy2; + case '\t': + case '\n': + case '\r': + case ' ': goto yy6; + case '-': + yyt2 = s; + goto yy9; + default: goto yy4; + } +yy2: + ++s; + { show(o, u); return 0; } +yy4: + ++s; +yy5: + { printf("error: %s\n", s); return 1; } +yy6: + yych = *++s; + switch (yych) { + case '\t': + case '\n': + case '\r': + case ' ': goto yy6; + default: goto yy8; + } +yy8: + { goto loop; } +yy9: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + case '=': goto yy5; + case '-': + yyt3 = s; + goto yy13; + case 'd': + yyt3 = s; + goto yy14; + case 'f': + yyt3 = s; + goto yy16; + case 'l': + yyt3 = s; + goto yy17; + case 'p': + yyt3 = s; + goto yy18; + case 'v': + yyt3 = s; + goto yy20; + default: + yyt3 = s; + goto yy10; + } +yy10: + yych = *++s; +yy11: + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt4 = s; + goto yy12; + case '"': + yyt4 = s; + goto yy22; + case '=': + yyt4 = s; + goto yy24; + default: goto yy10; + } +yy12: + k = yyt3; + v = yyt4; + { + u.push_back(std::make_pair(std::string(k, v), std::string(v, s))); + goto loop; + } +yy13: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt4 = s; + goto yy12; + case '"': + yyt1 = yyt4 = s; + goto yy25; + case '=': + yyt4 = s; + goto yy24; + case 'd': + yyt1 = s; + goto yy27; + case 'f': + yyt1 = s; + goto yy28; + case 'l': + yyt1 = s; + goto yy29; + case 'p': + yyt1 = s; + goto yy30; + case 'v': + yyt1 = s; + goto yy31; + default: + yyt3 = s; + goto yy10; + } +yy14: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt5 = s; + goto yy15; + case '"': + yyt5 = s; + goto yy34; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + yyt1 = yyt5 = s; + goto yy36; + case '=': + yyt5 = s; + goto yy37; + default: + yyt5 = s; + goto yy32; + } +yy15: + k = yyt2; + v = yyt5; + { + bad_arg(k, v, s); + goto loop; + } +yy16: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt5 = s; + goto yy15; + case '"': + yyt1 = yyt5 = s; + goto yy38; + case '=': + yyt5 = s; + goto yy37; + default: + yyt5 = s; + goto yy32; + } +yy17: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt5 = s; + goto yy15; + case '"': + yyt5 = s; + goto yy34; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + yyt1 = yyt5 = s; + goto yy40; + case '=': + yyt5 = s; + goto yy37; + default: + yyt5 = s; + goto yy32; + } +yy18: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt1 = s; + goto yy19; + case '"': + yyt1 = yyt5 = s; + goto yy45; + case '=': + yyt5 = s; + goto yy37; + default: + yyt1 = s; + goto yy43; + } +yy19: + v = yyt1; + { o.path = std::string(v, s); goto loop; } +yy20: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': goto yy21; + default: goto yy11; + } +yy21: + { o.verbose = true; goto loop; } +yy22: + yyaccept = 0; + yych = *(m = ++s); + switch (yych) { + case 0x00: + yyt4 = s; + goto yy12; + case '\t': + case '\n': + case '\r': + case ' ': goto yy47; + case '"': + yyt4 = s; + goto yy22; + case '=': + yyt4 = s; + goto yy24; + default: goto yy22; + } +yy24: + yych = *++s; + switch (yych) { + case '"': goto yy52; + default: goto yy51; + } +yy25: + yyaccept = 1; + yych = *(m = ++s); + switch (yych) { + case 0x00: + yyt3 = yyt1; + yyt4 = s; + goto yy12; + case '\t': + case '\n': + case '\r': + case ' ': goto yy47; + case '"': + yyt3 = yyt1; + yyt4 = s; + goto yy22; + case '=': + yyt3 = yyt1; + yyt4 = s; + goto yy24; + default: goto yy25; + } +yy27: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt3 = yyt1; + yyt4 = s; + goto yy12; + case '"': + yyt3 = yyt1; + yyt4 = s; + goto yy22; + case '=': + yyt3 = yyt1; + yyt4 = s; + goto yy24; + case 'a': goto yy54; + default: + yyt3 = yyt1; + goto yy10; + } +yy28: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt3 = yyt1; + yyt4 = s; + goto yy12; + case '"': + yyt3 = yyt1; + yyt4 = s; + goto yy22; + case '=': + yyt3 = yyt1; + yyt4 = s; + goto yy24; + case 'o': goto yy55; + default: + yyt3 = yyt1; + goto yy10; + } +yy29: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt3 = yyt1; + yyt4 = s; + goto yy12; + case '"': + yyt3 = yyt1; + yyt4 = s; + goto yy22; + case '=': + yyt3 = yyt1; + yyt4 = s; + goto yy24; + case 'i': goto yy56; + default: + yyt3 = yyt1; + goto yy10; + } +yy30: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt3 = yyt1; + yyt4 = s; + goto yy12; + case '"': + yyt3 = yyt1; + yyt4 = s; + goto yy22; + case '=': + yyt3 = yyt1; + yyt4 = s; + goto yy24; + case 'a': goto yy57; + default: + yyt3 = yyt1; + goto yy10; + } +yy31: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt3 = yyt1; + yyt4 = s; + goto yy12; + case '"': + yyt3 = yyt1; + yyt4 = s; + goto yy22; + case '=': + yyt3 = yyt1; + yyt4 = s; + goto yy24; + case 'e': goto yy58; + default: + yyt3 = yyt1; + goto yy10; + } +yy32: + yych = *++s; +yy33: + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': goto yy15; + case '"': + yyt4 = s; + goto yy59; + case '=': + yyt4 = s; + goto yy24; + default: goto yy32; + } +yy34: + yyaccept = 2; + yych = *(m = ++s); + switch (yych) { + case 0x00: goto yy15; + case '\t': + case '\n': + case '\r': + case ' ': goto yy61; + case '=': + yyt4 = s; + goto yy24; + default: goto yy34; + } +yy36: + yych = *++s; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy63; + default: goto yy33; + } +yy37: + yych = *++s; + switch (yych) { + case '"': goto yy66; + default: goto yy65; + } +yy38: + yyaccept = 2; + yych = *(m = ++s); + switch (yych) { + case 0x00: goto yy15; + case '\t': + case '\n': + case '\r': + case ' ': goto yy68; + case '"': goto yy70; + case '=': + yyt4 = s; + goto yy24; + default: goto yy38; + } +yy40: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': goto yy42; + case '"': + yyt4 = s; + goto yy59; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy40; + case '=': + yyt4 = s; + goto yy24; + case 'B': + case 'G': + case 'K': + case 'M': goto yy73; + default: goto yy32; + } +yy42: + v = yyt1; + { o.limit = std::string(v, s); goto loop; } +yy43: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': goto yy19; + case '"': + yyt4 = s; + goto yy74; + case '=': + yyt4 = s; + goto yy24; + default: goto yy43; + } +yy45: + yyaccept = 3; + yych = *(m = ++s); + switch (yych) { + case 0x00: goto yy19; + case '\t': + case '\n': + case '\r': + case ' ': goto yy61; + case '=': + yyt4 = s; + goto yy24; + default: goto yy45; + } +yy47: + yych = *++s; + switch (yych) { + case 0x00: + case '=': goto yy49; + case '"': goto yy76; + default: goto yy47; + } +yy49: + s = m; + switch (yyaccept) { + case 0: + yyt4 = s; + goto yy12; + case 1: + yyt3 = yyt1; + yyt4 = s; + goto yy12; + case 2: goto yy15; + case 3: goto yy19; + case 4: goto yy12; + default: goto yy72; + } +yy50: + yych = *++s; +yy51: + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + case '=': goto yy12; + default: goto yy50; + } +yy52: + yyaccept = 4; + yych = *(m = ++s); + switch (yych) { + case 0x00: + case '=': goto yy12; + case '\t': + case '\n': + case '\r': + case ' ': goto yy47; + default: goto yy52; + } +yy54: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt3 = yyt1; + yyt4 = s; + goto yy12; + case '"': + yyt3 = yyt1; + yyt4 = s; + goto yy22; + case '=': + yyt3 = yyt1; + yyt4 = s; + goto yy24; + case 't': goto yy78; + default: + yyt3 = yyt1; + goto yy10; + } +yy55: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt3 = yyt1; + yyt4 = s; + goto yy12; + case '"': + yyt3 = yyt1; + yyt4 = s; + goto yy22; + case '=': + yyt3 = yyt1; + yyt4 = s; + goto yy24; + case 'r': goto yy79; + default: + yyt3 = yyt1; + goto yy10; + } +yy56: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt3 = yyt1; + yyt4 = s; + goto yy12; + case '"': + yyt3 = yyt1; + yyt4 = s; + goto yy22; + case '=': + yyt3 = yyt1; + yyt4 = s; + goto yy24; + case 'm': goto yy80; + default: + yyt3 = yyt1; + goto yy10; + } +yy57: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt3 = yyt1; + yyt4 = s; + goto yy12; + case '"': + yyt3 = yyt1; + yyt4 = s; + goto yy22; + case '=': + yyt3 = yyt1; + yyt4 = s; + goto yy24; + case 't': goto yy81; + default: + yyt3 = yyt1; + goto yy10; + } +yy58: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt3 = yyt1; + yyt4 = s; + goto yy12; + case '"': + yyt3 = yyt1; + yyt4 = s; + goto yy22; + case '=': + yyt3 = yyt1; + yyt4 = s; + goto yy24; + case 'r': goto yy82; + default: + yyt3 = yyt1; + goto yy10; + } +yy59: + yyaccept = 2; + yych = *(m = ++s); + switch (yych) { + case 0x00: goto yy15; + case '\t': + case '\n': + case '\r': + case ' ': goto yy47; + case '"': + yyt4 = s; + goto yy59; + case '=': + yyt4 = s; + goto yy24; + default: goto yy59; + } +yy61: + yych = *++s; + switch (yych) { + case 0x00: + case '=': goto yy49; + case '"': goto yy83; + default: goto yy61; + } +yy63: + yych = *++s; + switch (yych) { + case '/': goto yy85; + default: goto yy33; + } +yy64: + yych = *++s; +yy65: + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + case '=': goto yy15; + default: goto yy64; + } +yy66: + yyaccept = 2; + yych = *(m = ++s); + switch (yych) { + case 0x00: + case '=': goto yy15; + case '\t': + case '\n': + case '\r': + case ' ': goto yy61; + default: goto yy66; + } +yy68: + yych = *++s; + switch (yych) { + case 0x00: + case '=': goto yy49; + case '"': goto yy86; + default: goto yy68; + } +yy70: + yyaccept = 5; + yych = *(m = ++s); + switch (yych) { + case 0x00: goto yy72; + case '\t': + case '\n': + case '\r': + case ' ': goto yy68; + case '"': goto yy70; + case '=': + yyt4 = s; + goto yy24; + default: goto yy38; + } +yy72: + v = yyt1; + { o.format = std::string(v, s); goto loop; } +yy73: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': goto yy42; + default: goto yy33; + } +yy74: + yyaccept = 3; + yych = *(m = ++s); + switch (yych) { + case 0x00: goto yy19; + case '\t': + case '\n': + case '\r': + case ' ': goto yy47; + case '"': + yyt4 = s; + goto yy74; + case '=': + yyt4 = s; + goto yy24; + default: goto yy74; + } +yy76: + yyaccept = 4; + yych = *(m = ++s); + switch (yych) { + case 0x00: + case '=': goto yy12; + case '"': goto yy76; + default: goto yy47; + } +yy78: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt3 = yyt1; + yyt4 = s; + goto yy12; + case '"': + yyt3 = yyt1; + yyt4 = s; + goto yy22; + case '=': + yyt3 = yyt1; + yyt4 = s; + goto yy24; + case 'e': goto yy88; + default: + yyt3 = yyt1; + goto yy10; + } +yy79: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt3 = yyt1; + yyt4 = s; + goto yy12; + case '"': + yyt3 = yyt1; + yyt4 = s; + goto yy22; + case '=': + yyt3 = yyt1; + yyt4 = s; + goto yy24; + case 'm': goto yy89; + default: + yyt3 = yyt1; + goto yy10; + } +yy80: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt3 = yyt1; + yyt4 = s; + goto yy12; + case '"': + yyt3 = yyt1; + yyt4 = s; + goto yy22; + case '=': + yyt3 = yyt1; + yyt4 = s; + goto yy24; + case 'i': goto yy90; + default: + yyt3 = yyt1; + goto yy10; + } +yy81: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt3 = yyt1; + yyt4 = s; + goto yy12; + case '"': + yyt3 = yyt1; + yyt4 = s; + goto yy22; + case '=': + yyt3 = yyt1; + yyt4 = s; + goto yy24; + case 'h': goto yy91; + default: + yyt3 = yyt1; + goto yy10; + } +yy82: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt3 = yyt1; + yyt4 = s; + goto yy12; + case '"': + yyt3 = yyt1; + yyt4 = s; + goto yy22; + case '=': + yyt3 = yyt1; + yyt4 = s; + goto yy24; + case 'b': goto yy92; + default: + yyt3 = yyt1; + goto yy10; + } +yy83: + yyaccept = 2; + yych = *(m = ++s); + switch (yych) { + case 0x00: + case '=': goto yy15; + case '"': goto yy83; + default: goto yy61; + } +yy85: + yych = *++s; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy93; + default: goto yy33; + } +yy86: + yyaccept = 5; + yych = *(m = ++s); + switch (yych) { + case 0x00: + case '=': goto yy72; + case '"': goto yy86; + default: goto yy68; + } +yy88: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt5 = s; + goto yy15; + case '"': + yyt3 = yyt1; + yyt5 = s; + goto yy34; + case '=': + yyt5 = s; + goto yy94; + default: + yyt3 = yyt1; + yyt5 = s; + goto yy32; + } +yy89: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt3 = yyt1; + yyt4 = s; + goto yy12; + case '"': + yyt3 = yyt1; + yyt4 = s; + goto yy22; + case '=': + yyt3 = yyt1; + yyt4 = s; + goto yy24; + case 'a': goto yy95; + default: + yyt3 = yyt1; + goto yy10; + } +yy90: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt3 = yyt1; + yyt4 = s; + goto yy12; + case '"': + yyt3 = yyt1; + yyt4 = s; + goto yy22; + case '=': + yyt3 = yyt1; + yyt4 = s; + goto yy24; + case 't': goto yy96; + default: + yyt3 = yyt1; + goto yy10; + } +yy91: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt5 = s; + goto yy15; + case '"': + yyt3 = yyt1; + yyt5 = s; + goto yy34; + case '=': + yyt5 = s; + goto yy97; + default: + yyt3 = yyt1; + yyt5 = s; + goto yy32; + } +yy92: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt3 = yyt1; + yyt4 = s; + goto yy12; + case '"': + yyt3 = yyt1; + yyt4 = s; + goto yy22; + case '=': + yyt3 = yyt1; + yyt4 = s; + goto yy24; + case 'o': goto yy98; + default: + yyt3 = yyt1; + goto yy10; + } +yy93: + yych = *++s; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy99; + default: goto yy33; + } +yy94: + yych = *++s; + switch (yych) { + case '"': goto yy66; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + yyt1 = s; + goto yy100; + default: goto yy65; + } +yy95: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt3 = yyt1; + yyt4 = s; + goto yy12; + case '"': + yyt3 = yyt1; + yyt4 = s; + goto yy22; + case '=': + yyt3 = yyt1; + yyt4 = s; + goto yy24; + case 't': goto yy101; + default: + yyt3 = yyt1; + goto yy10; + } +yy96: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt5 = s; + goto yy15; + case '"': + yyt3 = yyt1; + yyt5 = s; + goto yy34; + case '=': + yyt5 = s; + goto yy102; + default: + yyt3 = yyt1; + yyt5 = s; + goto yy32; + } +yy97: + yych = *++s; + yyt1 = s; + switch (yych) { + case '"': goto yy105; + default: goto yy104; + } +yy98: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt3 = yyt1; + yyt4 = s; + goto yy12; + case '"': + yyt3 = yyt1; + yyt4 = s; + goto yy22; + case '=': + yyt3 = yyt1; + yyt4 = s; + goto yy24; + case 's': goto yy107; + default: + yyt3 = yyt1; + goto yy10; + } +yy99: + yych = *++s; + switch (yych) { + case '/': goto yy108; + default: goto yy33; + } +yy100: + yych = *++s; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy109; + default: goto yy65; + } +yy101: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt5 = s; + goto yy15; + case '"': + yyt3 = yyt1; + yyt5 = s; + goto yy34; + case '=': + yyt5 = s; + goto yy110; + default: + yyt3 = yyt1; + yyt5 = s; + goto yy32; + } +yy102: + yych = *++s; + switch (yych) { + case '"': goto yy66; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + yyt1 = s; + goto yy111; + default: goto yy65; + } +yy103: + yych = *++s; +yy104: + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + case '=': goto yy19; + default: goto yy103; + } +yy105: + yyaccept = 3; + yych = *(m = ++s); + switch (yych) { + case 0x00: + case '=': goto yy19; + case '\t': + case '\n': + case '\r': + case ' ': goto yy61; + default: goto yy105; + } +yy107: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + yyt3 = yyt1; + yyt4 = s; + goto yy12; + case '"': + yyt3 = yyt1; + yyt4 = s; + goto yy22; + case '=': + yyt3 = yyt1; + yyt4 = s; + goto yy24; + case 'e': + yyt3 = yyt1; + goto yy20; + default: + yyt3 = yyt1; + goto yy10; + } +yy108: + yych = *++s; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy113; + default: goto yy33; + } +yy109: + yych = *++s; + switch (yych) { + case '/': goto yy114; + default: goto yy65; + } +yy110: + yych = *++s; + switch (yych) { + case '"': + yyt1 = s; + goto yy115; + default: goto yy65; + } +yy111: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + case '=': goto yy42; + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy111; + case 'B': + case 'G': + case 'K': + case 'M': goto yy117; + default: goto yy64; + } +yy113: + yych = *++s; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy118; + default: goto yy33; + } +yy114: + yych = *++s; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy119; + default: goto yy65; + } +yy115: + yyaccept = 2; + yych = *(m = ++s); + switch (yych) { + case 0x00: + case '=': goto yy15; + case '\t': + case '\n': + case '\r': + case ' ': goto yy68; + case '"': goto yy120; + default: goto yy115; + } +yy117: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + case '=': goto yy42; + default: goto yy64; + } +yy118: + yych = *++s; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy122; + default: goto yy33; + } +yy119: + yych = *++s; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy123; + default: goto yy65; + } +yy120: + yyaccept = 5; + yych = *(m = ++s); + switch (yych) { + case 0x00: + case '=': goto yy72; + case '\t': + case '\n': + case '\r': + case ' ': goto yy68; + case '"': goto yy120; + default: goto yy115; + } +yy122: + yych = *++s; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy124; + default: goto yy33; + } +yy123: + yych = *++s; + switch (yych) { + case '/': goto yy126; + default: goto yy65; + } +yy124: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': goto yy125; + default: goto yy33; + } +yy125: + v = yyt1; + { o.date = std::string(v, s); goto loop; } +yy126: + yych = *++s; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy127; + default: goto yy65; + } +yy127: + yych = *++s; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy128; + default: goto yy65; + } +yy128: + yych = *++s; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy129; + default: goto yy65; + } +yy129: + yych = *++s; + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy130; + default: goto yy65; + } +yy130: + yych = *++s; + switch (yych) { + case 0x00: + case '\t': + case '\n': + case '\r': + case ' ': + case '=': goto yy125; + default: goto yy64; + } +} + +} + +int main(int argc, char **argv) +{ + for (int i = 1; i < argc; ++i) lex(argv[i]); + return 0; +} +re2c: warning: line 68: rule matches empty string [-Wmatch-empty-string] +re2c: warning: line 80: tag 'k' has 2nd degree of nondeterminism [-Wnondeterministic-tags] +re2c: warning: line 80: tag 'v' has 2nd degree of nondeterminism [-Wnondeterministic-tags] diff --git a/examples/14_options.i--tags.re b/examples/14_options.i--tags.re new file mode 100644 index 0000000..2b9b1c4 --- /dev/null +++ b/examples/14_options.i--tags.re @@ -0,0 +1,91 @@ +#include +#include +#include + +typedef std::vector > unknown_t; + +struct options_t +{ + std::string date; + std::string path; + std::string format; + std::string limit; + bool verbose; +}; + +static void show(const options_t &o, const unknown_t &u) +{ + printf("\noptions:\n"); + printf(" date: %s\n", o.date.c_str()); + printf(" path: %s\n", o.path.c_str()); + printf(" format: %s\n", o.format.c_str()); + printf(" limit: %s\n", o.limit.c_str()); + printf(" verbose: %s\n", o.verbose ? "yes" : "no"); + + printf("\nunknown:\n"); + unknown_t::const_iterator i = u.begin(), e = u.end(); + for (; i != e; ++i) { + printf(" %s: '%s'\n", i->first.c_str(), i->second.c_str()); + } +} + +static void bad_arg(const char *k, const char *v, const char *e) +{ + printf("bad argument '%.*s' to option %.*s\n", + (int) (e - v), v, (int) (v - k), k); +} + +static int lex(const char *s) +{ + options_t o; + unknown_t u; + const char *m, *k, *v; + /*!stags:re2c format = 'const char *@@;'; */ +loop: + /*!re2c + re2c:define:YYCTYPE = char; + re2c:define:YYCURSOR = s; + re2c:define:YYMARKER = m; + re2c:yyfill:enable = 0; + + end = "\x00"; + sp = [ \t\n\r]; + eq = "="; + wsp = sp*; + char = [^=] \ end; + ochar = char \ sp; + pchar = ochar \ [/]; + str = ["] (char \ ["] | [\]["])* ["]; + opt = ochar+; + arg = ochar* | str; + date = [0-9]{2} "/" [0-9]{2} "/" [0-9]{4}; + path = pchar* ("/" pchar*)*; + format = str; + limit = [0-9]+ [BKMG]?; + + * { printf("error: %s\n", s); return 1; } + end { show(o, u); return 0; } + wsp { goto loop; } + + "-v" | "--verbose" { o.verbose = true; goto loop; } + ("-l" | "--limit" eq) @v limit { o.limit = std::string(v, s); goto loop; } + ("-f" | "--format" eq) @v str { o.format = std::string(v, s); goto loop; } + ("-d" | "--date" eq) @v date { o.date = std::string(v, s); goto loop; } + ("-p" | "--path" eq) @v path { o.path = std::string(v, s); goto loop; } + + @k ("--" ("limit" | "format" | "date" | "path") | "-" [lfdp]) @v eq? arg { + bad_arg(k, v, s); + goto loop; + } + [-]{1,2} @k opt @v eq? arg { + u.push_back(std::make_pair(std::string(k, v), std::string(v, s))); + goto loop; + } + */ +} + +int main(int argc, char **argv) +{ + for (int i = 1; i < argc; ++i) lex(argv[i]); + return 0; +} diff --git a/examples/15_binsyms.i--input(custom).c b/examples/15_binsyms.i--input(custom).c new file mode 100644 index 0000000..9a14617 --- /dev/null +++ b/examples/15_binsyms.i--input(custom).c @@ -0,0 +1,209 @@ +/* Generated by re2c */ +#include +#include + +static void lex(const char *cur, const char *lim) +{ + const char *mar, *tok; +# define YYCTYPE char +# define YYPEEK() *cur +# define YYSKIP() if (++cur == lim) return; +# define YYBACKUP() mar = cur +# define YYRESTORE() cur = mar +loop: + tok = cur; + +{ + YYCTYPE yych; + yych = YYPEEK (); + switch (yych) { + case '_': goto yy4; + default: goto yy2; + } +yy2: + YYSKIP (); +yy3: + { goto loop; } +yy4: + YYSKIP (); + YYBACKUP (); + yych = YYPEEK (); + switch (yych) { + case '_': goto yy5; + default: goto yy3; + } +yy5: + YYSKIP (); + yych = YYPEEK (); + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy7; + default: goto yy6; + } +yy6: + YYRESTORE (); + goto yy3; +yy7: + YYSKIP (); + yych = YYPEEK (); + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case '_': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy7; + default: goto yy9; + } +yy9: + { + printf("%.*s\n", (int) (cur - tok), tok); + goto loop; + } +} + +} + +int main(int argc, char **argv) +{ + if (argc < 2) { + fprintf(stderr, "no input files\n"); + return 1; + } + + FILE *file = fopen(argv[1], "rb"); + if (file == NULL) { + fprintf(stderr, "cannot open file\n"); + return 1; + } + + fseek(file, 0, SEEK_END); + const size_t fsize = (size_t) ftell(file); + fseek(file, 0, SEEK_SET); + + char *buffer = (char*) malloc(fsize); + fread(buffer, 1, fsize, file); + lex(buffer, buffer + fsize); + + free(buffer); + fclose(file); + return 0; +} diff --git a/examples/15_binsyms.i--input(custom).re b/examples/15_binsyms.i--input(custom).re new file mode 100644 index 0000000..ec1c2d6 --- /dev/null +++ b/examples/15_binsyms.i--input(custom).re @@ -0,0 +1,49 @@ +#include +#include + +static void lex(const char *cur, const char *lim) +{ + const char *mar, *tok; +# define YYCTYPE char +# define YYPEEK() *cur +# define YYSKIP() if (++cur == lim) return; +# define YYBACKUP() mar = cur +# define YYRESTORE() cur = mar +loop: + tok = cur; + /*!re2c + re2c:yyfill:enable = 0; + + * { goto loop; } + "__" [a-zA-Z0-9_]+ { + printf("%.*s\n", (int) (cur - tok), tok); + goto loop; + } + */ +} + +int main(int argc, char **argv) +{ + if (argc < 2) { + fprintf(stderr, "no input files\n"); + return 1; + } + + FILE *file = fopen(argv[1], "rb"); + if (file == NULL) { + fprintf(stderr, "cannot open file\n"); + return 1; + } + + fseek(file, 0, SEEK_END); + const size_t fsize = (size_t) ftell(file); + fseek(file, 0, SEEK_SET); + + char *buffer = (char*) malloc(fsize); + fread(buffer, 1, fsize, file); + lex(buffer, buffer + fsize); + + free(buffer); + fclose(file); + return 0; +} diff --git a/examples/16_fake_sentinel.i--input(custom).c b/examples/16_fake_sentinel.i--input(custom).c new file mode 100644 index 0000000..868c31f --- /dev/null +++ b/examples/16_fake_sentinel.i--input(custom).c @@ -0,0 +1,249 @@ +/* Generated by re2c */ +#include +#include + +static int lex(const char *cur, const char *lim) +{ + const char *mar, *tok = cur; +# define YYCTYPE char +# define YYPEEK() (cur < lim ? *cur : 0) +# define YYSKIP() ++cur +# define YYBACKUP() mar = cur +# define YYRESTORE() cur = mar + +{ + YYCTYPE yych; + yych = YYPEEK (); + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy4; + default: goto yy2; + } +yy2: + YYSKIP (); +yy3: + { printf("error\n"); return 1; } +yy4: + YYSKIP (); + YYBACKUP (); + yych = YYPEEK (); + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy5; + case ';': goto yy8; + default: goto yy3; + } +yy5: + YYSKIP (); + yych = YYPEEK (); + switch (yych) { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy5; + case ';': goto yy8; + default: goto yy7; + } +yy7: + YYRESTORE (); + goto yy3; +yy8: + YYSKIP (); + yych = YYPEEK (); + if (yych >= 0x01) goto yy7; + YYSKIP (); + { + printf("%.*s\n", (int) (cur - tok) - 1, tok); + return 0; + } +} + +} + +int main(int argc, char **argv) +{ + if (argc != 2) return 1; + + char *s = argv[1]; + size_t l = strlen(s); + s[l] = ';'; // overwrite terminating NULL + return lex(s, s + l + 1); +} diff --git a/examples/16_fake_sentinel.i--input(custom).re b/examples/16_fake_sentinel.i--input(custom).re new file mode 100644 index 0000000..f06ffef --- /dev/null +++ b/examples/16_fake_sentinel.i--input(custom).re @@ -0,0 +1,31 @@ +#include +#include + +static int lex(const char *cur, const char *lim) +{ + const char *mar, *tok = cur; +# define YYCTYPE char +# define YYPEEK() (cur < lim ? *cur : 0) +# define YYSKIP() ++cur +# define YYBACKUP() mar = cur +# define YYRESTORE() cur = mar + /*!re2c + re2c:yyfill:enable = 0; + + * { printf("error\n"); return 1; } + [0-9a-zA-Z]+ [;] [\x00] { + printf("%.*s\n", (int) (cur - tok) - 1, tok); + return 0; + } + */ +} + +int main(int argc, char **argv) +{ + if (argc != 2) return 1; + + char *s = argv[1]; + size_t l = strlen(s); + s[l] = ';'; // overwrite terminating NULL + return lex(s, s + l + 1); +} diff --git a/examples/17_ifstream.i--input(custom).c b/examples/17_ifstream.i--input(custom).c new file mode 100644 index 0000000..478e082 --- /dev/null +++ b/examples/17_ifstream.i--input(custom).c @@ -0,0 +1,49 @@ +/* Generated by re2c */ +#include + +static void conv(std::ifstream &in, std::ofstream &out) +{ + std::streampos mar; +# define YYCTYPE char +# define YYPEEK() in.peek() +# define YYSKIP() do { in.ignore(); if (in.eof()) return; } while(0) +# define YYBACKUP() mar = in.tellg() +# define YYRESTORE() in.seekg(mar) +loop: + +{ + YYCTYPE yych; + yych = YYPEEK (); + switch (yych) { + case '\r': goto yy4; + default: goto yy2; + } +yy2: + YYSKIP (); +yy3: + { out.put(yych); goto loop; } +yy4: + YYSKIP (); + yych = YYPEEK (); + switch (yych) { + case '\n': goto yy5; + default: goto yy3; + } +yy5: + YYSKIP (); + { out.put('\n'); goto loop; } +} + +} + +int main(int argc, char **argv) +{ + if (argc != 3) return 1; + + std::ifstream in(argv[1], std::ios::binary); + std::ofstream out(argv[2], std::ios::binary); + if (in.fail() || out.fail()) return 2; + + conv(in, out); + return 0; +} diff --git a/examples/17_ifstream.i--input(custom).re b/examples/17_ifstream.i--input(custom).re new file mode 100644 index 0000000..69b0f18 --- /dev/null +++ b/examples/17_ifstream.i--input(custom).re @@ -0,0 +1,30 @@ +#include + +static void conv(std::ifstream &in, std::ofstream &out) +{ + std::streampos mar; +# define YYCTYPE char +# define YYPEEK() in.peek() +# define YYSKIP() do { in.ignore(); if (in.eof()) return; } while(0) +# define YYBACKUP() mar = in.tellg() +# define YYRESTORE() in.seekg(mar) +loop: + /*!re2c + re2c:yyfill:enable = 0; + + * { out.put(yych); goto loop; } + "\r\n" { out.put('\n'); goto loop; } + */ +} + +int main(int argc, char **argv) +{ + if (argc != 3) return 1; + + std::ifstream in(argv[1], std::ios::binary); + std::ofstream out(argv[2], std::ios::binary); + if (in.fail() || out.fail()) return 2; + + conv(in, out); + return 0; +} diff --git a/examples/18_push_model.if.c b/examples/18_push_model.if.c new file mode 100644 index 0000000..3033543 --- /dev/null +++ b/examples/18_push_model.if.c @@ -0,0 +1,240 @@ +/* Generated by re2c */ +#include +#include + +#define YYMAXFILL 1 + +static const size_t SIZE = 4096; + +struct input_t { + char buf[SIZE + YYMAXFILL]; + char *lim; + char *cur; + char *tok; + int state; + unsigned need; + unsigned yyaccept; + char yych; + + input_t() + : buf() + , lim(buf + SIZE) + , cur(lim) + , tok(lim) + , state(-1) + , need(0) + , yyaccept(0) + , yych(0) + {} + + bool fill() + { + const size_t free = tok - buf; + if (free < need) return false; + + memmove(buf, tok, buf - tok + SIZE); + lim -= free; + cur -= free; + tok -= free; + lim += fread(lim, 1, free, stdin); + if (lim < buf + SIZE) { + memset(lim, 0, YYMAXFILL); + lim += YYMAXFILL; + } + return true; + } +}; + +enum status_t { OK, FAIL, NEED_MORE_INPUT }; + +static status_t lex(input_t &in, unsigned &words) +{ +# define YYGETSTATE() in.state +# define YYSETSTATE(s) in.state = s +# define YYFILL(n) do { in.need = n; return NEED_MORE_INPUT; } while (0) + switch (YYGETSTATE()) { +default: goto yy0; +case 0: goto yyFillLabel0; +case 1: goto yyFillLabel1; +case 2: goto yyFillLabel2; +} + +loop: + in.tok = in.cur; + + +yy0: + YYSETSTATE(0); + if (in.lim <= in.cur) YYFILL(1); +yyFillLabel0: + in.yych = *in.cur; + switch (in.yych) { + case 0x00: goto yy2; + case '\n': + case ' ': goto yy6; + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy9; + default: goto yy4; + } +yy2: + ++in.cur; + { return OK; } +yy4: + ++in.cur; + { return FAIL; } +yy6: + ++in.cur; + YYSETSTATE(1); + if (in.lim <= in.cur) YYFILL(1); +yyFillLabel1: + in.yych = *in.cur; + switch (in.yych) { + case '\n': + case ' ': goto yy6; + default: goto yy8; + } +yy8: + { goto loop; } +yy9: + ++in.cur; + YYSETSTATE(2); + if (in.lim <= in.cur) YYFILL(1); +yyFillLabel2: + in.yych = *in.cur; + switch (in.yych) { + case 'A': + case 'B': + case 'C': + case 'D': + case 'E': + case 'F': + case 'G': + case 'H': + case 'I': + case 'J': + case 'K': + case 'L': + case 'M': + case 'N': + case 'O': + case 'P': + case 'Q': + case 'R': + case 'S': + case 'T': + case 'U': + case 'V': + case 'W': + case 'X': + case 'Y': + case 'Z': + case 'a': + case 'b': + case 'c': + case 'd': + case 'e': + case 'f': + case 'g': + case 'h': + case 'i': + case 'j': + case 'k': + case 'l': + case 'm': + case 'n': + case 'o': + case 'p': + case 'q': + case 'r': + case 's': + case 't': + case 'u': + case 'v': + case 'w': + case 'x': + case 'y': + case 'z': goto yy9; + default: goto yy11; + } +yy11: + { ++words; goto loop; } + +} + +int main() +{ + input_t in; + unsigned words = 0; + + while (true) { + const status_t st = lex(in, words); + + // end of input: print result + if (st == OK) { + printf("\nword count: %u\n", words); + break; + + // unexpected error: abort + } else if (st == FAIL) { + printf("\nerror\n"); + return 1; + + // get more input and continue + } else if (!in.fill()) { + printf("\nsmall buffer\n"); + return 2; + } + } + + return 0; +} diff --git a/examples/18_push_model.if.re b/examples/18_push_model.if.re new file mode 100644 index 0000000..2f13673 --- /dev/null +++ b/examples/18_push_model.if.re @@ -0,0 +1,95 @@ +#include +#include + +/*!max:re2c*/ +static const size_t SIZE = 4096; + +struct input_t { + char buf[SIZE + YYMAXFILL]; + char *lim; + char *cur; + char *tok; + int state; + unsigned need; + unsigned yyaccept; + char yych; + + input_t() + : buf() + , lim(buf + SIZE) + , cur(lim) + , tok(lim) + , state(-1) + , need(0) + , yyaccept(0) + , yych(0) + {} + + bool fill() + { + const size_t free = tok - buf; + if (free < need) return false; + + memmove(buf, tok, buf - tok + SIZE); + lim -= free; + cur -= free; + tok -= free; + lim += fread(lim, 1, free, stdin); + if (lim < buf + SIZE) { + memset(lim, 0, YYMAXFILL); + lim += YYMAXFILL; + } + return true; + } +}; + +enum status_t { OK, FAIL, NEED_MORE_INPUT }; + +static status_t lex(input_t &in, unsigned &words) +{ +# define YYGETSTATE() in.state +# define YYSETSTATE(s) in.state = s +# define YYFILL(n) do { in.need = n; return NEED_MORE_INPUT; } while (0) + /*!getstate:re2c*/ +loop: + in.tok = in.cur; + /*!re2c + re2c:define:YYCTYPE = char; + re2c:define:YYCURSOR = in.cur; + re2c:define:YYLIMIT = in.lim; + re2c:variable:yych = in.yych; + + * { return FAIL; } + [\x00] { return OK; } + [\n ]+ { goto loop; } + [a-zA-Z]+ { ++words; goto loop; } + */ +} + +int main() +{ + input_t in; + unsigned words = 0; + + while (true) { + const status_t st = lex(in, words); + + // end of input: print result + if (st == OK) { + printf("\nword count: %u\n", words); + break; + + // unexpected error: abort + } else if (st == FAIL) { + printf("\nerror\n"); + return 1; + + // get more input and continue + } else if (!in.fill()) { + printf("\nsmall buffer\n"); + return 2; + } + } + + return 0; +} diff --git a/examples/input_custom/fixed.re b/examples/input_custom/fixed.re deleted file mode 100644 index 51f3b2b..0000000 --- a/examples/input_custom/fixed.re +++ /dev/null @@ -1,35 +0,0 @@ -// Build with "--input custom" re2c switch. -// -// This is an example of handling fixed-length buffer with "--input custom": -// on each YYPEEK we check for the end of input, thus YYFILL generation -// can be safely suppressed. -// -// Note that YYLIMIT points not to terminating NULL, but to the previous -// character: we emulate the case when input has no terminating NULL. -// -// For a real-life example see https://github.com/sopyer/mjson -// or mjson.re from re2c test collection. - -bool lex (const char * cursor, const char * const limit) -{ - const char * marker; - const char * ctxmarker; -# define YYCTYPE char -# define YYPEEK() (cursor >= limit ? 0 : *cursor) -# define YYSKIP() ++cursor -# define YYBACKUP() marker = cursor -# define YYBACKUPCTX() ctxmarker = cursor -# define YYRESTORE() cursor = marker -# define YYRESTORECTX() cursor = ctxmarker - /*!re2c - re2c:yyfill:enable = 0; - "int buffer " / "[" [0-9]+ "]" { return true; } - * { return false; } - */ -} - -int main () -{ - char buffer [] = "int buffer [1024]"; - return !lex (buffer, buffer + sizeof (buffer) - 1); -} diff --git a/examples/input_custom/simple/README b/examples/input_custom/simple/README deleted file mode 100644 index c0c4d95..0000000 --- a/examples/input_custom/simple/README +++ /dev/null @@ -1,20 +0,0 @@ -Build with "--input custom" re2c switch. - -These are three examples of "--input custom" usage: - -- input_custom_default.re: - implements default re2c input model (pointers to plain buffer) - -- input_custom_fgetc: - implements C-style file input (using ) - -- input_custom_fgetc: - implements std::istringstream input - -Note that these examples are very simple and don't need -to implement YYFILL; the only reason they don't use -"re2c:yyfill:enable = 0;" is to keep YYLESSTHAN and YYLIMIT -(for the sake of example). - -In real-life programs one will need to care for correct -end-of-input handling. diff --git a/examples/input_custom/simple/default.re b/examples/input_custom/simple/default.re deleted file mode 100644 index 94cde7c..0000000 --- a/examples/input_custom/simple/default.re +++ /dev/null @@ -1,24 +0,0 @@ -bool lex (const char * cursor, const char * const limit) -{ - const char * marker; - const char * ctxmarker; -# define YYCTYPE char -# define YYPEEK() *cursor -# define YYSKIP() ++cursor -# define YYBACKUP() marker = cursor -# define YYBACKUPCTX() ctxmarker = cursor -# define YYRESTORE() cursor = marker -# define YYRESTORECTX() cursor = ctxmarker -# define YYLESSTHAN(n) limit - cursor < n -# define YYFILL(n) {} - /*!re2c - "int buffer " / "[" [0-9]+ "]" { return true; } - * { return false; } - */ -} - -int main () -{ - char buffer [] = "int buffer [1024]"; - return !lex (buffer, buffer + sizeof (buffer)); -} diff --git a/examples/input_custom/simple/fgetc.re b/examples/input_custom/simple/fgetc.re deleted file mode 100644 index d2dffd9..0000000 --- a/examples/input_custom/simple/fgetc.re +++ /dev/null @@ -1,43 +0,0 @@ -#include - -char peek (FILE * f) -{ - char c = fgetc (f); - ungetc (c, f); - return c; -} - -bool lex (FILE * f, const long limit) -{ - long marker; - long ctxmarker; -# define YYCTYPE char -# define YYPEEK() peek (f) -# define YYSKIP() fgetc (f) -# define YYBACKUP() marker = ftell (f) -# define YYBACKUPCTX() ctxmarker = ftell (f) -# define YYRESTORE() fseek (f, marker, SEEK_SET) -# define YYRESTORECTX() fseek (f, ctxmarker, SEEK_SET) -# define YYLESSTHAN(n) limit - ftell (f) < n -# define YYFILL(n) {} - /*!re2c - "int buffer " / "[" [0-9]+ "]" { return true; } - * { return false; } - */ -} - -int main () -{ - const char buffer [] = "int buffer [1024]"; - const char fn [] = "input.txt"; - - FILE * f = fopen (fn, "w"); - fwrite (buffer, 1, sizeof (buffer), f); - fclose (f); - - f = fopen (fn, "rb"); - int result = !lex (f, sizeof (buffer)); - fclose (f); - - return result; -} diff --git a/examples/input_custom/simple/istringstream.re b/examples/input_custom/simple/istringstream.re deleted file mode 100644 index 5d70229..0000000 --- a/examples/input_custom/simple/istringstream.re +++ /dev/null @@ -1,27 +0,0 @@ -#include - -bool lex (std::istringstream & is, const std::streampos limit) -{ - std::streampos marker; - std::streampos ctxmarker; -# define YYCTYPE char -# define YYPEEK() is.peek () -# define YYSKIP() is.ignore () -# define YYBACKUP() marker = is.tellg () -# define YYBACKUPCTX() ctxmarker = is.tellg () -# define YYRESTORE() is.seekg (marker) -# define YYRESTORECTX() is.seekg (ctxmarker) -# define YYLESSTHAN(n) limit - is.tellg () < n -# define YYFILL(n) {} - /*!re2c - "int buffer " / "[" [0-9]+ "]" { return true; } - * { return false; } - */ -} - -int main () -{ - const char buffer [] = "int buffer [1024]"; - std::istringstream is (buffer); - return !lex (is, sizeof (buffer)); -} diff --git a/examples/langs/c.re b/examples/langs/c.re deleted file mode 100644 index 7e413e2..0000000 --- a/examples/langs/c.re +++ /dev/null @@ -1,272 +0,0 @@ -#include -#include -#include - -#define ADDEQ 257 -#define ANDAND 258 -#define ANDEQ 259 -#define ARRAY 260 -#define ASM 261 -#define AUTO 262 -#define BREAK 263 -#define CASE 264 -#define CHAR 265 -#define CONST 266 -#define CONTINUE 267 -#define DECR 268 -#define DEFAULT 269 -#define DEREF 270 -#define DIVEQ 271 -#define DO 272 -#define DOUBLE 273 -#define ELLIPSIS 274 -#define ELSE 275 -#define ENUM 276 -#define EQL 277 -#define EXTERN 278 -#define FCON 279 -#define FLOAT 280 -#define FOR 281 -#define FUNCTION 282 -#define GEQ 283 -#define GOTO 284 -#define ICON 285 -#define ID 286 -#define IF 287 -#define INCR 288 -#define INT 289 -#define LEQ 290 -#define LONG 291 -#define LSHIFT 292 -#define LSHIFTEQ 293 -#define MODEQ 294 -#define MULEQ 295 -#define NEQ 296 -#define OREQ 297 -#define OROR 298 -#define POINTER 299 -#define REGISTER 300 -#define RETURN 301 -#define RSHIFT 302 -#define RSHIFTEQ 303 -#define SCON 304 -#define SHORT 305 -#define SIGNED 306 -#define SIZEOF 307 -#define STATIC 308 -#define STRUCT 309 -#define SUBEQ 310 -#define SWITCH 311 -#define TYPEDEF 312 -#define UNION 313 -#define UNSIGNED 314 -#define VOID 315 -#define VOLATILE 316 -#define WHILE 317 -#define XOREQ 318 -#define EOI 319 - -typedef unsigned int uint; -typedef unsigned char uchar; - -#define BSIZE 8192 - -#define YYCTYPE uchar -#define YYCURSOR cursor -#define YYLIMIT s->lim -#define YYMARKER s->ptr -#define YYFILL(n) {cursor = fill(s, cursor);} - -#define RET(i) {s->cur = cursor; return i;} - -typedef struct Scanner { - int fd; - uchar *bot, *tok, *ptr, *cur, *pos, *lim, *top, *eof; - uint line; -} Scanner; - -uchar *fill(Scanner *s, uchar *cursor){ - if(!s->eof) { - uint cnt = s->tok - s->bot; - if(cnt){ - memcpy(s->bot, s->tok, s->lim - s->tok); - s->tok = s->bot; - s->ptr -= cnt; - cursor -= cnt; - s->pos -= cnt; - s->lim -= cnt; - } - if((s->top - s->lim) < BSIZE){ - uchar *buf = (uchar*) malloc(((s->lim - s->bot) + BSIZE)*sizeof(uchar)); - memcpy(buf, s->tok, s->lim - s->tok); - s->tok = buf; - s->ptr = &buf[s->ptr - s->bot]; - cursor = &buf[cursor - s->bot]; - s->pos = &buf[s->pos - s->bot]; - s->lim = &buf[s->lim - s->bot]; - s->top = &s->lim[BSIZE]; - free(s->bot); - s->bot = buf; - } - if((cnt = read(s->fd, (char*) s->lim, BSIZE)) != BSIZE){ - s->eof = &s->lim[cnt]; *(s->eof)++ = '\n'; - } - s->lim += cnt; - } - return cursor; -} - -int scan(Scanner *s){ - uchar *cursor = s->cur; -std: - s->tok = cursor; -/*!re2c -any = [\000-\377]; -O = [0-7]; -D = [0-9]; -L = [a-zA-Z_]; -H = [a-fA-F0-9]; -E = [Ee] [+-]? D+; -FS = [fFlL]; -IS = [uUlL]*; -ESC = [\\] ([abfnrtv?'"\\] | "x" H+ | O+); -*/ - -/*!re2c - "/*" { goto comment; } - - "auto" { RET(AUTO); } - "break" { RET(BREAK); } - "case" { RET(CASE); } - "char" { RET(CHAR); } - "const" { RET(CONST); } - "continue" { RET(CONTINUE); } - "default" { RET(DEFAULT); } - "do" { RET(DO); } - "double" { RET(DOUBLE); } - "else" { RET(ELSE); } - "enum" { RET(ENUM); } - "extern" { RET(EXTERN); } - "float" { RET(FLOAT); } - "for" { RET(FOR); } - "goto" { RET(GOTO); } - "if" { RET(IF); } - "int" { RET(INT); } - "long" { RET(LONG); } - "register" { RET(REGISTER); } - "return" { RET(RETURN); } - "short" { RET(SHORT); } - "signed" { RET(SIGNED); } - "sizeof" { RET(SIZEOF); } - "static" { RET(STATIC); } - "struct" { RET(STRUCT); } - "switch" { RET(SWITCH); } - "typedef" { RET(TYPEDEF); } - "union" { RET(UNION); } - "unsigned" { RET(UNSIGNED); } - "void" { RET(VOID); } - "volatile" { RET(VOLATILE); } - "while" { RET(WHILE); } - - L (L|D)* { RET(ID); } - - ("0" [xX] H+ IS?) | ("0" D+ IS?) | (D+ IS?) | - (['] (ESC|any\[\n\\'])* [']) - { RET(ICON); } - - (D+ E FS?) | (D* "." D+ E? FS?) | (D+ "." D* E? FS?) - { RET(FCON); } - - (["] (ESC|any\[\n\\"])* ["]) - { RET(SCON); } - - "..." { RET(ELLIPSIS); } - ">>=" { RET(RSHIFTEQ); } - "<<=" { RET(LSHIFTEQ); } - "+=" { RET(ADDEQ); } - "-=" { RET(SUBEQ); } - "*=" { RET(MULEQ); } - "/=" { RET(DIVEQ); } - "%=" { RET(MODEQ); } - "&=" { RET(ANDEQ); } - "^=" { RET(XOREQ); } - "|=" { RET(OREQ); } - ">>" { RET(RSHIFT); } - "<<" { RET(LSHIFT); } - "++" { RET(INCR); } - "--" { RET(DECR); } - "->" { RET(DEREF); } - "&&" { RET(ANDAND); } - "||" { RET(OROR); } - "<=" { RET(LEQ); } - ">=" { RET(GEQ); } - "==" { RET(EQL); } - "!=" { RET(NEQ); } - ";" { RET(';'); } - "{" { RET('{'); } - "}" { RET('}'); } - "," { RET(','); } - ":" { RET(':'); } - "=" { RET('='); } - "(" { RET('('); } - ")" { RET(')'); } - "[" { RET('['); } - "]" { RET(']'); } - "." { RET('.'); } - "&" { RET('&'); } - "!" { RET('!'); } - "~" { RET('~'); } - "-" { RET('-'); } - "+" { RET('+'); } - "*" { RET('*'); } - "/" { RET('/'); } - "%" { RET('%'); } - "<" { RET('<'); } - ">" { RET('>'); } - "^" { RET('^'); } - "|" { RET('|'); } - "?" { RET('?'); } - - - [ \t\v\f]+ { goto std; } - - "\n" - { - if(cursor == s->eof) RET(EOI); - s->pos = cursor; s->line++; - goto std; - } - - any - { - printf("unexpected character: %c\n", *s->tok); - goto std; - } -*/ - -comment: -/*!re2c - "*/" { goto std; } - "\n" - { - if(cursor == s->eof) RET(EOI); - s->tok = s->pos = cursor; s->line++; - goto comment; - } - any { goto comment; } -*/ -} - -main(){ - Scanner in; - int t; - memset((char*) &in, 0, sizeof(in)); - in.fd = 0; - while((t = scan(&in)) != EOI){ -/* - printf("%d\t%.*s\n", t, in.cur - in.tok, in.tok); - printf("%d\n", t); -*/ - } - close(in.fd); -} diff --git a/examples/langs/modula.re b/examples/langs/modula.re deleted file mode 100644 index 186b0cc..0000000 --- a/examples/langs/modula.re +++ /dev/null @@ -1,203 +0,0 @@ -#include -#include -#include - -typedef unsigned int uint; -typedef unsigned char uchar; - -#define BSIZE 8192 - -#define YYCTYPE uchar -#define YYCURSOR cursor -#define YYLIMIT s->lim -#define YYMARKER s->ptr -#define YYCTXMARKER s->ctx -#define YYFILL {cursor = fill(s, cursor);} - -#define RETURN(i) {s->cur = cursor; return i;} - -typedef struct Scanner { - int fd; - uchar *bot, *tok, *ptr, *ctx, *cur, *pos, *lim, *top, *eof; - uint line; -} Scanner; - -uchar *fill(Scanner *s, uchar *cursor){ - if(!s->eof){ - uint cnt = s->tok - s->bot; - if(cnt){ - memcpy(s->bot, s->tok, s->lim - s->tok); - s->tok = s->bot; - s->ptr -= cnt; - cursor -= cnt; - s->pos -= cnt; - s->lim -= cnt; - } - if((s->top - s->lim) < BSIZE){ - uchar *buf = (uchar*) malloc(((s->lim - s->bot) + BSIZE)*sizeof(uchar)); - memcpy(buf, s->tok, s->lim - s->tok); - s->tok = buf; - s->ptr = &buf[s->ptr - s->bot]; - cursor = &buf[cursor - s->bot]; - s->pos = &buf[s->pos - s->bot]; - s->lim = &buf[s->lim - s->bot]; - s->top = &s->lim[BSIZE]; - free(s->bot); - s->bot = buf; - } - if((cnt = read(s->fd, (char*) s->lim, BSIZE)) != BSIZE){ - s->eof = &s->lim[cnt]; *(s->eof)++ = '\n'; - } - s->lim += cnt; - } - return cursor; -} - -int scan(Scanner *s){ - uchar *cursor = s->cur; - uint depth; -std: - s->tok = cursor; -/*!re2c -any = [\000-\377]; -digit = [0-9]; -letter = [a-zA-Z]; -*/ - -/*!re2c - "(*" { depth = 1; goto comment; } - - digit + {RETURN(1);} - digit + / ".." {RETURN(1);} - [0-7] + "B" {RETURN(2);} - [0-7] + "C" {RETURN(3);} - digit [0-9A-F] * "H" {RETURN(4);} - digit + "." digit * ("E" ([+-]) ? digit +) ? {RETURN(5);} - ['] (any\[\n']) * ['] | ["] (any\[\n"]) * ["] {RETURN(6);} - - "#" {RETURN(7);} - "&" {RETURN(8);} - "(" {RETURN(9);} - ")" {RETURN(10);} - "*" {RETURN(11);} - "+" {RETURN(12);} - "," {RETURN(13);} - "-" {RETURN(14);} - "." {RETURN(15);} - ".." {RETURN(16);} - "/" {RETURN(17);} - ":" {RETURN(18);} - ":=" {RETURN(19);} - ";" {RETURN(20);} - "<" {RETURN(21);} - "<=" {RETURN(22);} - "<>" {RETURN(23);} - "=" {RETURN(24);} - ">" {RETURN(25);} - ">=" {RETURN(26);} - "[" {RETURN(27);} - "]" {RETURN(28);} - "^" {RETURN(29);} - "{" {RETURN(30);} - "|" {RETURN(31);} - "}" {RETURN(32);} - "~" {RETURN(33);} - - "AND" {RETURN(34);} - "ARRAY" {RETURN(35);} - "BEGIN" {RETURN(36);} - "BY" {RETURN(37);} - "CASE" {RETURN(38);} - "CONST" {RETURN(39);} - "DEFINITION" {RETURN(40);} - "DIV" {RETURN(41);} - "DO" {RETURN(42);} - "ELSE" {RETURN(43);} - "ELSIF" {RETURN(44);} - "END" {RETURN(45);} - "EXIT" {RETURN(46);} - "EXPORT" {RETURN(47);} - "FOR" {RETURN(48);} - "FROM" {RETURN(49);} - "IF" {RETURN(50);} - "IMPLEMENTATION" {RETURN(51);} - "IMPORT" {RETURN(52);} - "IN" {RETURN(53);} - "LOOP" {RETURN(54);} - "MOD" {RETURN(55);} - "MODULE" {RETURN(56);} - "NOT" {RETURN(57);} - "OF" {RETURN(58);} - "OR" {RETURN(59);} - "POINTER" {RETURN(60);} - "PROCEDURE" {RETURN(61);} - "QUALIFIED" {RETURN(62);} - "RECORD" {RETURN(63);} - "REPEAT" {RETURN(64);} - "RETURN" {RETURN(65);} - "SET" {RETURN(66);} - "THEN" {RETURN(67);} - "TO" {RETURN(68);} - "TYPE" {RETURN(69);} - "UNTIL" {RETURN(70);} - "VAR" {RETURN(71);} - "WHILE" {RETURN(72);} - "WITH" {RETURN(73);} - - letter (letter | digit) * {RETURN(74);} - - [ \t]+ { goto std; } - - "\n" - { - if(cursor == s->eof) RETURN(0); - s->pos = cursor; s->line++; - goto std; - } - - any - { - printf("unexpected character: %c\n", *s->tok); - goto std; - } -*/ -comment: -/*!re2c - "*)" - { - if(--depth == 0) - goto std; - else - goto comment; - } - "(*" { ++depth; goto comment; } - "\n" - { - if(cursor == s->eof) RETURN(0); - s->tok = s->pos = cursor; s->line++; - goto comment; - } - any { goto comment; } -*/ -} - -/* -void putStr(FILE *o, char *s, uint l){ - while(l-- > 0) - putc(*s++, o); -} -*/ - -main(){ - Scanner in; - memset((char*) &in, 0, sizeof(in)); - in.fd = 0; - while(scan(&in)){ -/* - putc('<', stdout); - putStr(stdout, (char*) in.tok, in.cur - in.tok); - putc('>', stdout); - putc('\n', stdout); -*/ - } -} diff --git a/examples/langs/rexx.re b/examples/langs/rexx.re deleted file mode 100644 index b74741d..0000000 --- a/examples/langs/rexx.re +++ /dev/null @@ -1,319 +0,0 @@ -#include "scanio.h" -#include "scanner.h" - -#define CURSOR ch -#define LOADCURSOR ch = *cursor; -#define ADVANCE cursor++; -#define BACK(n) cursor -= (n); -#define CHECK(n) if((ScanCB.lim - cursor) < (n)){cursor = ScanFill(cursor);} -#define MARK(n) ScanCB.ptr = cursor; sel = (n); -#define REVERT cursor = ScanCB.ptr; -#define MARKER sel - -#define RETURN(i) {ScanCB.cur = cursor; return i;} - -int ScanToken(){ - uchar *cursor = ScanCB.cur; - unsigned sel; - uchar ch; - ScanCB.tok = cursor; - ScanCB.eot = NULL; -/*!re2c -all = [\000-\377]; -eof = [\000]; -any = all\eof; -letter = [a-z]|[A-Z]; -digit = [0-9]; -symchr = letter|digit|[.!?_]; -const = (digit|[.])symchr*([eE][+-]?digit+)?; -simple = (symchr\(digit|[.]))(symchr\[.])*; -stem = simple [.]; -symbol = symchr*; -sqstr = ['] ((any\['\n])|(['][']))* [']; -dqstr = ["] ((any\["\n])|(["]["]))* ["]; -str = sqstr|dqstr; -ob = [ \t]*; -not = [\\~]; -A = [aA]; -B = [bB]; -C = [cC]; -D = [dD]; -E = [eE]; -F = [fF]; -G = [gG]; -H = [hH]; -I = [iI]; -J = [jJ]; -K = [kK]; -L = [lL]; -M = [mM]; -N = [nN]; -O = [oO]; -P = [pP]; -Q = [qQ]; -R = [rR]; -S = [sS]; -T = [tT]; -U = [uU]; -V = [vV]; -W = [wW]; -X = [xX]; -Y = [yY]; -Z = [zZ]; -*/ - -scan: -/*!re2c -"\n" - { - ++(ScanCB.lineNum); - ScanCB.linePos = ScanCB.pos + (cursor - ScanCB.mrk); - RETURN(SU_EOL); - } -"|" ob "|" - { RETURN(OP_CONCAT); } -"+" - { RETURN(OP_PLUS); } -"-" - { RETURN(OP_MINUS); } -"*" - { RETURN(OP_MULT); } -"/" - { RETURN(OP_DIV); } -"%" - { RETURN(OP_IDIV); } -"/" ob "/" - { RETURN(OP_REMAIN); } -"*" ob "*" - { RETURN(OP_POWER); } -"=" - { RETURN(OP_EQUAL); } -not ob "=" | "<" ob ">" | ">" ob "<" - { RETURN(OP_EQUAL_N); } -">" - { RETURN(OP_GT); } -"<" - { RETURN(OP_LT); } -">" ob "=" | not ob "<" - { RETURN(OP_GE); } -"<" ob "=" | not ob ">" - { RETURN(OP_LE); } -"=" ob "=" - { RETURN(OP_EQUAL_EQ); } -not ob "=" ob "=" - { RETURN(OP_EQUAL_EQ_N); } -">" ob ">" - { RETURN(OP_GT_STRICT); } -"<" ob "<" - { RETURN(OP_LT_STRICT); } -">" ob ">" ob "=" | not ob "<" ob "<" - { RETURN(OP_GE_STRICT); } -"<" ob "<" ob "=" | not ob ">" ob ">" - { RETURN(OP_LE_STRICT); } -"&" - { RETURN(OP_AND); } -"|" - { RETURN(OP_OR); } -"&" ob "&" - { RETURN(OP_XOR); } -not - { RETURN(OP_NOT); } - -":" - { RETURN(SU_COLON); } -"," - { RETURN(SU_COMMA); } -"(" - { RETURN(SU_POPEN); } -")" - { RETURN(SU_PCLOSE); } -";" - { RETURN(SU_EOC); } - -A D D R E S S - { RETURN(RX_ADDRESS); } -A R G - { RETURN(RX_ARG); } -C A L L - { RETURN(RX_CALL); } -D O - { RETURN(RX_DO); } -D R O P - { RETURN(RX_DROP); } -E L S E - { RETURN(RX_ELSE); } -E N D - { RETURN(RX_END); } -E X I T - { RETURN(RX_EXIT); } -I F - { RETURN(RX_IF); } -I N T E R P R E T - { RETURN(RX_INTERPRET); } -I T E R A T E - { RETURN(RX_ITERATE); } -L E A V E - { RETURN(RX_LEAVE); } -N O P - { RETURN(RX_NOP); } -N U M E R I C - { RETURN(RX_NUMERIC); } -O P T I O N S - { RETURN(RX_OPTIONS); } -O T H E R W I S E - { RETURN(RX_OTHERWISE); } -P A R S E - { RETURN(RX_PARSE); } -P R O C E D U R E - { RETURN(RX_PROCEDURE); } -P U L L - { RETURN(RX_PULL); } -P U S H - { RETURN(RX_PUSH); } -Q U E U E - { RETURN(RX_QUEUE); } -R E T U R N - { RETURN(RX_RETURN); } -S A Y - { RETURN(RX_SAY); } -S E L E C T - { RETURN(RX_SELECT); } -S I G N A L - { RETURN(RX_SIGNAL); } -T H E N - { RETURN(RX_THEN); } -T R A C E - { RETURN(RX_TRACE); } -W H E N - { RETURN(RX_WHEN); } -O F F - { RETURN(RXS_OFF); } -O N - { RETURN(RXS_ON); } -B Y - { RETURN(RXS_BY); } -D I G I T S - { RETURN(RXS_DIGITS); } -E N G I N E E R I N G - { RETURN(RXS_ENGINEERING); } -E R R O R - { RETURN(RXS_ERROR); } -E X P O S E - { RETURN(RXS_EXPOSE); } -F A I L U R E - { RETURN(RXS_FAILURE); } -F O R - { RETURN(RXS_FOR); } -F O R E V E R - { RETURN(RXS_FOREVER); } -F O R M - { RETURN(RXS_FORM); } -F U Z Z - { RETURN(RXS_FUZZ); } -H A L T - { RETURN(RXS_HALT); } -L I N E I N - { RETURN(RXS_LINEIN); } -N A M E - { RETURN(RXS_NAME); } -N O T R E A D Y - { RETURN(RXS_NOTREADY); } -N O V A L U E - { RETURN(RXS_NOVALUE); } -S C I E N T I F I C - { RETURN(RXS_SCIENTIFIC); } -S O U R C E - { RETURN(RXS_SOURCE); } -S Y N T A X - { RETURN(RXS_SYNTAX); } -T O - { RETURN(RXS_TO); } -U N T I L - { RETURN(RXS_UNTIL); } -U P P E R - { RETURN(RXS_UPPER); } -V A L U E - { RETURN(RXS_VALUE); } -V A R - { RETURN(RXS_VAR); } -V E R S I O N - { RETURN(RXS_VERSION); } -W H I L E - { RETURN(RXS_WHILE); } -W I T H - { RETURN(RXS_WITH); } - -const - { RETURN(SU_CONST); } -simple - { RETURN(SU_SYMBOL); } -stem - { RETURN(SU_SYMBOL_STEM); } -symbol - { RETURN(SU_SYMBOL_COMPOUND); } -str - { RETURN(SU_LITERAL); } -str [bB] / (all\symchr) - { RETURN(SU_LITERAL_BIN); } -str [xX] / (all\symchr) - { RETURN(SU_LITERAL_HEX); } - -eof - { RETURN(SU_EOF); } -any - { RETURN(SU_ERROR); } -*/ -} - -bool StripToken(){ - uchar *cursor = ScanCB.cur; - unsigned depth; - uchar ch; - bool blanks = FALSE; - ScanCB.eot = cursor; -strip: -/*!re2c -"/*" - { - depth = 1; - goto comment; - } -"\r" - { goto strip; } -[ \t] - { - blanks = TRUE; - goto strip; - } -[] / all - { RETURN(blanks); } -*/ - -comment: -/*!re2c -"*/" - { - if(--depth == 0) - goto strip; - else - goto comment; - } -"\n" - { - ++(ScanCB.lineNum); - ScanCB.linePos = ScanCB.pos + (cursor - ScanCB.mrk); - goto comment; - } -"/*" - { - ++depth; - goto comment; - } -eof - { RETURN(blanks); } -any - { - goto comment; - } -*/ -} diff --git a/examples/push_model/push.re b/examples/push_model/push.re deleted file mode 100644 index 5ad6e7a..0000000 --- a/examples/push_model/push.re +++ /dev/null @@ -1,340 +0,0 @@ -/* - * A push-model scanner example for re2c -f - * Written Mon Apr 11 2005 by mgix@mgix.com - * This file is in the public domain. - * - */ - -// ---------------------------------------------------------------------- - -#include -#include -#include -#include -#include - -#if defined(WIN32) - - typedef signed char int8_t; - typedef signed short int16_t; - typedef signed int int32_t; - - typedef unsigned char uint8_t; - typedef unsigned short uint16_t; - typedef unsigned int uint32_t; - -#else - - #include - #include - - #ifndef O_BINARY - #define O_BINARY 0 - #endif - -#endif - -// ---------------------------------------------------------------------- -#define TOKENS \ - \ - TOK(kEOF) \ - TOK(kEOL) \ - TOK(kUnknown) \ - TOK(kIdentifier) \ - TOK(kDecimalConstant) \ - \ - TOK(kEqual) \ - TOK(kLeftParen) \ - TOK(kRightParen) \ - TOK(kMinus) \ - TOK(kPlus) \ - TOK(kStar) \ - TOK(kSlash) \ - \ - TOK(kIf) \ - TOK(kFor) \ - TOK(kElse) \ - TOK(kGoto) \ - TOK(kBreak) \ - TOK(kWhile) \ - TOK(kReturn) \ - - -// ---------------------------------------------------------------------- -static const char *tokenNames[] = -{ - #define TOK(x) #x, - TOKENS - #undef TOK -}; - -// ---------------------------------------------------------------------- -class PushScanner -{ -public: - - enum Token - { - #define TOK(x) x, - TOKENS - #undef TOK - }; - -private: - - bool eof; - int32_t state; - - uint8_t *limit; - uint8_t *start; - uint8_t *cursor; - uint8_t *marker; - - uint8_t *buffer; - uint8_t *bufferEnd; - - uint8_t yych; - uint32_t yyaccept; - -public: - - // ---------------------------------------------------------------------- - PushScanner() - { - limit = 0; - start = 0; - state = -1; - cursor = 0; - marker = 0; - buffer = 0; - eof = false; - bufferEnd = 0; - } - - // ---------------------------------------------------------------------- - ~PushScanner() - { - } - - // ---------------------------------------------------------------------- - void send( - Token token - ) - { - size_t tokenSize = cursor-start; - const char *tokenName = tokenNames[token]; - printf( - "scanner is pushing out a token of type %d (%s)", - token, - tokenName - ); - - if(token==kEOF) putchar('\n'); - else - { - size_t tokenNameSize = strlen(tokenNames[token]); - size_t padSize = 20-(20"); - - fwrite( - start, - tokenSize, - 1, - stdout - ); - - printf("<----\n"); - } - } - - // ---------------------------------------------------------------------- - uint32_t push( - const void *input, - ssize_t inputSize - ) - { - printf( - "scanner is receiving a new data batch of length %d\n" - "scanner continues with saved state = %d\n", - inputSize, - state - ); - - /* - * Data source is signaling end of file when batch size - * is less than maxFill. This is slightly annoying because - * maxFill is a value that can only be known after re2c does - * its thing. Practically though, maxFill is never bigger than - * the longest keyword, so given our grammar, 32 is a safe bet. - */ - uint8_t null[64]; - const ssize_t maxFill = 32; - if(inputSize "$2" +echo "extern const char *help;" >> "$2" +echo "const char *help =" >> "$2" +PAGER=cat man "$1" \ + | tail -n +7 \ + | head -n -3 \ + | sed -E -e 's/\x1b\x5b[0-9]+m//g' \ + | sed 's/\\x/\\\\x/g' \ + | sed -E 's/"/\\"/g' \ + | sed -E 's/(.*)/"\1\\n"/' \ + >> "$2" +echo ";" >> "$2" diff --git a/install-sh b/install-sh new file mode 100755 index 0000000..0360b79 --- /dev/null +++ b/install-sh @@ -0,0 +1,501 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2016-01-11.22; # UTC + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# 'make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. + +tab=' ' +nl=' +' +IFS=" $tab$nl" + +# Set DOITPROG to "echo" to test this script. + +doit=${DOITPROG-} +doit_exec=${doit:-exec} + +# Put in absolute file names if you don't have them in your path; +# or use environment vars. + +chgrpprog=${CHGRPPROG-chgrp} +chmodprog=${CHMODPROG-chmod} +chownprog=${CHOWNPROG-chown} +cmpprog=${CMPPROG-cmp} +cpprog=${CPPROG-cp} +mkdirprog=${MKDIRPROG-mkdir} +mvprog=${MVPROG-mv} +rmprog=${RMPROG-rm} +stripprog=${STRIPPROG-strip} + +posix_mkdir= + +# Desired mode of installed file. +mode=0755 + +chgrpcmd= +chmodcmd=$chmodprog +chowncmd= +mvcmd=$mvprog +rmcmd="$rmprog -f" +stripcmd= + +src= +dst= +dir_arg= +dst_arg= + +copy_on_change=false +is_target_a_directory=possibly + +usage="\ +Usage: $0 [OPTION]... [-T] SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 [OPTION]... -t DIRECTORY SRCFILES... + or: $0 [OPTION]... -d DIRECTORIES... + +In the 1st form, copy SRCFILE to DSTFILE. +In the 2nd and 3rd, copy all SRCFILES to DIRECTORY. +In the 4th, create DIRECTORIES. + +Options: + --help display this help and exit. + --version display version info and exit. + + -c (ignored) + -C install only if different (preserve the last data modification time) + -d create directories instead of installing files. + -g GROUP $chgrpprog installed files to GROUP. + -m MODE $chmodprog installed files to MODE. + -o USER $chownprog installed files to USER. + -s $stripprog installed files. + -t DIRECTORY install into DIRECTORY. + -T report an error if DSTFILE is a directory. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG + RMPROG STRIPPROG +" + +while test $# -ne 0; do + case $1 in + -c) ;; + + -C) copy_on_change=true;; + + -d) dir_arg=true;; + + -g) chgrpcmd="$chgrpprog $2" + shift;; + + --help) echo "$usage"; exit $?;; + + -m) mode=$2 + case $mode in + *' '* | *"$tab"* | *"$nl"* | *'*'* | *'?'* | *'['*) + echo "$0: invalid mode: $mode" >&2 + exit 1;; + esac + shift;; + + -o) chowncmd="$chownprog $2" + shift;; + + -s) stripcmd=$stripprog;; + + -t) + is_target_a_directory=always + dst_arg=$2 + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + shift;; + + -T) is_target_a_directory=never;; + + --version) echo "$0 $scriptversion"; exit $?;; + + --) shift + break;; + + -*) echo "$0: invalid option: $1" >&2 + exit 1;; + + *) break;; + esac + shift +done + +# We allow the use of options -d and -T together, by making -d +# take the precedence; this is for compatibility with GNU install. + +if test -n "$dir_arg"; then + if test -n "$dst_arg"; then + echo "$0: target directory not allowed when installing a directory." >&2 + exit 1 + fi +fi + +if test $# -ne 0 && test -z "$dir_arg$dst_arg"; then + # When -d is used, all remaining arguments are directories to create. + # When -t is used, the destination is already specified. + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dst_arg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dst_arg" + shift # fnord + fi + shift # arg + dst_arg=$arg + # Protect names problematic for 'test' and other utilities. + case $dst_arg in + -* | [=\(\)!]) dst_arg=./$dst_arg;; + esac + done +fi + +if test $# -eq 0; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call 'install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +if test -z "$dir_arg"; then + if test $# -gt 1 || test "$is_target_a_directory" = always; then + if test ! -d "$dst_arg"; then + echo "$0: $dst_arg: Is not a directory." >&2 + exit 1 + fi + fi +fi + +if test -z "$dir_arg"; then + do_exit='(exit $ret); exit $ret' + trap "ret=129; $do_exit" 1 + trap "ret=130; $do_exit" 2 + trap "ret=141; $do_exit" 13 + trap "ret=143; $do_exit" 15 + + # Set umask so as not to create temps with too-generous modes. + # However, 'strip' requires both read and write access to temps. + case $mode in + # Optimize common cases. + *644) cp_umask=133;; + *755) cp_umask=22;; + + *[0-7]) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw='% 200' + fi + cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;; + *) + if test -z "$stripcmd"; then + u_plus_rw= + else + u_plus_rw=,u+rw + fi + cp_umask=$mode$u_plus_rw;; + esac +fi + +for src +do + # Protect names problematic for 'test' and other utilities. + case $src in + -* | [=\(\)!]) src=./$src;; + esac + + if test -n "$dir_arg"; then + dst=$src + dstdir=$dst + test -d "$dstdir" + dstdir_status=$? + else + + # Waiting for this to be detected by the "$cpprog $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dst_arg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + dst=$dst_arg + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + if test "$is_target_a_directory" = never; then + echo "$0: $dst_arg: Is a directory" >&2 + exit 1 + fi + dstdir=$dst + dst=$dstdir/`basename "$src"` + dstdir_status=0 + else + dstdir=`dirname "$dst"` + test -d "$dstdir" + dstdir_status=$? + fi + fi + + obsolete_mkdir_used=false + + if test $dstdir_status != 0; then + case $posix_mkdir in + '') + # Create intermediate dirs using mode 755 as modified by the umask. + # This is like FreeBSD 'install' as of 1997-10-28. + umask=`umask` + case $stripcmd.$umask in + # Optimize common cases. + *[2367][2367]) mkdir_umask=$umask;; + .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;; + + *[0-7]) + mkdir_umask=`expr $umask + 22 \ + - $umask % 100 % 40 + $umask % 20 \ + - $umask % 10 % 4 + $umask % 2 + `;; + *) mkdir_umask=$umask,go-w;; + esac + + # With -d, create the new directory with the user-specified mode. + # Otherwise, rely on $mkdir_umask. + if test -n "$dir_arg"; then + mkdir_mode=-m$mode + else + mkdir_mode= + fi + + posix_mkdir=false + case $umask in + *[123567][0-7][0-7]) + # POSIX mkdir -p sets u+wx bits regardless of umask, which + # is incompatible with FreeBSD 'install' when (umask & 300) != 0. + ;; + *) + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + trap 'ret=$?; rmdir "$tmpdir/d" "$tmpdir" 2>/dev/null; exit $ret' 0 + + if (umask $mkdir_umask && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/d") >/dev/null 2>&1 + then + if test -z "$dir_arg" || { + # Check for POSIX incompatibilities with -m. + # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or + # other-writable bit of parent directory when it shouldn't. + # FreeBSD 6.1 mkdir -m -p sets mode of existing directory. + ls_ld_tmpdir=`ls -ld "$tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/d" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null + fi + trap '' 0;; + esac;; + esac + + if + $posix_mkdir && ( + umask $mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir" + ) + then : + else + + # The umask is ridiculous, or mkdir does not conform to POSIX, + # or it failed possibly due to a race condition. Create the + # directory the slow way, step by step, checking for races as we go. + + case $dstdir in + /*) prefix='/';; + [-=\(\)!]*) prefix='./';; + *) prefix='';; + esac + + oIFS=$IFS + IFS=/ + set -f + set fnord $dstdir + shift + set +f + IFS=$oIFS + + prefixes= + + for d + do + test X"$d" = X && continue + + prefix=$prefix$d + if test -d "$prefix"; then + prefixes= + else + if $posix_mkdir; then + (umask=$mkdir_umask && + $doit_exec $mkdirprog $mkdir_mode -p -- "$dstdir") && break + # Don't fail if two instances are running concurrently. + test -d "$prefix" || exit 1 + else + case $prefix in + *\'*) qprefix=`echo "$prefix" | sed "s/'/'\\\\\\\\''/g"`;; + *) qprefix=$prefix;; + esac + prefixes="$prefixes '$qprefix'" + fi + fi + prefix=$prefix/ + done + + if test -n "$prefixes"; then + # Don't fail if two instances are running concurrently. + (umask $mkdir_umask && + eval "\$doit_exec \$mkdirprog $prefixes") || + test -d "$dstdir" || exit 1 + obsolete_mkdir_used=true + fi + fi + fi + + if test -n "$dir_arg"; then + { test -z "$chowncmd" || $doit $chowncmd "$dst"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } && + { test "$obsolete_mkdir_used$chowncmd$chgrpcmd" = false || + test -z "$chmodcmd" || $doit $chmodcmd $mode "$dst"; } || exit 1 + else + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'ret=$?; rm -f "$dsttmp" "$rmtmp" && exit $ret' 0 + + # Copy the file name to the temp name. + (umask $cp_umask && $doit_exec $cpprog "$src" "$dsttmp") && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $cpprog $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } && + { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } && + { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } && + { test -z "$chmodcmd" || $doit $chmodcmd $mode "$dsttmp"; } && + + # If -C, don't bother to copy if it wouldn't change the file. + if $copy_on_change && + old=`LC_ALL=C ls -dlL "$dst" 2>/dev/null` && + new=`LC_ALL=C ls -dlL "$dsttmp" 2>/dev/null` && + set -f && + set X $old && old=:$2:$4:$5:$6 && + set X $new && new=:$2:$4:$5:$6 && + set +f && + test "$old" = "$new" && + $cmpprog "$dst" "$dsttmp" >/dev/null 2>&1 + then + rm -f "$dsttmp" + else + # Rename the file to the real destination. + $doit $mvcmd -f "$dsttmp" "$dst" 2>/dev/null || + + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + { + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + test ! -f "$dst" || + $doit $rmcmd -f "$dst" 2>/dev/null || + { $doit $mvcmd -f "$dst" "$rmtmp" 2>/dev/null && + { $doit $rmcmd -f "$rmtmp" 2>/dev/null; :; } + } || + { echo "$0: cannot unlink or rename $dst" >&2 + (exit 1); exit 1 + } + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dst" + } + fi || exit 1 + + trap '' 0 + fi +done + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/missing b/missing new file mode 100755 index 0000000..c6e3795 --- /dev/null +++ b/missing @@ -0,0 +1,215 @@ +#! /bin/sh +# Common wrapper for a few potentially missing GNU programs. + +scriptversion=2016-01-11.22; # UTC + +# Copyright (C) 1996-2017 Free Software Foundation, Inc. +# Originally written by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try '$0 --help' for more information" + exit 1 +fi + +case $1 in + + --is-lightweight) + # Used by our autoconf macros to check whether the available missing + # script is modern enough. + exit 0 + ;; + + --run) + # Back-compat with the calling convention used by older automake. + shift + ;; + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Run 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due +to PROGRAM being missing or too old. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + +Supported PROGRAM values: + aclocal autoconf autoheader autom4te automake makeinfo + bison yacc flex lex help2man + +Version suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and +'g' are ignored when checking the name. + +Send bug reports to ." + exit $? + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + exit $? + ;; + + -*) + echo 1>&2 "$0: unknown '$1' option" + echo 1>&2 "Try '$0 --help' for more information" + exit 1 + ;; + +esac + +# Run the given program, remember its exit status. +"$@"; st=$? + +# If it succeeded, we are done. +test $st -eq 0 && exit 0 + +# Also exit now if we it failed (or wasn't found), and '--version' was +# passed; such an option is passed most likely to detect whether the +# program is present and works. +case $2 in --version|--help) exit $st;; esac + +# Exit code 63 means version mismatch. This often happens when the user +# tries to use an ancient version of a tool on a file that requires a +# minimum version. +if test $st -eq 63; then + msg="probably too old" +elif test $st -eq 127; then + # Program was missing. + msg="missing on your system" +else + # Program was found and executed, but failed. Give up. + exit $st +fi + +perl_URL=http://www.perl.org/ +flex_URL=http://flex.sourceforge.net/ +gnu_software_URL=http://www.gnu.org/software + +program_details () +{ + case $1 in + aclocal|automake) + echo "The '$1' program is part of the GNU Automake package:" + echo "<$gnu_software_URL/automake>" + echo "It also requires GNU Autoconf, GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/autoconf>" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + autoconf|autom4te|autoheader) + echo "The '$1' program is part of the GNU Autoconf package:" + echo "<$gnu_software_URL/autoconf/>" + echo "It also requires GNU m4 and Perl in order to run:" + echo "<$gnu_software_URL/m4/>" + echo "<$perl_URL>" + ;; + esac +} + +give_advice () +{ + # Normalize program name to check for. + normalized_program=`echo "$1" | sed ' + s/^gnu-//; t + s/^gnu//; t + s/^g//; t'` + + printf '%s\n' "'$1' is $msg." + + configure_deps="'configure.ac' or m4 files included by 'configure.ac'" + case $normalized_program in + autoconf*) + echo "You should only need it if you modified 'configure.ac'," + echo "or m4 files included by it." + program_details 'autoconf' + ;; + autoheader*) + echo "You should only need it if you modified 'acconfig.h' or" + echo "$configure_deps." + program_details 'autoheader' + ;; + automake*) + echo "You should only need it if you modified 'Makefile.am' or" + echo "$configure_deps." + program_details 'automake' + ;; + aclocal*) + echo "You should only need it if you modified 'acinclude.m4' or" + echo "$configure_deps." + program_details 'aclocal' + ;; + autom4te*) + echo "You might have modified some maintainer files that require" + echo "the 'autom4te' program to be rebuilt." + program_details 'autom4te' + ;; + bison*|yacc*) + echo "You should only need it if you modified a '.y' file." + echo "You may want to install the GNU Bison package:" + echo "<$gnu_software_URL/bison/>" + ;; + lex*|flex*) + echo "You should only need it if you modified a '.l' file." + echo "You may want to install the Fast Lexical Analyzer package:" + echo "<$flex_URL>" + ;; + help2man*) + echo "You should only need it if you modified a dependency" \ + "of a man page." + echo "You may want to install the GNU Help2man package:" + echo "<$gnu_software_URL/help2man/>" + ;; + makeinfo*) + echo "You should only need it if you modified a '.texi' file, or" + echo "any other file indirectly affecting the aspect of the manual." + echo "You might want to install the Texinfo package:" + echo "<$gnu_software_URL/texinfo/>" + echo "The spurious makeinfo call might also be the consequence of" + echo "using a buggy 'make' (AIX, DU, IRIX), in which case you might" + echo "want to install GNU make:" + echo "<$gnu_software_URL/make/>" + ;; + *) + echo "You might have modified some files without having the proper" + echo "tools for further handling them. Check the 'README' file, it" + echo "often tells you about the needed prerequisites for installing" + echo "this package. You may also peek at any GNU archive site, in" + echo "case some other package contains this missing '$1' program." + ;; + esac +} + +give_advice "$1" | sed -e '1s/^/WARNING: /' \ + -e '2,$s/^/ /' >&2 + +# Propagate the correct exit status (expected to be 127 for a program +# not found, 63 for a program that failed due to version mismatch). +exit $st + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/run_tests.sh.in b/run_tests.sh.in index 42ea7ed..ac2360c 100644 --- a/run_tests.sh.in +++ b/run_tests.sh.in @@ -49,20 +49,24 @@ do threads=$number fi ;; - * ) tests+=("$arg") ;; + * ) tests[${#tests[@]}]="$arg" ;; # array is continuous (old bash lacks +=) esac done echo "Running in ${threads} thread(s)" -test_srcdir="" -if [ ${#tests[@]} -eq 0 ] -then - test_srcdir="@top_srcdir@/test" - tests=(`find $test_srcdir -name '*.re' | sort`) -fi test_blddir="test_"`date +%y%m%d%H%M%S` rm -rf $test_blddir && mkdir $test_blddir +# preserve directory structure unless given explicit args +if [ ${#tests[@]} -eq 0 ]; then + cp -R "@top_srcdir@/test"/* "@top_srcdir@/examples"/* $test_blddir +else + for f in ${tests[@]}; do cp $f ${f%.re}.c $test_blddir; done +fi +chmod -R u+w $test_blddir +find $test_blddir -type f ! -name '*.re' -a ! -name '*.c' -exec rm {} \; +tests=(`find $test_blddir -name '*.re' | sort`) + tests_per_thread=$((${#tests[@]} / threads + 1)) packs=() for ((i = 0; i < threads; i++)) @@ -108,15 +112,8 @@ run_pack() { do cd $test_blddir - # preserve directory structure unless given explicit args - if [ -z "$test_srcdir" ] - then - local outx=`basename $x` - else - # remove prefix - local outx=${x:$((${#test_srcdir} + 1))} - mkdir -p `dirname $outx` - fi + # remove prefix + local outx=${x:$((${#test_blddir} + 1))} local outc="${outx%.re}.c" # filename (dot short* (long arg?)*)? ext @@ -138,10 +135,12 @@ run_pack() { if [ $skeleton -eq 1 ] then + rm -f "$outc" + local switches="$switches --skeleton -Werror-undefined-control-flow" - local status=0 - ${valgrind} ${wine} ../${re2c} $switches "../$x" 2>"$outc.stderr" || status=1 + ${valgrind} ${wine} ../${re2c} $switches "../$x" 2>"$outc.stderr" + local status=$(echo $?) [ $status -eq 0 ] && { @CC@ -Wall -Wextra -o "$outc.out" "$outc" 2>>"$outc.stderr" || status=2; } [ $status -eq 0 ] && { ./"$outc.out" 2>>"$outc.stderr" || status=3; } @@ -150,16 +149,19 @@ run_pack() { 1 ) local msg="OK (expected re2c error)" ;; 2 ) local msg="FAIL (compilation error)" ;; 3 ) local msg="FAIL (runtime error)" ;; + * ) local msg="FAIL (unknown error)" ;; esac printf "%-25s $outx\n" "$msg" if [ $status -le 1 ]; then - [ $keep_tmp_files -eq 0 ] && rm -f "$outc"{,.line*.{input,keys},.stderr,.out} + [ $keep_tmp_files -eq 0 ] && rm -f "$outx" "$outc"{,.line*.{input,keys},.stderr,.out} else - cp -f "../$x" "$outx" local errcnt=$(($errcnt + 1)) fi else + local c="${outx%.re}.c.orig" + mv "$outc" "$c" + # create sandbox tmpdir="tmp_$log" \ && mkdir "$tmpdir" \ @@ -168,6 +170,12 @@ run_pack() { && cp "../../$x" "$outx" # run re2c $valgrind $wine ../../$re2c $switches "$outx" 2>"$outc.stderr" 1>&2 + # on windows output contains CR LF, cut CR to match test results + for f in "$outc" "$outc.stderr"; do + [ -f "$f" ] \ + && cat "$f" | lc_run tr -d '\r' > "$f".mod \ + && mv "$f".mod "$f" + done # paste all files dropped by re2c into output file rm "$outx" && find . -type f \ | lc_run sort \ @@ -178,17 +186,14 @@ run_pack() { && rm -rf "$tmpdir" # compare results - local c="${x%.re}.c" local status="" - [ -z $status ] && status=`[ -f "../$c" ] || echo "MISSING"` - [ -z $status ] && status=`$diff_prog "../$c" "$outc" > "$outc.diff" || echo "FAIL"` + [ -z $status ] && status=`[ -f "$c" ] || echo "MISSING"` + [ -z $status ] && status=`$diff_prog "$c" "$outc" > "$outc.diff" || echo "FAIL"` [ -z $status ] && status="OK" if [ $status = "OK" ] then - rm "$outc" "$outc.diff" + rm "$outc" "$outc.diff" "$c" "$outx" else - cp -f "../$x" "$outx" - cp -f "../$c" "$outc.orig" local errcnt=$(($errcnt + 1)) fi @@ -214,7 +219,7 @@ for ((i = 0; i < ${#packs[@]}; i++)) do logs[$i]=`date +%y%m%d%H%M%S`_$i run_pack ${logs[i]} ${packs[i]} & - wait_pids+=( $! ) + wait_pids[${#wait_pids[@]}]=$! # array is continuous (old bash lacks +=) done wait ${wait_pids[@]} diff --git a/src/adfa/action.h b/src/adfa/action.h new file mode 100644 index 0000000..5e7762b --- /dev/null +++ b/src/adfa/action.h @@ -0,0 +1,108 @@ +#ifndef _RE2C_ADFA_ACTION_ +#define _RE2C_ADFA_ACTION_ + +#include +#include + +#include "src/code/label.h" +#include "src/dfa/tcmd.h" +#include "src/util/c99_stdint.h" +#include "src/util/uniq_vector.h" + +namespace re2c +{ + +class OutputFile; +struct State; + +struct Initial +{ + static const size_t NOSAVE; + + label_t label; + size_t save; + + inline Initial (label_t l, size_t s) + : label (l) + , save (s) + {} +}; + +typedef uniq_vector_t > accept_t; + +class Action +{ +public: + enum type_t + { + MATCH, + INITIAL, + SAVE, + MOVE, + ACCEPT, + RULE + } type; + union + { + Initial * initial; + size_t save; + const accept_t * accepts; + size_t rule; + } info; + +public: + inline Action () + : type (MATCH) + , info () + {} + ~Action () + { + if (type == INITIAL) { + delete info.initial; + } + } + void set_initial (label_t label) + { + if (type == MATCH) { + // ordinary state with no special action + type = INITIAL; + info.initial = new Initial(label, Initial::NOSAVE); + } else if (type == SAVE) { + // fallback state: do not loose 'yyaccept' + type = INITIAL; + info.initial = new Initial(label, info.save); + } else if (type == INITIAL) { + // already marked as initial, probably reuse mode + info.initial->label = label; + } else { + assert(false); + } + } + void set_save (size_t save) + { + assert(type == MATCH); + type = SAVE; + info.save = save; + } + void set_move () + { + assert(type == MATCH); + type = MOVE; + } + void set_accept (const accept_t * accepts) + { + assert(type == MATCH); + type = ACCEPT; + info.accepts = accepts; + } + void set_rule (size_t rule) + { + assert(type == MATCH); + type = RULE; + info.rule = rule; + } +}; + +} // namespace re2c + +#endif // _RE2C_ADFA_ACTION_ diff --git a/src/adfa/adfa.cc b/src/adfa/adfa.cc new file mode 100644 index 0000000..99147e2 --- /dev/null +++ b/src/adfa/adfa.cc @@ -0,0 +1,177 @@ +#include +#include +#include +#include +#include +#include +#include + +#include "src/adfa/adfa.h" +#include "src/code/go.h" +#include "src/dfa/dfa.h" +#include "src/util/allocate.h" + +namespace re2c +{ + +const size_t Initial::NOSAVE = std::numeric_limits::max(); + +DFA::DFA + ( const dfa_t &dfa + , const std::vector &fill + , size_t def + , size_t key + , const std::string &nm + , const std::string &cn + , uint32_t ln + , const std::string &su + ) + : accepts () + , name (nm) + , cond (cn) + , line (ln) + , lbChar(0) + , ubChar(dfa.charset.back()) + , nStates(0) + , head(NULL) + , tags0(dfa.tcid0) + , charset(dfa.charset) + , rules(dfa.rules) + , tags(dfa.tags) + , mtagvers(dfa.mtagvers) + , finvers(dfa.finvers) + , tcpool(dfa.tcpool) + , max_fill (0) + , max_nmatch(0) + , need_backup (false) + , need_accept (false) + , oldstyle_ctxmarker (false) + , maxtagver (dfa.maxtagver) + , def_rule (def) + , key_size (key) + , bitmaps (std::min(ubChar, 256u)) + , setup(su) +{ + const size_t nstates = dfa.states.size(); + const size_t nchars = dfa.nchars; + + State **i2s = new State*[nstates]; + for (size_t i = 0; i < nstates; ++i) + { + i2s[i] = new State; + } + + State **p = &head; + for (size_t i = 0; i < nstates; ++i) + { + dfa_state_t *t = dfa.states[i]; + State *s = i2s[i]; + + ++nStates; + *p = s; + p = &s->next; + + s->rule = t->rule; + s->rule_tags = t->tcid[dfa.nchars]; + s->fall_tags = t->tcid[dfa.nchars + 1]; + s->fill = fill[i]; + s->fallback = t->fallback; // see note [fallback states] + + s->go.span = allocate(nchars); + uint32_t j = 0; + for (uint32_t c = 0; c < nchars; ++j) + { + const size_t to = t->arcs[c]; + const tcid_t tc = t->tcid[c]; + for (;++c < nchars && t->arcs[c] == to && t->tcid[c] == tc;); + s->go.span[j].to = to == dfa_t::NIL ? NULL : i2s[to]; + s->go.span[j].ub = charset[c]; + s->go.span[j].tags = tc; + } + s->go.nSpans = j; + } + *p = NULL; + + delete[] i2s; +} + +DFA::~DFA() +{ + State *s; + + while ((s = head)) + { + head = s->next; + delete s; + } + + delete &charset; + delete &rules; + delete &tags; + delete &mtagvers; + delete[] finvers; + delete &tcpool; +} + +/* note [reordering DFA states] + * + * re2c-generated code depends on the order of states in DFA: simply + * flipping two states may change the output significantly. + * The order of states is affected by many factors, e.g.: + * - flipping left and right subtrees of alternative when constructing + * AST (also applies to iteration and counted repetition) + * - changing the order in which graph nodes are visited (applies to + * any intermediate representation: bytecode, NFA, DFA, etc.) + * + * To make the resulting code independent of such changes, we hereby + * reorder DFA states. The ordering scheme is very simple: + * + * Starting with DFA root, walk DFA nodes in breadth-first order. + * Child nodes are ordered accoding to the (alphabetically) first symbol + * leading to each node. Each node must be visited exactly once. + * Default state (NULL) is always the last state. + */ +void DFA::reorder() +{ + std::vector ord; + ord.reserve(nStates); + + std::queue todo; + todo.push(head); + + std::set done; + done.insert(head); + + for(;!todo.empty();) + { + State *s = todo.front(); + todo.pop(); + ord.push_back(s); + for(uint32_t i = 0; i < s->go.nSpans; ++i) + { + State *q = s->go.span[i].to; + if(q && done.insert(q).second) + { + todo.push(q); + } + } + } + + assert(nStates == ord.size()); + + ord.push_back(NULL); + for(uint32_t i = 0; i < nStates; ++i) + { + ord[i]->next = ord[i + 1]; + } +} + +void DFA::addState(State *s, State *next) +{ + ++nStates; + s->next = next->next; + next->next = s; +} + +} // namespace re2c + diff --git a/src/adfa/adfa.h b/src/adfa/adfa.h new file mode 100644 index 0000000..48259dd --- /dev/null +++ b/src/adfa/adfa.h @@ -0,0 +1,120 @@ +#ifndef _RE2C_ADFA_ADFA_ +#define _RE2C_ADFA_ADFA_ + +#include +#include "src/util/c99_stdint.h" +#include +#include +#include +#include + +#include "src/adfa/action.h" +#include "src/code/bitmap.h" +#include "src/code/go.h" +#include "src/code/label.h" +#include "src/dfa/tcmd.h" +#include "src/re/rule.h" +#include "src/re/tag.h" +#include "src/util/forbid_copy.h" + +namespace re2c +{ + +struct opt_t; +class OutputFile; +struct Output; +struct dfa_t; + +struct State +{ + label_t label; + State * next; + size_t fill; + bool fallback; + + size_t rule; + tcid_t rule_tags; + tcid_t fall_tags; + bool isBase; + Go go; + Action action; + + State () + : label (label_t::first ()) + , next (0) + , fill (0) + , fallback (false) + , rule (Rule::NONE) + , rule_tags (TCID0) + , fall_tags (TCID0) + , isBase (false) + , go () + , action () + {} + ~State () + { + operator delete (go.span); + } + + FORBID_COPY (State); +}; + +struct DFA +{ + accept_t accepts; + const std::string name; + const std::string cond; + const uint32_t line; + uint32_t lbChar; + uint32_t ubChar; + uint32_t nStates; + State * head; + const tcid_t tags0; + std::vector &charset; + std::valarray &rules; + std::vector &tags; + std::set &mtagvers; + const tagver_t *finvers; + tcpool_t &tcpool; + size_t max_fill; + size_t max_nmatch; + bool need_backup; + bool need_accept; + bool oldstyle_ctxmarker; + tagver_t maxtagver; + const size_t def_rule; + const size_t key_size; + bitmaps_t bitmaps; + std::string setup; + + DFA ( const dfa_t &dfa + , const std::vector &fill + , size_t def + , size_t key + , const std::string &nm + , const std::string &cn + , uint32_t ln + , const std::string &su + ); + ~DFA (); + void reorder(); + void prepare(const opt_t *opts); + void calc_stats(uint32_t ln, bool explicit_tags); + void emit (Output &, uint32_t &, bool, bool &); + +private: + void addState(State*, State *); + void split (State *); + void findBaseState (); + void hoist_tags(); + void hoist_tags_and_skip(const opt_t *opts); + void count_used_labels(std::set &used, label_t start, label_t initial, bool force_start, bool fFlag) const; + void emit_body (OutputFile &, uint32_t &, const std::set & used_labels, label_t initial) const; + void emit_dot(OutputFile &o, bool last_cond) const; + + FORBID_COPY (DFA); +}; + +} // namespace re2c + +#endif // _RE2C_ADFA_ADFA_ diff --git a/src/adfa/dump.cc b/src/adfa/dump.cc new file mode 100644 index 0000000..fd7c70e --- /dev/null +++ b/src/adfa/dump.cc @@ -0,0 +1,101 @@ +#include "src/util/c99_stdint.h" +#include +#include +#include +#include +#include + +#include "src/adfa/action.h" +#include "src/adfa/adfa.h" +#include "src/adfa/dump.h" +#include "src/code/go.h" +#include "src/dfa/dump.h" +#include "src/dfa/tcmd.h" +#include "src/re/rule.h" +#include "src/re/tag.h" + +namespace re2c +{ + +static void dump_adfa_range(uint32_t lower, uint32_t upper) +{ + fprintf(stderr, "%u", lower); + if (--upper > lower) { + fprintf(stderr, "-%u", upper); + } +} + +void dump_adfa(const DFA &dfa) +{ + fprintf(stderr, + "digraph DFA {\n" + " rankdir=LR\n" + " node[shape=Mrecord fontname=fixed]\n" + " edge[arrowhead=vee fontname=fixed]\n\n"); + + fprintf(stderr, + " n [shape=point]" + " n -> n%p [style=dotted label=\"", (void*)dfa.head); + dump_tcmd(dfa.tcpool[dfa.tags0]); + fprintf(stderr, "\"]\n"); + + for (const State *s = dfa.head; s; s = s->next) { + const char *attr; + Action::type_t action = s->action.type; + + if (action == Action::ACCEPT) { + attr = "style=filled fillcolor=gray"; + } else if (action == Action::RULE) { + attr = "style=filled fillcolor=lightgray"; + } else { + attr = ""; + } + fprintf(stderr, " n%p [height=0.2 width=0.2 label=\"", (void*)s); + if (s->fill && action != Action::MOVE) { + fprintf(stderr, "F(%u) ", (uint32_t)s->fill); + } + if (action == Action::RULE) { + const Rule &r = dfa.rules[s->action.info.rule]; + for (size_t t = r.ltag; t < r.htag; ++t) { + if (t > r.ltag) fprintf(stderr, " "); + const std::string *name = dfa.tags[t].name; + fprintf(stderr, "%s(%d)", + name ? name->c_str() : "/", dfa.finvers[t]); + } + } + dump_tcmd(dfa.tcpool[s->go.tags]); + fprintf(stderr, "\" %s]\n", attr); + + if (action == Action::ACCEPT) { + const accept_t &accept = *s->action.info.accepts; + for (uint32_t i = 0; i < accept.size(); ++i) { + fprintf(stderr, " n%p -> n%p [label=\"", + (void*)s, (void*)accept[i].first); + dump_tcmd(dfa.tcpool[accept[i].second]); + fprintf(stderr, "\" style=dotted]\n"); + } + } + + const Span *x = s->go.span, *e = x + s->go.nSpans; + for (uint32_t lb = 0; x < e; lb = x->ub, ++x) { + if (!x->to) continue; + + bool eat = true; + const Action::type_t act = x->to->action.type; + if (act == Action::MOVE || act == Action::RULE) { + attr = "style=dotted"; + eat = false; + } else { + attr = ""; + } + fprintf(stderr, " n%p -> n%p [label=\"", (void*)s, (void*)x->to); + if (eat) dump_adfa_range(lb, x->ub); + dump_tcmd(dfa.tcpool[x->tags]); + fprintf(stderr, "\" %s]\n", attr); + } + } + + fprintf(stderr, "}\n"); +} + +} // namespace re2c diff --git a/src/adfa/dump.h b/src/adfa/dump.h new file mode 100644 index 0000000..352f453 --- /dev/null +++ b/src/adfa/dump.h @@ -0,0 +1,15 @@ +#ifndef _RE2C_ADFA_DUMP_ +#define _RE2C_ADFA_DUMP_ + +#include "src/adfa/adfa.h" + +namespace re2c +{ + +struct DFA; + +void dump_adfa(const DFA &dfa); + +} // namespace re2c + +#endif // _RE2C_ADFA_DUMP_ diff --git a/src/adfa/prepare.cc b/src/adfa/prepare.cc new file mode 100644 index 0000000..362308d --- /dev/null +++ b/src/adfa/prepare.cc @@ -0,0 +1,348 @@ +#include +#include "src/util/c99_stdint.h" +#include +#include +#include +#include +#include + +#include "src/adfa/action.h" +#include "src/adfa/adfa.h" +#include "src/code/bitmap.h" +#include "src/code/go.h" +#include "src/conf/msg.h" +#include "src/conf/opt.h" +#include "src/dfa/tcmd.h" +#include "src/re/rule.h" +#include "src/util/allocate.h" + +namespace re2c { + +void DFA::split(State *s) +{ + State *move = new State; + addState(move, s); + move->action.set_move (); + move->rule = s->rule; + move->fill = s->fill; /* used by tunneling, ignored by codegen */ + move->go = s->go; + move->go.tags = TCID0; /* drop hoisted tags */ + move->rule_tags = s->rule_tags; + move->fall_tags = s->fall_tags; + s->rule = Rule::NONE; + s->go.nSpans = 1; + s->go.span = allocate (1); + s->go.span[0].ub = ubChar; + s->go.span[0].to = move; + s->go.span[0].tags = TCID0; +} + +static uint32_t merge(Span *x, State *fg, State *bg) +{ + Span *f = fg->go.span; + Span *b = bg->go.span; + Span *const fe = f + fg->go.nSpans; + Span *const be = b + bg->go.nSpans; + Span *const x0 = x; + + for (;!(f == fe && b == be);) { + if (f->to == b->to && f->tags == b->tags) { + x->to = bg; + x->tags = TCID0; + } else { + x->to = f->to; + x->tags = f->tags; + } + if (x == x0 + || x[-1].to != x->to + || x[-1].tags != x->tags) { + ++x; + } + x[-1].ub = std::min(f->ub, b->ub); + + if (f->ub < b->ub) { + ++f; + } else if (f->ub > b->ub) { + ++b; + } else { + ++f; + ++b; + } + } + + return static_cast(x - x0); +} + +void DFA::findBaseState() +{ + Span *span = allocate (ubChar - lbChar); + + for (State *s = head; s; s = s->next) + { + if (s->fill == 0) + { + for (uint32_t i = 0; i < s->go.nSpans; ++i) + { + State *to = s->go.span[i].to; + + if (to->isBase) + { + to = to->go.span[0].to; + uint32_t nSpans = merge(span, s, to); + + if (nSpans < s->go.nSpans) + { + operator delete (s->go.span); + s->go.nSpans = nSpans; + s->go.span = allocate (nSpans); + memcpy(s->go.span, span, nSpans*sizeof(Span)); + break; + } + } + } + } + } + + operator delete (span); +} + +/* note [tag hoisting, skip hoisting and tunneling] + * + * Tag hoisting is simple: if all transitions have the same commands, + * they can be hoisted out of conditional branches. + * + * Skip hoisting is only relevant with '--eager-skip' option. + * Normally this option is off and skip is lazy: it happens after + * transition to the next state, if this state is consuming. + * However, with '--eager-skip' skip happens before transition to the next + * state. Different transitions may disagree: some of them go to consuming + * states, others don't. If they agree, skip can be hoisted (just like tags). + * + * '--eager-skip' makes tag hoisting more complicated, because now we have + * to care about the type of automaton: lookahead TDFAs must skip after + * writing tags, while non-lookahead TDFAs must skip before writing tags. + * Therefore skip hoising cannot be done without tag hoisting in lookahead + * TDFAs, and vice versa with non-lookahead TDFAs. + * (Note that '--eager-skip' is implied by '--no-lookahead'). + * + * Tunneling splits base states in two parts: head and body. Body has all + * the conditional branches (transitions on symbols), while head has just + * one unconditional jump to body. + * + * Normally tag hoisting should go before tunneling: hoisting may add new + * candidates to be merged by tunneling. However, with '--eager-skip' tag + * hoisting is interwined with skip hoisting, and the latter needs to know + * which states are consuming. This is not possible if tunneling is still + * to be done, because it may turn consuming states into non-consuming ones. + * Another option is to disallow splitting states with non-hoisted skip + * in the presence of '--eager-skip' (this way skip hoisting wouldn't need + * to know tunneling results), but it's much worse for tunneling. + */ + +void DFA::prepare(const opt_t *opts) +{ + // create rule states + std::vector rule2state(rules.size()); + for (State *s = head; s; s = s->next) { + if (s->rule != Rule::NONE) { + if (!rule2state[s->rule]) { + State *n = new State; + n->action.set_rule(s->rule); + rule2state[s->rule] = n; + addState(n, s); + } + for (uint32_t i = 0; i < s->go.nSpans; ++i) { + if (!s->go.span[i].to) { + s->go.span[i].to = rule2state[s->rule]; + s->go.span[i].tags = s->rule_tags; + } + } + } + } + + // create default state (if needed) + State * default_state = NULL; + for (State * s = head; s; s = s->next) + { + for (uint32_t i = 0; i < s->go.nSpans; ++i) + { + if (!s->go.span[i].to) + { + if (!default_state) + { + default_state = new State; + addState(default_state, s); + } + s->go.span[i].to = default_state; + } + } + } + + // bind save actions to fallback states and create accept state (if needed) + if (default_state) { + for (State *s = head; s; s = s->next) { + if (s->fallback) { + const std::pair acc(rule2state[s->rule], s->fall_tags); + s->action.set_save(accepts.find_or_add(acc)); + } + } + default_state->action.set_accept(&accepts); + } + + // tag hoisting should be done after binding default arcs: + // (which may introduce new tags) + // see note [tag hoisting, skip hoisting and tunneling] + if (!opts->eager_skip) { + hoist_tags(); + } + + // split ``base'' states into two parts + for (State * s = head; s; s = s->next) + { + s->isBase = false; + + if (s->fill != 0) + { + for (uint32_t i = 0; i < s->go.nSpans; ++i) + { + if (s->go.span[i].to == s) + { + s->isBase = true; + split(s); + + if (opts->bFlag) { + bitmaps.insert(&s->next->go, s); + } + + s = s->next; + break; + } + } + } + } + // find ``base'' state, if possible + findBaseState(); + + // see note [tag hoisting, skip hoisting and tunneling] + if (opts->eager_skip) { + hoist_tags_and_skip(opts); + } + + for (State *s = head; s; s = s->next) { + s->go.init(s, opts, bitmaps); + } +} + +void DFA::calc_stats(uint32_t ln, bool explicit_tags) +{ + // calculate 'YYMAXFILL' + max_fill = 0; + for (State * s = head; s; s = s->next) + { + if (max_fill < s->fill) + { + max_fill = s->fill; + } + } + + // calculate 'YYMAXNMATCH' + max_nmatch = 0; + const size_t nrule = rules.size(); + for (size_t i = 0; i < nrule; ++i) { + max_nmatch = std::max(max_nmatch, rules[i].ncap); + } + + // determine if 'YYMARKER' or 'YYBACKUP'/'YYRESTORE' pair is used + need_backup = accepts.size () > 0; + + // determine if 'yyaccept' variable is used + need_accept = accepts.size () > 1; + + // determine if 'YYCTXMARKER' or 'YYBACKUPCTX'/'YYRESTORECTX' pair is used + // If tags are not enabled explicitely and trailing contexts + // don't overlap (single variable is enough for all of them), then + // re2c should use old-style YYCTXMARKER for backwards compatibility. + // Note that with generic API fixed-length contexts are forbidden, + // which may cause additional overlaps. + oldstyle_ctxmarker = !explicit_tags && maxtagver == 1; + + // error if tags are not enabled, but we need them + if (!explicit_tags && maxtagver > 1) { + fatal_l(ln, "overlapping trailing contexts need " + "multiple context markers, use '-t, --tags' " + "option and '/*!stags:re2c ... */' directive"); + } +} + +void DFA::hoist_tags() +{ + for (State * s = head; s; s = s->next) { + Span *span = s->go.span; + const size_t nspan = s->go.nSpans; + if (nspan == 0) continue; + + tcid_t ts = span[0].tags; + for (uint32_t i = 1; i < nspan; ++i) { + if (span[i].tags != ts) { + ts = TCID0; + break; + } + } + if (ts != TCID0) { + s->go.tags = ts; + for (uint32_t i = 0; i < nspan; ++i) { + span[i].tags = TCID0; + } + } + } +} + +void DFA::hoist_tags_and_skip(const opt_t *opts) +{ + assert(opts->eager_skip); + + for (State * s = head; s; s = s->next) { + Span *span = s->go.span; + const size_t nspan = s->go.nSpans; + if (nspan == 0) continue; + + bool hoist_tags = true, hoist_skip = true; + + // do all spans agree on tags? + for (uint32_t i = 1; i < nspan; ++i) { + if (span[i].tags != span[0].tags) { + hoist_tags = false; + break; + } + } + + // do all spans agree on skip? + for (uint32_t i = 0; i < nspan; ++i) { + if (consume(span[i].to) != consume(span[0].to)) { + hoist_skip = false; + break; + } + } + + if (opts->lookahead) { + // skip must go after tags + hoist_skip &= hoist_tags; + } else { + // skip must go before tags + hoist_tags &= hoist_skip; + } + + // hoisting tags is possible + if (hoist_tags) { + s->go.tags = span[0].tags; + for (uint32_t i = 0; i < nspan; ++i) { + span[i].tags = TCID0; + } + } + + // hoisting skip is possible + s->go.skip = hoist_skip && consume(span[0].to); + } +} + +} // namespace re2c diff --git a/src/ast/ast.cc b/src/ast/ast.cc new file mode 100644 index 0000000..612641e --- /dev/null +++ b/src/ast/ast.cc @@ -0,0 +1,145 @@ +#include + +#include "src/ast/ast.h" +#include "src/util/free_list.h" + +namespace re2c +{ + +free_list AST::flist; + +const uint32_t AST::MANY = std::numeric_limits::max(); + +AST::AST(uint32_t l, uint32_t c, type_t t) + : type(t), line(l), column(c) +{ + flist.insert(this); +} + +AST::~AST() +{ + flist.erase(this); + if (type == TAG) { + delete tag.name; + } else if (type == REF) { + delete ref.name; + } else if (type == STR) { + delete str.chars; + } else if (type == CLS) { + delete cls.ranges; + } +} + +const AST *ast_nil(uint32_t l, uint32_t c) +{ + return new AST(l, c, AST::NIL); +} + +const AST *ast_str(uint32_t l, uint32_t c, std::vector *chars, bool icase) +{ + AST *ast = new AST(l, c, AST::STR); + ast->str.chars = chars; + ast->str.icase = icase; + return ast; +} + +const AST *ast_cls(uint32_t l, uint32_t c, std::vector *ranges, bool negated) +{ + AST *ast = new AST(l, c, AST::CLS); + ast->cls.ranges = ranges; + ast->cls.negated = negated; + return ast; +} + +const AST *ast_dot(uint32_t l, uint32_t c) +{ + return new AST(l, c, AST::DOT); +} + +const AST *ast_default(uint32_t l, uint32_t c) +{ + return new AST(l, c, AST::DEFAULT); +} + +const AST *ast_alt(const AST *a1, const AST *a2) +{ + if (!a1) return a2; + if (!a2) return a1; + AST *ast = new AST(a1->line, a1->column, AST::ALT); + ast->alt.ast1 = a1; + ast->alt.ast2 = a2; + return ast; +} + +const AST *ast_cat(const AST *a1, const AST *a2) +{ + if (!a1) return a2; + if (!a2) return a1; + AST *ast = new AST(a1->line, a1->column, AST::CAT); + ast->cat.ast1 = a1; + ast->cat.ast2 = a2; + return ast; +} + +const AST *ast_iter(const AST *a, uint32_t n, uint32_t m) +{ + AST *ast = new AST(a->line, a->column, AST::ITER); + ast->iter.ast = a; + ast->iter.min = n; + ast->iter.max = m; + return ast; +} + +const AST *ast_diff(const AST *a1, const AST *a2) +{ + AST *ast = new AST(a1->line, a1->column, AST::DIFF); + ast->cat.ast1 = a1; + ast->cat.ast2 = a2; + return ast; +} + +const AST *ast_tag(uint32_t l, uint32_t c, const std::string *n, bool h) +{ + AST *ast = new AST(l, c, AST::TAG); + ast->tag.name = n; + ast->tag.history = h; + return ast; +} + +const AST *ast_cap(const AST *a) +{ + AST *ast = new AST(a->line, a->column, AST::CAP); + ast->cap = a; + return ast; +} + +const AST *ast_ref(const AST *a, const std::string &n) +{ + AST *ast = new AST(a->line, a->column, AST::REF); + ast->ref.ast = a; + ast->ref.name = new std::string(n); + return ast; +} + +bool ast_need_wrap(const AST *a) +{ + switch (a->type) { + case AST::ITER: + case AST::NIL: + case AST::STR: + case AST::CLS: + case AST::DOT: + case AST::DEFAULT: + case AST::TAG: + case AST::CAP: + return false; + case AST::ALT: + case AST::CAT: + case AST::DIFF: + case AST::REF: + return true; + } + return false; /* unreachable */ +} + +} // namespace re2c diff --git a/src/ast/ast.h b/src/ast/ast.h new file mode 100644 index 0000000..e4685f7 --- /dev/null +++ b/src/ast/ast.h @@ -0,0 +1,140 @@ +#ifndef _RE2C_AST_AST_ +#define _RE2C_AST_AST_ + +#include "src/util/c99_stdint.h" +#include +#include +#include + +#include "src/ast/scanner.h" +#include "src/re/rule.h" +#include "src/util/free_list.h" +#include "src/util/range.h" + +namespace re2c +{ + +struct Code; +template class free_list; + +struct ASTChar +{ + uint32_t chr; + uint32_t column; + ASTChar(uint32_t x, uint32_t c) + : chr(x), column(c) {} +}; + +struct ASTRange +{ + uint32_t lower; + uint32_t upper; + uint32_t column; + ASTRange(uint32_t l, uint32_t u, uint32_t c) + : lower(l), upper(u), column(c) {} +}; + +/* AST must be immutable and independent of options */ +struct AST +{ + static free_list flist; + static const uint32_t MANY; + + enum type_t + { NIL, STR, CLS, DOT, DEFAULT, ALT + , CAT, ITER, DIFF, TAG, CAP, REF } type; + union { + struct { + const std::vector *chars; + bool icase; + } str; + struct { + const std::vector *ranges; + bool negated; + } cls; + struct { + const AST *ast1; + const AST *ast2; + } alt; + struct { + const AST *ast1; + const AST *ast2; + } cat; + struct { + const AST *ast; + uint32_t min; + uint32_t max; + } iter; + struct { + const AST *ast1; + const AST *ast2; + } diff; + struct { + const std::string *name; + bool history; + } tag; + const AST *cap; + struct { + const AST *ast; + const std::string *name; + } ref; + }; + uint32_t line; + uint32_t column; + + AST(uint32_t l, uint32_t c, type_t t); + ~AST(); +}; + +struct ASTRule +{ + const AST *ast; + const Code *code; + + ASTRule(const AST *r, const Code *c) + : ast(r) + , code(c) + {} +}; + +struct ASTBounds +{ + uint32_t min; + uint32_t max; +}; + +struct spec_t +{ + std::string name; + std::vector rules; + std::vector defs; + std::vector setup; + + explicit spec_t(const std::string &n): + name(n), rules(), defs(), setup() {} +}; + +typedef std::vector specs_t; +typedef std::map symtab_t; + +const AST *ast_nil(uint32_t l, uint32_t c); +const AST *ast_str(uint32_t l, uint32_t c, std::vector *chars, bool icase); +const AST *ast_cls(uint32_t l, uint32_t c, std::vector *ranges, bool negated); +const AST *ast_dot(uint32_t l, uint32_t c); +const AST *ast_default(uint32_t l, uint32_t c); +const AST *ast_alt(const AST *a1, const AST *a2); +const AST *ast_cat(const AST *a1, const AST *a2); +const AST *ast_iter(const AST *a, uint32_t n, uint32_t m); +const AST *ast_diff(const AST *a1, const AST *a2); +const AST *ast_tag(uint32_t l, uint32_t c, const std::string *n, bool h); +const AST *ast_cap(const AST *a); +const AST *ast_ref(const AST *a, const std::string &n); +bool ast_need_wrap(const AST *a); + +void validate_mode(Scanner::ParseMode mode, bool rflag, bool rules, Scanner &input); +void validate_ast(const specs_t &specs, bool cflag); +void normalize_ast(specs_t &specs); + +} // namespace re2c + +#endif // _RE2C_AST_AST_ diff --git a/src/parse/input.cc b/src/ast/input.cc similarity index 92% rename from src/parse/input.cc rename to src/ast/input.cc index 472e6b9..b06c1bd 100644 --- a/src/parse/input.cc +++ b/src/ast/input.cc @@ -1,4 +1,4 @@ -#include "src/parse/input.h" +#include "src/ast/input.h" namespace re2c { diff --git a/src/parse/input.h b/src/ast/input.h similarity index 66% rename from src/parse/input.h rename to src/ast/input.h index f58e189..faee2f9 100644 --- a/src/parse/input.h +++ b/src/ast/input.h @@ -1,5 +1,5 @@ -#ifndef _RE2C_PARSE_INPUT_ -#define _RE2C_PARSE_INPUT_ +#ifndef _RE2C_AST_INPUT_ +#define _RE2C_AST_INPUT_ #include #include @@ -13,7 +13,7 @@ struct Input FILE * file; std::string file_name; - Input (const char * fn); + explicit Input (const char * fn); ~Input (); bool open (); @@ -22,4 +22,4 @@ struct Input } // namespace re2c -#endif // _RE2C_PARSE_INPUT_ +#endif // _RE2C_AST_INPUT_ diff --git a/src/parse/lex.re b/src/ast/lex.re similarity index 50% rename from src/parse/lex.re rename to src/ast/lex.re index 2fd98fb..6e6887c 100644 --- a/src/parse/lex.re +++ b/src/ast/lex.re @@ -5,19 +5,14 @@ #include #include -#include "src/codegen/output.h" -#include "src/conf/opt.h" -#include "src/conf/warn.h" -#include "src/globals.h" -#include "src/ir/regexp/encoding/enc.h" -#include "src/ir/regexp/regexp.h" -#include "src/ir/regexp/regexp_null.h" -#include "src/parse/code.h" -#include "src/parse/extop.h" -#include "src/parse/input.h" -#include "src/parse/scanner.h" -#include "src/parse/parser.h" // needed by "y.tab.h" -#include "src/parse/unescape.h" +#include "src/conf/msg.h" +#include "src/code/output.h" +#include "src/re/encoding/enc.h" +#include "src/ast/input.h" +#include "src/ast/ast.h" +#include "src/ast/scanner.h" +#include "src/ast/parser.h" // needed by "y.tab.h" +#include "src/ast/unescape.h" #include "src/util/range.h" #include "src/util/s_to_n32_unsafe.h" #include "y.tab.h" @@ -27,7 +22,7 @@ extern YYSTYPE yylval; #define YYCTYPE unsigned char #define YYCURSOR cur #define YYLIMIT lim -#define YYMARKER ptr +#define YYMARKER mar #define YYCTXMARKER ctx #define YYFILL(n) { fill (n); } @@ -48,10 +43,11 @@ sstring = "'" ((. \ [\\'] ) | "\\" .)* "'" ; letter = [a-zA-Z]; digit = [0-9]; lineno = [1-9] digit*; -name = (letter|digit|"_")+; +name = (letter|"_") (letter|digit|"_")*; space = [ \t]; ws = (space | [\r\n]); -eol = ("\r\n" | "\n"); +eol = "\r"? "\n"; +eoc = "*" "/"; lineinf = lineno (space+ dstring)? eol; esc = "\\"; @@ -61,11 +57,8 @@ lineinf = lineno (space+ dstring)? eol; esc_simple = esc [abfnrtv\\]; */ -Scanner::ParseMode Scanner::echo() +Scanner::ParseMode Scanner::echo(OutputFile &out) { - bool ignore_eoc = false; - int ignore_cnt = 0; - if (eof && cur == eof) // Catch EOF { return Stop; @@ -73,167 +66,141 @@ Scanner::ParseMode Scanner::echo() tok = cur; echo: + ptr = cur; + /*!re2c - beginRE = "%{" | "/*!re2c"; - beginRE { - if (opts->rFlag) - { - fatal("found standard 're2c' block while using -r flag"); - } - if (opts->target == opt_t::CODE) - { - const size_t lexeme_len = cur[-1] == '{' - ? sizeof ("%{") - 1 - : sizeof ("/*!re2c") - 1; - out.wraw(tok, tok_len () - lexeme_len); - } - tok = cur; - return Parse; - } - "/*!rules:re2c" { - if (opts->rFlag) - { - opts.reset_mapCodeName (); - } - else - { - fatal("found 'rules:re2c' block without -r flag"); - } - tok = cur; - return Rules; - } - "/*!use:re2c" { - if (!opts->rFlag) - { - fatal("found 'use:re2c' block without -r flag"); - } - reuse(); - if (opts->target == opt_t::CODE) - { - const size_t lexeme_len = sizeof ("/*!use:re2c") - 1; - out.wraw(tok, tok_len () - lexeme_len); - } - tok = cur; - return Reuse; - } + "%{" | "/*!re2c" { + out.wraw(tok, ptr); + return Parse; + } + + "/*!rules:re2c" { + out.wraw(tok, ptr); + return Rules; + } + + "/*!use:re2c" { + out.wraw(tok, ptr); + return Reuse; + } + + "/*!ignore:re2c" { + out.wraw(tok, ptr); + lex_end_of_comment(out); + goto echo; + } + "/*!max:re2c" { - if (opts->target != opt_t::DOT) - { - out.wdelay_yymaxfill (); - } - tok = pos = cur; - ignore_eoc = true; - goto echo; - } + out.wraw(tok, ptr); + out.wdelay_yymaxfill(); + lex_end_of_comment(out); + goto echo; + } + + "/*!maxnmatch:re2c" { + out.wraw(tok, ptr); + out.wdelay_yymaxnmatch(); + lex_end_of_comment(out); + goto echo; + } + "/*!getstate:re2c" { - tok = pos = cur; - out.wdelay_state_goto (opts->topIndent); - ignore_eoc = true; - goto echo; - } - "/*!ignore:re2c" { - tok = pos = cur; - ignore_eoc = true; - goto echo; - } + out.wraw(tok, ptr); + out.wdelay_state_goto(0); + lex_end_of_comment(out); + goto echo; + } + "/*!types:re2c" { - tok = pos = cur; - ignore_eoc = true; - if (opts->target != opt_t::DOT) - { - out.wdelay_line_info ().ws("\n") - .wdelay_types ().ws("\n") - .wline_info (cline, get_fname ().c_str ()); - } - goto echo; - } - "*" "/" "\r"? "\n" { - cline++; - if (ignore_eoc) - { - if (ignore_cnt) - { - out.wline_info (cline, get_fname ().c_str ()); - } - ignore_eoc = false; - ignore_cnt = 0; - } - else if (opts->target == opt_t::CODE) - { - out.wraw(tok, tok_len ()); - } - tok = pos = cur; - goto echo; - } - "*" "/" { - if (ignore_eoc) - { - if (ignore_cnt) - { - out.ws("\n").wline_info (cline, get_fname ().c_str ()); - } - ignore_eoc = false; - ignore_cnt = 0; - } - else if (opts->target == opt_t::CODE) - { - out.wraw(tok, tok_len ()); - } - tok = pos = cur; - goto echo; - } - "\n" space* "#" space* "line" space+ / lineinf { - set_sourceline (); - goto echo; - } - "\n" { - if (ignore_eoc) - { - ignore_cnt++; - } - else if (opts->target == opt_t::CODE) - { - out.wraw(tok, tok_len ()); - } - tok = pos = cur; - cline++; - goto echo; - } - zero { - if (!ignore_eoc && opts->target == opt_t::CODE) - { - out.wraw(tok, tok_len () - 1); - // -1 so we don't write out the \0 - } - if(cur == eof) - { - return Stop; - } - } - * { - goto echo; - } + out.wraw(tok, ptr); + out.wdelay_line_info(); + out.wdelay_types(); + out.wline_info(cline, get_fname().c_str()); + lex_end_of_comment(out); + goto echo; + } + + "/*!stags:re2c" { + out.wraw(tok, ptr); + lex_tags(out, false); + goto echo; + } + + "/*!mtags:re2c" { + out.wraw(tok, ptr); + lex_tags(out, true); + goto echo; + } + + zero { + if (cur != eof) goto echo; + out.wraw(tok, ptr); + return Stop; + } + + eol space* "#" space* "line" space+ / lineinf { + set_sourceline(); + goto echo; + } + + eol { + cline++; + pos = cur; + goto echo; + } + + * { goto echo; } */ } -int Scanner::scan() +void Scanner::lex_end_of_comment(OutputFile &out) +{ + uint32_t ignored = 0; + for (;;) {/*!re2c + zero { fatal_lc(get_cline(), get_column(), "expected end of block"); } + + * { continue; } + eol { ++ignored; continue; } + eoc { + if (ignored > 0) { + cline += ignored; + out.wline_info(cline, get_fname().c_str()); + } + tok = pos = cur; + return; + } + */} +} + +void Scanner::lex_tags(OutputFile &out, bool mtags) { - uint32_t depth; + std::string fmt, sep; + for (;;) {/*!re2c + * { fatal_lc(get_cline(), get_column(), "unrecognized configuration"); } + + "format" { fmt = lex_conf_string(); continue; } + "separator" { sep = lex_conf_string(); continue; } + + space+ { continue; } + eol { ++cline; continue; } + eoc { + out.wdelay_tags(new ConfTags(fmt, sep), mtags); + tok = pos = cur; + return; + } + */} +} +int Scanner::scan(const conopt_t *globopts) +{ + uint32_t depth, code_line; scan: tchar = cur - pos; - tline = cline; tok = cur; - switch (lexer_state) - { - case LEX_NORMAL: goto start; - case LEX_FLEX_NAME: goto flex_name; - } - -start: /*!re2c "{" { depth = 1; + code_line = cline; goto code; } @@ -244,6 +211,7 @@ start: ":=" { tok += 2; /* skip ":=" */ depth = 0; + code_line = cline; goto code; } @@ -261,78 +229,67 @@ start: return 0; } - "'" { yylval.regexp = lex_str('\'', opts->bCaseInsensitive || !opts->bCaseInverted); return TOKEN_REGEXP; } - "\"" { yylval.regexp = lex_str('"', opts->bCaseInsensitive || opts->bCaseInverted); return TOKEN_REGEXP; } + "'" { yylval.regexp = lex_str('\''); return TOKEN_REGEXP; } + "\"" { yylval.regexp = lex_str('"'); return TOKEN_REGEXP; } "[" { yylval.regexp = lex_cls(false); return TOKEN_REGEXP; } "[^" { yylval.regexp = lex_cls(true); return TOKEN_REGEXP; } - "<>" / (space* ("{" | "=>" | ":=")) { - return TOKEN_NOCOND; - } - ",()|=;/\\] { - return *tok; - } + [@#] name { + const std::string *name = new std::string(tok + 1, tok_len() - 1); + yylval.regexp = ast_tag(cline, get_column(), name, tok[0] == '#'); + return TOKEN_REGEXP; + } - "*" { - yylval.op = *tok; - return TOKEN_STAR; - } - [+?] { - yylval.op = *tok; - return TOKEN_CLOSE; - } + [*+?<>!,()|=;/\\] { return *tok; } "{" [0-9]+ "}" { - if (!s_to_u32_unsafe (tok + 1, cur - 1, yylval.extop.min)) + if (!s_to_u32_unsafe (tok + 1, cur - 1, yylval.bounds.min)) { - fatal ("repetition count overflow"); + fatal_lc(get_cline(), get_column(), "repetition count overflow"); } - yylval.extop.max = yylval.extop.min; + yylval.bounds.max = yylval.bounds.min; return TOKEN_CLOSESIZE; } "{" [0-9]+ "," [0-9]+ "}" { const char * p = strchr (tok, ','); - if (!s_to_u32_unsafe (tok + 1, p, yylval.extop.min)) + if (!s_to_u32_unsafe (tok + 1, p, yylval.bounds.min)) { - fatal ("repetition lower bound overflow"); + fatal_lc(get_cline(), get_column(), "repetition lower bound overflow"); } - if (!s_to_u32_unsafe (p + 1, cur - 1, yylval.extop.max)) + if (!s_to_u32_unsafe (p + 1, cur - 1, yylval.bounds.max)) { - fatal ("repetition upper bound overflow"); + fatal_lc(get_cline(), get_column(), "repetition upper bound overflow"); } return TOKEN_CLOSESIZE; } "{" [0-9]+ ",}" { - if (!s_to_u32_unsafe (tok + 1, cur - 2, yylval.extop.min)) + if (!s_to_u32_unsafe (tok + 1, cur - 2, yylval.bounds.min)) { - fatal ("repetition lower bound overflow"); + fatal_lc(get_cline(), get_column(), "repetition lower bound overflow"); } - yylval.extop.max = std::numeric_limits::max(); + yylval.bounds.max = std::numeric_limits::max(); return TOKEN_CLOSESIZE; } "{" [0-9]* "," { - fatal("illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers"); + fatal_lc(get_cline(), get_column(), "illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers"); } "{" name "}" { - if (!opts->FFlag) { - fatal("curly braces for names only allowed with -F switch"); + if (!globopts->FFlag) { + fatal_lc(get_cline(), get_column(), "curly braces for names only allowed with -F switch"); } yylval.str = new std::string (tok + 1, tok_len () - 2); // -2 to omit braces return TOKEN_ID; } - "re2c:" { lex_conf (); return TOKEN_CONF; } + "re2c:" { return TOKEN_CONF; } name / (space+ [^=>,]) { yylval.str = new std::string (tok, tok_len ()); - if (opts->FFlag) + if (globopts->FFlag) { lexer_state = LEX_FLEX_NAME; return TOKEN_FID; @@ -349,23 +306,24 @@ start: } name / [^] { - if (!opts->FFlag) { + if (!globopts->FFlag) { yylval.str = new std::string (tok, tok_len()); return TOKEN_ID; } else { - RegExp *r = NULL; - const bool casing = opts->bCaseInsensitive || opts->bCaseInverted; + std::vector *str = new std::vector; for (char *s = tok; s < cur; ++s) { - const uint32_t c = static_cast(*s); - r = doCat(r, casing ? ichr(c) : schr(c)); + const uint32_t + chr = static_cast(*s), + col = static_cast(s - tok); + str->push_back(ASTChar(chr, col)); } - yylval.regexp = r ? r : new NullOp; + yylval.regexp = ast_str(cline, get_column(), str, false); return TOKEN_REGEXP; } } "." { - yylval.regexp = mkDot(); + yylval.regexp = ast_dot(cline, get_column()); return TOKEN_REGEXP; } @@ -374,48 +332,38 @@ start: } eol space* "#" space* "line" space+ / lineinf { - set_sourceline (); - goto scan; - } + set_sourceline (); + return TOKEN_LINE_INFO; + } - eol { - if (cur == eof) return 0; - pos = cur; - cline++; - goto scan; - } + eol { + if (cur == eof) return 0; + pos = cur; + cline++; + if (lexer_state == LEX_FLEX_NAME) { + lexer_state = LEX_NORMAL; + return TOKEN_FID_END; + } else { + goto scan; + } + } * { - fatalf("unexpected character: '%c'", *tok); + fatal_lc(get_cline(), get_column(), "unexpected character: '%c'", *tok); goto scan; } */ -flex_name: -/*!re2c - eol - { - YYCURSOR = tok; - lexer_state = LEX_NORMAL; - return TOKEN_FID_END; - } - * - { - YYCURSOR = tok; - goto start; - } -*/ - code: /*!re2c "}" { if (depth == 0) { - fatal("Curly braces are not allowed after ':='"); + fatal_l(get_cline(), "Curly braces are not allowed after ':='"); } else if (--depth == 0) { - yylval.code = new Code (tok, tok_len (), get_fname (), tline); + yylval.code = new Code(get_fname (), code_line, tok, tok_len ()); return TOKEN_CODE; } goto code; @@ -423,7 +371,7 @@ code: "{" { if (depth == 0) { - fatal("Curly braces are not allowed after ':='"); + fatal_l(get_cline(), "Curly braces are not allowed after ':='"); } else { @@ -442,7 +390,7 @@ code: } else if (cur == eof) { - fatal("missing '}'"); + fatal_l(get_cline(), "missing '}'"); } pos = cur; cline++; @@ -456,12 +404,12 @@ code: { --cur; } - yylval.code = new Code (tok, tok_len (), get_fname (), tline); + yylval.code = new Code(get_fname (), code_line, tok, tok_len ()); return TOKEN_CODE; } else if (cur == eof) { - fatal("missing '}'"); + fatal_l(get_cline(), "missing '}'"); } pos = cur; cline++; @@ -472,7 +420,7 @@ code: { if (depth) { - fatal("missing '}'"); + fatal_l(get_cline(), "missing '}'"); } return 0; } @@ -488,7 +436,7 @@ code: comment: /*!re2c - "*/" { + "*" "/" { if (--depth == 0) { goto scan; @@ -498,9 +446,9 @@ comment: goto comment; } } - "/*" { + "/" "*" { ++depth; - fatal("ambiguous /* found"); + fatal_lc(get_cline(), get_column(), "ambiguous /* found"); goto comment; } "\n" space* "#" space* "line" space+ / lineinf { @@ -556,13 +504,15 @@ static void escape (std::string & dest, const std::string & src) } } -RegExp *Scanner::lex_cls(bool neg) +const AST *Scanner::lex_cls(bool neg) { - Range *r = NULL, *s; - uint32_t u, l; + std::vector *cls = new std::vector; + uint32_t u, l, c, c0 = get_column(); fst: + tok = cur; + c = get_column(); /*!re2c - "]" { goto end; } + "]" { return ast_cls(cline, c0, cls, neg); } "" { l = lex_cls_chr(); goto snd; } */ snd: @@ -571,33 +521,27 @@ snd: "-" / [^\]] { u = lex_cls_chr(); if (l > u) { - warn.swapped_range(get_line(), l, u); + warn.swapped_range(cline, l, u); std::swap(l, u); } goto add; } */ add: - if (!(s = opts->encoding.encodeRange(l, u))) { - fatalf ("Bad code point range: '0x%X - 0x%X'", l, u); - } - r = Range::add(r, s); + cls->push_back(ASTRange(l, u, c)); goto fst; -end: - if (neg) { - r = Range::sub(opts->encoding.fullRange(), r); - } - return cls(r); } uint32_t Scanner::lex_cls_chr() { tok = cur; + const uint32_t l = get_cline(), c = get_column(); /*!re2c - * { fatal ((tok - pos) - tchar, "syntax error"); } - esc [xXuU] { fatal ((tok - pos) - tchar, "syntax error in hexadecimal escape sequence"); } - esc [0-7] { fatal ((tok - pos) - tchar, "syntax error in octal escape sequence"); } - esc { fatal ((tok - pos) - tchar, "syntax error in escape sequence"); } + * { fatal_lc(l, c, "syntax error"); } + esc? eol { fatal_lc(l, c, "newline in character class"); } + esc [xXuU] { fatal_lc(l, c, "syntax error in hexadecimal escape sequence"); } + esc [0-7] { fatal_lc(l, c, "syntax error in octal escape sequence"); } + esc { fatal_lc(l, c, "syntax error in escape sequence"); } . \ esc { return static_cast(tok[0]); } esc_hex { return unesc_hex(tok, cur); } @@ -613,7 +557,7 @@ uint32_t Scanner::lex_cls_chr() esc "-" { return static_cast('-'); } esc "]" { return static_cast(']'); } esc . { - warn.useless_escape(tline, tok - pos, tok[1]); + warn.useless_escape(cline, get_column(), tok[1]); return static_cast(tok[1]); } */ @@ -623,11 +567,13 @@ uint32_t Scanner::lex_str_chr(char quote, bool &end) { end = false; tok = cur; + const uint32_t l = get_cline(), c = get_column(); /*!re2c - * { fatal ((tok - pos) - tchar, "syntax error"); } - esc [xXuU] { fatal ((tok - pos) - tchar, "syntax error in hexadecimal escape sequence"); } - esc [0-7] { fatal ((tok - pos) - tchar, "syntax error in octal escape sequence"); } - esc { fatal ((tok - pos) - tchar, "syntax error in escape sequence"); } + * { fatal_lc(l, c, "syntax error"); } + esc? eol { fatal_lc(l, c, "newline in character string"); } + esc [xXuU] { fatal_lc(l, c, "syntax error in hexadecimal escape sequence"); } + esc [0-7] { fatal_lc(l, c, "syntax error in octal escape sequence"); } + esc { fatal_lc(l, c, "syntax error in escape sequence"); } . \ esc { end = tok[0] == quote; @@ -645,22 +591,21 @@ uint32_t Scanner::lex_str_chr(char quote, bool &end) esc "\\" { return static_cast('\\'); } esc . { if (tok[1] != quote) { - warn.useless_escape(tline, tok - pos, tok[1]); + warn.useless_escape(cline, get_column(), tok[1]); } return static_cast(tok[1]); } */ } -RegExp *Scanner::lex_str(char quote, bool casing) +const AST *Scanner::lex_str(char quote) { - RegExp *r = NULL; + const uint32_t column = get_column(); + std::vector *str = new std::vector; for (bool end;;) { const uint32_t c = lex_str_chr(quote, end); - if (end) { - return r ? r : new NullOp; - } - r = doCat(r, casing ? ichr(c) : schr(c)); + if (end) return ast_str(cline, column, str, quote == '\''); + str->push_back(ASTChar(c, get_column())); } } @@ -672,7 +617,7 @@ sourceline: lineno { if (!s_to_u32_unsafe (tok, cur, cline)) { - fatal ("line number overflow"); + fatal_lc(get_cline(), get_column(), "line number overflow"); } goto sourceline; } diff --git a/src/ast/lex_conf.re b/src/ast/lex_conf.re new file mode 100644 index 0000000..4582413 --- /dev/null +++ b/src/ast/lex_conf.re @@ -0,0 +1,300 @@ +#include "src/util/c99_stdint.h" +#include + +#include "src/code/output.h" +#include "src/conf/msg.h" +#include "src/re/encoding/enc.h" +#include "src/ast/scanner.h" +#include "src/util/s_to_n32_unsafe.h" + +namespace re2c +{ + +// global re2c config (affects the whole file) +/*!re2c + re2c:define:YYCTYPE = "unsigned char"; + re2c:define:YYCURSOR = cur; + re2c:define:YYLIMIT = lim; + re2c:define:YYMARKER = mar; + re2c:define:YYCTXMARKER = ctx; + re2c:define:YYFILL = fill; + + // source code is in ASCII: pointers have type 'char *' + // but re2c makes an implicit assumption that YYCTYPE is unsigned + // when it generates comparisons + re2c:yych:conversion = 1; + + space = [ \t]; + + conf_assign = space* "=" space*; + + naked_char = . \ (space | [;]); + naked = (naked_char \ ['"]) naked_char*; + + number = "0" | ("-"? [1-9] [0-9]*); +*/ + +void Scanner::lex_conf(Opt &opts) +{ + tok = cur; + const uint32_t l = get_cline(), c = get_column(); +/*!re2c + "flags:" ("b" | "bit-vectors") { opts.set_bFlag(lex_conf_bool()); return; } + "flags:" ("d" | "debug-output") { opts.set_dFlag(lex_conf_bool()); return; } + "flags:" ("g" | "computed-gotos") { opts.set_gFlag(lex_conf_bool()); return; } + "flags:" ("i" | "no-debug-info") { opts.set_iFlag(lex_conf_bool()); return; } + "flags:" ("s" | "nested-ifs") { opts.set_sFlag(lex_conf_bool()); return; } + "flags:" ("T" | "tags") { opts.set_tags(lex_conf_bool()); return; } + "flags:" ("P" | "posix-captures") { opts.set_posix_captures(lex_conf_bool()); return; } + "flags:case-insensitive" { opts.set_bCaseInsensitive(lex_conf_bool()); return; } + "flags:case-inverted" { opts.set_bCaseInverted(lex_conf_bool()); return; } + "flags:lookahead" { opts.set_lookahead(lex_conf_bool()); return; } + "flags:optimize-tags" { opts.set_optimize_tags(lex_conf_bool()); return; } + "flags:eager-skip" { opts.set_eager_skip(lex_conf_bool()); return; } + + "flags:" ("e" | "ecb") { lex_conf_enc(Enc::EBCDIC, opts); return; } + "flags:" ("u" | "unicode") { lex_conf_enc(Enc::UTF32, opts); return; } + "flags:" ("w" | "wide-chars") { lex_conf_enc(Enc::UCS2, opts); return; } + "flags:" ("x" | "utf-16") { lex_conf_enc(Enc::UTF16, opts); return; } + "flags:" ("8" | "utf-8") { lex_conf_enc(Enc::UTF8, opts); return; } + + "flags:encoding-policy" { lex_conf_encoding_policy(opts); return; } + "flags:input" { lex_conf_input(opts); return; } + "flags:empty-class" { lex_conf_empty_class(opts); return; } + "flags:dfa-minimization" { lex_conf_dfa_minimization(opts); return; } + + "define:YYCONDTYPE" { opts.set_yycondtype (lex_conf_string ()); return; } + "define:YYGETCONDITION" { opts.set_cond_get (lex_conf_string ()); return; } + "define:YYGETCONDITION:naked" { opts.set_cond_get_naked (lex_conf_bool()); return; } + "define:YYSETCONDITION" { opts.set_cond_set (lex_conf_string ()); return; } + "define:YYSETCONDITION@cond" { opts.set_cond_set_arg (lex_conf_string ()); return; } + "define:YYSETCONDITION:naked" { opts.set_cond_set_naked (lex_conf_bool()); return; } + "condprefix" { opts.set_condPrefix (lex_conf_string ()); return; } + "condenumprefix" { opts.set_condEnumPrefix (lex_conf_string ()); return; } + "cond:divider" { opts.set_condDivider (lex_conf_string ()); return; } + "cond:divider@cond" { opts.set_condDividerParam (lex_conf_string ()); return; } + "cond:goto" { opts.set_condGoto (lex_conf_string ()); return; } + "cond:goto@cond" { opts.set_condGotoParam (lex_conf_string ()); return; } + "variable:yyctable" { opts.set_yyctable (lex_conf_string ()); return; } + + "define:YYGETSTATE" { opts.set_state_get (lex_conf_string ()); return; } + "define:YYGETSTATE:naked" { opts.set_state_get_naked (lex_conf_bool()); return; } + "define:YYSETSTATE" { opts.set_state_set (lex_conf_string ()); return; } + "define:YYSETSTATE:naked" { opts.set_state_set_naked (lex_conf_bool()); return; } + "define:YYSETSTATE@state" { opts.set_state_set_arg (lex_conf_string ()); return; } + "label:yyFillLabel" { opts.set_yyfilllabel (lex_conf_string ()); return; } + "label:yyNext" { opts.set_yynext (lex_conf_string ()); return; } + "state:abort" { opts.set_bUseStateAbort (lex_conf_bool()); return; } + "state:nextlabel" { opts.set_bUseStateNext (lex_conf_bool()); return; } + "variable:yyaccept" { opts.set_yyaccept (lex_conf_string ()); return; } + + "variable:yybm" { opts.set_yybm (lex_conf_string ()); return; } + "yybm:hex" { opts.set_yybmHexTable (lex_conf_bool()); return; } + "cgoto:threshold" + { + const int32_t n = lex_conf_number (); + if (n < 0) + { + fatal_lc(l, c, "configuration 'cgoto:threshold' must be nonnegative"); + } + opts.set_cGotoThreshold (static_cast (n)); + return; + } + "variable:yytarget" { opts.set_yytarget (lex_conf_string ()); return; } + + "define:YYCURSOR" { opts.set_yycursor (lex_conf_string ()); return; } + "define:YYMARKER" { opts.set_yymarker (lex_conf_string ()); return; } + "define:YYCTXMARKER" { opts.set_yyctxmarker (lex_conf_string ()); return; } + "define:YYLIMIT" { opts.set_yylimit (lex_conf_string ()); return; } + + "define:YYPEEK" { opts.set_yypeek (lex_conf_string ()); return; } + "define:YYSKIP" { opts.set_yyskip (lex_conf_string ()); return; } + "define:YYBACKUP" { opts.set_yybackup (lex_conf_string ()); return; } + "define:YYBACKUPCTX" { opts.set_yybackupctx (lex_conf_string ()); return; } + "define:YYRESTORE" { opts.set_yyrestore (lex_conf_string ()); return; } + "define:YYRESTORECTX" { opts.set_yyrestorectx (lex_conf_string ()); return; } + "define:YYRESTORETAG" { opts.set_yyrestoretag (lex_conf_string ()); return; } + "define:YYLESSTHAN" { opts.set_yylessthan (lex_conf_string ()); return; } + "define:YYSTAGN" { opts.set_yystagn (lex_conf_string ()); return; } + "define:YYSTAGP" { opts.set_yystagp (lex_conf_string ()); return; } + "define:YYMTAGN" { opts.set_yymtagn (lex_conf_string ()); return; } + "define:YYMTAGP" { opts.set_yymtagp (lex_conf_string ()); return; } + + "tags:prefix" { opts.set_tags_prefix (lex_conf_string ()); return; } + "tags:expression" { opts.set_tags_expression(lex_conf_string ()); return; } + + "indent:string" { opts.set_indString (lex_conf_string ()); return; } + "indent:top" + { + const int32_t n = lex_conf_number (); + if (n < 0) + { + fatal_lc(l, c, "configuration 'indent:top' must be nonnegative"); + } + opts.set_topIndent (static_cast (n)); + return; + } + + "define:YYDEBUG" { opts.set_yydebug (lex_conf_string ()); return; } + + "define:YYCTYPE" { opts.set_yyctype (lex_conf_string ()); return; } + "variable:yych" { opts.set_yych (lex_conf_string ()); return; } + "yych:conversion" { opts.set_yychConversion (lex_conf_bool()); return; } + "yych:emit" { opts.set_bEmitYYCh (lex_conf_bool()); return; } + + "define:YYFILL" { opts.set_fill (lex_conf_string ()); return; } + "yyfill:enable" { opts.set_fill_use (lex_conf_bool()); return; } + "define:YYFILL@len" { opts.set_fill_arg (lex_conf_string ()); return; } + "yyfill:parameter" { opts.set_fill_arg_use (lex_conf_bool()); return; } + "define:YYFILL:naked" { opts.set_fill_naked (lex_conf_bool()); return; } + "yyfill:check" { opts.set_fill_check (lex_conf_bool()); return; } + + "labelprefix" { opts.set_labelPrefix (lex_conf_string ()); return; } + + // try to lex number first, otherwize it would be lexed as a naked string + "startlabel" / conf_assign number { opts.set_startlabel_force (lex_conf_bool()); return; } + "startlabel" { opts.set_startlabel (lex_conf_string()); return; } + + // deprecated + "variable:yystable" { lex_conf_string (); return; } + + [a-zA-Z0-9_:-]* { + fatal_lc(l, c, "unrecognized configuration '%.*s'", + static_cast(cur - tok), tok); + } +*/ +} + +void Scanner::lex_conf_encoding_policy(Opt &opts) +{ + lex_conf_assign (); +/*!re2c + * { fatal_lc(get_cline(), get_column(), + "bad configuration value (expected: 'ignore', 'substitute', 'fail')"); } + "ignore" { opts.set_encoding_policy(Enc::POLICY_IGNORE); goto end; } + "substitute" { opts.set_encoding_policy(Enc::POLICY_SUBSTITUTE); goto end; } + "fail" { opts.set_encoding_policy(Enc::POLICY_FAIL); goto end; } +*/ +end: + lex_conf_semicolon(); +} + +void Scanner::lex_conf_input(Opt &opts) +{ + lex_conf_assign (); +/*!re2c + * { fatal_lc(get_cline(), get_column(), + "bad configuration value (expected: 'default', 'custom')"); } + "default" { opts.set_input_api(INPUT_DEFAULT); goto end; } + "custom" { opts.set_input_api(INPUT_CUSTOM); goto end; } +*/ +end: + lex_conf_semicolon(); +} + +void Scanner::lex_conf_empty_class(Opt &opts) +{ + lex_conf_assign (); +/*!re2c + * { fatal_lc(get_cline(), get_column(), + "bad configuration value (expected: 'match-empty', 'match-none', 'error')"); } + "match-empty" { opts.set_empty_class_policy(EMPTY_CLASS_MATCH_EMPTY); goto end; } + "match-none" { opts.set_empty_class_policy(EMPTY_CLASS_MATCH_NONE); goto end; } + "error" { opts.set_empty_class_policy(EMPTY_CLASS_ERROR); goto end; } +*/ +end: + lex_conf_semicolon(); +} + +void Scanner::lex_conf_dfa_minimization(Opt &opts) +{ + lex_conf_assign (); +/*!re2c + * { fatal_lc(get_cline(), get_column(), + "bad configuration value (expected: 'table', 'moore')"); } + "table" { opts.set_dfa_minimization(DFA_MINIMIZATION_TABLE); goto end; } + "moore" { opts.set_dfa_minimization(DFA_MINIMIZATION_MOORE); goto end; } +*/ +end: + lex_conf_semicolon(); +} + +void Scanner::lex_conf_enc(Enc::type_t enc, Opt &opts) +{ + if (lex_conf_bool()) { + opts.set_encoding(enc); + } else { + opts.unset_encoding(enc); + } +} + +void Scanner::lex_conf_assign () +{ +/*!re2c + * { fatal_lc(get_cline(), get_column(), "missing '=' in configuration"); } + conf_assign { return; } +*/ +} + +void Scanner::lex_conf_semicolon () +{ +/*!re2c + * { fatal_lc(get_cline(), get_column(), "missing ending ';' in configuration"); } + space* ";" { return; } +*/ +} + +bool Scanner::lex_conf_bool() +{ + return lex_conf_number() != 0; +} + +int32_t Scanner::lex_conf_number () +{ + lex_conf_assign (); + tok = cur; +/*!re2c + number { + int32_t n = 0; + if (!s_to_i32_unsafe (tok, cur, n)) { + fatal_lc(get_cline(), get_column(), "configuration value overflow"); + } + lex_conf_semicolon (); + return n; + } +*/ +} + +std::string Scanner::lex_conf_string () +{ + lex_conf_assign (); + std::string s; + tok = cur; +/*!re2c + ['"] { + const char quote = tok[0]; + for (bool end;;) { + const uint32_t c = lex_str_chr(quote, end); + if (end) { + goto end; + } + if (c > 0xFF) { + fatal_lc(get_cline(), get_column(), + "multibyte character in configuration string: 0x%X", c); + } else { + s += static_cast(c); + } + } + } + naked { + s = std::string(tok, tok_len()); + goto end; + } + "" { goto end; } +*/ +end: + lex_conf_semicolon (); + return s; +} + +} // end namespace re2c diff --git a/src/ast/normalize.cc b/src/ast/normalize.cc new file mode 100644 index 0000000..dda268d --- /dev/null +++ b/src/ast/normalize.cc @@ -0,0 +1,49 @@ +#include +#include + +#include "src/ast/ast.h" +#include "src/re/rule.h" + +namespace re2c { + +void normalize_ast(specs_t &specs) +{ + specs_t::iterator i, b = specs.begin(), e = specs.end(); + + // merge <*> rules and setup to all conditions except "0" + // star rules must have lower priority than normal rules + for (i = b; i != e && i->name != "*"; ++i); + if (i != e) { + const specs_t::iterator star = i; + + for (i = b; i != e; ++i) { + if (i == star || i->name == "0") continue; + + i->rules.insert(i->rules.end(), star->rules.begin(), star->rules.end()); + i->defs.insert(i->defs.end(), star->defs.begin(), star->defs.end()); + i->setup.insert(i->setup.end(), star->setup.begin(), star->setup.end()); + } + + specs.erase(star); + e = specs.end(); + } + + // merge default rule with the lowest priority + for (i = b; i != e; ++i) { + if (!i->defs.empty()) { + const Code *c = i->defs[0]; + const AST *r = ast_default(c->fline, 0); + i->rules.push_back(ASTRule(r, c)); + } + } + + // "0" condition must be the first one + for (i = b; i != e && i->name != "0"; ++i); + if (i != e && i != b) { + const spec_t zero = *i; + specs.erase(i); + specs.insert(specs.begin(), zero); + } +} + +} // namespace re2c diff --git a/src/ast/parser.h b/src/ast/parser.h new file mode 100644 index 0000000..88469ae --- /dev/null +++ b/src/ast/parser.h @@ -0,0 +1,32 @@ +#ifndef _RE2C_AST_PARSER_ +#define _RE2C_AST_PARSER_ + +#include +#include + +#include "src/ast/ast.h" +#include "src/ast/scanner.h" +#include "src/conf/msg.h" +#include "src/conf/opt.h" + +namespace re2c +{ + +class Scanner; +struct Opt; + +typedef std::set CondList; + +struct context_t +{ + Scanner &input; + specs_t &specs; + symtab_t &symtab; + Opt &opts; +}; + +void parse(Scanner &input, specs_t &specs, symtab_t &symtab, Opt &opts); + +} // namespace re2c + +#endif // _RE2C_AST_PARSER_ diff --git a/src/ast/parser.ypp b/src/ast/parser.ypp new file mode 100644 index 0000000..76a6a56 --- /dev/null +++ b/src/ast/parser.ypp @@ -0,0 +1,274 @@ +%{ + +#include "src/ast/parser.h" + +#define YYMALLOC malloc +#define YYFREE free + +using namespace re2c; + +extern "C" { + +int yylex(context_t &context); +void yyerror(context_t &context, const char*); + +} // extern "C" + +/* Bison version 1.875 emits a definition that is not working + * with several g++ version. Hence we disable it here. + */ +#if defined(__GNUC__) +#define __attribute__(x) +#endif + +static spec_t &find(specs_t &specs, const std::string &name) +{ + for (specs_t::iterator i = specs.begin(); i != specs.end(); ++i) { + if (i->name == name) return *i; + } + specs.push_back(spec_t(name)); + return specs.back(); +} + +%} + +%start spec + +%lex-param {re2c::context_t &context} +%parse-param {re2c::context_t &context} + +%union { + const re2c::AST * regexp; + re2c::Code * code; + char op; + re2c::ASTBounds bounds; + std::string * str; + re2c::CondList * clist; +}; + +%token TOKEN_CLOSESIZE +%token TOKEN_CODE +%token TOKEN_CONF +%token TOKEN_ID +%token TOKEN_FID +%token TOKEN_FID_END +%token TOKEN_LINE_INFO +%token TOKEN_REGEXP + +%type close closes +%type TOKEN_CLOSESIZE +%type TOKEN_CODE ccode +%type TOKEN_REGEXP trailexpr rule expr diff term factor primary +%type TOKEN_ID TOKEN_FID name +%type conds clist + +%% + +spec + : /* empty */ + | spec TOKEN_CONF { context.input.lex_conf(context.opts); } + | spec def + | spec rule + | spec TOKEN_LINE_INFO + ; + +def + : name expr enddef { + if (!context.symtab.insert(std::make_pair(*$1, $2)).second) { + fatal_l(context.input.get_cline(), "sym already defined"); + } + delete $1; + } + /* errors */ + | name expr '/' { + fatal_l(context.input.get_cline(), + "trailing contexts are not allowed in named definitions"); + }; + +name + : TOKEN_ID '=' { + $$ = $1; + } + | TOKEN_FID { + $$ = $1; + }; + +enddef: ';' | TOKEN_FID_END; + +rule + : trailexpr TOKEN_CODE { + find(context.specs, "").rules.push_back(ASTRule($1, $2)); + } + + | '*' TOKEN_CODE { + find(context.specs, "").defs.push_back($2); + } + + | '<' clist '>' trailexpr ccode { + for(CondList::const_iterator i = $2->begin(); i != $2->end(); ++i) { + find(context.specs, *i).rules.push_back(ASTRule($4, $5)); + } + delete $2; + } + + | '<' clist '>' '*' ccode { + for(CondList::const_iterator i = $2->begin(); i != $2->end(); ++i) { + find(context.specs, *i).defs.push_back($5); + } + delete $2; + } + + | '<' '!' clist '>' TOKEN_CODE { + for (CondList::const_iterator i = $3->begin(); i != $3->end(); ++i) { + find(context.specs, *i).setup.push_back($5); + } + delete $3; + } + + | '<' '>' ccode { + const AST *r = ast_nil(context.input.get_cline(), 0); + find(context.specs, "0").rules.push_back(ASTRule(r, $3)); + }; + +ccode + : TOKEN_CODE + + | '=' '>' TOKEN_ID TOKEN_CODE { + $$ = $4; + $$->cond = *$3; + delete $3; + } + + | ':' '=' '>' TOKEN_ID { + $$ = new Code(context.input.get_fname(), context.input.get_cline()); + $$->cond = *$4; + delete $4; + }; + +clist + : conds + | '*' { + $$ = new CondList; + $$->insert("*"); + }; + +conds + : TOKEN_ID { + $$ = new CondList; + $$->insert(*$1); + delete $1; + } + + | conds ',' TOKEN_ID { + $1->insert(*$3); + delete $3; + $$ = $1; + }; + +trailexpr + : expr { + $$ = ast_cap($1); + } | expr '/' expr { + $$ = ast_cat(ast_cap($1), + ast_cat(ast_tag(context.input.get_cline(), 0, NULL, false), $3)); + }; + +expr: + diff + { + $$ = $1; + } + | expr '|' diff + { + $$ = ast_alt($1, $3); + } +; + +diff: + term + { + $$ = $1; + } + | diff '\\' term + { + $$ = ast_diff($1, $3); + } +; + +term: + factor + { + $$ = $1; + } + | factor term // in POSIX concatenation is right-associative + { + $$ = ast_cat($1, $2); + } +; + +factor + : primary + | primary closes { + switch($2) { + case '*': $$ = ast_iter($1, 0, AST::MANY); break; + case '+': $$ = ast_iter($1, 1, AST::MANY); break; + case '?': $$ = ast_iter($1, 0, 1); break; + } + } | primary TOKEN_CLOSESIZE { + $$ = ast_iter($1, $2.min, $2.max); + }; + +closes + : close + | closes close { $$ = ($1 == $2) ? $1 : '*'; } + ; + +close + : '*' { $$ = '*'; } + | '+' { $$ = '+'; } + | '?' { $$ = '?'; } + ; + +primary + : TOKEN_REGEXP + | TOKEN_ID { + symtab_t::iterator i = context.symtab.find(*$1); + if (i == context.symtab.end()) { + fatal_l(context.input.get_cline(), + "undefined symbol '%s'", $1->c_str()); + } + $$ = i->second; + if (ast_need_wrap($$)) { + $$ = ast_ref($$, *$1); + } + delete $1; + } | '(' expr ')' { + $$ = ast_cap($2); + }; + +%% + +extern "C" { + +void yyerror(context_t &context, const char* s) +{ + fatal_l(context.input.get_cline(), "%s", s); +} + +int yylex(context_t &context) +{ + return context.input.scan(&context.opts.glob); +} + +} // extern "C" + +namespace re2c +{ + +void parse(Scanner &input, specs_t &specs, symtab_t &symtab, Opt &opts) +{ + context_t context = {input, specs, symtab, opts}; + yyparse(context); +} + +} // namespace re2c diff --git a/src/ast/scanner.cc b/src/ast/scanner.cc new file mode 100644 index 0000000..9dd4dcf --- /dev/null +++ b/src/ast/scanner.cc @@ -0,0 +1,98 @@ +#include +#include + +#include "src/ast/scanner.h" +#include "src/conf/msg.h" + +// used by Scanner::fatal_at and Scanner::fatalf +#if defined(_MSC_VER) && !defined(vsnprintf) +# define vsnprintf _vsnprintf +#endif + +namespace re2c { + +class Warn; + +const uint32_t Scanner::BSIZE = 8192; + +ScannerState::ScannerState () + : tok (NULL) + , ptr (NULL) + , cur (NULL) + , mar (NULL) + , pos (NULL) + , ctx (NULL) + , bot (NULL) + , lim (NULL) + , top (NULL) + , eof (NULL) + , tchar (0) + , cline (1) + , lexer_state (LEX_NORMAL) +{} + +Scanner::Scanner(Input &i, Warn &w) + : ScannerState(), in(i), warn(w) {} + +void Scanner::fill (uint32_t need) +{ + if(!eof) + { + /* Get rid of everything that was already parsed. */ + const ptrdiff_t diff = tok - bot; + if (diff > 0) + { + const size_t move = static_cast (top - tok); + memmove (bot, tok, move); + tok -= diff; + mar -= diff; + ptr -= diff; + cur -= diff; + pos -= diff; + lim -= diff; + ctx -= diff; + } + /* Increase buffer size. */ + if (BSIZE > need) + { + need = BSIZE; + } + if (static_cast (top - lim) < need) + { + const size_t copy = static_cast (lim - bot); + char * buf = new char[copy + need]; + if (!buf) + { + fatal("Out of memory"); + } + if (copy > 0) { + memcpy (buf, bot, copy); + } + tok = &buf[tok - bot]; + mar = &buf[mar - bot]; + ptr = &buf[ptr - bot]; + cur = &buf[cur - bot]; + pos = &buf[pos - bot]; + lim = &buf[lim - bot]; + top = &lim[need]; + ctx = &buf[ctx - bot]; + delete [] bot; + bot = buf; + } + /* Append to buffer. */ + const size_t have = fread (lim, 1, need, in.file); + if (have != need) + { + eof = &lim[have]; + *eof++ = '\0'; + } + lim += have; + } +} + +Scanner::~Scanner() +{ + delete [] bot; +} + +} // namespace re2c diff --git a/src/ast/scanner.h b/src/ast/scanner.h new file mode 100644 index 0000000..78c4737 --- /dev/null +++ b/src/ast/scanner.h @@ -0,0 +1,120 @@ +#ifndef _RE2C_AST_SCANNER_ +#define _RE2C_AST_SCANNER_ + +#include +#include "src/util/c99_stdint.h" +#include +#include + +#include "src/ast/input.h" +#include "src/conf/opt.h" +#include "src/conf/warn.h" +#include "src/re/encoding/enc.h" +#include "src/util/attribute.h" +#include "src/util/forbid_copy.h" + +namespace re2c +{ + +class Warn; +struct Opt; +struct conopt_t; +class OutputFile; +class Range; +struct AST; + +struct ScannerState +{ + enum lexer_state_t + { + LEX_NORMAL, + LEX_FLEX_NAME + }; + + // positioning + char * tok; + char * ptr; + char * cur; + char * mar; + char * pos; + char * ctx; + + // buffer + char * bot; + char * lim; + char * top; + char * eof; + + ptrdiff_t tchar; + uint32_t cline; + + lexer_state_t lexer_state; + + ScannerState(); + FORBID_COPY(ScannerState); +}; + +class Scanner: private ScannerState +{ + static const uint32_t BSIZE; + Input & in; + Warn &warn; + + void fill(uint32_t need); + void lex_end_of_comment(OutputFile &out); + void lex_tags(OutputFile &out, bool mtags); + void set_sourceline (); + uint32_t lex_cls_chr(); + uint32_t lex_str_chr(char quote, bool &end); + const AST *lex_cls(bool neg); + const AST *lex_str(char quote); + void lex_conf_encoding_policy(Opt &opts); + void lex_conf_input(Opt &opts); + void lex_conf_empty_class(Opt &opts); + void lex_conf_dfa_minimization(Opt &opts); + void lex_conf_enc(Enc::type_t enc, Opt &opts); + void lex_conf_assign(); + void lex_conf_semicolon(); + int32_t lex_conf_number(); + bool lex_conf_bool(); + std::string lex_conf_string(); + size_t tok_len () const; + +public: + enum ParseMode {Stop, Parse, Reuse, Rules}; + + Scanner(Input&, Warn &w); + ~Scanner(); + ParseMode echo(OutputFile &out); + int scan(const conopt_t *globopts); + void lex_conf(Opt &opts); + uint32_t get_cline() const; + uint32_t get_column() const; + const std::string & get_fname () const; + FORBID_COPY (Scanner); +}; + +inline size_t Scanner::tok_len () const +{ + // lexing and fill procedures must maintain: token pointer <= cursor pointer + return static_cast (cur - tok); +} + +inline const std::string & Scanner::get_fname () const +{ + return in.file_name; +} + +inline uint32_t Scanner::get_cline() const +{ + return cline; +} + +inline uint32_t Scanner::get_column() const +{ + return static_cast(tok - pos); +} + +} // end namespace re2c + +#endif // _RE2C_AST_SCANNER_ diff --git a/src/parse/unescape.cc b/src/ast/unescape.cc similarity index 97% rename from src/parse/unescape.cc rename to src/ast/unescape.cc index 0c17139..e685cdc 100644 --- a/src/parse/unescape.cc +++ b/src/ast/unescape.cc @@ -1,4 +1,4 @@ -#include "src/parse/unescape.h" +#include "src/ast/unescape.h" namespace re2c { diff --git a/src/parse/unescape.h b/src/ast/unescape.h similarity index 67% rename from src/parse/unescape.h rename to src/ast/unescape.h index 000c378..a37e6da 100644 --- a/src/parse/unescape.h +++ b/src/ast/unescape.h @@ -1,5 +1,5 @@ -#ifndef _RE2C_PARSE_UNESCAPE_ -#define _RE2C_PARSE_UNESCAPE_ +#ifndef _RE2C_AST_UNESCAPE_ +#define _RE2C_AST_UNESCAPE_ #include "src/util/c99_stdint.h" @@ -10,4 +10,4 @@ uint32_t unesc_oct (const char * s, const char * s_end); } // namespace re2c -#endif // _RE2C_PARSE_UNESCAPE_ +#endif // _RE2C_AST_UNESCAPE_ diff --git a/src/ast/validate.cc b/src/ast/validate.cc new file mode 100644 index 0000000..9f95f76 --- /dev/null +++ b/src/ast/validate.cc @@ -0,0 +1,99 @@ +#include "src/util/c99_stdint.h" +#include +#include + +#include "src/ast/ast.h" +#include "src/ast/scanner.h" +#include "src/conf/msg.h" +#include "src/re/rule.h" + +namespace re2c { + +void validate_mode(Scanner::ParseMode mode, bool rflag, bool rules, Scanner &input) +{ + const uint32_t l = input.get_cline(); + if (mode == Scanner::Rules) { + if (!rflag) { + fatal_l(l, "found 'rules:re2c' block without -r flag"); + } else if (rules) { + fatal_l(l, "cannot have a second 'rules:re2c' block"); + } + } else if (mode == Scanner::Reuse) { + if (!rflag) { + fatal_l(l, "found 'use:re2c' block without -r flag"); + } else if (!rules) { + fatal_l(l, "got 'use:re2c' without 'rules:re2c'"); + } + } else if (rflag) { + fatal_l(l, "found standard 're2c' block while using -r flag"); + } +} + +void validate_ast(const specs_t &specs, bool cflag) +{ + specs_t::const_iterator i, + b = specs.begin(), + e = specs.end(); + + for (i = b; i != e; ++i) { + if (i->defs.size() > 1) { + fatal_l(i->defs[1]->fline, + "code to default rule %sis already defined at line %u", + incond(i->name).c_str(), i->defs[0]->fline); + } + } + + if (!cflag) { + for (i = b; i != e; ++i) { + if (i->name != "") { + fatal_l(i->rules[0].code->fline, + "conditions are only allowed with '-c', '--conditions' option"); + } + } + } else { + for (i = b; i != e; ++i) { + if (i->name == "") { + fatal_l(i->rules[0].code->fline, + "non-conditional rules are not allowed" + " with '-c', '--conditions' option"); + } + } + + for (i = b; i != e; ++i) { + if (i->setup.size() > 1) { + fatal_l(i->setup[1]->fline, + "code to setup rule '%s' is already defined at line %u", + i->name.c_str(), i->setup[0]->fline); + } + } + + for (i = b; i != e; ++i) { + if (i->name != "*" && !i->setup.empty() && i->rules.empty()) { + fatal_l(i->setup[0]->fline, + "setup for non existing condition '%s' found", + i->name.c_str()); + } + } + + for (i = b; i != e && !i->setup.empty(); ++i); + if (i == e) { + for (i = b; i != e; ++i) { + if (i->name == "*") { + fatal_l(i->setup[0]->fline, + "setup for all conditions '' is illegal " + "if setup for each condition is defined explicitly"); + } + } + } + + for (i = b; i != e; ++i) { + if (i->name == "0" && i->rules.size() > 1) { + fatal_l(i->rules[1].code->fline, + "startup code is already defined at line %u", + i->rules[0].code->fline); + } + } + } +} + +} // namespace re2c diff --git a/src/code/bitmap.cc b/src/code/bitmap.cc new file mode 100644 index 0000000..36a9617 --- /dev/null +++ b/src/code/bitmap.cc @@ -0,0 +1,150 @@ +#include // memset +#include // min + +#include "src/code/bitmap.h" +#include "src/code/go.h" +#include "src/code/output.h" +#include "src/conf/opt.h" +#include "src/dfa/tcmd.h" + +namespace re2c +{ + +static bool matches(const Go *go1, const State *s1, const Go *go2, const State *s2); +static void doGen(const Go *g, const State *s, uint32_t *bm, uint32_t f, uint32_t m); + +bitmaps_t::bitmaps_t(uint32_t n) + : maps() + , ncunit(n) + , buffer(new uint32_t[ncunit]) + , used(false) +{} + +bitmaps_t::~bitmaps_t() +{ + delete[] buffer; +} + +void bitmaps_t::insert(const Go *go, const State *s) +{ + rciter_t i = maps.rbegin(), e = maps.rend(); + for (; i != e; ++i) { + if (matches(i->go, i->on, go, s)) return; + } + + bitmap_t b = {go, s, 0, 0}; + maps.push_back(b); +} + +const bitmap_t *bitmaps_t::find(const Go *go, const State *s) const +{ + rciter_t i = maps.rbegin(), e = maps.rend(); + for (; i != e; ++i) { + if (i->on == s && matches(i->go, i->on, go, s)) return &(*i); + } + return NULL; +} + +bool bitmaps_t::empty() const { return maps.empty(); } + +void bitmaps_t::gen(OutputFile &o, uint32_t ind) +{ + if (empty() || !used) return; + + const opt_t *opts = o.block().opts; + const uint32_t nmap = static_cast(maps.size()); + riter_t b = maps.rbegin(), e = maps.rend(); + + o.wind(ind).ws("static const unsigned char ") + .wstring(opts->yybm).ws("[] = {"); + + for (uint32_t i = 0, t = 1; b != e; i += ncunit, t += 8) { + memset(buffer, 0, ncunit * sizeof(uint32_t)); + + for (uint32_t m = 0x80; b != e && m; m >>= 1, ++b) { + b->i = i; + b->m = m; + doGen(b->go, b->on, buffer, 0, m); + } + + if (nmap > 8) { + o.ws("\n").wind(ind + 1).ws("/* table ").wu32(t).ws(" .. ") + .wu32(std::min(nmap, t + 7)).ws(": ").wu32(i).ws(" */"); + } + + for (uint32_t c = 0; c < ncunit; ++c) { + if (c % 8 == 0) { + o.ws("\n").wind(ind + 1); + } + if (opts->yybmHexTable) { + o.wu32_hex(buffer[c]); + } else { + o.wu32_width(buffer[c], 3); + } + o.ws(", "); + } + } + + o.ws("\n").wind(ind).ws("};\n"); +} + +void doGen(const Go *g, const State *s, uint32_t *bm, uint32_t f, uint32_t m) +{ + Span *b = g->span, *e = &b[g->nSpans]; + uint32_t lb = 0; + + for (; b < e; ++b) + { + if (b->to == s) + { + for (; lb < b->ub && lb < 256; ++lb) + { + bm[lb-f] |= m; + } + } + + lb = b->ub; + } +} + +// All spans in b1 that lead to s1 are pairwise equal to that in b2 leading to s2 +bool matches(const Go *go1, const State *s1, const Go *go2, const State *s2) +{ + const Span + *b1 = go1->span, *e1 = &b1[go1->nSpans], + *b2 = go2->span, *e2 = &b2[go2->nSpans]; + uint32_t lb1 = 0, lb2 = 0; + + for (;;) + { + for (; b1 < e1 && b1->to != s1; ++b1) + { + lb1 = b1->ub; + } + for (; b2 < e2 && b2->to != s2; ++b2) + { + lb2 = b2->ub; + } + if (b1 == e1) + { + return b2 == e2; + } + if (b2 == e2) + { + return false; + } + // tags are forbidden: transitions on different symbols + // might go to the same state, but have different tag sets + if (lb1 != lb2 + || b1->ub != b2->ub + || b1->tags != TCID0 + || b2->tags != TCID0) + { + return false; + } + ++b1; + ++b2; + } +} + +} // end namespace re2c diff --git a/src/code/bitmap.h b/src/code/bitmap.h new file mode 100644 index 0000000..4ece472 --- /dev/null +++ b/src/code/bitmap.h @@ -0,0 +1,48 @@ +#ifndef _RE2C_CODE_BITMAP_ +#define _RE2C_CODE_BITMAP_ + +#include "src/util/c99_stdint.h" +#include + +#include "src/util/forbid_copy.h" + +namespace re2c { + +class OutputFile; +struct Go; +struct Span; +struct State; + +struct bitmap_t +{ + const Go *go; + const State *on; + uint32_t i; + uint32_t m; +}; + +class bitmaps_t +{ + typedef std::vector maps_t; + typedef maps_t::reverse_iterator riter_t; + typedef maps_t::const_reverse_iterator rciter_t; + + maps_t maps; + uint32_t ncunit; + uint32_t *buffer; + +public: + bool used; + + explicit bitmaps_t(uint32_t n); + ~bitmaps_t(); + void insert(const Go *go, const State *s); + const bitmap_t *find(const Go *go, const State *s) const; + bool empty() const; + void gen(OutputFile &o, uint32_t ind); + FORBID_COPY(bitmaps_t); +}; + +} // namespace re2c + +#endif // _RE2C_CODE_BITMAP_ diff --git a/src/code/emit.h b/src/code/emit.h new file mode 100644 index 0000000..ddef595 --- /dev/null +++ b/src/code/emit.h @@ -0,0 +1,29 @@ +#ifndef _RE2C_CODE_EMIT_ +#define _RE2C_CODE_EMIT_ + +#include "src/code/output.h" +#include "src/adfa/adfa.h" + +namespace re2c { + +typedef std::vector code_lines_t; + +void emit_action(OutputFile &o, uint32_t ind, const DFA &dfa, const State *s, const std::set &used_labels); +void gen_goto_plain(OutputFile &o, uint32_t ind, const State *to, const DFA &dfa, tcid_t tcid, bool skip); +void gen_goto_case(OutputFile &o, uint32_t ind, const State *to, const DFA &dfa, tcid_t tcid, bool skip); +void gen_goto_if(OutputFile &o, uint32_t ind, const State *to, const DFA &dfa, tcid_t tcid, bool skip); +void gen_settags(code_lines_t &code, const DFA &dfa, tcid_t tcid, const opt_t *opts); +std::string vartag_name(tagver_t ver, const std::string &prefix); +std::string vartag_expr(tagver_t ver, const std::string &prefix, const std::string &expression); +std::string tagname(const Tag &tag); + +inline std::string indent(uint32_t n, const std::string &s) +{ + std::string ind; + for (; n --> 0; ind += s); + return ind; +} + +} // namespace re2c + +#endif // _RE2C_CODE_EMIT_ diff --git a/src/code/emit_action.cc b/src/code/emit_action.cc new file mode 100644 index 0000000..d37d41c --- /dev/null +++ b/src/code/emit_action.cc @@ -0,0 +1,473 @@ +#include +#include +#include "src/util/c99_stdint.h" +#include +#include +#include +#include +#include +#include + +#include "src/adfa/action.h" +#include "src/adfa/adfa.h" +#include "src/code/emit.h" +#include "src/code/go.h" +#include "src/code/input_api.h" +#include "src/code/label.h" +#include "src/code/output.h" +#include "src/conf/opt.h" +#include "src/dfa/tcmd.h" +#include "src/re/rule.h" +#include "src/re/tag.h" +#include "src/skeleton/skeleton.h" +#include "src/util/string_utils.h" + +namespace re2c +{ + +static void need (OutputFile &o, uint32_t ind, size_t some); +static void emit_accept_binary (OutputFile &o, uint32_t ind, const DFA &dfa, const accept_t &acc, size_t l, size_t r); +static void emit_accept (OutputFile &o, uint32_t ind, const DFA &dfa, const accept_t &acc); +static void emit_rule (OutputFile &o, uint32_t ind, const DFA &dfa, size_t rule_idx); +static void gen_fintags (OutputFile &o, uint32_t ind, const DFA &dfa, const Rule &rule); +static void gen_goto (code_lines_t &code, const State *to, const DFA &dfa, tcid_t tcid, const opt_t *opts, bool skip); +static bool endstate (const State *s); + +void emit_action(OutputFile &o, uint32_t ind, const DFA &dfa, + const State *s, const std::set &used_labels) +{ + const opt_t *opts = o.block().opts; + switch (s->action.type) { + case Action::MATCH: + o.wdelay_skip(ind, !opts->eager_skip); + need(o, ind, s->fill); + o.wdelay_peek(ind, !endstate(s)); + break; + case Action::INITIAL: { + const Initial &init = *s->action.info.initial; + const bool + backup = init.save != Initial::NOSAVE, + ul1 = used_labels.count(s->label); + if (ul1 && dfa.accepts.size() > 1 && backup) { + o.wind(ind).wstring(opts->yyaccept).ws(" = ").wu64(init.save).ws(";\n"); + } + o.wdelay_skip(ind, ul1 && !opts->eager_skip); + if (used_labels.count(init.label)) { + o.wstring(opts->labelPrefix).wlabel(init.label).wstring(":\n"); + } + if (opts->dFlag) { + o.wind(ind).wstring(opts->yydebug).ws("(").wlabel(init.label) + .ws(", *").wstring(opts->yycursor).ws(");\n"); + } + need(o, ind, s->fill); + o.wdelay_backup(ind, backup); + o.wdelay_peek(ind, !endstate(s)); + break; + } + case Action::SAVE: + if (dfa.accepts.size() > 1) { + o.wind(ind).wstring(opts->yyaccept).ws(" = ").wu64(s->action.info.save).ws(";\n"); + } + o.wdelay_skip(ind, !opts->eager_skip); + o.wdelay_backup(ind, true); + need(o, ind, s->fill); + o.wdelay_peek(ind, true); + break; + case Action::MOVE: + break; + case Action::ACCEPT: + emit_accept(o, ind, dfa, *s->action.info.accepts); + break; + case Action::RULE: + emit_rule(o, ind, dfa, s->action.info.rule); + break; + } +} + +void emit_accept_binary(OutputFile &o, uint32_t ind, const DFA &dfa, + const accept_t &acc, size_t l, size_t r) +{ + const opt_t *opts = o.block().opts; + if (l < r) { + const size_t m = (l + r) >> 1; + o.wind(ind).ws("if (").wstring(opts->yyaccept) + .ws(r == l+1 ? " == " : " <= ").wu64(m).ws(") {\n"); + emit_accept_binary (o, ++ind, dfa, acc, l, m); + o.wind(--ind).ws("} else {\n"); + emit_accept_binary (o, ++ind, dfa, acc, m + 1, r); + o.wind(--ind).ws("}\n"); + } else { + gen_goto_plain(o, ind, acc[l].first, dfa, acc[l].second, false); + } +} + +void emit_accept(OutputFile &o, uint32_t ind, const DFA &dfa, const accept_t &acc) +{ + const opt_t *opts = o.block().opts; + const size_t nacc = acc.size(); + + if (nacc == 0) return; + + o.wstring(output_restore(ind, opts)); + + // only one possible 'yyaccept' value: unconditional jump + if (nacc == 1) { + gen_goto_plain(o, ind, acc[0].first, dfa, acc[0].second, false); + return; + } + + bool have_tags = false; + for (size_t i = 0; i < nacc; ++i) { + if (acc[i].second != TCID0) { + have_tags = true; + break; + } + } + + // jump table + if (opts->gFlag && nacc >= opts->cGotoThreshold && !have_tags) { + o.wind(ind).ws("{\n") + .wind(ind + 1).ws("static void *") + .wstring(opts->yytarget).ws("[") + .wu64(nacc).ws("] = {\n"); + for (uint32_t i = 0; i < nacc; ++i) { + o.wind(ind + 2).ws("&&").wstring(opts->labelPrefix) + .wlabel(acc[i].first->label).ws(",\n"); + } + o.wind(ind + 1).ws("};\n") + .wind(ind + 1).ws("goto *") + .wstring(opts->yytarget).ws("[") + .wstring(opts->yyaccept).ws("];\n") + .wind(ind).ws("}\n"); + return; + } + + // nested ifs + if (opts->sFlag || nacc == 2) { + emit_accept_binary(o, ind, dfa, acc, 0, nacc - 1); + return; + } + + // switch + o.wind(ind).ws("switch (").wstring(opts->yyaccept).ws(") {\n"); + for (uint32_t i = 0; i < nacc - 1; ++i) { + o.wind(ind).ws("case ").wu32(i).ws(": "); + gen_goto_case(o, ind, acc[i].first, dfa, acc[i].second, false); + } + o.wind(ind).ws("default:"); + gen_goto_case(o, ind, acc[nacc - 1].first, dfa, acc[nacc - 1].second, false); + o.wind(ind).ws("}\n"); +} + +void emit_rule(OutputFile &o, uint32_t ind, const DFA &dfa, size_t rule_idx) +{ + const opt_t *opts = o.block().opts; + const Rule &rule = dfa.rules[rule_idx]; + const Code *code = rule.code; + const std::string &cond = code->cond; + std::string s; + + gen_fintags(o, ind, dfa, rule); + + if (opts->target == TARGET_SKELETON) { + emit_action(o, ind, dfa, rule_idx); + } else { + if (!cond.empty() && dfa.cond != cond) { + strrreplace(s = opts->cond_set, opts->cond_set_arg, opts->condEnumPrefix + cond); + o.wind(ind).wstring(s); + if (!opts->cond_set_naked) { + o.ws("(").wstring(opts->condEnumPrefix).wstring(cond).ws(");"); + } + o.ws("\n"); + } + if (!code->autogen) { + if (!dfa.setup.empty()) { + o.wind(ind).wstring(dfa.setup).ws("\n"); + } + o.wline_info(code->fline, code->fname.c_str()) + .wind(ind).wstring(code->text).ws("\n") + .wdelay_line_info(); + } else if (!cond.empty()) { + strrreplace(s = opts->condGoto, opts->condGotoParam, opts->condPrefix + cond); + o.wind(ind).wstring(s).ws("\n"); + } + } +} + +void need(OutputFile &o, uint32_t ind, size_t some) +{ + if (some == 0) return; + + const opt_t *opts = o.block().opts; + std::string s; + + if (opts->fFlag) { + strrreplace(s = opts->state_set, opts->state_set_arg, o.fill_index); + o.wind(ind).wstring(s); + if (!opts->state_set_naked) { + o.ws("(").wu32(o.fill_index).ws(");"); + } + o.ws("\n"); + } + + if (opts->fill_use) { + o.wind(ind); + if (opts->fill_check) { + o.ws("if (").wstring(output_expr_lessthan(some, opts)).ws(") "); + } + strrreplace(s = opts->fill, opts->fill_arg, some); + o.wstring(s); + if (!opts->fill_naked) { + if (opts->fill_arg_use) { + o.ws("(").wu64(some).ws(")"); + } + o.ws(";"); + } + o.ws("\n"); + } + + if (opts->fFlag) { + o.wstring(opts->yyfilllabel).wu32(o.fill_index).ws(":\n"); + ++o.fill_index; + } +} + +void gen_goto_case(OutputFile &o, uint32_t ind, const State *to, + const DFA &dfa, tcid_t tcid, bool skip) +{ + code_lines_t code; + gen_goto(code, to, dfa, tcid, o.block().opts, skip); + const size_t lines = code.size(); + + if (lines == 1) { + o.wind(1).wstring(code[0]); + } else { + o.ws("\n"); + for (size_t i = 0; i < lines; ++i) { + o.wind(ind + 1).wstring(code[i]); + } + } +} + +void gen_goto_if(OutputFile &o, uint32_t ind, const State *to, + const DFA &dfa, tcid_t tcid, bool skip) +{ + code_lines_t code; + gen_goto(code, to, dfa, tcid, o.block().opts, skip); + const size_t lines = code.size(); + + if (lines == 1) { + o.wstring(code[0]); + } else { + o.ws("{\n"); + for (size_t i = 0; i < lines; ++i) { + o.wind(ind + 1).wstring(code[i]); + } + o.wind(ind).ws("}\n"); + } +} + +void gen_goto_plain(OutputFile &o, uint32_t ind, const State *to, + const DFA &dfa, tcid_t tcid, bool skip) +{ + code_lines_t code; + gen_goto(code, to, dfa, tcid, o.block().opts, skip); + const size_t lines = code.size(); + + for (size_t i = 0; i < lines; ++i) { + o.wind(ind).wstring(code[i]); + } +} + +void gen_goto(code_lines_t &code, const State *to, const DFA &dfa, + tcid_t tcid, const opt_t *opts, bool skip) +{ + std::ostringstream s; + output_skip(s, 0, opts); + + if (skip && !opts->lookahead) { + code.push_back(s.str()); + } + gen_settags(code, dfa, tcid, opts); + if (skip && opts->lookahead) { + code.push_back(s.str()); + } + if (to) { + code.push_back("goto " + opts->labelPrefix + + to_string(to->label) + ";\n"); + } +} + +void gen_settags(code_lines_t &code, const DFA &dfa, tcid_t tcid, const opt_t *opts) +{ + const bool generic = opts->input_api == INPUT_CUSTOM; + const std::string + &prefix = opts->tags_prefix, + &expression = opts->tags_expression; + const tcmd_t *cmd = dfa.tcpool[tcid]; + + // single tag YYCTXMARKER, backwards compatibility + if (cmd && dfa.oldstyle_ctxmarker) { + const std::string s = generic + ? opts->yybackupctx + " ();\n" + : opts->yyctxmarker + " = " + opts->yycursor + ";\n"; + code.push_back(s); + return; + } + + for (const tcmd_t *p = cmd; p; p = p->next) { + const tagver_t l = p->lhs, r = p->rhs, *h = p->history; + + // copy command + if (tcmd_t::iscopy(p)) { + const std::string + le = vartag_expr(l, prefix, expression), + re = vartag_expr(r, prefix, expression), + s = le + " = " + re + ";\n"; + code.push_back(s); + + // save command; history + } else if (tcmd_t::isadd(p)) { + const std::string + le = vartag_expr(l, prefix, expression), + re = vartag_expr(r, prefix, expression); + if (l != r) { + const std::string s = le + " = " + re + ";\n"; + code.push_back(s); + } + code_lines_t code1; + for (; *h != TAGVER_ZERO; ++h) { + const std::string s = *h == TAGVER_BOTTOM + ? opts->yymtagn + " (" + le + ");\n" + : opts->yymtagp + " (" + le + ");\n"; + code1.push_back(s); + } + code.insert(code.end(), code1.rbegin(), code1.rend()); + + // save command; no history; generic API + } else if (generic) { + const std::string + v = vartag_expr(l, prefix, expression), + s = *h == TAGVER_BOTTOM + ? opts->yystagn + " (" + v + ");\n" + : opts->yystagp + " (" + v + ");\n"; + code.push_back(s); + + // save command; no history; default API + } else { + std::string s1 = "", s2 = ""; + for (const tcmd_t *q = p; q && tcmd_t::isset(q); p = q, q = q->next) { + std::string &s = q->history[0] == TAGVER_BOTTOM ? s1 : s2; + s += vartag_expr(q->lhs, prefix, expression) + " = "; + } + if (!s1.empty()) { + s1 += "NULL;\n"; + code.push_back(s1); + } + if (!s2.empty()) { + s2 += opts->yycursor + ";\n"; + code.push_back(s2); + } + } + } +} + +void gen_fintags(OutputFile &o, uint32_t ind, const DFA &dfa, const Rule &rule) +{ + const opt_t *opts = o.block().opts; + const bool generic = opts->input_api == INPUT_CUSTOM; + const std::string + &prefix = opts->tags_prefix, + &expression = opts->tags_expression; + std::string expr; + const std::vector &tags = dfa.tags; + const tagver_t *fins = dfa.finvers; + + if (rule.ncap > 0) { + o.wind(ind).ws("yynmatch = ").wu64(rule.ncap).ws(";\n"); + } + + // variable tags + for (size_t t = rule.ltag; t < rule.htag; ++t) { + const Tag &tag = tags[t]; + + // see note [fixed and variable tags] + if (fictive(tag) || fixed(tag)) continue; + + expr = vartag_expr(fins[t], prefix, expression); + + o.wind(ind); + if (!trailing(tag)) { + o.wstring(tagname(tag)).ws(" = ").wstring(expr); + } else if (generic) { + if (dfa.oldstyle_ctxmarker) { + o.wstring(opts->yyrestorectx).ws(" ()"); + } else { + o.wstring(opts->yyrestoretag).ws(" (").wstring(expr).ws(")"); + } + } else { + if (dfa.oldstyle_ctxmarker) { + o.wstring(opts->yycursor).ws(" = ").wstring(opts->yyctxmarker); + } else { + o.wstring(opts->yycursor).ws(" = ").wstring(expr); + } + } + o.ws(";\n"); + } + + // fixed tags + for (size_t t = rule.ltag; t < rule.htag; ++t) { + const Tag &tag = tags[t]; + + // see note [fixed and variable tags] + if (fictive(tag) || !fixed(tag)) continue; + + const size_t dist = tag.dist; + const bool fixed_on_cursor = tag.base == Tag::RIGHTMOST; + expr = fixed_on_cursor ? opts->yycursor + : vartag_expr(fins[tag.base], prefix, expression); + + o.wind(ind); + if (generic) { + assert(dist == 0); + if (!trailing(tag)) { + o.wstring(tagname(tag)).ws(" = ").wstring(expr); + } else if (!fixed_on_cursor) { + assert(!dfa.oldstyle_ctxmarker); + o.wstring(opts->yyrestoretag).ws(" (").wstring(expr).ws(")"); + } + } else { + if (!trailing(tag)) { + o.wstring(tagname(tag)).ws(" = ").wstring(expr); + if (dist > 0) o.ws(" - ").wu64(dist); + } else if (!fixed_on_cursor) { + o.wstring(opts->yycursor).ws(" = ").wstring(expr); + if (dist > 0) o.ws(" - ").wu64(dist); + } else if (dist > 0) { + o.wstring(opts->yycursor).ws(" -= ").wu64(dist); + } + } + o.ws(";\n"); + } +} + +std::string tagname(const Tag &tag) +{ + assert(!trailing(tag)); + return capture(tag) + ? "yypmatch[" + to_string(tag.ncap) + "]" + : *tag.name; +} + +bool endstate(const State *s) +{ + // 'end' state is a state which has no outgoing transitions on symbols + // usually 'end' states are final states (not all final states are 'end' + // states), but sometimes 'end' state happens to be initial non-accepting + // state, e.g. in case of rule '[]' + const Action::type_t &a = s->go.span[0].to->action.type; + return s->go.nSpans == 1 + && (a == Action::RULE || a == Action::ACCEPT); +} + +} // namespace re2c diff --git a/src/code/emit_dfa.cc b/src/code/emit_dfa.cc new file mode 100644 index 0000000..18c600a --- /dev/null +++ b/src/code/emit_dfa.cc @@ -0,0 +1,285 @@ +#include +#include "src/util/c99_stdint.h" +#include +#include +#include +#include +#include +#include + +#include "src/adfa/action.h" +#include "src/adfa/adfa.h" +#include "src/code/bitmap.h" +#include "src/code/emit.h" +#include "src/code/go.h" +#include "src/code/input_api.h" +#include "src/code/label.h" +#include "src/code/output.h" +#include "src/conf/opt.h" +#include "src/re/rule.h" +#include "src/re/tag.h" +#include "src/skeleton/skeleton.h" +#include "src/util/counter.h" +#include "src/util/string_utils.h" + +namespace re2c +{ + +static void emit_state(OutputFile & o, uint32_t ind, const State * s, bool used_label); + +void emit_state (OutputFile & o, uint32_t ind, const State * s, bool used_label) +{ + const opt_t *opts = o.block().opts; + if (used_label) + { + o.wstring(opts->labelPrefix).wlabel(s->label).ws(":\n"); + } + if (opts->dFlag && (s->action.type != Action::INITIAL)) + { + o.wind(ind).wstring(opts->yydebug).ws("(").wlabel(s->label).ws(", ").wstring(output_expr_peek(opts)).ws(");\n"); + } +} + +void DFA::count_used_labels (std::set & used, label_t start, + label_t initial, bool force_start, bool fFlag) const +{ + // In '-f' mode, default state is always state 0 + if (fFlag) + { + used.insert (label_t::first ()); + } + if (force_start) + { + used.insert (start); + } + for (State * s = head; s; s = s->next) + { + s->go.used_labels (used); + } + for (uint32_t i = 0; i < accepts.size (); ++i) + { + used.insert (accepts[i].first->label); + } + // must go last: it needs the set of used labels + if (used.count (head->label)) + { + used.insert (initial); + } +} + +void DFA::emit_body(OutputFile &o, uint32_t& ind, + const std::set &used_labels, label_t initial) const +{ + code_lines_t code; + gen_settags(code, *this, tags0, o.block().opts); + for (size_t i = 0; i < code.size(); ++i) { + o.wind(ind).wstring(code[i]); + } + + // If DFA has transitions to initial state, then initial state + // has a piece of code that advances input position. Wee must + // skip it when entering DFA. + if (used_labels.count(head->label)) { + o.wind(ind).ws("goto ").wstring(o.block().opts->labelPrefix) + .wlabel(initial).ws(";\n"); + } + + for (State * s = head; s; s = s->next) { + emit_state(o, ind, s, used_labels.count(s->label)); + emit_action(o, ind, *this, s, used_labels); + s->go.emit(o, ind, *this); + } +} + +void DFA::emit_dot(OutputFile &o, bool last_cond) const +{ + const opt_t *opts = o.block().opts; + if (!opts->cFlag || !o.cond_goto) { + o.ws("digraph re2c {\n"); + } + o.wdelay_cond_goto(0); + if (opts->cFlag) { + o.wstring(cond).ws(" -> ").wlabel(head->label).ws("\n"); + } + for (State *s = head; s; s = s->next) { + if (s->action.type == Action::ACCEPT) { + const accept_t &accs = *s->action.info.accepts; + for (uint32_t i = 0; i < accs.size(); ++i) { + o.wlabel(s->label).ws(" -> ") + .wlabel(accs[i].first->label) + .ws(" [label=\"yyaccept=") + .wu32(i).ws("\"]").ws("\n"); + } + } else if (s->action.type == Action::RULE) { + const Code *code = rules[s->action.info.rule].code; + if (!code->autogen) { + o.wlabel(s->label).ws(" [label=\"") + .wstring(code->fname) + .ws(":").wu32(code->fline) + .ws("\"]").ws("\n"); + } + } + s->go.emit(o, 0, *this); + } + if (!opts->cFlag || last_cond) { + o.ws("}\n"); + } +} + +void DFA::emit(Output & output, uint32_t& ind, bool isLastCond, bool& bPrologBrace) +{ + OutputFile &o = output.source; + OutputBlock &ob = o.block(); + const opt_t *opts = ob.opts; + + std::set stagnames, stagvars, mtagnames, mtagvars; + if (!oldstyle_ctxmarker) { + for (size_t i = 0; i < tags.size(); ++i) { + const Tag &tag = tags[i]; + if (history(tag)) { + mtagvars.insert(*tag.name); + } else if (tag.name) { + stagvars.insert(*tag.name); + } + } + for (tagver_t v = 1; v <= maxtagver; ++v) { + const std::string s = vartag_name(v, opts->tags_prefix); + if (mtagvers.find(v) != mtagvers.end()) { + mtagnames.insert(s); + } else { + stagnames.insert(s); + } + } + ob.stags.insert(stagnames.begin(), stagnames.end()); + ob.mtags.insert(mtagnames.begin(), mtagnames.end()); + } + if (!cond.empty()) o.block().types.push_back(cond); + + bool bProlog = (!opts->cFlag || !o.cond_goto); + + // start_label points to the beginning of current re2c block + // (prior to condition dispatch in '-c' mode) + // it can forced by configuration 're2c:startlabel = ;' + label_t start_label = o.label_counter.next (); + // initial_label points to the beginning of DFA + // in '-c' mode this is NOT equal to start_label + label_t initial_label = bProlog && opts->cFlag + ? o.label_counter.next () + : start_label; + for (State * s = head; s; s = s->next) + { + s->label = o.label_counter.next (); + } + std::set used_labels; + count_used_labels (used_labels, start_label, initial_label, + opts->startlabel_force && opts->startlabel.empty(), opts->fFlag); + + head->action.set_initial(initial_label); + + if (opts->target == TARGET_SKELETON) { + if (output.skeletons.insert (name).second) + { + emit_start(o, max_fill, max_nmatch, name, key_size, def_rule, + need_backup, need_accept, oldstyle_ctxmarker, + stagnames, stagvars, mtagnames, mtagvars, bitmaps); + uint32_t i = 2; + emit_body (o, i, used_labels, initial_label); + emit_end(o, name, need_backup, oldstyle_ctxmarker, mtagnames); + } + } else if (opts->target == TARGET_DOT) { + emit_dot(o, isLastCond); + } else { + // Generate prolog + if (bProlog) + { + o.ws("\n").wdelay_line_info (); + if ((!opts->fFlag && ob.used_yyaccept) + || (!opts->fFlag && opts->bEmitYYCh) + || (opts->bFlag && !opts->cFlag && !bitmaps.empty()) + || (opts->cFlag && !o.cond_goto && opts->gFlag) + || (opts->fFlag && !o.state_goto && opts->gFlag) + ) + { + bPrologBrace = true; + o.wind(ind++).ws("{\n"); + } + else if (ind == 0) + { + ind = 1; + } + if (!opts->fFlag) + { + if (opts->bEmitYYCh) + { + o.wind(ind).wstring(opts->yyctype).ws(" ").wstring(opts->yych).ws(";\n"); + } + o.wdelay_yyaccept_init (ind); + } + else + { + o.ws("\n"); + } + } + if (opts->bFlag && !opts->cFlag) + { + bitmaps.gen(o, ind); + } + if (bProlog) + { + o.wdelay_cond_table(ind); + o.wdelay_state_goto (ind); + if (opts->cFlag) + { + if (used_labels.count(start_label)) + { + o.wstring(opts->labelPrefix).wlabel(start_label).ws(":\n"); + } + } + o.wuser_start_label (); + o.wdelay_cond_goto(ind); + } + if (opts->cFlag && !cond.empty()) + { + if (opts->condDivider.length()) + { + std::string divider = opts->condDivider; + strrreplace(divider, opts->condDividerParam, cond); + o.wstring(divider).ws("\n"); + } + o.wstring(opts->condPrefix).wstring(cond).ws(":\n"); + } + if (opts->cFlag && opts->bFlag && !bitmaps.empty()) + { + o.wind(ind++).ws("{\n"); + bitmaps.gen(o, ind); + } + // Generate code + emit_body (o, ind, used_labels, initial_label); + if (opts->cFlag && opts->bFlag && !bitmaps.empty()) + { + o.wind(--ind).ws("}\n"); + } + // Generate epilog + if ((!opts->cFlag || isLastCond) && bPrologBrace) + { + o.wind(--ind).ws("}\n"); + } + } +} + +std::string vartag_name(tagver_t ver, const std::string &prefix) +{ + std::ostringstream s; + s << prefix << ver; + return s.str(); +} + +std::string vartag_expr(tagver_t ver, const std::string &prefix, const std::string &expression) +{ + const std::string s = vartag_name(ver, prefix); + std::string e = expression; + strrreplace(e, "@@", s); + return e; +} + +} // end namespace re2c diff --git a/src/code/go.h b/src/code/go.h new file mode 100644 index 0000000..40b3df9 --- /dev/null +++ b/src/code/go.h @@ -0,0 +1,240 @@ +#ifndef _RE2C_CODE_GO_ +#define _RE2C_CODE_GO_ + +#include +#include +#include + +#include "src/code/output.h" +#include "src/dfa/tcmd.h" +#include "src/util/c99_stdint.h" +#include "src/util/forbid_copy.h" + +namespace re2c +{ + +struct DFA; +struct bitmap_t; +class bitmaps_t; +struct State; +struct If; + +struct Span +{ + uint32_t ub; + State * to; + tcid_t tags; + + FORBID_COPY (Span); +}; + +struct Case +{ + std::vector > ranges; + const State *to; + tcid_t tags; + bool skip; + + void emit(OutputFile &o, uint32_t ind) const; + inline Case(): ranges(), to(NULL), tags(TCID0), skip(false) {} + FORBID_COPY(Case); +}; + +struct Cases +{ + Case *cases; + uint32_t cases_size; + + void add(uint32_t lb, uint32_t ub, State *to, tcid_t tags, bool skip); + Cases(const Span *spans, uint32_t nspans, bool skip); + ~Cases(); + void emit(OutputFile &o, uint32_t ind, const DFA &dfa) const; + void used_labels(std::set &used) const; + FORBID_COPY(Cases); +}; + +struct Cond +{ + std::string compare; + uint32_t value; + Cond (const std::string & cmp, uint32_t val); +}; + +struct Binary +{ + Cond * cond; + If * thn; + If * els; + Binary (const Span * s, uint32_t n, const State * next, bool skip); + ~Binary (); + void emit (OutputFile &o, uint32_t ind, const DFA &dfa) const; + void used_labels (std::set & used) const; + + FORBID_COPY (Binary); +}; + +struct Linear +{ + struct Branch + { + const Cond *cond; + const State *to; + tcid_t tags; + bool skip; + }; + + size_t nbranches; + Branch *branches; + + Linear(const Span *s, uint32_t n, const State *next, bool skip); + ~Linear(); + void add_branch(const Cond *cond, const State *to, tcid_t tags, bool skip); + void emit(OutputFile &o, uint32_t ind, const DFA &dfa) const; + void used_labels(std::set &used) const; + FORBID_COPY(Linear); +}; + +struct If +{ + enum type_t + { + BINARY, + LINEAR + } type; + union + { + Binary * binary; + Linear * linear; + } info; + If (type_t t, const Span * sp, uint32_t nsp, const State * next, bool skip); + ~If (); + void emit (OutputFile & o, uint32_t ind, const DFA &dfa) const; + void used_labels (std::set & used) const; +}; + +struct SwitchIf +{ + enum + { + SWITCH, + IF + } type; + union + { + Cases * cases; + If * ifs; + } info; + SwitchIf (const Span * sp, uint32_t nsp, const State * next, bool sflag, bool skip); + ~SwitchIf (); + void emit (OutputFile & o, uint32_t ind, const DFA &dfa) const; + void used_labels (std::set & used) const; +}; + +struct GoBitmap +{ + const bitmap_t * bitmap; + const State * bitmap_state; + SwitchIf * hgo; + SwitchIf * lgo; + GoBitmap (const Span * span, uint32_t nSpans, const Span * hspan, + uint32_t hSpans, const bitmap_t * bm, const State * bm_state, + const State * next, bool sflag); + ~GoBitmap (); + void emit (OutputFile & o, uint32_t ind, const DFA &dfa) const; + void used_labels (std::set & used) const; + + FORBID_COPY (GoBitmap); +}; + +struct CpgotoTable +{ + static const uint32_t TABLE_SIZE; + const State ** table; + CpgotoTable (const Span * span, uint32_t nSpans); + ~CpgotoTable (); + void emit (OutputFile & o, uint32_t ind) const; + void used_labels (std::set & used) const; + +private: + label_t max_label () const; + + FORBID_COPY (CpgotoTable); +}; + +struct Cpgoto +{ + SwitchIf * hgo; + CpgotoTable * table; + Cpgoto (const Span * span, uint32_t nSpans, const Span * hspan, + uint32_t hSpans, const State * next, bool sflag); + ~Cpgoto (); + void emit (OutputFile & o, uint32_t ind, const DFA &dfa) const; + void used_labels (std::set & used) const; + + FORBID_COPY (Cpgoto); +}; + +struct Dot +{ + const State * from; + Cases * cases; + Dot(const Span *sp, uint32_t nsp, const State *s); + ~Dot (); + void emit (OutputFile & o, const DFA &dfa) const; + + FORBID_COPY (Dot); +}; + +struct Go +{ + uint32_t nSpans; // number of spans + Span * span; + tcid_t tags; + bool skip; + enum + { + EMPTY, + SWITCH_IF, + BITMAP, + CPGOTO, + DOT + } type; + union + { + SwitchIf * switchif; + GoBitmap * bitmap; + Cpgoto * cpgoto; + Dot * dot; + } info; + + Go (); + ~Go (); + void init(const State* from, const opt_t *opts, bitmaps_t &bitmaps); + void emit (OutputFile & o, uint32_t ind, const DFA &dfa) const; + void used_labels (std::set & used) const; + + Go (const Go & g) + : nSpans (g.nSpans) + , span (g.span) + , tags (g.tags) + , skip (g.skip) + , type (g.type) + , info (g.info) + {} + Go & operator = (const Go & g) + { + nSpans = g.nSpans; + span = g.span; + tags = g.tags; + skip = g.skip; + type = g.type; + info = g.info; + return * this; + } +}; + +bool consume(const State *s); + +} // namespace re2c + +#endif // _RE2C_CODE_GO_ diff --git a/src/code/go_construct.cc b/src/code/go_construct.cc new file mode 100644 index 0000000..eec4cef --- /dev/null +++ b/src/code/go_construct.cc @@ -0,0 +1,328 @@ +#include +#include +#include "src/util/c99_stdint.h" +#include +#include +#include + +#include "src/adfa/action.h" +#include "src/adfa/adfa.h" +#include "src/code/bitmap.h" +#include "src/code/go.h" +#include "src/conf/opt.h" +#include "src/dfa/tcmd.h" +#include "src/util/allocate.h" + +namespace re2c +{ + +static uint32_t unmap (Span * new_span, const Span * old_span, uint32_t old_nspans, const State * x); + +bool consume(const State *s) +{ + switch (s->action.type) { + case Action::RULE: + case Action::MOVE: + case Action::ACCEPT: return false; + case Action::MATCH: + case Action::INITIAL: + case Action::SAVE: return true; + } + return true; /* unreachable */ +} + +Cases::Cases(const Span *spans, uint32_t nspans, bool skip) + : cases(new Case[nspans]) + , cases_size(0) +{ + assert(nspans > 0); + + // first case is default case + Case &c = cases[cases_size++]; + const Span *s = spans + (nspans - 1); + c.to = s->to; + c.tags = s->tags; + c.skip = skip && consume(s->to); + + for (uint32_t i = 0, lb = 0; i < nspans; ++i) { + s = spans + i; + add(lb, s->ub, s->to, s->tags, skip && consume(s->to)); + lb = s->ub; + } +} + +void Cases::add(uint32_t lb, uint32_t ub, State *to, tcid_t tags, bool skip) +{ + for (uint32_t i = 0; i < cases_size; ++i) { + Case &c = cases[i]; + if (c.to == to && c.tags == tags) { + c.ranges.push_back(std::make_pair(lb, ub)); + return; + } + } + Case &c = cases[cases_size++]; + c.ranges.push_back(std::make_pair(lb, ub)); + c.to = to; + c.tags = tags; + c.skip = skip; +} + +Cond::Cond (const std::string & cmp, uint32_t val) + : compare (cmp) + , value (val) +{} + +Binary::Binary (const Span * s, uint32_t n, const State * next, bool skip) + : cond (NULL) + , thn (NULL) + , els (NULL) +{ + const uint32_t l = n / 2; + const uint32_t h = n - l; + cond = new Cond ("<=", s[l - 1].ub - 1); + thn = new If (l > 4 ? If::BINARY : If::LINEAR, &s[0], l, next, skip); + els = new If (h > 4 ? If::BINARY : If::LINEAR, &s[l], h, next, skip); +} + +void Linear::add_branch(const Cond *cond, const State *to, tcid_t tags, bool skip) +{ + Branch &b = branches[nbranches++]; + b.cond = cond; + b.to = to; + b.tags = tags; + b.skip = skip; +} + +Linear::Linear(const Span *s, uint32_t n, const State *next, bool skip) + : nbranches(0) + , branches(new Branch[n]) +{ + for (;;) { + if (n == 1 && s[0].to == next) { + add_branch(NULL, NULL, s[0].tags, skip && consume(s[0].to)); + return; + } else if (n == 1) { + add_branch(NULL, s[0].to, s[0].tags, skip && consume(s[0].to)); + return; + } else if (n == 2 && s[0].to == next) { + add_branch(new Cond(">=", s[0].ub), s[1].to, s[1].tags, skip && consume(s[1].to)); + add_branch(NULL, NULL, s[0].tags, skip && consume(s[0].to)); + return; + } else if (n == 3 + && s[1].to == next + && s[1].ub - s[0].ub == 1 + && s[2].to == s[0].to + && s[2].tags == s[0].tags) { + add_branch(new Cond("!=", s[0].ub), s[0].to, s[0].tags, skip && consume(s[0].to)); + add_branch(NULL, NULL, s[1].tags, skip && consume(s[1].to)); + return; + } else if (n >= 3 + && s[1].ub - s[0].ub == 1 + && s[2].to == s[0].to + && s[2].tags == s[0].tags) { + add_branch(new Cond("==", s[0].ub), s[1].to, s[1].tags, skip && consume(s[1].to)); + n -= 2; + s += 2; + } else { + add_branch(new Cond("<=", s[0].ub - 1), s[0].to, s[0].tags, skip && consume(s[0].to)); + n -= 1; + s += 1; + } + } +} + +If::If (type_t t, const Span * sp, uint32_t nsp, const State * next, bool skip) + : type (t) + , info () +{ + switch (type) + { + case BINARY: + info.binary = new Binary (sp, nsp, next, skip); + break; + case LINEAR: + info.linear = new Linear (sp, nsp, next, skip); + break; + } +} + +SwitchIf::SwitchIf (const Span * sp, uint32_t nsp, const State * next, bool sflag, bool skip) + : type (IF) + , info () +{ + if ((!sflag && nsp > 2) || (nsp > 8 && (sp[nsp - 2].ub - sp[0].ub <= 3 * (nsp - 2)))) + { + type = SWITCH; + info.cases = new Cases (sp, nsp, skip); + } + else if (nsp > 5) + { + info.ifs = new If (If::BINARY, sp, nsp, next, skip); + } + else + { + info.ifs = new If (If::LINEAR, sp, nsp, next, skip); + } +} + +GoBitmap::GoBitmap (const Span * span, uint32_t nSpans, const Span * hspan, + uint32_t hSpans, const bitmap_t * bm, const State * bm_state, + const State * next, bool sflag) + : bitmap (bm) + , bitmap_state (bm_state) + , hgo (NULL) + , lgo (NULL) +{ + Span * bspan = allocate (nSpans); + uint32_t bSpans = unmap (bspan, span, nSpans, bm_state); + lgo = bSpans == 0 + ? NULL + : new SwitchIf (bspan, bSpans, next, sflag, false); + // if there are any low spans, then next state for high spans + // must be NULL to trigger explicit goto generation in linear 'if' + hgo = hSpans == 0 + ? NULL + : new SwitchIf (hspan, hSpans, lgo ? NULL : next, sflag, false); + operator delete (bspan); +} + +const uint32_t CpgotoTable::TABLE_SIZE = 0x100; + +CpgotoTable::CpgotoTable (const Span * span, uint32_t nSpans) + : table (new const State * [TABLE_SIZE]) +{ + uint32_t c = 0; + for (uint32_t i = 0; i < nSpans; ++i) + { + for(; c < span[i].ub && c < TABLE_SIZE; ++c) + { + table[c] = span[i].to; + } + } +} + +Cpgoto::Cpgoto (const Span * span, uint32_t nSpans, const Span * hspan, + uint32_t hSpans, const State * next, bool sflag) + : hgo (hSpans == 0 ? NULL : new SwitchIf (hspan, hSpans, next, sflag, false)) + , table (new CpgotoTable (span, nSpans)) +{} + +Dot::Dot (const Span * sp, uint32_t nsp, const State * s) + : from (s) + , cases (new Cases (sp, nsp, false)) +{} + +Go::Go () + : nSpans (0) + , span (NULL) + , tags (TCID0) + , skip (false) + , type (EMPTY) + , info () +{} + +void Go::init(const State *from, const opt_t *opts, bitmaps_t &bitmaps) +{ + if (nSpans == 0) + { + return; + } + + // initialize high (wide) spans + uint32_t hSpans = 0; + const Span * hspan = NULL; + for (uint32_t i = 0; i < nSpans; ++i) + { + if (span[i].ub > 0x100) + { + hspan = &span[i]; + hSpans = nSpans - i; + break; + } + } + + bool low_spans_have_tags = false; + for (uint32_t i = 0; i < nSpans - hSpans; ++i) { + if (span[i].tags != TCID0) { + low_spans_have_tags = true; + break; + } + } + + // initialize bitmaps + uint32_t nBitmaps = 0; + const bitmap_t *bm = NULL; + const State *bms = NULL; + + for (uint32_t i = 0; i < nSpans; ++i) { + const State *s = span[i].to; + if (!s->isBase) continue; + + const bitmap_t *b = bitmaps.find(this, s); + if (b) { + if (bm == NULL) { + bm = b; + bms = s; + } + ++nBitmaps; + } + } + + const uint32_t dSpans = nSpans - hSpans - nBitmaps; + const bool part_skip = opts->eager_skip && !skip; + if (opts->target == TARGET_DOT) + { + type = DOT; + info.dot = new Dot (span, nSpans, from); + } + else if (opts->gFlag && !part_skip && (dSpans >= opts->cGotoThreshold) && !low_spans_have_tags) + { + type = CPGOTO; + info.cpgoto = new Cpgoto (span, nSpans, hspan, hSpans, from->next, opts->sFlag); + } + else if (opts->bFlag && !part_skip && (nBitmaps > 0)) + { + type = BITMAP; + info.bitmap = new GoBitmap (span, nSpans, hspan, hSpans, bm, bms, from->next, opts->sFlag); + bitmaps.used = true; + } + else + { + type = SWITCH_IF; + info.switchif = new SwitchIf (span, nSpans, from->next, opts->sFlag, part_skip); + } +} + +/* + * Find all spans, that map to the given state. For each of them, + * find upper adjacent span, that maps to another state (if such + * span exists, otherwize try lower one). + * If input contains single span that maps to the given state, + * then output contains 0 spans. + */ +uint32_t unmap (Span * new_span, const Span * old_span, uint32_t old_nspans, const State * x) +{ + uint32_t new_nspans = 0; + for (uint32_t i = 0; i < old_nspans; ++i) + { + if (old_span[i].to != x) + { + if (new_nspans > 0 + && new_span[new_nspans - 1].to == old_span[i].to + && new_span[new_nspans - 1].tags == old_span[i].tags) + new_span[new_nspans - 1].ub = old_span[i].ub; + else + { + new_span[new_nspans].to = old_span[i].to; + new_span[new_nspans].ub = old_span[i].ub; + new_span[new_nspans].tags = old_span[i].tags; + ++new_nspans; + } + } + } + if (new_nspans > 0) + new_span[new_nspans - 1].ub = old_span[old_nspans - 1].ub; + return new_nspans; +} + +} // namespace re2c diff --git a/src/codegen/go_destruct.cc b/src/code/go_destruct.cc similarity index 86% rename from src/codegen/go_destruct.cc rename to src/code/go_destruct.cc index 0160d48..9876491 100644 --- a/src/codegen/go_destruct.cc +++ b/src/code/go_destruct.cc @@ -1,8 +1,6 @@ #include "src/util/c99_stdint.h" -#include -#include -#include "src/codegen/go.h" +#include "src/code/go.h" namespace re2c { @@ -21,10 +19,10 @@ Binary::~Binary () Linear::~Linear () { - for (uint32_t i = 0; i < branches.size (); ++i) - { - delete branches[i].first; + for (uint32_t i = 0; i < nbranches; ++i) { + delete branches[i].cond; } + delete[] branches; } If::~If () diff --git a/src/code/go_emit.cc b/src/code/go_emit.cc new file mode 100644 index 0000000..d96bd7c --- /dev/null +++ b/src/code/go_emit.cc @@ -0,0 +1,249 @@ +#include +#include "src/util/c99_stdint.h" +#include +#include +#include + +#include "src/adfa/adfa.h" +#include "src/code/bitmap.h" +#include "src/code/emit.h" +#include "src/code/go.h" +#include "src/code/label.h" +#include "src/code/output.h" +#include "src/code/print.h" +#include "src/conf/opt.h" +#include "src/dfa/tcmd.h" +#include "src/re/encoding/enc.h" + +namespace re2c +{ + +static void output_if (OutputFile & o, uint32_t ind, const std::string & compare, uint32_t value); +static std::string output_hgo (OutputFile & o, uint32_t ind, const DFA &dfa, SwitchIf * hgo); + +void output_if (OutputFile & o, uint32_t ind, const std::string & compare, uint32_t value) +{ + o.wind(ind).ws("if (").wstring(o.block().opts->yych).ws(" ").wstring(compare).ws(" ").wc_hex (value).ws(") "); +} + +std::string output_hgo (OutputFile & o, uint32_t ind, const DFA &dfa, SwitchIf * hgo) +{ + const opt_t *opts = o.block().opts; + std::string yych = opts->yych; + if (hgo != NULL) + { + o.wind(ind).ws("if (").wstring(yych).ws(" & ~0xFF) {\n"); + hgo->emit (o, ind + 1, dfa); + o.wind(ind).ws("} else "); + yych = opts->yych; + } + else + { + o.wind(ind); + } + return yych; +} + +void Case::emit (OutputFile & o, uint32_t ind) const +{ + const opt_t *opts = o.block().opts; + for (uint32_t i = 0; i < ranges.size (); ++i) + { + for (uint32_t b = ranges[i].first; b < ranges[i].second; ++b) + { + o.wind(ind).ws("case ").wc_hex (b).ws(":"); + if (opts->dFlag && opts->encoding.type () == Enc::EBCDIC) + { + const uint32_t c = opts->encoding.decodeUnsafe (b); + if (is_print (c)) + o.ws(" /* ").wc(static_cast (c)).ws(" */"); + } + bool last_case = i == ranges.size () - 1 && b == ranges[i].second - 1; + if (!last_case) + { + o.ws("\n"); + } + } + } +} + +void Cases::emit(OutputFile &o, uint32_t ind, const DFA &dfa) const +{ + o.wind(ind).ws("switch (").wstring(o.block().opts->yych).ws(") {\n"); + + for (uint32_t i = 1; i < cases_size; ++i) { + const Case &c = cases[i]; + c.emit(o, ind); + gen_goto_case(o, ind, c.to, dfa, c.tags, c.skip); + } + + // default case must be the last one + const Case &c = cases[0]; + o.wind(ind).ws("default:"); + gen_goto_case(o, ind, c.to, dfa, c.tags, c.skip); + + o.wind(ind).ws("}\n"); +} + +void Binary::emit(OutputFile &o, uint32_t ind, const DFA &dfa) const +{ + output_if(o, ind, cond->compare, cond->value); + o.ws("{\n"); + thn->emit(o, ind + 1, dfa); + o.wind(ind).ws("} else {\n"); + els->emit(o, ind + 1, dfa); + o.wind(ind).ws("}\n"); +} + +void Linear::emit(OutputFile &o, uint32_t ind, const DFA &dfa) const +{ + for (uint32_t i = 0; i < nbranches; ++i) { + const Branch &b = branches[i]; + const Cond *cond = b.cond; + if (cond) { + output_if(o, ind, cond->compare, cond->value); + gen_goto_if(o, ind, b.to, dfa, b.tags, b.skip); + } else { + gen_goto_plain(o, ind, b.to, dfa, b.tags, b.skip); + } + } +} + +void If::emit(OutputFile &o, uint32_t ind, const DFA &dfa) const +{ + switch (type) { + case BINARY: info.binary->emit(o, ind, dfa); break; + case LINEAR: info.linear->emit(o, ind, dfa); break; + } +} + +void SwitchIf::emit(OutputFile &o, uint32_t ind, const DFA &dfa) const +{ + switch (type) { + case SWITCH: info.cases->emit(o, ind, dfa); break; + case IF: info.ifs->emit(o, ind, dfa); break; + } +} + +void GoBitmap::emit (OutputFile & o, uint32_t ind, const DFA &dfa) const +{ + const opt_t *opts = o.block().opts; + std::string yych = output_hgo (o, ind, dfa, hgo); + o.ws("if (").wstring(opts->yybm).ws("[").wu32(bitmap->i).ws("+").wstring(yych).ws("] & "); + if (opts->yybmHexTable) + { + o.wu32_hex(bitmap->m); + } + else + { + o.wu32(bitmap->m); + } + o.ws(") {\n"); + gen_goto_plain(o, ind + 1, bitmap_state, dfa, TCID0, false); + o.wind(ind).ws("}\n"); + if (lgo != NULL) + { + lgo->emit (o, ind, dfa); + } +} + +label_t CpgotoTable::max_label () const +{ + label_t max = label_t::first (); + for (uint32_t i = 0; i < TABLE_SIZE; ++i) + { + if (max < table[i]->label) + { + max = table[i]->label; + }; + } + return max; +} + +void CpgotoTable::emit (OutputFile & o, uint32_t ind) const +{ + const opt_t *opts = o.block().opts; + o.wind(ind).ws("static void *").wstring(opts->yytarget).ws("[256] = {\n"); + o.wind(++ind); + const uint32_t max_digits = max_label ().width (); + for (uint32_t i = 0; i < TABLE_SIZE; ++i) + { + o.ws("&&").wstring(opts->labelPrefix).wlabel(table[i]->label); + if (i == TABLE_SIZE - 1) + { + o.ws("\n"); + } + else if (i % 8 == 7) + { + o.ws(",\n").wind(ind); + } + else + { + const uint32_t padding = max_digits - table[i]->label.width () + 1; + o.ws(",").wstring(std::string (padding, ' ')); + } + } + o.wind(--ind).ws("};\n"); +} + +void Cpgoto::emit (OutputFile & o, uint32_t ind, const DFA &dfa) const +{ + std::string yych = output_hgo (o, ind, dfa, hgo); + o.ws("{\n"); + table->emit (o, ++ind); + o.wind(ind).ws("goto *").wstring(o.block().opts->yytarget).ws("[").wstring(yych).ws("];\n"); + o.wind(--ind).ws("}\n"); +} + +void Dot::emit(OutputFile &o, const DFA &dfa) const +{ + const std::string &prefix = o.block().opts->tags_prefix; + const uint32_t n = cases->cases_size; + if (n == 1) { + o.wlabel(from->label).ws(" -> ").wlabel(cases->cases[0].to->label).ws("\n"); + } else { + for (uint32_t i = 0; i < n; ++i) { + const Case &c = cases->cases[i]; + o.wlabel(from->label).ws(" -> ").wlabel(c.to->label).ws(" [label=\""); + for (uint32_t j = 0; j < c.ranges.size(); ++j) { + o.wrange(c.ranges[j].first, c.ranges[j].second); + } + const tcmd_t *cmd = dfa.tcpool[c.tags]; + for (const tcmd_t *p = cmd; p; p = p->next) { + o.ws("<").wstring(vartag_name(p->lhs, prefix)); + if (tcmd_t::iscopy(p)) { + o.ws("~").wstring(vartag_name(p->rhs, prefix)); + } + o.ws(">"); + } + o.ws("\"]\n"); + } + } +} + +void Go::emit (OutputFile & o, uint32_t ind, const DFA &dfa) const +{ + if (type == DOT) { + info.dot->emit (o, dfa); + return; + } + + const bool lookahead = o.block().opts->lookahead; + o.wdelay_skip(ind, skip && !lookahead); + code_lines_t code; + gen_settags(code, dfa, tags, o.block().opts); + for (size_t i = 0; i < code.size(); ++i) { + o.wind(ind).wstring(code[i]); + } + o.wdelay_skip(ind, skip && lookahead); + + if (type == SWITCH_IF) { + info.switchif->emit (o, ind, dfa); + } else if (type == BITMAP) { + info.bitmap->emit (o, ind, dfa); + } else if (type == CPGOTO) { + info.cpgoto->emit (o, ind, dfa); + } +} + +} // namespace re2c diff --git a/src/codegen/go_used_labels.cc b/src/code/go_used_labels.cc similarity index 60% rename from src/codegen/go_used_labels.cc rename to src/code/go_used_labels.cc index 09cf98e..5ce70d9 100644 --- a/src/codegen/go_used_labels.cc +++ b/src/code/go_used_labels.cc @@ -1,17 +1,16 @@ #include #include "src/util/c99_stdint.h" #include -#include -#include -#include "src/codegen/go.h" -#include "src/codegen/label.h" -#include "src/ir/adfa/adfa.h" +#include "src/adfa/adfa.h" +#include "src/code/go.h" namespace re2c { -void Cases::used_labels (std::set & used) +class label_t; + +void Cases::used_labels (std::set & used) const { for (uint32_t i = 0; i < cases_size; ++i) { @@ -19,21 +18,23 @@ void Cases::used_labels (std::set & used) } } -void Binary::used_labels (std::set & used) +void Binary::used_labels (std::set & used) const { thn->used_labels (used); els->used_labels (used); } -void Linear::used_labels (std::set & used) +void Linear::used_labels (std::set & used) const { - for (uint32_t i = 0; i < branches.size (); ++i) - { - used.insert (branches[i].second->label); + for (uint32_t i = 0; i < nbranches; ++i) { + const State *to = branches[i].to; + if (to) { + used.insert(to->label); + } } } -void If::used_labels (std::set & used) +void If::used_labels (std::set & used) const { switch (type) { @@ -46,7 +47,7 @@ void If::used_labels (std::set & used) } } -void SwitchIf::used_labels (std::set & used) +void SwitchIf::used_labels (std::set & used) const { switch (type) { @@ -59,7 +60,7 @@ void SwitchIf::used_labels (std::set & used) } } -void GoBitmap::used_labels (std::set & used) +void GoBitmap::used_labels (std::set & used) const { if (hgo != NULL) { @@ -72,7 +73,7 @@ void GoBitmap::used_labels (std::set & used) } } -void CpgotoTable::used_labels (std::set & used) +void CpgotoTable::used_labels (std::set & used) const { for (uint32_t i = 0; i < TABLE_SIZE; ++i) { @@ -80,7 +81,7 @@ void CpgotoTable::used_labels (std::set & used) } } -void Cpgoto::used_labels (std::set & used) +void Cpgoto::used_labels (std::set & used) const { if (hgo != NULL) { @@ -89,7 +90,7 @@ void Cpgoto::used_labels (std::set & used) table->used_labels (used); } -void Go::used_labels (std::set & used) +void Go::used_labels (std::set & used) const { switch (type) { diff --git a/src/code/input_api.cc b/src/code/input_api.cc new file mode 100644 index 0000000..3b91ec2 --- /dev/null +++ b/src/code/input_api.cc @@ -0,0 +1,131 @@ +#include +#include + +#include "src/code/emit.h" +#include "src/code/input_api.h" +#include "src/conf/opt.h" + +namespace re2c +{ + +std::string output_expr_peek(const opt_t *opts) +{ + return opts->input_api == INPUT_DEFAULT + ? "*" + opts->yycursor + : opts->yypeek + " ()"; +} + +std::string output_restore(uint32_t ind, const opt_t *opts) +{ + std::string s = opts->input_api == INPUT_DEFAULT + ? opts->yycursor + " = " + opts->yymarker + : opts->yyrestore + " ()"; + return indent(ind, opts->indString) + s + ";\n"; +} + +std::string output_expr_lessthan(size_t n, const opt_t *opts) +{ + std::ostringstream s; + if (opts->input_api == INPUT_CUSTOM) { + s << opts->yylessthan << " (" << n << ")"; + } else if (n == 1) { + s << opts->yylimit << " <= " << opts->yycursor; + } else { + s << "(" << opts->yylimit << " - " << opts->yycursor << ") < " << n; + } + return s.str (); +} + +static std::string yych_conv(const opt_t *opts) +{ + return opts->yychConversion + ? "(" + opts->yyctype + ")" + : ""; +} + +void output_peek(std::ostream &o, uint32_t ind, const opt_t *opts) +{ + o << indent(ind, opts->indString) << opts->yych << " = " << yych_conv(opts); + if (opts->input_api == INPUT_CUSTOM) { + o << opts->yypeek << " ()"; + } else { + o << "*" << opts->yycursor; + } + o << ";\n"; +} + +void output_skip(std::ostream &o, uint32_t ind, const opt_t *opts) +{ + o << indent(ind, opts->indString); + if (opts->input_api == INPUT_CUSTOM) { + o << opts->yyskip << " ()"; + } else { + o << "++" << opts->yycursor; + } + o << ";\n"; +} + +void output_backup(std::ostream &o, uint32_t ind, const opt_t *opts) +{ + o << indent(ind, opts->indString); + if (opts->input_api == INPUT_CUSTOM) { + o << opts->yybackup << " ()"; + } else { + o << opts->yymarker << " = " << opts->yycursor; + } + o << ";\n"; +} + +void output_skip_peek(std::ostream &o, uint32_t ind, const opt_t *opts) +{ + assert(opts->input_api == INPUT_DEFAULT); + o << indent(ind, opts->indString) << opts->yych << " = " + << yych_conv(opts) << "*++" << opts->yycursor << ";\n"; +} + +void output_peek_skip(std::ostream &o, uint32_t ind, const opt_t *opts) +{ + assert(opts->input_api == INPUT_DEFAULT); + o << indent(ind, opts->indString) << opts->yych << " = " + << yych_conv(opts) << "*" << opts->yycursor << "++;\n"; +} + +void output_skip_backup(std::ostream &o, uint32_t ind, const opt_t *opts) +{ + assert(opts->input_api == INPUT_DEFAULT); + o << indent(ind, opts->indString) << opts->yymarker << " = ++" + << opts->yycursor << ";\n"; +} + +void output_backup_skip(std::ostream &o, uint32_t ind, const opt_t *opts) +{ + assert(opts->input_api == INPUT_DEFAULT); + o << indent(ind, opts->indString) << opts->yymarker << " = " + << opts->yycursor << "++;\n"; +} + +void output_backup_peek(std::ostream &o, uint32_t ind, const opt_t *opts) +{ + assert(opts->input_api == INPUT_DEFAULT); + o << indent(ind, opts->indString) << opts->yych << " = " + << yych_conv(opts) << "*(" << opts->yymarker << " = " + << opts->yycursor << ");\n"; +} + +void output_skip_backup_peek(std::ostream &o, uint32_t ind, const opt_t *opts) +{ + assert(opts->input_api == INPUT_DEFAULT); + o << indent(ind, opts->indString) << opts->yych << " = " + << yych_conv(opts) << "*(" << opts->yymarker << " = ++" + << opts->yycursor << ");\n"; +} + +void output_backup_peek_skip(std::ostream &o, uint32_t ind, const opt_t *opts) +{ + assert(opts->input_api == INPUT_DEFAULT); + o << indent(ind, opts->indString) << opts->yych << " = " + << yych_conv(opts) << "*(" << opts->yymarker << " = " + << opts->yycursor << "++);\n"; +} + +} // end namespace re2c diff --git a/src/code/input_api.h b/src/code/input_api.h new file mode 100644 index 0000000..abb6289 --- /dev/null +++ b/src/code/input_api.h @@ -0,0 +1,37 @@ +#ifndef _RE2C_CODE_INPUT_API_ +#define _RE2C_CODE_INPUT_API_ + +#include +#include "src/util/c99_stdint.h" +#include +#include + +namespace re2c +{ + +struct opt_t; + +enum input_api_t +{ + INPUT_DEFAULT, + INPUT_CUSTOM +}; + +std::string output_expr_peek (const opt_t *opts); +std::string output_restore (uint32_t ind, const opt_t *opts); +std::string output_expr_lessthan (size_t n, const opt_t *opts); + +void output_peek (std::ostream &o, uint32_t ind, const opt_t *opts); +void output_skip (std::ostream &o, uint32_t ind, const opt_t *opts); +void output_backup (std::ostream &o, uint32_t ind, const opt_t *opts); +void output_skip_peek (std::ostream &o, uint32_t ind, const opt_t *opts); +void output_peek_skip (std::ostream &o, uint32_t ind, const opt_t *opts); +void output_skip_backup (std::ostream &o, uint32_t ind, const opt_t *opts); +void output_backup_skip (std::ostream &o, uint32_t ind, const opt_t *opts); +void output_backup_peek (std::ostream &o, uint32_t ind, const opt_t *opts); +void output_skip_backup_peek (std::ostream &o, uint32_t ind, const opt_t *opts); +void output_backup_peek_skip (std::ostream &o, uint32_t ind, const opt_t *opts); + +} // end namespace re2c + +#endif // _RE2C_CODE_INPUT_API_ diff --git a/src/codegen/label.cc b/src/code/label.cc similarity index 94% rename from src/codegen/label.cc rename to src/code/label.cc index c2e384f..12e1ee2 100644 --- a/src/codegen/label.cc +++ b/src/code/label.cc @@ -1,6 +1,6 @@ #include -#include "src/codegen/label.h" +#include "src/code/label.h" namespace re2c { diff --git a/src/codegen/label.h b/src/code/label.h similarity index 88% rename from src/codegen/label.h rename to src/code/label.h index cb2179d..bf29628a 100644 --- a/src/codegen/label.h +++ b/src/code/label.h @@ -1,9 +1,8 @@ -#ifndef _RE2C_CODEGEN_LABEL_ -#define _RE2C_CODEGEN_LABEL_ - -#include // ostream +#ifndef _RE2C_CODE_LABEL_ +#define _RE2C_CODE_LABEL_ #include "src/util/c99_stdint.h" +#include // ostream namespace re2c { @@ -36,4 +35,4 @@ public: } // namespace re2c -#endif // _RE2C_CODEGEN_LABEL_ +#endif // _RE2C_CODE_LABEL_ diff --git a/src/code/output.cc b/src/code/output.cc new file mode 100644 index 0000000..0695c34 --- /dev/null +++ b/src/code/output.cc @@ -0,0 +1,776 @@ +#include +#include +#include + +#include "config.h" +#include "src/code/emit.h" +#include "src/code/input_api.h" +#include "src/code/output.h" +#include "src/code/print.h" +#include "src/conf/msg.h" +#include "src/conf/opt.h" +#include "src/conf/warn.h" +#include "src/re/encoding/enc.h" +#include "src/util/string_utils.h" +#include "src/util/uniq_vector.h" + +namespace re2c +{ + +OutputFragment::OutputFragment (type_t t, uint32_t i) + : type (t) + , stream () + , indent (i) +{} + +OutputFragment::~OutputFragment() +{ + if (type == STAGS || type == MTAGS) delete tags; +} + +uint32_t OutputFragment::count_lines () const +{ + uint32_t lines = 0; + const std::string content = stream.str (); + const char * p = content.c_str (); + for (uint32_t i = 0; i < content.size (); ++i) + { + if (p[i] == '\n') + { + ++lines; + } + } + return lines; +} + +OutputBlock::OutputBlock () + : fragments () + , used_yyaccept (false) + , line (0) + , types () + , stags () + , mtags () + , opts(NULL) +{ + fragments.push_back (new OutputFragment (OutputFragment::CODE, 0)); +} + +OutputBlock::~OutputBlock () +{ + for (unsigned int i = 0; i < fragments.size (); ++i) + { + delete fragments[i]; + } + delete opts; +} + +OutputFile::OutputFile(Warn &w) + : blocks () + , label_counter () + , fill_index(0) + , state_goto(false) + , cond_goto(false) + , warn_condition_order(true) + , warn(w) +{} + +OutputFile::~OutputFile () +{ + for (unsigned int i = 0; i < blocks.size(); ++i) { + delete blocks[i]; + } +} + +OutputBlock& OutputFile::block() +{ + return *blocks.back(); +} + +std::ostream & OutputFile::stream () +{ + return block().fragments.back ()->stream; +} + +OutputFile &OutputFile::wraw(const char *s, const char *e) +{ + if (block().opts->target == TARGET_CODE) { + insert_code(); + + // convert CR LF to LF + std::ostream &o = stream(); + for (const char *p = s;; ++p) { + std::streamsize l = p - s; + if (p == e) { + o.write(s, l); + break; + } else if (*p == '\n') { + if (p > s && p[-1] == '\r') --l; + o.write(s, l); + s = p; + } + } + } + return *this; +} + +OutputFile & OutputFile::wu32_hex (uint32_t n) +{ + insert_code(); + prtHex(stream(), n, block().opts->encoding.szCodeUnit()); + return *this; +} + +OutputFile & OutputFile::wc_hex (uint32_t n) +{ + insert_code(); + const opt_t *opts = block().opts; + const Enc &e = opts->encoding; + prtChOrHex(stream(), n, e.szCodeUnit(), e.type() == Enc::EBCDIC, opts->target == TARGET_DOT); + return *this; +} + +OutputFile & OutputFile::wrange (uint32_t l, uint32_t u) +{ + insert_code(); + const opt_t *opts = block().opts; + const Enc &e = opts->encoding; + printSpan(stream(), l, u, e.szCodeUnit(), e.type() == Enc::EBCDIC, opts->target == TARGET_DOT); + return *this; +} + +OutputFile & OutputFile::wu32_width (uint32_t n, int w) +{ + insert_code(); + stream () << std::setw (w); + stream () << n; + return *this; +} + +OutputFile & OutputFile::wline_info (uint32_t l, const char * fn) +{ + insert_code(); + output_line_info (stream (), l, fn, block().opts->iFlag); + return *this; +} + +OutputFile & OutputFile::wversion_time () +{ + insert_code(); + output_version_time(stream(), block().opts->version, !block().opts->bNoGenerationDate); + return *this; +} + +OutputFile & OutputFile::wuser_start_label () +{ + insert_code(); + const std::string label = block().opts->startlabel; + if (!label.empty()) + { + wstring(label).ws(":\n"); + } + return *this; +} + +OutputFile & OutputFile::wc (char c) +{ + insert_code(); + stream () << c; + return *this; +} + +OutputFile & OutputFile::wu32 (uint32_t n) +{ + insert_code(); + stream () << n; + return *this; +} + +OutputFile & OutputFile::wu64 (uint64_t n) +{ + insert_code(); + stream () << n; + return *this; +} + +OutputFile & OutputFile::wstring (const std::string & s) +{ + insert_code(); + stream () << s; + return *this; +} + +OutputFile & OutputFile::ws (const char * s) +{ + insert_code(); + stream () << s; + return *this; +} + +OutputFile & OutputFile::wlabel (label_t l) +{ + insert_code(); + stream () << l; + return *this; +} + +OutputFile & OutputFile::wind (uint32_t ind) +{ + insert_code(); + stream () << indent(ind, block().opts->indString); + return *this; +} + +void OutputFile::insert_code () +{ + if (block().fragments.back()->type != OutputFragment::CODE) { + block().fragments.push_back(new OutputFragment(OutputFragment::CODE, 0)); + } +} + +OutputFile &OutputFile::wdelay_tags(const ConfTags *cf, bool mtags) +{ + if (block().opts->target == TARGET_CODE) { + OutputFragment *frag = new OutputFragment( + mtags ? OutputFragment::MTAGS : OutputFragment::STAGS, 0); + frag->tags = cf; + blocks.back()->fragments.push_back(frag); + } + return *this; +} + +OutputFile & OutputFile::wdelay_line_info () +{ + block().fragments.push_back (new OutputFragment (OutputFragment::LINE_INFO, 0)); + return *this; +} + +OutputFile & OutputFile::wdelay_cond_goto(uint32_t ind) +{ + if (block().opts->cFlag && !cond_goto) { + block().fragments.push_back(new OutputFragment(OutputFragment::COND_GOTO, ind)); + cond_goto = true; + } + return *this; +} + +OutputFile & OutputFile::wdelay_cond_table(uint32_t ind) +{ + if (block().opts->gFlag && block().opts->cFlag && !cond_goto) { + block().fragments.push_back(new OutputFragment(OutputFragment::COND_TABLE, ind)); + } + return *this; +} + +OutputFile & OutputFile::wdelay_state_goto (uint32_t ind) +{ + if (block().opts->target == TARGET_CODE + && block().opts->fFlag && !state_goto) { + block().fragments.push_back (new OutputFragment (OutputFragment::STATE_GOTO, ind)); + state_goto = true; + } + return *this; +} + +OutputFile & OutputFile::wdelay_types () +{ + if (block().opts->target == TARGET_CODE) { + warn_condition_order = false; // see note [condition order] + block().fragments.push_back (new OutputFragment (OutputFragment::TYPES, 0)); + } + return *this; +} + +OutputFile & OutputFile::wdelay_yyaccept_init (uint32_t ind) +{ + block().fragments.push_back (new OutputFragment (OutputFragment::YYACCEPT_INIT, ind)); + return *this; +} + +OutputFile & OutputFile::wdelay_yymaxfill () +{ + if (block().opts->target == TARGET_CODE) { + block().fragments.push_back (new OutputFragment (OutputFragment::YYMAXFILL, 0)); + } + return *this; +} + +OutputFile& OutputFile::wdelay_yymaxnmatch() +{ + if (block().opts->target == TARGET_CODE + && block().opts->posix_captures) { + block().fragments.push_back (new OutputFragment (OutputFragment::YYMAXNMATCH, 0)); + } + return *this; +} + +OutputFile& OutputFile::wdelay_skip(uint32_t ind, bool skip) +{ + if (skip) { + OutputFragment *f = new OutputFragment(OutputFragment::SKIP, ind); + block().fragments.push_back(f); + } + return *this; +} + +OutputFile& OutputFile::wdelay_peek(uint32_t ind, bool peek) +{ + if (peek) { + OutputFragment *f = new OutputFragment(OutputFragment::PEEK, ind); + block().fragments.push_back(f); + } + return *this; +} + +OutputFile& OutputFile::wdelay_backup(uint32_t ind, bool backup) +{ + if (backup) { + OutputFragment *f = new OutputFragment(OutputFragment::BACKUP, ind); + block().fragments.push_back(f); + } + return *this; +} + +void OutputFile::new_block(Opt &opts) +{ + OutputBlock *b = new OutputBlock; + b->opts = opts.snapshot(); + blocks.push_back(b); + + // start label hapens to be the only option + // that must be reset for each new block + opts.reset_startlabel(); +} + +void OutputFile::global_lists(uniq_vector_t &types, + std::set &stags, std::set &mtags) const +{ + for (unsigned int i = 0; i < blocks.size(); ++i) { + const std::vector &cs = blocks[i]->types; + for (size_t j = 0; j < cs.size(); ++j) { + types.find_or_add(cs[j]); + } + + const std::set + &st = blocks[i]->stags, + &mt = blocks[i]->mtags; + stags.insert(st.begin(), st.end()); + mtags.insert(mt.begin(), mt.end()); + } +} + +static void foldexpr(std::vector &frags) +{ + const size_t n = frags.size(); + for (size_t i = 0; i < n;) { + + if (i + 2 < n) { + OutputFragment::type_t + &x = frags[i]->type, + &y = frags[i + 1]->type, + &z = frags[i + 2]->type; + if (x == OutputFragment::BACKUP && y == OutputFragment::PEEK && z == OutputFragment::SKIP) { + x = OutputFragment::BACKUP_PEEK_SKIP; + y = z = OutputFragment::EMPTY; + i += 3; + continue; + } else if (x == OutputFragment::SKIP && y == OutputFragment::BACKUP && z == OutputFragment::PEEK) { + x = OutputFragment::SKIP_BACKUP_PEEK; + y = z = OutputFragment::EMPTY; + i += 3; + continue; + } + } + + if (i + 1 < n) { + OutputFragment::type_t + &x = frags[i]->type, + &y = frags[i + 1]->type; + if (x == OutputFragment::PEEK && y == OutputFragment::SKIP) { + x = OutputFragment::PEEK_SKIP; + y = OutputFragment::EMPTY; + i += 2; + continue; + } else if (x == OutputFragment::SKIP && y == OutputFragment::PEEK) { + x = OutputFragment::SKIP_PEEK; + y = OutputFragment::EMPTY; + i += 2; + continue; + } else if (x == OutputFragment::SKIP && y == OutputFragment::BACKUP) { + x = OutputFragment::SKIP_BACKUP; + y = OutputFragment::EMPTY; + i += 2; + continue; + } else if (x == OutputFragment::BACKUP && y == OutputFragment::PEEK) { + x = OutputFragment::BACKUP_PEEK; + y = OutputFragment::EMPTY; + i += 2; + continue; + } else if (x == OutputFragment::BACKUP && y == OutputFragment::SKIP) { + x = OutputFragment::BACKUP_SKIP; + y = OutputFragment::EMPTY; + i += 2; + continue; + } + } + + ++i; + } +} + +bool OutputFile::emit(const uniq_vector_t &global_types, + const std::set &global_stags, + const std::set &global_mtags, + size_t max_fill, size_t max_nmatch) +{ + FILE *file = NULL; + std::string filename = block().opts->output_file; + if (filename.empty()) { + filename = ""; + file = stdout; + } else { + file = fopen(filename.c_str(), "w"); + if (!file) { + error("cannot open output file: %s", filename.c_str()); + return false; + } + } + + unsigned int line_count = 1; + for (unsigned int j = 0; j < blocks.size(); ++j) { + OutputBlock & b = * blocks[j]; + const opt_t *bopt = b.opts; + + if (bopt->input_api == INPUT_DEFAULT) { + foldexpr(b.fragments); + } + + const size_t n = b.fragments.size(); + for (size_t i = 0; i < n; ++i) { + OutputFragment & f = * b.fragments[i]; + std::ostringstream &o = f.stream; + const uint32_t ind = f.indent ? f.indent : bopt->topIndent; + + switch (f.type) { + case OutputFragment::EMPTY: + case OutputFragment::CODE: break; + case OutputFragment::LINE_INFO: + output_line_info(o, line_count + 1, filename, bopt->iFlag); + break; + case OutputFragment::COND_GOTO: + output_cond_goto(o, ind, b.types, + bopt, warn, warn_condition_order, b.line); + break; + case OutputFragment::COND_TABLE: + output_cond_table(o, ind, b.types, bopt); + break; + case OutputFragment::STATE_GOTO: + output_state_goto(o, ind, 0, fill_index, bopt); + break; + case OutputFragment::STAGS: + output_tags(o, ind, *f.tags, global_stags, bopt); + break; + case OutputFragment::MTAGS: + output_tags(o, ind, *f.tags, global_mtags, bopt); + break; + case OutputFragment::TYPES: + output_types(o, ind, block().opts, global_types); + break; + case OutputFragment::YYACCEPT_INIT: + output_yyaccept_init(o, ind, b.used_yyaccept, bopt); + break; + case OutputFragment::YYMAXFILL: + output_yymaxfill(o, ind, max_fill, bopt); + break; + case OutputFragment::YYMAXNMATCH: + output_yymaxnmatch(o, ind, max_nmatch, bopt); + break; + case OutputFragment::SKIP: + output_skip(o, ind, bopt); + break; + case OutputFragment::PEEK: + output_peek(o, ind, bopt); + break; + case OutputFragment::BACKUP: + output_backup(o, ind, bopt); + break; + case OutputFragment::PEEK_SKIP: + output_peek_skip(o, ind, bopt); + break; + case OutputFragment::SKIP_PEEK: + output_skip_peek(o, ind, bopt); + break; + case OutputFragment::SKIP_BACKUP: + output_skip_backup(o, ind, bopt); + break; + case OutputFragment::BACKUP_SKIP: + output_backup_skip(o, ind, bopt); + break; + case OutputFragment::BACKUP_PEEK: + output_backup_peek(o, ind, bopt); + break; + case OutputFragment::BACKUP_PEEK_SKIP: + output_backup_peek_skip(o, ind, bopt); + break; + case OutputFragment::SKIP_BACKUP_PEEK: + output_skip_backup_peek(o, ind, bopt); + break; + } + + std::string content = o.str(); + fwrite(content.c_str(), 1, content.size(), file); + line_count += f.count_lines(); + } + } + + fclose(file); + return true; +} + +bool HeaderFile::emit(const opt_t *opts, const uniq_vector_t &types) +{ + const std::string &filename = opts->header_file; + if (filename.empty()) return true; + + FILE *file = fopen(filename.c_str(), "w"); + if (!file) { + error("cannot open header file: %s", filename.c_str()); + return false; + } + + output_version_time(stream, opts->version, !opts->bNoGenerationDate); + output_line_info(stream, 3, filename, opts->iFlag); + stream << "\n"; + output_types(stream, 0, opts, types); + + std::string content = stream.str(); + fwrite(content.c_str(), 1, content.size(), file); + + fclose(file); + return true; +} + +Output::Output(Warn &w) + : source(w) + , header() + , skeletons() + , max_fill(1) + , max_nmatch(1) +{} + +bool Output::emit() +{ + if (source.warn.error()) { + return false; + } + + uniq_vector_t types; + std::set stags, mtags; + source.global_lists(types, stags, mtags); + + // global options are last block's options + const opt_t *opts = source.block().opts; + + return source.emit(types, stags, mtags, max_fill, max_nmatch) + && header.emit(opts, types); +} + +void output_tags(std::ostream &o, uint32_t ind, const ConfTags &conf, + const std::set &tags, const opt_t *opts) +{ + std::set::const_iterator + tag = tags.begin(), + end = tags.end(); + o << indent(ind, opts->indString); + for (;tag != end;) { + std::string fmt = conf.format; + strrreplace(fmt, "@@", *tag); + o << fmt; + if (++tag == end) { + break; + } + o << conf.separator; + } +} + +void output_state_goto(std::ostream & o, uint32_t ind, + uint32_t start_label, uint32_t fill_index, const opt_t *opts) +{ + const std::string + indstr = indent(ind, opts->indString), + getstate = opts->state_get_naked + ? opts->state_get + : opts->state_get + "()"; + + o << indstr << "switch (" << getstate << ") {\n"; + if (opts->bUseStateAbort) + { + o << indstr << "default: abort();\n"; + o << indstr << "case -1: goto " << opts->labelPrefix << start_label << ";\n"; + } + else + { + o << indstr << "default: goto " << opts->labelPrefix << start_label << ";\n"; + } + for (uint32_t i = 0; i < fill_index; ++i) + { + o << indstr << "case " << i << ": goto " << opts->yyfilllabel << i << ";\n"; + } + o << indstr << "}\n"; + if (opts->bUseStateNext) + { + o << opts->yynext << ":\n"; + } +} + +void output_yyaccept_init (std::ostream & o, uint32_t ind, bool used_yyaccept, const opt_t *opts) +{ + if (used_yyaccept) + { + o << indent(ind, opts->indString) << "unsigned int " << opts->yyaccept << " = 0;\n"; + } +} + +void output_yymaxfill(std::ostream &o, uint32_t ind, + size_t max_fill, const opt_t *opts) +{ + o << indent(ind, opts->indString) << "#define YYMAXFILL " << max_fill << "\n"; +} + +void output_yymaxnmatch(std::ostream &o, uint32_t ind, + size_t max_nmatch, const opt_t *opts) +{ + o << indent(ind, opts->indString) << "#define YYMAXNMATCH " << max_nmatch << "\n"; +} + +void output_line_info(std::ostream &o, uint32_t line, + const std::string &fname, bool iflag) +{ + if (!iflag) { + o << "#line " << line << " \"" << fname << "\"\n"; + } +} + +void output_types(std::ostream &o, uint32_t ind, const opt_t *opts, + const uniq_vector_t &types) +{ + const std::string indstr = opts->indString; + o << indent(ind++, indstr) << "enum " << opts->yycondtype << " {\n"; + for (size_t i = 0; i < types.size(); ++i) { + o << indent(ind, indstr) << opts->condEnumPrefix << types[i] << ",\n"; + } + o << indent(--ind, indstr) << "};\n"; +} + +void output_version_time(std::ostream &o, bool version, bool date) +{ + o << "/* Generated by re2c"; + if (version) { + o << " " << PACKAGE_VERSION; + } + if (date) { + o << " on "; + time_t now = time (NULL); + o.write (ctime (&now), 24); + } + o << " */" << "\n"; +} + +/* + * note [condition order] + * + * In theory re2c makes no guarantee about the order of conditions in + * the generated lexer. Users should define condition type 'YYCONDTYPE' + * and use values of this type with 'YYGETCONDITION' and 'YYSETCONDITION'. + * This way code is independent of internal re2c condition numbering. + * + * However, it is possible to manually hardcode condition numbers and make + * re2c generate condition dispatch without explicit use of condition names + * (nested 'if' statements with '-b' or computed 'goto' table with '-g'). + * This code is syntactically valid (compiles), but unsafe: + * - change of re2c options may break compilation + * - change of internal re2c condition numbering may break runtime + * + * re2c has to preserve the existing numbering scheme. + * + * re2c warns about implicit assumptions about condition order, unless: + * - condition type is defined with 'types:re2c' or '-t, --type-header' + * - dispatch is independent of condition order: either it uses + * explicit condition names or there's only one condition and + * dispatch shrinks to unconditional jump + */ + +static std::string output_cond_get(const opt_t *opts) +{ + return opts->cond_get + (opts->cond_get_naked ? "" : "()"); +} + +static void output_cond_goto_binary(std::ostream &o, uint32_t ind, + const std::vector &conds, const opt_t *opts, + size_t lower, size_t upper) +{ + const std::string indstr = indent(ind, opts->indString); + + if (lower == upper) { + o << indstr << "goto " << opts->condPrefix << conds[lower] << ";\n"; + } else { + const size_t middle = lower + (upper - lower + 1) / 2; + o << indstr << "if (" << output_cond_get(opts) << " < " << middle << ") {\n"; + output_cond_goto_binary(o, ind + 1, conds, opts, lower, middle - 1); + o << indstr << "} else {\n"; + output_cond_goto_binary(o, ind + 1, conds, opts, middle, upper); + o << indstr << "}\n"; + } +} + +void output_cond_goto(std::ostream &o, uint32_t ind, + const std::vector &conds, const opt_t *opts, + Warn &warn, bool warn_cond_order, uint32_t line) +{ + const size_t ncond = conds.size(); + const std::string indstr = indent(ind, opts->indString); + + if (opts->target == TARGET_DOT) { + for (size_t i = 0; i < ncond; ++i) { + const std::string &cond = conds[i]; + o << "0 -> " << cond << " [label=\"state=" << cond << "\"]\n"; + } + return; + } + + if (opts->gFlag) { + o << indstr << "goto *" << opts->yyctable + << "[" << output_cond_get(opts) << "];\n"; + } else if (opts->sFlag) { + if (ncond == 1) warn_cond_order = false; + output_cond_goto_binary(o, ind, conds, opts, 0, ncond - 1); + } else { + warn_cond_order = false; + o << indstr << "switch (" << output_cond_get(opts) << ") {\n"; + for (size_t i = 0; i < ncond; ++i) { + const std::string &cond = conds[i]; + o << indstr << "case " << opts->condEnumPrefix << cond + <<": goto " << opts->condPrefix << cond << ";\n"; + } + o << indstr << "}\n"; + } + + warn_cond_order &= opts->header_file.empty(); + + // see note [condition order] + if (warn_cond_order) warn.condition_order(line); +} + +void output_cond_table(std::ostream &o, uint32_t ind, + const std::vector &conds, const opt_t *opts) +{ + const size_t ncond = conds.size(); + const std::string indstr = opts->indString; + + o << indent(ind++, indstr) << "static void *" << opts->yyctable << "[" << ncond << "] = {\n"; + for (size_t i = 0; i < ncond; ++i) { + o << indent(ind, indstr) << "&&" << opts->condPrefix << conds[i] << ",\n"; + } + o << indent(--ind, indstr) << "};\n"; +} + +} // namespace re2c diff --git a/src/code/output.h b/src/code/output.h new file mode 100644 index 0000000..6b769aa --- /dev/null +++ b/src/code/output.h @@ -0,0 +1,191 @@ +#ifndef _RE2C_CODE_OUTPUT_ +#define _RE2C_CODE_OUTPUT_ + +#include +#include "src/util/c99_stdint.h" +#include +#include +#include +#include +#include +#include + +#include "src/code/label.h" +#include "src/conf/opt.h" +#include "src/conf/warn.h" +#include "src/util/counter.h" +#include "src/util/forbid_copy.h" +#include "src/util/uniq_vector.h" + +namespace re2c +{ + +class Warn; +struct Opt; +struct opt_t; +template class uniq_vector_t; + +struct ConfTags +{ + std::string format; + std::string separator; + + ConfTags(const std::string &f, const std::string &s) + : format(f), separator(s) {} +}; + +struct OutputFragment +{ + enum type_t + { CODE +// , CONFIG + , COND_GOTO + , COND_TABLE + , LINE_INFO + , STATE_GOTO + , STAGS + , MTAGS + , TYPES + , YYACCEPT_INIT + , YYMAXFILL + , YYMAXNMATCH + , SKIP + , PEEK + , BACKUP + , PEEK_SKIP + , SKIP_PEEK + , SKIP_BACKUP + , BACKUP_SKIP + , BACKUP_PEEK + , BACKUP_PEEK_SKIP + , SKIP_BACKUP_PEEK + , EMPTY + }; + + type_t type; + std::ostringstream stream; + uint32_t indent; + union + { + const ConfTags* tags; + }; + + OutputFragment (type_t t, uint32_t i); + ~OutputFragment (); + uint32_t count_lines () const; +}; + +struct OutputBlock +{ + std::vector fragments; + bool used_yyaccept; + uint32_t line; + std::vector types; + std::set stags; + std::set mtags; + const opt_t *opts; + + OutputBlock (); + ~OutputBlock (); + FORBID_COPY(OutputBlock); +}; + +class OutputFile +{ + std::vector blocks; + +public: + counter_t label_counter; + uint32_t fill_index; + bool state_goto; + bool cond_goto; + bool warn_condition_order; + Warn &warn; + + explicit OutputFile(Warn &w); + ~OutputFile(); + + std::ostream & stream (); + OutputBlock &block(); + void insert_code (); + bool open (); + void new_block(Opt &opts); + + // immediate output + OutputFile & wraw (const char *s, const char *e); + OutputFile & wc (char c); + OutputFile & wc_hex (uint32_t n); + OutputFile & wu32 (uint32_t n); + OutputFile & wu32_hex (uint32_t n); + OutputFile & wu32_width (uint32_t n, int w); + OutputFile & wu64 (uint64_t n); + OutputFile & wstring (const std::string & s); + OutputFile & ws (const char * s); + OutputFile & wlabel (label_t l); + OutputFile & wrange (uint32_t u, uint32_t l); + OutputFile & wline_info (uint32_t l, const char * fn); + OutputFile & wversion_time (); + OutputFile & wuser_start_label (); + OutputFile & wind (uint32_t ind); + + // delayed output + OutputFile & wdelay_tags(const ConfTags *cf, bool mtags); + OutputFile & wdelay_line_info (); + OutputFile & wdelay_cond_goto(uint32_t ind); + OutputFile & wdelay_cond_table(uint32_t ind); + OutputFile & wdelay_state_goto (uint32_t ind); + OutputFile & wdelay_types (); + OutputFile & wdelay_yyaccept_init (uint32_t ind); + OutputFile & wdelay_yymaxfill (); + OutputFile& wdelay_yymaxnmatch(); + OutputFile& wdelay_skip(uint32_t ind, bool skip); + OutputFile& wdelay_peek(uint32_t ind, bool peek); + OutputFile& wdelay_backup(uint32_t ind, bool backup); + + void global_lists(uniq_vector_t &types, + std::set &stags, std::set &mtags) const; + + bool emit(const uniq_vector_t &global_types, + const std::set &global_stags, + const std::set &global_mtags, + size_t max_fill, size_t max_nmatch); + + FORBID_COPY (OutputFile); +}; + +class HeaderFile +{ + std::ostringstream stream; + +public: + HeaderFile(): stream() {} + bool emit(const opt_t *opts, const uniq_vector_t &types); + FORBID_COPY (HeaderFile); +}; + +struct Output +{ + OutputFile source; + HeaderFile header; + std::set skeletons; + size_t max_fill; + size_t max_nmatch; + + explicit Output(Warn &w); + bool emit(); +}; + +void output_tags (std::ostream &o, uint32_t ind, const ConfTags &conf, const std::set &tags, const opt_t *opts); +void output_line_info (std::ostream &o, uint32_t line, const std::string &fname, bool iflag); +void output_cond_goto (std::ostream &o, uint32_t ind, const std::vector &conds, const opt_t *opts, Warn &warn, bool warn_cond_order, uint32_t line); +void output_cond_table (std::ostream &o, uint32_t ind, const std::vector &conds, const opt_t *opts); +void output_state_goto (std::ostream &o, uint32_t ind, uint32_t start_label, uint32_t fill_index, const opt_t *opts); +void output_types (std::ostream &o, uint32_t ind, const opt_t *opts, const uniq_vector_t &types); +void output_version_time (std::ostream &o, bool version, bool date); +void output_yyaccept_init (std::ostream &o, uint32_t ind, bool, const opt_t *opts); +void output_yymaxfill (std::ostream &o, uint32_t ind, size_t max_fill, const opt_t *opts); +void output_yymaxnmatch (std::ostream &o, uint32_t ind, size_t max_nmatch, const opt_t *opts); + +} // namespace re2c + +#endif // _RE2C_CODE_OUTPUT_ diff --git a/src/code/print.cc b/src/code/print.cc new file mode 100644 index 0000000..d24f06d --- /dev/null +++ b/src/code/print.cc @@ -0,0 +1,96 @@ +#include + +#include "src/code/print.h" + +namespace re2c +{ + +static bool is_space(uint32_t c) +{ + switch (c) { + case '\t': + case '\f': + case '\v': + case '\n': + case '\r': + case ' ': return true; + default: return false; + } +} + +static inline char hex(uint32_t c) +{ + static const char * sHex = "0123456789ABCDEF"; + return sHex[c & 0x0F]; +} + +static void prtCh(std::ostream& o, uint32_t c, bool dot) +{ + switch (c) { + case '\'': o << (dot ? "'" : "\\'"); break; + case '"': o << (dot ? "\\\"" : "\""); break; + case '\n': o << (dot ? "\\\\n" : "\\n"); break; + case '\t': o << (dot ? "\\\\t" : "\\t"); break; + case '\v': o << (dot ? "\\\\v" : "\\v"); break; + case '\b': o << (dot ? "\\\\b" : "\\b"); break; + case '\r': o << (dot ? "\\\\r" : "\\r"); break; + case '\f': o << (dot ? "\\\\f" : "\\f"); break; + case '\a': o << (dot ? "\\\\a" : "\\a"); break; + case '\\': o << "\\\\"; break; // both .dot and C/C++ code expect "\\" + default: o << static_cast (c); break; + } +} + +bool is_print(uint32_t c) +{ + return c >= 0x20 && c < 0x7F; +} + +void prtHex(std::ostream& o, uint32_t c, uint32_t szcunit) +{ + o << "0x"; + + if (szcunit >= 4) { + o << hex(c >> 28u) << hex(c >> 24u) << hex(c >> 20u) << hex(c >> 16u); + } + + if (szcunit >= 2) { + o << hex(c >> 12u) << hex(c >> 8u); + } + + o << hex(c >> 4u) << hex(c); +} + +void prtChOrHex(std::ostream& o, uint32_t c, uint32_t szcunit, bool ebcdic, bool dot) +{ + if (!ebcdic && (is_print(c) || is_space(c))) { + o << '\''; + prtCh(o, c, dot); + o << '\''; + } else { + prtHex(o, c, szcunit); + } +} + +static void prtChOrHexForSpan(std::ostream& o, uint32_t c, uint32_t szcunit, bool ebcdic, bool dot) +{ + if (!ebcdic && c != ']' && is_print(c)) { + prtCh(o, c, dot); + } else { + prtHex(o, c, szcunit); + } +} + +void printSpan(std::ostream& o, uint32_t l, uint32_t u, uint32_t szcunit, bool ebcdic, bool dot) +{ + o << "["; + prtChOrHexForSpan(o, l, szcunit, ebcdic, dot); + if (u - l > 1) { + o << "-"; + prtChOrHexForSpan(o, u - 1, szcunit, ebcdic, dot); + } + o << "]"; +} + +} // end namespace re2c + diff --git a/src/code/print.h b/src/code/print.h new file mode 100644 index 0000000..444441b --- /dev/null +++ b/src/code/print.h @@ -0,0 +1,17 @@ +#ifndef _RE2C_CODE_PRINT_ +#define _RE2C_CODE_PRINT_ + +#include "src/util/c99_stdint.h" +#include + +namespace re2c +{ + +bool is_print (uint32_t c); +void prtHex (std::ostream &o, uint32_t c, uint32_t szcunit); +void prtChOrHex (std::ostream &o, uint32_t c, uint32_t szcunit, bool ebcdic, bool dot); +void printSpan (std::ostream &o, uint32_t l, uint32_t u, uint32_t szcunit, bool ebcdic, bool dot); + +} // end namespace re2c + +#endif // _RE2C_CODE_PRINT_ diff --git a/src/codegen/bitmap.cc b/src/codegen/bitmap.cc deleted file mode 100644 index ca23423..0000000 --- a/src/codegen/bitmap.cc +++ /dev/null @@ -1,168 +0,0 @@ -#include // min -#include // memset - -#include "src/codegen/bitmap.h" -#include "src/codegen/go.h" -#include "src/codegen/output.h" -#include "src/conf/opt.h" -#include "src/globals.h" - -namespace re2c -{ - -BitMap *BitMap::first = NULL; - -BitMap::BitMap(const Go *g, const State *x) - : go(g) - , on(x) - , next(first) - , i(0) - , m(0) -{ - first = this; -} - -BitMap::~BitMap() -{ - delete next; -} - -const BitMap *BitMap::find(const Go *g, const State *x) -{ - for (const BitMap *b = first; b; b = b->next) - { - if (matches(b->go->span, b->go->nSpans, b->on, g->span, g->nSpans, x)) - { - return b; - } - } - - return new BitMap(g, x); -} - -const BitMap *BitMap::find(const State *x) -{ - for (const BitMap *b = first; b; b = b->next) - { - if (b->on == x) - { - return b; - } - } - - return NULL; -} - -static void doGen(const Go *g, const State *s, uint32_t *bm, uint32_t f, uint32_t m) -{ - Span *b = g->span, *e = &b[g->nSpans]; - uint32_t lb = 0; - - for (; b < e; ++b) - { - if (b->to == s) - { - for (; lb < b->ub && lb < 256; ++lb) - { - bm[lb-f] |= m; - } - } - - lb = b->ub; - } -} - -void BitMap::gen(OutputFile & o, uint32_t ind, uint32_t lb, uint32_t ub) -{ - if (first && bUsedYYBitmap) - { - o.wind(ind).ws("static const unsigned char ").wstring(opts->yybm).ws("[] = {"); - - uint32_t c = 1, n = ub - lb; - const BitMap *cb = first; - - while((cb = cb->next) != NULL) { - ++c; - } - BitMap *b = first; - - uint32_t *bm = new uint32_t[n]; - - for (uint32_t i = 0, t = 1; b; i += n, t += 8) - { - memset(bm, 0, n * sizeof(uint32_t)); - - for (uint32_t m = 0x80; b && m; m >>= 1) - { - b->i = i; - b->m = m; - doGen(b->go, b->on, bm, lb, m); - b = const_cast(b->next); - } - - if (c > 8) - { - o.ws("\n").wind(ind+1).ws("/* table ").wu32(t).ws(" .. ").wu32(std::min(c, t+7)).ws(": ").wu32(i).ws(" */"); - } - - for (uint32_t j = 0; j < n; ++j) - { - if (j % 8 == 0) - { - o.ws("\n").wind(ind+1); - } - - if (opts->yybmHexTable) - { - o.wu32_hex(bm[j]); - } - else - { - o.wu32_width(bm[j], 3); - } - o.ws(", "); - } - } - - o.ws("\n").wind(ind).ws("};\n"); - - delete[] bm; - } -} - -// All spans in b1 that lead to s1 are pairwise equal to that in b2 leading to s2 -bool matches(const Span * b1, uint32_t n1, const State * s1, const Span * b2, uint32_t n2, const State * s2) -{ - const Span * e1 = &b1[n1]; - uint32_t lb1 = 0; - const Span * e2 = &b2[n2]; - uint32_t lb2 = 0; - - for (;;) - { - for (; b1 < e1 && b1->to != s1; ++b1) - { - lb1 = b1->ub; - } - for (; b2 < e2 && b2->to != s2; ++b2) - { - lb2 = b2->ub; - } - if (b1 == e1) - { - return b2 == e2; - } - if (b2 == e2) - { - return false; - } - if (lb1 != lb2 || b1->ub != b2->ub) - { - return false; - } - ++b1; - ++b2; - } -} - -} // end namespace re2c diff --git a/src/codegen/bitmap.h b/src/codegen/bitmap.h deleted file mode 100644 index 3c0cc1b..0000000 --- a/src/codegen/bitmap.h +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef _RE2C_CODEGEN_BITMAP_ -#define _RE2C_CODEGEN_BITMAP_ - -#include "src/util/c99_stdint.h" - -#include "src/util/forbid_copy.h" - -namespace re2c -{ - -struct Go; -struct Span; -class State; -class OutputFile; - -class BitMap -{ -public: - static BitMap *first; - - const Go *go; - const State *on; - const BitMap *next; - uint32_t i; - uint32_t m; - -public: - static const BitMap *find(const Go*, const State*); - static const BitMap *find(const State*); - static void gen(OutputFile &, uint32_t ind, uint32_t, uint32_t); - BitMap(const Go*, const State*); - ~BitMap(); - - FORBID_COPY (BitMap); -}; - -bool matches(const Span * b1, uint32_t n1, const State * s1, const Span * b2, uint32_t n2, const State * s2); - -#ifdef _MSC_VER -# pragma warning(disable: 4355) /* 'this' : used in base member initializer list */ -#endif - -} // end namespace re2c - -#endif // _RE2C_CODEGEN_BITMAP_ diff --git a/src/codegen/emit.h b/src/codegen/emit.h deleted file mode 100644 index 5d91b14..0000000 --- a/src/codegen/emit.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef _RE2C_CODEGEN_EMIT_ -#define _RE2C_CODEGEN_EMIT_ - -#include "src/codegen/output.h" -#include "src/ir/adfa/adfa.h" - -namespace re2c { - -typedef std::vector RegExpIndices; - -void emit_action - ( const Action & action - , OutputFile & o - , uint32_t ind - , bool & readCh - , const State * const s - , const std::string & condName - , const Skeleton * skeleton - , const std::set & used_labels - , bool save_yyaccept - ); - -// helpers -void genGoTo (OutputFile & o, uint32_t ind, const State * from, const State * to, bool & readCh); - -template std::string replaceParam (std::string str, const std::string & param, const _Ty & value) -{ - if (!param.empty ()) - { - std::ostringstream strValue; - strValue << value; - std::string::size_type pos; - while((pos = str.find(param)) != std::string::npos) - { - str.replace(pos, param.length(), strValue.str()); - } - } - return str; -} - -} // namespace re2c - -#endif // _RE2C_CODEGEN_EMIT_ diff --git a/src/codegen/emit_action.cc b/src/codegen/emit_action.cc deleted file mode 100644 index d3146da..0000000 --- a/src/codegen/emit_action.cc +++ /dev/null @@ -1,388 +0,0 @@ -#include "src/util/c99_stdint.h" -#include -#include -#include - -#include "src/codegen/emit.h" -#include "src/codegen/input_api.h" -#include "src/codegen/output.h" -#include "src/conf/opt.h" -#include "src/globals.h" -#include "src/ir/adfa/action.h" -#include "src/ir/adfa/adfa.h" -#include "src/ir/regexp/regexp.h" -#include "src/ir/regexp/regexp_rule.h" -#include "src/ir/skeleton/skeleton.h" -#include "src/parse/code.h" -#include "src/parse/loc.h" - -namespace re2c -{ - -class label_t; - -static void need (OutputFile & o, uint32_t ind, bool & readCh, size_t n, bool bSetMarker); -static void emit_match (OutputFile & o, uint32_t ind, bool & readCh, const State * const s); -static void emit_initial (OutputFile & o, uint32_t ind, bool & readCh, const State * const s, const Initial & init, const std::set & used_labels); -static void emit_save (OutputFile & o, uint32_t ind, bool & readCh, const State * const s, uint32_t save, bool save_yyaccept); -static void emit_accept_binary (OutputFile & o, uint32_t ind, bool & readCh, const State * const s, const accept_t & accept, size_t l, size_t r); -static void emit_accept (OutputFile & o, uint32_t ind, bool & readCh, const State * const s, const accept_t & accept); -static void emit_rule (OutputFile & o, uint32_t ind, const State * const s, const RuleOp * const rule, const std::string & condName, const Skeleton * skeleton); -static void genYYFill (OutputFile & o, size_t need); -static void genSetCondition (OutputFile & o, uint32_t ind, const std::string & newcond); -static void genSetState (OutputFile & o, uint32_t ind, uint32_t fillIndex); - -void emit_action - ( const Action & action - , OutputFile & o - , uint32_t ind - , bool & readCh - , const State * const s - , const std::string & condName - , const Skeleton * skeleton - , const std::set & used_labels - , bool save_yyaccept - ) -{ - switch (action.type) - { - case Action::MATCH: - emit_match (o, ind, readCh, s); - break; - case Action::INITIAL: - emit_initial (o, ind, readCh, s, * action.info.initial, used_labels); - break; - case Action::SAVE: - emit_save (o, ind, readCh, s, action.info.save, save_yyaccept); - break; - case Action::MOVE: - break; - case Action::ACCEPT: - emit_accept (o, ind, readCh, s, * action.info.accepts); - break; - case Action::RULE: - emit_rule (o, ind, s, action.info.rule, condName, skeleton); - break; - } - if (s->isPreCtxt && opts->target != opt_t::DOT) - { - o.wstring(opts->input_api.stmt_backupctx (ind)); - } -} - -void emit_match (OutputFile & o, uint32_t ind, bool & readCh, const State * const s) -{ - if (opts->target == opt_t::DOT) - { - return; - } - - const bool read_ahead = s - && s->next - && s->next->action.type != Action::RULE; - if (s->fill != 0) - { - o.wstring(opts->input_api.stmt_skip (ind)); - } - else if (!read_ahead) - { - /* do not read next char if match */ - o.wstring(opts->input_api.stmt_skip (ind)); - readCh = true; - } - else - { - o.wstring(opts->input_api.stmt_skip_peek (ind)); - readCh = false; - } - - if (s->fill != 0) - { - need(o, ind, readCh, s->fill, false); - } -} - -void emit_initial (OutputFile & o, uint32_t ind, bool & readCh, const State * const s, const Initial & initial, const std::set & used_labels) -{ - if (opts->target == opt_t::DOT) - { - return; - } - - if (used_labels.count(s->label)) - { - if (s->fill != 0) - { - o.wstring(opts->input_api.stmt_skip (ind)); - } - else - { - o.wstring(opts->input_api.stmt_skip_peek (ind)); - } - } - - if (used_labels.count(initial.label)) - { - o.wstring(opts->labelPrefix).wlabel(initial.label).ws(":\n"); - } - - if (opts->dFlag) - { - o.wind(ind).wstring(opts->yydebug).ws("(").wlabel(initial.label).ws(", *").wstring(opts->yycursor).ws(");\n"); - } - - if (s->fill != 0) - { - need(o, ind, readCh, s->fill, initial.setMarker); - } - else - { - if (initial.setMarker) - { - o.wstring(opts->input_api.stmt_backup (ind)); - } - readCh = false; - } -} - -void emit_save (OutputFile & o, uint32_t ind, bool & readCh, const State * const s, uint32_t save, bool save_yyaccept) -{ - if (opts->target == opt_t::DOT) - { - return; - } - - if (save_yyaccept) - { - o.wind(ind).wstring(opts->yyaccept).ws(" = ").wu32(save).ws(";\n"); - } - - if (s->fill != 0) - { - o.wstring(opts->input_api.stmt_skip_backup (ind)); - need(o, ind, readCh, s->fill, false); - } - else - { - o.wstring(opts->input_api.stmt_skip_backup_peek (ind)); - readCh = false; - } -} - -void emit_accept_binary (OutputFile & o, uint32_t ind, bool & readCh, const State * const s, const accept_t & accepts, size_t l, size_t r) -{ - if (l < r) - { - const size_t m = (l + r) >> 1; - o.wind(ind).ws("if (").wstring(opts->yyaccept).ws(r == l+1 ? " == " : " <= ").wu64(m).ws(") {\n"); - emit_accept_binary (o, ++ind, readCh, s, accepts, l, m); - o.wind(--ind).ws("} else {\n"); - emit_accept_binary (o, ++ind, readCh, s, accepts, m + 1, r); - o.wind(--ind).ws("}\n"); - } - else - { - genGoTo(o, ind, s, accepts[l], readCh); - } -} - -void emit_accept (OutputFile & o, uint32_t ind, bool & readCh, const State * const s, const accept_t & accepts) -{ - const size_t accepts_size = accepts.size (); - if (accepts_size > 0) - { - if (opts->target != opt_t::DOT) - { - o.wstring(opts->input_api.stmt_restore (ind)); - } - - if (readCh) // shouldn't be necessary, but might become at some point - { - o.wstring(opts->input_api.stmt_peek (ind)); - readCh = false; - } - - if (accepts_size > 1) - { - if (opts->gFlag && accepts_size >= opts->cGotoThreshold) - { - o.wind(ind++).ws("{\n"); - o.wind(ind++).ws("static void *").wstring(opts->yytarget).ws("[").wu64(accepts_size).ws("] = {\n"); - for (uint32_t i = 0; i < accepts_size; ++i) - { - o.wind(ind).ws("&&").wstring(opts->labelPrefix).wlabel(accepts[i]->label).ws(",\n"); - } - o.wind(--ind).ws("};\n"); - o.wind(ind).ws("goto *").wstring(opts->yytarget).ws("[").wstring(opts->yyaccept).ws("];\n"); - o.wind(--ind).ws("}\n"); - } - else if (opts->sFlag || (accepts_size == 2 && opts->target != opt_t::DOT)) - { - emit_accept_binary (o, ind, readCh, s, accepts, 0, accepts_size - 1); - } - else if (opts->target == opt_t::DOT) - { - for (uint32_t i = 0; i < accepts_size; ++i) - { - o.wlabel(s->label).ws(" -> ").wlabel(accepts[i]->label); - o.ws(" [label=\"yyaccept=").wu32(i).ws("\"]\n"); - } - } - else - { - o.wind(ind).ws("switch (").wstring(opts->yyaccept).ws(") {\n"); - for (uint32_t i = 0; i < accepts_size - 1; ++i) - { - o.wind(ind).ws("case ").wu32(i).ws(": \t"); - genGoTo(o, 0, s, accepts[i], readCh); - } - o.wind(ind).ws("default:\t"); - genGoTo(o, 0, s, accepts[accepts_size - 1], readCh); - o.wind(ind).ws("}\n"); - } - } - else - { - // no need to write if statement here since there is only case 0. - genGoTo(o, ind, s, accepts[0], readCh); - } - } -} - -void emit_rule (OutputFile & o, uint32_t ind, const State * const s, const RuleOp * const rule, const std::string & condName, const Skeleton * skeleton) -{ - if (opts->target == opt_t::DOT) - { - o.wlabel(s->label); - if (rule->code) - { - o.ws(" [label=\"").wstring(rule->code->loc.filename).ws(":").wu32(rule->code->loc.line).ws("\"]"); - } - o.ws("\n"); - return; - } - - uint32_t back = rule->ctx->fixedLength(); - if (back != 0u && opts->target != opt_t::DOT) - { - o.wstring(opts->input_api.stmt_restorectx (ind)); - } - - if (opts->target == opt_t::SKELETON) - { - skeleton->emit_action (o, ind, rule->rank); - } - else - { - if (!rule->newcond.empty () && condName != rule->newcond) - { - genSetCondition(o, ind, rule->newcond); - } - - if (rule->code) - { - if (!yySetupRule.empty ()) - { - o.wind(ind).wstring(yySetupRule).ws("\n"); - } - o.wline_info(rule->code->loc.line, rule->code->loc.filename.c_str ()) - .wind(ind).wstring(rule->code->text).ws("\n") - .wdelay_line_info (); - } - else if (!rule->newcond.empty ()) - { - o.wind(ind).wstring(replaceParam(opts->condGoto, opts->condGotoParam, opts->condPrefix + rule->newcond)).ws("\n"); - } - } -} - -void need (OutputFile & o, uint32_t ind, bool & readCh, size_t n, bool bSetMarker) -{ - if (opts->target == opt_t::DOT) - { - return; - } - - uint32_t fillIndex = last_fill_index; - - if (opts->fFlag) - { - last_fill_index++; - genSetState (o, ind, fillIndex); - } - - if (opts->fill_use && n > 0) - { - o.wind(ind); - if (n == 1) - { - if (opts->fill_check) - { - o.ws("if (").wstring(opts->input_api.expr_lessthan_one ()).ws(") "); - } - genYYFill(o, n); - } - else - { - if (opts->fill_check) - { - o.ws("if (").wstring(opts->input_api.expr_lessthan (n)).ws(") "); - } - genYYFill(o, n); - } - } - - if (opts->fFlag) - { - o.wstring(opts->yyfilllabel).wu32(fillIndex).ws(":\n"); - } - - if (n > 0) - { - if (bSetMarker) - { - o.wstring(opts->input_api.stmt_backup_peek (ind)); - } - else - { - o.wstring(opts->input_api.stmt_peek (ind)); - } - readCh = false; - } -} - -void genYYFill (OutputFile & o, size_t need) -{ - o.wstring(replaceParam (opts->fill, opts->fill_arg, need)); - if (!opts->fill_naked) - { - if (opts->fill_arg_use) - { - o.ws("(").wu64(need).ws(")"); - } - o.ws(";"); - } - o.ws("\n"); -} - -void genSetCondition(OutputFile & o, uint32_t ind, const std::string& newcond) -{ - o.wind(ind).wstring(replaceParam (opts->cond_set, opts->cond_set_arg, opts->condEnumPrefix + newcond)); - if (!opts->cond_set_naked) - { - o.ws("(").wstring(opts->condEnumPrefix).wstring(newcond).ws(");"); - } - o.ws("\n"); -} - -void genSetState(OutputFile & o, uint32_t ind, uint32_t fillIndex) -{ - o.wind(ind).wstring(replaceParam (opts->state_set, opts->state_set_arg, fillIndex)); - if (!opts->state_set_naked) - { - o.ws("(").wu32(fillIndex).ws(");"); - } - o.ws("\n"); -} - -} // namespace re2c diff --git a/src/codegen/emit_dfa.cc b/src/codegen/emit_dfa.cc deleted file mode 100644 index 2ec6426..0000000 --- a/src/codegen/emit_dfa.cc +++ /dev/null @@ -1,348 +0,0 @@ -#include "src/util/c99_stdint.h" -#include -#include -#include -#include -#include - -#include "src/codegen/bitmap.h" -#include "src/codegen/emit.h" -#include "src/codegen/go.h" -#include "src/codegen/input_api.h" -#include "src/codegen/label.h" -#include "src/codegen/output.h" -#include "src/conf/opt.h" -#include "src/globals.h" -#include "src/ir/adfa/action.h" -#include "src/ir/adfa/adfa.h" -#include "src/ir/skeleton/skeleton.h" -#include "src/util/counter.h" - -namespace re2c -{ - -static std::string genGetCondition (); -static void genCondGotoSub (OutputFile & o, uint32_t ind, const std::vector & condnames, uint32_t cMin, uint32_t cMax); -static void genCondTable (OutputFile & o, uint32_t ind, const std::vector & condnames); -static void genCondGoto (OutputFile & o, uint32_t ind, const std::vector & condnames); -static void emit_state (OutputFile & o, uint32_t ind, const State * s, bool used_label); - -std::string genGetCondition() -{ - return opts->cond_get_naked - ? opts->cond_get - : opts->cond_get + "()"; -} - -void genGoTo(OutputFile & o, uint32_t ind, const State *from, const State *to, bool & readCh) -{ - if (opts->target == opt_t::DOT) - { - o.wlabel(from->label).ws(" -> ").wlabel(to->label).ws("\n"); - return; - } - - if (readCh && from->next != to) - { - o.wstring(opts->input_api.stmt_peek (ind)); - readCh = false; - } - - o.wind(ind).ws("goto ").wstring(opts->labelPrefix).wlabel(to->label).ws(";\n"); -} - -void emit_state (OutputFile & o, uint32_t ind, const State * s, bool used_label) -{ - if (opts->target != opt_t::DOT) - { - if (used_label) - { - o.wstring(opts->labelPrefix).wlabel(s->label).ws(":\n"); - } - if (opts->dFlag && (s->action.type != Action::INITIAL)) - { - o.wind(ind).wstring(opts->yydebug).ws("(").wlabel(s->label).ws(", ").wstring(opts->input_api.expr_peek ()).ws(");\n"); - } - } -} - -void DFA::count_used_labels (std::set & used, label_t start, label_t initial, bool force_start) const -{ - // In '-f' mode, default state is always state 0 - if (opts->fFlag) - { - used.insert (label_t::first ()); - } - if (force_start) - { - used.insert (start); - } - for (State * s = head; s; s = s->next) - { - s->go.used_labels (used); - } - for (uint32_t i = 0; i < accepts.size (); ++i) - { - used.insert (accepts[i]->label); - } - // must go last: it needs the set of used labels - if (used.count (head->label)) - { - used.insert (initial); - } -} - -void DFA::emit_body (OutputFile & o, uint32_t& ind, const std::set & used_labels, label_t initial) const -{ - // If DFA has transitions to initial state, then initial state - // has a piece of code that advances input position. Wee must - // skip it when entering DFA. - if (used_labels.count(head->label)) - { - o.wind(ind).ws("goto ").wstring(opts->labelPrefix).wlabel(initial).ws(";\n"); - } - - const bool save_yyaccept = accepts.size () > 1; - for (State * s = head; s; s = s->next) - { - bool readCh = false; - emit_state (o, ind, s, used_labels.count (s->label)); - emit_action (s->action, o, ind, readCh, s, cond, skeleton, used_labels, save_yyaccept); - s->go.emit(o, ind, readCh); - } -} - -void DFA::emit(Output & output, uint32_t& ind, bool isLastCond, bool& bPrologBrace) -{ - OutputFile & o = output.source; - - bool bProlog = (!opts->cFlag || !bWroteCondCheck); - - // start_label points to the beginning of current re2c block - // (prior to condition dispatch in '-c' mode) - // it can forced by configuration 're2c:startlabel = ;' - label_t start_label = o.label_counter.next (); - // initial_label points to the beginning of DFA - // in '-c' mode this is NOT equal to start_label - label_t initial_label = bProlog && opts->cFlag - ? o.label_counter.next () - : start_label; - for (State * s = head; s; s = s->next) - { - s->label = o.label_counter.next (); - } - std::set used_labels; - count_used_labels (used_labels, start_label, initial_label, o.get_force_start_label ()); - - head->action.set_initial (initial_label, head->action.type == Action::SAVE); - - skeleton->warn_undefined_control_flow (); - skeleton->warn_unreachable_rules (); - skeleton->warn_match_empty (); - - if (opts->target == opt_t::SKELETON) - { - if (output.skeletons.insert (name).second) - { - skeleton->emit_data (o.file_name); - skeleton->emit_start (o, max_fill, need_backup, need_backupctx, need_accept); - uint32_t i = 2; - emit_body (o, i, used_labels, initial_label); - skeleton->emit_end (o, need_backup, need_backupctx); - } - } - else - { - // Generate prolog - if (bProlog) - { - o.ws("\n").wdelay_line_info (); - if (opts->target == opt_t::DOT) - { - bPrologBrace = true; - o.ws("digraph re2c {\n"); - } - else if ((!opts->fFlag && o.get_used_yyaccept ()) - || (!opts->fFlag && opts->bEmitYYCh) - || (opts->bFlag && !opts->cFlag && BitMap::first) - || (opts->cFlag && !bWroteCondCheck && opts->gFlag) - || (opts->fFlag && !bWroteGetState && opts->gFlag) - ) - { - bPrologBrace = true; - o.wind(ind++).ws("{\n"); - } - else if (ind == 0) - { - ind = 1; - } - if (!opts->fFlag && opts->target != opt_t::DOT) - { - if (opts->bEmitYYCh) - { - o.wind(ind).wstring(opts->yyctype).ws(" ").wstring(opts->yych).ws(";\n"); - } - o.wdelay_yyaccept_init (ind); - } - else - { - o.ws("\n"); - } - } - if (opts->bFlag && !opts->cFlag && BitMap::first) - { - BitMap::gen(o, ind, lbChar, ubChar <= 256 ? ubChar : 256); - } - if (bProlog) - { - if (opts->cFlag && !bWroteCondCheck && opts->gFlag) - { - genCondTable(o, ind, output.types); - } - o.wdelay_state_goto (ind); - if (opts->cFlag && opts->target != opt_t::DOT) - { - if (used_labels.count(start_label)) - { - o.wstring(opts->labelPrefix).wlabel(start_label).ws(":\n"); - } - } - o.wuser_start_label (); - if (opts->cFlag && !bWroteCondCheck) - { - genCondGoto(o, ind, output.types); - } - } - if (opts->cFlag && !cond.empty()) - { - if (opts->condDivider.length()) - { - o.wstring(replaceParam(opts->condDivider, opts->condDividerParam, cond)).ws("\n"); - } - if (opts->target == opt_t::DOT) - { - o.wstring(cond).ws(" -> ").wlabel(head->label).ws("\n"); - } - else - { - o.wstring(opts->condPrefix).wstring(cond).ws(":\n"); - } - } - if (opts->cFlag && opts->bFlag && BitMap::first) - { - o.wind(ind++).ws("{\n"); - BitMap::gen(o, ind, lbChar, ubChar <= 256 ? ubChar : 256); - } - // Generate code - emit_body (o, ind, used_labels, initial_label); - if (opts->cFlag && opts->bFlag && BitMap::first) - { - o.wind(--ind).ws("}\n"); - } - // Generate epilog - if ((!opts->cFlag || isLastCond) && bPrologBrace) - { - o.wind(--ind).ws("}\n"); - } - } - - // Cleanup - if (BitMap::first) - { - delete BitMap::first; - BitMap::first = NULL; - } -} - -void genCondTable(OutputFile & o, uint32_t ind, const std::vector & condnames) -{ - const size_t conds = condnames.size (); - o.wind(ind++).ws("static void *").wstring(opts->yyctable).ws("[").wu64(conds).ws("] = {\n"); - for (size_t i = 0; i < conds; ++i) - { - o.wind(ind).ws("&&").wstring(opts->condPrefix).wstring(condnames[i]).ws(",\n"); - } - o.wind(--ind).ws("};\n"); -} - -void genCondGotoSub(OutputFile & o, uint32_t ind, const std::vector & condnames, uint32_t cMin, uint32_t cMax) -{ - if (cMin == cMax) - { - o.wind(ind).ws("goto ").wstring(opts->condPrefix).wstring(condnames[cMin]).ws(";\n"); - } - else - { - uint32_t cMid = cMin + ((cMax - cMin + 1) / 2); - - o.wind(ind).ws("if (").wstring(genGetCondition()).ws(" < ").wu32(cMid).ws(") {\n"); - genCondGotoSub(o, ind + 1, condnames, cMin, cMid - 1); - o.wind(ind).ws("} else {\n"); - genCondGotoSub(o, ind + 1, condnames, cMid, cMax); - o.wind(ind).ws("}\n"); - } -} - -/* - * note [condition order] - * - * In theory re2c makes no guarantee about the order of conditions in - * the generated lexer. Users should define condition type 'YYCONDTYPE' - * and use values of this type with 'YYGETCONDITION' and 'YYSETCONDITION'. - * This way code is independent of internal re2c condition numbering. - * - * However, it is possible to manually hardcode condition numbers and make - * re2c generate condition dispatch without explicit use of condition names - * (nested 'if' statements with '-b' or computed 'goto' table with '-g'). - * This code is syntactically valid (compiles), but unsafe: - * - change of re2c options may break compilation - * - change of internal re2c condition numbering may break runtime - * - * re2c has to preserve the existing numbering scheme. - * - * re2c warns about implicit assumptions about condition order, unless: - * - condition type is defined with 'types:re2c' or '-t, --type-header' - * - dispatch is independent of condition order: either it uses - * explicit condition names or there's only one condition and - * dispatch shrinks to unconditional jump - */ -void genCondGoto(OutputFile & o, uint32_t ind, const std::vector & condnames) -{ - const size_t conds = condnames.size (); - if (opts->target == opt_t::DOT) - { - o.warn_condition_order = false; // see note [condition order] - for (size_t i = 0; i < conds; ++i) - { - const std::string cond = condnames[i]; - o.ws("0 -> ").wstring(cond).ws(" [label=\"state=").wstring(cond).ws("\"]\n"); - } - } - else if (opts->gFlag) - { - o.wind(ind).ws("goto *").wstring(opts->yyctable).ws("[").wstring(genGetCondition()).ws("];\n"); - } - else if (opts->sFlag) - { - if (conds == 1) - { - o.warn_condition_order = false; // see note [condition order] - } - genCondGotoSub(o, ind, condnames, 0, static_cast (conds) - 1); - } - else - { - o.warn_condition_order = false; // see note [condition order] - o.wind(ind).ws("switch (").wstring(genGetCondition()).ws(") {\n"); - for (size_t i = 0; i < conds; ++i) - { - const std::string & cond = condnames[i]; - o.wind(ind).ws("case ").wstring(opts->condEnumPrefix).wstring(cond).ws(": goto ").wstring(opts->condPrefix).wstring(cond).ws(";\n"); - } - o.wind(ind).ws("}\n"); - } - o.wdelay_warn_condition_order (); - bWroteCondCheck = true; -} - -} // end namespace re2c diff --git a/src/codegen/go.h b/src/codegen/go.h deleted file mode 100644 index 57c29e8..0000000 --- a/src/codegen/go.h +++ /dev/null @@ -1,216 +0,0 @@ -#ifndef _RE2C_CODEGEN_GO_ -#define _RE2C_CODEGEN_GO_ - -#include -#include -#include - -#include "src/codegen/output.h" -#include "src/util/c99_stdint.h" -#include "src/util/forbid_copy.h" - -namespace re2c -{ - -class BitMap; -class State; -struct If; - -struct Span -{ - uint32_t ub; - State * to; - - FORBID_COPY (Span); -}; - -struct Case -{ - std::vector > ranges; - const State * to; - void emit (OutputFile & o, uint32_t ind); - - inline Case () - : ranges () - , to (NULL) - {} - - FORBID_COPY (Case); -}; - -struct Cases -{ - const State * def; - Case * cases; - uint32_t cases_size; - void add (uint32_t lb, uint32_t ub, State * to); - Cases (const Span * s, uint32_t n); - ~Cases (); - void emit (OutputFile & o, uint32_t ind, bool & readCh); - void used_labels (std::set & used); - - FORBID_COPY (Cases); -}; - -struct Cond -{ - std::string compare; - uint32_t value; - Cond (const std::string & cmp, uint32_t val); -}; - -struct Binary -{ - Cond * cond; - If * thn; - If * els; - Binary (const Span * s, uint32_t n, const State * next); - ~Binary (); - void emit (OutputFile & o, uint32_t ind, bool & readCh); - void used_labels (std::set & used); - - FORBID_COPY (Binary); -}; - -struct Linear -{ - std::vector > branches; - Linear (const Span * s, uint32_t n, const State * next); - ~Linear (); - void emit (OutputFile & o, uint32_t ind, bool & readCh); - void used_labels (std::set & used); -}; - -struct If -{ - enum type_t - { - BINARY, - LINEAR - } type; - union - { - Binary * binary; - Linear * linear; - } info; - If (type_t t, const Span * sp, uint32_t nsp, const State * next); - ~If (); - void emit (OutputFile & o, uint32_t ind, bool & readCh); - void used_labels (std::set & used); -}; - -struct SwitchIf -{ - enum - { - SWITCH, - IF - } type; - union - { - Cases * cases; - If * ifs; - } info; - SwitchIf (const Span * sp, uint32_t nsp, const State * next); - ~SwitchIf (); - void emit (OutputFile & o, uint32_t ind, bool & readCh); - void used_labels (std::set & used); -}; - -struct GoBitmap -{ - const BitMap * bitmap; - const State * bitmap_state; - SwitchIf * hgo; - SwitchIf * lgo; - GoBitmap (const Span * span, uint32_t nSpans, const Span * hspan, uint32_t hSpans, const BitMap * bm, const State * bm_state, const State * next); - ~GoBitmap (); - void emit (OutputFile & o, uint32_t ind, bool & readCh); - void used_labels (std::set & used); - - FORBID_COPY (GoBitmap); -}; - -struct CpgotoTable -{ - static const uint32_t TABLE_SIZE; - const State ** table; - CpgotoTable (const Span * span, uint32_t nSpans); - ~CpgotoTable (); - void emit (OutputFile & o, uint32_t ind); - void used_labels (std::set & used); - -private: - label_t max_label () const; - - FORBID_COPY (CpgotoTable); -}; - -struct Cpgoto -{ - SwitchIf * hgo; - CpgotoTable * table; - Cpgoto (const Span * span, uint32_t nSpans, const Span * hspan, uint32_t hSpans, const State * next); - ~Cpgoto (); - void emit (OutputFile & o, uint32_t ind, bool & readCh); - void used_labels (std::set & used); - - FORBID_COPY (Cpgoto); -}; - -struct Dot -{ - const State * from; - Cases * cases; - Dot (const Span * sp, uint32_t nsp, const State * from); - ~Dot (); - void emit (OutputFile & o); - - FORBID_COPY (Dot); -}; - -struct Go -{ - uint32_t nSpans; // number of spans - Span * span; - enum - { - EMPTY, - SWITCH_IF, - BITMAP, - CPGOTO, - DOT - } type; - union - { - SwitchIf * switchif; - GoBitmap * bitmap; - Cpgoto * cpgoto; - Dot * dot; - } info; - - Go (); - ~Go (); - void init (const State * from); - void emit (OutputFile & o, uint32_t ind, bool & readCh); - void used_labels (std::set & used); - - Go (const Go & g) - : nSpans (g.nSpans) - , span (g.span) - , type (g.type) - , info (g.info) - {} - Go & operator = (const Go & g) - { - nSpans = g.nSpans; - span = g.span; - type = g.type; - info = g.info; - return * this; - } -}; - -} // namespace re2c - -#endif // _RE2C_CODEGEN_GO_ diff --git a/src/codegen/go_construct.cc b/src/codegen/go_construct.cc deleted file mode 100644 index e680475..0000000 --- a/src/codegen/go_construct.cc +++ /dev/null @@ -1,284 +0,0 @@ -#include -#include "src/util/c99_stdint.h" -#include -#include -#include - -#include "src/codegen/bitmap.h" -#include "src/codegen/go.h" -#include "src/conf/opt.h" -#include "src/globals.h" -#include "src/ir/adfa/adfa.h" -#include "src/util/allocate.h" - -namespace re2c -{ - -static uint32_t unmap (Span * new_span, const Span * old_span, uint32_t old_nspans, const State * x); - -Cases::Cases (const Span * span, uint32_t span_size) - : def (span_size == 0 ? NULL : span[span_size - 1].to) - , cases (new Case[span_size]) - , cases_size (0) -{ - for (uint32_t i = 0, lb = 0; i < span_size; ++ i) - { - add (lb, span[i].ub, span[i].to); - lb = span[i].ub; - } -} - -void Cases::add (uint32_t lb, uint32_t ub, State * to) -{ - for (uint32_t i = 0; i < cases_size; ++i) - { - if (cases[i].to == to) - { - cases[i].ranges.push_back (std::make_pair (lb, ub)); - return; - } - } - cases[cases_size].ranges.push_back (std::make_pair (lb, ub)); - cases[cases_size].to = to; - ++cases_size; -} - -Cond::Cond (const std::string & cmp, uint32_t val) - : compare (cmp) - , value (val) -{} - -Binary::Binary (const Span * s, uint32_t n, const State * next) - : cond (NULL) - , thn (NULL) - , els (NULL) -{ - const uint32_t l = n / 2; - const uint32_t h = n - l; - cond = new Cond ("<=", s[l - 1].ub - 1); - thn = new If (l > 4 ? If::BINARY : If::LINEAR, &s[0], l, next); - els = new If (h > 4 ? If::BINARY : If::LINEAR, &s[l], h, next); -} - -Linear::Linear (const Span * s, uint32_t n, const State * next) - : branches () -{ - for (;;) - { - const State *bg = s[0].to; - while (n >= 3 && s[2].to == bg && (s[1].ub - s[0].ub) == 1) - { - if (s[1].to == next && n == 3) - { - branches.push_back (std::make_pair (new Cond ("!=", s[0].ub), bg)); - return ; - } - else - { - branches.push_back (std::make_pair (new Cond ("==", s[0].ub), s[1].to)); - } - n -= 2; - s += 2; - } - if (n == 1) - { - if (next == NULL || s[0].to != next) - { - branches.push_back (std::make_pair (static_cast (NULL), s[0].to)); - } - return; - } - else if (n == 2 && bg == next) - { - branches.push_back (std::make_pair (new Cond (">=", s[0].ub), s[1].to)); - return; - } - else - { - branches.push_back (std::make_pair (new Cond ("<=", s[0].ub - 1), bg)); - n -= 1; - s += 1; - } - } -} - -If::If (type_t t, const Span * sp, uint32_t nsp, const State * next) - : type (t) - , info () -{ - switch (type) - { - case BINARY: - info.binary = new Binary (sp, nsp, next); - break; - case LINEAR: - info.linear = new Linear (sp, nsp, next); - break; - } -} - -SwitchIf::SwitchIf (const Span * sp, uint32_t nsp, const State * next) - : type (IF) - , info () -{ - if ((!opts->sFlag && nsp > 2) || (nsp > 8 && (sp[nsp - 2].ub - sp[0].ub <= 3 * (nsp - 2)))) - { - type = SWITCH; - info.cases = new Cases (sp, nsp); - } - else if (nsp > 5) - { - info.ifs = new If (If::BINARY, sp, nsp, next); - } - else - { - info.ifs = new If (If::LINEAR, sp, nsp, next); - } -} - -GoBitmap::GoBitmap (const Span * span, uint32_t nSpans, const Span * hspan, uint32_t hSpans, const BitMap * bm, const State * bm_state, const State * next) - : bitmap (bm) - , bitmap_state (bm_state) - , hgo (NULL) - , lgo (NULL) -{ - Span * bspan = allocate (nSpans); - uint32_t bSpans = unmap (bspan, span, nSpans, bm_state); - lgo = bSpans == 0 - ? NULL - : new SwitchIf (bspan, bSpans, next); - // if there are any low spans, then next state for high spans - // must be NULL to trigger explicit goto generation in linear 'if' - hgo = hSpans == 0 - ? NULL - : new SwitchIf (hspan, hSpans, lgo ? NULL : next); - operator delete (bspan); -} - -const uint32_t CpgotoTable::TABLE_SIZE = 0x100; - -CpgotoTable::CpgotoTable (const Span * span, uint32_t nSpans) - : table (new const State * [TABLE_SIZE]) -{ - uint32_t c = 0; - for (uint32_t i = 0; i < nSpans; ++i) - { - for(; c < span[i].ub && c < TABLE_SIZE; ++c) - { - table[c] = span[i].to; - } - } -} - -Cpgoto::Cpgoto (const Span * span, uint32_t nSpans, const Span * hspan, uint32_t hSpans, const State * next) - : hgo (hSpans == 0 ? NULL : new SwitchIf (hspan, hSpans, next)) - , table (new CpgotoTable (span, nSpans)) -{} - -Dot::Dot (const Span * sp, uint32_t nsp, const State * s) - : from (s) - , cases (new Cases (sp, nsp)) -{} - -Go::Go () - : nSpans (0) - , span (NULL) - , type (EMPTY) - , info () -{} - -void Go::init (const State * from) -{ - if (nSpans == 0) - { - return; - } - - // initialize high (wide) spans - uint32_t hSpans = 0; - const Span * hspan = NULL; - for (uint32_t i = 0; i < nSpans; ++i) - { - if (span[i].ub > 0x100) - { - hspan = &span[i]; - hSpans = nSpans - i; - break; - } - } - - // initialize bitmaps - uint32_t nBitmaps = 0; - const BitMap * bitmap = NULL; - const State * bitmap_state = NULL; - for (uint32_t i = 0; i < nSpans; ++i) - { - if (span[i].to->isBase) - { - const BitMap *b = BitMap::find (span[i].to); - if (b && matches(b->go->span, b->go->nSpans, b->on, span, nSpans, span[i].to)) - { - if (bitmap == NULL) - { - bitmap = b; - bitmap_state = span[i].to; - } - nBitmaps++; - } - } - } - - const uint32_t dSpans = nSpans - hSpans - nBitmaps; - if (opts->target == opt_t::DOT) - { - type = DOT; - info.dot = new Dot (span, nSpans, from); - } - else if (opts->gFlag && (dSpans >= opts->cGotoThreshold)) - { - type = CPGOTO; - info.cpgoto = new Cpgoto (span, nSpans, hspan, hSpans, from->next); - } - else if (opts->bFlag && (nBitmaps > 0)) - { - type = BITMAP; - info.bitmap = new GoBitmap (span, nSpans, hspan, hSpans, bitmap, bitmap_state, from->next); - bUsedYYBitmap = true; - } - else - { - type = SWITCH_IF; - info.switchif = new SwitchIf (span, nSpans, from->next); - } -} - -/* - * Find all spans, that map to the given state. For each of them, - * find upper adjacent span, that maps to another state (if such - * span exists, otherwize try lower one). - * If input contains single span that maps to the given state, - * then output contains 0 spans. - */ -uint32_t unmap (Span * new_span, const Span * old_span, uint32_t old_nspans, const State * x) -{ - uint32_t new_nspans = 0; - for (uint32_t i = 0; i < old_nspans; ++i) - { - if (old_span[i].to != x) - { - if (new_nspans > 0 && new_span[new_nspans - 1].to == old_span[i].to) - new_span[new_nspans - 1].ub = old_span[i].ub; - else - { - new_span[new_nspans].to = old_span[i].to; - new_span[new_nspans].ub = old_span[i].ub; - ++new_nspans; - } - } - } - if (new_nspans > 0) - new_span[new_nspans - 1].ub = old_span[old_nspans - 1].ub; - return new_nspans; -} - -} // namespace re2c diff --git a/src/codegen/go_emit.cc b/src/codegen/go_emit.cc deleted file mode 100644 index e970eee..0000000 --- a/src/codegen/go_emit.cc +++ /dev/null @@ -1,271 +0,0 @@ -#include -#include "src/util/c99_stdint.h" -#include -#include -#include - -#include "src/codegen/bitmap.h" -#include "src/codegen/go.h" -#include "src/codegen/input_api.h" -#include "src/codegen/label.h" -#include "src/codegen/output.h" -#include "src/codegen/print.h" -#include "src/conf/opt.h" -#include "src/globals.h" -#include "src/ir/adfa/adfa.h" -#include "src/ir/regexp/encoding/enc.h" - -namespace re2c -{ - -static void output_if (OutputFile & o, uint32_t ind, bool & readCh, const std::string & compare, uint32_t value); -static void output_goto (OutputFile & o, uint32_t ind, bool & readCh, label_t to); -static std::string output_yych (bool & readCh); -static std::string output_hgo (OutputFile & o, uint32_t ind, bool & readCh, SwitchIf * hgo); - -std::string output_yych (bool & readCh) -{ - if (readCh) - { - readCh = false; - return "(" + opts->input_api.expr_peek_save () + ")"; - } - else - { - return opts->yych; - } -} - -void output_if (OutputFile & o, uint32_t ind, bool & readCh, const std::string & compare, uint32_t value) -{ - o.wind(ind).ws("if (").wstring(output_yych (readCh)).ws(" ").wstring(compare).ws(" ").wc_hex (value).ws(") "); -} - -void output_goto (OutputFile & o, uint32_t ind, bool & readCh, label_t to) -{ - if (readCh) - { - o.wstring(opts->input_api.stmt_peek (ind)); - readCh = false; - } - o.wind(ind).ws("goto ").wstring(opts->labelPrefix).wlabel(to).ws(";\n"); -} - -std::string output_hgo (OutputFile & o, uint32_t ind, bool & readCh, SwitchIf * hgo) -{ - std::string yych = output_yych (readCh); - if (hgo != NULL) - { - o.wind(ind).ws("if (").wstring(yych).ws(" & ~0xFF) {\n"); - hgo->emit (o, ind + 1, readCh); - o.wind(ind).ws("} else "); - yych = opts->yych; - } - else - { - o.wind(ind); - } - return yych; -} - -void Case::emit (OutputFile & o, uint32_t ind) -{ - for (uint32_t i = 0; i < ranges.size (); ++i) - { - for (uint32_t b = ranges[i].first; b < ranges[i].second; ++b) - { - o.wind(ind).ws("case ").wc_hex (b).ws(":"); - if (opts->dFlag && opts->encoding.type () == Enc::EBCDIC) - { - const uint32_t c = opts->encoding.decodeUnsafe (b); - if (is_print (c)) - o.ws(" /* ").wc(static_cast (c)).ws(" */"); - } - bool last_case = i == ranges.size () - 1 && b == ranges[i].second - 1; - if (!last_case) - { - o.ws("\n"); - } - } - } -} - -void Cases::emit (OutputFile & o, uint32_t ind, bool & readCh) -{ - o.wind(ind).ws("switch (").wstring(output_yych (readCh)).ws(") {\n"); - for (uint32_t i = 0; i < cases_size; ++i) - { - if (cases[i].to != def) - { - cases[i].emit (o, ind); - output_goto (o, 1, readCh, cases[i].to->label); - } - } - o.wind(ind).ws("default:"); - output_goto (o, 1, readCh, def->label); - o.wind(ind).ws("}\n"); -} - -void Binary::emit (OutputFile & o, uint32_t ind, bool & readCh) -{ - output_if (o, ind, readCh, cond->compare, cond->value); - o.ws("{\n"); - thn->emit (o, ind + 1, readCh); - o.wind(ind).ws("} else {\n"); - els->emit (o, ind + 1, readCh); - o.wind(ind).ws("}\n"); -} - -void Linear::emit (OutputFile & o, uint32_t ind, bool & readCh) -{ - for (uint32_t i = 0; i < branches.size (); ++i) - { - if (branches[i].first != NULL) - { - output_if (o, ind, readCh, branches[i].first->compare, branches[i].first->value); - output_goto (o, 0, readCh, branches[i].second->label); - } - else - { - output_goto (o, ind, readCh, branches[i].second->label); - } - } -} - -void If::emit (OutputFile & o, uint32_t ind, bool & readCh) -{ - switch (type) - { - case BINARY: - info.binary->emit (o, ind, readCh); - break; - case LINEAR: - info.linear->emit (o, ind, readCh); - break; - } -} - -void SwitchIf::emit (OutputFile & o, uint32_t ind, bool & readCh) -{ - switch (type) - { - case SWITCH: - info.cases->emit (o, ind, readCh); - break; - case IF: - info.ifs->emit (o, ind, readCh); - break; - } -} - -void GoBitmap::emit (OutputFile & o, uint32_t ind, bool & readCh) -{ - std::string yych = output_hgo (o, ind, readCh, hgo); - o.ws("if (").wstring(opts->yybm).ws("[").wu32(bitmap->i).ws("+").wstring(yych).ws("] & "); - if (opts->yybmHexTable) - { - o.wu32_hex(bitmap->m); - } - else - { - o.wu32(bitmap->m); - } - o.ws(") {\n"); - output_goto (o, ind + 1, readCh, bitmap_state->label); - o.wind(ind).ws("}\n"); - if (lgo != NULL) - { - lgo->emit (o, ind, readCh); - } -} - -label_t CpgotoTable::max_label () const -{ - label_t max = label_t::first (); - for (uint32_t i = 0; i < TABLE_SIZE; ++i) - { - if (max < table[i]->label) - { - max = table[i]->label; - }; - } - return max; -} - -void CpgotoTable::emit (OutputFile & o, uint32_t ind) -{ - o.wind(ind).ws("static void *").wstring(opts->yytarget).ws("[256] = {\n"); - o.wind(++ind); - const uint32_t max_digits = max_label ().width (); - for (uint32_t i = 0; i < TABLE_SIZE; ++i) - { - o.ws("&&").wstring(opts->labelPrefix).wlabel(table[i]->label); - if (i == TABLE_SIZE - 1) - { - o.ws("\n"); - } - else if (i % 8 == 7) - { - o.ws(",\n").wind(ind); - } - else - { - const uint32_t padding = max_digits - table[i]->label.width () + 1; - o.ws(",").wstring(std::string (padding, ' ')); - } - } - o.wind(--ind).ws("};\n"); -} - -void Cpgoto::emit (OutputFile & o, uint32_t ind, bool & readCh) -{ - std::string yych = output_hgo (o, ind, readCh, hgo); - o.ws("{\n"); - table->emit (o, ++ind); - o.wind(ind).ws("goto *").wstring(opts->yytarget).ws("[").wstring(yych).ws("];\n"); - o.wind(--ind).ws("}\n"); -} - -void Dot::emit (OutputFile & o) -{ - const uint32_t n = cases->cases_size; - if (n == 1) - { - o.wlabel(from->label).ws(" -> ").wlabel(cases->cases[0].to->label).ws("\n"); - } - else - { - for (uint32_t i = 0; i < n; ++i) - { - o.wlabel(from->label).ws(" -> ").wlabel(cases->cases[i].to->label).ws(" [label=\""); - for (uint32_t j = 0; j < cases->cases[i].ranges.size (); ++j) - { - o.wrange(cases->cases[i].ranges[j].first, cases->cases[i].ranges[j].second); - } - o.ws("\"]\n"); - } - } -} - -void Go::emit (OutputFile & o, uint32_t ind, bool & readCh) -{ - switch (type) - { - case EMPTY: - break; - case SWITCH_IF: - info.switchif->emit (o, ind, readCh); - break; - case BITMAP: - info.bitmap->emit (o, ind, readCh); - break; - case CPGOTO: - info.cpgoto->emit (o, ind, readCh); - break; - case DOT: - info.dot->emit (o); - break; - } -} - -} // namespace re2c diff --git a/src/codegen/indent.h b/src/codegen/indent.h deleted file mode 100644 index d2d8f36..0000000 --- a/src/codegen/indent.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _RE2C_CODEGEN_INDENT_ -#define _RE2C_CODEGEN_INDENT_ - -#include - -#include "src/globals.h" - -namespace re2c -{ - -inline std::string indent (uint32_t ind) -{ - std::string str; - - while (opts->target != opt_t::DOT && ind-- > 0) - { - str += opts->indString; - } - return str; -} - -} // end namespace re2c - -#endif // _RE2C_CODEGEN_INDENT_ diff --git a/src/codegen/input_api.cc b/src/codegen/input_api.cc deleted file mode 100644 index f2e32c3..0000000 --- a/src/codegen/input_api.cc +++ /dev/null @@ -1,175 +0,0 @@ -#include - -#include "src/codegen/input_api.h" -#include "src/codegen/indent.h" -#include "src/conf/opt.h" -#include "src/globals.h" - -namespace re2c -{ - -InputAPI::InputAPI () - : type_ (DEFAULT) -{} - -InputAPI::type_t InputAPI::type () const -{ - return type_; -} - -void InputAPI::set (type_t t) -{ - type_ = t; -} - -std::string InputAPI::expr_peek () const -{ - std::string s; - switch (type_) - { - case DEFAULT: - s = "*" + opts->yycursor; - break; - case CUSTOM: - s = opts->yypeek + " ()"; - break; - } - return s; -} - -std::string InputAPI::expr_peek_save () const -{ - return opts->yych + " = " + opts.yychConversion () + expr_peek (); -} - -std::string InputAPI::stmt_peek (uint32_t ind) const -{ - return indent (ind) + expr_peek_save () + ";\n"; -} - -std::string InputAPI::stmt_skip (uint32_t ind) const -{ - std::string s; - switch (type_) - { - case DEFAULT: - s = "++" + opts->yycursor; - break; - case CUSTOM: - s = opts->yyskip + " ()"; - break; - } - return indent (ind) + s + ";\n"; -} - -std::string InputAPI::stmt_backup (uint32_t ind) const -{ - std::string s; - switch (type_) - { - case DEFAULT: - s = opts->yymarker + " = " + opts->yycursor; - break; - case CUSTOM: - s = opts->yybackup + " ()"; - break; - } - return indent (ind) + s + ";\n"; -} - -std::string InputAPI::stmt_backupctx (uint32_t ind) const -{ - std::string s; - switch (type_) - { - case DEFAULT: - s = opts->yyctxmarker + " = " + opts->yycursor; - break; - case CUSTOM: - s = opts->yybackupctx + " ()"; - break; - } - return indent (ind) + s + ";\n"; -} - -std::string InputAPI::stmt_restore (uint32_t ind) const -{ - std::string s; - switch (type_) - { - case DEFAULT: - s = opts->yycursor + " = " + opts->yymarker; - break; - case CUSTOM: - s = opts->yyrestore + " ()"; - break; - } - return indent (ind) + s + ";\n"; -} - -std::string InputAPI::stmt_restorectx (uint32_t ind) const -{ - std::string s; - switch (type_) - { - case DEFAULT: - s = indent (ind) + opts->yycursor + " = " + opts->yyctxmarker + ";\n"; - break; - case CUSTOM: - s = indent (ind) + opts->yyrestorectx + " ();\n"; - break; - } - return s; -} - -std::string InputAPI::stmt_skip_peek (uint32_t ind) const -{ - return type_ == DEFAULT - ? indent (ind) + opts->yych + " = " + opts.yychConversion () + "*++" + opts->yycursor + ";\n" - : stmt_skip (ind) + stmt_peek (ind); -} - -std::string InputAPI::stmt_skip_backup (uint32_t ind) const -{ - return type_ == DEFAULT - ? indent (ind) + opts->yymarker + " = ++" + opts->yycursor + ";\n" - : stmt_skip (ind) + stmt_backup (ind); -} - -std::string InputAPI::stmt_backup_peek (uint32_t ind) const -{ - return type_ == DEFAULT - ? indent (ind) + opts->yych + " = " + opts.yychConversion () + "*(" + opts->yymarker + " = " + opts->yycursor + ");\n" - : stmt_backup (ind) + stmt_peek (ind); -} - -std::string InputAPI::stmt_skip_backup_peek (uint32_t ind) const -{ - return type_ == DEFAULT - ? indent (ind) + opts->yych + " = " + opts.yychConversion () + "*(" + opts->yymarker + " = ++" + opts->yycursor + ");\n" - : stmt_skip (ind) + stmt_backup (ind) + stmt_peek (ind); -} - -std::string InputAPI::expr_lessthan_one () const -{ - return type_ == DEFAULT - ? opts->yylimit + " <= " + opts->yycursor - : expr_lessthan (1); -} - -std::string InputAPI::expr_lessthan (size_t n) const -{ - std::ostringstream s; - switch (type_) - { - case DEFAULT: - s << "(" << opts->yylimit << " - " << opts->yycursor << ") < " << n; - break; - case CUSTOM: - s << opts->yylessthan << " (" << n << ")"; - break; - } - return s.str (); -} - -} // end namespace re2c diff --git a/src/codegen/input_api.h b/src/codegen/input_api.h deleted file mode 100644 index 423475e..0000000 --- a/src/codegen/input_api.h +++ /dev/null @@ -1,43 +0,0 @@ -#ifndef _RE2C_CODEGEN_INPUT_API_ -#define _RE2C_CODEGEN_INPUT_API_ - -#include "src/util/c99_stdint.h" -#include - -namespace re2c -{ - -class InputAPI -{ -public: - enum type_t - { DEFAULT - , CUSTOM - }; - -private: - type_t type_; - -public: - InputAPI (); - type_t type () const; - void set (type_t t); - std::string expr_peek () const; - std::string expr_peek_save () const; - std::string stmt_peek (uint32_t ind) const; - std::string stmt_skip (uint32_t ind) const; - std::string stmt_backup (uint32_t ind) const; - std::string stmt_backupctx (uint32_t ind) const; - std::string stmt_restore (uint32_t ind) const; - std::string stmt_restorectx (uint32_t ind) const; - std::string stmt_skip_peek (uint32_t ind) const; - std::string stmt_skip_backup (uint32_t ind) const; - std::string stmt_backup_peek (uint32_t ind) const; - std::string stmt_skip_backup_peek (uint32_t ind) const; - std::string expr_lessthan_one () const; - std::string expr_lessthan (size_t n) const; -}; - -} // end namespace re2c - -#endif // _RE2C_CODEGEN_INPUT_API_ diff --git a/src/codegen/output.cc b/src/codegen/output.cc deleted file mode 100644 index 5276ef7..0000000 --- a/src/codegen/output.cc +++ /dev/null @@ -1,465 +0,0 @@ -#include -#include -#include - -#include "src/codegen/indent.h" -#include "src/codegen/output.h" -#include "src/codegen/print.h" -#include "src/conf/opt.h" -#include "src/conf/warn.h" -#include "src/globals.h" -#include "src/ir/rule_rank.h" - -namespace re2c -{ - -OutputFragment::OutputFragment (type_t t, uint32_t i) - : type (t) - , stream () - , indent (i) -{} - -uint32_t OutputFragment::count_lines () -{ - uint32_t lines = 0; - const std::string content = stream.str (); - const char * p = content.c_str (); - for (uint32_t i = 0; i < content.size (); ++i) - { - if (p[i] == '\n') - { - ++lines; - } - } - return lines; -} - -OutputBlock::OutputBlock () - : fragments () - , used_yyaccept (false) - , force_start_label (false) - , user_start_label () - , line (0) -{ - fragments.push_back (new OutputFragment (OutputFragment::CODE, 0)); -} - -OutputBlock::~OutputBlock () -{ - for (unsigned int i = 0; i < fragments.size (); ++i) - { - delete fragments[i]; - } -} - -OutputFile::OutputFile (const char * fn) - : file_name (fn) - , file (NULL) - , blocks () - , label_counter () - , warn_condition_order (!opts->tFlag) // see note [condition order] -{ - new_block (); -} - -bool OutputFile::open () -{ - if (file_name == NULL) - { - file_name = ""; - file = stdout; - } - else - { - file = fopen (file_name, "wb"); - } - return file != NULL; -} - -OutputFile::~OutputFile () -{ - if (file != NULL && file != stdout) - { - fclose (file); - } - for (unsigned int i = 0; i < blocks.size (); ++i) - { - delete blocks[i]; - } -} - -std::ostream & OutputFile::stream () -{ - return blocks.back ()->fragments.back ()->stream; -} - -OutputFile & OutputFile::wraw (const char * s, size_t n) -{ - stream ().write (s, static_cast (n)); - return *this; -} - -OutputFile & OutputFile::wu32_hex (uint32_t n) -{ - prtHex (stream (), n); - return *this; -} - -OutputFile & OutputFile::wc_hex (uint32_t n) -{ - prtChOrHex (stream (), n); - return *this; -} - -OutputFile & OutputFile::wrange (uint32_t l, uint32_t u) -{ - printSpan (stream (), l, u); - return *this; -} - -OutputFile & OutputFile::wu32_width (uint32_t n, int w) -{ - stream () << std::setw (w); - stream () << n; - return *this; -} - -OutputFile & OutputFile::wline_info (uint32_t l, const char * fn) -{ - output_line_info (stream (), l, fn); - return *this; -} - -OutputFile & OutputFile::wversion_time () -{ - output_version_time (stream ()); - return *this; -} - -OutputFile & OutputFile::wuser_start_label () -{ - const std::string label = blocks.back ()->user_start_label; - if (!label.empty ()) - { - wstring(label).ws(":\n"); - } - return *this; -} - -OutputFile & OutputFile::wc (char c) -{ - stream () << c; - return *this; -} - -OutputFile & OutputFile::wu32 (uint32_t n) -{ - stream () << n; - return *this; -} - -OutputFile & OutputFile::wu64 (uint64_t n) -{ - stream () << n; - return *this; -} - -OutputFile & OutputFile::wstring (const std::string & s) -{ - stream () << s; - return *this; -} - -OutputFile & OutputFile::ws (const char * s) -{ - stream () << s; - return *this; -} - -OutputFile & OutputFile::wlabel (label_t l) -{ - stream () << l; - return *this; -} - -OutputFile & OutputFile::wrank (rule_rank_t r) -{ - stream () << r; - return *this; -} - -OutputFile & OutputFile::wind (uint32_t ind) -{ - stream () << indent(ind); - return *this; -} - -void OutputFile::insert_code () -{ - blocks.back ()->fragments.push_back (new OutputFragment (OutputFragment::CODE, 0)); -} - -OutputFile & OutputFile::wdelay_line_info () -{ - blocks.back ()->fragments.push_back (new OutputFragment (OutputFragment::LINE_INFO, 0)); - insert_code (); - return *this; -} - -OutputFile & OutputFile::wdelay_state_goto (uint32_t ind) -{ - if (opts->fFlag && !bWroteGetState) - { - blocks.back ()->fragments.push_back (new OutputFragment (OutputFragment::STATE_GOTO, ind)); - insert_code (); - bWroteGetState = true; - } - return *this; -} - -OutputFile & OutputFile::wdelay_types () -{ - warn_condition_order = false; // see note [condition order] - blocks.back ()->fragments.push_back (new OutputFragment (OutputFragment::TYPES, 0)); - insert_code (); - return *this; -} - -OutputFile & OutputFile::wdelay_warn_condition_order () -{ - blocks.back ()->fragments.push_back (new OutputFragment (OutputFragment::WARN_CONDITION_ORDER, 0)); - insert_code (); - return *this; -} - -OutputFile & OutputFile::wdelay_yyaccept_init (uint32_t ind) -{ - blocks.back ()->fragments.push_back (new OutputFragment (OutputFragment::YYACCEPT_INIT, ind)); - insert_code (); - return *this; -} - -OutputFile & OutputFile::wdelay_yymaxfill () -{ - blocks.back ()->fragments.push_back (new OutputFragment (OutputFragment::YYMAXFILL, 0)); - insert_code (); - return *this; -} - -void OutputFile::set_used_yyaccept () -{ - blocks.back ()->used_yyaccept = true; -} - -bool OutputFile::get_used_yyaccept () const -{ - return blocks.back ()->used_yyaccept; -} - -void OutputFile::set_force_start_label (bool force) -{ - blocks.back ()->force_start_label = force; -} - -void OutputFile::set_user_start_label (const std::string & label) -{ - blocks.back ()->user_start_label = label; -} - -bool OutputFile::get_force_start_label () const -{ - return blocks.back ()->force_start_label; -} - -void OutputFile::set_block_line (uint32_t l) -{ - blocks.back ()->line = l; -} - -uint32_t OutputFile::get_block_line () const -{ - return blocks.back ()->line; -} - -void OutputFile::new_block () -{ - blocks.push_back (new OutputBlock ()); - insert_code (); -} - -void OutputFile::emit - ( const std::vector & types - , size_t max_fill - ) -{ - if (file != NULL) - { - unsigned int line_count = 1; - for (unsigned int j = 0; j < blocks.size (); ++j) - { - OutputBlock & b = * blocks[j]; - for (unsigned int i = 0; i < b.fragments.size (); ++i) - { - OutputFragment & f = * b.fragments[i]; - switch (f.type) - { - case OutputFragment::CODE: - break; - case OutputFragment::LINE_INFO: - output_line_info (f.stream, line_count + 1, file_name); - break; - case OutputFragment::STATE_GOTO: - output_state_goto (f.stream, f.indent, 0); - break; - case OutputFragment::TYPES: - output_types (f.stream, f.indent, types); - break; - case OutputFragment::WARN_CONDITION_ORDER: - if (warn_condition_order) // see note [condition order] - { - warn.condition_order (b.line); - } - break; - case OutputFragment::YYACCEPT_INIT: - output_yyaccept_init (f.stream, f.indent, b.used_yyaccept); - break; - case OutputFragment::YYMAXFILL: - output_yymaxfill (f.stream, max_fill); - break; - } - std::string content = f.stream.str (); - fwrite (content.c_str (), 1, content.size (), file); - line_count += f.count_lines (); - } - } - } -} - -HeaderFile::HeaderFile (const char * fn) - : stream () - // header is always generated, but not always dumped to file - // NULL filename crashes 'operator <<' on some platforms - // TODO: generate header only if necessary - , file_name (fn ? fn : ".h") - , file (NULL) -{} - -bool HeaderFile::open () -{ - file = fopen (file_name, "wb"); - return file != NULL; -} - -void HeaderFile::emit (const std::vector & types) -{ - output_version_time (stream); - output_line_info (stream, 3, file_name); - stream << "\n"; - output_types (stream, 0, types); -} - -HeaderFile::~HeaderFile () -{ - if (file != NULL) - { - std::string content = stream.str (); - fwrite (content.c_str (), 1, content.size (), file); - fclose (file); - } -} - -Output::Output (const char * source_name, const char * header_name) - : source (source_name) - , header (header_name) - , types () - , skeletons () - , max_fill (1) -{} - -Output::~Output () -{ - if (!warn.error ()) - { - source.emit (types, max_fill); - header.emit (types); - } -} - -void output_state_goto (std::ostream & o, uint32_t ind, uint32_t start_label) -{ - o << indent(ind) << "switch (" << output_get_state() << ") {\n"; - if (opts->bUseStateAbort) - { - o << indent(ind) << "default: abort();\n"; - o << indent(ind) << "case -1: goto " << opts->labelPrefix << start_label << ";\n"; - } - else - { - o << indent(ind) << "default: goto " << opts->labelPrefix << start_label << ";\n"; - } - for (uint32_t i = 0; i < last_fill_index; ++i) - { - o << indent(ind) << "case " << i << ": goto " << opts->yyfilllabel << i << ";\n"; - } - o << indent(ind) << "}\n"; - if (opts->bUseStateNext) - { - o << opts->yynext << ":\n"; - } -} - -void output_yyaccept_init (std::ostream & o, uint32_t ind, bool used_yyaccept) -{ - if (used_yyaccept) - { - o << indent (ind) << "unsigned int " << opts->yyaccept << " = 0;\n"; - } -} - -void output_yymaxfill (std::ostream & o, size_t max_fill) -{ - o << "#define YYMAXFILL " << max_fill << "\n"; -} - -void output_line_info (std::ostream & o, uint32_t line_number, const char * file_name) -{ - if (!opts->iFlag) - { - o << "#line " << line_number << " \"" << file_name << "\"\n"; - } -} - -void output_types (std::ostream & o, uint32_t ind, const std::vector & types) -{ - o << indent (ind++) << "enum " << opts->yycondtype << " {\n"; - for (unsigned int i = 0; i < types.size (); ++i) - { - o << indent (ind) << opts->condEnumPrefix << types[i] << ",\n"; - } - o << indent (--ind) << "};\n"; -} - -void output_version_time (std::ostream & o) -{ - o << "/* Generated by re2c"; - if (opts->version) - { - o << " " << PACKAGE_VERSION; - } - if (!opts->bNoGenerationDate) - { - o << " on "; - time_t now = time (NULL); - o.write (ctime (&now), 24); - } - o << " */" << "\n"; -} - -std::string output_get_state () -{ - return opts->state_get_naked - ? opts->state_get - : opts->state_get + "()"; -} - -} // namespace re2c diff --git a/src/codegen/output.h b/src/codegen/output.h deleted file mode 100644 index 774fea3..0000000 --- a/src/codegen/output.h +++ /dev/null @@ -1,158 +0,0 @@ -#ifndef _RE2C_CODEGEN_OUTPUT_ -#define _RE2C_CODEGEN_OUTPUT_ - -#include "src/util/c99_stdint.h" -#include -#include -#include -#include -#include -#include -#include - -#include "src/codegen/label.h" -#include "src/util/counter.h" -#include "src/util/forbid_copy.h" - -namespace re2c -{ - -class rule_rank_t; - -struct OutputFragment -{ - enum type_t - { CODE -// , CONFIG - , LINE_INFO - , STATE_GOTO - , TYPES - , WARN_CONDITION_ORDER - , YYACCEPT_INIT - , YYMAXFILL - }; - - type_t type; - std::ostringstream stream; - uint32_t indent; - - OutputFragment (type_t t, uint32_t i); - uint32_t count_lines (); -}; - -struct OutputBlock -{ - std::vector fragments; - bool used_yyaccept; - bool force_start_label; - std::string user_start_label; - uint32_t line; - - OutputBlock (); - ~OutputBlock (); -}; - -struct OutputFile -{ -public: - const char * file_name; - -private: - FILE * file; - std::vector blocks; - -public: - counter_t label_counter; - bool warn_condition_order; - -private: - std::ostream & stream (); - void insert_code (); - -public: - OutputFile (const char * fn); - ~OutputFile (); - - bool open (); - - void new_block (); - - // immediate output - OutputFile & wraw (const char * s, size_t n); - OutputFile & wc (char c); - OutputFile & wc_hex (uint32_t n); - OutputFile & wu32 (uint32_t n); - OutputFile & wu32_hex (uint32_t n); - OutputFile & wu32_width (uint32_t n, int w); - OutputFile & wu64 (uint64_t n); - OutputFile & wstring (const std::string & s); - OutputFile & ws (const char * s); - OutputFile & wlabel (label_t l); - OutputFile & wrank (rule_rank_t l); - OutputFile & wrange (uint32_t u, uint32_t l); - OutputFile & wline_info (uint32_t l, const char * fn); - OutputFile & wversion_time (); - OutputFile & wuser_start_label (); - OutputFile & wind (uint32_t ind); - - // delayed output - OutputFile & wdelay_line_info (); - OutputFile & wdelay_state_goto (uint32_t ind); - OutputFile & wdelay_types (); - OutputFile & wdelay_warn_condition_order (); - OutputFile & wdelay_yyaccept_init (uint32_t ind); - OutputFile & wdelay_yymaxfill (); - - void set_used_yyaccept (); - bool get_used_yyaccept () const; - void set_force_start_label (bool force); - void set_user_start_label (const std::string & label); - bool get_force_start_label () const; - void set_block_line (uint32_t l); - uint32_t get_block_line () const; - - void emit (const std::vector & types, size_t max_fill); - - FORBID_COPY (OutputFile); -}; - -struct HeaderFile -{ - HeaderFile (const char * fn); - ~HeaderFile (); - bool open (); - void emit (const std::vector & types); - -private: - std::ostringstream stream; - const char * file_name; - FILE * file; - - FORBID_COPY (HeaderFile); -}; - -struct Output -{ - OutputFile source; - HeaderFile header; - std::vector types; - std::set skeletons; - size_t max_fill; - - Output (const char * source_name, const char * header_name); - ~Output (); -}; - -void output_line_info (std::ostream &, uint32_t, const char *); -void output_state_goto (std::ostream &, uint32_t, uint32_t); -void output_types (std::ostream &, uint32_t, const std::vector &); -void output_version_time (std::ostream &); -void output_yyaccept_init (std::ostream &, uint32_t, bool); -void output_yymaxfill (std::ostream &, size_t); - -// helpers -std::string output_get_state (); - -} // namespace re2c - -#endif // _RE2C_CODEGEN_OUTPUT_ diff --git a/src/codegen/print.cc b/src/codegen/print.cc deleted file mode 100644 index 2303e84..0000000 --- a/src/codegen/print.cc +++ /dev/null @@ -1,156 +0,0 @@ -#include - -#include "src/codegen/print.h" -#include "src/conf/opt.h" -#include "src/globals.h" -#include "src/ir/regexp/encoding/enc.h" - -namespace re2c -{ - -bool is_print (uint32_t c) -{ - return c >= 0x20 && c < 0x7F; -} - -bool is_space (uint32_t c) -{ - switch (c) - { - case '\t': - case '\f': - case '\v': - case '\n': - case '\r': - case ' ': - return true; - default: - return false; - } -} - -char hexCh(uint32_t c) -{ - static const char * sHex = "0123456789ABCDEF"; - return sHex[c & 0x0F]; -} - -void prtChOrHex(std::ostream& o, uint32_t c) -{ - if (opts->encoding.type () != Enc::EBCDIC - && (is_print (c) || is_space (c))) - { - o << '\''; - prtCh(o, c); - o << '\''; - } - else - { - prtHex(o, c); - } -} - -void prtHex(std::ostream& o, uint32_t c) -{ - o << "0x"; - const uint32_t cunit_size = opts->encoding.szCodeUnit (); - if (cunit_size >= 4) - { - o << hexCh (c >> 28u) - << hexCh (c >> 24u) - << hexCh (c >> 20u) - << hexCh (c >> 16u); - } - if (cunit_size >= 2) - { - o << hexCh (c >> 12u) - << hexCh (c >> 8u); - } - o << hexCh (c >> 4u) - << hexCh (c); -} - -void prtCh(std::ostream& o, uint32_t c) -{ - const bool dot = opts->target == opt_t::DOT; - - switch (c) - { - case '\'': - o << (dot ? "'" : "\\'"); - break; - - case '"': - o << (dot ? "\\\"" : "\""); - break; - - case '\n': - o << (dot ? "\\\\n" : "\\n"); - break; - - case '\t': - o << (dot ? "\\\\t" : "\\t"); - break; - - case '\v': - o << (dot ? "\\\\v" : "\\v"); - break; - - case '\b': - o << (dot ? "\\\\b" : "\\b"); - break; - - case '\r': - o << (dot ? "\\\\r" : "\\r"); - break; - - case '\f': - o << (dot ? "\\\\f" : "\\f"); - break; - - case '\a': - o << (dot ? "\\\\a" :"\\a"); - break; - - case '\\': - o << "\\\\"; // both .dot and C/C++ code expect "\\" - break; - - default: - o << static_cast (c); - break; - } -} - -void prtChOrHexForSpan(std::ostream& o, uint32_t c) -{ - if (opts->encoding.type () != Enc::EBCDIC - && is_print (c) - && (c != ']')) - { - prtCh(o, c); - } - else - { - prtHex(o, c); - } -} - -void printSpan(std::ostream& o, uint32_t lb, uint32_t ub) -{ - o << "["; - if ((ub - lb) == 1) - { - prtChOrHexForSpan(o, lb); - } - else - { - prtChOrHexForSpan(o, lb); - o << "-"; - prtChOrHexForSpan(o, ub - 1); - } - o << "]"; -} - -} // end namespace re2c - diff --git a/src/codegen/print.h b/src/codegen/print.h deleted file mode 100644 index 978d13e..0000000 --- a/src/codegen/print.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef _RE2C_CODEGEN_PRINT_ -#define _RE2C_CODEGEN_PRINT_ - -#include "src/util/c99_stdint.h" -#include - -namespace re2c -{ - -bool is_print (uint32_t c); -bool is_space (uint32_t c); -char hexCh(uint32_t c); -void prtCh(std::ostream&, uint32_t); -void prtHex(std::ostream&, uint32_t); -void prtChOrHex(std::ostream&, uint32_t); -void printSpan(std::ostream&, uint32_t, uint32_t); - -} // end namespace re2c - -#endif // _RE2C_CODEGEN_PRINT_ diff --git a/src/compile.cc b/src/compile.cc new file mode 100644 index 0000000..51ac7e2 --- /dev/null +++ b/src/compile.cc @@ -0,0 +1,193 @@ +#include +#include "src/util/c99_stdint.h" +#include +#include +#include +#include + +#include "src/adfa/adfa.h" +#include "src/adfa/dump.h" +#include "src/ast/ast.h" +#include "src/ast/parser.h" +#include "src/ast/scanner.h" +#include "src/code/label.h" +#include "src/code/output.h" +#include "src/compile.h" +#include "src/conf/opt.h" +#include "src/dfa/dfa.h" +#include "src/dfa/dump.h" +#include "src/nfa/nfa.h" +#include "src/re/encoding/range_suffix.h" +#include "src/re/re.h" +#include "src/re/rule.h" +#include "src/skeleton/skeleton.h" +#include "src/util/counter.h" +#include "src/util/free_list.h" +#include "src/util/range.h" +#include "src/util/smart_ptr.h" + +namespace re2c { + +class Warn; + +static std::string make_name(const std::string &cond, uint32_t line) +{ + std::ostringstream os; + os << "line" << line; + std::string name = os.str(); + if (!cond.empty ()) + { + name += "_"; + name += cond; + } + return name; +} + +static smart_ptr ast_to_dfa(const spec_t &spec, Output &output) +{ + const opt_t *opts = output.source.block().opts; + Warn &warn = output.source.warn; + const std::vector &rules = spec.rules; + const size_t defrule = spec.defs.empty() + ? Rule::NONE + : rules.size() - 1; + const uint32_t line = output.source.block().line; + const std::string + &cond = spec.name, + name = make_name(cond, line), + &setup = spec.setup.empty() ? "" : spec.setup[0]->text; + + RESpec re(rules, opts, warn); + split_charset(re); + find_fixed_tags(re); + insert_default_tags(re); + warn_nullable(re, cond); + + nfa_t nfa(re); + if (opts->dump_nfa) dump_nfa(nfa); + + dfa_t dfa(nfa, opts, cond, warn); + if (opts->dump_dfa_det) dump_dfa(dfa); + + // skeleton must be constructed after DFA construction + // but prior to any other DFA transformations + Skeleton skeleton(dfa, opts, defrule, name, cond, line); + warn_undefined_control_flow(skeleton, warn); + if (opts->target == TARGET_SKELETON) { + emit_data(skeleton); + } + + cutoff_dead_rules(dfa, defrule, cond, warn); + + insert_fallback_tags(dfa); + + // try to minimize the number of tag variables + compact_and_optimize_tags(dfa, opts->optimize_tags); + if (opts->dump_dfa_tagopt) dump_dfa(dfa); + + freeze_tags(dfa); + + minimization(dfa, opts->dfa_minimization); + if (opts->dump_dfa_min) dump_dfa(dfa); + + // find YYFILL states and calculate argument to YYFILL + std::vector fill; + fillpoints(dfa, fill); + + // ADFA stands for 'DFA with actions' + DFA *adfa = new DFA(dfa, fill, defrule, skeleton.sizeof_key, + name, cond, line, setup); + + // see note [reordering DFA states] + adfa->reorder(); + + // skeleton is constructed, do further DFA transformations + adfa->prepare(opts); + if (opts->dump_adfa) dump_adfa(*adfa); + + // finally gather overall DFA statistics + adfa->calc_stats(line, opts->tags); + + // accumulate global statistics from this particular DFA + output.max_fill = std::max(output.max_fill, adfa->max_fill); + output.max_nmatch = std::max(output.max_nmatch, adfa->max_nmatch); + if (adfa->need_accept) + { + output.source.block().used_yyaccept = true; + } + + return make_smart_ptr(adfa); +} + +void compile(Scanner &input, Output &output, Opt &opts) +{ + specs_t rspecs; + symtab_t symtab; + const conopt_t *globopts = &opts.glob; + const opt_t *ropts = NULL; + OutputFile &o = output.source; + typedef std::vector > dfas_t; + + o.new_block(opts); + o.wversion_time().wline_info(input.get_cline(), input.get_fname().c_str()); + if (globopts->target == TARGET_SKELETON) { + emit_prolog(o); + } + + for (Scanner::ParseMode mode; (mode = input.echo(o)) != Scanner::Stop;) { + + validate_mode(mode, globopts->rFlag, ropts, input); + + // parse next re2c block + specs_t specs; + if (mode == Scanner::Reuse) { + specs = rspecs; + opts.restore(ropts); + opts.reset_mapCodeName(); + o.label_counter.reset(); + o.fill_index = 0; + o.state_goto = false; + o.cond_goto = false; + } + parse(input, specs, symtab, opts); + + // start new output block with accumulated options + o.new_block(opts); + + if (mode == Scanner::Rules) { + // save AST and options for future use + rspecs = specs; + ropts = o.block().opts; + } else { + validate_ast(specs, globopts->cFlag); + normalize_ast(specs); + + // compile AST to DFA + o.block().line = input.get_cline(); + dfas_t dfas; + for (specs_t::const_iterator i = specs.begin(); i != specs.end(); ++i) { + dfas.push_back(ast_to_dfa(*i, output)); + } + + // compile DFA to code + bool prolog = false; + uint32_t ind = o.block().opts->topIndent; + for (dfas_t::const_iterator i = dfas.begin(); i != dfas.end(); ++i) { + (*i)->emit(output, ind, (i + 1) == dfas.end(), prolog); + } + } + + o.wline_info (input.get_cline (), input.get_fname ().c_str ()); + } + + if (globopts->target == TARGET_SKELETON) { + emit_epilog (o, output.skeletons); + } + + AST::flist.clear(); + Code::flist.clear(); + Range::vFreeList.clear(); + RangeSuffix::freeList.clear(); +} + +} // namespace re2c diff --git a/src/compile.h b/src/compile.h new file mode 100644 index 0000000..ee1a8a0 --- /dev/null +++ b/src/compile.h @@ -0,0 +1,19 @@ +#ifndef _RE2C_COMPILE_ +#define _RE2C_COMPILE_ + +#include "src/ast/scanner.h" +#include "src/code/output.h" +#include "src/conf/opt.h" + +namespace re2c +{ + +class Scanner; +struct Opt; +struct Output; + +void compile(Scanner &input, Output &output, Opt &opts); + +} // namespace re2c + +#endif // _RE2C_COMPILE_ diff --git a/src/conf/msg.cc b/src/conf/msg.cc index ec13c0a..68e9cd1 100644 --- a/src/conf/msg.cc +++ b/src/conf/msg.cc @@ -1,10 +1,13 @@ #include #include +#include #include #include "config.h" #include "src/conf/msg.h" +extern const char *help; // autogenerated + namespace re2c { void error (const char * fmt, ...) @@ -19,9 +22,43 @@ void error (const char * fmt, ...) fprintf (stderr, "\n"); } -void error_encoding () +void fatal(const char *fmt, ...) { - error ("only one of switches -e, -w, -x, -u and -8 must be set"); + fprintf (stderr, "re2c: error: "); + + va_list args; + va_start (args, fmt); + vfprintf (stderr, fmt, args); + va_end (args); + + fprintf (stderr, "\n"); + exit(1); +} + +void fatal_l(uint32_t line, const char *fmt, ...) +{ + fprintf (stderr, "re2c: error: line %u: ", line); + + va_list args; + va_start (args, fmt); + vfprintf (stderr, fmt, args); + va_end (args); + + fprintf (stderr, "\n"); + exit(1); +} + +void fatal_lc(uint32_t line, uint32_t column, const char *fmt, ...) +{ + fprintf (stderr, "re2c: error: line %u, column %u: ", line, column); + + va_list args; + va_start (args, fmt); + vfprintf (stderr, fmt, args); + va_end (args); + + fprintf (stderr, "\n"); + exit(1); } void error_arg (const char * option) @@ -31,7 +68,7 @@ void error_arg (const char * option) void warning_start (uint32_t line, bool error) { - static const char * msg = error ? "error" : "warning"; + const char * msg = error ? "error" : "warning"; fprintf (stderr, "re2c: %s: line %u: ", msg, line); } @@ -57,159 +94,9 @@ void warning (const char * type, uint32_t line, bool error, const char * fmt, .. warning_end (type, error); } -void usage () +void usage() { - fprintf (stderr, - "usage: re2c [-bcdDefFghirsuvVwx18] [-o of] [-t th] file\n" - "\n" - "-? -h --help Display this info.\n" - "\n" - "-b --bit-vectors Implies -s. Use bit vectors as well in the attempt to\n" - " coax better code out of the compiler. Most useful for\n" - " specifications with more than a few keywords (e.g. for\n" - " most programming languages).\n" - "\n" - "-c --conditions Require start conditions.\n" - "\n" - "-d --debug-output Creates a parser that dumps information during\n" - " about the current position and in which state the\n" - " parser is.\n" - "\n" - "-D --emit-dot Emit a Graphviz dot view of the DFA graph\n" - "\n" - "-e --ecb Generate a parser that supports EBCDIC. The generated code\n" - " can deal with any character up to 0xFF. In this mode re2c\n" - " assumes that input character size is 1 byte. This switch is\n" - " incompatible with -w, -u, -x and -8\n" - "\n" - "-f --storable-state Generate a scanner that supports storable states.\n" - "\n" - "-F --flex-syntax Partial support for flex syntax.\n" - "\n" - "-g --computed-gotos Implies -b. Generate computed goto code (only useable\n" - " with gcc).\n" - "\n" - "-i --no-debug-info Do not generate '#line' info (useful for versioning).\n" - "\n" - "-o of --output=of Specify the output file (of) instead of stdout\n" - "\n" - "-r --reusable Allow reuse of scanner definitions.\n" - "\n" - "-s --nested-ifs Generate nested ifs for some switches. Many compilers\n" - " need this assist to generate better code.\n" - "\n" - "-t th --type-header=th Generate a type header file (th) with type definitions.\n" - "\n" - "-u --unicode Generate a parser that supports UTF-32. The generated code\n" - " can deal with any valid Unicode character up to 0x10FFFF.\n" - " In this mode re2c assumes that input character size is 4 bytes.\n" - " This switch is incompatible with -e, -w, -x and -8. It implies -s.\n" - "\n" - "-v --version Show version information.\n" - "\n" - "-V --vernum Show version as one number.\n" - "\n" - "-w --wide-chars Generate a parser that supports UCS-2. The generated code can\n" - " deal with any valid Unicode character up to 0xFFFF. In this mode\n" - " re2c assumes that input character size is 2 bytes. This switch is\n" - " incompatible with -e, -x, -u and -8. It implies -s." - "\n" - "-x --utf-16 Generate a parser that supports UTF-16. The generated code can\n" - " deal with any valid Unicode character up to 0x10FFFF. In this mode\n" - " re2c assumes that input character size is 2 bytes. This switch is\n" - " incompatible with -e, -w, -u and -8. It implies -s." - "\n" - "-8 --utf-8 Generate a parser that supports UTF-8. The generated code can\n" - " deal with any valid Unicode character up to 0x10FFFF. In this mode\n" - " re2c assumes that input character size is 1 byte. This switch is\n" - " incompatible with -e, -w, -x and -u." - "\n" - "--no-generation-date Suppress date output in the generated file.\n" - "\n" - "--no-version Suppress version output in the generated file.\n" - "\n" - "--case-insensitive All strings are case insensitive, so all \"-expressions\n" - " are treated in the same way '-expressions are.\n" - "\n" - "--case-inverted Invert the meaning of single and double quoted strings.\n" - " With this switch single quotes are case sensitive and\n" - " double quotes are case insensitive.\n" - "\n" - "--encoding-policy ep Specify what re2c should do when given bad code unit.\n" - " ep can be one of the following: fail, substitute, ignore.\n" - "\n" - "--input i Specify re2c input API.\n" - " i can be one of the following: default, custom.\n" - "\n" - "--skeleton Instead of embedding re2c-generated code into C/C++ source,\n" - " generate a self-contained program for the same DFA.\n" - " Most useful for correctness and performance testing.\n" - "\n" - "--empty-class policy What to do if user inputs empty character class. policy can be\n" - " one of the following: 'match-empty' (match empty input, default),\n" - " 'match-none' (fail to match on any input), 'error' (compilation\n" - " error). Note that there are various ways to construct empty class,\n" - " e.g: [], [^\\x00-\\xFF], [\\x00-\\xFF]\\[\\x00-\\xFF].\n" - "\n" - "--dfa-minimization \n" - " Internal algorithm used by re2c to minimize DFA (defaults to\n" - " 'moore'). Both table filling and Moore's algorithms should\n" - " produce identical DFA (up to states relabelling). Table filling\n" - " algorithm is much simpler and slower; it serves as a reference\n" - " implementation.\n" - "\n" - "-1 --single-pass Deprecated and does nothing (single pass is by default now).\n" - "\n" - "-W Turn on all warnings.\n" - "\n" - "-Werror Turn warnings into errors. Note that this option along doesn't\n" - " turn on any warnings, it only affects those warnings that have\n" - " been turned on so far or will be turned on later.\n" - "\n" - "-W Turn on individual warning.\n" - "\n" - "-Wno- Turn off individual warning.\n" - "\n" - "-Werror- Turn on individual warning and treat it as error (this implies\n" - " '-W').\n" - "\n" - "-Wno-error- Don't treat this particular warning as error. This doesn't turn\n" - " off the warning itself.\n" - "\n" - "Warnings:\n" - "\n" - "-Wcondition-order Warn if the generated program makes implicit assumptions about\n" - " condition numbering. One should use either '-t, --type-header'\n" - " option or '/*!types:re2c*/' directive to generate mapping of\n" - " condition names to numbers and use autogenerated condition names.\n" - "\n" - "-Wempty-character-class Warn if regular expression contains empty character class. From\n" - " the rational point of view trying to match empty character class\n" - " makes no sense: it should always fail. However, for backwards\n" - " compatibility reasons re2c allows empty character class and treats\n" - " it as empty string. Use '--empty-class' option to change default\n" - " behaviour.\n" - "\n" - "-Wmatch-empty-string Warn if regular expression in a rule is nullable (matches empty\n" - " string). If DFA runs in a loop and empty match is unintentional\n" - " (input position in not advanced manually), lexer may get stuck\n" - " in eternal loop.\n" - "\n" - "-Wswapped-range Warn if range lower bound is greater that upper bound. Default\n" - " re2c behaviour is to silently swap range bounds.\n" - "\n" - "-Wundefined-control-flow\n" - " Warn if some input strings cause undefined control flow in lexer\n" - " (the faulty patterns are reported). This is the most dangerous\n" - " and common mistake. It can be easily fixed by adding default rule\n" - " '*' (this rule has the lowest priority, matches any code unit\n" - " and consumes exactly one code unit).\n" - "\n" - "-Wuseless-escape Warn if a symbol is escaped when it shouldn't be. By default re2c\n" - " silently ignores escape, but this may as well indicate a typo\n" - " or an error in escape sequence.\n" - "\n" - ); + fprintf(stdout, "%s", help); } void vernum () diff --git a/src/conf/msg.h b/src/conf/msg.h index b705552..74781ce 100644 --- a/src/conf/msg.h +++ b/src/conf/msg.h @@ -1,16 +1,18 @@ #ifndef _RE2C_CONF_MSG_ #define _RE2C_CONF_MSG_ +#include "src/util/c99_stdint.h" #include #include "src/util/attribute.h" -#include "src/util/c99_stdint.h" namespace re2c { -void error (const char * fmt, ...) RE2C_GXX_ATTRIBUTE ((format (printf, 1, 2))); -void error_encoding (); -void error_arg (const char * option); +void error(const char *fmt, ...) RE2C_GXX_ATTRIBUTE ((format (printf, 1, 2))); +void fatal(const char *fmt, ...) RE2C_GXX_ATTRIBUTE ((format (printf, 1, 2), noreturn)); +void fatal_l(uint32_t line, const char *fmt, ...) RE2C_GXX_ATTRIBUTE ((format (printf, 2, 3), noreturn)); +void fatal_lc(uint32_t line, uint32_t column, const char *fmt, ...) RE2C_GXX_ATTRIBUTE ((format (printf, 3, 4), noreturn)); +void error_arg(const char *option); void warning_start (uint32_t line, bool error); void warning_end (const char * type, bool error); void warning (const char * type, uint32_t line, bool error, const char * fmt, ...) RE2C_GXX_ATTRIBUTE ((format (printf, 4, 5))); diff --git a/src/conf/opt.cc b/src/conf/opt.cc index fa65cea..33b3051 100644 --- a/src/conf/opt.cc +++ b/src/conf/opt.cc @@ -4,41 +4,23 @@ namespace re2c { -Opt opts; - -opt_t::opt_t () -#define OPT1(type, name, value) : name (value) -#define OPT(type, name, value) , name (value) - RE2C_OPTS -#undef OPT1 -#undef OPT -{} - -opt_t::opt_t (const opt_t & opt) -#define OPT1(type, name, value) : name (opt.name) -#define OPT(type, name, value) , name (opt.name) - RE2C_OPTS -#undef OPT1 -#undef OPT -{} - -opt_t & opt_t::operator = (const opt_t & opt) +void conopt_t::fix() { -#define OPT1 OPT -#define OPT(type, name, value) name = opt.name; - RE2C_OPTS -#undef OPT1 -#undef OPT - return *this; + if (target == TARGET_SKELETON) { + fFlag = false; + header_file = ""; + } + if (!cFlag) { + header_file = ""; + } } -void opt_t::fix () +void mutopt_t::fix(const conopt_t *globopts) { // some options either make no sense or must have fixed value // with current target: reset them to default - switch (target) - { - case DOT: + switch (globopts->target) { + case TARGET_DOT: // default code generation options sFlag = Opt::baseopt.sFlag; bFlag = Opt::baseopt.bFlag; @@ -47,7 +29,7 @@ void opt_t::fix () // default environment-insensitive formatting yybmHexTable = Opt::baseopt.yybmHexTable; // fallthrough - case SKELETON: + case TARGET_SKELETON: // default line information iFlag = Opt::baseopt.iFlag; // default environment-sensitive formatting @@ -56,8 +38,6 @@ void opt_t::fix () condDivider = Opt::baseopt.condDivider; condDividerParam = Opt::baseopt.condDividerParam; // default environment bindings - tFlag = Opt::baseopt.tFlag; - header_file = Opt::baseopt.header_file; yycondtype = Opt::baseopt.yycondtype; cond_get = Opt::baseopt.cond_get; cond_get_naked = Opt::baseopt.cond_get_naked; @@ -69,12 +49,14 @@ void opt_t::fix () condEnumPrefix = Opt::baseopt.condEnumPrefix; condGoto = Opt::baseopt.condGoto; condGotoParam = Opt::baseopt.condGotoParam; - fFlag = Opt::baseopt.fFlag; state_get = Opt::baseopt.state_get; state_get_naked = Opt::baseopt.state_get_naked; state_set = Opt::baseopt.state_set; state_set_arg = Opt::baseopt.state_set_arg; state_set_naked = Opt::baseopt.state_set_naked; + tags_prefix = Opt::baseopt.tags_prefix; + tags_expression = Opt::baseopt.tags_expression; + optimize_tags = Opt::baseopt.optimize_tags; yyfilllabel = Opt::baseopt.yyfilllabel; yynext = Opt::baseopt.yynext; yyaccept = Opt::baseopt.yyaccept; @@ -93,6 +75,11 @@ void opt_t::fix () yybackupctx = Opt::baseopt.yybackupctx; yyrestore = Opt::baseopt.yyrestore; yyrestorectx = Opt::baseopt.yyrestorectx; + yyrestoretag = Opt::baseopt.yyrestoretag; + yystagn = Opt::baseopt.yystagn; + yystagp = Opt::baseopt.yystagp; + yymtagn = Opt::baseopt.yymtagn; + yymtagp = Opt::baseopt.yymtagp; yylessthan = Opt::baseopt.yylessthan; dFlag = Opt::baseopt.dFlag; yydebug = Opt::baseopt.yydebug; @@ -107,8 +94,10 @@ void opt_t::fix () fill_arg_use = Opt::baseopt.fill_arg_use; fill_naked = Opt::baseopt.fill_naked; labelPrefix = Opt::baseopt.labelPrefix; + startlabel = Opt::baseopt.startlabel; + startlabel_force = Opt::baseopt.startlabel_force; break; - default: + case TARGET_CODE: break; } @@ -118,10 +107,7 @@ void opt_t::fix () } // respect hierarchy - if (!cFlag) - { - tFlag = Opt::baseopt.tFlag; - header_file = Opt::baseopt.header_file; + if (!globopts->cFlag) { yycondtype = Opt::baseopt.yycondtype; cond_get = Opt::baseopt.cond_get; cond_get_naked = Opt::baseopt.cond_get_naked; @@ -136,8 +122,7 @@ void opt_t::fix () condGoto = Opt::baseopt.condGoto; condGotoParam = Opt::baseopt.condGotoParam; } - if (!fFlag) - { + if (!globopts->fFlag) { state_get = Opt::baseopt.state_get; state_get_naked = Opt::baseopt.state_get_naked; state_set = Opt::baseopt.state_set; @@ -149,6 +134,16 @@ void opt_t::fix () bUseStateAbort = Opt::baseopt.bUseStateAbort; bUseStateNext = Opt::baseopt.bUseStateNext; } + if (posix_captures) { + tags = true; + } + if (!tags) + { + tags_prefix = Opt::baseopt.tags_prefix; + tags_expression = Opt::baseopt.tags_expression; + lookahead = Opt::baseopt.lookahead; + optimize_tags = Opt::baseopt.optimize_tags; + } if (!bFlag) { yybmHexTable = Opt::baseopt.yybmHexTable; @@ -159,14 +154,14 @@ void opt_t::fix () cGotoThreshold = Opt::baseopt.cGotoThreshold; yytarget = Opt::baseopt.yytarget; } - if (input_api.type () != InputAPI::DEFAULT) + if (input_api != INPUT_DEFAULT) { yycursor = Opt::baseopt.yycursor; yymarker = Opt::baseopt.yymarker; yyctxmarker = Opt::baseopt.yyctxmarker; yylimit = Opt::baseopt.yylimit; } - if (input_api.type () != InputAPI::CUSTOM) + if (input_api != INPUT_CUSTOM) { yypeek = Opt::baseopt.yypeek; yyskip = Opt::baseopt.yyskip; @@ -174,7 +169,11 @@ void opt_t::fix () yybackupctx = Opt::baseopt.yybackupctx; yyrestore = Opt::baseopt.yyrestore; yyrestorectx = Opt::baseopt.yyrestorectx; - yylessthan = Opt::baseopt.yylessthan; + yyrestoretag = Opt::baseopt.yyrestoretag; + yystagn = Opt::baseopt.yystagn; + yystagp = Opt::baseopt.yystagp; + yymtagn = Opt::baseopt.yymtagn; + yymtagp = Opt::baseopt.yymtagp; } if (!dFlag) { @@ -190,28 +189,28 @@ void opt_t::fix () } // force individual options - switch (target) - { - case DOT: + switch (globopts->target) { + case TARGET_DOT: iFlag = true; break; - case SKELETON: + case TARGET_SKELETON: iFlag = true; - input_api.set (InputAPI::CUSTOM); + input_api = INPUT_CUSTOM; indString = " "; topIndent = 2; break; - default: + case TARGET_CODE: break; } - switch (encoding.type ()) - { + switch (encoding.type()) { case Enc::UCS2: case Enc::UTF16: case Enc::UTF32: sFlag = true; break; - default: + case Enc::ASCII: + case Enc::EBCDIC: + case Enc::UTF8: break; } if (bFlag) @@ -223,47 +222,14 @@ void opt_t::fix () bFlag = true; sFlag = true; } - if (header_file != NULL) - { - tFlag = true; + if (!lookahead) { + eager_skip = true; } } -realopt_t::realopt_t (useropt_t & opt) - : real () - , user (opt) -{} +const mutopt_t Opt::baseopt; -const opt_t * realopt_t::operator -> () -{ - sync (); - return ℜ -} - -void realopt_t::sync () -{ - if (user.diverge) - { - real = user.opt; - real.fix (); - user.diverge = false; - } -} - -useropt_t::useropt_t () - : opt () - , diverge (true) -{} - -opt_t * useropt_t::operator -> () -{ - diverge = true; - return &opt; -} - -const opt_t Opt::baseopt; - -bool Opt::source (const char * s) +bool Opt::source (const char *s) { if (source_file) { @@ -277,55 +243,47 @@ bool Opt::source (const char * s) } } -bool Opt::output (const char * s) -{ - if (output_file) - { - error ("multiple output files: %s, %s", output_file, s); - return false; - } - else - { - output_file = s; - return true; - } -} - -void Opt::reset_encoding (const Enc & enc) +void Opt::reset_startlabel() { - useropt->encoding = enc; + set_startlabel(Opt::baseopt.startlabel); + set_startlabel_force(Opt::baseopt.startlabel_force); } void Opt::reset_mapCodeName () { // historically arranged set of names // no actual reason why these particular options should be reset - useropt->cond_get = Opt::baseopt.cond_get; - useropt->cond_set = Opt::baseopt.cond_set; - useropt->fill = Opt::baseopt.fill; - useropt->state_get = Opt::baseopt.state_get; - useropt->state_set = Opt::baseopt.state_set; - useropt->yybackup = Opt::baseopt.yybackup; - useropt->yybackupctx = Opt::baseopt.yybackupctx; - useropt->yycondtype = Opt::baseopt.yycondtype; - useropt->yyctxmarker = Opt::baseopt.yyctxmarker; - useropt->yyctype = Opt::baseopt.yyctype; - useropt->yycursor = Opt::baseopt.yycursor; - useropt->yydebug = Opt::baseopt.yydebug; - useropt->yylessthan = Opt::baseopt.yylessthan; - useropt->yylimit = Opt::baseopt.yylimit; - useropt->yymarker = Opt::baseopt.yymarker; - useropt->yypeek = Opt::baseopt.yypeek; - useropt->yyrestore = Opt::baseopt.yyrestore; - useropt->yyrestorectx = Opt::baseopt.yyrestorectx; - useropt->yyskip = Opt::baseopt.yyskip; - useropt->yyfilllabel = Opt::baseopt.yyfilllabel; - useropt->yynext = Opt::baseopt.yynext; - useropt->yyaccept = Opt::baseopt.yyaccept; - useropt->yybm = Opt::baseopt.yybm; - useropt->yych = Opt::baseopt.yych; - useropt->yyctable = Opt::baseopt.yyctable; - useropt->yytarget = Opt::baseopt.yytarget; + set_cond_get(Opt::baseopt.cond_get); + set_cond_set(Opt::baseopt.cond_set); + set_fill(Opt::baseopt.fill); + set_state_get(Opt::baseopt.state_get); + set_state_set(Opt::baseopt.state_set); + set_yybackup(Opt::baseopt.yybackup); + set_yybackupctx(Opt::baseopt.yybackupctx); + set_yycondtype(Opt::baseopt.yycondtype); + set_yyctxmarker(Opt::baseopt.yyctxmarker); + set_yyctype(Opt::baseopt.yyctype); + set_yycursor(Opt::baseopt.yycursor); + set_yydebug(Opt::baseopt.yydebug); + set_yylessthan(Opt::baseopt.yylessthan); + set_yylimit(Opt::baseopt.yylimit); + set_yymarker(Opt::baseopt.yymarker); + set_yypeek(Opt::baseopt.yypeek); + set_yyrestore(Opt::baseopt.yyrestore); + set_yyrestorectx(Opt::baseopt.yyrestorectx); + set_yyrestoretag(Opt::baseopt.yyrestoretag); + set_yystagn(Opt::baseopt.yystagn); + set_yystagp(Opt::baseopt.yystagp); + set_yymtagn(Opt::baseopt.yymtagn); + set_yymtagp(Opt::baseopt.yymtagp); + set_yyskip(Opt::baseopt.yyskip); + set_yyfilllabel(Opt::baseopt.yyfilllabel); + set_yynext(Opt::baseopt.yynext); + set_yyaccept(Opt::baseopt.yyaccept); + set_yybm(Opt::baseopt.yybm); + set_yych(Opt::baseopt.yych); + set_yyctable(Opt::baseopt.yyctable); + set_yytarget(Opt::baseopt.yytarget); } } // namespace re2c diff --git a/src/conf/opt.h b/src/conf/opt.h index 30ab21e..f638083 100644 --- a/src/conf/opt.h +++ b/src/conf/opt.h @@ -1,204 +1,292 @@ #ifndef _RE2C_CONF_OPT_ #define _RE2C_CONF_OPT_ -#include "src/util/c99_stdint.h" #include +#include "src/util/c99_stdint.h" #include -#include "src/codegen/input_api.h" -#include "src/ir/dfa/dfa.h" -#include "src/ir/regexp/empty_class_policy.h" -#include "src/ir/regexp/encoding/enc.h" +#include "src/code/input_api.h" +#include "src/conf/warn.h" +#include "src/dfa/dfa.h" +#include "src/re/empty_class_policy.h" +#include "src/re/encoding/enc.h" #include "src/util/forbid_copy.h" namespace re2c { -#define RE2C_OPTS \ - /* target */ \ - OPT1 (opt_t::target_t, target, CODE) \ - /* fingerprint */ \ - OPT (bool, bNoGenerationDate, false) \ - OPT (bool, version, true) \ +class Warn; + +enum target_t +{ + TARGET_CODE, + TARGET_DOT, + TARGET_SKELETON +}; + +/* note [constant and mutable options] + * + * Some options are immutable (target, output files; global switches like + * conditions, reuse mode, storable states; support of flex syntax, etc.). + * These options are passed as command-line arguments and never change. + * It is safe to read them from any program point after parsing command-line + * arguments. + * + * Other options are configurable; they have block scope (may be specified + * anywhere inside of the block and still affect the whole block). + * Reading mutable options of yet unparsed block is not allowed because + * they may affect the way RE2C parses current block (RE2C would be tempted + * to base decisions on the latest option value, which may not be the final + * one). + */ + +#define RE2C_CONSTOPTS \ + CONSTOPT1 (target_t, target, TARGET_CODE) \ + CONSTOPT (std::string, output_file, "") \ + CONSTOPT (std::string, header_file, "") \ + CONSTOPT (bool, bNoGenerationDate, false) \ + CONSTOPT (bool, version, true) \ + CONSTOPT (bool, cFlag, false) \ + CONSTOPT (bool, fFlag, false) \ + CONSTOPT (bool, rFlag, false) \ + CONSTOPT (bool, FFlag, false) \ + /* debug */ \ + CONSTOPT (bool, dump_nfa, false) \ + CONSTOPT (bool, dump_dfa_raw, false) \ + CONSTOPT (bool, dump_dfa_det, false) \ + CONSTOPT (bool, dump_dfa_tagopt, false) \ + CONSTOPT (bool, dump_dfa_min, false) \ + CONSTOPT (bool, dump_adfa, false) + +#define RE2C_MUTOPTS \ /* regular expressions */ \ - OPT (Enc, encoding, Enc ()) \ - OPT (bool, bCaseInsensitive, false) \ - OPT (bool, bCaseInverted, false) \ - OPT (empty_class_policy_t, empty_class_policy, EMPTY_CLASS_MATCH_EMPTY) \ + MUTOPT1 (Enc, encoding, Enc ()) \ + MUTOPT (bool, bCaseInsensitive, false) \ + MUTOPT (bool, bCaseInverted, false) \ + MUTOPT (empty_class_policy_t, empty_class_policy, EMPTY_CLASS_MATCH_EMPTY) \ /* conditions */ \ - OPT (bool, cFlag, false) \ - OPT (bool, tFlag, false) \ - OPT (const char *, header_file, NULL) \ - OPT (std::string, yycondtype, "YYCONDTYPE") \ - OPT (std::string, cond_get, "YYGETCONDITION") \ - OPT (bool, cond_get_naked, false) \ - OPT (std::string, cond_set, "YYSETCONDITION" ) \ - OPT (std::string, cond_set_arg, "@@" ) \ - OPT (bool, cond_set_naked, false ) \ - OPT (std::string, yyctable, "yyctable") \ - OPT (std::string, condPrefix, "yyc_") \ - OPT (std::string, condEnumPrefix, "yyc") \ - OPT (std::string, condDivider, "/* *********************************** */") \ - OPT (std::string, condDividerParam, "@@") \ - OPT (std::string, condGoto, "goto @@;") \ - OPT (std::string, condGotoParam, "@@") \ + MUTOPT (std::string, yycondtype, "YYCONDTYPE") \ + MUTOPT (std::string, cond_get, "YYGETCONDITION") \ + MUTOPT (bool, cond_get_naked, false) \ + MUTOPT (std::string, cond_set, "YYSETCONDITION" ) \ + MUTOPT (std::string, cond_set_arg, "@@" ) \ + MUTOPT (bool, cond_set_naked, false ) \ + MUTOPT (std::string, yyctable, "yyctable") \ + MUTOPT (std::string, condPrefix, "yyc_") \ + MUTOPT (std::string, condEnumPrefix, "yyc") \ + MUTOPT (std::string, condDivider, "/* *********************************** */") \ + MUTOPT (std::string, condDividerParam, "@@") \ + MUTOPT (std::string, condGoto, "goto @@;") \ + MUTOPT (std::string, condGotoParam, "@@") \ /* states */ \ - OPT (bool, fFlag, false) \ - OPT (std::string, state_get, "YYGETSTATE") \ - OPT (bool, state_get_naked, false) \ - OPT (std::string, state_set, "YYSETSTATE") \ - OPT (std::string, state_set_arg, "@@") \ - OPT (bool, state_set_naked, false) \ - OPT (std::string, yyfilllabel, "yyFillLabel") \ - OPT (std::string, yynext, "yyNext") \ - OPT (std::string, yyaccept, "yyaccept") \ - OPT (bool, bUseStateAbort, false) \ - OPT (bool, bUseStateNext, false) \ - /* reuse */ \ - OPT (bool, rFlag, false) \ - /* partial flex syntax support */ \ - OPT (bool, FFlag, false) \ + MUTOPT (std::string, state_get, "YYGETSTATE") \ + MUTOPT (bool, state_get_naked, false) \ + MUTOPT (std::string, state_set, "YYSETSTATE") \ + MUTOPT (std::string, state_set_arg, "@@") \ + MUTOPT (bool, state_set_naked, false) \ + MUTOPT (std::string, yyfilllabel, "yyFillLabel") \ + MUTOPT (std::string, yynext, "yyNext") \ + MUTOPT (std::string, yyaccept, "yyaccept") \ + MUTOPT (bool, bUseStateAbort, false) \ + MUTOPT (bool, bUseStateNext, false) \ + /* tags */ \ + MUTOPT (bool, tags, false) \ + MUTOPT (std::string, tags_prefix, "yyt") \ + MUTOPT (std::string, tags_expression, "@@") \ + MUTOPT (bool, posix_captures, false) \ + MUTOPT (bool, optimize_tags, true) \ /* code generation */ \ - OPT (bool, sFlag, false) \ - OPT (bool, bFlag, false) \ - OPT (std::string, yybm, "yybm") \ - OPT (bool, yybmHexTable, false) \ - OPT (bool, gFlag, false) \ - OPT (std::string, yytarget, "yytarget") \ - OPT (uint32_t, cGotoThreshold, 9) \ + MUTOPT (bool, sFlag, false) \ + MUTOPT (bool, bFlag, false) \ + MUTOPT (std::string, yybm, "yybm") \ + MUTOPT (bool, yybmHexTable, false) \ + MUTOPT (bool, gFlag, false) \ + MUTOPT (std::string, yytarget, "yytarget") \ + MUTOPT (uint32_t, cGotoThreshold, 9) \ /* formatting */ \ - OPT (uint32_t, topIndent, 0) \ - OPT (std::string, indString, "\t") \ + MUTOPT (uint32_t, topIndent, 0) \ + MUTOPT (std::string, indString, "\t") \ /* input API */ \ - OPT (InputAPI, input_api, InputAPI ()) \ - OPT (std::string, yycursor, "YYCURSOR") \ - OPT (std::string, yymarker, "YYMARKER") \ - OPT (std::string, yyctxmarker, "YYCTXMARKER") \ - OPT (std::string, yylimit, "YYLIMIT") \ - OPT (std::string, yypeek, "YYPEEK") \ - OPT (std::string, yyskip, "YYSKIP") \ - OPT (std::string, yybackup, "YYBACKUP") \ - OPT (std::string, yybackupctx, "YYBACKUPCTX") \ - OPT (std::string, yyrestore, "YYRESTORE") \ - OPT (std::string, yyrestorectx, "YYRESTORECTX") \ - OPT (std::string, yylessthan, "YYLESSTHAN") \ + MUTOPT (input_api_t, input_api, INPUT_DEFAULT) \ + MUTOPT (std::string, yycursor, "YYCURSOR") \ + MUTOPT (std::string, yymarker, "YYMARKER") \ + MUTOPT (std::string, yyctxmarker, "YYCTXMARKER") \ + MUTOPT (std::string, yylimit, "YYLIMIT") \ + MUTOPT (std::string, yypeek, "YYPEEK") \ + MUTOPT (std::string, yyskip, "YYSKIP") \ + MUTOPT (std::string, yybackup, "YYBACKUP") \ + MUTOPT (std::string, yybackupctx, "YYBACKUPCTX") \ + MUTOPT (std::string, yyrestore, "YYRESTORE") \ + MUTOPT (std::string, yyrestorectx, "YYRESTORECTX") \ + MUTOPT (std::string, yyrestoretag, "YYRESTORETAG") \ + MUTOPT (std::string, yylessthan, "YYLESSTHAN") \ + MUTOPT (std::string, yystagn, "YYSTAGN") \ + MUTOPT (std::string, yystagp, "YYSTAGP") \ + MUTOPT (std::string, yymtagn, "YYMTAGN") \ + MUTOPT (std::string, yymtagp, "YYMTAGP") \ /* #line directives */ \ - OPT (bool, iFlag, false) \ + MUTOPT (bool, iFlag, false) \ /* debug */ \ - OPT (bool, dFlag, false) \ - OPT (std::string, yydebug, "YYDEBUG") \ + MUTOPT (bool, dFlag, false) \ + MUTOPT (std::string, yydebug, "YYDEBUG") \ /* yych */ \ - OPT (std::string, yyctype, "YYCTYPE") \ - OPT (std::string, yych, "yych") \ - OPT (bool, bEmitYYCh, true) \ - OPT (bool, yychConversion, false) \ + MUTOPT (std::string, yyctype, "YYCTYPE") \ + MUTOPT (std::string, yych, "yych") \ + MUTOPT (bool, bEmitYYCh, true) \ + MUTOPT (bool, yychConversion, false) \ /* YYFILL */ \ - OPT (std::string, fill, "YYFILL") \ - OPT (bool, fill_use, true) \ - OPT (bool, fill_check, true) \ - OPT (std::string, fill_arg, "@@") \ - OPT (bool, fill_arg_use, true) \ - OPT (bool, fill_naked, false) \ + MUTOPT (std::string, fill, "YYFILL") \ + MUTOPT (bool, fill_use, true) \ + MUTOPT (bool, fill_check, true) \ + MUTOPT (std::string, fill_arg, "@@") \ + MUTOPT (bool, fill_arg_use, true) \ + MUTOPT (bool, fill_naked, false) \ /* labels */ \ - OPT (std::string, labelPrefix, "yy") \ + MUTOPT (std::string, labelPrefix, "yy") \ + MUTOPT (std::string, startlabel, "") \ + MUTOPT (bool, startlabel_force, false) \ /* internals */ \ - OPT (dfa_minimization_t, dfa_minimization, DFA_MINIMIZATION_MOORE) + MUTOPT (dfa_minimization_t, dfa_minimization, DFA_MINIMIZATION_MOORE) \ + MUTOPT (bool, lookahead, true) \ + MUTOPT (bool, eager_skip, false) -struct opt_t +struct conopt_t { - enum target_t - { - CODE, - DOT, - SKELETON - }; - -#define OPT1 OPT -#define OPT(type, name, value) type name; - RE2C_OPTS -#undef OPT1 -#undef OPT - - opt_t (); - opt_t (const opt_t & opt); - opt_t & operator = (const opt_t & opt); - void fix (); +# define CONSTOPT1 CONSTOPT +# define CONSTOPT(type, name, value) type name; + RE2C_CONSTOPTS +# undef CONSTOPT1 +# undef CONSTOPT + + conopt_t() +# define CONSTOPT1(type, name, value) : name(value) +# define CONSTOPT(type, name, value) , name(value) + RE2C_CONSTOPTS +# undef CONSTOPT1 +# undef CONSTOPT + {} + void fix(); + FORBID_COPY(conopt_t); }; -class useropt_t; -class realopt_t +struct mutopt_t { - opt_t real; - useropt_t & user; -public: - realopt_t (useropt_t & opt); - const opt_t * operator -> (); - void sync (); +# define MUTOPT1 MUTOPT +# define MUTOPT(type, name, value) type name; + RE2C_MUTOPTS +# undef MUTOPT1 +# undef MUTOPT + + mutopt_t() +# define MUTOPT1(type, name, value) : name(value) +# define MUTOPT(type, name, value) , name(value) + RE2C_MUTOPTS +# undef MUTOPT1 +# undef MUTOPT + {} + void fix(const conopt_t *globopts); + FORBID_COPY(mutopt_t); }; -class useropt_t +struct opt_t { - opt_t opt; - bool diverge; -public: - useropt_t (); - opt_t * operator -> (); - friend void realopt_t::sync (); +# define CONSTOPT1 CONSTOPT +# define CONSTOPT(type, name, value) type name; + RE2C_CONSTOPTS +# undef CONSTOPT1 +# undef CONSTOPT + +# define MUTOPT1 MUTOPT +# define MUTOPT(type, name, value) type name; + RE2C_MUTOPTS +# undef MUTOPT1 +# undef MUTOPT + + opt_t(const conopt_t &con, const mutopt_t &mut) +# define CONSTOPT1(type, name, value) : name(con.name) +# define CONSTOPT(type, name, value) , name(con.name) + RE2C_CONSTOPTS +# undef CONSTOPT1 +# undef CONSTOPT +# define MUTOPT1 MUTOPT +# define MUTOPT(type, name, value) , name(mut.name) + RE2C_MUTOPTS +# undef MUTOPT1 +# undef MUTOPT + {} + FORBID_COPY(opt_t); }; +// see note [constant and mutable options] struct Opt { - static const opt_t baseopt; + static const mutopt_t baseopt; - const char * source_file; - const char * output_file; + const char *source_file; + const conopt_t &glob; private: - useropt_t useropt; - realopt_t realopt; + mutopt_t user; + mutopt_t real; + bool diverge; + + void sync() + { + if (!diverge) return; +# define MUTOPT1 MUTOPT +# define MUTOPT(type, name, value) real.name = user.name; + RE2C_MUTOPTS +# undef MUTOPT1 +# undef MUTOPT + real.fix(&glob); + diverge = false; + } public: - Opt () - : source_file (NULL) - , output_file (NULL) - , useropt () - , realopt (useropt) + explicit Opt(const conopt_t &globopts) + : source_file(NULL) + , glob(globopts) + , user() + , real() + , diverge(true) {} - // read-only access, forces options syncronization - const opt_t * operator -> () + const opt_t *snapshot() { - return realopt.operator -> (); + sync(); + return new opt_t(glob, real); } - bool source (const char * s); - bool output (const char * s); - - // Inplace configurations are applied immediately when parsed. - // This is very bad: first, re2c behaviour is changed in the middle - // of the block; second, config is resynced too often (every - // attempt to read config that has been updated results in - // automatic resync). It is much better to set all options at once. - bool set_encoding (Enc::type_t t) { return useropt->encoding.set (t); } - void unset_encoding (Enc::type_t t) { useropt->encoding.unset (t); } - void set_encoding_policy (Enc::policy_t p) { useropt->encoding.setPolicy (p); } - void set_input_api (InputAPI::type_t t) { useropt->input_api.set (t); } -#define OPT1 OPT -#define OPT(type, name, value) void set_##name (type arg) { useropt->name = arg; } - RE2C_OPTS -#undef OPT1 -#undef OPT - - // helpers - std::string yychConversion () + void restore(const opt_t *opts) { - return realopt->yychConversion - ? "(" + realopt->yyctype + ")" - : ""; +# define MUTOPT1 MUTOPT +# define MUTOPT(type, name, value) user.name = opts->name; + RE2C_MUTOPTS +# undef MUTOPT1 +# undef MUTOPT + diverge = true; + sync(); } + bool source (const char *s); + + // RE2C allows to set configurations anywhere inside of a block + // (in the beginning, intermixed with rules, in the end): they will + // affect the whole block anyway. Thus one is not allowed to read + // configurations until the whole block has been parsed. Immutable + // options, on the contrary, are accessible for reading all the time + // (the parser itself depends on them). + void set_encoding(Enc::type_t t) { user.encoding.set(t); } + void unset_encoding(Enc::type_t t) { user.encoding.unset(t); } + void set_encoding_policy(Enc::policy_t p) { user.encoding.setPolicy(p); } +#define MUTOPT1 MUTOPT +#define MUTOPT(type, name, value) void set_##name (const type &arg) { user.name = arg; diverge = true; } + RE2C_MUTOPTS +#undef MUTOPT1 +#undef MUTOPT + // bad temporary hacks, should be fixed by proper scoping of config (parts). - void reset_encoding (const Enc & enc); + void reset_startlabel(); void reset_mapCodeName (); FORBID_COPY (Opt); @@ -211,7 +299,7 @@ enum parse_opts_t EXIT_FAIL }; -parse_opts_t parse_opts (char ** argv, Opt & opts); +parse_opts_t parse_opts(char **argv, conopt_t &globopts, Opt &opts, Warn &warn); } // namespace re2c diff --git a/src/conf/parse_opts.re b/src/conf/parse_opts.re index 5ff3a21..793db75 100644 --- a/src/conf/parse_opts.re +++ b/src/conf/parse_opts.re @@ -1,10 +1,8 @@ -#include "src/codegen/input_api.h" +#include "src/code/input_api.h" #include "src/conf/msg.h" #include "src/conf/opt.h" -#include "src/conf/warn.h" -#include "src/globals.h" -#include "src/ir/regexp/empty_class_policy.h" -#include "src/ir/regexp/encoding/enc.h" +#include "src/re/empty_class_policy.h" +#include "src/re/encoding/enc.h" namespace re2c { @@ -15,7 +13,7 @@ static inline bool next (char * & arg, char ** & argv) return arg != NULL; } -parse_opts_t parse_opts (char ** argv, Opt & opts) +parse_opts_t parse_opts(char **argv, conopt_t &globopts, Opt &opts, Warn &warn) { #define YYCTYPE unsigned char char * YYCURSOR; @@ -78,13 +76,14 @@ opt_warn: error ("bad warning: %s", *argv); return EXIT_FAIL; } - "condition-order" end { warn.set (Warn::CONDITION_ORDER, option); goto opt; } - "empty-character-class" end { warn.set (Warn::EMPTY_CHARACTER_CLASS, option); goto opt; } - "match-empty-string" end { warn.set (Warn::MATCH_EMPTY_STRING, option); goto opt; } - "swapped-range" end { warn.set (Warn::SWAPPED_RANGE, option); goto opt; } - "undefined-control-flow" end { warn.set (Warn::UNDEFINED_CONTROL_FLOW, option); goto opt; } - "unreachable-rules" end { warn.set (Warn::UNREACHABLE_RULES, option); goto opt; } - "useless-escape" end { warn.set (Warn::USELESS_ESCAPE, option); goto opt; } + "condition-order" end { warn.set (Warn::CONDITION_ORDER, option); goto opt; } + "empty-character-class" end { warn.set (Warn::EMPTY_CHARACTER_CLASS, option); goto opt; } + "match-empty-string" end { warn.set (Warn::MATCH_EMPTY_STRING, option); goto opt; } + "nondeterministic-tags" end { warn.set (Warn::NONDETERMINISTIC_TAGS, option); goto opt; } + "swapped-range" end { warn.set (Warn::SWAPPED_RANGE, option); goto opt; } + "undefined-control-flow" end { warn.set (Warn::UNDEFINED_CONTROL_FLOW, option); goto opt; } + "unreachable-rules" end { warn.set (Warn::UNREACHABLE_RULES, option); goto opt; } + "useless-escape" end { warn.set (Warn::USELESS_ESCAPE, option); goto opt; } */ opt_short: @@ -98,22 +97,26 @@ opt_short: [?h] { usage (); return EXIT_OK; } "v" { version (); return EXIT_OK; } "V" { vernum (); return EXIT_OK; } - "b" { opts.set_bFlag (true); goto opt_short; } - "c" { opts.set_cFlag (true); goto opt_short; } - "d" { opts.set_dFlag (true); goto opt_short; } - "D" { opts.set_target (opt_t::DOT); goto opt_short; } - "f" { opts.set_fFlag (true); goto opt_short; } - "F" { opts.set_FFlag (true); goto opt_short; } - "g" { opts.set_gFlag (true); goto opt_short; } - "i" { opts.set_iFlag (true); goto opt_short; } - "r" { opts.set_rFlag (true); goto opt_short; } - "s" { opts.set_sFlag (true); goto opt_short; } - "S" { opts.set_target (opt_t::SKELETON); goto opt_short; } - "e" { if (!opts.set_encoding (Enc::EBCDIC)) { error_encoding (); return EXIT_FAIL; } goto opt_short; } - "u" { if (!opts.set_encoding (Enc::UTF32)) { error_encoding (); return EXIT_FAIL; } goto opt_short; } - "w" { if (!opts.set_encoding (Enc::UCS2)) { error_encoding (); return EXIT_FAIL; } goto opt_short; } - "x" { if (!opts.set_encoding (Enc::UTF16)) { error_encoding (); return EXIT_FAIL; } goto opt_short; } - "8" { if (!opts.set_encoding (Enc::UTF8)) { error_encoding (); return EXIT_FAIL; } goto opt_short; } + + "c" { globopts.cFlag = true; goto opt_short; } + "D" { globopts.target = TARGET_DOT; goto opt_short; } + "f" { globopts.fFlag = true; goto opt_short; } + "F" { globopts.FFlag = true; goto opt_short; } + "r" { globopts.rFlag = true; goto opt_short; } + "S" { globopts.target = TARGET_SKELETON; goto opt_short; } + + "b" { opts.set_bFlag(true); goto opt_short; } + "d" { opts.set_dFlag(true); goto opt_short; } + "g" { opts.set_gFlag(true); goto opt_short; } + "i" { opts.set_iFlag(true); goto opt_short; } + "s" { opts.set_sFlag(true); goto opt_short; } + "T" { opts.set_tags(true); goto opt_short; } + "P" { opts.set_posix_captures(true); goto opt_short; } + "e" { opts.set_encoding(Enc::EBCDIC); goto opt_short; } + "u" { opts.set_encoding(Enc::UTF32); goto opt_short; } + "w" { opts.set_encoding(Enc::UCS2); goto opt_short; } + "x" { opts.set_encoding(Enc::UTF16); goto opt_short; } + "8" { opts.set_encoding(Enc::UTF8); goto opt_short; } "o" end { if (!next (YYCURSOR, argv)) { error_arg ("-o, --output"); return EXIT_FAIL; } goto opt_output; } "o" { *argv = YYCURSOR; goto opt_output; } "t" end { if (!next (YYCURSOR, argv)) { error_arg ("-t, --type-header"); return EXIT_FAIL; } goto opt_header; } @@ -128,36 +131,50 @@ opt_long: error ("bad long option: %s", *argv); return EXIT_FAIL; } - "help" end { usage (); return EXIT_OK; } - "version" end { version (); return EXIT_OK; } - "vernum" end { vernum (); return EXIT_OK; } - "bit-vectors" end { opts.set_bFlag (true); goto opt; } - "start-conditions" end { opts.set_cFlag (true); goto opt; } - "debug-output" end { opts.set_dFlag (true); goto opt; } - "emit-dot" end { opts.set_target (opt_t::DOT); goto opt; } - "storable-state" end { opts.set_fFlag (true); goto opt; } - "flex-syntax" end { opts.set_FFlag (true); goto opt; } - "computed-gotos" end { opts.set_gFlag (true); goto opt; } - "no-debug-info" end { opts.set_iFlag (true); goto opt; } - "reusable" end { opts.set_rFlag (true); goto opt; } - "nested-ifs" end { opts.set_sFlag (true); goto opt; } - "no-generation-date" end { opts.set_bNoGenerationDate (true); goto opt; } - "no-version" end { opts.set_version (false); goto opt; } - "case-insensitive" end { opts.set_bCaseInsensitive (true); goto opt; } - "case-inverted" end { opts.set_bCaseInverted (true); goto opt; } - "skeleton" end { opts.set_target (opt_t::SKELETON); goto opt; } - "ecb" end { if (!opts.set_encoding (Enc::EBCDIC)) { error_encoding (); return EXIT_FAIL; } goto opt; } - "unicode" end { if (!opts.set_encoding (Enc::UTF32)) { error_encoding (); return EXIT_FAIL; } goto opt; } - "wide-chars" end { if (!opts.set_encoding (Enc::UCS2)) { error_encoding (); return EXIT_FAIL; } goto opt; } - "utf-16" end { if (!opts.set_encoding (Enc::UTF16)) { error_encoding (); return EXIT_FAIL; } goto opt; } - "utf-8" end { if (!opts.set_encoding (Enc::UTF8)) { error_encoding (); return EXIT_FAIL; } goto opt; } - "output" end { if (!next (YYCURSOR, argv)) { error_arg ("-o, --output"); return EXIT_FAIL; } goto opt_output; } - "type-header" end { if (!next (YYCURSOR, argv)) { error_arg ("-t, --type-header"); return EXIT_FAIL; } goto opt_header; } - "encoding-policy" end { goto opt_encoding_policy; } - "input" end { goto opt_input; } - "empty-class" end { goto opt_empty_class; } - "dfa-minimization" end { goto opt_dfa_minimization; } - "single-pass" end { goto opt; } // deprecated + "help" end { usage (); return EXIT_OK; } + "version" end { version (); return EXIT_OK; } + "vernum" end { vernum (); return EXIT_OK; } + + "start-conditions" end { globopts.cFlag = true; goto opt; } + "emit-dot" end { globopts.target = TARGET_DOT; goto opt; } + "storable-state" end { globopts.fFlag = true; goto opt; } + "flex-syntax" end { globopts.FFlag = true; goto opt; } + "reusable" end { globopts.rFlag = true; goto opt; } + "no-generation-date" end { globopts.bNoGenerationDate = true; goto opt; } + "no-version" end { globopts.version = false; goto opt; } + "skeleton" end { globopts.target = TARGET_SKELETON; goto opt; } + + "bit-vectors" end { opts.set_bFlag (true); goto opt; } + "debug-output" end { opts.set_dFlag (true); goto opt; } + "computed-gotos" end { opts.set_gFlag (true); goto opt; } + "no-debug-info" end { opts.set_iFlag (true); goto opt; } + "nested-ifs" end { opts.set_sFlag (true); goto opt; } + "case-insensitive" end { opts.set_bCaseInsensitive (true); goto opt; } + "case-inverted" end { opts.set_bCaseInverted (true); goto opt; } + "tags" end { opts.set_tags (true); goto opt; } + "posix-captures" end { opts.set_posix_captures(true); goto opt; } + "no-lookahead" end { opts.set_lookahead(false); goto opt; } + "no-optimize-tags" end { opts.set_optimize_tags(false); goto opt; } + "eager-skip" end { opts.set_eager_skip(true); goto opt; } + "ecb" end { opts.set_encoding(Enc::EBCDIC); goto opt; } + "unicode" end { opts.set_encoding(Enc::UTF32); goto opt; } + "wide-chars" end { opts.set_encoding(Enc::UCS2); goto opt; } + "utf-16" end { opts.set_encoding(Enc::UTF16); goto opt; } + "utf-8" end { opts.set_encoding(Enc::UTF8); goto opt; } + "output" end { if (!next (YYCURSOR, argv)) { error_arg ("-o, --output"); return EXIT_FAIL; } goto opt_output; } + "type-header" end { if (!next (YYCURSOR, argv)) { error_arg ("-t, --type-header"); return EXIT_FAIL; } goto opt_header; } + "encoding-policy" end { goto opt_encoding_policy; } + "input" end { goto opt_input; } + "empty-class" end { goto opt_empty_class; } + "dfa-minimization" end { goto opt_dfa_minimization; } + "single-pass" end { goto opt; } // deprecated + + "dump-nfa" end { globopts.dump_nfa = true; goto opt; } + "dump-dfa-raw" end { globopts.dump_dfa_raw = true; goto opt; } + "dump-dfa-det" end { globopts.dump_dfa_det = true; goto opt; } + "dump-dfa-tagopt" end { globopts.dump_dfa_tagopt = true; goto opt; } + "dump-dfa-min" end { globopts.dump_dfa_min = true; goto opt; } + "dump-adfa" end { globopts.dump_adfa = true; goto opt; } */ opt_output: @@ -167,7 +184,7 @@ opt_output: error ("bad argument to option -o, --output: %s", *argv); return EXIT_FAIL; } - filename end { if (!opts.output (*argv)) return EXIT_FAIL; goto opt; } + filename end { globopts.output_file = *argv; goto opt; } */ opt_header: @@ -177,7 +194,7 @@ opt_header: error ("bad argument to option -t, --type-header: %s", *argv); return EXIT_FAIL; } - filename end { opts.set_header_file (*argv); goto opt; } + filename end { globopts.header_file = *argv; goto opt; } */ opt_encoding_policy: @@ -209,8 +226,8 @@ opt_input: error ("bad argument to option --input (expected: default | custom): %s", *argv); return EXIT_FAIL; } - "default" end { opts.set_input_api (InputAPI::DEFAULT); goto opt; } - "custom" end { opts.set_input_api (InputAPI::CUSTOM); goto opt; } + "default" end { opts.set_input_api(INPUT_DEFAULT); goto opt; } + "custom" end { opts.set_input_api(INPUT_CUSTOM); goto opt; } */ opt_empty_class: @@ -252,6 +269,7 @@ end: error ("no source file"); return EXIT_FAIL; } + globopts.fix(); return OK; diff --git a/src/conf/warn.cc b/src/conf/warn.cc index e309f26..2bf406b 100644 --- a/src/conf/warn.cc +++ b/src/conf/warn.cc @@ -1,15 +1,16 @@ #include #include #include -#include +#include #include "src/conf/msg.h" #include "src/conf/warn.h" +#include "src/skeleton/path.h" +#include "src/re/rule.h" +#include "src/skeleton/skeleton.h" namespace re2c { -Warn warn; - const uint32_t Warn::SILENT = 0; const uint32_t Warn::WARNING = 1u << 0; const uint32_t Warn::ERROR = 1u << 1; @@ -74,7 +75,7 @@ void Warn::set_all_error () } } -void Warn::fail (type_t t, uint32_t line, const char * s) +void Warn::fail (type_t t, uint32_t line, const char * s) const { if (mask[t] & WARNING) { @@ -106,13 +107,35 @@ void Warn::empty_class (uint32_t line) } } -void Warn::match_empty_string (uint32_t line) +void Warn::match_empty_string (uint32_t line, const std::string &cond) { if (mask[MATCH_EMPTY_STRING] & WARNING) { const bool e = mask[MATCH_EMPTY_STRING] & ERROR; error_accuml |= e; - warning (names[MATCH_EMPTY_STRING], line, e, "rule matches empty string"); + warning (names[MATCH_EMPTY_STRING], line, e, + "rule %smatches empty string", incond(cond).c_str()); + } +} + +void Warn::nondeterministic_tags(uint32_t line, const std::string &cond, + const std::string *tagname, size_t nver) +{ + if (mask[NONDETERMINISTIC_TAGS] & WARNING) { + bool e = mask[NONDETERMINISTIC_TAGS] & ERROR; + error_accuml |= e; + + warning_start(line, e); + if (tagname == NULL) { + fprintf(stderr, "trailing context"); + } else { + fprintf(stderr, "tag '%s'", tagname->c_str()); + } + fprintf(stderr, + " %shas %u%s degree of nondeterminism", + incond(cond).c_str(), static_cast(nver), + nver == 2 ? "nd" : nver == 3 ? "rd" : "th"); + warning_end(names[NONDETERMINISTIC_TAGS], e); } } @@ -126,7 +149,7 @@ void Warn::swapped_range (uint32_t line, uint32_t l, uint32_t u) } } -void Warn::undefined_control_flow (uint32_t line, const std::string & cond, std::vector & ways, bool overflow) +void Warn::undefined_control_flow (const Skeleton &skel, std::vector & paths, bool overflow) { if (mask[UNDEFINED_CONTROL_FLOW] & WARNING) { @@ -134,21 +157,21 @@ void Warn::undefined_control_flow (uint32_t line, const std::string & cond, std: error_accuml |= e; // report shorter patterns first - std::sort (ways.begin (), ways.end (), cmp_ways); + std::sort (paths.begin (), paths.end ()); - warning_start (line, e); - fprintf (stderr, "control flow %sis undefined for strings that match ", incond (cond).c_str ()); - const size_t count = ways.size (); + warning_start (skel.line, e); + fprintf (stderr, "control flow %sis undefined for strings that match ", incond (skel.cond).c_str ()); + const size_t count = paths.size (); if (count == 1) { - fprint_way (stderr, ways[0]); + fprint_default_path (stderr, skel, paths[0]); } else { for (size_t i = 0; i < count; ++i) { fprintf (stderr, "\n\t"); - fprint_way (stderr, ways[i]); + fprint_default_path (stderr, skel, paths[i]); } fprintf (stderr, "\n"); } @@ -161,29 +184,27 @@ void Warn::undefined_control_flow (uint32_t line, const std::string & cond, std: } } -void Warn::unreachable_rule (const std::string & cond, const rule_info_t & rule, const rules_t & rules) +void Warn::unreachable_rule(const std::string &cond, const Rule &rule) { - if (mask[UNREACHABLE_RULES] & WARNING) - { + if (mask[UNREACHABLE_RULES] & WARNING) { const bool e = mask[UNREACHABLE_RULES] & ERROR; error_accuml |= e; - warning_start (rule.line, e); - fprintf (stderr, "unreachable rule %s", incond (cond).c_str ()); - const size_t shadows = rule.shadow.size (); - if (shadows > 0) - { + + warning_start(rule.code->fline, e); + fprintf(stderr, "unreachable rule %s", incond(cond).c_str()); + const size_t shadows = rule.shadow.size(); + if (shadows > 0) { const char * pl = shadows > 1 ? "s" : ""; - std::set::const_iterator i = rule.shadow.begin (); - fprintf (stderr, "(shadowed by rule%s at line%s %u", pl, pl, rules.find (*i)->second.line); - for (++i; i != rule.shadow.end (); ++i) - { - fprintf (stderr, ", %u", rules.find (*i)->second.line); + std::set::const_iterator i = rule.shadow.begin(); + fprintf (stderr, "(shadowed by rule%s at line%s %u", pl, pl, *i); + for (++i; i != rule.shadow.end(); ++i) { + fprintf(stderr, ", %u", *i); } - fprintf (stderr, ")"); + fprintf(stderr, ")"); } - warning_end (names[UNREACHABLE_RULES], e); + warning_end(names[UNREACHABLE_RULES], e); } } diff --git a/src/conf/warn.h b/src/conf/warn.h index fb313b0..c89cfbb 100644 --- a/src/conf/warn.h +++ b/src/conf/warn.h @@ -1,23 +1,28 @@ #ifndef _RE2C_CONF_WARN_ #define _RE2C_CONF_WARN_ +#include #include "src/util/c99_stdint.h" #include #include -#include "src/ir/skeleton/way.h" -#include "src/parse/rules.h" +#include "src/re/rule.h" namespace re2c { +class path_t; +struct Rule; +struct Skeleton; + #define RE2C_WARNING_TYPES \ - W (CONDITION_ORDER, "condition-order"), \ - W (EMPTY_CHARACTER_CLASS, "empty-character-class"), \ - W (MATCH_EMPTY_STRING, "match-empty-string"), \ - W (SWAPPED_RANGE, "swapped-range"), \ - W (UNDEFINED_CONTROL_FLOW, "undefined-control-flow"), \ - W (UNREACHABLE_RULES, "unreachable-rules"), \ - W (USELESS_ESCAPE, "useless-escape"), + W (CONDITION_ORDER, "condition-order"), \ + W (EMPTY_CHARACTER_CLASS, "empty-character-class"), \ + W (MATCH_EMPTY_STRING, "match-empty-string"), \ + W (NONDETERMINISTIC_TAGS, "nondeterministic-tags"), \ + W (SWAPPED_RANGE, "swapped-range"), \ + W (UNDEFINED_CONTROL_FLOW, "undefined-control-flow"), \ + W (UNREACHABLE_RULES, "unreachable-rules"), \ + W (USELESS_ESCAPE, "useless-escape"), class Warn { @@ -51,14 +56,15 @@ public: void set (type_t t, option_t o); void set_all (); void set_all_error (); - void fail (type_t t, uint32_t line, const char * s); + void fail (type_t t, uint32_t line, const char * s) const; void condition_order (uint32_t line); void empty_class (uint32_t line); - void match_empty_string (uint32_t line); + void match_empty_string (uint32_t line, const std::string &cond); + void nondeterministic_tags(uint32_t line, const std::string &cond, const std::string *tagname, size_t nver); void swapped_range (uint32_t line, uint32_t l, uint32_t u); - void undefined_control_flow (uint32_t line, const std::string & cond, std::vector & ways, bool overflow); - void unreachable_rule (const std::string & cond, const rule_info_t & rule, const rules_t & rules); + void undefined_control_flow (const Skeleton &skel, std::vector & paths, bool overflow); + void unreachable_rule (const std::string & cond, const Rule &rule); void useless_escape (uint32_t line, uint32_t col, char c); }; diff --git a/src/dfa/cfg/cfg.cc b/src/dfa/cfg/cfg.cc new file mode 100644 index 0000000..00acf96 --- /dev/null +++ b/src/dfa/cfg/cfg.cc @@ -0,0 +1,205 @@ +#include +#include +#include +#include +#include + +#include "src/dfa/cfg/cfg.h" +#include "src/dfa/dfa.h" +#include "src/util/allocate.h" + +namespace re2c +{ + +struct Rule; +struct tcmd_t; + +static void map_arcs_to_bblocks(const dfa_t &dfa, cfg_ix_t *arc2bb, cfg_ix_t &nbbarc, cfg_ix_t &nbbfin, cfg_ix_t &nbbfall); +static cfg_bb_t *create_bblocks(dfa_t &dfa, const cfg_ix_t *arc2bb, cfg_ix_t nbbfin, cfg_ix_t nbbfall); +static void successors(const dfa_t &dfa, const cfg_ix_t *arc2bb, bool *been, cfg_ix_t *&succ, size_t x); +static void fallback(const dfa_t &dfa, const cfg_ix_t *arc2bb, bool *been, cfg_ix_t *&succ, size_t x); + +cfg_t::cfg_t(dfa_t &a) + : dfa(a) + , bblocks(NULL) + , nbbarc(0) + , nbbfin(0) + , nbbfall(0) +{ + const size_t + nstate = dfa.states.size(), + nsym = dfa.nchars; + cfg_ix_t *arc2bb = new cfg_ix_t[nstate * (nsym + 2)]; + + map_arcs_to_bblocks(dfa, arc2bb, nbbarc, nbbfin, nbbfall); + bblocks = create_bblocks(dfa, arc2bb, nbbfin, nbbfall); + + delete[] arc2bb; +} + +void map_arcs_to_bblocks(const dfa_t &dfa, cfg_ix_t *arc2bb, + cfg_ix_t &nbbarc, cfg_ix_t &nbbfin, cfg_ix_t &nbbfall) +{ + const size_t + nstate = dfa.states.size(), + nsym = dfa.nchars; + + // root bblock for initial tagged epsilon-transition + cfg_ix_t nbb = 1; + + // bblocks for tagged transitions + for (size_t i = 0; i < nstate; ++i) { + tcmd_t **c = dfa.states[i]->tcmd, **f = c + nsym; + for (; c < f; ++c) { + *arc2bb++ = *c == NULL ? 0 : nbb++; + } + } + nbbarc = nbb; + + // bblock for final tagged epsilon-transition + for (size_t i = 0; i < nstate; ++i) { + tcmd_t *f = dfa.states[i]->tcmd[nsym]; + *arc2bb++ = f == NULL ? 0 : nbb++; + } + nbbfin = nbb; + + // bblock for fallback tagged epsilon-transition + for (size_t i = 0; i < nstate; ++i) { + const dfa_state_t *s = dfa.states[i]; + // (check final tags: fallback tags may be empty) + *arc2bb++ = s->fallback && s->tcmd[nsym] ? nbb++ : 0; + } + nbbfall = nbb; +} + +cfg_bb_t *create_bblocks(dfa_t &dfa, const cfg_ix_t *arc2bb, + cfg_ix_t nbbfin, cfg_ix_t nbbfall) +{ + const size_t + nstate = dfa.states.size(), + nsym = dfa.nchars; + const cfg_ix_t *a2b = arc2bb; + cfg_ix_t *succb = new cfg_ix_t[nbbfin], *succe; + bool *been = new bool[nstate]; + + cfg_bb_t *bblocks = allocate(nbbfall), *b = bblocks; + + // root bblock + std::fill(been, been + nstate, false); + successors(dfa, arc2bb, been, succe = succb, 0); + new(b++) cfg_bb_t(succb, succe, dfa.tcmd0, NULL); + + // transition bblocks + for (size_t i = 0; i < nstate; ++i) { + const dfa_state_t *s = dfa.states[i]; + for (size_t c = 0; c < nsym; ++c) { + if (*a2b++ != 0) { + std::fill(been, been + nstate, false); + successors(dfa, arc2bb, been, succe = succb, s->arcs[c]); + new(b++) cfg_bb_t(succb, succe, s->tcmd[c], NULL); + } + } + } + + // final bblocks + for (size_t i = 0; i < nstate; ++i) { + if (*a2b++ != 0) { + const dfa_state_t *s = dfa.states[i]; + new(b++) cfg_bb_t(NULL, NULL, s->tcmd[nsym], &dfa.rules[s->rule]); + } + } + + // fallback bblocks + for (size_t i = 0; i < nstate; ++i) { + if (*a2b++ != 0) { + const dfa_state_t *s = dfa.states[i]; + std::fill(been, been + nstate, false); + fallback(dfa, arc2bb, been, succe = succb, i); + new(b++) cfg_bb_t(succb, succe, s->tcmd[nsym + 1], &dfa.rules[s->rule]); + } + } + + delete[] succb; + delete[] been; + return bblocks; +} + +cfg_bb_t::cfg_bb_t(const cfg_ix_t *sb, const cfg_ix_t *se, + tcmd_t *&c, const Rule *r) + : succb(NULL) + , succe(NULL) + , cmd(c) + , rule(r) +{ + const size_t n = static_cast(se - sb); + succb = new cfg_ix_t[n]; + if (n > 0) memcpy(succb, sb, n * sizeof(cfg_ix_t)); + succe = succb + n; +} + +// find immediate successors of the given bblock +void successors(const dfa_t &dfa, const cfg_ix_t *arc2bb, bool *been, + cfg_ix_t *&succ, size_t x) +{ + if (x == dfa_t::NIL || been[x]) return; + been[x] = true; + + const size_t + nstate = dfa.states.size(), + nsym = dfa.nchars, + *a = dfa.states[x]->arcs; + const cfg_ix_t *a2b = &arc2bb[x * nsym]; + + for (size_t c = 0; c < nsym; ++c) { + const cfg_ix_t b = a2b[c]; + if (b != 0) { + *succ++ = b; + } else { + successors(dfa, arc2bb, been, succ, a[c]); + } + } + + const cfg_ix_t f = arc2bb[nstate * nsym + x]; + if (f != 0) { + *succ++ = f; + } +} + +// find all bblocks reachable from this one by following +// non-accepting DFA paths: this is the set of bblocks affected +// by liveness of fallback tags +void fallback(const dfa_t &dfa, const cfg_ix_t *arc2bb, bool *been, + cfg_ix_t *&succ, size_t x) +{ + if (x == dfa_t::NIL || been[x]) return; + been[x] = true; + + const size_t + nsym = dfa.nchars, + *a = dfa.states[x]->arcs; + const cfg_ix_t *a2b = &arc2bb[x * nsym]; + + for (size_t c = 0; c < nsym; ++c) { + const size_t y = a[c]; + if (y != dfa_t::NIL && dfa.states[y]->fallthru) { + const cfg_ix_t b = a2b[c]; + if (b != 0) { + *succ++ = b; + } + fallback(dfa, arc2bb, been, succ, y); + } + } +} + +cfg_t::~cfg_t() +{ + cfg_bb_t *b = bblocks, *e = b + nbbfall; + for (; b < e; ++b) { + delete[] b->succb; + } + + operator delete(bblocks); +} + +} // namespace re2c + diff --git a/src/dfa/cfg/cfg.h b/src/dfa/cfg/cfg.h new file mode 100644 index 0000000..ccb54fd --- /dev/null +++ b/src/dfa/cfg/cfg.h @@ -0,0 +1,57 @@ +#ifndef _RE2C_DFA_CFG_CFG_ +#define _RE2C_DFA_CFG_CFG_ + +#include "src/util/c99_stdint.h" + +#include "src/dfa/dfa.h" +#include "src/re/tag.h" +#include "src/util/forbid_copy.h" + +namespace re2c { + +struct Rule; +struct dfa_t; +struct tcmd_t; + +typedef uint32_t cfg_ix_t; + +// basic block +struct cfg_bb_t +{ + cfg_ix_t *succb; + cfg_ix_t *succe; + tcmd_t *&cmd; + const Rule *rule; + + cfg_bb_t(const cfg_ix_t *sb, const cfg_ix_t *se, tcmd_t *&c, const Rule *r); + FORBID_COPY(cfg_bb_t); +}; + +// control flow graph +struct cfg_t +{ + dfa_t &dfa; + cfg_bb_t *bblocks; + cfg_ix_t nbbarc; + cfg_ix_t nbbfin; + cfg_ix_t nbbfall; + + explicit cfg_t(dfa_t &a); + ~cfg_t(); + static tagver_t compact(const cfg_t &cfg, tagver_t *ver2new); + static void liveness_analysis(const cfg_t &cfg, bool *live); + static void live_through_bblock(const tcmd_t *cmd, bool *live); + static void dead_code_elimination(cfg_t &cfg, const bool *live); + static void interference(const cfg_t &cfg, const bool *live, bool *interf); + static tagver_t variable_allocation(const cfg_t &cfg, const bool *interf, tagver_t *ver2new); + static void renaming(cfg_t &cfg, const tagver_t *ver2new, tagver_t maxver); + static void normalization(cfg_t &cfg); + FORBID_COPY(cfg_t); +}; + +void dump_cfg(const cfg_t &cfg, const bool *live); +void dump_interf(const cfg_t &cfg, const bool *interf); + +} // namespace re2c + +#endif // _RE2C_DFA_CFG_CFG_ diff --git a/src/dfa/cfg/compact.cc b/src/dfa/cfg/compact.cc new file mode 100644 index 0000000..e67e8e5 --- /dev/null +++ b/src/dfa/cfg/compact.cc @@ -0,0 +1,48 @@ +#include +#include +#include + +#include "src/dfa/cfg/cfg.h" +#include "src/dfa/dfa.h" +#include "src/dfa/tcmd.h" +#include "src/re/tag.h" + +namespace re2c +{ + +tagver_t cfg_t::compact(const cfg_t &cfg, tagver_t *ver2new) +{ + const std::vector &tags = cfg.dfa.tags; + const size_t + nver = static_cast(cfg.dfa.maxtagver) + 1, + ntag = tags.size(); + const tagver_t *fins = cfg.dfa.finvers; + bool *used = new bool[nver]; + + std::fill(used, used + nver, false); + for (size_t t = 0; t < ntag; ++t) { + const tagver_t f = fins[t]; + used[f] = f != TAGVER_ZERO; // fixed tag or unreachable rule + } + for (size_t i = 0; i < cfg.nbbfall; ++i) { + const cfg_bb_t &b = cfg.bblocks[i]; + for (const tcmd_t *p = b.cmd; p; p = p->next) { + const tagver_t r = p->rhs; + if (r != TAGVER_ZERO) { + used[r] = true; + } + used[p->lhs] = true; + } + } + + tagver_t maxver = 0; + for (size_t v = 0; v < nver; ++v) { + ver2new[v] = used[v] ? ++maxver : TAGVER_ZERO; + } + + delete[] used; + return maxver; +} + +} // namespace re2c + diff --git a/src/dfa/cfg/dce.cc b/src/dfa/cfg/dce.cc new file mode 100644 index 0000000..88b97ef --- /dev/null +++ b/src/dfa/cfg/dce.cc @@ -0,0 +1,29 @@ +#include "src/dfa/cfg/cfg.h" +#include "src/dfa/dfa.h" +#include "src/dfa/tcmd.h" +#include "src/re/tag.h" + +namespace re2c +{ + +void cfg_t::dead_code_elimination(cfg_t &cfg, const bool *live) +{ + const tagver_t nver = cfg.dfa.maxtagver + 1; + // final and fallback tags can't be dead by construction + cfg_bb_t *b = cfg.bblocks, *e = b + cfg.nbbarc; + + // ignore possible local liveness inside of bblock: + // by construction we have no versions local to bblock + for (; b < e; ++b, live += nver) { + for (tcmd_t *p, **pp = &b->cmd; (p = *pp);) { + if (!live[p->lhs]) { + *pp = p->next; + } else { + pp = &p->next; + } + } + } +} + +} // namespace re2c + diff --git a/src/dfa/cfg/dump.cc b/src/dfa/cfg/dump.cc new file mode 100644 index 0000000..d3757c1 --- /dev/null +++ b/src/dfa/cfg/dump.cc @@ -0,0 +1,85 @@ +#include + +#include "src/dfa/cfg/cfg.h" +#include "src/dfa/dfa.h" +#include "src/dfa/tcmd.h" +#include "src/re/rule.h" +#include "src/re/tag.h" + +namespace re2c +{ + +void dump_cfg(const cfg_t &cfg, const bool *live) +{ + const tagver_t nver = cfg.dfa.maxtagver + 1; + + fprintf(stderr, "digraph CFG {\n" + " rankdir=LR\n" + " node[shape=Mrecord fontname=Terminus height=0.2 width=0.2]\n" + " edge[arrowhead=vee fontname=Terminus]\n\n"); + + for (cfg_ix_t i = 0; i < cfg.nbbfall; ++i, live += nver) { + const cfg_bb_t *b = cfg.bblocks + i; + + fprintf(stderr, " n%u [label=\"%u\\n", i, i); + for (const tcmd_t *p = b->cmd; p; p = p->next) { + const tagver_t l = p->lhs, r = p->rhs, *h = p->history; + if (tcmd_t::iscopy(p)) { + fprintf(stderr, "%d=%d ", l, r); + } else { + fprintf(stderr, "%d", l); + if (r != TAGVER_ZERO) { + fprintf(stderr, "=%d", r); + } + for (; *h != TAGVER_ZERO; ++h) { + fprintf(stderr, "%s ", *h == TAGVER_BOTTOM ? "↓" : "↑"); + } + } + } + fprintf(stderr, "/"); + if (b->rule) { + for (size_t t = b->rule->ltag; t < b->rule->htag; ++t) { + const tagver_t v = cfg.dfa.finvers[t]; + if (v != TAGVER_ZERO) { + fprintf(stderr, "%i ", v); + } + } + } + + if (i < cfg.nbbfin) { + fprintf(stderr, "\\nneed:"); + for (tagver_t v = 0; v < nver; ++v) { + if (live[v]) { + fprintf(stderr, " %i", v); + } + } + } + + fprintf(stderr, "\"]\n"); + + const char *style = b->rule ? "dotted" : "solid"; + for (cfg_ix_t *j = b->succb; j < b->succe; ++j) { + fprintf(stderr, " n%u -> n%u [style=%s]\n", i, *j, style); + } + } + + fprintf(stderr, "}\n"); +} + +void dump_interf(const cfg_t &cfg, const bool *interf) +{ + const tagver_t nver = cfg.dfa.maxtagver + 1; + for (tagver_t y = 1; y < nver; ++y) { + fprintf(stderr, "%2d ", y); + } + fprintf(stderr, "\n"); + for (tagver_t x = 1; x < nver; ++x) { + for (tagver_t y = 1; y < nver; ++y) { + fprintf(stderr, "%2c ", interf[x * nver + y] ? '*' : '.'); + } + fprintf(stderr, "\n"); + } +} + +} // namespace re2c + diff --git a/src/dfa/cfg/freeze.cc b/src/dfa/cfg/freeze.cc new file mode 100644 index 0000000..926089d --- /dev/null +++ b/src/dfa/cfg/freeze.cc @@ -0,0 +1,56 @@ +#include +#include + +#include "src/dfa/dfa.h" +#include "src/dfa/tcmd.h" + +namespace re2c +{ + +/* note [tag freezing] + * + * Comparison of tag commands should be very fast (constant time): + * many optimizations rely on this (like tunnelling, hoisting and + * especially Moore's minimization, which compares whole classes + * of tagged transition at once). So we bring each command to some + * 'normal form' and insert it into common index. + * + * After that commands can be addressed and compared by index. + * They also become immutable, because different commands may + * share representation in memory. + */ +void freeze_tags(dfa_t &dfa) +{ + tcpool_t &pool = dfa.tcpool; + const size_t + nstate = dfa.states.size(), + nsym = dfa.nchars; + + dfa.tcid0 = pool.insert(dfa.tcmd0); + dfa.tcmd0 = NULL; + + for (size_t i = 0; i < nstate; ++i) { + dfa_state_t *s = dfa.states[i]; + tcmd_t **cmd = s->tcmd, + **const fin = cmd + nsym, + **const fall = fin + 1; + tcid_t *id = s->tcid = new tcid_t[nsym + 2]; + + // transition commands + for(; cmd < fin; ++cmd) { + *id++ = pool.insert(*cmd); + } + + // final epsilon-transition command + *id++ = pool.insert(*fin); + + // fallback epsilon-transition command + *id++ = pool.insert(*fall); + + delete[] s->tcmd; + s->tcmd = NULL; + } +} + +} // namespace re2c + diff --git a/src/dfa/cfg/interfere.cc b/src/dfa/cfg/interfere.cc new file mode 100644 index 0000000..45da84b --- /dev/null +++ b/src/dfa/cfg/interfere.cc @@ -0,0 +1,101 @@ +#include +#include +#include + +#include "src/dfa/cfg/cfg.h" +#include "src/dfa/dfa.h" +#include "src/dfa/tcmd.h" +#include "src/re/tag.h" + +namespace re2c +{ + +typedef std::vector vals_t; +static void interfere(const tcmd_t *cmd, const bool *live, bool *interf, bool *buf, vals_t *vals, size_t nver); + +void cfg_t::interference(const cfg_t &cfg, const bool *live, bool *interf) +{ + const tagver_t maxver = cfg.dfa.maxtagver + 1; + const size_t nver = static_cast(maxver); + bool *buf = new bool[nver]; + vals_t *vals = new vals_t[nver](); + const cfg_bb_t *b = cfg.bblocks, *e = b + cfg.nbbfin; + + memset(interf, 0, nver * nver * sizeof(bool)); + for (; b < e; ++b, live += nver) { + interfere(b->cmd, live, interf, buf, vals, nver); + } + + // versions of tags with/without history interfere + std::set &mt = cfg.dfa.mtagvers; + for (std::set::iterator i = mt.begin(); i != mt.end(); ++i) { + for (tagver_t u = *i, v = 0; v < maxver; ++v) { + if (mt.find(v) == mt.end()) { + interf[v * maxver + u] = interf[u * maxver + v] = true; + } + } + } + + delete[] buf; + delete[] vals; +} + +void interfere(const tcmd_t *cmd, const bool *live, bool *interf, + bool *buf, vals_t *vals, size_t nver) +{ + // initialize value of RHS for all commands in this basic block + for (const tcmd_t *p = cmd; p; p = p->next) { + const tagver_t r = p->rhs; + if (r != TAGVER_ZERO) { + vals[r].clear(); + vals[r].push_back(r); + } + } + + // find interference list for LHS of each command + for (const tcmd_t *p = cmd; p; p = p->next) { + const tagver_t l = p->lhs, r = p->rhs, *h = p->history; + vals_t &vl = vals[l], &vr = vals[r]; + + // alive after this command + memcpy(buf, live, nver * sizeof(bool)); + cfg_t::live_through_bblock(p->next, buf); + + // if copy command, exclude RHS + if (tcmd_t::iscopy(p)) buf[r] = false; + + // update value of current command's LHS + if (tcmd_t::iscopy(p)) { + vl = vr; + } else if (tcmd_t::isset(p)) { + vl.clear(); + vl.push_back(*h); + } else { + if (l != r) vl = vr; + for (; *++h != TAGVER_ZERO;); // history is reversed + for (; h-- != p->history;) { + vl.push_back(*h); + } + } + // Exclude from interference list all LHS from preceding commands + // which value is equal to current LHS value. Subsequent commands + // are ignored: if subsequent command that sets LHS to the same value + // precedes any use of it, liveness propagation through basic block + // would mark this LHS as dead and not interfering anyway; otherwise + // (if use precedes setting to the same value), then it indeed + // interferes with current LHS. + for (const tcmd_t *q = cmd; q != p; q = q->next) { + if (vals[q->lhs] == vl) { + buf[q->lhs] = false; + } + } + + const size_t u = static_cast(l); + for (size_t v = 0; v < nver; ++v) { + if (!buf[v]) continue; + interf[u * nver + v] = interf[v * nver + u] = true; + } + } +} + +} // namespace re2c diff --git a/src/dfa/cfg/liveanal.cc b/src/dfa/cfg/liveanal.cc new file mode 100644 index 0000000..4123f3f --- /dev/null +++ b/src/dfa/cfg/liveanal.cc @@ -0,0 +1,173 @@ +#include +#include +#include + +#include "src/dfa/cfg/cfg.h" +#include "src/dfa/dfa.h" +#include "src/dfa/tcmd.h" +#include "src/re/rule.h" +#include "src/re/tag.h" + +namespace re2c +{ + +// calculates deep-first search postorder of transition nodes, +// skips final and fallback nodes (they have no successors anyway) +static cfg_ix_t *postorder(const cfg_t &cfg, bool *done, + cfg_ix_t *ord, cfg_ix_t i) +{ + if (i >= cfg.nbbarc || done[i]) return ord; + done[i] = true; + + const cfg_bb_t *b = cfg.bblocks + i; + for (cfg_ix_t *j = b->succb; j < b->succe; ++j) { + ord = postorder(cfg, done, ord, *j); + } + + *ord = i; + return ++ord; +} + +void cfg_t::live_through_bblock(const tcmd_t *cmd, bool *live) +{ + if (!cmd) return; + + live_through_bblock(cmd->next, live); + + const tagver_t l = cmd->lhs, r = cmd->rhs; + if (live[l]) { + // first reset, than set: LHS might be equal to history + live[l] = false; + if (r != TAGVER_ZERO) { + live[r] = true; + } + } +} + +void cfg_t::liveness_analysis(const cfg_t &cfg, bool *live) +{ + const std::vector &tags = cfg.dfa.tags; + const size_t nver = static_cast(cfg.dfa.maxtagver) + 1; + const cfg_ix_t + narc = cfg.nbbarc, + nfin = cfg.nbbfin; + const tagver_t *fins = cfg.dfa.finvers; + bool *buf1 = new bool[nver]; + bool *buf2 = new bool[nver]; + bool *done = new bool[narc]; + cfg_ix_t *pord = new cfg_ix_t[narc]; + + /* note [control flow equations for tag liveness] + * + * Liveness in bblock B is given by control flow equations: + * live-out(B) = union of live-in(C), for all successors C + * live-in(B) = live-out(B) except defined(B) + * Equations are solved by iteration until fix point. + * + * Live set can only grow on each iteration, it never shrinks. + * Initially all final tag versions used in rules are alive; + * we pre-calculate them and then only update table by adding + * new versions. + */ + + memset(live, 0, nfin * nver * sizeof(bool)); + for (cfg_ix_t i = narc; i < nfin; ++i) { + const cfg_bb_t *b = cfg.bblocks + i; + const Rule *r = b->rule; + bool *l = &live[i * nver]; + + // all final bblocks have USE tags, but no successors + assert(r && b->succb == b->succe); + + for (size_t t = r->ltag; t < r->htag; ++t) { + l[fins[t]] = !fixed(tags[t]); + } + } + + memset(done, 0, narc * sizeof(bool)); + postorder(cfg, done, pord, 0); + + for (bool loop = true; loop;) { + loop = false; + + // iterate nodes in postorder + for (cfg_ix_t a = 0; a < narc; ++a) { + const cfg_ix_t i = pord[a]; + const cfg_bb_t *b = cfg.bblocks + i; + bool *old = &live[i * nver]; + + // transition bblocks have no USE tags + assert(!b->rule); + + memcpy(buf1, old, nver * sizeof(bool)); + for (cfg_ix_t *j = b->succb; j < b->succe; ++j) { + const bool *l = &live[*j * nver]; + const tcmd_t *cmd = cfg.bblocks[*j].cmd; + memcpy(buf2, l, nver * sizeof(bool)); + + cfg_t::live_through_bblock(cmd, buf2); + + for (size_t v = 0; v < nver; ++v) { + buf1[v] |= buf2[v]; + } + } + + if (memcmp(old, buf1, nver * sizeof(bool)) != 0) { + memcpy(old, buf1, nver * sizeof(bool)); + loop = true; + } + } + } + + /* note [fallback tag liveness] + * + * Liveness of fallback tag is propagated forward from fallback + * state (see note [fallback states]) and until there remain + * any fallthrough paths from current state. + * + * Fallback version of tag is either backup copy of tag's final + * version, or (if there's no backup) the final version itself. + * Absence of backup means that final version is not overwritten, + * but still we should prevent it from merging with other tags + * (otherwise it may become overwritten). + */ + for (cfg_ix_t i = nfin; i < cfg.nbbfall; ++i) { + const cfg_bb_t *b = cfg.bblocks + i; + const Rule *r = b->rule; + + // all fallback bblocks have USE tags + assert(r); + + memset(buf1, 0, nver * sizeof(bool)); + for (size_t t = r->ltag; t < r->htag; ++t) { + buf1[fins[t]] = !fixed(tags[t]); + } + + // need two passes: same version may occur as both LHS and RHS + // not the same as backward propagation of liveness through bblock + for (const tcmd_t *p = b->cmd; p; p = p->next) { + buf1[p->lhs] = false; + } + for (const tcmd_t *p = b->cmd; p; p = p->next) { + const tagver_t v = p->rhs; + if (v != TAGVER_ZERO) { + buf1[v] = true; + } + } + + for (cfg_ix_t *j = b->succb; j < b->succe; ++j) { + bool *liv = &live[*j * nver]; + for (size_t v = 0; v < nver; ++v) { + liv[v] |= buf1[v]; + } + } + } + + delete[] buf1; + delete[] buf2; + delete[] done; + delete[] pord; +} + +} // namespace re2c + diff --git a/src/dfa/cfg/normalize.cc b/src/dfa/cfg/normalize.cc new file mode 100644 index 0000000..ac6f09e --- /dev/null +++ b/src/dfa/cfg/normalize.cc @@ -0,0 +1,116 @@ +#include +#include "src/util/c99_stdint.h" +#include +#include + +#include "src/dfa/cfg/cfg.h" +#include "src/dfa/dfa.h" +#include "src/dfa/tcmd.h" +#include "src/re/tag.h" + +namespace re2c +{ + +template void normalize(cmd_t *cmd); + +/* note [tag normalization] + * + * After optimizations different commands may become equal + * up to reordering and removing duplicates. Such commands + * should be recognized as equal by further optimizations + * like minimization, hoisting, tunnelling, etc. + * For that reason all commands are normalized. + */ + +static tcmd_t **normalize(tcmd_t **ps, tcmd_t *e); + +void cfg_t::normalization(cfg_t &cfg) +{ + const size_t nver = static_cast(cfg.dfa.maxtagver) + 1; + uint32_t *indeg = new uint32_t[nver]; + memset(indeg, 0, nver * sizeof(uint32_t)); + + cfg_bb_t *b = cfg.bblocks, *e = b + cfg.nbbfall; + for (; b < e; ++b) { + + // We cannot normalize the list of commands as a whole: the + // relative order of some commands might be significant. + // Therefore we split the list in continuous sublists of + // 'copy', 'save without history' and 'save with history' + // commands and normalize each sublist in a proper way. + tcmd_t **px, *x; + for (px = &b->cmd; (x = *px);) { + if (tcmd_t::iscopy(x)) { + for (x = *px; x && tcmd_t::iscopy(x); x = x->next); + *normalize(px, x) = NULL; // topsort expects NULL terminator + tcmd_t::topsort(px, indeg); + for (; *px; px = &(*px)->next); // find tail + *px = x; // restore tail + } else if (tcmd_t::isset(x)) { + for (x = *px; x && tcmd_t::isset(x); x = x->next); + px = normalize(px, x); + } else { + for (; (x = *px) && tcmd_t::isadd(x); px = &x->next); + // don't normalize, histories may have complex dependencies + } + } + } + + delete[] indeg; +} + +static void swap(tcmd_t &x, tcmd_t &y) +{ + assert(!tcmd_t::isadd(&x) && !tcmd_t::isadd(&y)); + std::swap(x.lhs, y.lhs); + std::swap(x.rhs, y.rhs); + std::swap(x.history[0], y.history[0]); +} + +static bool less(const tcmd_t &x, const tcmd_t &y) +{ + assert(!tcmd_t::isadd(&x) && !tcmd_t::isadd(&y)); + tagver_t u, v; + + u = x.lhs; v = y.lhs; + if (u < v) return true; + if (u > v) return false; + + u = x.rhs; v = y.rhs; + if (u < v) return true; + if (u > v) return false; + + u = x.history[0]; v = y.history[0]; + if (u < v) return true; + if (u > v) return false; + + return false; +} + +tcmd_t **normalize(tcmd_t **ps, tcmd_t *e) +{ + // sort lexicographically + for (tcmd_t *p = *ps; p != e; p = p->next) { + for (tcmd_t *q = p->next; q != e; q = q->next) { + if (less(*q, *p)) { + swap(*p, *q); + } + } + } + + // delete duplicates + for (tcmd_t *p = *ps; p != e;) { + tcmd_t *q = p->next; + if (q != e && tcmd_t::equal(*p, *q)) { + p->next = q->next; + } else { + p = q; + } + } + + for (; *ps != e; ps = &(*ps)->next); + return ps; +} + +} // namespace re2c + diff --git a/src/dfa/cfg/optimize.cc b/src/dfa/cfg/optimize.cc new file mode 100644 index 0000000..c2ea2ed --- /dev/null +++ b/src/dfa/cfg/optimize.cc @@ -0,0 +1,47 @@ +#include +#include "src/util/c99_stdint.h" + +#include "src/dfa/cfg/cfg.h" +#include "src/dfa/dfa.h" +#include "src/re/tag.h" + +namespace re2c +{ + +void compact_and_optimize_tags(dfa_t &dfa, bool optimize) +{ + tagver_t maxver = dfa.maxtagver; + if (maxver > 0) { + cfg_t cfg(dfa); + + size_t nver = static_cast(maxver) + 1; + tagver_t *ver2new = new tagver_t[nver]; + + maxver = cfg_t::compact(cfg, ver2new); + cfg_t::renaming(cfg, ver2new, maxver); + + if (optimize && maxver > 0) { + nver = static_cast(maxver) + 1; + bool *live = new bool[cfg.nbbfin * nver]; + bool *interf = new bool[nver * nver]; + + static const uint32_t NPASS = 2; + for (uint32_t n = 0; n < NPASS; ++n) { + cfg_t::liveness_analysis(cfg, live); + cfg_t::dead_code_elimination(cfg, live); + cfg_t::interference(cfg, live, interf); + maxver = cfg_t::variable_allocation(cfg, interf, ver2new); + cfg_t::renaming(cfg, ver2new, maxver); + cfg_t::normalization(cfg); + } + + delete[] live; + delete[] interf; + } + + delete[] ver2new; + } +} + +} // namespace re2c + diff --git a/src/dfa/cfg/rename.cc b/src/dfa/cfg/rename.cc new file mode 100644 index 0000000..615bbf0 --- /dev/null +++ b/src/dfa/cfg/rename.cc @@ -0,0 +1,55 @@ +#include +#include +#include + +#include "src/dfa/cfg/cfg.h" +#include "src/dfa/dfa.h" +#include "src/dfa/tcmd.h" +#include "src/re/tag.h" + +namespace re2c +{ + +void cfg_t::renaming(cfg_t &cfg, const tagver_t *ver2new, tagver_t maxver) +{ + tagver_t &oldmax = cfg.dfa.maxtagver; + if (oldmax == maxver) return; + oldmax = maxver; + + cfg_bb_t *b = cfg.bblocks, *be = b + cfg.nbbfall; + for (; b < be; ++b) { + for (tcmd_t *p, **pp = &b->cmd; (p = *pp);) { + tagver_t &l = p->lhs, &r = p->rhs, h = p->history[0]; + + l = ver2new[l]; + if (r != TAGVER_ZERO) { + r = ver2new[r]; + } + if (l == r && h == TAGVER_ZERO) { + *pp = p->next; + } else { + pp = &p->next; + } + } + } + + // final tag versions + tagver_t *fins = cfg.dfa.finvers; + const std::vector &tags = cfg.dfa.tags; + for (size_t t = 0; t < tags.size(); ++t) { + tagver_t &f = fins[t]; + if (f != TAGVER_ZERO) { // fixed tag or unreachable rule + f = ver2new[f]; + } + } + + // versions of tags with history + std::set newmt, &oldmt = cfg.dfa.mtagvers; + for (std::set::iterator i = oldmt.begin(); i != oldmt.end(); ++i) { + newmt.insert(ver2new[*i]); + } + oldmt.swap(newmt); +} + +} // namespace re2c + diff --git a/src/dfa/cfg/varalloc.cc b/src/dfa/cfg/varalloc.cc new file mode 100644 index 0000000..75d449c --- /dev/null +++ b/src/dfa/cfg/varalloc.cc @@ -0,0 +1,145 @@ +#include +#include + +#include "src/dfa/cfg/cfg.h" +#include "src/dfa/dfa.h" +#include "src/dfa/tcmd.h" +#include "src/re/tag.h" + +namespace re2c +{ + +/* We have a binary relation on the set of all tags + * and must construct set decomposition into subsets such that + * all tags in the same subset are equivalent. + * + * This problem is isomorphic to partitioning graph into cliques + * (aka finding the 'clique cover' of a graph). + * + * Finding minimal clique cover in arbitrary graph is NP-complete. + * We build just some cover (not necessarily minimal). + * The algorithm takes quadratic (in the number of tags) time. + */ +tagver_t cfg_t::variable_allocation(const cfg_t &cfg, const bool *interf, + tagver_t *ver2new) +{ + const tagver_t + END = std::numeric_limits::max(), + nver = cfg.dfa.maxtagver + 1; + tagver_t *next = new tagver_t[nver]; // list of class members + tagver_t *repr = new tagver_t[nver]; // maps tag to class representative + tagver_t rx, ry, x, y, z; + + std::fill(next, next + nver, END); + std::fill(repr, repr + nver, END); + + // copy coalescing: for each command X = Y, try to merge X and Y + const cfg_bb_t *b = cfg.bblocks, *e = b + cfg.nbbfall; + for (; b < e; ++b) { + for (const tcmd_t *p = b->cmd; p; p = p->next) { + x = p->lhs; + y = p->rhs; + if (y == TAGVER_ZERO || y == x) continue; + + rx = repr[x]; + ry = repr[y]; + + if (rx != END) { + if (ry != END) continue; + for (z = rx; z != END; z = next[z]) { + if (interf[z * nver + y]) break; + } + if (z == END) { + repr[y] = rx; + next[y] = next[rx]; + next[rx] = y; + } + } else if (ry != END) { + for (z = ry; z != END; z = next[z]) { + if (interf[z * nver + x]) break; + } + if (z == END) { + repr[x] = ry; + next[x] = next[ry]; + next[ry] = x; + } + } else if (!interf[x * nver + y]) { + repr[x] = repr[y] = x; + next[x] = y; + } + } + } + + // try to merge equivalence classes left after copy coalescing + for (rx = 0; rx < nver; ++rx) { + if (rx != repr[rx]) continue; + + for (ry = rx + 1; ry < nver; ++ry) { + if (ry != repr[ry]) continue; + + for (x = rx; x != END; x = next[x]) { + for (y = ry; y != END; y = next[y]) { + if (interf[x * nver + y]) break; + } + if (y != END) break; + } + + if (x == END) { + for (y = ry;; y = next[y]) { + repr[y] = rx; + if (next[y] == END) { + next[y] = next[rx]; + next[rx] = ry; + break; + } + } + } + } + } + + // push each remaining tag to any non-interfering class + for (x = 0; x < nver; ++x) { + if (repr[x] != END) continue; + + // try all existing classes + for (rx = 0; rx < nver; ++rx) { + if (rx != repr[rx]) continue; + + // check interference with class members + for (y = rx; y != END; y = next[y]) { + if (interf[x * nver + y]) break; + } + + // no interference; add to class + if (y == END) { + repr[x] = rx; + next[x] = next[rx]; + next[rx] = x; + break; + } + } + + // make new equivalence class + if (rx == nver) { + repr[x] = x; + } + } + + tagver_t maxver = 0; + for (rx = 0; rx < nver; ++rx) { + if (repr[rx] != rx) continue; + + ++maxver; + for (x = rx; x != END; x = next[x]) { + ver2new[x] = maxver; + } + } + + delete[] next; + delete[] repr; + + return maxver; +} + +} // namespace re2c + diff --git a/src/dfa/closure.cc b/src/dfa/closure.cc new file mode 100644 index 0000000..a097aaf --- /dev/null +++ b/src/dfa/closure.cc @@ -0,0 +1,522 @@ +#include +#include "src/util/c99_stdint.h" +#include +#include +#include +#include +#include +#include +#include + +#include "src/conf/opt.h" +#include "src/dfa/closure.h" +#include "src/dfa/dfa.h" +#include "src/dfa/tagpool.h" +#include "src/dfa/tcmd.h" +#include "src/nfa/nfa.h" +#include "src/re/rule.h" + +namespace re2c +{ + +static void closure_posix(const closure_t &init, closure_t &done, closure_t *shadow, Tagpool &tagpool, const std::vector &tags); +static void closure_leftmost(const closure_t &init, closure_t &done, closure_t *shadow, Tagpool &tagpool); +static int32_t compare_posix(const clos_t &c1, const clos_t &c2, Tagpool &tagpool, const std::vector &tags); +static void prune(closure_t &clos, std::valarray &rules); +static void lower_lookahead_to_transition(closure_t &clos); +static tcmd_t *generate_versions(dfa_t &dfa, closure_t &clos, Tagpool &tagpool, newvers_t &newvers); +static void orders(closure_t &clos, Tagpool &tagpool, const std::vector &tags); +static bool cmpby_rule_state(const clos_t &x, const clos_t &y); + +tcmd_t *closure(dfa_t &dfa, closure_t &clos1, closure_t &clos2, + Tagpool &tagpool, newvers_t &newvers, closure_t *shadow) +{ + // build tagged epsilon-closure of the given set of NFA states + if (tagpool.opts->posix_captures) { + closure_posix(clos1, clos2, shadow, tagpool, dfa.tags); + prune(clos2, dfa.rules); + orders(clos2, tagpool, dfa.tags); + std::sort(clos2.begin(), clos2.end(), cmpby_rule_state); + } else { + closure_leftmost(clos1, clos2, shadow, tagpool); + prune(clos2, dfa.rules); + } + + // see note [the difference between TDFA(0) and TDFA(1)] + if (!tagpool.opts->lookahead) { + lower_lookahead_to_transition(clos2); + if (shadow) lower_lookahead_to_transition(*shadow); + } + + // merge tags from different rules, find nondeterministic tags + tcmd_t *cmd = generate_versions(dfa, clos2, tagpool, newvers); + if (shadow) generate_versions(dfa, *shadow, tagpool, newvers); + + return cmd; +} + +bool cmpby_rule_state(const clos_t &x, const clos_t &y) +{ + const nfa_state_t *sx = x.state, *sy = y.state; + const size_t rx = sx->rule, ry = sy->rule; + if (rx < ry) return true; + if (rx > ry) return false; + if (sx < sy) return true; + if (sx > sy) return false; + // all items in closute have different states + return false; +} + +// Skip non-orbit start tags: their position is fixed on some higher-priority +// tag (except the very first tag, but in RE2C match is always anchored). +// We cannot skip orbit start tag because the corresponding orbit end tag is +// hoisted out of loop (by construction) and is, in fact, non-orbit; but we can +// skip orbit end tag instead. +// Skipping non-orbit start tags allows us to compare all subhistories in the +// same way (incrementally). Subhistories of non-orbit start tags cannot be +// compared incrementally, because default value may be added on a later step +// than non-default value. +static bool redundant(size_t t, const std::vector &tags) { + return (t % 2 == 0) != orbit(tags[t]); +} + +/* note [epsilon-closures in tagged NFA] + * + * The closure includes all NFA states that are reachable by epsilon-paths + * from the given set of states and either are final or have non-epsilon + * transitions. Note that by construction NFA states cannot have both + * epsilon and non-epsilon transitions. + * + * Each closure state might be reachable by multiple epsilon-paths with + * different tags: this means that the regular expression is ambiguous + * and can be parsed in different ways. Which parse to choose depends on the + * disambiguation policy. RE2C supports two policies: leftmost greedy and + * POSIX. + * + * We use Goldber-Radzik algorithm to find the "shortest path". + * Both disambiguation policies forbid epsilon-cycles with negative weight. + */ + +static void enqueue(clos_t x, std::stack &bstack, closure_t &done, + closure_t *shadow, Tagpool &tagpool, const std::vector &tags) +{ + nfa_state_t *n = x.state; + uint32_t &i = n->clos; + + if (i == NOCLOS) { + i = static_cast(done.size()); + done.push_back(x); + } else { + const int32_t cmp = compare_posix(x, done[i], tagpool, tags); + if (cmp < 0) std::swap(x, done[i]); + if (shadow && cmp != 0) shadow->push_back(x); + if (cmp >= 0) return; + } + + if (n->status != GOR_TOPSORT) { + bstack.push(n); + n->status = GOR_NEWPASS; + } +} + +static void scan(nfa_state_t *n, std::stack &bstack, closure_t &done, + closure_t *shadow, Tagpool &tagpool, const std::vector &tags) +{ + tagtree_t &history = tagpool.history; + clos_t x = done[n->clos]; + switch (n->type) { + case nfa_state_t::NIL: + x.state = n->nil.out; + enqueue(x, bstack, done, shadow, tagpool, tags); + break; + case nfa_state_t::ALT: + x.state = n->alt.out2; + enqueue(x, bstack, done, shadow, tagpool, tags); + x.state = n->alt.out1; + enqueue(x, bstack, done, shadow, tagpool, tags); + break; + case nfa_state_t::TAG: + x.state = n->tag.out; + x.tlook = history.push(x.tlook, n->tag.info, + n->tag.bottom ? TAGVER_BOTTOM : TAGVER_CURSOR); + enqueue(x, bstack, done, shadow, tagpool, tags); + break; + case nfa_state_t::RAN: + case nfa_state_t::FIN: + break; + } +} + +void closure_posix(const closure_t &init, closure_t &done, + closure_t *shadow, Tagpool &tagpool, const std::vector &tags) +{ + std::stack + &astack = tagpool.astack, + &bstack = tagpool.bstack; + + // enqueue all initial states + done.clear(); + if (shadow) shadow->clear(); + for (cclositer_t c = init.begin(); c != init.end(); ++c) { + enqueue(*c, bstack, done, shadow, tagpool, tags); + } + + // Gordberg-Radzik 'shortest path' algorithm. + // Papers: 1993, "A heuristic improvement of the Bellman-Ford + // algorithm" by Goldberg, Radzik and 1996, Shortest paths algorithms: + // Theory andexperimental evaluation" by Cherkassky, Goldberg, Radzik. + // Complexity for digraph G=(V,E) is O(|V|*|E|). + for (; !bstack.empty(); ) { + + // 1st step: find admissible subgraph reachable from B-stack + // and topologically sort it (this can be done by a single + // depth-first search that scans each state and pushes traversed + // states to A-stack in postorder) + for (; !bstack.empty(); ) { + nfa_state_t *n = bstack.top(); + if (n->status == GOR_NEWPASS) { + n->status = GOR_TOPSORT; + scan(n, bstack, done, shadow, tagpool, tags); + } else if (n->status == GOR_TOPSORT) { + bstack.pop(); + astack.push(n); + } else { // GOR_OFFSTACK + bstack.pop(); + } + } + + // 2nd step: scan topologically ordered states from A-stack + // and push head states of relaxed transitions to B-stack + for (; !astack.empty(); ) { + nfa_state_t *n = astack.top(); + astack.pop(); + scan(n, bstack, done, shadow, tagpool, tags); + n->status = GOR_OFFSTACK; + } + } + + // reset associated closure items and check status + // (do this before removing any states from closure) + for (clositer_t i = done.begin(); i != done.end(); ++i) { + i->state->clos = NOCLOS; + assert(i->state->status == GOR_OFFSTACK); + } +} + +/* note [at most one final item per closure] + * + * By construction NFA has exactly one final state per rule. Thus closure + * has at most one final item per rule (in other words, all final items + * in closure belong to different rules). The rule with the highest priority + * shadowes all other rules. Final items that correspond to shadowed rules + * are useless and should be removed as early as possible. + * + * If we let such items remain in closure, they may prevent the new DFA + * state from being merged with other states. This won't affect the final + * program: meaningless finalizing tags will be removed by dead code + * elimination and subsequent minimization will merge equivalent final + * states. However, it's better not to add useless final items at all. + * + * Note that the first final item reached by the epsilon-closure it the one + * with the highest priority (see note [closure items are sorted by rule]). + */ + +int32_t compare_posix(const clos_t &c1, const clos_t &c2, + Tagpool &tagpool, const std::vector &tags) +{ + if (tagpool.ntags == 0 + || (c1.order == c2.order && c1.tlook == c2.tlook)) return 0; + + tagtree_t &h = tagpool.history; + for (size_t t = 0; t < tagpool.ntags; ++t) { + if (redundant(t, tags)) continue; + const hidx_t i1 = c1.tlook, i2 = c2.tlook; + const tagver_t + o1 = tagpool[c1.order][t], + o2 = tagpool[c2.order][t]; + const int32_t cmp = h.compare_histories(i1, i2, o1, o2, t); + if (cmp != 0) return cmp; + } + return 0; +} + +void closure_leftmost(const closure_t &init, closure_t &done, + closure_t *shadow, Tagpool &tagpool) +{ + std::stack &todo = tagpool.cstack; + + // enqueue all initial states + done.clear(); + if (shadow) shadow->clear(); + for (rcclositer_t c = init.rbegin(); c != init.rend(); ++c) { + todo.push(*c); + } + + // DFS; linear complexity + for (; !todo.empty(); ) { + clos_t x = todo.top(); + todo.pop(); + nfa_state_t *n = x.state; + + if (n->clos == NOCLOS) { + n->clos = static_cast(done.size()); + done.push_back(x); + } else { + if (shadow) shadow->push_back(x); + continue; + } + + switch (n->type) { + case nfa_state_t::NIL: + x.state = n->nil.out; + todo.push(x); + break; + case nfa_state_t::ALT: + x.state = n->alt.out2; + todo.push(x); + x.state = n->alt.out1; + todo.push(x); + break; + case nfa_state_t::TAG: + x.state = n->tag.out; + x.tlook = tagpool.history.push(x.tlook, n->tag.info, + n->tag.bottom ? TAGVER_BOTTOM : TAGVER_CURSOR); + todo.push(x); + break; + case nfa_state_t::RAN: + case nfa_state_t::FIN: + break; + } + } + + // reset associated closure items + // (do this before removing any states from closure) + for (clositer_t i = done.begin(); i != done.end(); ++i) { + i->state->clos = NOCLOS; + } +} + +void prune(closure_t &clos, std::valarray &rules) +{ + clositer_t b = clos.begin(), e = clos.end(), i, j; + + // drop "inner" states (non-final without outgoing non-epsilon transitions) + j = std::stable_partition(b, e, clos_t::ran); + e = std::stable_partition(j, e, clos_t::fin); + size_t n = static_cast(e - b); + + // drop all final states except one; mark dropped rules as shadowed + // see note [at most one final item per closure] + if (j != e) { + std::sort(j, e, cmpby_rule_state); + const uint32_t l = rules[j->state->rule].code->fline; + for (i = j; ++i < e;) { + rules[i->state->rule].shadow.insert(l); + } + n = static_cast(j - b) + 1; + } + + clos.resize(n); +} + +/* note [the difference between TDFA(0) and TDFA(1)] + * + * TDFA(0) performs epsilon-closure after transition on symbol, + * while TDFA(1) performs it before the transition and uses the lookahead + * symbol to filter the closure. + * + * TDFA(0) is one step ahead of TDFA(1): it consumes a symol, then builds + * epsilon-closure, eagerly applies all tags reachable by it and goes to + * the next state. + * + * TDFA(1) is more lazy: it builds epsilon-closure, then filters it with + * respect to the current symbol (uses only those states which have outgoing + * transitions on this symbol), then applies corresponding tags (probably + * not all tags applied by TDFA(0)) and then consumes the symbol and goes + * to the next state. + * + * Thus in general TDFA(1) raises less conflicts than TDFA(0). + */ + +void lower_lookahead_to_transition(closure_t &clos) +{ + for (clositer_t c = clos.begin(); c != clos.end(); ++c) { + c->ttran = c->tlook; + c->tlook = HROOT; + } +} + +tcmd_t *generate_versions(dfa_t &dfa, closure_t &clos, Tagpool &tagpool, newvers_t &newvers) +{ + tcmd_t *cmd = NULL; + const size_t ntag = tagpool.ntags; + tagver_t *vers = tagpool.buffer, &maxver = dfa.maxtagver; + tagtree_t &tagtree = tagpool.history; + const std::vector &tags = dfa.tags; + clositer_t b = clos.begin(), e = clos.end(), c; + newver_cmp_t cmp = {tagtree}; + newvers_t newacts(cmp); + + // for each tag, if there is at least one tagged transition, + // allocate new version (negative for bottom and positive for + // normal transition, however absolute value should be unique + // among all versions of all tags) + for (c = b; c != e; ++c) { + const hidx_t l = c->tlook, h = c->ttran; + if (h == HROOT) continue; + + const tagver_t *vs = tagpool[c->tvers]; + for (size_t t = 0; t < ntag; ++t) { + const Tag &tag = tags[t]; + const tagver_t + h0 = tagtree.last(h, t), + l0 = tagtree.last(l, t); + + if (h0 == TAGVER_ZERO) continue; + + const tagver_t v = history(tag) ? vs[t] : TAGVER_ZERO; + newver_t x = {t, v, h}; + const tagver_t + n = (maxver + 1) * (h0 == TAGVER_BOTTOM ? -1 : 1), + m = newvers.insert(std::make_pair(x, n)).first->second; + if (n == m) ++maxver; + + if (!fixed(tag) && (l0 == TAGVER_ZERO || history(tag))) { + newacts.insert(std::make_pair(x, m)); + } + } + } + + // actions + for (newvers_t::iterator i = newacts.begin(); i != newacts.end(); ++i) { + const tagver_t m = i->second, v = i->first.base; + const hidx_t h = i->first.history; + const size_t t = i->first.tag; + if (history(tags[t])) { + cmd = dfa.tcpool.make_add(cmd, abs(m), abs(v), tagtree, h, t); + } else { + cmd = dfa.tcpool.make_set(cmd, abs(m), tagtree.last(h, t)); + } + } + + // mark tags with history + for (newvers_t::iterator j = newvers.begin(); j != newvers.end(); ++j) { + if (history(tags[j->first.tag])) dfa.mtagvers.insert(abs(j->second)); + } + + // update tag versions in closure + for (c = b; c != e; ++c) { + const hidx_t h = c->ttran; + if (h == HROOT) continue; + + const tagver_t *vs = tagpool[c->tvers]; + for (size_t t = 0; t < ntag; ++t) { + const tagver_t + v0 = vs[t], + h0 = tagtree.last(h, t), + v = history(tags[t]) ? v0 : TAGVER_ZERO; + if (h0 == TAGVER_ZERO) { + vers[t] = v0; + } else { + newver_t x = {t, v, h}; + vers[t] = newvers[x]; + } + } + c->tvers = tagpool.insert(vers); + } + + return cmd; +} + +/* note [POSIX orbit tags] + * + * POSIX disambiguation rules demand that earlier subexpressions match + * the longest possible prefix of the input string (without violating the + * whole match). To accommodate these rules, we resolve conflicts on orbit + * tags by comparison of tag subhistories on conflicting NFA paths. + * + * If one subhistory is a proper prefix of another subhistory, it is less; + * otherwise for the first pair of different offsets, if one offset is greater + * than the other, then the corresponding subhistory is less. + * + * It is possible to pre-compare two NFA paths corresponding to the same + * input string prefix and ending in the same NFA state; if paths are not + * equal, the result of this comparison will hold for any common suffix. + * + * It is also possible to pre-compare NFA paths that correspond to the same + * input prefix, but end in different NFA states. Such comparison is incorrect + * unless subhistories start at the same offset; but if it is incorrect, we + * will never use its result (tags with higher priority will also disagree). + * + * Therefore instead of keeping the whole history of offsets we calculate + * the relative order of any pair of subhistories on each step. + * + * This part of the algorithm was invented by Christopher Kuklewicz. + */ + +struct cmp_posix_t +{ + Tagpool &tagpool; + size_t tag; + bool operator()(cclositer_t x, cclositer_t y) + { + const hidx_t i1 = x->tlook, i2 = y->tlook; + const tagver_t + o1 = tagpool[x->order][tag], + o2 = tagpool[y->order][tag]; + // comparison result is inverted, because orders are used as offsets + return tagpool.history.compare_last_subhistories(i1, i2, o1, o2, tag) > 0; + } +}; + +void orders(closure_t &clos, Tagpool &tagpool, const std::vector &tags) +{ + clositer_t b = clos.begin(), e = clos.end(), c; + const size_t + ntag = tagpool.ntags, + nclos = clos.size(); + size_t &maxclos = tagpool.maxclos; + tagver_t *&os = tagpool.orders, *o, *os0; + cclositer_t *&ps = tagpool.closes, *pe, *p; + + if (ntag == 0) return; + + // reallocate buffers if necessary + if (maxclos < nclos) { + maxclos = nclos * 2; // in advance + delete[] os; + delete[] ps; + os = new tagver_t[(ntag + 1) * maxclos]; + ps = new cclositer_t[maxclos]; + } + + os0 = os + ntag * maxclos; + pe = ps; + for (c = b; c != e; ++c) *pe++ = c; + + memset(os, 0, ntag * nclos * sizeof(tagver_t)); //some tags are skipped + for (size_t t = 0; t < ntag; ++t) { + if (redundant(t, tags)) continue; + + cmp_posix_t cmp = {tagpool, t}; + std::sort(ps, pe, cmp); + tagver_t m = 0; + o = os0; + for (p = ps; p < pe; ++m) { + *o++ = m; + for (; ++p < pe && !cmp(p[-1], p[0]);) *o++ = m; + } + + o = os; + for (c = b; c != e; ++c, o += ntag) { + o[t] = os0[std::find(ps, pe, c) - ps]; + } + } + + o = os; + for (c = b; c != e; ++c, o += ntag) { + c->order = tagpool.insert(o); + } +} + +} // namespace re2c diff --git a/src/dfa/closure.h b/src/dfa/closure.h new file mode 100644 index 0000000..ed30ca3 --- /dev/null +++ b/src/dfa/closure.h @@ -0,0 +1,68 @@ +#ifndef _RE2C_DFA_CLOSURE_ +#define _RE2C_DFA_CLOSURE_ + +#include +#include +#include + +#include "src/dfa/dfa.h" +#include "src/dfa/tagtree.h" +#include "src/nfa/nfa.h" +#include "src/re/tag.h" + +namespace re2c +{ + +struct Tagpool; +struct dfa_t; +struct tcmd_t; + +struct clos_t +{ + nfa_state_t *origin; // for debug only + nfa_state_t *state; + size_t order; // vector of orders + size_t tvers; // vector of tag versions (including lookahead tags) + hidx_t ttran; // history of transition tags + hidx_t tlook; // history of lookahead tags + + static inline bool fin(const clos_t &c) { return c.state->type == nfa_state_t::FIN; } + static inline bool ran(const clos_t &c) { return c.state->type == nfa_state_t::RAN; } +}; + +typedef std::vector closure_t; +typedef closure_t::iterator clositer_t; +typedef closure_t::const_iterator cclositer_t; +typedef closure_t::reverse_iterator rclositer_t; +typedef closure_t::const_reverse_iterator rcclositer_t; + +struct newver_t +{ + size_t tag; + tagver_t base; + hidx_t history; +}; + +struct newver_cmp_t +{ + tagtree_t &history; + bool operator()(const newver_t &x, const newver_t &y) const + { + if (x.tag < y.tag) return true; + if (x.tag > y.tag) return false; + + if (x.base < y.base) return true; + if (x.base > y.base) return false; + + return history.compare_plain(x.history, y.history, x.tag) < 0; + } +}; + +typedef std::map newvers_t; + +tcmd_t *closure(dfa_t &dfa, closure_t &clos1, closure_t &clos2, + Tagpool &tagpool, newvers_t &newvers, closure_t *shadow); + +} // namespace re2c + +#endif // _RE2C_DFA_CLOSURE_ diff --git a/src/dfa/dead_rules.cc b/src/dfa/dead_rules.cc new file mode 100644 index 0000000..296b1f6 --- /dev/null +++ b/src/dfa/dead_rules.cc @@ -0,0 +1,252 @@ +#include +#include +#include +#include +#include + +#include "src/conf/warn.h" +#include "src/dfa/dfa.h" +#include "src/re/rule.h" +#include "src/util/forbid_copy.h" + +namespace re2c +{ + +struct tcmd_t; + +/* note [unreachable rules] + * + * DFA may contain useless final states. Such states may + * appear as a result of: + * - (part of) one rule being shadowed by another rule, + * e.g. rule [ab] partially shadows [ac] and completely + * shadows [a] + * + * - infinite rules that greedily eat all input characters + * and never stop (they either fail on YYFILL or crash), + * e.g. [^]* + * + * - rules that contain never-matching link, e.g. '[]' + * with option '--empty-class match-none' + * + * Useless final states should be eliminated so that they + * don't interfere with further analyses and optimizations. + * If all final states of a rule are useless, then the whole + * rule is unreachable and should be reported. + * + * In order to find out if a given final state is useless, + * we have to find out if all outgoing paths from this state + * match longer rules (otherwise, some paths go to default + * state and fallback to this state). We do this by finding + * all states that have transitions to default state and back + * propagation of "none-rule" from these states. As the back + * propagation meets the first final state on its way, it + * substitutes "none-rule" with the corresponding rule, + * which is further propagated back to the start state of DFA. + */ + +// reversed DFA +struct rdfa_t +{ + struct arc_t + { + size_t dest; + arc_t *next; + }; + + struct state_t + { + arc_t *arcs; + size_t rule; + bool fallthru; + }; + + size_t nstates; + size_t nrules; + state_t *states; + arc_t *arcs; + + explicit rdfa_t(const dfa_t &dfa) + : nstates(dfa.states.size()) + , nrules(dfa.rules.size()) + , states(new state_t[nstates]()) + , arcs(new arc_t[nstates * dfa.nchars]) + { + // init states + for (size_t i = 0; i < nstates; ++i) { + state_t &s = states[i]; + s.arcs = NULL; + const size_t r = dfa.states[i]->rule; + s.rule = r == Rule::NONE ? nrules : r; + s.fallthru = false; + } + // init arcs + arc_t *a = arcs; + for (size_t i = 0; i < nstates; ++i) { + dfa_state_t *s = dfa.states[i]; + for (size_t c = 0; c < dfa.nchars; ++c) { + const size_t j = s->arcs[c]; + if (j != dfa_t::NIL) { + a->dest = i; + a->next = states[j].arcs; + states[j].arcs = a++; + } else { + states[i].fallthru = true; + } + } + } + } + + ~rdfa_t() + { + delete[] states; + delete[] arcs; + } + + FORBID_COPY(rdfa_t); +}; + +static void backprop(const rdfa_t &rdfa, bool *live, + size_t rule, size_t state) +{ + // "none-rule" is unreachable from final states: + // be careful to mask it before propagating + const rdfa_t::state_t &s = rdfa.states[state]; + if (rule == rdfa.nrules) { + rule = s.rule; + } + + // if the rule has already been set, than either it's a loop + // or another branch of back propagation has already been here, + // in both cases we should stop: there's nothing new to propagate + bool &l = live[rule * rdfa.nstates + state]; + if (l) return; + l = true; + + for (const rdfa_t::arc_t *a = s.arcs; a; a = a->next) { + backprop(rdfa, live, rule, a->dest); + } +} + +static void liveness_analyses(const rdfa_t &rdfa, bool *live) +{ + for (size_t i = 0; i < rdfa.nstates; ++i) { + const rdfa_t::state_t &s = rdfa.states[i]; + if (s.fallthru) { + backprop(rdfa, live, s.rule, i); + } + } +} + +static void warn_dead_rules(const dfa_t &dfa, size_t defrule, + const std::string &cond, const bool *live, Warn &warn) +{ + const size_t nstates = dfa.states.size(); + const size_t nrules = dfa.rules.size(); + + for (size_t i = 0; i < nstates; ++i) { + const size_t r = dfa.states[i]->rule; + if (r != Rule::NONE && !live[r * nstates + i]) { + // skip last rule (it's the NONE-rule) + for (size_t j = 0; j < nrules; ++j) { + if (live[j * nstates + i]) { + dfa.rules[r].shadow.insert(dfa.rules[j].code->fline); + } + } + } + } + + for (size_t i = 0; i < nrules; ++i) { + // default rule '*' should not be reported + if (i != defrule && !live[i * nstates]) { + warn.unreachable_rule(cond, dfa.rules[i]); + } + } +} + +static void remove_dead_final_states(dfa_t &dfa, const bool *fallthru) +{ + const size_t + nstates = dfa.states.size(), + nsym = dfa.nchars; + + for (size_t i = 0; i < nstates; ++i) { + dfa_state_t *s = dfa.states[i]; + if (s->rule == Rule::NONE) continue; + + // final state is useful iff there is at least one + // non-accepting path from this state + bool shadowed = true; + for (size_t c = 0; c < nsym; ++c) { + const size_t j = s->arcs[c]; + if (j == dfa_t::NIL || fallthru[j]) { + shadowed = false; + break; + } + } + + if (shadowed) { + s->rule = Rule::NONE; + s->tcmd[nsym] = NULL; + } + } +} + +/* note [fallback states] + * + * Find states that are accepting, but may be shadowed + * by other accepting states: when the short rule matches, + * lexer must try to match longer rules; if this attempt is + * unsuccessful it must fallback to the short match. + * + * In order to find fallback states we need to know if + * "none-rule" is reachable from the given state, the information + * we have after rule liveness analyses. Fallback states are + * needed at different points in time (both before and after + * certain transformations on DFA). Fortunately, fallback states + * are not affected by these transformations, so we can calculate + * them here and save for future use. + */ +static void find_fallback_states(dfa_t &dfa, const bool *fallthru) +{ + const size_t + nstate = dfa.states.size(), + nsym = dfa.nchars; + + for (size_t i = 0; i < nstate; ++i) { + dfa_state_t *s = dfa.states[i]; + + s->fallthru = fallthru[i]; + + if (s->rule != Rule::NONE) { + for (size_t c = 0; c < nsym; ++c) { + const size_t j = s->arcs[c]; + if (j != dfa_t::NIL && fallthru[j]) { + s->fallback = true; + break; + } + } + } + } +} + +void cutoff_dead_rules(dfa_t &dfa, size_t defrule, const std::string &cond, Warn &warn) +{ + const rdfa_t rdfa(dfa); + const size_t + ns = rdfa.nstates, + nl = (rdfa.nrules + 1) * ns; + bool *live = new bool[nl], + *fallthru = live + nl - ns; + memset(live, 0, nl * sizeof(bool)); + + liveness_analyses(rdfa, live); + warn_dead_rules(dfa, defrule, cond, live, warn); + remove_dead_final_states(dfa, fallthru); + find_fallback_states(dfa, fallthru); + + delete[] live; +} + +} // namespace re2c + diff --git a/src/dfa/determinization.cc b/src/dfa/determinization.cc new file mode 100644 index 0000000..f2f8347 --- /dev/null +++ b/src/dfa/determinization.cc @@ -0,0 +1,194 @@ +#include +#include "src/util/c99_stdint.h" +#include +#include +#include +#include +#include +#include +#include + +#include "src/conf/opt.h" +#include "src/conf/warn.h" +#include "src/dfa/closure.h" +#include "src/dfa/dfa.h" +#include "src/dfa/dump.h" +#include "src/dfa/find_state.h" +#include "src/dfa/tagpool.h" +#include "src/dfa/tagtree.h" +#include "src/dfa/tcmd.h" +#include "src/nfa/nfa.h" +#include "src/re/rule.h" +#include "src/re/tag.h" +#include "src/util/range.h" + +namespace re2c +{ + +static nfa_state_t *transition(nfa_state_t *state, uint32_t symbol); +static void reach(const kernel_t *kernel, closure_t &clos, uint32_t symbol); +static void warn_nondeterministic_tags(const kernels_t &kernels, + const Tagpool &tagpool, const std::vector &tags, + const std::valarray &rules, const std::string &cond, Warn &warn); + +const size_t dfa_t::NIL = std::numeric_limits::max(); + +nfa_state_t *transition(nfa_state_t *state, uint32_t symbol) +{ + if (state->type != nfa_state_t::RAN) { + return NULL; + } + for (const Range *r = state->ran.ran; r; r = r->next()) { + if ((r->lower() <= symbol) && (symbol < r->upper())) { + return state->ran.out; + } + } + return NULL; +} + +void reach(const kernel_t *kernel, closure_t &clos, uint32_t symbol) +{ + clos.clear(); + for (size_t i = 0; i < kernel->size; ++i) { + nfa_state_t *s1 = kernel->state[i], + *s2 = transition(s1, symbol); + if (s2) { + clos_t c = {s1, s2, kernel->order[i], kernel->tvers[i], + kernel->tlook[i], HROOT}; + clos.push_back(c); + } + } +} + +dfa_t::dfa_t(const nfa_t &nfa, const opt_t *opts, + const std::string &cond, Warn &warn) + : states() + , nchars(nfa.charset.size() - 1) // (n + 1) bounds for n ranges + , charset(nfa.charset) + , rules(nfa.rules) + , tags(nfa.tags) + , mtagvers(*new std::set) + , finvers(NULL) + , tcpool(*new tcpool_t) + , maxtagver(0) + , tcmd0(NULL) + , tcid0(TCID0) +{ + const size_t ntag = tags.size(); + Tagpool tagpool(opts, ntag); + kernels_t kernels(tagpool, tcpool, tags); + closure_t clos1, clos2; + newver_cmp_t newvers_cmp = {tagpool.history}; + newvers_t newvers(newvers_cmp); + tcmd_t *acts; + dump_dfa_t dump(*this, tagpool, nfa); + + // all-zero tag configuration must have static number zero + assert(ZERO_TAGS == tagpool.insert_const(TAGVER_ZERO)); + // initial tag versions: [1 .. N] + const size_t INITIAL_TAGS = tagpool.insert_succ(1); + // other versions: [ .. -(N + 1)] and [N + 1 .. ] + maxtagver = static_cast(ntag); + + // final/fallback versions will be assigned on the go + finvers = new tagver_t[ntag]; + for (size_t i = 0; i < ntag; ++i) { + finvers[i] = fixed(tags[i]) ? TAGVER_ZERO : ++maxtagver; + } + + // mark tags with history (initial and final) + for (size_t i = 0; i < ntag; ++i) { + if (history(tags[i])) { + tagver_t v = static_cast(i) + 1, f = finvers[i]; + if (f != TAGVER_ZERO) mtagvers.insert(f); + mtagvers.insert(v); + } + } + + // iterate while new kernels are added: for each alphabet symbol, + // build tagged epsilon-closure of all reachable NFA states, + // then find identical or mappable DFA state or add a new one + + clos_t c0 = {NULL, nfa.root, ZERO_TAGS, INITIAL_TAGS, HROOT, HROOT}; + clos1.push_back(c0); + acts = closure(*this, clos1, clos2, tagpool, newvers, dump.shadow); + find_state(*this, dfa_t::NIL, 0/* any */, kernels, clos2, acts, dump); + + for (size_t i = 0; i < kernels.size(); ++i) { + newvers.clear(); + for (size_t c = 0; c < nchars; ++c) { + reach(kernels[i], clos1, charset[c]); + acts = closure(*this, clos1, clos2, tagpool, newvers, dump.shadow); + find_state(*this, i, c, kernels, clos2, acts, dump); + } + } + + if (!opts->posix_captures) { + warn_nondeterministic_tags(kernels, tagpool, tags, rules, cond, warn); + } +} + +/* + * For each tag, find maximal number of parallel versions of this tag + * used in each kernel (degree of non-determinism) and warn about tags with + * maximum degree two or more. + * + * WARNING: this function assumes that kernel items are grouped by rule + */ +void warn_nondeterministic_tags(const kernels_t &kernels, + const Tagpool &tagpool, const std::vector &tags, + const std::valarray &rules, const std::string &cond, Warn &warn) +{ + const size_t + ntag = tagpool.ntags, + nkrn = kernels.size(); + std::vector maxv(ntag, 0); + std::set uniq; + + for (size_t i = 0; i < nkrn; ++i) { + const kernel_t *k = kernels[i]; + nfa_state_t **s = k->state; + const size_t n = k->size, *v = k->tvers; + + for (size_t u = 0; u < n;) { + const size_t r = s[u]->rule; + const Rule &rule = rules[r]; + + const size_t l = u; + for (; ++u < n && s[u]->rule == r;); + for (size_t t = rule.ltag; t < rule.htag; ++t) { + uniq.clear(); + for (size_t m = l; m < u; ++m) { + uniq.insert(tagpool[v[m]][t]); + } + maxv[t] = std::max(maxv[t], uniq.size()); + } + } + } + + const size_t nrule = rules.size(); + for (size_t r = 0; r < nrule; ++r) { + const Rule &rule = rules[r]; + for (size_t t = rule.ltag; t < rule.htag; ++t) { + const size_t m = maxv[t]; + if (m > 1) { + const uint32_t line = rule.code->fline; + warn.nondeterministic_tags(line, cond, tags[t].name, m); + } + } + } +} + +dfa_t::~dfa_t() +{ + std::vector::iterator + i = states.begin(), + e = states.end(); + for (; i != e; ++i) + { + delete *i; + } +} + +} // namespace re2c + diff --git a/src/dfa/dfa.h b/src/dfa/dfa.h new file mode 100644 index 0000000..2135623 --- /dev/null +++ b/src/dfa/dfa.h @@ -0,0 +1,86 @@ +#ifndef _RE2C_DFA_DFA_ +#define _RE2C_DFA_DFA_ + +#include "src/util/c99_stdint.h" +#include +#include +#include + +#include "src/conf/warn.h" +#include "src/dfa/tcmd.h" +#include "src/re/rule.h" +#include "src/re/tag.h" +#include "src/util/forbid_copy.h" + +namespace re2c +{ + +struct nfa_t; +struct opt_t; +struct Tagpool; + +struct dfa_state_t +{ + size_t *arcs; + tcmd_t **tcmd; + tcid_t *tcid; + size_t rule; + bool fallthru; + bool fallback; + + explicit dfa_state_t(size_t nchars) + : arcs(new size_t[nchars]) + , tcmd(new tcmd_t*[nchars + 2]()) // +2 for final and fallback epsilon-transitions + , tcid(NULL) + , rule(Rule::NONE) + , fallthru(false) + , fallback(false) + {} + ~dfa_state_t() + { + delete[] arcs; + delete[] tcmd; + delete[] tcid; + } + FORBID_COPY(dfa_state_t); +}; + +struct dfa_t +{ + static const size_t NIL; + + std::vector states; + const size_t nchars; + std::vector &charset; + std::valarray &rules; + std::vector &tags; + std::set &mtagvers; + tagver_t *finvers; + tcpool_t &tcpool; + tagver_t maxtagver; + tcmd_t *tcmd0; + tcid_t tcid0; + + dfa_t(const nfa_t &nfa, const opt_t *opts, + const std::string &cond, Warn &warn); + ~dfa_t(); + + FORBID_COPY(dfa_t); +}; + +enum dfa_minimization_t +{ + DFA_MINIMIZATION_TABLE, + DFA_MINIMIZATION_MOORE +}; + +void minimization(dfa_t &dfa, dfa_minimization_t type); +void fillpoints(const dfa_t &dfa, std::vector &fill); +void cutoff_dead_rules(dfa_t &dfa, size_t defrule, const std::string &cond, Warn &warn); +void insert_fallback_tags(dfa_t &dfa); +void compact_and_optimize_tags(dfa_t &dfa, bool optimize); +void freeze_tags(dfa_t &dfa); + +} // namespace re2c + +#endif // _RE2C_DFA_DFA_ diff --git a/src/dfa/dump.cc b/src/dfa/dump.cc new file mode 100644 index 0000000..7f8d505 --- /dev/null +++ b/src/dfa/dump.cc @@ -0,0 +1,328 @@ +#include +#include +#include +#include +#include + +#include "src/conf/opt.h" +#include "src/dfa/dfa.h" +#include "src/dfa/dump.h" +#include "src/dfa/tagpool.h" +#include "src/dfa/tagtree.h" +#include "src/dfa/tcmd.h" +#include "src/nfa/nfa.h" +#include "src/re/rule.h" +#include "src/re/tag.h" + +namespace re2c +{ + +static void dump_tcmd_or_tcid(tcmd_t *const *tcmd, const tcid_t *tcid, size_t sym, const tcpool_t &tcpool); +static const char *tagname(const Tag &t); +static void dump_tags(const Tagpool &tagpool, hidx_t ttran, size_t tvers); + +dump_dfa_t::dump_dfa_t(const dfa_t &d, const Tagpool &pool, const nfa_t &n) + : debug(pool.opts->dump_dfa_raw) + , dfa(d) + , tagpool(pool) + , uniqidx(0) + , base(n.states) + , shadow(NULL) +{ + if (!debug) return; + + shadow = new closure_t; + fprintf(stderr, "digraph DFA {\n" + " rankdir=LR\n" + " node[shape=plaintext fontname=fixed]\n" + " edge[arrowhead=vee fontname=fixed]\n\n"); +} + +dump_dfa_t::~dump_dfa_t() +{ + if (!debug) return; + + delete shadow; + fprintf(stderr, "}\n"); +} + +uint32_t dump_dfa_t::index(const nfa_state_t *s) const +{ + return static_cast(s - base); +} + +static void dump_history(const dfa_t &dfa, const tagtree_t &h, hidx_t i) +{ + if (i == HROOT) { + fprintf(stderr, " /"); + return; + } + + dump_history(dfa, h, h.pred(i)); + + const Tag &t = dfa.tags[h.tag(i)]; + const tagver_t v = h.elem(i); + if (capture(t)) { + fprintf(stderr, "%u", (uint32_t)t.ncap); + } else if (!trailing(t)) { + fprintf(stderr, "%s", t.name->c_str()); + } + fprintf(stderr, v == TAGVER_BOTTOM ? "↓" : "↑"); + fprintf(stderr, " "); +} + +void dump_dfa_t::closure_tags(cclositer_t c) +{ + if (!debug) return; + if (c->tvers == ZERO_TAGS) return; + + const hidx_t l = c->tlook; + const tagver_t *vers = tagpool[c->tvers]; +// const tagver_t *ords = tagpool[c->order]; + const size_t ntag = tagpool.ntags; + + for (size_t t = 0; t < ntag; ++t) { + fprintf(stderr, " %s%d", tagname(dfa.tags[t]), abs(vers[t])); +// if (tagpool.opts->posix_captures) { +// fprintf(stderr, "[%d]", ords[t]); +// } + } + + if (l != HROOT) { + dump_history(dfa, tagpool.history, l); + } +} + +void dump_dfa_t::closure(const closure_t &clos, uint32_t state, bool isnew) +{ + if (!debug) return; + + cclositer_t c1 = clos.begin(), c2 = clos.end(), c, + s1 = shadow->begin(), s2 = shadow->end(), s; + const char + *style = isnew ? "" : " STYLE=\"dotted\"", + *color = " COLOR=\"lightgray\""; + + fprintf(stderr, " %s%u [label=<", isnew ? "" : "i", state); + + for (s = s1; s != s2; ++s) { + fprintf(stderr, ""); + } + if (!shadow->empty()) { + fprintf(stderr, ""); + } + for (c = c1; c != c2; ++c) { + fprintf(stderr, ""); + } + fprintf(stderr, "
    %u", + index(s->state), (int)(s - s1), color, style, color, index(s->state)); + closure_tags(s); + fprintf(stderr, "
    %u", + index(c->state), style, index(c->state)); + closure_tags(c); + fprintf(stderr, "
    >]\n"); +} + +void dump_dfa_t::state0(const closure_t &clos) +{ + if (!debug) return; + + closure(clos, 0, true); + fprintf(stderr, " void [shape=point]\n"); + for (cclositer_t c = shadow->begin(); c != shadow->end(); ++c) { + fprintf(stderr, " void -> 0:_%u_%d:w [style=dotted color=lightgray fontcolor=lightgray label=\"", + index(c->state), (int)(c - shadow->begin())); + dump_tags(tagpool, c->ttran, c->tvers); + fprintf(stderr, "\"]\n"); + } + for (cclositer_t c = clos.begin(); c != clos.end(); ++c) { + fprintf(stderr, " void -> 0:%u:w [style=dotted label=\"", index(c->state)); + dump_tags(tagpool, c->ttran, c->tvers); + fprintf(stderr, "\"]\n"); + } +} + +void dump_dfa_t::state(const closure_t &clos, size_t state, size_t symbol, bool isnew) +{ + if (!debug) return; + + const dfa_state_t *s = dfa.states[state]; + const size_t state2 = s->arcs[symbol]; + + if (state2 == dfa_t::NIL) return; + + const tcmd_t *cmd = s->tcmd[symbol]; + const uint32_t + a = static_cast(symbol), + x = static_cast(state), + y = static_cast(state2), + z = isnew ? y : ++uniqidx; + const char *prefix = isnew ? "" : "i"; + + closure(clos, z, isnew); + if (!isnew) { + fprintf(stderr, " i%u [style=dotted]\n" + " i%u:s -> %u:s [style=dotted label=\"", z, z, y); + dump_tcmd(cmd); + fprintf(stderr, "\"]\n"); + } + for (cclositer_t b = shadow->begin(), c = b; c != shadow->end(); ++c) { + fprintf(stderr, " %u:%u:e -> %s%u:_%u_%d:w [color=lightgray fontcolor=lightgray label=\"%u", + x, index(c->origin), prefix, z, index(c->state), (int)(c - b), a); + dump_tags(tagpool, c->ttran, c->tvers); + fprintf(stderr, "\"]\n"); + } + for (cclositer_t c = clos.begin(); c != clos.end(); ++c) { + fprintf(stderr, " %u:%u:e -> %s%u:%u:w [label=\"%u", + x, index(c->origin), prefix, z, index(c->state), a); + dump_tags(tagpool, c->ttran, c->tvers); + fprintf(stderr, "\"]\n"); + } +} + +void dump_dfa_t::final(size_t state, const nfa_state_t *port) +{ + if (!debug) return; + + const dfa_state_t *s = dfa.states[state]; + const Rule &r = dfa.rules[s->rule]; + const tcmd_t *cmd = s->tcmd[dfa.nchars]; + const uint32_t x = static_cast(state); + + fprintf(stderr, " r%u [shape=none label=\"(", x); + for (size_t t = r.ltag; t < r.htag; ++t) { + if (t > r.ltag) fprintf(stderr, " "); + fprintf(stderr, "%s%d", tagname(dfa.tags[t]), abs(dfa.finvers[t])); + } + fprintf(stderr, ")\"]\n"); + + fprintf(stderr, " %u:%u:e -> r%u [style=dotted label=\"", x, index(port), x); + dump_tcmd(cmd); + fprintf(stderr, "\"]\n"); +} + +void dump_dfa(const dfa_t &dfa) +{ + const size_t + nstate = dfa.states.size(), + nsym = dfa.nchars; + + fprintf(stderr, + "digraph DFA {\n" + " rankdir=LR\n" + " node[shape=Mrecord fontname=fixed]\n" + " edge[arrowhead=vee fontname=fixed]\n\n"); + + // initializer + fprintf(stderr, + " n [shape=point]" + " n -> n0 [style=dotted label=\""); + dump_tcmd_or_tcid(dfa.tcmd0 ? &dfa.tcmd0 : NULL, &dfa.tcid0, 0, dfa.tcpool); + fprintf(stderr, "\"]\n"); + + for (uint32_t i = 0; i < nstate; ++i) { + const dfa_state_t *s = dfa.states[i]; + + // state + fprintf(stderr, " n%u [height=0.2 width=0.2 label=\"%u\"]\n", i, i); + + // finalizer + if (s->rule != Rule::NONE) { + const Rule &r = dfa.rules[s->rule]; + + fprintf(stderr, + "subgraph { rank=same" + " n%u [style=filled fillcolor=lightgray]" + " dr%u [shape=none label=\"", + i, i); + dump_tcmd_or_tcid(s->tcmd, s->tcid, nsym, dfa.tcpool); + + fprintf(stderr, "("); + for (size_t t = r.ltag; t < r.htag; ++t) { + if (t > r.ltag) fprintf(stderr, " "); + fprintf(stderr, "%d", dfa.finvers[t]); + } + fprintf(stderr, ")"); + + fprintf(stderr, "\"]" + " n%u:s -> dr%u:n [style=dotted minlen=0]}\n", + i, i); + } + + // transitions + for (uint32_t c = 0; c < nsym; ++c) { + const size_t j = s->arcs[c]; + if (j != dfa_t::NIL) { + fprintf(stderr, " n%u -> n%u [label=\"%u", + i, static_cast(j), c); + dump_tcmd_or_tcid(s->tcmd, s->tcid, c, dfa.tcpool); + fprintf(stderr, "\"]\n"); + } + } + } + + fprintf(stderr, "}\n"); +} + +void dump_tcmd_or_tcid(tcmd_t *const *tcmd, const tcid_t *tcid, + size_t sym, const tcpool_t &tcpool) +{ + const tcmd_t *cmd = tcmd ? tcmd[sym] : tcpool[tcid[sym]]; + dump_tcmd(cmd); +} + +void dump_tcmd(const tcmd_t *p) +{ + if (!p) return; + + fprintf(stderr, "/"); + for (; p; p = p->next) { + const tagver_t l = p->lhs, r = p->rhs, *h = p->history; + if (tcmd_t::iscopy(p)) { + fprintf(stderr, "%d=%d ", l, r); + } else { + fprintf(stderr, "%d", l); + if (r != TAGVER_ZERO) { + fprintf(stderr, "=%d", r); + } + for (; *h != TAGVER_ZERO; ++h) { + fprintf(stderr, "%s", *h == TAGVER_BOTTOM ? "↓" : "↑"); + } + fprintf(stderr, " "); + } + } +} + +const char *tagname(const Tag &t) +{ + return t.name ? t.name->c_str() : ""; +} + +void dump_tags(const Tagpool &tagpool, hidx_t ttran, size_t tvers) +{ + if (ttran == HROOT) return; + + const tagver_t *vers = tagpool[tvers]; + const tagtree_t &h = tagpool.history; + + fprintf(stderr, "/"); + for (size_t i = 0; i < tagpool.ntags; ++i) { + if (h.last(ttran, i) == TAGVER_ZERO) continue; + + fprintf(stderr, "%d", abs(vers[i])); + for (hidx_t t = ttran; t != HROOT; t = h.pred(t)) { + if (h.tag(t) != i) continue; + if (h.elem(t) < TAGVER_ZERO) { + fprintf(stderr, "↓"); + } else if (t > TAGVER_ZERO) { + fprintf(stderr, "↑"); + } + } + fprintf(stderr, " "); + } +} + +} // namespace re2c diff --git a/src/dfa/dump.h b/src/dfa/dump.h new file mode 100644 index 0000000..c58e281 --- /dev/null +++ b/src/dfa/dump.h @@ -0,0 +1,45 @@ +#ifndef _RE2C_DFA_DUMP_ +#define _RE2C_DFA_DUMP_ + +#include +#include "src/util/c99_stdint.h" + +#include "src/dfa/closure.h" +#include "src/dfa/dfa.h" +#include "src/util/forbid_copy.h" + +namespace re2c +{ + +struct Tagpool; +struct dfa_t; +struct nfa_state_t; +struct nfa_t; +struct tcmd_t; + +struct dump_dfa_t +{ + const bool debug; + const dfa_t &dfa; + const Tagpool &tagpool; + uint32_t uniqidx; + const nfa_state_t *base; + closure_t *shadow; + + dump_dfa_t(const dfa_t &d, const Tagpool &pool, const nfa_t &n); + ~dump_dfa_t(); + void closure_tags(cclositer_t c); + void closure(const closure_t &clos, uint32_t state, bool isnew); + void state0(const closure_t &clos); + void state(const closure_t &clos, size_t state, size_t symbol, bool isnew); + void final(size_t state, const nfa_state_t *port); + uint32_t index(const nfa_state_t *s) const; + FORBID_COPY(dump_dfa_t); +}; + +void dump_dfa(const dfa_t &dfa); +void dump_tcmd(const tcmd_t *p); + +} // namespace re2c + +#endif // _RE2C_DFA_DUMP_ diff --git a/src/dfa/fallback_tags.cc b/src/dfa/fallback_tags.cc new file mode 100644 index 0000000..5eee256 --- /dev/null +++ b/src/dfa/fallback_tags.cc @@ -0,0 +1,132 @@ +#include +#include +#include + +#include "src/dfa/dfa.h" +#include "src/dfa/tcmd.h" +#include "src/re/tag.h" + +namespace re2c +{ + +static void find_overwritten_tags(const dfa_t &dfa, size_t state, bool *been, bool *owrt); + +/* note [fallback tags] + * + * We need to backup tags in fallback states, because they may be + * overwritten on some non-accepting path from fallback state. + * Two different things may cause overwrites: + * + * (1) self-overlapping rules: if DFA has tagged cycles, new iteration + * may overwrite tags from previous iteration and then fail + * + * (2) overlapping rules: intially all rules have different tags, but + * optiizations may merge them; then shorter rule's tags may be + * overwritten by an unsuccessful attempt to match longer rule + * + * In case (2) we can prevent merging by propagating tag liveness on + * all non-accepting paths from fallback state. + * + * Case (1) is not so easy: overwrites are already embedded in DFA. + * We have to create backup copies for all potentially overwritten + * tags. If tag is overwritten on just one path, it should be backed + * up on all non-accepting paths from fallback state (because paths + * may join later along the way and they need common tag version). + * However, redundant backups cause artificial interference, so we + * only create backup if the origin is overwritten on some path. + */ + +void find_overwritten_tags(const dfa_t &dfa, size_t state, + bool *been, bool *owrt) +{ + if (been[state]) return; + been[state] = true; + + const dfa_state_t *s = dfa.states[state]; + for (size_t c = 0; c < dfa.nchars; ++c) { + for (const tcmd_t *p = s->tcmd[c]; p; p = p->next) { + owrt[p->lhs] = true; + } + + size_t dest = s->arcs[c]; + if (dest != dfa_t::NIL && dfa.states[dest]->fallthru) { + find_overwritten_tags(dfa, dest, been, owrt); + } + } +} + +// overwritten tags need 'copy' on all outgoing non-accepting paths +// ('copy' commands must go first, before potential overwrites) +static void backup(dfa_t &dfa, dfa_state_t *s, tagver_t l, tagver_t r) +{ + for (size_t c = 0; c < dfa.nchars; ++c) { + size_t i = s->arcs[c]; + if (i != dfa_t::NIL && dfa.states[i]->fallthru) { + tcmd_t *&p = s->tcmd[c]; + p = dfa.tcpool.make_copy(p, l, r); + } + } +} + +// WARNING: this function assumes that falthrough and fallback +// attributes of DFA states have already been calculated, see +// note [fallback states] +void insert_fallback_tags(dfa_t &dfa) +{ + tcpool_t &pool = dfa.tcpool; + const size_t + nstates = dfa.states.size(), + nsym = dfa.nchars, + nver = static_cast(dfa.maxtagver) + 1; + bool *been = new bool[nstates]; + bool *owrt = new bool[nver]; + + for (size_t i = 0; i < nstates; ++i) { + dfa_state_t *s = dfa.states[i]; + if (!s->fallback) continue; + + std::fill(been, been + nstates, false); + std::fill(owrt, owrt + nver, false); + find_overwritten_tags(dfa, i, been, owrt); + + tcmd_t *p = s->tcmd[nsym], + *save = NULL, **ps = &save, + **pc = &s->tcmd[nsym + 1]; + for (; p; p = p->next) { + const tagver_t l = p->lhs, r = p->rhs, *h = p->history; + + // 'copy' commands + if (tcmd_t::iscopy(p)) { + if (!owrt[r]) { + *pc = pool.make_copy(NULL, l, r); + pc = &(*pc)->next; + } else { + backup(dfa, s, l, r); + } + + // 'save without history' commands + } else if (tcmd_t::isset(p)) { + *ps = pool.make_set(*ps, l, h[0]); + ps = &(*ps)->next; + + // 'save with history' commands + } else { + if (!owrt[r]) { + *ps = pool.copy_add(NULL, l, r, h); + } else { + *ps = pool.copy_add(NULL, l, l, h); + backup(dfa, s, l, r); + } + ps = &(*ps)->next; + } + } + + // join 'copy' (fallback) and 'save' commands + *pc = save; + } + + delete[] been; + delete[] owrt; +} + +} // namespace re2c diff --git a/src/ir/dfa/fillpoints.cc b/src/dfa/fillpoints.cc similarity index 87% rename from src/ir/dfa/fillpoints.cc rename to src/dfa/fillpoints.cc index f4488ea..1e2c844 100644 --- a/src/ir/dfa/fillpoints.cc +++ b/src/dfa/fillpoints.cc @@ -1,14 +1,15 @@ +#include #include #include #include -#include "src/ir/dfa/dfa.h" +#include "src/dfa/dfa.h" namespace re2c { -static const size_t INFINITY = std::numeric_limits::max(); -static const size_t UNDEFINED = INFINITY - 1; +static const size_t SCC_INF = std::numeric_limits::max(); +static const size_t SCC_UND = SCC_INF - 1; static bool loopback(size_t node, size_t narcs, const size_t *arcs) { @@ -37,13 +38,13 @@ static bool loopback(size_t node, size_t narcs, const size_t *arcs) * We use lowlink to hold different kinds of information: * - values in range [0 .. stack size] mean that this node is on stack * (link to a node with the smallest index reachable from this one) - * - UNDEFINED means that this node has not been visited yet - * - INFINITY means that this node has already been popped off stack + * - SCC_UND means that this node has not been visited yet + * - SCC_INF means that this node has already been popped off stack * * We use stack size (rather than topological sort index) as unique index * of a node on stack. This is safe because indices of nodes on stack are * still unique and less than indices of nodes that have been popped off - * stack (INFINITY). + * stack (SCC_INF). * */ static void scc( @@ -63,7 +64,7 @@ static void scc( const size_t j = arcs[c]; if (j != dfa_t::NIL) { - if (lowlink[j] == UNDEFINED) + if (lowlink[j] == SCC_UND) { scc(dfa, stack, lowlink, trivial, j); } @@ -87,7 +88,7 @@ static void scc( { j = stack.top(); stack.pop(); - lowlink[j] = INFINITY; + lowlink[j] = SCC_INF; } while (j != i); } @@ -99,7 +100,7 @@ static void calc_fill( std::vector &fill, size_t i) { - if (fill[i] == UNDEFINED) + if (fill[i] == SCC_UND) { fill[i] = 0; const size_t *arcs = dfa.states[i]->arcs; @@ -129,13 +130,13 @@ void fillpoints(const dfa_t &dfa, std::vector &fill) // find DFA states that belong to non-trivial SCC std::stack stack; - std::vector lowlink(size, UNDEFINED); + std::vector lowlink(size, SCC_UND); std::vector trivial(size, false); scc(dfa, stack, lowlink, trivial, 0); // for each DFA state, calculate YYFILL argument: // maximal path length to the next YYFILL state - fill.resize(size, UNDEFINED); + fill.resize(size, SCC_UND); calc_fill(dfa, trivial, fill, 0); // The following states must trigger YYFILL: diff --git a/src/dfa/find_state.cc b/src/dfa/find_state.cc new file mode 100644 index 0000000..fe044bc --- /dev/null +++ b/src/dfa/find_state.cc @@ -0,0 +1,418 @@ +#include +#include +#include +#include +#include + +#include "src/dfa/dfa.h" +#include "src/dfa/dump.h" +#include "src/dfa/find_state.h" +#include "src/dfa/tagpool.h" +#include "src/dfa/tcmd.h" +#include "src/nfa/nfa.h" +#include "src/re/rule.h" +#include "src/util/hash32.h" + +namespace re2c +{ + +kernel_t::kernel_t(size_t n) + : size(n) + , state(new nfa_state_t*[size]) + , tvers(new size_t[size]) + , tlook(new hidx_t[size]) + , order(new size_t[size]) +{} + +kernel_t *kernel_t::copy(const kernel_t &k) +{ + const size_t n = k.size; + kernel_t *kcopy = new kernel_t(n); + memcpy(kcopy->state, k.state, n * sizeof(void*)); + memcpy(kcopy->tvers, k.tvers, n * sizeof(size_t)); + memcpy(kcopy->tlook, k.tlook, n * sizeof(hidx_t)); + memcpy(kcopy->order, k.order, n * sizeof(size_t)); + return kcopy; +} + +kernel_t::~kernel_t() +{ + delete[] state; + delete[] tvers; + delete[] tlook; + delete[] order; +} + +static bool equal_lookahead_tags(const kernel_t *x, const kernel_t *y, + Tagpool &tagpool, const std::vector &tags) +{ + if (memcmp(x->tlook, y->tlook, x->size * sizeof(hidx_t)) == 0) { + return true; + } + tagtree_t &h = tagpool.history; + for (size_t i = 0; i < x->size; ++i) { + const hidx_t xl = x->tlook[i], yl = y->tlook[i]; + for (size_t t = 0; t < tagpool.ntags; ++t) { + if (history(tags[t])) { + // compare subhistories + if (h.compare_plain(xl, yl, t) != 0) return false; + } else { + // compare only the last tags + if (h.last(xl, t) != h.last(yl, t)) return false; + } + } + } + return true; +} + +struct kernel_eq_t +{ + Tagpool &tagpool; + const std::vector &tags; + bool operator()(const kernel_t *x, const kernel_t *y) const + { + return x->size == y->size + && memcmp(x->state, y->state, x->size * sizeof(void*)) == 0 + && memcmp(x->tvers, y->tvers, x->size * sizeof(size_t)) == 0 + && memcmp(x->order, y->order, x->size * sizeof(size_t)) == 0 + && equal_lookahead_tags(x, y, tagpool, tags); + } +}; + +/* note [mapping ignores items with lookahead tags] + * + * Consider two items X and Y being mapped. + * + * If tag T belongs to lookahead tags of item X, then all + * outgoing transitions from item X update T. Which means + * that it doesn't matter what particular version T has in X: + * whatever version it has, it will be overwritten by any + * outgoing transition. + * + * Note that lookahead tags are identical for both items + * X and Y, because we only try to map DFA states with + * identical lookahead tags. + */ + +/* note [save(X), copy(Y,X) optimization] + * + * save(X) command followed by a copy(Y,X) command can be optimized to + * save(Y). This helps reduce the number commands and versions (new version + * X is gone), but what is more important, it allows to put copy commands + * in front of save commands. This order is necessary when it comes to + * fallback commands. + * + * Note that in case of injective mapping there may be more than one copy + * command matching the same save command: save(X), copy(Y,X), copy(Z,X). + * In this case save command must be replicated for each copy command: + * save(Y), save(Z). + * + * For each save(X) command there must be at least one copy(Y,X) command + * (exactly one case of bijective mapping). This is because X version in + * save(X) command must be a new version which cannot occur in the older + * DFA state. Thus all save commands are transformed (maybe replicated) by + * copy commands, and some copy commands are erased by save commands. + * + * This optimization is applied after checking priority violation, so it + * cannot affect the check. +*/ + +bool kernels_t::operator()(const kernel_t *k1, const kernel_t *k2) +{ + // check that kernel sizes, NFA states and orders coincide + const bool compatible = k1->size == k2->size + && memcmp(k1->state, k2->state, k1->size * sizeof(void*)) == 0 + && memcmp(k1->order, k2->order, k1->size * sizeof(size_t)) == 0 + && equal_lookahead_tags(k1, k2, tagpool, tags); + if (!compatible) return false; + + // map tag versions of one kernel to that of another + // and check that lookahead versions (if any) coincide + const size_t ntag = tagpool.ntags; + std::fill(x2y - max, x2y + max, TAGVER_ZERO); + std::fill(y2x - max, y2x + max, TAGVER_ZERO); + for (size_t i = 0; i < k1->size; ++i) { + const tagver_t + *xv = tagpool[k1->tvers[i]], + *yv = tagpool[k2->tvers[i]]; + const hidx_t xl = k1->tlook[i]; + + for (size_t t = 0; t < ntag; ++t) { + // see note [mapping ignores items with lookahead tags] + if (tagpool.history.last(xl, t) != TAGVER_ZERO + && !history(tags[t])) continue; + + const tagver_t x = xv[t], y = yv[t]; + tagver_t &x0 = y2x[y], &y0 = x2y[x]; + + if (y0 == TAGVER_ZERO && x0 == TAGVER_ZERO) { + x0 = x; + y0 = y; + x2t[x] = t; + } else if (y != y0 || x != x0) { + return false; + } + } + } + + // we have bijective mapping; now try to create list of commands + tcmd_t *a, **pa, *copy = NULL; + + // backup 'save' commands: if topsort finds cycles, this mapping + // will be rejected and we'll have to revert all changes + size_t nact = 0; + for (a = *pacts; a; a = a->next) { + actnext[nact] = a; + actlhs[nact] = a->lhs; + ++nact; + } + + // fix LHS of 'save' commands to reuse old version + // see note [save(X), copy(Y,X) optimization] + for (a = *pacts; a; a = a->next) { + const tagver_t + y = a->lhs * (a->history[0] == TAGVER_BOTTOM ? -1 : 1), + x = y2x[y]; + a->lhs = abs(x); + y2x[y] = x2y[x] = TAGVER_ZERO; + } + + // create 'copy' commands + for (tagver_t x = -max; x < max; ++x) { + const tagver_t y = x2y[x], ax = abs(x), ay = abs(y); + if (y != TAGVER_ZERO && x != y && !fixed(tags[x2t[x]])) { + assert(ax != ay); + copy = tcpool.make_copy(copy, ax, ay); + } + } + + // join 'copy' and 'save' commands + for (pa = © (a = *pa); pa = &a->next); + *pa = *pacts; + *pacts = copy; + + // see note [topological ordering of copy commands] + const bool nontrivial_cycles = tcmd_t::topsort(pacts, indeg); + + // in case of cycles restore 'save' commands and fail + if (nontrivial_cycles) { + pa = pacts; + for (size_t i = 0; i < nact; ++i) { + *pa = a = actnext[i]; + a->lhs = actlhs[i]; + pa = &a->next; + } + *pa = NULL; + } + + return !nontrivial_cycles; +} + +kernels_t::kernels_t(Tagpool &tagp, tcpool_t &tcp, const std::vector &ts) + : lookup() + , tagpool(tagp) + , tcpool(tcp) + , tags(ts) + + , maxsize(0) // usually ranges from one to some twenty + , buffer(new kernel_t(maxsize)) + + , cap(0) + , max(0) + , mem(NULL) + , x2y(NULL) + , y2x(NULL) + , x2t(NULL) + , indeg(NULL) + + , pacts(NULL) + , actnext(NULL) + , actlhs(NULL) +{} + +kernels_t::~kernels_t() +{ + delete buffer; + delete[] mem; + + const size_t n = lookup.size(); + for (size_t i = 0; i < n; ++i) { + delete lookup[i]; + } +} + +void kernels_t::init(tagver_t v, size_t nkern) +{ + if (maxsize < nkern) { + maxsize = nkern * 2; // in advance + delete buffer; + buffer = new kernel_t(maxsize); + } + + // +1 to ensure max tag version is not forgotten in loops + max = v + 1; + if (cap < max) { + cap = max * 2; // in advance + + const size_t + n = static_cast(cap), + m = 2 * n + 1, + sz_x2y = 2 * m * sizeof(tagver_t), + sz_x2t = m * sizeof(size_t), + sz_actnext = n * sizeof(tcmd_t*), + sz_actlhs = n * sizeof(tagver_t), + sz_indeg = n * sizeof(uint32_t); + delete[] mem; + mem = new char[sz_x2y + sz_x2t + sz_actnext + sz_actlhs + sz_indeg]; + + // point to the center (zero index) of each buffer + // indexes in range [-N .. N] must be valid, where N is capacity + x2y = reinterpret_cast(mem) + cap; + y2x = x2y + m; + x2t = reinterpret_cast(mem + sz_x2y) + cap; + actnext = reinterpret_cast(mem + sz_x2y + sz_x2t); + actlhs = reinterpret_cast(mem + sz_x2y + sz_x2t + sz_actnext); + indeg = reinterpret_cast(mem + sz_x2y + sz_x2t + sz_actnext + sz_actlhs); + } +} + +size_t kernels_t::size() const +{ + return lookup.size(); +} + +const kernel_t *kernels_t::operator[](size_t idx) const +{ + return lookup[idx]; +} + +/* note [bijective mappings] + * + * Suppose we have just constructed a new DFA state Y and want to map it + * to an existing DFA state X. States must have identical sets of NFA + * substates and identical sets of lookahead tags for each substate. + * Furtermore, there must be bijective mapping between versions of X and Y + * and this mapping must preserve version order (respect priorities). + * + * Bijective mappings have a nice property: there is only one possible state + * X to which Y can be mapped. Indeed, if there was another state Z that + * can be bijectively mapped to Y preserving priorities, then Z itself can + * be mapped to X: both (1) and (2) are symmetrical in case of bijection + * and the relation is transitive. So the existence of Z is a contradiction. + * + * In principle, non-bijective mappings are also possible if the new state + * is less versatile than the old one (surjection from X to Y). However, + * non-bijective mappings lack the 'unique counterpart' property and need + * more complex analysis (and are not so useful after all), so we drop them. + */ + +kernels_t::result_t kernels_t::insert(const closure_t &clos, + tcmd_t *acts, tagver_t maxver) +{ + const size_t nkern = clos.size(); + size_t x = dfa_t::NIL; + + // empty closure corresponds to default state + if (nkern == 0) return result_t(x, NULL, false); + + // resize buffer if closure is too large + init(maxver, nkern); + + // copy closure to buffer kernel and find its normal form + buffer->size = nkern; + for (size_t i = 0; i < nkern; ++i) { + const clos_t &c = clos[i]; + buffer->state[i] = c.state; + buffer->tvers[i] = c.tvers; + buffer->tlook[i] = c.tlook; + buffer->order[i] = c.order; + } + + // get kernel hash + uint32_t hash = static_cast(nkern); // seed + hash = hash32(hash, buffer->state, nkern * sizeof(void*)); + hash = hash32(hash, buffer->order, nkern * sizeof(size_t)); + + // try to find identical kernel + kernel_eq_t eq = {tagpool, tags}; + x = lookup.find_with(hash, buffer, eq); + if (x != index_t::NIL) return result_t(x, acts, false); + + // else try to find mappable kernel + // see note [bijective mappings] + this->pacts = &acts; + x = lookup.find_with(hash, buffer, *this); + if (x != index_t::NIL) return result_t(x, acts, false); + + // otherwise add new kernel + x = lookup.push(hash, kernel_t::copy(*buffer)); + return result_t(x, acts, true); +} + +static tcmd_t *finalizer(const clos_t &clos, size_t ridx, + dfa_t &dfa, const Tagpool &tagpool, const std::vector &tags) +{ + tcpool_t &tcpool = dfa.tcpool; + const Rule &rule = dfa.rules[ridx]; + const tagver_t *vers = tagpool[clos.tvers]; + const tagtree_t &hist = tagpool.history; + const hidx_t look = clos.tlook; + tcmd_t *copy = NULL, *save = NULL, **p; + + for (size_t t = rule.ltag; t < rule.htag; ++t) { + const Tag &tag = tags[t]; + if (fixed(tag)) continue; + + const tagver_t v = abs(vers[t]), l = hist.last(look, t); + tagver_t &f = dfa.finvers[t]; + if (l == TAGVER_ZERO) { + copy = tcpool.make_copy(copy, f, v); + } else if (history(tag)) { + save = tcpool.make_add(save, f, v, hist, look, t); + } else { + save = tcpool.make_set(save, f, l); + } + } + + // join 'copy' and 'save' commands + for (p = © *p; p = &(*p)->next); + *p = save; + + return copy; +} + +void find_state(dfa_t &dfa, size_t state, size_t symbol, kernels_t &kernels, + const closure_t &closure, tcmd_t *acts, dump_dfa_t &dump) +{ + const kernels_t::result_t + result = kernels.insert(closure, acts, dfa.maxtagver); + + if (result.isnew) { + // create new DFA state + dfa_state_t *t = new dfa_state_t(dfa.nchars); + dfa.states.push_back(t); + + // check if the new state is final + // see note [at most one final item per closure] + cclositer_t c1 = closure.begin(), c2 = closure.end(), + c = std::find_if(c1, c2, clos_t::fin); + if (c != c2) { + t->rule = c->state->rule; + t->tcmd[dfa.nchars] = finalizer(*c, t->rule, dfa, + kernels.tagpool, kernels.tags); + dump.final(result.state, c->state); + } + } + + if (state == dfa_t::NIL) { // initial state + dfa.tcmd0 = result.cmd; + dump.state0(closure); + } else { + dfa_state_t *s = dfa.states[state]; + s->arcs[symbol] = result.state; + s->tcmd[symbol] = result.cmd; + dump.state(closure, state, symbol, result.isnew); + } +} + +} // namespace re2c diff --git a/src/dfa/find_state.h b/src/dfa/find_state.h new file mode 100644 index 0000000..0f08412 --- /dev/null +++ b/src/dfa/find_state.h @@ -0,0 +1,95 @@ +#ifndef _RE2C_DFA_FIND_STATE_ +#define _RE2C_DFA_FIND_STATE_ + +#include +#include "src/util/c99_stdint.h" +#include + +#include "src/dfa/closure.h" +#include "src/dfa/dump.h" +#include "src/dfa/tagtree.h" +#include "src/re/tag.h" +#include "src/util/forbid_copy.h" +#include "src/util/lookup.h" + +namespace re2c +{ + +class tcpool_t; +struct Tagpool; +struct dfa_t; +struct dump_dfa_t; +struct nfa_state_t; +struct tcmd_t; + +struct kernel_t +{ + size_t size; + nfa_state_t **state; + size_t *tvers; // tag versions + hidx_t *tlook; // lookahead tags + size_t *order; // see note [orbit order of closure items] + + explicit kernel_t(size_t n); + ~kernel_t(); + static kernel_t *copy(const kernel_t &k); + FORBID_COPY(kernel_t); +}; + +struct kernels_t +{ + struct result_t + { + size_t state; + tcmd_t *cmd; + bool isnew; + + result_t(size_t s, tcmd_t *p, bool n) + : state(s) + , cmd(p) + , isnew(n) + {} + }; + +private: + typedef lookup_t index_t; + index_t lookup; + +public: + Tagpool &tagpool; + tcpool_t &tcpool; + const std::vector &tags; + +private: + size_t maxsize; + kernel_t *buffer; + + tagver_t cap; // capacity (greater or equal to max) + tagver_t max; // maximal tag version + char *mem; + tagver_t *x2y; + tagver_t *y2x; + size_t *x2t; + uint32_t *indeg; + + tcmd_t **pacts; + tcmd_t **actnext; + tagver_t *actlhs; + +public: + kernels_t(Tagpool &tagp, tcpool_t &tcp, const std::vector &ts); + ~kernels_t(); + void init(tagver_t v, size_t nkern); + size_t size() const; + const kernel_t* operator[](size_t idx) const; + result_t insert(const closure_t &clos, tcmd_t *acts, tagver_t maxver); + bool operator()(const kernel_t *k1, const kernel_t *k2); + FORBID_COPY(kernels_t); +}; + +void find_state(dfa_t &dfa, size_t state, size_t symbol, kernels_t &kernels, + const closure_t &closure, tcmd_t *acts, dump_dfa_t &dump); + +} // namespace re2c + +#endif // _RE2C_DFA_FIND_STATE_ diff --git a/src/ir/dfa/minimization.cc b/src/dfa/minimization.cc similarity index 68% rename from src/ir/dfa/minimization.cc rename to src/dfa/minimization.cc index 79c93e4..6404b45 100644 --- a/src/ir/dfa/minimization.cc +++ b/src/dfa/minimization.cc @@ -1,16 +1,14 @@ #include +#include #include #include -#include "src/conf/opt.h" -#include "src/ir/dfa/dfa.h" -#include "src/globals.h" +#include "src/dfa/dfa.h" +#include "src/dfa/tcmd.h" namespace re2c { -class RuleOp; - /* * note [DFA minimization: table filling algorithm] * @@ -19,7 +17,7 @@ class RuleOp; * The algorithm constructs (strictly lower triangular) boolean matrix * indexed by DFA states. Each matrix cell (S1,S2) indicates if states * S1 and S2 are distinguishable. Initialy states are distinguished - * according to their rule and context. One step of the algorithm + * according to their rule and tag set. One step of the algorithm * updates the matrix as follows: each pair of states S1 and S2 is * marked as distinguishable iff exist transitions from S1 and S2 on * the same symbol that go to distinguishable states. The algorithm @@ -39,14 +37,15 @@ static void minimization_table( tbl[i + 1] = tbl[i] + i; } + // see note [distinguish states by tags] for (size_t i = 0; i < count; ++i) { dfa_state_t *s1 = states[i]; for (size_t j = 0; j < i; ++j) { dfa_state_t *s2 = states[j]; - tbl[i][j] = s1->ctx != s2->ctx - || s1->rule != s2->rule; + tbl[i][j] = s1->rule != s2->rule + || s1->tcid[nchars] != s2->tcid[nchars]; } } @@ -67,10 +66,11 @@ static void minimization_table( { std::swap(oi, oj); } - if (oi != oj && - (oi == dfa_t::NIL || - oj == dfa_t::NIL || - tbl[oi][oj])) + if (states[i]->tcid[k] != states[j]->tcid[k] + || (oi != oj + && (oi == dfa_t::NIL + || oj == dfa_t::NIL + || tbl[oi][oj]))) { tbl[i][j] = true; loop = true; @@ -82,6 +82,19 @@ static void minimization_table( } } + // Equivalence relation defined by the matrix is transitive + // by construction. Thus we can simply find the first state + // which is not distinguishable from current and choose it as a + // representative: all other states with the same representative + // have to be equivalent to current state due to transitivity. + // + // The only requirement is to deterministically choose the + // representative: e.g. always choose the one with the lowest + // index. + // + // Note that transitivity is crucial: without it the problem + // would be equivalent to the clique cover problem. + for (size_t i = 0; i < count; ++i) { part[i] = i; @@ -104,7 +117,7 @@ static void minimization_table( * * The algorithm maintains partition of DFA states. * Initial partition is coarse: states are distinguished according - * to their rule and context. Partition is gradually refined: each + * to their rule and tag set. Partition is gradually refined: each * set of states is split into minimal number of subsets such that * for all states in a subset transitions on the same symbol go to * the same set of states. @@ -119,11 +132,12 @@ static void minimization_moore( size_t *next = new size_t[count]; - std::map, size_t> init; + // see note [distinguish states by tags] + std::map, size_t> init; for (size_t i = 0; i < count; ++i) { dfa_state_t *s = states[i]; - std::pair key(s->rule, s->ctx); + std::pair key(s->rule, s->tcid[nchars]); if (init.insert(std::make_pair(key, i)).second) { part[i] = i; @@ -172,8 +186,11 @@ static void minimization_moore( size_t k = diff[n]; if (memcmp(&out[j * nchars], &out[k * nchars], - nchars * sizeof(size_t)) == 0) - { + nchars * sizeof(size_t)) == 0 + && memcmp(states[j]->tcid, + states[k]->tcid, + nchars * sizeof(tcid_t)) == 0 + ) { part[j] = k; next[j] = next[k]; next[k] = j; @@ -196,20 +213,29 @@ static void minimization_moore( delete[] next; } -void minimization(dfa_t &dfa) +/* note [distinguish states by tags] + * + * Final states may have 'rule' tags: tags that must be set when lexer + * takes epsilon-transition to the binded action. Final states with + * the same rule but different sets on 'rule' tags cannot be merged. + * + * Compare the following two cases: + * "ac" | "bc" + * "ac" @p | "bc" + * Tail "c" can be deduplicated in the 1st case, but not in the 2nd. + */ + +void minimization(dfa_t &dfa, dfa_minimization_t type) { const size_t count = dfa.states.size(); size_t *part = new size_t[count]; - switch (opts->dfa_minimization) - { - case DFA_MINIMIZATION_TABLE: - minimization_table(part, dfa.states, dfa.nchars); - break; - case DFA_MINIMIZATION_MOORE: - minimization_moore(part, dfa.states, dfa.nchars); - break; + switch (type) { + case DFA_MINIMIZATION_TABLE: + minimization_table(part, dfa.states, dfa.nchars); break; + case DFA_MINIMIZATION_MOORE: + minimization_moore(part, dfa.states, dfa.nchars); break; } size_t *compact = new size_t[count]; diff --git a/src/dfa/tagpool.cc b/src/dfa/tagpool.cc new file mode 100644 index 0000000..b4fd90a --- /dev/null +++ b/src/dfa/tagpool.cc @@ -0,0 +1,83 @@ +#include "src/util/c99_stdint.h" +#include // malloc +#include // memcpy, memcmp +#include + +#include "src/dfa/tagpool.h" +#include "src/util/hash32.h" + +namespace re2c +{ + +struct eqtag_t +{ + size_t ntags; + + explicit eqtag_t(size_t n): ntags(n) {} + inline tagver_t operator()(const tagver_t *x, const tagver_t *y) const + { + return memcmp(x, y, ntags * sizeof(tagver_t)) == 0; + } +}; + +Tagpool::Tagpool(const opt_t *o, size_t n) + : lookup() + , opts(o) + , ntags(n) + , buffer(new tagver_t[n]) + , maxclos(0) + , orders(NULL) + , closes(NULL) + , history() + , astack() + , bstack() + , cstack() +{} + +Tagpool::~Tagpool() +{ + delete[] buffer; + const size_t n = lookup.size(); + for (size_t i = 0; i < n; ++i) { + free(const_cast(lookup[i])); + } + delete[] orders; + delete[] closes; +} + +size_t Tagpool::insert_const(tagver_t ver) +{ + std::fill(buffer, buffer + ntags, ver); + return insert(buffer); +} + +size_t Tagpool::insert_succ(tagver_t fst) +{ + for (size_t i = 0; i < ntags; ++i) { + buffer[i] = fst++; + } + return insert(buffer); +} + +size_t Tagpool::insert(const tagver_t *tags) +{ + const size_t size = ntags * sizeof(tagver_t); + const uint32_t hash = hash32(0, tags, size); + + eqtag_t eq(ntags); + const size_t idx = lookup.find_with(hash, tags, eq); + if (idx != taglookup_t::NIL) { + return idx; + } + + tagver_t *copy = static_cast(malloc(size)); + memcpy(copy, tags, size); + return lookup.push(hash, copy); +} + +const tagver_t *Tagpool::operator[](size_t idx) const +{ + return lookup[idx]; +} + +} // namespace re2c diff --git a/src/dfa/tagpool.h b/src/dfa/tagpool.h new file mode 100644 index 0000000..f06de0a --- /dev/null +++ b/src/dfa/tagpool.h @@ -0,0 +1,52 @@ +#ifndef _RE2C_DFA_TAGPOOL_ +#define _RE2C_DFA_TAGPOOL_ + +#include +#include + +#include "src/dfa/closure.h" +#include "src/dfa/tagtree.h" +#include "src/re/tag.h" +#include "src/util/forbid_copy.h" +#include "src/util/lookup.h" + +namespace re2c +{ + +struct nfa_state_t; +struct opt_t; + +static const size_t ZERO_TAGS = 0; + +struct Tagpool +{ +private: + typedef lookup_t taglookup_t; + taglookup_t lookup; + +public: + const opt_t *opts; + const size_t ntags; + tagver_t *buffer; + + size_t maxclos; + tagver_t *orders; + cclositer_t *closes; + + tagtree_t history; + std::stack astack; + std::stack bstack; + std::stack cstack; + + Tagpool(const opt_t *o, size_t n); + ~Tagpool(); + size_t insert_const(tagver_t ver); + size_t insert_succ(tagver_t fst); + size_t insert(const tagver_t *tags); + const tagver_t *operator[](size_t idx) const; + FORBID_COPY(Tagpool); +}; + +} // namespace re2c + +#endif // _RE2C_DFA_TAGPOOL_ diff --git a/src/dfa/tagtree.cc b/src/dfa/tagtree.cc new file mode 100644 index 0000000..a5966a1 --- /dev/null +++ b/src/dfa/tagtree.cc @@ -0,0 +1,159 @@ +#include +#include + +#include "src/dfa/tagtree.h" + +namespace re2c +{ + +static const tagver_t DELIM = TAGVER_CURSOR - 1; + +tagtree_t::tagtree_t(): nodes(), path1(), path2() {} + +tagver_t tagtree_t::elem(hidx_t i) const { return nodes[i].elem; } + +hidx_t tagtree_t::pred(hidx_t i) const { return nodes[i].pred; } + +size_t tagtree_t::tag(hidx_t i) const { return nodes[i].tag; } + +hidx_t tagtree_t::push(hidx_t i, size_t t, tagver_t v) +{ + node_t x = {i, v, t}; + nodes.push_back(x); + return static_cast(nodes.size() - 1); +} + +// cut out subhistory of this tag (just skip all other tags) +static void subhistory(const tagtree_t &history, + std::vector &path, hidx_t idx, size_t tag) +{ + path.clear(); + for (hidx_t i = idx; i != HROOT; i = history.pred(i)) { + if (history.tag(i) == tag) { + path.push_back(history.elem(i)); + } + } +} + +static int32_t compare_reversed( + const std::vector &h1, + const std::vector &h2) +{ + std::vector::const_reverse_iterator + i1 = h1.rbegin(), e1 = h1.rend(), + i2 = h2.rbegin(), e2 = h2.rend(); + + for (;;) { + if (i1 == e1 && i2 == e2) break; + if (i1 == e1) return -1; + if (i2 == e2) return 1; + if (*i1 > *i2) return -1; + if (*i1 < *i2) return 1; + ++i1; ++i2; + } + + return 0; +} + +int32_t tagtree_t::compare_plain(hidx_t x, hidx_t y, size_t t) +{ + subhistory(*this, path1, x, t); + subhistory(*this, path2, y, t); + return compare_reversed(path1, path2); +} + +static size_t boundary_tag(size_t tag) +{ + // for start tags, return itself; for end tags, return start tag + // (start tags have even numbers, end tags have odd numbers) + return tag & ~1u; +} + +// returns all subhistories of the given tag as one list (individual +// subhistories are separated by delimiter) +static int32_t subhistory_list(const tagtree_t &history, + std::vector &path, hidx_t idx, size_t tag) +{ + path.clear(); + int32_t nsub = 0; + hidx_t i = idx; + + const size_t bound = boundary_tag(tag); + path.push_back(DELIM); + for (;;) { + for (; i != HROOT && history.tag(i) >= bound; i = history.pred(i)) { + if (history.tag(i) == tag) { + path.push_back(history.elem(i)); + } + } + if (i == HROOT) break; + ++nsub; + path.push_back(DELIM); + for (; i != HROOT && history.tag(i) != tag; i = history.pred(i)); + } + + return nsub; +} + +// Lookahead may consist of multiple subhistories (each containing either +// a single bottom value, or one or more cursor values (exactly one for +// non-orbit subhistories). Because of the shortest-path algorithm earlier +// subhistories do not necessarily coincide, so comparing only the last +// pair of subhistories is not enough. See note [POSIX orbit tags]. +int32_t tagtree_t::compare_histories(hidx_t x, hidx_t y, + tagver_t ox, tagver_t oy, size_t t) +{ + const int32_t + n1 = subhistory_list(*this, path1, x, t), + n2 = subhistory_list(*this, path2, y, t); + + assert(n1 == n2); + path1.push_back(ox); + path2.push_back(oy); + + std::vector::const_reverse_iterator + i1 = path1.rbegin(), e1 = path1.rend(), + i2 = path2.rbegin(), e2 = path2.rend(); + for (;;) { + if (i1 == e1 && i2 == e2) return 0; + assert(i1 != e1 && i2 != e2); + const tagver_t v1 = *i1++, v2 = *i2++; + if (v1 == DELIM && v2 == DELIM) continue; + if (v1 == DELIM) return -1; + if (v2 == DELIM) return 1; + if (v1 > v2) return -1; + if (v1 < v2) return 1; + } +} + +static void last_subhistory(const tagtree_t &history, std::vector &path, + hidx_t idx, tagver_t order, size_t tag) +{ + path.clear(); + hidx_t i = idx; + const size_t bound = boundary_tag(tag); + for (; i != HROOT && history.tag(i) >= bound; i = history.pred(i)) { + if (history.tag(i) == tag) { + path.push_back(history.elem(i)); + } + } + if (i == HROOT) path.push_back(order); +} + +int32_t tagtree_t::compare_last_subhistories(hidx_t x, hidx_t y, + tagver_t ox, tagver_t oy, size_t t) +{ + last_subhistory(*this, path1, x, ox, t); + last_subhistory(*this, path2, y, oy, t); + return compare_reversed(path1, path2); +} + +tagver_t tagtree_t::last(hidx_t i, size_t t) const +{ + for (; i != HROOT; i = pred(i)) { + if (tag(i) == t) return elem(i); + } + return TAGVER_ZERO; +} + +} // namespace re2c diff --git a/src/dfa/tagtree.h b/src/dfa/tagtree.h new file mode 100644 index 0000000..7f3bf4b --- /dev/null +++ b/src/dfa/tagtree.h @@ -0,0 +1,48 @@ +#ifndef _RE2C_DFA_TAGTREE_ +#define _RE2C_DFA_TAGTREE_ + +#include +#include "src/util/c99_stdint.h" +#include +#include + +#include "src/re/tag.h" +#include "src/util/forbid_copy.h" + +namespace re2c +{ + +typedef uint32_t hidx_t; + +static const hidx_t HROOT = ~0u; + +struct tagtree_t +{ + // the whole tree of tags found by the epsilon-closure + // (a bunch of separate subtrees for each tag with common root) + struct node_t { + hidx_t pred; + tagver_t elem; + size_t tag; + }; + std::vector nodes; + + // reconstruct paths for comparison + std::vector path1; + std::vector path2; + + tagtree_t(); + hidx_t pred(hidx_t i) const; + tagver_t elem(hidx_t i) const; + size_t tag(hidx_t i) const; + hidx_t push(hidx_t i, size_t t, tagver_t v); + int32_t compare_plain(hidx_t x, hidx_t y, size_t t); + int32_t compare_histories(hidx_t x, hidx_t y, tagver_t ox, tagver_t oy, size_t t); + int32_t compare_last_subhistories(hidx_t x, hidx_t y, tagver_t ox, tagver_t oy, size_t t); + tagver_t last(hidx_t i, size_t t) const; + FORBID_COPY(tagtree_t); +}; + +} // namespace re2c + +#endif // _RE2C_DFA_TAGTREE_ diff --git a/src/dfa/tcmd.cc b/src/dfa/tcmd.cc new file mode 100644 index 0000000..a7ad22e --- /dev/null +++ b/src/dfa/tcmd.cc @@ -0,0 +1,229 @@ +#include +#include + +#include "src/dfa/tcmd.h" +#include "src/util/hash32.h" + +namespace re2c +{ + +static uint32_t hash_tcmd(const tcmd_t *tcmd); + +bool tcmd_t::equal(const tcmd_t &x, const tcmd_t &y) +{ + return x.lhs == y.lhs + && x.rhs == y.rhs + && equal_history(x.history, y.history); +} + +bool tcmd_t::equal_history(const tagver_t *h, const tagver_t *g) +{ + for (;;) { + if (*h != *g) return false; + if (*h == TAGVER_ZERO) return true; + ++h; ++g; + } +} + +/* note [topological ordering of copy commands] + * + * The order in which copy commands are executed is important: + * 'x = y; y = z;' is not the same as 'y = z; x = y;' (the latter + * overwrites 'y' before its precious value is copied to 'x'). + * + * To avoid overwrites, commands should be topologically sorted. + * The algorithm detects cycles and terminates; non-trivial cycles + * (induced by 2 or more nodes) are reported. We don't care about + * trivial cycles (loopbacks), because they can be implemented without + * temporary variable. Non-trivial cycles need a new temporary variable + * local to the given basic block, which makes liveness analysis more + * complex (so we simply forbid such mappings). + * + * For the purpose of topsort, we treat commands as arcs of directed + * acyclic graph: command 'x = y' yields arc X -> Y. Topsort works + * by iteratively removing arcs X -> Y such that X has zero in-degree + * (they correspond to commands with no dependencies). + * Commands in the order of removal are topologically sorted. + * + * The algorithm iterates graph and removes arcs with zero in-degree + * until either the graph is empty or all remaining arcs belong to + * cycles. + * + * The algorithm starts and ends with all-zero in-degree buffer. + */ + +bool tcmd_t::iscopy(const tcmd_t *x) +{ + return x->rhs != TAGVER_ZERO && x->history[0] == TAGVER_ZERO; +} + +bool tcmd_t::isset(const tcmd_t *x) +{ + if (x->rhs == TAGVER_ZERO) { + assert(x->history[0] != TAGVER_ZERO); + return true; + } + return false; +} + +bool tcmd_t::isadd(const tcmd_t *x) +{ + return x->rhs != TAGVER_ZERO && x->history[0] != TAGVER_ZERO; +} + +bool tcmd_t::topsort(tcmd_t **phead, uint32_t *indeg) +{ + tcmd_t *x0 = *phead, *x, *y0 = NULL, **py; + bool nontrivial_cycles = false; + + // initialize in-degree + for (x = x0; x; x = x->next) { + indeg[x->lhs] = indeg[x->rhs] = 0; + } + for (x = x0; x; x = x->next) { + ++indeg[x->rhs]; + } + + for (py = &y0;;) { + // reached end of list + if (!x0) break; + + tcmd_t **px = &x0, **py1 = py; + for (x = x0; x; x = x->next) { + if (indeg[x->lhs] == 0) { + --indeg[x->rhs]; + *py = x; + py = &x->next; + } else { + *px = x; + px = &x->next; + } + } + *px = NULL; + + // only cycles left + if (py == py1) { + // look for cycles of length 2 or more + for (x = x0; x && x->lhs == x->rhs; x = x->next); + nontrivial_cycles = x != NULL; + break; + } + } + *py = x0; + + *phead = y0; + return nontrivial_cycles; +} + +tcpool_t::tcpool_t() + : alc() + , index() +{ + // empty command must have static number zero + assert(TCID0 == insert(NULL)); +} + +tcmd_t *tcpool_t::make_copy(tcmd_t *next, tagver_t lhs, tagver_t rhs) +{ + tcmd_t *p = alc.alloct(1); + p->next = next; + p->lhs = lhs; + p->rhs = rhs; + p->history[0] = TAGVER_ZERO; + return p; +} + +tcmd_t *tcpool_t::make_set(tcmd_t *next, tagver_t lhs, tagver_t set) +{ + const size_t size = sizeof(tcmd_t) + sizeof(tagver_t); + tcmd_t *p = static_cast(alc.alloc(size)); + p->next = next; + p->lhs = lhs; + p->rhs = TAGVER_ZERO; + p->history[0] = set; + p->history[1] = TAGVER_ZERO; + return p; +} + +tcmd_t *tcpool_t::make_add(tcmd_t *next, tagver_t lhs, tagver_t rhs, + const tagtree_t &history, hidx_t hidx, size_t tag) +{ + size_t hlen = 0; + for (hidx_t i = hidx; i != HROOT; i = history.pred(i)) { + if (history.tag(i) == tag) ++hlen; + } + + const size_t size = sizeof(tcmd_t) + hlen * sizeof(tagver_t); + tcmd_t *p = static_cast(alc.alloc(size)); + p->next = next; + p->lhs = lhs; + p->rhs = rhs; + tagver_t *h = p->history; + for (hidx_t i = hidx; i != HROOT; i = history.pred(i)) { + if (history.tag(i) == tag) { + *h++ = history.elem(i); + } + } + *h++ = TAGVER_ZERO; + return p; +} + +tcmd_t *tcpool_t::copy_add(tcmd_t *next, tagver_t lhs, tagver_t rhs, + const tagver_t *history) +{ + size_t hlen = 0; + for (const tagver_t *h = history; *h != TAGVER_ZERO; ++h) ++hlen; + + const size_t size = sizeof(tcmd_t) + hlen * sizeof(tagver_t); + tcmd_t *p = static_cast(alc.alloc(size)); + p->next = next; + p->lhs = lhs; + p->rhs = rhs; + memcpy(p->history, history, (hlen + 1) * sizeof(tagver_t)); + return p; +} + +uint32_t hash_tcmd(const tcmd_t *tcmd) +{ + uint32_t h = 0; + for (const tcmd_t *p = tcmd; p; p = p->next) { + h = hash32(h, &p->lhs, sizeof(p->lhs)); + h = hash32(h, &p->rhs, sizeof(p->rhs)); + h = hash32(h, &p->history[0], sizeof(p->history[0])); + } + return h; +} + +struct tcmd_eq_t +{ + bool operator()(const tcmd_t *x, const tcmd_t *y) const + { + for (;;) { + if (!x && !y) return true; + if (!x || !y) return false; + if (!tcmd_t::equal(*x, *y)) return false; + x = x->next; + y = y->next; + } + } +}; + +tcid_t tcpool_t::insert(const tcmd_t *tcmd) +{ + const uint32_t h = hash_tcmd(tcmd); + + tcmd_eq_t eq; + size_t id = index.find_with(h, tcmd, eq); + if (id == index_t::NIL) { + id = index.push(h, tcmd); + } + + return static_cast(id); +} + +const tcmd_t *tcpool_t::operator[](tcid_t id) const +{ + return index[id]; +} + +} // namespace re2c diff --git a/src/dfa/tcmd.h b/src/dfa/tcmd.h new file mode 100644 index 0000000..88d12fa --- /dev/null +++ b/src/dfa/tcmd.h @@ -0,0 +1,56 @@ +#ifndef _RE2C_DFA_TCMD_ +#define _RE2C_DFA_TCMD_ + +#include +#include "src/util/c99_stdint.h" + +#include "src/dfa/tagtree.h" +#include "src/re/tag.h" +#include "src/util/forbid_copy.h" +#include "src/util/lookup.h" +#include "src/util/slab_allocator.h" + +namespace re2c +{ + +struct tcmd_t +{ + tcmd_t *next; + tagver_t lhs; // left hand side + tagver_t rhs; // right hand side + tagver_t history[1]; + + static bool equal(const tcmd_t &x, const tcmd_t &y); + static bool equal_history(const tagver_t *h, const tagver_t *g); + static bool topsort(tcmd_t **phead, uint32_t *indeg); + static bool iscopy(const tcmd_t *x); + static bool isset(const tcmd_t *x); + static bool isadd(const tcmd_t *x); + FORBID_COPY(tcmd_t); +}; + +typedef uint32_t tcid_t; + +static const tcid_t TCID0 = 0; + +class tcpool_t +{ + typedef slab_allocator_t<~0u, 4096, sizeof(void*)> alc_t; + typedef lookup_t index_t; + + alc_t alc; + index_t index; + +public: + tcpool_t(); + tcmd_t *make_copy(tcmd_t *next, tagver_t lhs, tagver_t rhs); + tcmd_t *make_set(tcmd_t *next, tagver_t lhs, tagver_t set); + tcmd_t *make_add(tcmd_t *next, tagver_t lhs, tagver_t rhs, const tagtree_t &history, hidx_t hidx, size_t tag); + tcmd_t *copy_add(tcmd_t *next, tagver_t lhs, tagver_t rhs, const tagver_t *history); + tcid_t insert(const tcmd_t *tcmd); + const tcmd_t *operator[](tcid_t id) const; +}; + +} // namespace re2c + +#endif // _RE2C_DFA_TCMD_ diff --git a/src/globals.h b/src/globals.h deleted file mode 100644 index b2ea67a..0000000 --- a/src/globals.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _RE2C_GLOBALS_ -#define _RE2C_GLOBALS_ - -#include - -#include "src/conf/opt.h" -#include "src/conf/warn.h" -#include "src/util/c99_stdint.h" - -namespace re2c -{ - -extern bool bUsedYYBitmap; -extern bool bWroteGetState; -extern bool bWroteCondCheck; -extern uint32_t last_fill_index; -extern std::string yySetupRule; - -extern Opt opts; -extern Warn warn; - -} // end namespace re2c - -#endif // _RE2C_GLOBALS_ diff --git a/src/ir/adfa/action.h b/src/ir/adfa/action.h deleted file mode 100644 index abc2d99..0000000 --- a/src/ir/adfa/action.h +++ /dev/null @@ -1,109 +0,0 @@ -#ifndef _RE2C_IR_ADFA_ACTION_ -#define _RE2C_IR_ADFA_ACTION_ - -#include - -#include "src/codegen/label.h" -#include "src/util/c99_stdint.h" -#include "src/util/uniq_vector.h" - -namespace re2c -{ - -struct OutputFile; -class RuleOp; -class State; - -struct Initial -{ - label_t label; - bool setMarker; - - inline Initial (label_t l, bool b) - : label (l) - , setMarker (b) - {} -}; - -typedef uniq_vector_t accept_t; - -class Action -{ -public: - enum type_t - { - MATCH, - INITIAL, - SAVE, - MOVE, - ACCEPT, - RULE - } type; - union - { - Initial * initial; - uint32_t save; - const accept_t * accepts; - const RuleOp * rule; - } info; - -public: - inline Action () - : type (MATCH) - , info () - {} - ~Action () - { - clear (); - } - void set_initial (label_t label, bool used_marker) - { - clear (); - type = INITIAL; - info.initial = new Initial (label, used_marker); - } - void set_save (uint32_t save) - { - clear (); - type = SAVE; - info.save = save; - } - void set_move () - { - clear (); - type = MOVE; - } - void set_accept (const accept_t * accepts) - { - clear (); - type = ACCEPT; - info.accepts = accepts; - } - void set_rule (const RuleOp * const rule) - { - clear (); - type = RULE; - info.rule = rule; - } - -private: - void clear () - { - switch (type) - { - case INITIAL: - delete info.initial; - break; - case MATCH: - case SAVE: - case MOVE: - case ACCEPT: - case RULE: - break; - } - } -}; - -} // namespace re2c - -#endif // _RE2C_IR_ADFA_ACTION_ diff --git a/src/ir/adfa/adfa.cc b/src/ir/adfa/adfa.cc deleted file mode 100644 index cb41d03..0000000 --- a/src/ir/adfa/adfa.cc +++ /dev/null @@ -1,135 +0,0 @@ -#include -#include -#include -#include -#include - -#include "src/codegen/go.h" -#include "src/ir/adfa/adfa.h" -#include "src/ir/dfa/dfa.h" -#include "src/ir/skeleton/skeleton.h" -#include "src/util/allocate.h" - -namespace re2c -{ - -DFA::DFA - ( const dfa_t &dfa - , const std::vector &fill - , Skeleton *skel - , const charset_t &charset - , const std::string &n - , const std::string &c - , uint32_t l - ) - : accepts () - , skeleton (skel) - , name (n) - , cond (c) - , line (l) - , lbChar(0) - , ubChar(charset.back()) - , nStates(0) - , head(NULL) - - // statistics - , max_fill (0) - , need_backup (false) - , need_backupctx (false) - , need_accept (false) -{ - const size_t nstates = dfa.states.size(); - const size_t nchars = dfa.nchars; - - State **i2s = new State*[nstates]; - for (size_t i = 0; i < nstates; ++i) - { - i2s[i] = new State; - } - - State **p = &head; - for (size_t i = 0; i < nstates; ++i) - { - dfa_state_t *t = dfa.states[i]; - State *s = i2s[i]; - - ++nStates; - *p = s; - p = &s->next; - - s->isPreCtxt = t->ctx; - s->rule = t->rule; - s->fill = fill[i]; - s->go.span = allocate(nchars); - uint32_t j = 0; - for (uint32_t c = 0; c < nchars; ++j) - { - const size_t to = t->arcs[c]; - for (;++c < nchars && t->arcs[c] == to;); - s->go.span[j].to = to == dfa_t::NIL ? NULL : i2s[to]; - s->go.span[j].ub = charset[c]; - } - s->go.nSpans = j; - } - *p = NULL; - - delete[] i2s; -} - -DFA::~DFA() -{ - State *s; - - while ((s = head)) - { - head = s->next; - delete s; - } - - delete skeleton; -} - -void DFA::reorder() -{ - std::vector ord; - ord.reserve(nStates); - - std::queue todo; - todo.push(head); - - std::set done; - done.insert(head); - - for(;!todo.empty();) - { - State *s = todo.front(); - todo.pop(); - ord.push_back(s); - for(uint32_t i = 0; i < s->go.nSpans; ++i) - { - State *q = s->go.span[i].to; - if(q && done.insert(q).second) - { - todo.push(q); - } - } - } - - assert(nStates == ord.size()); - - ord.push_back(NULL); - for(uint32_t i = 0; i < nStates; ++i) - { - ord[i]->next = ord[i + 1]; - } -} - -void DFA::addState(State *s, State *next) -{ - ++nStates; - s->next = next->next; - next->next = s; -} - -} // namespace re2c - diff --git a/src/ir/adfa/adfa.h b/src/ir/adfa/adfa.h deleted file mode 100644 index 95f512d..0000000 --- a/src/ir/adfa/adfa.h +++ /dev/null @@ -1,101 +0,0 @@ -#ifndef _RE2C_IR_ADFA_ADFA_ -#define _RE2C_IR_ADFA_ADFA_ - -#include -#include "src/util/c99_stdint.h" -#include -#include - -#include "src/codegen/go.h" -#include "src/codegen/label.h" -#include "src/ir/adfa/action.h" -#include "src/ir/regexp/regexp.h" -#include "src/util/forbid_copy.h" - -namespace re2c -{ - -struct Skeleton; -struct Output; -struct OutputFile; -struct dfa_t; - -struct State -{ - label_t label; - RuleOp * rule; - State * next; - size_t fill; - - bool isPreCtxt; - bool isBase; - Go go; - Action action; - - State () - : label (label_t::first ()) - , rule (NULL) - , next (0) - , fill (0) - , isPreCtxt (false) - , isBase (false) - , go () - , action () - {} - ~State () - { - operator delete (go.span); - } - - FORBID_COPY (State); -}; - -class DFA -{ - accept_t accepts; - Skeleton * skeleton; - -public: - const std::string name; - const std::string cond; - const uint32_t line; - - uint32_t lbChar; - uint32_t ubChar; - uint32_t nStates; - State * head; - - // statistics - size_t max_fill; - bool need_backup; - bool need_backupctx; - bool need_accept; - -public: - DFA ( const dfa_t &dfa - , const std::vector &fill - , Skeleton *skel - , const charset_t &charset - , const std::string &n - , const std::string &c - , uint32_t l - ); - ~DFA (); - void reorder(); - void prepare(); - void calc_stats(); - void emit (Output &, uint32_t &, bool, bool &); - -private: - void addState(State*, State *); - void split (State *); - void findBaseState (); - void count_used_labels (std::set & used, label_t prolog, label_t start, bool force_start) const; - void emit_body (OutputFile &, uint32_t &, const std::set & used_labels, label_t initial) const; - - FORBID_COPY (DFA); -}; - -} // namespace re2c - -#endif // _RE2C_IR_ADFA_ADFA_ diff --git a/src/ir/adfa/prepare.cc b/src/ir/adfa/prepare.cc deleted file mode 100644 index 39cf65c..0000000 --- a/src/ir/adfa/prepare.cc +++ /dev/null @@ -1,268 +0,0 @@ -#include "src/util/c99_stdint.h" -#include -#include - -#include "src/codegen/bitmap.h" -#include "src/codegen/go.h" -#include "src/globals.h" -#include "src/ir/adfa/action.h" -#include "src/ir/adfa/adfa.h" -#include "src/ir/regexp/regexp_rule.h" -#include "src/ir/rule_rank.h" -#include "src/util/allocate.h" - -namespace re2c { - -void DFA::split(State *s) -{ - State *move = new State; - addState(move, s); - move->action.set_move (); - move->rule = s->rule; - move->fill = s->fill; - move->go = s->go; - s->rule = NULL; - s->go.nSpans = 1; - s->go.span = allocate (1); - s->go.span[0].ub = ubChar; - s->go.span[0].to = move; -} - -static uint32_t merge(Span *x0, State *fg, State *bg) -{ - Span *x = x0, *f = fg->go.span, *b = bg->go.span; - uint32_t nf = fg->go.nSpans, nb = bg->go.nSpans; - State *prev = NULL, *to; - // NB: we assume both spans are for same range - - for (;;) - { - if (f->ub == b->ub) - { - to = f->to == b->to ? bg : f->to; - - if (to == prev) - { - --x; - } - else - { - x->to = prev = to; - } - - x->ub = f->ub; - ++x; - ++f; - --nf; - ++b; - --nb; - - if (nf == 0 && nb == 0) - { - return static_cast (x - x0); - } - } - - while (f->ub < b->ub) - { - to = f->to == b->to ? bg : f->to; - - if (to == prev) - { - --x; - } - else - { - x->to = prev = to; - } - - x->ub = f->ub; - ++x; - ++f; - --nf; - } - - while (b->ub < f->ub) - { - to = b->to == f->to ? bg : f->to; - - if (to == prev) - { - --x; - } - else - { - x->to = prev = to; - } - - x->ub = b->ub; - ++x; - ++b; - --nb; - } - } -} - -void DFA::findBaseState() -{ - Span *span = allocate (ubChar - lbChar); - - for (State *s = head; s; s = s->next) - { - if (s->fill == 0) - { - for (uint32_t i = 0; i < s->go.nSpans; ++i) - { - State *to = s->go.span[i].to; - - if (to->isBase) - { - to = to->go.span[0].to; - uint32_t nSpans = merge(span, s, to); - - if (nSpans < s->go.nSpans) - { - operator delete (s->go.span); - s->go.nSpans = nSpans; - s->go.span = allocate (nSpans); - memcpy(s->go.span, span, nSpans*sizeof(Span)); - } - - break; - } - } - } - } - - operator delete (span); -} - -void DFA::prepare () -{ - bUsedYYBitmap = false; - - // create rule states - std::map rules; - for (State * s = head; s; s = s->next) - { - if (s->rule) - { - if (rules.find (s->rule->rank) == rules.end ()) - { - State *n = new State; - n->action.set_rule (s->rule); - rules[s->rule->rank] = n; - addState(n, s); - } - for (uint32_t i = 0; i < s->go.nSpans; ++i) - { - if (!s->go.span[i].to) - { - s->go.span[i].to = rules[s->rule->rank]; - } - } - } - } - - // create default state (if needed) - State * default_state = NULL; - for (State * s = head; s; s = s->next) - { - for (uint32_t i = 0; i < s->go.nSpans; ++i) - { - if (!s->go.span[i].to) - { - if (!default_state) - { - default_state = new State; - addState(default_state, s); - } - s->go.span[i].to = default_state; - } - } - } - - // find backup states and create accept state (if needed) - if (default_state) - { - for (State * s = head; s; s = s->next) - { - if (s->rule) - { - for (uint32_t i = 0; i < s->go.nSpans; ++i) - { - if (!s->go.span[i].to->rule && s->go.span[i].to->action.type != Action::RULE) - { - const uint32_t accept = static_cast (accepts.find_or_add (rules[s->rule->rank])); - s->action.set_save (accept); - } - } - } - } - default_state->action.set_accept (&accepts); - } - - // split ``base'' states into two parts - for (State * s = head; s; s = s->next) - { - s->isBase = false; - - if (s->fill != 0) - { - for (uint32_t i = 0; i < s->go.nSpans; ++i) - { - if (s->go.span[i].to == s) - { - s->isBase = true; - split(s); - - if (opts->bFlag) - { - BitMap::find(&s->next->go, s); - } - - s = s->next; - break; - } - } - } - } - - // find ``base'' state, if possible - findBaseState(); - - for (State * s = head; s; s = s->next) - { - s->go.init (s); - } -} - -void DFA::calc_stats () -{ - // calculate 'YYMAXFILL' - max_fill = 0; - for (State * s = head; s; s = s->next) - { - if (max_fill < s->fill) - { - max_fill = s->fill; - } - } - - // determine if 'YYMARKER' or 'YYBACKUP'/'YYRESTORE' pair is used - need_backup = accepts.size () > 0; - - // determine if 'YYCTXMARKER' or 'YYBACKUPCTX'/'YYRESTORECTX' pair is used - for (State * s = head; s; s = s->next) - { - if (s->isPreCtxt) - { - need_backupctx = true; - } - } - - // determine if 'yyaccept' variable is used - need_accept = accepts.size () > 1; -} - -} // namespace re2c diff --git a/src/ir/compile.cc b/src/ir/compile.cc deleted file mode 100644 index b38b398..0000000 --- a/src/ir/compile.cc +++ /dev/null @@ -1,104 +0,0 @@ -#include -#include -#include - -#include "src/codegen/output.h" -#include "src/ir/compile.h" -#include "src/ir/adfa/adfa.h" -#include "src/ir/dfa/dfa.h" -#include "src/ir/nfa/nfa.h" -#include "src/ir/regexp/regexp.h" -#include "src/ir/skeleton/skeleton.h" -#include "src/parse/spec.h" - -namespace re2c { - -static std::string make_name(const std::string &cond, uint32_t line) -{ - std::ostringstream os; - os << "line" << line; - std::string name = os.str(); - if (!cond.empty ()) - { - name += "_"; - name += cond; - } - return name; -} - -smart_ptr compile (Spec & spec, Output & output, const std::string & cond, uint32_t cunits) -{ - const uint32_t line = output.source.get_block_line(); - const std::string name = make_name(cond, line); - - // The original set of code units (charset) might be very large. - // A common trick it is to split charset into disjoint character ranges - // and choose a representative of each range (we choose lower bound). - // The set of all representatives is the new (compacted) charset. - // Don't forget to include zero and upper bound, even if they - // do not explicitely apper in ranges. - std::set bounds; - spec.re->split(bounds); - bounds.insert(0); - bounds.insert(cunits); - charset_t cs; - for (std::set::const_iterator i = bounds.begin(); i != bounds.end(); ++i) - { - cs.push_back(*i); - } - - nfa_t nfa(spec.re); - - dfa_t dfa(nfa, cs, spec.rules); - - // skeleton must be constructed after DFA construction - // but prior to any other DFA transformations - Skeleton *skeleton = new Skeleton(dfa, cs, spec.rules, name, cond, line); - - minimization(dfa); - - // find YYFILL states and calculate argument to YYFILL - std::vector fill; - fillpoints(dfa, fill); - - // ADFA stands for 'DFA with actions' - DFA *adfa = new DFA(dfa, fill, skeleton, cs, name, cond, line); - - /* - * note [reordering DFA states] - * - * re2c-generated code depends on the order of states in DFA: simply - * flipping two states may change the output significantly. - * The order of states is affected by many factors, e.g.: - * - flipping left and right subtrees of alternative when constructing - * AST (also applies to iteration and counted repetition) - * - changing the order in which graph nodes are visited (applies to - * any intermediate representation: bytecode, NFA, DFA, etc.) - * - * To make the resulting code independent of such changes, we hereby - * reorder DFA states. The ordering scheme is very simple: - * - * Starting with DFA root, walk DFA nodes in breadth-first order. - * Child nodes are ordered accoding to the (alphabetically) first symbol - * leading to each node. Each node must be visited exactly once. - * Default state (NULL) is always the last state. - */ - adfa->reorder(); - - // skeleton is constructed, do further DFA transformations - adfa->prepare(); - - // finally gather overall DFA statistics - adfa->calc_stats(); - - // accumulate global statistics from this particular DFA - output.max_fill = std::max (output.max_fill, adfa->max_fill); - if (adfa->need_accept) - { - output.source.set_used_yyaccept (); - } - - return make_smart_ptr(adfa); -} - -} // namespace re2c diff --git a/src/ir/compile.h b/src/ir/compile.h deleted file mode 100644 index 6883c1c..0000000 --- a/src/ir/compile.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef _RE2C_IR_COMPILE_ -#define _RE2C_IR_COMPILE_ - -#include "src/util/c99_stdint.h" -#include - -#include "src/util/smart_ptr.h" - -namespace re2c -{ - -class DFA; -struct Output; -struct Spec; - -smart_ptr compile (Spec & spec, Output & output, const std::string & cond, uint32_t cunits); - -} // namespace re2c - -#endif // _RE2C_IR_COMPILE_ diff --git a/src/ir/dfa/determinization.cc b/src/ir/dfa/determinization.cc deleted file mode 100644 index 01a04cc..0000000 --- a/src/ir/dfa/determinization.cc +++ /dev/null @@ -1,197 +0,0 @@ -#include -#include -#include -#include -#include - -#include "src/ir/dfa/dfa.h" -#include "src/ir/nfa/nfa.h" -#include "src/ir/regexp/regexp.h" -#include "src/ir/regexp/regexp_rule.h" -#include "src/ir/rule_rank.h" -#include "src/parse/rules.h" -#include "src/util/ord_hash_set.h" -#include "src/util/range.h" - -namespace re2c -{ - -const size_t dfa_t::NIL = std::numeric_limits::max(); - -/* - * note [marking DFA states] - * - * DFA state is a set of NFA states. - * However, DFA state includes not all NFA states that are in - * epsilon-closure (NFA states that have only epsilon-transitions - * and are not context of final states are omitted). - * The included states are called 'kernel' states. - * - * We mark visited NFA states during closure construction. - * These marks serve two purposes: - * - avoid loops in NFA - * - avoid duplication of NFA states in kernel - * - * Note that after closure construction: - * - all non-kernel states must be unmarked (these states are - * not stored in kernel and it is impossible to unmark them - * afterwards) - * - all kernel states must be marked (because we may later - * extend this kernel with epsilon-closure of another NFA - * state). Kernel states are unmarked later (before finding - * or adding DFA state). - */ -static nfa_state_t **closure(nfa_state_t **cP, nfa_state_t *n) -{ - if (!n->mark) - { - n->mark = true; - switch (n->type) - { - case nfa_state_t::ALT: - cP = closure(cP, n->value.alt.out2); - cP = closure(cP, n->value.alt.out1); - n->mark = false; - break; - case nfa_state_t::CTX: - *(cP++) = n; - cP = closure(cP, n->value.ctx.out); - break; - default: - *(cP++) = n; - break; - } - } - - return cP; -} - -static size_t find_state - ( nfa_state_t **kernel - , nfa_state_t **end - , ord_hash_set_t &kernels - ) -{ - // zero-sized kernel corresponds to default state - if (kernel == end) - { - return dfa_t::NIL; - } - - // see note [marking DFA states] - for (nfa_state_t **p = kernel; p != end; ++p) - { - (*p)->mark = false; - } - - // sort kernel states: we need this to get stable hash - // and to compare states with simple 'memcmp' - std::sort(kernel, end); - const size_t size = static_cast(end - kernel) * sizeof(nfa_state_t*); - return kernels.insert(kernel, size); -} - -dfa_t::dfa_t(const nfa_t &nfa, const charset_t &charset, rules_t &rules) - : states() - , nchars(charset.size() - 1) // (n + 1) bounds for n ranges -{ - std::map > s2rules; - ord_hash_set_t kernels; - nfa_state_t **const buffer = new nfa_state_t*[nfa.size]; - std::vector > arcs(nchars); - - find_state(buffer, closure(buffer, nfa.root), kernels); - for (size_t i = 0; i < kernels.size(); ++i) - { - dfa_state_t *s = new dfa_state_t; - states.push_back(s); - - nfa_state_t **kernel; - const size_t kernel_size = kernels.deref(i, kernel); - for (size_t j = 0; j < kernel_size; ++j) - { - nfa_state_t *n = kernel[j]; - switch (n->type) - { - case nfa_state_t::RAN: - { - nfa_state_t *m = n->value.ran.out; - size_t c = 0; - for (Range *r = n->value.ran.ran; r; r = r->next ()) - { - for (; charset[c] != r->lower(); ++c); - for (; charset[c] != r->upper(); ++c) - { - arcs[c].push_back(m); - } - } - break; - } - case nfa_state_t::CTX: - s->ctx = true; - break; - case nfa_state_t::FIN: - s2rules[i].insert(n->value.fin.rule); - break; - default: - break; - } - } - - s->arcs = new size_t[nchars]; - for(size_t c = 0; c < nchars; ++c) - { - nfa_state_t **end = buffer; - for (std::vector::const_iterator j = arcs[c].begin(); j != arcs[c].end(); ++j) - { - end = closure(end, *j); - } - s->arcs[c] = find_state(buffer, end, kernels); - } - - for(size_t c = 0; c < nchars; ++c) - { - arcs[c].clear(); - } - } - delete[] buffer; - - const size_t count = states.size(); - for (size_t i = 0; i < count; ++i) - { - dfa_state_t *s = states[i]; - std::set &rs = s2rules[i]; - // for each final state: choose the rule with the smallest rank - for (std::set::const_iterator j = rs.begin(); j != rs.end(); ++j) - { - RuleOp *rule = *j; - if (!s->rule || rule->rank < s->rule->rank) - { - s->rule = rule; - } - } - // other rules are shadowed by the chosen rule - for (std::set::const_iterator j = rs.begin(); j != rs.end(); ++j) - { - RuleOp *rule = *j; - if (s->rule != rule) - { - rules[rule->rank].shadow.insert(s->rule->rank); - } - } - } -} - -dfa_t::~dfa_t() -{ - std::vector::iterator - i = states.begin(), - e = states.end(); - for (; i != e; ++i) - { - delete *i; - } -} - -} // namespace re2c - diff --git a/src/ir/dfa/dfa.h b/src/ir/dfa/dfa.h deleted file mode 100644 index 459ed4a..0000000 --- a/src/ir/dfa/dfa.h +++ /dev/null @@ -1,58 +0,0 @@ -#ifndef _RE2C_IR_DFA_DFA_ -#define _RE2C_IR_DFA_DFA_ - -#include "src/util/c99_stdint.h" -#include - -#include "src/ir/regexp/regexp.h" -#include "src/parse/rules.h" -#include "src/util/forbid_copy.h" - -namespace re2c -{ - -struct nfa_t; -class RuleOp; - -struct dfa_state_t -{ - size_t *arcs; - RuleOp *rule; - bool ctx; - - dfa_state_t() - : arcs(NULL) - , rule(NULL) - , ctx(false) - {} - ~dfa_state_t() - { - delete[] arcs; - } - - FORBID_COPY(dfa_state_t); -}; - -struct dfa_t -{ - static const size_t NIL; - - std::vector states; - const size_t nchars; - - dfa_t(const nfa_t &nfa, const charset_t &charset, rules_t &rules); - ~dfa_t(); -}; - -enum dfa_minimization_t -{ - DFA_MINIMIZATION_TABLE, - DFA_MINIMIZATION_MOORE -}; - -void minimization(dfa_t &dfa); -void fillpoints(const dfa_t &dfa, std::vector &fill); - -} // namespace re2c - -#endif // _RE2C_IR_DFA_DFA_ diff --git a/src/ir/nfa/calc_size.cc b/src/ir/nfa/calc_size.cc deleted file mode 100644 index 39f0b4e..0000000 --- a/src/ir/nfa/calc_size.cc +++ /dev/null @@ -1,50 +0,0 @@ -#include "src/util/c99_stdint.h" - -#include "src/ir/regexp/regexp.h" -#include "src/ir/regexp/regexp_alt.h" -#include "src/ir/regexp/regexp_cat.h" -#include "src/ir/regexp/regexp_close.h" -#include "src/ir/regexp/regexp_match.h" -#include "src/ir/regexp/regexp_null.h" -#include "src/ir/regexp/regexp_rule.h" - -namespace re2c -{ - -uint32_t AltOp::calc_size() const -{ - return exp1->calc_size() - + exp2->calc_size() - + 1; -} - -uint32_t CatOp::calc_size() const -{ - return exp1->calc_size() - + exp2->calc_size(); -} - -uint32_t CloseOp::calc_size() const -{ - return exp->calc_size() + 1; -} - -uint32_t MatchOp::calc_size() const -{ - return 1; -} - -uint32_t NullOp::calc_size() const -{ - return 0; -} - -uint32_t RuleOp::calc_size() const -{ - const uint32_t n = ctx->calc_size(); - return exp->calc_size() - + (n > 0 ? n + 1 : 0) - + 1; -} - -} // end namespace re2c diff --git a/src/ir/nfa/nfa.cc b/src/ir/nfa/nfa.cc deleted file mode 100644 index 64f4641..0000000 --- a/src/ir/nfa/nfa.cc +++ /dev/null @@ -1,72 +0,0 @@ -#include "src/ir/nfa/nfa.h" -#include "src/ir/regexp/regexp.h" -#include "src/ir/regexp/regexp_alt.h" -#include "src/ir/regexp/regexp_cat.h" -#include "src/ir/regexp/regexp_close.h" -#include "src/ir/regexp/regexp_match.h" -#include "src/ir/regexp/regexp_null.h" -#include "src/ir/regexp/regexp_rule.h" - -namespace re2c { - -nfa_t::nfa_t(RegExp *re) - : max_size(re->calc_size()) - , size(0) - , states(new nfa_state_t[max_size]) - , root(re->compile(*this, NULL)) -{} - -nfa_t::~nfa_t() -{ - delete[] states; -} - -nfa_state_t *AltOp::compile(nfa_t &nfa, nfa_state_t *t) -{ - nfa_state_t *s = &nfa.states[nfa.size++]; - s->alt(exp1->compile(nfa, t), - exp2->compile(nfa, t)); - return s; -} - -nfa_state_t *CatOp::compile(nfa_t &nfa, nfa_state_t *t) -{ - nfa_state_t *s2 = exp2->compile(nfa, t); - nfa_state_t *s1 = exp1->compile(nfa, s2); - return s1; -} - -nfa_state_t *CloseOp::compile(nfa_t &nfa, nfa_state_t *t) -{ - nfa_state_t *s = &nfa.states[nfa.size++]; - s->alt(t, exp->compile(nfa, s)); - return s; -} - -nfa_state_t *MatchOp::compile(nfa_t &nfa, nfa_state_t *t) -{ - nfa_state_t *s = &nfa.states[nfa.size++]; - s->ran(t, match); - return s; -} - -nfa_state_t *NullOp::compile(nfa_t &, nfa_state_t *t) -{ - return t; -} - -nfa_state_t *RuleOp::compile(nfa_t &nfa, nfa_state_t *) -{ - nfa_state_t *s3 = &nfa.states[nfa.size++]; - s3->fin(this); - if (ctx->calc_size() > 0) - { - nfa_state_t *s2 = &nfa.states[nfa.size++]; - s2->ctx(ctx->compile(nfa, s3)); - s3 = s2; - } - nfa_state_t *s1 = exp->compile(nfa, s3); - return s1; -} - -} // namespace re2c diff --git a/src/ir/nfa/nfa.h b/src/ir/nfa/nfa.h deleted file mode 100644 index 28587f4..0000000 --- a/src/ir/nfa/nfa.h +++ /dev/null @@ -1,90 +0,0 @@ -#ifndef _RE2C_IR_NFA_NFA_ -#define _RE2C_IR_NFA_NFA_ - -#include "src/util/c99_stdint.h" - -#include "src/util/forbid_copy.h" - -namespace re2c -{ - -struct Range; -struct RegExp; -struct RuleOp; - -struct nfa_state_t -{ - enum type_t - { - ALT, - RAN, - CTX, - FIN - } type; - union - { - struct - { - nfa_state_t *out1; - nfa_state_t *out2; - } alt; - struct - { - nfa_state_t *out; - Range *ran; - } ran; - struct - { - nfa_state_t *out; - } ctx; - struct - { - RuleOp *rule; - } fin; - } value; - bool mark; - - void alt(nfa_state_t *s1, nfa_state_t *s2) - { - type = ALT; - value.alt.out1 = s1; - value.alt.out2 = s2; - mark = false; - } - void ran(nfa_state_t *s, Range *r) - { - type = RAN; - value.ran.out = s; - value.ran.ran = r; - mark = false; - } - void ctx(nfa_state_t *s) - { - type = CTX; - value.ctx.out = s; - mark = false; - } - void fin(RuleOp *r) - { - type = FIN; - value.fin.rule = r; - mark = false; - } -}; - -struct nfa_t -{ - const uint32_t max_size; - uint32_t size; - nfa_state_t *states; - nfa_state_t *root; - - nfa_t(RegExp *re); - ~nfa_t(); - - FORBID_COPY(nfa_t); -}; - -} // namespace re2c - -#endif // _RE2C_IR_NFA_NFA_ diff --git a/src/ir/nfa/split.cc b/src/ir/nfa/split.cc deleted file mode 100644 index 73e6304..0000000 --- a/src/ir/nfa/split.cc +++ /dev/null @@ -1,49 +0,0 @@ -#include "src/util/c99_stdint.h" -#include - -#include "src/ir/regexp/regexp.h" -#include "src/ir/regexp/regexp_alt.h" -#include "src/ir/regexp/regexp_cat.h" -#include "src/ir/regexp/regexp_close.h" -#include "src/ir/regexp/regexp_match.h" -#include "src/ir/regexp/regexp_null.h" -#include "src/ir/regexp/regexp_rule.h" -#include "src/util/range.h" - -namespace re2c { - -void AltOp::split (std::set & cs) -{ - exp1->split (cs); - exp2->split (cs); -} - -void CatOp::split (std::set & cs) -{ - exp1->split (cs); - exp2->split (cs); -} - -void CloseOp::split (std::set & cs) -{ - exp->split (cs); -} - -void MatchOp::split (std::set & cs) -{ - for (Range *r = match; r; r = r->next ()) - { - cs.insert (r->lower ()); - cs.insert (r->upper ()); - } -} - -void NullOp::split (std::set &) {} - -void RuleOp::split (std::set & cs) -{ - exp->split (cs); - ctx->split (cs); -} - -} // namespace re2c diff --git a/src/ir/regexp/display.cc b/src/ir/regexp/display.cc deleted file mode 100644 index d139dc5..0000000 --- a/src/ir/regexp/display.cc +++ /dev/null @@ -1,51 +0,0 @@ -#include - -#include "src/ir/regexp/regexp.h" -#include "src/ir/regexp/regexp_alt.h" -#include "src/ir/regexp/regexp_cat.h" -#include "src/ir/regexp/regexp_close.h" -#include "src/ir/regexp/regexp_match.h" -#include "src/ir/regexp/regexp_null.h" -#include "src/ir/regexp/regexp_rule.h" - -namespace re2c -{ - -std::ostream & operator << (std::ostream & o, const RegExp & re) -{ - re.display (o); - return o; -} - -void AltOp::display (std::ostream & o) const -{ - o << exp1 << "|" << exp2; -} - -void CatOp::display (std::ostream & o) const -{ - o << exp1 << exp2; -} - -void CloseOp::display (std::ostream & o) const -{ - o << exp << "+"; -} - -void MatchOp::display (std::ostream & o) const -{ - o << match; -} - -void NullOp::display (std::ostream & o) const -{ - o << "_"; -} - -void RuleOp::display (std::ostream & o) const -{ - o << exp << "/" << ctx << ";"; -} - -} // end namespace re2c - diff --git a/src/ir/regexp/encoding/range_suffix.cc b/src/ir/regexp/encoding/range_suffix.cc deleted file mode 100644 index 486bd55..0000000 --- a/src/ir/regexp/encoding/range_suffix.cc +++ /dev/null @@ -1,38 +0,0 @@ -#include "src/ir/regexp/encoding/range_suffix.h" -#include "src/ir/regexp/regexp.h" -#include "src/ir/regexp/regexp_match.h" -#include "src/util/range.h" - -namespace re2c { - -static RegExp * emit (RangeSuffix * p, RegExp * re); - -free_list RangeSuffix::freeList; - -RegExp * to_regexp (RangeSuffix * p) -{ - return p - ? emit (p, NULL) - : new MatchOp (NULL); -} - -/* - * Build regexp from suffix tree. - */ -RegExp * emit(RangeSuffix * p, RegExp * re) -{ - if (p == NULL) - return re; - else - { - RegExp * regexp = NULL; - for (; p != NULL; p = p->next) - { - RegExp * re1 = doCat(new MatchOp(Range::ran (p->l, p->h + 1)), re); - regexp = doAlt(regexp, emit(p->child, re1)); - } - return regexp; - } -} - -} // namespace re2c diff --git a/src/ir/regexp/encoding/utf16/utf16_regexp.h b/src/ir/regexp/encoding/utf16/utf16_regexp.h deleted file mode 100644 index d381de9..0000000 --- a/src/ir/regexp/encoding/utf16/utf16_regexp.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _RE2C_IR_REGEXP_ENCODING_UTF16_REGEXP_ -#define _RE2C_IR_REGEXP_ENCODING_UTF16_REGEXP_ - -#include "src/ir/regexp/encoding/utf16/utf16.h" - -namespace re2c { - -class Range; -class RegExp; - -RegExp * UTF16Symbol(utf16::rune r); -RegExp * UTF16Range(const Range * r); - -} // namespace re2c - -#endif // _RE2C_IR_REGEXP_ENCODING_UTF16_REGEXP_ diff --git a/src/ir/regexp/encoding/utf8/utf8_range.h b/src/ir/regexp/encoding/utf8/utf8_range.h deleted file mode 100644 index 1ce4613..0000000 --- a/src/ir/regexp/encoding/utf8/utf8_range.h +++ /dev/null @@ -1,18 +0,0 @@ -#ifndef _RE2C_IR_REGEXP_ENCODING_UTF8_RANGE_ -#define _RE2C_IR_REGEXP_ENCODING_UTF8_RANGE_ - -#include "src/util/c99_stdint.h" - -#include "src/ir/regexp/encoding/utf8/utf8.h" - -namespace re2c { - -struct RangeSuffix; - -void UTF8addContinuous(RangeSuffix * & p, utf8::rune l, utf8::rune h, uint32_t n); -void UTF8splitByContinuity(RangeSuffix * & p, utf8::rune l, utf8::rune h, uint32_t n); -void UTF8splitByRuneLength(RangeSuffix * & p, utf8::rune l, utf8::rune h); - -} // namespace re2c - -#endif // _RE2C_IR_REGEXP_ENCODING_UTF8_RANGE_ diff --git a/src/ir/regexp/encoding/utf8/utf8_regexp.h b/src/ir/regexp/encoding/utf8/utf8_regexp.h deleted file mode 100644 index 676759a..0000000 --- a/src/ir/regexp/encoding/utf8/utf8_regexp.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef _RE2C_IR_REGEXP_ENCODING_UTF8_REGEXP_ -#define _RE2C_IR_REGEXP_ENCODING_UTF8_REGEXP_ - -#include "src/ir/regexp/encoding/utf8/utf8.h" - -namespace re2c { - -class Range; -class RegExp; - -RegExp * UTF8Symbol(utf8::rune r); -RegExp * UTF8Range(const Range * r); - -} // namespace re2c - -#endif // _RE2C_IR_REGEXP_ENCODING_UTF8_REGEXP_ diff --git a/src/ir/regexp/fixed_length.cc b/src/ir/regexp/fixed_length.cc deleted file mode 100644 index e0fd7e0..0000000 --- a/src/ir/regexp/fixed_length.cc +++ /dev/null @@ -1,55 +0,0 @@ -#include "src/util/c99_stdint.h" - -#include "src/ir/regexp/regexp.h" -#include "src/ir/regexp/regexp_alt.h" -#include "src/ir/regexp/regexp_cat.h" -#include "src/ir/regexp/regexp_match.h" -#include "src/ir/regexp/regexp_null.h" - -namespace re2c -{ - -uint32_t RegExp::fixedLength () -{ - return ~0u; -} - -uint32_t AltOp::fixedLength () -{ - uint32_t l1 = exp1->fixedLength (); - uint32_t l2 = exp1->fixedLength (); - - if (l1 != l2 || l1 == ~0u) - { - return ~0u; - } - - return l1; -} - -uint32_t CatOp::fixedLength () -{ - const uint32_t l1 = exp1->fixedLength (); - if (l1 != ~0u) - { - const uint32_t l2 = exp2->fixedLength (); - if (l2 != ~0u) - { - return l1 + l2; - } - } - return ~0u; -} - -uint32_t MatchOp::fixedLength () -{ - return 1; -} - -uint32_t NullOp::fixedLength () -{ - return 0; -} - -} // end namespace re2c - diff --git a/src/ir/regexp/regexp.cc b/src/ir/regexp/regexp.cc deleted file mode 100644 index e5a7d9b..0000000 --- a/src/ir/regexp/regexp.cc +++ /dev/null @@ -1,241 +0,0 @@ -#include - -#include "src/conf/opt.h" -#include "src/conf/warn.h" -#include "src/globals.h" -#include "src/ir/regexp/empty_class_policy.h" -#include "src/ir/regexp/encoding/case.h" -#include "src/ir/regexp/encoding/enc.h" -#include "src/ir/regexp/encoding/utf16/utf16_regexp.h" -#include "src/ir/regexp/encoding/utf8/utf8_regexp.h" -#include "src/ir/regexp/regexp.h" -#include "src/ir/regexp/regexp_alt.h" -#include "src/ir/regexp/regexp_cat.h" -#include "src/ir/regexp/regexp_close.h" -#include "src/ir/regexp/regexp_match.h" -#include "src/ir/regexp/regexp_null.h" -#include "src/parse/scanner.h" -#include "src/util/range.h" - -namespace re2c -{ - -static MatchOp * merge (MatchOp * m1, MatchOp * m2); - -free_list RegExp::vFreeList; - -RegExp * doAlt (RegExp * e1, RegExp * e2) -{ - if (!e1) - { - return e2; - } - if (!e2) - { - return e1; - } - return new AltOp (e1, e2); -} - -RegExp * mkAlt (RegExp * e1, RegExp * e2) -{ - AltOp * a; - MatchOp * m1; - MatchOp * m2; - - a = dynamic_cast (e1); - if (a != NULL) - { - m1 = dynamic_cast (a->exp1); - if (m1 != NULL) - { - e1 = a->exp2; - } - } - else - { - m1 = dynamic_cast (e1); - if (m1 != NULL) - { - e1 = NULL; - } - } - a = dynamic_cast (e2); - if (a != NULL) - { - m2 = dynamic_cast (a->exp1); - if (m2 != NULL) - { - e2 = a->exp2; - } - } - else - { - m2 = dynamic_cast (e2); - if (m2 != NULL) - { - e2 = NULL; - } - } - - return doAlt (merge (m1, m2), doAlt (e1, e2)); -} - -MatchOp * merge (MatchOp * m1, MatchOp * m2) -{ - if (!m1) - { - return m2; - } - if (!m2) - { - return m1; - } - MatchOp * m = new MatchOp (Range::add (m1->match, m2->match)); - return m; -} - -RegExp * doCat (RegExp * e1, RegExp * e2) -{ - if (!e1) - { - return e2; - } - if (!e2) - { - return e1; - } - return new CatOp (e1, e2); -} - -RegExp *Scanner::schr(uint32_t c) const -{ - if (!opts->encoding.encode(c)) { - fatalf("Bad code point: '0x%X'", c); - } - switch (opts->encoding.type ()) { - case Enc::UTF16: return UTF16Symbol(c); - case Enc::UTF8: return UTF8Symbol(c); - default: return new MatchOp(Range::sym(c)); - } -} - -RegExp *Scanner::ichr(uint32_t c) const -{ - if (is_alpha(c)) { - RegExp *l = schr(to_lower_unsafe(c)); - RegExp *u = schr(to_upper_unsafe(c)); - return mkAlt(l, u); - } else { - return schr(c); - } -} - -RegExp *Scanner::cls(Range *r) const -{ - if (!r) - { - switch (opts->empty_class_policy) - { - case EMPTY_CLASS_MATCH_EMPTY: - warn.empty_class (get_line ()); - return new NullOp; - case EMPTY_CLASS_MATCH_NONE: - warn.empty_class (get_line ()); - break; - case EMPTY_CLASS_ERROR: - fatal ("empty character class"); - break; - } - } - - switch (opts->encoding.type ()) - { - case Enc::UTF16: return UTF16Range(r); - case Enc::UTF8: return UTF8Range(r); - default: return new MatchOp(r); - } -} - -RegExp * Scanner::mkDiff (RegExp * e1, RegExp * e2) const -{ - MatchOp * m1 = dynamic_cast (e1); - MatchOp * m2 = dynamic_cast (e2); - if (m1 == NULL || m2 == NULL) - { - fatal("can only difference char sets"); - } - Range * r = Range::sub (m1->match, m2->match); - - return cls(r); -} - -RegExp * Scanner::mkDot() const -{ - Range * full = opts->encoding.fullRange(); - uint32_t c = '\n'; - if (!opts->encoding.encode(c)) - fatalf("Bad code point: '0x%X'", c); - Range * ran = Range::sym (c); - Range * inv = Range::sub (full, ran); - - return cls(inv); -} - -/* - * Create a byte range that includes all possible input characters. - * This may include characters, which do not map to any valid symbol - * in current encoding. For encodings, which directly map symbols to - * input characters (ASCII, EBCDIC, UTF-32), it equals [^]. For other - * encodings (UTF-16, UTF-8), [^] and this range are different. - * - * Also note that default range doesn't respect encoding policy - * (the way invalid code points are treated). - */ -RegExp * Scanner::mkDefault() const -{ - Range * def = Range::ran (0, opts->encoding.nCodeUnits()); - return new MatchOp(def); -} - -/* - * note [counted repetition expansion] - * - * r{0} ;;= - * r{n} ::= r{n-1} r - * r{n,m} ::= r{n} (r{0} | ... | r{m-n}) - * r{n,} ::= r{n} r* - */ - -// see note [counted repetition expansion] -RegExp * repeat (RegExp * e, uint32_t n) -{ - RegExp * r = NULL; - for (uint32_t i = 0; i < n; ++i) - { - r = doCat (r, e); - } - return r; -} - -// see note [counted repetition expansion] -RegExp * repeat_from_to (RegExp * e, uint32_t n, uint32_t m) -{ - RegExp * r1 = repeat (e, n); - RegExp * r2 = NULL; - for (uint32_t i = n; i < m; ++i) - { - r2 = mkAlt (new NullOp, doCat (e, r2)); - } - return doCat (r1, r2); -} - -// see note [counted repetition expansion] -RegExp * repeat_from (RegExp * e, uint32_t n) -{ - RegExp * r1 = repeat (e, n); - RegExp * r2 = new CloseOp (e); - return doCat (r1, r2); -} - -} // namespace re2c diff --git a/src/ir/regexp/regexp.h b/src/ir/regexp/regexp.h deleted file mode 100644 index 5d344dd..0000000 --- a/src/ir/regexp/regexp.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef _RE2C_IR_REGEXP_REGEXP_ -#define _RE2C_IR_REGEXP_REGEXP_ - -#include "src/util/c99_stdint.h" -#include -#include -#include - -#include "src/util/free_list.h" -#include "src/util/forbid_copy.h" - -namespace re2c -{ - -struct nfa_state_t; -struct nfa_t; - -typedef std::vector charset_t; - -class RegExp -{ -public: - static free_list vFreeList; - - inline RegExp () - { - vFreeList.insert (this); - } - inline virtual ~RegExp () - { - vFreeList.erase (this); - } - virtual void split (std::set &) = 0; - virtual uint32_t calc_size() const = 0; - virtual uint32_t fixedLength (); - virtual nfa_state_t *compile(nfa_t &nfa, nfa_state_t *n) = 0; - virtual void display (std::ostream &) const = 0; - friend std::ostream & operator << (std::ostream & o, const RegExp & re); - - FORBID_COPY (RegExp); -}; - -RegExp * doAlt (RegExp * e1, RegExp * e2); -RegExp * mkAlt (RegExp * e1, RegExp * e2); -RegExp * doCat (RegExp * e1, RegExp * e2); -RegExp * repeat (RegExp * e, uint32_t n); -RegExp * repeat_from_to (RegExp * e, uint32_t n, uint32_t m); -RegExp * repeat_from (RegExp * e, uint32_t n); - -} // end namespace re2c - -#endif // _RE2C_IR_REGEXP_REGEXP_ diff --git a/src/ir/regexp/regexp_alt.h b/src/ir/regexp/regexp_alt.h deleted file mode 100644 index 6f1c8ea..0000000 --- a/src/ir/regexp/regexp_alt.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef _RE2C_IR_REGEXP_REGEXP_ALT_ -#define _RE2C_IR_REGEXP_REGEXP_ALT_ - -#include "src/ir/regexp/regexp.h" - -namespace re2c -{ - -class AltOp: public RegExp -{ - RegExp * exp1; - RegExp * exp2; - -public: - inline AltOp (RegExp * e1, RegExp * e2) - : exp1 (e1) - , exp2 (e2) - {} - void split (std::set &); - uint32_t calc_size() const; - uint32_t fixedLength (); - nfa_state_t *compile(nfa_t &nfa, nfa_state_t *n); - void display (std::ostream & o) const; - friend RegExp * mkAlt (RegExp *, RegExp *); - - FORBID_COPY (AltOp); -}; - -} // end namespace re2c - -#endif // _RE2C_IR_REGEXP_REGEXP_ALT_ diff --git a/src/ir/regexp/regexp_cat.h b/src/ir/regexp/regexp_cat.h deleted file mode 100644 index d817621..0000000 --- a/src/ir/regexp/regexp_cat.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef _RE2C_IR_REGEXP_REGEXP_CAT_ -#define _RE2C_IR_REGEXP_REGEXP_CAT_ - -#include "src/ir/regexp/regexp.h" - -namespace re2c -{ - -class CatOp: public RegExp -{ - RegExp * exp1; - RegExp * exp2; - -public: - inline CatOp (RegExp * e1, RegExp * e2) - : exp1 (e1) - , exp2 (e2) - {} - void split (std::set &); - uint32_t calc_size() const; - uint32_t fixedLength (); - nfa_state_t *compile(nfa_t &nfa, nfa_state_t *n); - void display (std::ostream & o) const; - - FORBID_COPY (CatOp); -}; - -} // end namespace re2c - -#endif // _RE2C_IR_REGEXP_REGEXP_CAT_ diff --git a/src/ir/regexp/regexp_close.h b/src/ir/regexp/regexp_close.h deleted file mode 100644 index 02bea20..0000000 --- a/src/ir/regexp/regexp_close.h +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef _RE2C_IR_REGEXP_REGEXP_CLOSE_ -#define _RE2C_IR_REGEXP_REGEXP_CLOSE_ - -#include "src/ir/regexp/regexp.h" - -namespace re2c -{ - -class CloseOp: public RegExp -{ - RegExp * exp; - -public: - inline CloseOp (RegExp * e) - : exp (e) - {} - void split (std::set &); - uint32_t calc_size() const; - nfa_state_t *compile(nfa_t &nfa, nfa_state_t *n); - void display (std::ostream & o) const; - - FORBID_COPY (CloseOp); -}; - -} // end namespace re2c - -#endif // _RE2C_IR_REGEXP_REGEXP_CLOSE_ diff --git a/src/ir/regexp/regexp_match.h b/src/ir/regexp/regexp_match.h deleted file mode 100644 index 903697b..0000000 --- a/src/ir/regexp/regexp_match.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef _RE2C_IR_REGEXP_REGEXP_MATCH_ -#define _RE2C_IR_REGEXP_REGEXP_MATCH_ - -#include "src/ir/regexp/regexp.h" -#include "src/util/range.h" - -namespace re2c -{ - -class MatchOp: public RegExp -{ -public: - Range * match; - - inline MatchOp (Range * m) - : match (m) - {} - void split (std::set &); - uint32_t calc_size() const; - uint32_t fixedLength (); - nfa_state_t *compile(nfa_t &nfa, nfa_state_t *n); - void display (std::ostream & o) const; - - FORBID_COPY (MatchOp); -}; - -} // end namespace re2c - -#endif // _RE2C_IR_REGEXP_REGEXP_MATCH_ diff --git a/src/ir/regexp/regexp_null.h b/src/ir/regexp/regexp_null.h deleted file mode 100644 index 8168dbe..0000000 --- a/src/ir/regexp/regexp_null.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef _RE2C_IR_REGEXP_REGEXP_NULL_ -#define _RE2C_IR_REGEXP_REGEXP_NULL_ - -#include "src/ir/regexp/regexp.h" - -namespace re2c -{ - -class NullOp: public RegExp -{ -public: - void split (std::set &); - uint32_t calc_size() const; - uint32_t fixedLength (); - nfa_state_t *compile(nfa_t &nfa, nfa_state_t *n); - void display (std::ostream & o) const; -}; - -} // end namespace re2c - -#endif // _RE2C_IR_REGEXP_REGEXP_NULL_ diff --git a/src/ir/regexp/regexp_rule.h b/src/ir/regexp/regexp_rule.h deleted file mode 100644 index 1519fa2..0000000 --- a/src/ir/regexp/regexp_rule.h +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef _RE2C_IR_REGEXP_REGEXP_RULE_ -#define _RE2C_IR_REGEXP_REGEXP_RULE_ - -#include - -#include "src/ir/regexp/regexp.h" -#include "src/ir/rule_rank.h" -#include "src/parse/code.h" - -namespace re2c -{ - -class RuleOp: public RegExp -{ -public: - const Loc loc; - -private: - RegExp * exp; - -public: - RegExp * ctx; - rule_rank_t rank; - const Code * code; - const std::string newcond; - - inline RuleOp - ( const Loc & l - , RegExp * r1 - , RegExp * r2 - , rule_rank_t r - , const Code * c - , const std::string * cond - ) - : loc (l) - , exp (r1) - , ctx (r2) - , rank (r) - , code (c) - , newcond (cond ? *cond : "") - {} - void display (std::ostream & o) const; - void split (std::set &); - uint32_t calc_size() const; - nfa_state_t *compile(nfa_t &nfa, nfa_state_t *n); - - FORBID_COPY (RuleOp); -}; - -} // end namespace re2c - -#endif // _RE2C_IR_REGEXP_REGEXP_RULE_ diff --git a/src/ir/rule_rank.cc b/src/ir/rule_rank.cc deleted file mode 100644 index 12d2de8..0000000 --- a/src/ir/rule_rank.cc +++ /dev/null @@ -1,68 +0,0 @@ -#include -#include -#include - -#include "src/ir/rule_rank.h" - -namespace re2c -{ - -const uint32_t rule_rank_t::NONE = std::numeric_limits::max(); -const uint32_t rule_rank_t::DEF = rule_rank_t::NONE - 1; - -rule_rank_t::rule_rank_t () - : value (0) -{} - -void rule_rank_t::inc () -{ - assert (value < DEF - 1); - ++value; -} - -rule_rank_t rule_rank_t::none () -{ - rule_rank_t r; - r.value = NONE; - return r; -} - -rule_rank_t rule_rank_t::def () -{ - rule_rank_t r; - r.value = DEF; - return r; -} - -bool rule_rank_t::is_none () const -{ - return value == NONE; -} - -bool rule_rank_t::is_def () const -{ - return value == DEF; -} - -bool rule_rank_t::operator < (const rule_rank_t & r) const -{ - return value < r.value; -} - -bool rule_rank_t::operator == (const rule_rank_t & r) const -{ - return value == r.value; -} - -std::ostream & operator << (std::ostream & o, rule_rank_t r) -{ - o << r.value; - return o; -} - -uint32_t rule_rank_t::uint32 () const -{ - return value; -} - -} // namespace re2c diff --git a/src/ir/rule_rank.h b/src/ir/rule_rank.h deleted file mode 100644 index ca19cb9..0000000 --- a/src/ir/rule_rank.h +++ /dev/null @@ -1,44 +0,0 @@ -#ifndef _RE2C_IR_RULE_RANK_ -#define _RE2C_IR_RULE_RANK_ - -#include "src/util/c99_stdint.h" -#include - -namespace re2c -{ - -template class counter_t; - -// rule rank public API: -// - get rule rank corresponding to nonexistent/default rule -// - check if rank corresponds to nonexistent/default rule -// - compare ranks -// - output rank to std::ostream -// -// rule rank private API (for rule rank counter): -// - get first rank -// - get next rank -class rule_rank_t -{ - static const uint32_t NONE; - static const uint32_t DEF; - uint32_t value; - rule_rank_t (); - void inc (); - -public: - static rule_rank_t none (); - static rule_rank_t def (); - bool is_none () const; - bool is_def () const; - bool operator < (const rule_rank_t & r) const; - bool operator == (const rule_rank_t & r) const; - friend std::ostream & operator << (std::ostream & o, rule_rank_t r); - uint32_t uint32 () const; - - friend class counter_t; -}; - -} // namespace re2c - -#endif // _RE2C_IR_RULE_RANK_ diff --git a/src/ir/skeleton/control_flow.cc b/src/ir/skeleton/control_flow.cc deleted file mode 100644 index 7416686..0000000 --- a/src/ir/skeleton/control_flow.cc +++ /dev/null @@ -1,61 +0,0 @@ -#include -#include -#include - -#include "src/conf/warn.h" -#include "src/globals.h" -#include "src/ir/rule_rank.h" -#include "src/ir/skeleton/path.h" -#include "src/ir/skeleton/skeleton.h" -#include "src/ir/skeleton/way.h" -#include "src/util/u32lim.h" - -namespace re2c -{ - -// We don't need all patterns that cause undefined behaviour. -// We only need some examples, the shorter the better. -// See also note [counting skeleton edges]. -void Node::naked_ways (way_t & prefix, std::vector & ways, nakeds_t &size) -{ - if (!rule.rank.is_none ()) - { - return; - } - else if (end ()) - { - ways.push_back (prefix); - size = size + nakeds_t::from64(prefix.size ()); - } - else if (loop < 2) - { - local_inc _ (loop); - for (arcsets_t::iterator i = arcsets.begin (); - i != arcsets.end () && !size.overflow (); ++i) - { - prefix.push_back (&i->second); - i->first->naked_ways (prefix, ways, size); - prefix.pop_back (); - } - } -} - -void Skeleton::warn_undefined_control_flow () -{ - way_t prefix; - std::vector ways; - Node::nakeds_t size = Node::nakeds_t::from32(0u); - - nodes->naked_ways (prefix, ways, size); - - if (!ways.empty ()) - { - warn.undefined_control_flow (line, cond, ways, size.overflow ()); - } - else if (size.overflow ()) - { - warn.fail (Warn::UNDEFINED_CONTROL_FLOW, line, "DFA is too large to check undefined control flow"); - } -} - -} // namespace re2c diff --git a/src/ir/skeleton/generate_code.cc b/src/ir/skeleton/generate_code.cc deleted file mode 100644 index 38940ae..0000000 --- a/src/ir/skeleton/generate_code.cc +++ /dev/null @@ -1,323 +0,0 @@ -#include "src/util/c99_stdint.h" -#include -#include -#include -#include - -#include "src/codegen/bitmap.h" -#include "src/codegen/output.h" -#include "src/conf/opt.h" -#include "src/globals.h" -#include "src/ir/regexp/encoding/enc.h" -#include "src/ir/rule_rank.h" -#include "src/ir/skeleton/skeleton.h" - -namespace re2c -{ - -static void exact_uint (OutputFile & o, size_t width) -{ - if (width == sizeof (char)) - { - o.ws("unsigned char"); - } - else if (width == sizeof (short)) - { - o.ws("unsigned short"); - } - else if (width == sizeof (int)) - { - o.ws("unsigned int"); - } - else if (width == sizeof (long)) - { - o.ws("unsigned long"); - } - else - { - o.ws("uint").wu64 (width * 8).ws("_t"); - } -} - -static void from_le(OutputFile &o, uint32_t ind, size_t size, const char *expr) -{ - o.ws("\n").wind(ind).ws("/* from little-endian to host-endian */"); - o.ws("\n").wind(ind).ws("unsigned char *p = (unsigned char*)&").ws(expr).ws(";"); - o.ws("\n").wind(ind).ws(expr).ws(" = p[0]"); - for (uint32_t i = 1; i < size; ++i) - { - o.ws(" + (p[").wu32(i).ws("] << ").wu32(i * 8).ws("u)"); - } - o.ws(";"); -} - -void Skeleton::emit_prolog (OutputFile & o) -{ - o.ws("\n#include "); - o.ws("\n#include /* malloc, free */"); - o.ws("\n"); - o.ws("\nstatic void *read_file"); - o.ws("\n").wind(1).ws("( const char *fname"); - o.ws("\n").wind(1).ws(", size_t unit"); - o.ws("\n").wind(1).ws(", size_t padding"); - o.ws("\n").wind(1).ws(", size_t *pfsize"); - o.ws("\n").wind(1).ws(")"); - o.ws("\n{"); - o.ws("\n").wind(1).ws("void *buffer = NULL;"); - o.ws("\n").wind(1).ws("size_t fsize = 0;"); - o.ws("\n"); - o.ws("\n").wind(1).ws("/* open file */"); - o.ws("\n").wind(1).ws("FILE *f = fopen(fname, \"rb\");"); - o.ws("\n").wind(1).ws("if(f == NULL) {"); - o.ws("\n").wind(2).ws("goto error;"); - o.ws("\n").wind(1).ws("}"); - o.ws("\n"); - o.ws("\n").wind(1).ws("/* get file size */"); - o.ws("\n").wind(1).ws("fseek(f, 0, SEEK_END);"); - o.ws("\n").wind(1).ws("fsize = (size_t) ftell(f) / unit;"); - o.ws("\n").wind(1).ws("fseek(f, 0, SEEK_SET);"); - o.ws("\n"); - o.ws("\n").wind(1).ws("/* allocate memory for file and padding */"); - o.ws("\n").wind(1).ws("buffer = malloc(unit * (fsize + padding));"); - o.ws("\n").wind(1).ws("if (buffer == NULL) {"); - o.ws("\n").wind(2).ws("goto error;"); - o.ws("\n").wind(1).ws("}"); - o.ws("\n"); - o.ws("\n").wind(1).ws("/* read the whole file in memory */"); - o.ws("\n").wind(1).ws("if (fread(buffer, unit, fsize, f) != fsize) {"); - o.ws("\n").wind(2).ws("goto error;"); - o.ws("\n").wind(1).ws("}"); - o.ws("\n"); - o.ws("\n").wind(1).ws("fclose(f);"); - o.ws("\n").wind(1).ws("*pfsize = fsize;"); - o.ws("\n").wind(1).ws("return buffer;"); - o.ws("\n"); - o.ws("\nerror:"); - o.ws("\n").wind(1).ws("fprintf(stderr, \"error: cannot read file '%s'\\n\", fname);"); - o.ws("\n").wind(1).ws("free(buffer);"); - o.ws("\n").wind(1).ws("if (f != NULL) {"); - o.ws("\n").wind(2).ws("fclose(f);"); - o.ws("\n").wind(1).ws("}"); - o.ws("\n").wind(1).ws("return NULL;"); - o.ws("\n}"); - o.ws("\n"); -} - -void Skeleton::emit_start - ( OutputFile & o - , size_t maxfill - , bool backup - , bool backupctx - , bool accept - ) const -{ - const size_t sizeof_cunit = opts->encoding.szCodeUnit(); - const uint32_t default_rule = rule2key (rule_rank_t::none ()); - - o.ws("\n#define YYCTYPE "); - exact_uint (o, sizeof_cunit); - o.ws("\n#define YYKEYTYPE "); - exact_uint (o, sizeof_key); - o.ws("\n#define YYPEEK() *cursor"); - o.ws("\n#define YYSKIP() ++cursor"); - if (backup) - { - o.ws("\n#define YYBACKUP() marker = cursor"); - o.ws("\n#define YYRESTORE() cursor = marker"); - } - if (backupctx) - { - o.ws("\n#define YYBACKUPCTX() ctxmarker = cursor"); - o.ws("\n#define YYRESTORECTX() cursor = ctxmarker"); - } - o.ws("\n#define YYLESSTHAN(n) (limit - cursor) < n"); - o.ws("\n#define YYFILL(n) { break; }"); - o.ws("\n"); - o.ws("\nstatic int action_").wstring(name); - o.ws("\n").wind(1).ws("( unsigned int i"); - o.ws("\n").wind(1).ws(", const YYKEYTYPE *keys"); - o.ws("\n").wind(1).ws(", const YYCTYPE *start"); - o.ws("\n").wind(1).ws(", const YYCTYPE *token"); - o.ws("\n").wind(1).ws(", const YYCTYPE **cursor"); - o.ws("\n").wind(1).ws(", YYKEYTYPE rule_act"); - o.ws("\n").wind(1).ws(")"); - o.ws("\n{"); - o.ws("\n").wind(1).ws("const long pos = token - start;"); - o.ws("\n").wind(1).ws("const long len_act = *cursor - token;"); - o.ws("\n").wind(1).ws("const long len_exp = (long) keys [3 * i + 1];"); - o.ws("\n").wind(1).ws("const YYKEYTYPE rule_exp = keys [3 * i + 2];"); - o.ws("\n").wind(1).ws("if (rule_exp == ").wu32(default_rule).ws(") {"); - o.ws("\n").wind(2).ws("fprintf"); - o.ws("\n").wind(3).ws("( stderr"); - o.ws("\n").wind(3).ws(", \"warning: lex_").wstring(name).ws(": control flow is undefined for input\""); - o.ws("\n").wind(4).ws("\" at position %ld, rerun re2c with '-W'\\n\""); - o.ws("\n").wind(3).ws(", pos"); - o.ws("\n").wind(3).ws(");"); - o.ws("\n").wind(1).ws("}"); - o.ws("\n").wind(1).ws("if (len_act == len_exp && rule_act == rule_exp) {"); - o.ws("\n").wind(2).ws("const YYKEYTYPE offset = keys[3 * i];"); - o.ws("\n").wind(2).ws("*cursor = token + offset;"); - o.ws("\n").wind(2).ws("return 0;"); - o.ws("\n").wind(1).ws("} else {"); - o.ws("\n").wind(2).ws("fprintf"); - o.ws("\n").wind(3).ws("( stderr"); - o.ws("\n").wind(3).ws(", \"error: lex_").wstring(name).ws(": at position %ld (iteration %u):\\n\""); - o.ws("\n").wind(4).ws("\"\\texpected: match length %ld, rule %u\\n\""); - o.ws("\n").wind(4).ws("\"\\tactual: match length %ld, rule %u\\n\""); - o.ws("\n").wind(3).ws(", pos"); - o.ws("\n").wind(3).ws(", i"); - o.ws("\n").wind(3).ws(", len_exp"); - o.ws("\n").wind(3).ws(", rule_exp"); - o.ws("\n").wind(3).ws(", len_act"); - o.ws("\n").wind(3).ws(", rule_act"); - o.ws("\n").wind(3).ws(");"); - o.ws("\n").wind(2).ws("return 1;"); - o.ws("\n").wind(1).ws("}"); - o.ws("\n}"); - o.ws("\n"); - o.ws("\nint lex_").wstring(name).ws("()"); - o.ws("\n{"); - o.ws("\n").wind(1).ws("const size_t padding = ").wu64(maxfill).ws("; /* YYMAXFILL */"); - o.ws("\n").wind(1).ws("int status = 0;"); - o.ws("\n").wind(1).ws("size_t input_len = 0;"); - o.ws("\n").wind(1).ws("size_t keys_count = 0;"); - o.ws("\n").wind(1).ws("YYCTYPE *input = NULL;"); - o.ws("\n").wind(1).ws("YYKEYTYPE *keys = NULL;"); - o.ws("\n").wind(1).ws("const YYCTYPE *cursor = NULL;"); - o.ws("\n").wind(1).ws("const YYCTYPE *limit = NULL;"); - o.ws("\n").wind(1).ws("const YYCTYPE *token = NULL;"); - o.ws("\n").wind(1).ws("const YYCTYPE *eof = NULL;"); - o.ws("\n").wind(1).ws("unsigned int i = 0;"); - o.ws("\n"); - o.ws("\n").wind(1).ws("input = (YYCTYPE *) read_file"); - o.ws("\n").wind(2).ws("(\"").wstring(o.file_name).ws(".").wstring(name).ws(".input\""); - o.ws("\n").wind(2).ws(", sizeof (YYCTYPE)"); - o.ws("\n").wind(2).ws(", padding"); - o.ws("\n").wind(2).ws(", &input_len"); - o.ws("\n").wind(2).ws(");"); - o.ws("\n").wind(1).ws("if (input == NULL) {"); - o.ws("\n").wind(2).ws("status = 1;"); - o.ws("\n").wind(2).ws("goto end;"); - o.ws("\n").wind(1).ws("}"); - o.ws("\n"); - if (sizeof_cunit > 1) - { - o.ws("\n").wind(1).ws("for (i = 0; i < input_len; ++i) {"); - from_le(o, 2, sizeof_cunit, "input[i]"); - o.ws("\n").wind(1).ws("}"); - o.ws("\n"); - } - o.ws("\n").wind(1).ws("keys = (YYKEYTYPE *) read_file"); - o.ws("\n").wind(2).ws("(\"").wstring(o.file_name).ws(".").wstring(name).ws(".keys\""); - o.ws("\n").wind(2).ws(", 3 * sizeof (YYKEYTYPE)"); - o.ws("\n").wind(2).ws(", 0"); - o.ws("\n").wind(2).ws(", &keys_count"); - o.ws("\n").wind(2).ws(");"); - o.ws("\n").wind(1).ws("if (keys == NULL) {"); - o.ws("\n").wind(2).ws("status = 1;"); - o.ws("\n").wind(2).ws("goto end;"); - o.ws("\n").wind(1).ws("}"); - o.ws("\n"); - if (sizeof_key > 1) - { - o.ws("\n").wind(1).ws("for (i = 0; i < 3 * keys_count; ++i) {"); - from_le(o, 2, sizeof_key, "keys[i]"); - o.ws("\n").wind(1).ws("}"); - o.ws("\n"); - } - o.ws("\n").wind(1).ws("cursor = input;"); - o.ws("\n").wind(1).ws("limit = input + input_len + padding;"); - o.ws("\n").wind(1).ws("eof = input + input_len;"); - o.ws("\n"); - o.ws("\n").wind(1).ws("for (i = 0; status == 0 && i < keys_count; ++i) {"); - o.ws("\n").wind(2).ws("token = cursor;"); - if (backup) - { - o.ws("\n").wind(2).ws("const YYCTYPE *marker = NULL;"); - } - if (backupctx) - { - o.ws("\n").wind(2).ws("const YYCTYPE *ctxmarker = NULL;"); - } - o.ws("\n").wind(2).ws("YYCTYPE yych;"); - if (accept) - { - o.ws("\n").wind(2).ws("unsigned int yyaccept = 0;"); - } - o.ws("\n"); - if (opts->bFlag && BitMap::first) - { - BitMap::gen (o, 2, 0, std::min (0x100u, opts->encoding.nCodeUnits ())); - } - o.ws("\n"); -} - -void Skeleton::emit_end - ( OutputFile & o - , bool backup - , bool backupctx - ) const -{ - o.ws("\n").wind(1).ws("}"); - o.ws("\n").wind(1).ws("if (status == 0) {"); - o.ws("\n").wind(2).ws("if (cursor != eof) {"); - o.ws("\n").wind(3).ws("status = 1;"); - o.ws("\n").wind(3).ws("const long pos = token - input;"); - o.ws("\n").wind(3).ws("fprintf(stderr, \"error: lex_").wstring(name).ws(": unused input strings left at position %ld\\n\", pos);"); - o.ws("\n").wind(2).ws("}"); - o.ws("\n").wind(2).ws("if (i != keys_count) {"); - o.ws("\n").wind(3).ws("status = 1;"); - o.ws("\n").wind(3).ws("fprintf(stderr, \"error: lex_").wstring(name).ws(": unused keys left after %u iterations\\n\", i);"); - o.ws("\n").wind(2).ws("}"); - o.ws("\n").wind(1).ws("}"); - o.ws("\n"); - o.ws("\nend:"); - o.ws("\n").wind(1).ws("free(input);"); - o.ws("\n").wind(1).ws("free(keys);"); - o.ws("\n"); - o.ws("\n").wind(1).ws("return status;"); - o.ws("\n}"); - o.ws("\n"); - o.ws("\n#undef YYCTYPE"); - o.ws("\n#undef YYKEYTYPE"); - o.ws("\n#undef YYPEEK"); - o.ws("\n#undef YYSKIP"); - if (backup) - { - o.ws("\n#undef YYBACKUP"); - o.ws("\n#undef YYRESTORE"); - } - if (backupctx) - { - o.ws("\n#undef YYBACKUPCTX"); - o.ws("\n#undef YYRESTORECTX"); - } - o.ws("\n#undef YYLESSTHAN"); - o.ws("\n#undef YYFILL"); - o.ws("\n"); -} - -void Skeleton::emit_epilog (OutputFile & o, const std::set & names) -{ - o.ws("\n").ws("int main()"); - o.ws("\n").ws("{"); - - for (std::set::const_iterator i = names.begin (); i != names.end (); ++i) - { - o.ws("\n").wind(1).ws("if(lex_").wstring(*i).ws("() != 0) {"); - o.ws("\n").wind(2).ws("return 1;"); - o.ws("\n").wind(1).ws("}"); - } - - o.ws("\n").wind(1).ws("return 0;"); - o.ws("\n}"); - o.ws("\n"); -} - -void Skeleton::emit_action (OutputFile & o, uint32_t ind, rule_rank_t rank) const -{ - o.wind(ind).ws("status = action_").wstring(name).ws("(i, keys, input, token, &cursor, ").wu32(rule2key (rank)).ws(");\n"); - o.wind(ind).ws("continue;\n"); -} - -} // namespace re2c diff --git a/src/ir/skeleton/generate_data.cc b/src/ir/skeleton/generate_data.cc deleted file mode 100644 index 60af837..0000000 --- a/src/ir/skeleton/generate_data.cc +++ /dev/null @@ -1,215 +0,0 @@ -#include "src/util/c99_stdint.h" -#include -#include -#include -#include -#include -#include -#include -#include - -#include "src/conf/msg.h" -#include "src/conf/opt.h" -#include "src/globals.h" -#include "src/ir/regexp/encoding/enc.h" -#include "src/ir/rule_rank.h" -#include "src/ir/skeleton/path.h" -#include "src/ir/skeleton/skeleton.h" -#include "src/util/u32lim.h" - -namespace re2c -{ - -template - static Node::covers_t cover_one (FILE * input, FILE * keys, const path_t & path); - -/* - * note [generating skeleton path cover] - * - * With --skeleton switch we need to generate lots of data: strings that - * correspond to various paths in DFA and match given regular expression. - * We try to generate path cover (a set of paths that cover all skeleton - * arcs at least once). Generation must stop as soon as the size of path - * cover exceeds limit (in which case we'll only get a partial path cover). - * - * The algorithm walks graph nodes in deep-first order and assigns suffix - * to each node (a path from this node to end node). In order to calculate - * suffix for a given node the algorithm must know suffix for any child - * node (end nodes are assigned empty suffix at start). Suffix is only - * calculated once for each node and then reused as much times as the node - * is visited. This is what reduces search space. - * - * The algorithm calculates prefix (multipath to current node). If current - * node has already been assigned suffix, the algorithm immediately - * calculates path cover from prefix and suffix. Otherwise it recurses to - * child nodes (updating prefix on the go). - * - * The algorithm avoids eternal loops by maintaining loop counter for each - * node. Loop counter is incremented on recursive enter and decremented on - * recursive return. If loop counter is greater than 1, current branch is - * abandoned and recursion returns immediately. - * - * See also note [counting skeleton edges]. - * - */ -template - void Node::cover (path_t & prefix, FILE * input, FILE * keys, covers_t &size) -{ - if (end () && suffix == NULL) - { - suffix = new path_t (rule, ctx); - } - if (suffix != NULL) - { - prefix.append (suffix); - size = size + cover_one (input, keys, prefix); - } - else if (loop < 2) - { - local_inc _ (loop); - for (arcs_t::iterator i = arcs.begin (); - i != arcs.end () && !size.overflow(); ++i) - { - path_t new_prefix = prefix; - new_prefix.extend (i->first->rule, i->first->ctx, &i->second); - i->first->cover (new_prefix, input, keys, size); - if (i->first->suffix != NULL && suffix == NULL) - { - suffix = new path_t (rule, ctx); - suffix->extend (i->first->rule, i->first->ctx, &i->second); - suffix->append (i->first->suffix); - } - } - } -} - -template - void Skeleton::generate_paths_cunit_key (FILE * input, FILE * keys) -{ - path_t prefix (nodes->rule, nodes->ctx); - Node::covers_t size = Node::covers_t::from32(0u); - - nodes->cover (prefix, input, keys, size); - - if (size.overflow ()) - { - warning - ( NULL - , line - , false - , "DFA %sis too large: can only generate partial path cover" - , incond (cond).c_str () - ); - } -} - -template - void Skeleton::generate_paths_cunit (FILE * input, FILE * keys) -{ - switch (sizeof_key) - { - case 4: generate_paths_cunit_key (input, keys); break; - case 2: generate_paths_cunit_key (input, keys); break; - case 1: generate_paths_cunit_key (input, keys); break; - } -} - -void Skeleton::generate_paths (FILE * input, FILE * keys) -{ - switch (opts->encoding.szCodeUnit ()) - { - case 4: generate_paths_cunit (input, keys); break; - case 2: generate_paths_cunit (input, keys); break; - case 1: generate_paths_cunit (input, keys); break; - } -} - -void Skeleton::emit_data (const char * fname) -{ - const std::string input_name = std::string (fname) + "." + name + ".input"; - FILE * input = fopen (input_name.c_str (), "wb"); - if (!input) - { - error ("cannot open file: %s", input_name.c_str ()); - exit (1); - } - const std::string keys_name = std::string (fname) + "." + name + ".keys"; - FILE * keys = fopen (keys_name.c_str (), "wb"); - if (!keys) - { - error ("cannot open file: %s", keys_name.c_str ()); - exit (1); - } - - generate_paths (input, keys); - - fclose (input); - fclose (keys); -} - -template static uintn_t to_le(uintn_t n) -{ - uintn_t m; - uint8_t *p = reinterpret_cast(&m); - for (size_t i = 0; i < sizeof(uintn_t); ++i) - { - p[i] = static_cast(n >> (i * 8)); - } - return m; -} - -template - static void keygen (FILE * f, size_t count, size_t len, size_t len_match, rule_rank_t match) -{ - const key_t m = Skeleton::rule2key (match); - - const size_t keys_size = 3 * count; - key_t * keys = new key_t [keys_size]; - for (uint32_t i = 0; i < keys_size;) - { - keys[i++] = to_le(static_cast (len)); - keys[i++] = to_le(static_cast (len_match)); - keys[i++] = to_le(m); - } - fwrite (keys, sizeof (key_t), keys_size, f); - delete [] keys; -} - -template - static Node::covers_t cover_one (FILE * input, FILE * keys, const path_t & path) -{ - const size_t len = path.len (); - - size_t count = 0; - for (size_t i = 0; i < len; ++i) - { - count = std::max (count, path[i]->size ()); - } - - const Node::covers_t size = Node::covers_t::from64(len) * Node::covers_t::from64(count); - if (!size.overflow ()) - { - // input - const size_t buffer_size = size.uint32 (); - cunit_t * buffer = new cunit_t [buffer_size]; - for (size_t i = 0; i < len; ++i) - { - const std::vector & arc = *path[i]; - const size_t width = arc.size (); - for (size_t j = 0; j < count; ++j) - { - const size_t k = j % width; - buffer[j * len + i] = to_le(static_cast (arc[k])); - } - } - fwrite (buffer, sizeof (cunit_t), buffer_size, input); - delete [] buffer; - - // keys - keygen (keys, count, len, path.len_matching (), path.match ()); - } - - return size; -} - -} // namespace re2c diff --git a/src/ir/skeleton/match_empty.cc b/src/ir/skeleton/match_empty.cc deleted file mode 100644 index 16fba61..0000000 --- a/src/ir/skeleton/match_empty.cc +++ /dev/null @@ -1,49 +0,0 @@ -#include -#include - -#include "src/conf/warn.h" -#include "src/globals.h" -#include "src/ir/rule_rank.h" -#include "src/ir/skeleton/path.h" -#include "src/ir/skeleton/skeleton.h" -#include "src/parse/rules.h" - -namespace re2c -{ - -void Skeleton::warn_match_empty () -{ - Node & head = nodes[0]; - - head.calc_reachable (); - const std::set & reach = head.reachable; - - // warn about rules that match empty string - if (!head.rule.rank.is_none ()) - { - bool reachable = head.end (); - for (std::set::const_iterator i = reach.begin (); - !reachable && i != reach.end (); ++i) - { - reachable |= i->rank.is_none (); - } - if (reachable) - { - warn.match_empty_string (rules[head.rule.rank].line); - } - } - - // warn about rules that match empty string with nonempty trailing context - if (head.ctx) - { - for (std::set::const_iterator i = reach.begin (); i != reach.end (); ++i) - { - if (i->restorectx) - { - warn.match_empty_string (rules[i->rank].line); - } - } - } -} - -} // namespace re2c diff --git a/src/ir/skeleton/maxlen.cc b/src/ir/skeleton/maxlen.cc deleted file mode 100644 index 3f1d933..0000000 --- a/src/ir/skeleton/maxlen.cc +++ /dev/null @@ -1,50 +0,0 @@ -#include "src/util/c99_stdint.h" -#include -#include -#include -#include - -#include "src/ir/skeleton/skeleton.h" - -namespace re2c -{ - -// 0 < DIST_MAX < DIST_ERROR <= std::numeric_limits::max() -const uint32_t Node::DIST_ERROR = std::numeric_limits::max(); -const uint32_t Node::DIST_MAX = DIST_ERROR - 1; - -// different from YYMAXFILL calculation -// in the way it handles loops and empty regexp -void Node::calc_dist () -{ - if (dist != DIST_ERROR) - { - return; - } - else if (end ()) - { - dist = 0; - } - else if (loop < 2) - { - local_inc _ (loop); - for (arcs_t::iterator i = arcs.begin (); i != arcs.end (); ++i) - { - i->first->calc_dist (); - if (i->first->dist != DIST_ERROR) - { - if (dist == DIST_ERROR) - { - dist = i->first->dist; - } - else - { - dist = std::max (dist, i->first->dist); - } - } - } - dist = std::min (dist + 1, DIST_MAX); - } -} - -} // namespace re2c diff --git a/src/ir/skeleton/path.h b/src/ir/skeleton/path.h deleted file mode 100644 index d09861e..0000000 --- a/src/ir/skeleton/path.h +++ /dev/null @@ -1,103 +0,0 @@ -#ifndef _RE2C_IR_SKELETON_PATH_ -#define _RE2C_IR_SKELETON_PATH_ - -#include - -#include "src/ir/rule_rank.h" -#include "src/util/c99_stdint.h" - -namespace re2c -{ - -struct rule_t -{ - rule_rank_t rank; - bool restorectx; - - rule_t (rule_rank_t r, bool c) - : rank (r) - , restorectx (c) - {} - - // needed by STL containers - // same as 'std::pair' comparator - bool operator < (const rule_t & r) const - { - return rank < r.rank - || (!(r.rank < rank) && restorectx < r.restorectx); - } -}; - -class path_t -{ -public: - typedef std::vector arc_t; - -private: - std::vector arcs; - - rule_t rule; - size_t rule_pos; - - bool ctx; - size_t ctx_pos; - -public: - explicit path_t (rule_t r, bool c) - : arcs () - , rule (r) - , rule_pos (0) - , ctx (c) - , ctx_pos (0) - {} - size_t len () const - { - return arcs.size (); - } - size_t len_matching () const - { - return rule.restorectx - ? ctx_pos - : rule_pos; - } - rule_rank_t match () const - { - return rule.rank; - } - const arc_t * operator [] (size_t i) const - { - return arcs[i]; - } - void extend (rule_t r, bool c, const arc_t * a) - { - arcs.push_back (a); - if (!r.rank.is_none ()) - { - rule = r; - rule_pos = arcs.size (); - } - if (c) - { - ctx = true; - ctx_pos = arcs.size (); - } - } - void append (const path_t * p) - { - if (!p->rule.rank.is_none ()) - { - rule = p->rule; - rule_pos = arcs.size () + p->rule_pos; - } - if (p->ctx) - { - ctx = true; - ctx_pos = arcs.size () + p->ctx_pos; - } - arcs.insert (arcs.end (), p->arcs.begin (), p->arcs.end ()); - } -}; - -} // namespace re2c - -#endif // _RE2C_IR_SKELETON_PATH_ diff --git a/src/ir/skeleton/skeleton.cc b/src/ir/skeleton/skeleton.cc deleted file mode 100644 index deee113..0000000 --- a/src/ir/skeleton/skeleton.cc +++ /dev/null @@ -1,163 +0,0 @@ -#include -#include -#include - -#include "src/codegen/go.h" -#include "src/conf/msg.h" -#include "src/ir/dfa/dfa.h" -#include "src/ir/regexp/regexp.h" -#include "src/ir/regexp/regexp_rule.h" -#include "src/ir/skeleton/skeleton.h" - -namespace re2c -{ - -Node::Node () - : arcs () - , arcsets () - , loop (0) - , rule (rule_rank_t::none (), false) - , ctx (false) - , dist (DIST_ERROR) - , reachable () - , suffix (NULL) -{} - -void Node::init(bool c, RuleOp *r, const std::vector > &a) -{ - if (r) - { - rule.rank = r->rank; - rule.restorectx = r->ctx->fixedLength () != 0; - } - - ctx = c; - - uint32_t lb = 0; - std::vector >::const_iterator - i = a.begin(), - e = a.end(); - for (; i != e; ++i) - { - Node *n = i->first; - const uint32_t ub = i->second - 1; - - // pick at most 0x100 unique edges from this range - // (for 1-byte code units this covers the whole range: [0 - 0xFF]) - // - range bounds must be included - // - values should be evenly distributed - // - values should be deterministic - const uint32_t step = 1 + (ub - lb) / 0x100; - for (uint32_t c = lb; c < ub; c += step) - { - arcs[n].push_back (c); - } - arcs[n].push_back (ub); - - arcsets[n].push_back (std::make_pair (lb, ub)); - lb = ub + 1; - } -} - -Node::~Node () -{ - delete suffix; -} - -bool Node::end () const -{ - return arcs.size () == 0; -} - -Skeleton::Skeleton - ( const dfa_t &dfa - , const charset_t &cs - , const rules_t &rs - , const std::string &dfa_name - , const std::string &dfa_cond - , uint32_t dfa_line - ) - : name (dfa_name) - , cond (dfa_cond) - , line (dfa_line) - , nodes_count (dfa.states.size()) - , nodes (new Node [nodes_count + 1]) // +1 for default state - , sizeof_key (4) - , rules (rs) -{ - const size_t nc = cs.size() - 1; - - // initialize skeleton nodes - Node *nil = &nodes[nodes_count]; - for (size_t i = 0; i < nodes_count; ++i) - { - dfa_state_t *s = dfa.states[i]; - std::vector > arcs; - for (size_t c = 0; c < nc;) - { - const size_t j = s->arcs[c]; - for (;++c < nc && s->arcs[c] == j;); - Node *to = j == dfa_t::NIL - ? nil - : &nodes[j]; - arcs.push_back(std::make_pair(to, cs[c])); - } - // all arcs go to default node => this node is final, drop arcs - if (arcs.size() == 1 && arcs[0].first == nil) - { - arcs.clear(); - } - nodes[i].init(s->ctx, s->rule, arcs); - } - - // calculate maximal path length, check overflow - nodes->calc_dist (); - const uint32_t maxlen = nodes->dist; - if (maxlen == Node::DIST_MAX) - { - error ("DFA path %sis too long", incond (cond).c_str ()); - exit (1); - } - - // calculate maximal rule rank (disregarding default and none rules) - uint32_t maxrule = 0; - for (uint32_t i = 0; i < nodes_count; ++i) - { - const rule_rank_t r = nodes[i].rule.rank; - if (!r.is_none () && !r.is_def ()) - { - maxrule = std::max (maxrule, r.uint32 ()); - } - } - // two upper values reserved for default and none rules) - maxrule += 2; - - // initialize size of key - const uint32_t max = std::max (maxlen, maxrule); - if (max <= std::numeric_limits::max()) - { - sizeof_key = 1; - } - else if (max <= std::numeric_limits::max()) - { - sizeof_key = 2; - } -} - -Skeleton::~Skeleton () -{ - delete [] nodes; -} - -uint32_t Skeleton::rule2key (rule_rank_t r) const -{ - switch (sizeof_key) - { - default: // shouldn't happen - case 4: return rule2key (r); - case 2: return rule2key (r); - case 1: return rule2key (r); - } -} - -} // namespace re2c diff --git a/src/ir/skeleton/skeleton.h b/src/ir/skeleton/skeleton.h deleted file mode 100644 index 78c0827..0000000 --- a/src/ir/skeleton/skeleton.h +++ /dev/null @@ -1,174 +0,0 @@ -#ifndef _RE2C_IR_SKELETON_SKELETON_ -#define _RE2C_IR_SKELETON_SKELETON_ - -#include "src/util/c99_stdint.h" -#include -#include -#include -#include -#include -#include -#include -#include - -#include "src/ir/regexp/regexp.h" -#include "src/ir/rule_rank.h" -#include "src/ir/skeleton/path.h" -#include "src/ir/skeleton/way.h" -#include "src/parse/rules.h" -#include "src/util/local_increment.h" -#include "src/util/forbid_copy.h" -#include "src/util/u32lim.h" - -namespace re2c -{ - -struct dfa_t; -struct OutputFile; -class RuleOp; - -struct Node -{ - /* - * note [counting skeleton edges] - * - * To avoid any possible overflows all size calculations are wrapped in - * a special truncated unsigned 32-bit integer type that checks overflow - * on each binary operation or conversion from another type. - * - * Two things contribute to size calculation: path length and the number - * of outgoing arcs in each node. Some considerations on why these values - * will not overflow before they are converted to truncated type: - * - * - Maximal number of outgoing arcs in each node cannot exceed 32 bits: - * it is bounded by the number of code units in current encoding, and - * re2c doesn't support any encoding with more than 2^32 code units. - * Conversion is safe. - * - * - Maximal path length cannot exceed 32 bits: we estimate it right - * after skeleton construction and check for overflow. If path length - * does overflow, an error is reported and re2c aborts. - */ - - // Type for calculating the size of path cover. - // Paths are dumped to file as soon as generated and don't eat - // heap space. The total size of path cover (measured in edges) - // is O(N^2) where N is the number of edges in skeleton. - typedef u32lim_t<1024 * 1024 * 1024> covers_t; // ~1Gb - - // Type for counting arcs in paths that cause undefined behaviour. - // These paths are stored on heap, so the limit should be low. - // Most real-world cases have only a few short paths. - // We don't need all paths anyway, just some examples. - typedef u32lim_t<1024> nakeds_t; // ~1Kb - - typedef std::map arcs_t; - typedef std::map arcsets_t; - typedef local_increment_t local_inc; - - // outgoing arcs - arcs_t arcs; - arcsets_t arcsets; - - // how many times this node has been visited - // (controls looping in graph traversals) - uint8_t loop; - - // rule for corresponding DFA state (if any) - rule_t rule; - - // start of trailing context - bool ctx; - - // maximal distance to end node (assuming one iteration per loop) - static const uint32_t DIST_ERROR; - static const uint32_t DIST_MAX; - uint32_t dist; - - // rules reachable from this node (including absent rule) - std::set reachable; - - // path to end node (for constructing path cover) - path_t * suffix; - - Node (); - void init(bool b, RuleOp *r, const std::vector > &arcs); - ~Node (); - bool end () const; - void calc_dist (); - void calc_reachable (); - template - void cover (path_t & prefix, FILE * input, FILE * keys, covers_t &size); - void naked_ways (way_t & prefix, std::vector & ways, nakeds_t &size); - - FORBID_COPY (Node); -}; - -struct Skeleton -{ - const std::string name; - const std::string cond; - const uint32_t line; - - const size_t nodes_count; - Node * nodes; - size_t sizeof_key; - rules_t rules; - - Skeleton - ( const dfa_t &dfa - , const charset_t &cs - , const rules_t & rs - , const std::string &dfa_name - , const std::string &dfa_cond - , uint32_t dfa_line - ); - ~Skeleton (); - void warn_undefined_control_flow (); - void warn_unreachable_rules (); - void warn_match_empty (); - void emit_data (const char * fname); - static void emit_prolog (OutputFile & o); - void emit_start - ( OutputFile & o - , size_t maxfill - , bool backup - , bool backupctx - , bool accept - ) const; - void emit_end - ( OutputFile & o - , bool backup - , bool backupctx - ) const; - static void emit_epilog (OutputFile & o, const std::set & names); - void emit_action (OutputFile & o, uint32_t ind, rule_rank_t rank) const; - - template static key_t rule2key (rule_rank_t r); - uint32_t rule2key (rule_rank_t r) const; - -private: - template - void generate_paths_cunit_key (FILE * input, FILE * keys); - template - void generate_paths_cunit (FILE * input, FILE * keys); - void generate_paths (FILE * input, FILE * keys); - - FORBID_COPY (Skeleton); -}; - -template key_t Skeleton::rule2key (rule_rank_t r) -{ - if (r.is_none()) { - return std::numeric_limits::max(); - } else if (r.is_def()) { - key_t k = std::numeric_limits::max(); - return --k; - } else { - return static_cast(r.uint32()); - } -} - -} // namespace re2c - -#endif // _RE2C_IR_SKELETON_SKELETON_ diff --git a/src/ir/skeleton/unreachable.cc b/src/ir/skeleton/unreachable.cc deleted file mode 100644 index fac41df..0000000 --- a/src/ir/skeleton/unreachable.cc +++ /dev/null @@ -1,73 +0,0 @@ -#include "src/util/c99_stdint.h" -#include -#include -#include - -#include "src/conf/warn.h" -#include "src/globals.h" -#include "src/ir/rule_rank.h" -#include "src/ir/skeleton/path.h" -#include "src/ir/skeleton/skeleton.h" -#include "src/parse/rules.h" - -namespace re2c -{ - -void Node::calc_reachable () -{ - if (!reachable.empty ()) - { - return; - } - else if (end ()) - { - reachable.insert (rule); - } - else if (loop < 2) - { - local_inc _ (loop); - for (arcs_t::iterator i = arcs.begin (); i != arcs.end (); ++i) - { - i->first->calc_reachable (); - reachable.insert (i->first->reachable.begin (), i->first->reachable.end ()); - } - } -} - -void Skeleton::warn_unreachable_rules () -{ - nodes->calc_reachable (); - for (uint32_t i = 0; i < nodes_count; ++i) - { - const rule_rank_t r1 = nodes[i].rule.rank; - const std::set & rs = nodes[i].reachable; - for (std::set::const_iterator j = rs.begin (); j != rs.end (); ++j) - { - const rule_rank_t r2 = j->rank; - if (r1 == r2 || r2.is_none ()) - { - rules[r1].reachable = true; - } - else - { - rules[r1].shadow.insert (r2); - } - } - } - - // warn about unreachable rules: - // - rules that are shadowed by other rules, e.g. rule '[a]' is shadowed by '[a] [^]' - // - infinite rules that consume infinitely many characters and fail on YYFILL, e.g. '[^]*' - // - rules that contain never-matching link, e.g. '[]' with option '--empty-class match-none' - // default rule '*' should not be reported - for (rules_t::const_iterator i = rules.begin (); i != rules.end (); ++i) - { - const rule_rank_t r = i->first; - if (!r.is_none () && !r.is_def () && !rules[r].reachable) - { - warn.unreachable_rule (cond, i->second, rules); - } - } -} - -} // namespace re2c diff --git a/src/ir/skeleton/way.cc b/src/ir/skeleton/way.cc deleted file mode 100644 index 0f58efe..0000000 --- a/src/ir/skeleton/way.cc +++ /dev/null @@ -1,74 +0,0 @@ -#include -#include - -#include "src/ir/skeleton/way.h" - -namespace re2c -{ - -static bool cmp_way_arcs (const way_arc_t * a1, const way_arc_t * a2); -static void fprint_way_arc (FILE * f, const way_arc_t & arc); - -bool cmp_way_arcs (const way_arc_t * a1, const way_arc_t * a2) -{ - return std::lexicographical_compare(a1->begin(), a1->end(), a2->begin(), a2->end()); -} - -// define strict weak ordering on patterns: -// 1st criterion is length (short patterns go first) -// 2nd criterion is lexicographical order (applies to patterns of equal length) -bool cmp_ways (const way_t & w1, const way_t & w2) -{ - const size_t s1 = w1.size (); - const size_t s2 = w2.size (); - return (s1 == s2 && std::lexicographical_compare(w1.begin(), w1.end(), w2.begin(), w2.end(), cmp_way_arcs)) - || s1 < s2; -} - -void fprint_way (FILE * f, const way_t & w) -{ - fprintf (f, "'"); - const size_t len = w.size (); - for (size_t i = 0 ; i < len; ++i) - { - if (i > 0) - { - fprintf (f, " "); - } - if (w[i] == NULL) - { - fprintf (stderr, "(nil)"); - } - else - { - fprint_way_arc (stderr, *w[i]); - } - } - fprintf (f, "'"); -} - -void fprint_way_arc (FILE * f, const way_arc_t & arc) -{ - const size_t ranges = arc.size (); - if (ranges == 1 && arc[0].first == arc[0].second) - { - fprintf (f, "\\x%X", arc[0].first); - } - else - { - fprintf (f, "["); - for (size_t i = 0; i < ranges; ++i) - { - const uint32_t l = arc[i].first; - const uint32_t u = arc[i].second; - fprintf (f, "\\x%X", l); - if (l != u) - { - fprintf (f, "-\\x%X", u); - } - } - fprintf (f, "]"); - } -} - -} // namespace re2c diff --git a/src/ir/skeleton/way.h b/src/ir/skeleton/way.h deleted file mode 100644 index e10010a..0000000 --- a/src/ir/skeleton/way.h +++ /dev/null @@ -1,20 +0,0 @@ -#ifndef _RE2C_IR_SKELETON_WAY_ -#define _RE2C_IR_SKELETON_WAY_ - -#include "src/util/c99_stdint.h" -#include -#include -#include - -namespace re2c -{ - -typedef std::vector > way_arc_t; -typedef std::vector way_t; - -bool cmp_ways (const way_t & w1, const way_t & w2); -void fprint_way (FILE * f, const way_t & p); - -} // namespace re2c - -#endif // _RE2C_IR_SKELETON_WAY_ diff --git a/src/main.cc b/src/main.cc index 03b6ee2..55d0499 100644 --- a/src/main.cc +++ b/src/main.cc @@ -1,60 +1,35 @@ -#include "src/util/c99_stdint.h" -#include - -#include "src/codegen/output.h" +#include "src/ast/input.h" +#include "src/ast/scanner.h" +#include "src/code/output.h" +#include "src/compile.h" #include "src/conf/msg.h" #include "src/conf/opt.h" #include "src/conf/warn.h" -#include "src/globals.h" -#include "src/parse/input.h" -#include "src/parse/parser.h" -#include "src/parse/scanner.h" - -namespace re2c -{ - -bool bUsedYYBitmap = false; -bool bWroteGetState = false; -bool bWroteCondCheck = false; -uint32_t last_fill_index = 0; -std::string yySetupRule = ""; - -} // end namespace re2c using namespace re2c; int main(int, char *argv[]) { - switch (parse_opts (argv, opts)) - { + conopt_t globopts; + Opt opts(globopts); + Warn warn; + + switch (parse_opts(argv, globopts, opts, warn)) { case OK: break; case EXIT_OK: return 0; case EXIT_FAIL: return 1; } - // set up the source stream - re2c::Input input (opts.source_file); - if (!input.open ()) - { - error ("cannot open source file: %s", opts.source_file); - return 1; - } - - // set up the output streams - re2c::Output output (opts.output_file, opts->header_file); - if (!output.source.open ()) - { - error ("cannot open output file: %s", opts.output_file); - return 1; - } - if (opts->tFlag && !output.header.open ()) - { - error ("cannot open header file: %s", opts->header_file); + re2c::Input input(opts.source_file); + if (!input.open()) { + error("cannot open source file: %s", opts.source_file); return 1; } + Scanner scanner(input, warn); + Output output(warn); - Scanner scanner (input, output.source); - parse (scanner, output); + compile(scanner, output, opts); + if (!output.emit()) return 1; - return warn.error () ? 1 : 0; + return warn.error() ? 1 : 0; } diff --git a/src/nfa/dump.cc b/src/nfa/dump.cc new file mode 100644 index 0000000..4d418b8 --- /dev/null +++ b/src/nfa/dump.cc @@ -0,0 +1,80 @@ +#include "src/util/c99_stdint.h" +#include +#include +#include + +#include "src/nfa/nfa.h" +#include "src/re/tag.h" +#include "src/util/range.h" + +namespace re2c +{ + +static uint32_t index(const nfa_t &nfa, const nfa_state_t *s) +{ + return static_cast(s - nfa.states); +} + +void dump_nfa(const nfa_t &nfa) +{ + fprintf(stderr, + "digraph NFA {\n" + " rankdir=LR\n" + " node[shape=Mrecord fontname=fixed height=0.2 width=0.2]\n" + " edge[arrowhead=vee fontname=fixed label=\" \"]\n\n"); + + for (uint32_t i = static_cast(nfa.size); i --> 0;) { + const nfa_state_t *n = &nfa.states[i]; + + fprintf(stderr, " n%u [label=\"%u\"]", i, i); + if (n->type == nfa_state_t::FIN) { + fprintf(stderr, " [fillcolor=gray]"); + } + fprintf(stderr, "\n"); + + switch (n->type) { + case nfa_state_t::ALT: + fprintf(stderr, " n%u -> n%u\n", i, index(nfa, n->alt.out1)); + fprintf(stderr, " n%u -> n%u [color=lightgray]\n", i, index(nfa, n->alt.out2)); + break; + case nfa_state_t::RAN: { + fprintf(stderr, " n%u -> n%u [label=\"", i, index(nfa, n->ran.out)); + for (const Range *r = n->ran.ran; r; r = r->next()) { + const uint32_t + l = r->lower(), + u = r->upper() - 1; + fprintf(stderr, "%u", l); + if (u > l) fprintf(stderr, "-%u", u); + if (r->next()) fprintf(stderr, ","); + } + fprintf(stderr, "\"]\n"); + break; + } + case nfa_state_t::TAG: { + const Tag &tag = nfa.tags[n->tag.info]; + fprintf(stderr, " n%u -> n%u [label=\"/", i, index(nfa, n->tag.out)); + if (capture(tag)) { + fprintf(stderr, "%u", (uint32_t)tag.ncap); + } else if (!trailing(tag)) { + fprintf(stderr, "%s", tag.name->c_str()); + } + if (n->tag.bottom) { + fprintf(stderr, "↓"); + } else { + fprintf(stderr, "↑"); + } + fprintf(stderr, "\"]\n"); + break; + } + case nfa_state_t::FIN: + break; + case nfa_state_t::NIL: + fprintf(stderr, " n%u -> n%u\n", i, index(nfa, n->nil.out)); + break; + } + } + + fprintf(stderr, "}\n"); +} + +} // namespace re2c diff --git a/src/nfa/estimate_size.cc b/src/nfa/estimate_size.cc new file mode 100644 index 0000000..98c2143 --- /dev/null +++ b/src/nfa/estimate_size.cc @@ -0,0 +1,46 @@ + +#include +#include + +#include "src/ast/ast.h" +#include "src/re/re.h" + +namespace re2c { + +static size_t estimate(const RE *re) +{ + switch (re->type) { + case RE::NIL: return 0; + case RE::SYM: return 1; + case RE::TAG: return 1; + case RE::ALT: + return estimate(re->alt.re1) + + estimate(re->alt.re2) + + 1; + case RE::CAT: + return estimate(re->cat.re1) + + estimate(re->cat.re2); + case RE::ITER: { + const size_t + iter = estimate(re->iter.re), + min = re->iter.min, + max = re->iter.max; + return max == AST::MANY + ? iter * min + 1 + : iter * max + (max - min); + } + } + return 0; /* unreachable */ +} + +size_t estimate_size(const std::vector &res) +{ + const size_t nre = res.size(); + size_t size = nre - 1; + for (size_t i = 0; i < nre; ++i) { + size += estimate(res[i]) + 1; + } + return size; +} + +} // namespace re2c diff --git a/src/nfa/nfa.h b/src/nfa/nfa.h new file mode 100644 index 0000000..9dcd756 --- /dev/null +++ b/src/nfa/nfa.h @@ -0,0 +1,121 @@ +#ifndef _RE2C_NFA_NFA_ +#define _RE2C_NFA_NFA_ + +#include +#include "src/util/c99_stdint.h" +#include +#include + +#include "src/code/input_api.h" +#include "src/re/re.h" +#include "src/re/rule.h" +#include "src/re/tag.h" +#include "src/util/forbid_copy.h" + +namespace re2c +{ + +struct clos_t; + +// Goldberg-Radzik 'shortest path' algorithm +enum gor_status_t {GOR_OFFSTACK, GOR_NEWPASS, GOR_TOPSORT}; + +static const uint32_t NOCLOS = ~0u; + +struct nfa_state_t +{ + enum type_t {ALT, RAN, TAG, FIN, NIL} type; + union + { + struct + { + nfa_state_t *out1; + nfa_state_t *out2; + } alt; + struct + { + nfa_state_t *out; + const Range *ran; + } ran; + struct + { + nfa_state_t *out; + size_t info; + bool bottom; + } tag; + struct + { + nfa_state_t *out; + } nil; + }; + size_t rule; + uint32_t clos; + gor_status_t status; + + void make_alt(size_t r, nfa_state_t *s1, nfa_state_t *s2) + { + type = ALT; + alt.out1 = s1; + alt.out2 = s2; + rule = r; + clos = NOCLOS; + status = GOR_OFFSTACK; + } + void make_ran(size_t r, nfa_state_t *s, const Range *p) + { + type = RAN; + ran.out = s; + ran.ran = p; + rule = r; + clos = NOCLOS; + status = GOR_OFFSTACK; + } + void make_tag(size_t r, nfa_state_t *s, size_t i, bool bottom) + { + type = TAG; + tag.out = s; + tag.info = i; + tag.bottom = bottom; + rule = r; + clos = NOCLOS; + status = GOR_OFFSTACK; + } + void make_fin(size_t r) + { + type = FIN; + rule = r; + clos = NOCLOS; + status = GOR_OFFSTACK; + } + void make_nil(size_t r, nfa_state_t *s) + { + type = NIL; + nil.out = s; + rule = r; + clos = NOCLOS; + status = GOR_OFFSTACK; + } +}; + +struct nfa_t +{ + size_t max_size; + size_t size; + nfa_state_t *states; + std::vector &charset; + std::valarray &rules; + std::vector &tags; + nfa_state_t *root; + + explicit nfa_t(const RESpec &spec); + ~nfa_t(); + + FORBID_COPY(nfa_t); +}; + +size_t estimate_size(const std::vector &res); +void dump_nfa(const nfa_t &nfa); + +} // namespace re2c + +#endif // _RE2C_NFA_NFA_ diff --git a/src/nfa/re_to_nfa.cc b/src/nfa/re_to_nfa.cc new file mode 100644 index 0000000..e2d1f19 --- /dev/null +++ b/src/nfa/re_to_nfa.cc @@ -0,0 +1,125 @@ +#include +#include "src/util/c99_stdint.h" +#include + +#include "src/ast/ast.h" +#include "src/nfa/nfa.h" +#include "src/re/re.h" +#include "src/re/tag.h" + +namespace re2c { + +/* + * note [counted repetition and iteration expansion] + * + * It is more convenient to express zero-or-more iterations in terms of + * one-or-more iterations than vice versa, because the expansion 'r+ ::= r r*' + * duplicates 'r', while 'r* = r+ | ' allows to avoid duplication. + * + * Sometimes duplcation is unavoidable, like 'r{n}' for 'n' > 1 and 'r{n,m}' + * for 'n' < 'm'. In such cases we duplicate 'r' together with all tags; + * this may cause multiple (non-bottom) occurences of the same tag in the NFA. + * Determinization must be careful to track multiple occurences of the same + * tag while building epsilon-closure (this matters for POSIX disambiguation + * strategy). + * + * We allow tags to apper only once in the original regular expression. + * This is not strictly necessary (putting the same tag in non-overlapping + * alternative branches may be handy), but it would allow to create very + * confusing regexps and the disambiguation strategy would behave strangely. + */ + +static nfa_state_t *re_to_nfa(nfa_t &nfa, size_t nrule, const RE *re, nfa_state_t *t) +{ + nfa_state_t *s = NULL; + switch (re->type) { + case RE::NIL: + s = t; + break; + case RE::SYM: + s = &nfa.states[nfa.size++]; + s->make_ran(nrule, t, re->sym); + break; + case RE::ALT: { + nfa_state_t + *s1 = re_to_nfa(nfa, nrule, re->alt.re1, t), + *s2 = re_to_nfa(nfa, nrule, re->alt.re2, t); + s = &nfa.states[nfa.size++]; + s->make_alt(nrule, s1, s2); + break; + } + case RE::CAT: + s = re_to_nfa(nfa, nrule, re->cat.re2, t); + s = re_to_nfa(nfa, nrule, re->cat.re1, s); + break; + case RE::ITER: { + const uint32_t + min = re->iter.min, + max = re->iter.max; + const RE *iter = re->iter.re; + // see note [counted repetition and iteration expansion] + if (max == AST::MANY) { + nfa_state_t *q = &nfa.states[nfa.size++]; + s = re_to_nfa(nfa, nrule, iter, q); + q->make_alt(nrule, s, t); + } else { + s = re_to_nfa(nfa, nrule, iter, t); + for (uint32_t i = min; i < max; ++i) { + nfa_state_t *q = &nfa.states[nfa.size++]; + q->make_alt(nrule, s, t); + s = re_to_nfa(nfa, nrule, iter, q); + } + } + for (uint32_t i = 1; i < min; ++i) { + s = re_to_nfa(nfa, nrule, iter, s); + } + break; + } + case RE::TAG: { + const Tag &tag = nfa.tags[re->tag.idx]; + if (fixed(tag) && !capture(tag)) { + s = t; + } else { + s = &nfa.states[nfa.size++]; + s->make_tag(nrule, t, re->tag.idx, re->tag.bottom); + } + break; + } + } + return s; +} + +nfa_t::nfa_t(const RESpec &spec) + : max_size(estimate_size(spec.res)) + , size(0) + , states(new nfa_state_t[max_size]) + , charset(spec.charset) + , rules(spec.rules) + , tags(spec.tags) + , root(NULL) +{ + const size_t nre = spec.res.size(); + + if (nre == 0) return; + + for (size_t i = 0; i < nre; ++i) { + nfa_state_t *s = &states[size++]; + s->make_fin(i); + s = re_to_nfa(*this, i, spec.res[i], s); + + if (root) { + nfa_state_t *t = &states[size++]; + t->make_alt(i, root, s); + root = t; + } else { + root = s; + } + } +} + +nfa_t::~nfa_t() +{ + delete[] states; +} + +} // namespace re2c diff --git a/src/parse/code.cc b/src/parse/code.cc deleted file mode 100644 index 97a865c..0000000 --- a/src/parse/code.cc +++ /dev/null @@ -1,8 +0,0 @@ -#include "src/parse/code.h" - -namespace re2c -{ - -free_list Code::freelist; - -} // namespace re2c diff --git a/src/parse/code.h b/src/parse/code.h deleted file mode 100644 index d658e62..0000000 --- a/src/parse/code.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef _RE2C_PARSE_CODE_ -#define _RE2C_PARSE_CODE_ - -#include "src/util/c99_stdint.h" -#include -#include - -#include "src/parse/loc.h" -#include "src/util/free_list.h" - -namespace re2c -{ - -struct Code -{ - static free_list freelist; - - const Loc loc; - const std::string text; - - inline Code (const char * t, size_t t_len, const std::string & f, uint32_t l) - : loc (f, l) - , text (t, t_len) - { - freelist.insert (this); - } -}; - -} // namespace re2c - -#endif // _RE2C_PARSE_CODE_ diff --git a/src/parse/extop.h b/src/parse/extop.h deleted file mode 100644 index d093be9..0000000 --- a/src/parse/extop.h +++ /dev/null @@ -1,17 +0,0 @@ -#ifndef _RE2C_PARSE_EXTOP_ -#define _RE2C_PARSE_EXTOP_ - -#include "src/util/c99_stdint.h" - -namespace re2c -{ - -struct ExtOp -{ - uint32_t min; - uint32_t max; -}; - -} // end namespace re2c - -#endif // _RE2C_PARSE_EXTOP_ diff --git a/src/parse/lex_conf.re b/src/parse/lex_conf.re deleted file mode 100644 index 550fe1a..0000000 --- a/src/parse/lex_conf.re +++ /dev/null @@ -1,222 +0,0 @@ -#include "src/util/c99_stdint.h" -#include - -#include "src/codegen/output.h" -#include "src/conf/opt.h" -#include "src/globals.h" -#include "src/ir/regexp/encoding/enc.h" -#include "src/parse/scanner.h" -#include "src/util/s_to_n32_unsafe.h" - -namespace re2c -{ - -// global re2c config (affects the whole file) -/*!re2c - re2c:define:YYCTYPE = "unsigned char"; - re2c:define:YYCURSOR = cur; - re2c:define:YYLIMIT = lim; - re2c:define:YYMARKER = ptr; - re2c:define:YYCTXMARKER = ctx; - re2c:define:YYFILL = fill; - - // source code is in ASCII: pointers have type 'char *' - // but re2c makes an implicit assumption that YYCTYPE is unsigned - // when it generates comparisons - re2c:yych:conversion = 1; - - space = [ \t]; - - conf_assign = space* "=" space*; - - naked_char = . \ (space | [;]); - naked = "" | (naked_char \ ['"]) naked_char*; - - number = "0" | ("-"? [1-9] [0-9]*); -*/ - -void Scanner::lex_conf () -{ - tok = cur; -/*!re2c - * { fatal ((tok - pos) - tchar, "unrecognized configuration"); } - - "flags:" [ewxu8] - { - Enc::type_t enc = Enc::ASCII; - switch (cur[-1]) - { - case 'e': enc = Enc::EBCDIC; break; - case 'w': enc = Enc::UCS2; break; - case 'x': enc = Enc::UTF16; break; - case 'u': enc = Enc::UTF32; break; - case '8': enc = Enc::UTF8; break; - } - const int32_t n = lex_conf_number (); - if (n == 0) - { - opts.unset_encoding (enc); - } - else if (!opts.set_encoding (enc)) - { - fatalf ("Cannot set %s encoding: please reset %s encoding first" - , Enc::name (enc) - , Enc::name (opts->encoding.type ())); - } - return; - } - - "define:YYCONDTYPE" { opts.set_yycondtype (lex_conf_string ()); return; } - "define:YYGETCONDITION" { opts.set_cond_get (lex_conf_string ()); return; } - "define:YYGETCONDITION:naked" { opts.set_cond_get_naked (lex_conf_number () != 0); return; } - "define:YYSETCONDITION" { opts.set_cond_set (lex_conf_string ()); return; } - "define:YYSETCONDITION@cond" { opts.set_cond_set_arg (lex_conf_string ()); return; } - "define:YYSETCONDITION:naked" { opts.set_cond_set_naked (lex_conf_number () != 0); return; } - "condprefix" { opts.set_condPrefix (lex_conf_string ()); return; } - "condenumprefix" { opts.set_condEnumPrefix (lex_conf_string ()); return; } - "cond:divider" { opts.set_condDivider (lex_conf_string ()); return; } - "cond:divider@cond" { opts.set_condDividerParam (lex_conf_string ()); return; } - "cond:goto" { opts.set_condGoto (lex_conf_string ()); return; } - "cond:goto@cond" { opts.set_condGotoParam (lex_conf_string ()); return; } - "variable:yyctable" { opts.set_yyctable (lex_conf_string ()); return; } - - "define:YYGETSTATE" { opts.set_state_get (lex_conf_string ()); return; } - "define:YYGETSTATE:naked" { opts.set_state_get_naked (lex_conf_number () != 0); return; } - "define:YYSETSTATE" { opts.set_state_set (lex_conf_string ()); return; } - "define:YYSETSTATE:naked" { opts.set_state_set_naked (lex_conf_number () != 0); return; } - "define:YYSETSTATE@state" { opts.set_state_set_arg (lex_conf_string ()); return; } - "label:yyFillLabel" { opts.set_yyfilllabel (lex_conf_string ()); return; } - "label:yyNext" { opts.set_yynext (lex_conf_string ()); return; } - "state:abort" { opts.set_bUseStateAbort (lex_conf_number () != 0); return; } - "state:nextlabel" { opts.set_bUseStateNext (lex_conf_number () != 0); return; } - "variable:yyaccept" { opts.set_yyaccept (lex_conf_string ()); return; } - - "variable:yybm" { opts.set_yybm (lex_conf_string ()); return; } - "yybm:hex" { opts.set_yybmHexTable (lex_conf_number () != 0); return; } - "cgoto:threshold" - { - const int32_t n = lex_conf_number (); - if (n < 0) - { - fatal ("configuration 'cgoto:threshold' must be nonnegative"); - } - opts.set_cGotoThreshold (static_cast (n)); - return; - } - "variable:yytarget" { opts.set_yytarget (lex_conf_string ()); return; } - - "define:YYCURSOR" { opts.set_yycursor (lex_conf_string ()); return; } - "define:YYMARKER" { opts.set_yymarker (lex_conf_string ()); return; } - "define:YYCTXMARKER" { opts.set_yyctxmarker (lex_conf_string ()); return; } - "define:YYLIMIT" { opts.set_yylimit (lex_conf_string ()); return; } - - "define:YYPEEK" { opts.set_yypeek (lex_conf_string ()); return; } - "define:YYSKIP" { opts.set_yyskip (lex_conf_string ()); return; } - "define:YYBACKUP" { opts.set_yybackup (lex_conf_string ()); return; } - "define:YYBACKUPCTX" { opts.set_yybackupctx (lex_conf_string ()); return; } - "define:YYRESTORE" { opts.set_yyrestore (lex_conf_string ()); return; } - "define:YYRESTORECTX" { opts.set_yyrestorectx (lex_conf_string ()); return; } - "define:YYLESSTHAN" { opts.set_yylessthan (lex_conf_string ()); return; } - - "indent:string" { opts.set_indString (lex_conf_string ()); return; } - "indent:top" - { - const int32_t n = lex_conf_number (); - if (n < 0) - { - fatal ("configuration 'indent:top' must be nonnegative"); - } - opts.set_topIndent (static_cast (n)); - return; - } - - "define:YYDEBUG" { opts.set_yydebug (lex_conf_string ()); return; } - - "define:YYCTYPE" { opts.set_yyctype (lex_conf_string ()); return; } - "variable:yych" { opts.set_yych (lex_conf_string ()); return; } - "yych:conversion" { opts.set_yychConversion (lex_conf_number () != 0); return; } - "yych:emit" { opts.set_bEmitYYCh (lex_conf_number () != 0); return; } - - "define:YYFILL" { opts.set_fill (lex_conf_string ()); return; } - "yyfill:enable" { opts.set_fill_use (lex_conf_number () != 0); return; } - "define:YYFILL@len" { opts.set_fill_arg (lex_conf_string ()); return; } - "yyfill:parameter" { opts.set_fill_arg_use (lex_conf_number () != 0); return; } - "define:YYFILL:naked" { opts.set_fill_naked (lex_conf_number () != 0); return; } - "yyfill:check" { opts.set_fill_check (lex_conf_number () != 0); return; } - - "labelprefix" { opts.set_labelPrefix (lex_conf_string ()); return; } - - // try to lex number first, otherwize it would be lexed as a naked string - "startlabel" / conf_assign number { out.set_force_start_label (lex_conf_number () != 0); return; } - "startlabel" { out.set_user_start_label (lex_conf_string ()); return; } - - // deprecated - "variable:yystable" { lex_conf_string (); return; } -*/ -} - -void Scanner::lex_conf_assign () -{ -/*!re2c - * { fatal ("missing '=' in configuration"); } - conf_assign { return; } -*/ -} - -void Scanner::lex_conf_semicolon () -{ -/*!re2c - * { fatal ("missing ending ';' in configuration"); } - space* ";" { return; } -*/ -} - -int32_t Scanner::lex_conf_number () -{ - lex_conf_assign (); - tok = cur; -/*!re2c - number - { - int32_t n = 0; - if (!s_to_i32_unsafe (tok, cur, n)) - { - fatal ("configuration value overflow"); - } - lex_conf_semicolon (); - return n; - } -*/ -} - -std::string Scanner::lex_conf_string () -{ - lex_conf_assign (); - std::string s; - tok = cur; -/*!re2c - ['"] { - const char quote = tok[0]; - for (bool end;;) { - const uint32_t c = lex_str_chr(quote, end); - if (end) { - goto end; - } - if (c > 0xFF) { - fatalf ("multibyte character in configuration string: 0x%X", c); - } else { - s += static_cast(c); - } - } - } - naked { - s = std::string(tok, tok_len()); - goto end; - } -*/ -end: - lex_conf_semicolon (); - return s; -} - -} // end namespace re2c diff --git a/src/parse/loc.h b/src/parse/loc.h deleted file mode 100644 index b3d4277..0000000 --- a/src/parse/loc.h +++ /dev/null @@ -1,24 +0,0 @@ -#ifndef _RE2C_PARSE_LOC_ -#define _RE2C_PARSE_LOC_ - -#include - -#include "src/util/c99_stdint.h" - -namespace re2c -{ - -struct Loc -{ - std::string filename; - uint32_t line; - - inline Loc (const std::string & f, uint32_t l) - : filename (f) - , line (l) - {} -}; - -} // namespace re2c - -#endif // _RE2C_PARSE_LOC_ diff --git a/src/parse/parser.h b/src/parse/parser.h deleted file mode 100644 index 8901d79..0000000 --- a/src/parse/parser.h +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef _RE2C_PARSE_PARSER_ -#define _RE2C_PARSE_PARSER_ - -#include -#include - -#include "src/codegen/output.h" -#include "src/ir/regexp/regexp.h" -#include "src/ir/regexp/regexp_rule.h" -#include "src/parse/scanner.h" -#include "src/parse/spec.h" - -namespace re2c -{ - -extern void parse(Scanner &, Output &); -extern void parse_cleanup(); - -typedef std::set CondList; -typedef std::list RuleOpList; -typedef std::map SpecMap; -typedef std::map > SetupMap; -typedef std::map DefaultMap; -typedef std::map symbol_table_t; - -} // namespace re2c - -#endif // _RE2C_PARSE_PARSER_ diff --git a/src/parse/parser.ypp b/src/parse/parser.ypp deleted file mode 100644 index 76540ec..0000000 --- a/src/parse/parser.ypp +++ /dev/null @@ -1,775 +0,0 @@ -%{ - -#include "src/util/c99_stdint.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "src/codegen/output.h" -#include "src/conf/opt.h" -#include "src/globals.h" -#include "src/ir/compile.h" -#include "src/ir/adfa/adfa.h" -#include "src/ir/regexp/encoding/enc.h" -#include "src/ir/regexp/encoding/range_suffix.h" -#include "src/ir/regexp/regexp.h" -#include "src/ir/regexp/regexp_cat.h" -#include "src/ir/regexp/regexp_close.h" -#include "src/ir/regexp/regexp_null.h" -#include "src/ir/regexp/regexp_rule.h" -#include "src/ir/rule_rank.h" -#include "src/ir/skeleton/skeleton.h" -#include "src/parse/code.h" -#include "src/parse/extop.h" -#include "src/parse/loc.h" -#include "src/parse/parser.h" -#include "src/parse/scanner.h" -#include "src/parse/spec.h" -#include "src/util/counter.h" -#include "src/util/free_list.h" -#include "src/util/range.h" -#include "src/util/smart_ptr.h" - -#define YYMALLOC malloc -#define YYFREE free - -using namespace re2c; - -extern "C" -{ -int yylex(); -void yyerror(const char*); -} - -static counter_t rank_counter; -static std::vector condnames; -static re2c::SpecMap specMap; -static Spec spec; -static RuleOp *specNone = NULL; -static RuleOpList specStar; -static RuleOp * star_default = NULL; -static Scanner *in = NULL; -static Scanner::ParseMode parseMode; -static SetupMap ruleSetupMap; -static bool foundRules; -static symbol_table_t symbol_table; - -/* Bison version 1.875 emits a definition that is not working - * with several g++ version. Hence we disable it here. - */ -#if defined(__GNUC__) -#define __attribute__(x) -#endif - -void context_check(CondList *clist) -{ - if (!opts->cFlag) - { - delete clist; - in->fatal("conditions are only allowed when using -c switch"); - } -} - -void context_none(CondList *clist) -{ - delete clist; - context_check(NULL); - in->fatal("no expression specified"); -} - -void context_rule - ( CondList * clist - , const Loc & loc - , RegExp * expr - , RegExp * look - , const Code * code - , const std::string * newcond - ) -{ - context_check(clist); - for(CondList::const_iterator it = clist->begin(); it != clist->end(); ++it) - { - if (specMap.find(*it) == specMap.end()) - { - condnames.push_back (*it); - } - - RuleOp * rule = new RuleOp - ( loc - , expr - , look - , rank_counter.next () - , code - , newcond - ); - specMap[*it].add (rule); - } - delete clist; - delete newcond; -} - -void setup_rule(CondList *clist, const Code * code) -{ - assert(clist); - assert(code); - context_check(clist); - for(CondList::const_iterator it = clist->begin(); it != clist->end(); ++it) - { - if (ruleSetupMap.find(*it) != ruleSetupMap.end()) - { - in->fatalf_at(code->loc.line, "code to setup rule '%s' is already defined", it->c_str()); - } - ruleSetupMap[*it] = std::make_pair(code->loc.line, code->text); - } - delete clist; -} - -void default_rule(CondList *clist, const Code * code) -{ - assert(clist); - assert(code); - context_check(clist); - for(CondList::const_iterator it = clist->begin(); it != clist->end(); ++it) - { - RuleOp * def = new RuleOp - ( code->loc - , in->mkDefault () - , new NullOp - , rule_rank_t::def () - , code - , NULL - ); - if (!specMap[*it].add_def (def)) - { - in->fatalf_at(code->loc.line, "code to default rule '%s' is already defined", it->c_str()); - } - } - delete clist; -} - -%} - -%start spec - -%union { - re2c::RegExp * regexp; - const re2c::Code * code; - char op; - re2c::ExtOp extop; - std::string * str; - re2c::CondList * clist; -}; - -%token TOKEN_CLOSE -%token TOKEN_CLOSESIZE -%token TOKEN_CODE -%token TOKEN_CONF -%token TOKEN_ID -%token TOKEN_FID -%token TOKEN_FID_END -%token TOKEN_NOCOND -%token TOKEN_REGEXP -%token TOKEN_SETUP -%token TOKEN_STAR - -%type TOKEN_CLOSE TOKEN_STAR TOKEN_SETUP close -%type TOKEN_CLOSESIZE -%type TOKEN_CODE -%type TOKEN_REGEXP rule look expr diff term factor primary -%type TOKEN_ID TOKEN_FID newcond -%type cond clist - -%% - -spec: - /* empty */ - { - } - | spec rule - { - foundRules = true; - } - | spec decl -; - -decl: - TOKEN_ID '=' expr ';' - { - if (!symbol_table.insert (std::make_pair (* $1, $3)).second) - { - in->fatal("sym already defined"); - } - delete $1; - } - | TOKEN_FID expr TOKEN_FID_END - { - if (!symbol_table.insert (std::make_pair (* $1, $2)).second) - { - in->fatal("sym already defined"); - } - delete $1; - } - | TOKEN_ID '=' expr '/' - { - in->fatal("trailing contexts are not allowed in named definitions"); - } - | TOKEN_FID expr '/' - { - in->fatal("trailing contexts are not allowed in named definitions"); - } - | TOKEN_CONF {} -; - -rule: - expr look TOKEN_CODE - { - if (opts->cFlag) - { - in->fatal("condition or '<*>' required when using -c switch"); - } - RuleOp * rule = new RuleOp - ( $3->loc - , $1 - , $2 - , rank_counter.next () - , $3 - , NULL - ); - spec.add (rule); - } - | TOKEN_STAR TOKEN_CODE /* default rule */ - { - if (opts->cFlag) - in->fatal("condition or '<*>' required when using -c switch"); - RuleOp * def = new RuleOp - ( $2->loc - , in->mkDefault () - , new NullOp - , rule_rank_t::def () - , $2 - , NULL - ); - if (!spec.add_def (def)) - { - in->fatal("code to default rule is already defined"); - } - } - | '<' cond '>' expr look newcond TOKEN_CODE - { - context_rule ($2, $7->loc, $4, $5, $7, $6); - } - | '<' cond '>' expr look ':' newcond - { - assert($7); - Loc loc (in->get_fname (), in->get_cline ()); - context_rule ($2, loc, $4, $5, NULL, $7); - } - | '<' cond '>' look newcond TOKEN_CODE - { - context_none($2); - delete $5; - } - | '<' cond '>' look ':' newcond - { - assert($6); - context_none($2); - delete $6; - } - | '<' cond '>' TOKEN_STAR TOKEN_CODE /* default rule for conditions */ - { - default_rule($2, $5); - } - | '<' TOKEN_STAR '>' expr look newcond TOKEN_CODE - { - context_check(NULL); - RuleOp * rule = new RuleOp - ( $7->loc - , $4 - , $5 - , rank_counter.next () - , $7 - , $6 - ); - specStar.push_back (rule); - delete $6; - } - | '<' TOKEN_STAR '>' expr look ':' newcond - { - assert($7); - context_check(NULL); - Loc loc (in->get_fname (), in->get_cline ()); - RuleOp * rule = new RuleOp - ( loc - , $4 - , $5 - , rank_counter.next () - , NULL - , $7 - ); - specStar.push_back (rule); - delete $7; - } - | '<' TOKEN_STAR '>' look newcond TOKEN_CODE - { - context_none(NULL); - delete $5; - } - | '<' TOKEN_STAR '>' look ':' newcond - { - assert($6); - context_none(NULL); - delete $6; - } - | '<' TOKEN_STAR '>' TOKEN_STAR TOKEN_CODE /* default rule for all conditions */ - { - if (star_default) - { - in->fatal ("code to default rule '*' is already defined"); - } - star_default = new RuleOp - ( $5->loc - , in->mkDefault () - , new NullOp - , rule_rank_t::def () - , $5 - , NULL - ); - } - | TOKEN_NOCOND newcond TOKEN_CODE - { - context_check(NULL); - if (specNone) - { - in->fatal("code to handle illegal condition already defined"); - } - $$ = specNone = new RuleOp - ( $3->loc - , new NullOp - , new NullOp - , rank_counter.next () - , $3 - , $2 - ); - delete $2; - } - | TOKEN_NOCOND ':' newcond - { - assert($3); - context_check(NULL); - if (specNone) - { - in->fatal("code to handle illegal condition already defined"); - } - Loc loc (in->get_fname (), in->get_cline ()); - $$ = specNone = new RuleOp - ( loc - , new NullOp - , new NullOp - , rank_counter.next () - , NULL - , $3 - ); - delete $3; - } - | TOKEN_SETUP TOKEN_STAR '>' TOKEN_CODE - { - CondList *clist = new CondList(); - clist->insert("*"); - setup_rule(clist, $4); - } - | TOKEN_SETUP cond '>' TOKEN_CODE - { - setup_rule($2, $4); - } -; - -cond: - /* empty */ - { - in->fatal("unnamed condition not supported"); - } - | clist - { - $$ = $1; - } - ; - -clist: - TOKEN_ID - { - $$ = new CondList(); - $$->insert(* $1); - delete $1; - } - | clist ',' TOKEN_ID - { - $1->insert(* $3); - delete $3; - $$ = $1; - } -; - -newcond: - /* empty */ - { - $$ = NULL; - } - | '=' '>' TOKEN_ID - { - $$ = $3; - } -; - -look: - /* empty */ - { - $$ = new NullOp; - } - | '/' expr - { - $$ = $2; - } -; - -expr: - diff - { - $$ = $1; - } - | expr '|' diff - { - $$ = mkAlt($1, $3); - } -; - -diff: - term - { - $$ = $1; - } - | diff '\\' term - { - $$ = in->mkDiff($1, $3); - } -; - -term: - factor - { - $$ = $1; - } - | term factor - { - $$ = new CatOp($1, $2); - } -; - -factor: - primary - { - $$ = $1; - } - | primary close - { - switch($2) - { - case '*': - $$ = new CloseOp($1); - break; - case '+': - $$ = new CatOp (new CloseOp($1), $1); - break; - case '?': - $$ = mkAlt($1, new NullOp()); - break; - } - } - | primary TOKEN_CLOSESIZE - { - if ($2.max == std::numeric_limits::max()) - { - $$ = repeat_from ($1, $2.min); - } - else if ($2.min == $2.max) - { - $$ = repeat ($1, $2.min); - } - else - { - $$ = repeat_from_to ($1, $2.min, $2.max); - } - $$ = $$ ? $$ : new NullOp; - } -; - -close: - TOKEN_CLOSE - { - $$ = $1; - } - | TOKEN_STAR - { - $$ = $1; - } - | close TOKEN_CLOSE - { - $$ = ($1 == $2) ? $1 : '*'; - } - | close TOKEN_STAR - { - $$ = ($1 == $2) ? $1 : '*'; - } -; - -primary: - TOKEN_ID - { - symbol_table_t::iterator i = symbol_table.find (* $1); - delete $1; - if (i == symbol_table.end ()) - { - in->fatal("can't find symbol"); - } - $$ = i->second; - } - | TOKEN_REGEXP - { - $$ = $1; - } - | '(' expr ')' - { - $$ = $2; - } -; - -%% - -extern "C" { -void yyerror(const char* s) -{ - in->fatal(s); -} - -int yylex(){ - return in ? in->scan() : 0; -} -} // end extern "C" - -namespace re2c -{ - -void parse(Scanner& i, Output & o) -{ - std::map > dfa_map; - ScannerState rules_state; - - in = &i; - - o.source.wversion_time () - .wline_info (in->get_cline (), in->get_fname ().c_str ()); - if (opts->target == opt_t::SKELETON) - { - Skeleton::emit_prolog (o.source); - } - - Enc encodingOld = opts->encoding; - - while ((parseMode = i.echo()) != Scanner::Stop) - { - o.source.new_block (); - bool bPrologBrace = false; - ScannerState curr_state; - - i.save_state(curr_state); - foundRules = false; - - if (opts->rFlag && parseMode == Scanner::Rules && dfa_map.size()) - { - in->fatal("cannot have a second 'rules:re2c' block"); - } - if (parseMode == Scanner::Reuse) - { - if (dfa_map.empty()) - { - in->fatal("got 'use:re2c' without 'rules:re2c'"); - } - } - else if (parseMode == Scanner::Rules) - { - i.save_state(rules_state); - } - else - { - dfa_map.clear(); - } - rank_counter.reset (); - spec.clear (); - in->set_in_parse(true); - yyparse(); - in->set_in_parse(false); - if (opts->rFlag && parseMode == Scanner::Reuse) - { - if (foundRules || opts->encoding != encodingOld) - { - // Re-parse rules - parseMode = Scanner::Parse; - i.restore_state(rules_state); - i.reuse(); - dfa_map.clear(); - parse_cleanup(); - spec.clear (); - rank_counter.reset (); - in->set_in_parse(true); - yyparse(); - in->set_in_parse(false); - - // Now append potential new rules - i.restore_state(curr_state); - parseMode = Scanner::Parse; - in->set_in_parse(true); - yyparse(); - in->set_in_parse(false); - } - encodingOld = opts->encoding; - } - o.source.set_block_line (in->get_cline ()); - uint32_t ind = opts->topIndent; - if (opts->cFlag) - { - SpecMap::iterator it; - SetupMap::const_iterator itRuleSetup; - - if (parseMode != Scanner::Reuse) - { - // <*> rules must have the lowest priority - // now that all rules have been parsed, we can fix it - for (RuleOpList::const_iterator itOp = specStar.begin(); itOp != specStar.end(); ++itOp) - { - (*itOp)->rank = rank_counter.next (); - } - // merge <*> rules to all conditions - for (it = specMap.begin(); it != specMap.end(); ++it) - { - for (RuleOpList::const_iterator itOp = specStar.begin(); itOp != specStar.end(); ++itOp) - { - it->second.add (*itOp); - } - if (star_default) - { - it->second.add_def (star_default); - } - } - - if (specNone) - { - specMap["0"].add (specNone); - // Note that "0" inserts first, which is important. - condnames.insert (condnames.begin (), "0"); - } - o.types = condnames; - } - - size_t nCount = specMap.size(); - - for (it = specMap.begin(); it != specMap.end(); ++it) - { - if (parseMode != Scanner::Reuse) - { - itRuleSetup = ruleSetupMap.find(it->first); - if (itRuleSetup != ruleSetupMap.end()) - { - yySetupRule = itRuleSetup->second.second; - } - else - { - itRuleSetup = ruleSetupMap.find("*"); - if (itRuleSetup != ruleSetupMap.end()) - { - yySetupRule = itRuleSetup->second.second; - } - else - { - yySetupRule = ""; - } - } - - dfa_map[it->first] = compile(it->second, o, it->first, opts->encoding.nCodeUnits ()); - } - if (parseMode != Scanner::Rules && dfa_map.find(it->first) != dfa_map.end()) - { - dfa_map[it->first]->emit(o, ind, !--nCount, bPrologBrace); - } - } - } - else - { - if (spec.re || !dfa_map.empty()) - { - if (parseMode != Scanner::Reuse) - { - dfa_map[""] = compile(spec, o, "", opts->encoding.nCodeUnits ()); - } - if (parseMode != Scanner::Rules && dfa_map.find("") != dfa_map.end()) - { - dfa_map[""]->emit(o, ind, 0, bPrologBrace); - } - } - } - o.source.wline_info (in->get_cline (), in->get_fname ().c_str ()); - /* restore original char handling mode*/ - opts.reset_encoding (encodingOld); - } - - if (opts->cFlag) - { - SetupMap::const_iterator itRuleSetup; - for (itRuleSetup = ruleSetupMap.begin(); itRuleSetup != ruleSetupMap.end(); ++itRuleSetup) - { - if (itRuleSetup->first != "*" && specMap.find(itRuleSetup->first) == specMap.end()) - { - in->fatalf_at(itRuleSetup->second.first, "setup for non existing rule '%s' found", itRuleSetup->first.c_str()); - } - } - if (specMap.size() < ruleSetupMap.size()) - { - uint32_t line = in->get_cline(); - itRuleSetup = ruleSetupMap.find("*"); - if (itRuleSetup != ruleSetupMap.end()) - { - line = itRuleSetup->second.first; - } - in->fatalf_at(line, "setup for all rules with '*' not possible when all rules are setup explicitly"); - } - } - - if (opts->target == opt_t::SKELETON) - { - Skeleton::emit_epilog (o.source, o.skeletons); - } - - parse_cleanup(); - in = NULL; -} - -void parse_cleanup() -{ - RegExp::vFreeList.clear(); - Range::vFreeList.clear(); - RangeSuffix::freeList.clear(); - Code::freelist.clear(); - symbol_table.clear (); - condnames.clear (); - specMap.clear(); - specStar.clear(); - star_default = NULL; - specNone = NULL; -} - -} // end namespace re2c diff --git a/src/parse/rules.h b/src/parse/rules.h deleted file mode 100644 index 7815372..0000000 --- a/src/parse/rules.h +++ /dev/null @@ -1,29 +0,0 @@ -#ifndef _RE2C_PARSE_RULES_ -#define _RE2C_PARSE_RULES_ - -#include -#include - -#include "src/ir/rule_rank.h" - -namespace re2c -{ - -struct rule_info_t -{ - uint32_t line; - std::set shadow; - bool reachable; - - rule_info_t () - : line (0) - , shadow () - , reachable (false) - {} -}; - -typedef std::map rules_t; - -} // namespace re2c - -#endif // _RE2C_PARSE_RULES_ diff --git a/src/parse/scanner.cc b/src/parse/scanner.cc deleted file mode 100644 index 09dd2bd..0000000 --- a/src/parse/scanner.cc +++ /dev/null @@ -1,211 +0,0 @@ -#include -#include -#include -#include -#include -#include - -#include "src/codegen/label.h" -#include "src/codegen/output.h" -#include "src/conf/opt.h" -#include "src/globals.h" -#include "src/parse/scanner.h" -#include "src/util/counter.h" - -// used by Scanner::fatal_at and Scanner::fatalf -#if defined(_MSC_VER) && !defined(vsnprintf) -# define vsnprintf _vsnprintf -#endif - -namespace re2c { - -const uint32_t Scanner::BSIZE = 8192; - -ScannerState::ScannerState () - : tok (NULL) - , ptr (NULL) - , cur (NULL) - , pos (NULL) - , ctx (NULL) - , bot (NULL) - , lim (NULL) - , top (NULL) - , eof (NULL) - , tchar (0) - , tline (0) - , cline (1) - , in_parse (false) - , lexer_state (LEX_NORMAL) -{} - -ScannerState::ScannerState (const ScannerState & s) - : tok (s.tok) - , ptr (s.ptr) - , cur (s.cur) - , pos (s.pos) - , ctx (s.ctx) - , bot (s.bot) - , lim (s.lim) - , top (s.top) - , eof (s.eof) - , tchar (s.tchar) - , tline (s.tline) - , cline (s.cline) - , in_parse (s.in_parse) - , lexer_state (s.lexer_state) -{} - -ScannerState & ScannerState::operator = (const ScannerState & s) -{ - this->~ScannerState (); - new (this) ScannerState (s); - return * this; -} - -Scanner::Scanner (Input & i, OutputFile & o) - : ScannerState () - , in (i) - , out (o) -{} - -void Scanner::fill (uint32_t need) -{ - if(!eof) - { - /* Do not get rid of anything when rFlag is active. Otherwise - * get rid of everything that was already handedout. */ - if (!opts->rFlag) - { - const ptrdiff_t diff = tok - bot; - if (diff > 0) - { - const size_t move = static_cast (top - tok); - memmove (bot, tok, move); - tok -= diff; - ptr -= diff; - cur -= diff; - pos -= diff; - lim -= diff; - ctx -= diff; - } - } - /* In crease buffer size. */ - if (BSIZE > need) - { - need = BSIZE; - } - if (static_cast (top - lim) < need) - { - const size_t copy = static_cast (lim - bot); - char * buf = new char[copy + need]; - if (!buf) - { - fatal("Out of memory"); - } - memcpy (buf, bot, copy); - tok = &buf[tok - bot]; - ptr = &buf[ptr - bot]; - cur = &buf[cur - bot]; - pos = &buf[pos - bot]; - lim = &buf[lim - bot]; - top = &lim[need]; - ctx = &buf[ctx - bot]; - delete [] bot; - bot = buf; - } - /* Append to buffer. */ - const size_t have = fread (lim, 1, need, in.file); - if (have != need) - { - eof = &lim[have]; - *eof++ = '\0'; - } - lim += have; - } -} - -void Scanner::set_in_parse(bool new_in_parse) -{ - in_parse = new_in_parse; -} - -void Scanner::fatal_at(uint32_t line, ptrdiff_t ofs, const char *msg) const -{ - std::cerr << "re2c: error: " - << "line " << line << ", column " << (tchar + ofs + 1) << ": " - << msg << std::endl; - exit(1); -} - -void Scanner::fatal(ptrdiff_t ofs, const char *msg) const -{ - fatal_at(in_parse ? tline : cline, ofs, msg); -} - -void Scanner::fatalf_at(uint32_t line, const char* fmt, ...) const -{ - char szBuf[4096]; - - va_list args; - - va_start(args, fmt); - vsnprintf(szBuf, sizeof(szBuf), fmt, args); - va_end(args); - - szBuf[sizeof(szBuf)-1] = '0'; - - fatal_at(line, 0, szBuf); -} - -void Scanner::fatalf(const char *fmt, ...) const -{ - char szBuf[4096]; - - va_list args; - - va_start(args, fmt); - vsnprintf(szBuf, sizeof(szBuf), fmt, args); - va_end(args); - - szBuf[sizeof(szBuf)-1] = '0'; - - fatal(szBuf); -} - -Scanner::~Scanner() -{ - delete [] bot; -} - -void Scanner::reuse() -{ - out.label_counter.reset (); - last_fill_index = 0; - bWroteGetState = false; - bWroteCondCheck = false; - opts.reset_mapCodeName (); -} - -void Scanner::restore_state(const ScannerState& state) -{ - ptrdiff_t diff = bot - state.bot; - char *old_bot = bot; - char *old_lim = lim; - char *old_top = top; - char *old_eof = eof; - *(ScannerState*)this = state; - if (diff) - { - tok -= diff; - ptr -= diff; - cur -= diff; - pos -= diff; - ctx -= diff; - bot = old_bot; - lim = old_lim; - top = old_top; - eof = old_eof; - } -} - -} // namespace re2c diff --git a/src/parse/scanner.h b/src/parse/scanner.h deleted file mode 100644 index d13eeaa..0000000 --- a/src/parse/scanner.h +++ /dev/null @@ -1,147 +0,0 @@ -#ifndef _RE2C_PARSE_SCANNER_ -#define _RE2C_PARSE_SCANNER_ - -#include "src/util/c99_stdint.h" -#include -#include - -#include "src/parse/input.h" -#include "src/util/attribute.h" -#include "src/util/forbid_copy.h" - -namespace re2c -{ - -class Range; -class RegExp; -struct OutputFile; - -struct ScannerState -{ - enum lexer_state_t - { - LEX_NORMAL, - LEX_FLEX_NAME - }; - - // positioning - char * tok; - char * ptr; - char * cur; - char * pos; - char * ctx; - - // buffer - char * bot; - char * lim; - char * top; - char * eof; - - ptrdiff_t tchar; - uint32_t tline; - uint32_t cline; - - bool in_parse; - lexer_state_t lexer_state; - - ScannerState (); - ScannerState (const ScannerState &); - ScannerState & operator = (const ScannerState &); -}; - -class Scanner: private ScannerState -{ - static const uint32_t BSIZE; - - Input & in; -public: - OutputFile & out; - -private: - void fill (uint32_t); - void set_sourceline (); - uint32_t lex_cls_chr(); - uint32_t lex_str_chr(char quote, bool &end); - RegExp *lex_cls(bool neg); - RegExp *lex_str(char quote, bool casing); - RegExp *schr(uint32_t c) const; - RegExp *ichr(uint32_t c) const; - RegExp *cls(Range *r) const; - - void lex_conf (); - void lex_conf_assign (); - void lex_conf_semicolon (); - int32_t lex_conf_number (); - std::string lex_conf_string (); - - size_t tok_len () const; - -public: - Scanner(Input &, OutputFile &); - ~Scanner(); - - enum ParseMode { - Stop, - Parse, - Reuse, - Rules - }; - - ParseMode echo(); - int scan(); - void reuse(); - - void save_state(ScannerState&) const; - void restore_state(const ScannerState&); - - uint32_t get_cline() const; - uint32_t get_line() const; - const std::string & get_fname () const; - void set_in_parse(bool new_in_parse); - void fatal_at(uint32_t line, ptrdiff_t ofs, const char *msg) const; - void fatalf_at(uint32_t line, const char*, ...) const RE2C_GXX_ATTRIBUTE ((format (printf, 3, 4))); - void fatalf(const char*, ...) const RE2C_GXX_ATTRIBUTE ((format (printf, 2, 3))); - void fatal(const char*) const; - void fatal(ptrdiff_t, const char*) const; - - RegExp * mkDiff (RegExp * e1, RegExp * e2) const; - RegExp * mkDot () const; - RegExp * mkDefault () const; - - FORBID_COPY (Scanner); -}; - -inline size_t Scanner::tok_len () const -{ - // lexing and fill procedures must maintain: token pointer <= cursor pointer - return static_cast (cur - tok); -} - -inline const std::string & Scanner::get_fname () const -{ - return in.file_name; -} - -inline uint32_t Scanner::get_cline() const -{ - return cline; -} - -inline uint32_t Scanner::get_line() const -{ - return in_parse ? tline : cline; -} - -inline void Scanner::save_state(ScannerState& state) const -{ - state = *this; -} - -inline void Scanner::fatal(const char *msg) const -{ - fatal(0, msg); -} - -} // end namespace re2c - -#endif // _RE2C_PARSE_SCANNER_ diff --git a/src/parse/spec.h b/src/parse/spec.h deleted file mode 100644 index 0b68af7..0000000 --- a/src/parse/spec.h +++ /dev/null @@ -1,55 +0,0 @@ -#ifndef _RE2C_PARSE_SPEC_ -#define _RE2C_PARSE_SPEC_ - -#include "src/ir/regexp/regexp_rule.h" -#include "src/parse/rules.h" - -namespace re2c -{ - -struct Spec -{ - RegExp * re; - rules_t rules; - - Spec () - : re (NULL) - , rules () - {} - Spec (const Spec & spec) - : re (spec.re) - , rules (spec.rules) - {} - Spec & operator = (const Spec & spec) - { - re = spec.re; - rules = spec.rules; - return *this; - } - bool add_def (RuleOp * r) - { - if (rules.find (rule_rank_t::def ()) != rules.end ()) - { - return false; - } - else - { - add (r); - return true; - } - } - void add (RuleOp * r) - { - rules[r->rank].line = r->loc.line; - re = mkAlt (re, r); - } - void clear () - { - re = NULL; - rules.clear (); - } -}; - -} // namespace re2c - -#endif // _RE2C_PARSE_SPEC_ diff --git a/src/re/ast_to_re.cc b/src/re/ast_to_re.cc new file mode 100644 index 0000000..dbcd0d0 --- /dev/null +++ b/src/re/ast_to_re.cc @@ -0,0 +1,373 @@ +#include +#include "src/util/c99_stdint.h" +#include +#include +#include +#include +#include +#include + +#include "src/ast/ast.h" +#include "src/conf/msg.h" +#include "src/conf/opt.h" +#include "src/conf/warn.h" +#include "src/re/empty_class_policy.h" +#include "src/re/encoding/case.h" +#include "src/re/encoding/enc.h" +#include "src/re/encoding/utf16/utf16_regexp.h" +#include "src/re/encoding/utf8/utf8_regexp.h" +#include "src/re/re.h" +#include "src/re/rule.h" +#include "src/re/tag.h" +#include "src/util/range.h" + +namespace re2c { + +/* note [default regexp] + * + * Create a byte range that includes all possible input characters. + * This may include characters, which do not map to any valid symbol + * in current encoding. For encodings, which directly map symbols to + * input characters (ASCII, EBCDIC, UTF-32), it equals [^]. For other + * encodings (UTF-16, UTF-8), [^] and this range are different. + * + * Also note that default range doesn't respect encoding policy + * (the way invalid code points are treated). + */ + +/* note [POSIX subexpression hierarchy] + * + * POSIX treats subexpressions with and without captures as equal, + * therefore we have to insert missing captures in subexpressions + * that influence disambiguation of existing captures. Such cases are: + * left alternative in union (unless it is already a capture) and first + * operand in concatenation (unless it is a capture or the length of + * strings accepted by it is fixed). Of course, this insertion only + * applies to subexpressions that have nested captures. + */ + +static bool has_tags(const AST *ast) +{ + switch (ast->type) { + case AST::NIL: + case AST::STR: + case AST::CLS: + case AST::DOT: + case AST::DEFAULT: + case AST::DIFF: return false; + case AST::TAG: + case AST::CAP: return true; + case AST::ALT: return has_tags(ast->alt.ast1) || has_tags(ast->alt.ast2); + case AST::CAT: return has_tags(ast->cat.ast1) || has_tags(ast->cat.ast2); + case AST::REF: return has_tags(ast->ref.ast); + case AST::ITER: return has_tags(ast->iter.ast); + } + return false; /* unreachable */ +} + +static size_t fixlen(const AST *ast) +{ + switch (ast->type) { + case AST::NIL: + case AST::TAG: return 0; + case AST::CLS: + case AST::DOT: + case AST::DEFAULT: + case AST::DIFF: return 1; + case AST::STR: return ast->str.chars->size(); + case AST::ALT: { + const size_t + l1 = fixlen(ast->alt.ast1), + l2 = fixlen(ast->alt.ast2); + return l1 == l2 ? l1 : Tag::VARDIST; + } + case AST::CAT: { + const size_t + l1 = fixlen(ast->cat.ast1), + l2 = fixlen(ast->cat.ast2); + return l1 == Tag::VARDIST || l2 == Tag::VARDIST + ? Tag::VARDIST : l1 + l2; + } + case AST::REF: return fixlen(ast->ref.ast); + case AST::ITER: { + const size_t l = fixlen(ast->iter.ast); + const uint32_t m = ast->iter.min, n = ast->iter.max; + return l == Tag::VARDIST || m != n + ? Tag::VARDIST : l * (n - m); + } + case AST::CAP: return fixlen(ast->cap); + } + return Tag::VARDIST; /* unreachable */ +} + +static RE *ast_to_re(RESpec &spec, const AST *ast, size_t &ncap) +{ + RE::alc_t &alc = spec.alc; + std::vector &tags = spec.tags; + const opt_t *opts = spec.opts; + Warn &warn = spec.warn; + + switch (ast->type) { + case AST::NIL: + return re_nil(alc); + case AST::STR: { + const bool icase = opts->bCaseInsensitive + || (ast->str.icase != opts->bCaseInverted); + RE *x = NULL; + std::vector::const_iterator + i = ast->str.chars->begin(), + e = ast->str.chars->end(); + for (; i != e; ++i) { + x = re_cat(alc, x, icase + ? re_ichar(alc, ast->line, i->column, i->chr, opts) + : re_schar(alc, ast->line, i->column, i->chr, opts)); + } + return x ? x : re_nil(alc); + } + case AST::CLS: { + Range *r = NULL; + std::vector::const_iterator + i = ast->cls.ranges->begin(), + e = ast->cls.ranges->end(); + for (; i != e; ++i) { + Range *s = opts->encoding.encodeRange(i->lower, i->upper); + if (!s) fatal_lc(ast->line, i->column, + "bad code point range: '0x%X - 0x%X'", i->lower, i->upper); + r = Range::add(r, s); + } + if (ast->cls.negated) { + r = Range::sub(opts->encoding.fullRange(), r); + } + return re_class(alc, ast->line, ast->column, r, opts, warn); + } + case AST::DOT: { + uint32_t c = '\n'; + if (!opts->encoding.encode(c)) { + fatal_lc(ast->line, ast->column, "bad code point: '0x%X'", c); + } + return re_class(alc, ast->line, ast->column, + Range::sub(opts->encoding.fullRange(), Range::sym(c)), opts, warn); + } + case AST::DEFAULT: + // see note [default regexp] + return re_sym(alc, Range::ran(0, opts->encoding.nCodeUnits())); + case AST::ALT: { + RE *t1 = NULL, *t2 = NULL, *x, *y; + if (opts->posix_captures && has_tags(ast) + && ast->alt.ast1->type != AST::CAP) { + // see note [POSIX subexpression hierarchy] + t1 = re_tag(alc, tags.size(), false); + tags.push_back(Tag(Tag::FICTIVE, false)); + t2 = re_tag(alc, tags.size(), false); + tags.push_back(Tag(Tag::FICTIVE, false)); + } + x = ast_to_re(spec, ast->alt.ast1, ncap); + x = re_cat(alc, t1, re_cat(alc, x, t2)); + y = ast_to_re(spec, ast->alt.ast2, ncap); + return re_alt(alc, x, y); + } + case AST::DIFF: { + RE *x = ast_to_re(spec, ast->diff.ast1, ncap); + RE *y = ast_to_re(spec, ast->diff.ast2, ncap); + if (x->type != RE::SYM || y->type != RE::SYM) { + fatal_lc(ast->line, ast->column, "can only difference char sets"); + } + return re_class(alc, ast->line, ast->column, Range::sub(x->sym, y->sym), opts, warn); + } + case AST::CAT: { + RE *t1 = NULL, *t2 = NULL, *x, *y; + const AST *a1 = ast->alt.ast1; + if (opts->posix_captures && has_tags(ast) + && a1->type != AST::CAP && fixlen(a1) == Tag::VARDIST) { + // see note [POSIX subexpression hierarchy] + t1 = re_tag(alc, tags.size(), false); + tags.push_back(Tag(Tag::FICTIVE, false)); + t2 = re_tag(alc, tags.size(), false); + tags.push_back(Tag(Tag::FICTIVE, false)); + } + x = ast_to_re(spec, ast->cat.ast1, ncap); + x = re_cat(alc, t1, re_cat(alc, x, t2)); + y = ast_to_re(spec, ast->cat.ast2, ncap); + return re_cat(alc, x, y); + } + case AST::TAG: { + if (ast->tag.name && !opts->tags) { + fatal_lc(ast->line, ast->column, + "tags are only allowed with '-T, --tags' option"); + } + if (opts->posix_captures) { + fatal_lc(ast->line, ast->column, + "simple tags are not allowed with '--posix-captures' option"); + } + RE *t = re_tag(alc, tags.size(), false); + tags.push_back(Tag(ast->tag.name, ast->tag.history)); + return t; + } + case AST::CAP: { + if (!opts->posix_captures) { + return ast_to_re(spec, ast->cap, ncap); + } + const AST *x = ast->cap; + if (x->type == AST::REF) x = x->ref.ast; + + RE *t1 = re_tag(alc, tags.size(), false); + tags.push_back(Tag(2 * ncap, false)); + + RE *t2 = re_tag(alc, tags.size(), false); + tags.push_back(Tag(2 * ncap + 1, false)); + + ++ncap; + return re_cat(alc, t1, re_cat(alc, ast_to_re(spec, x, ncap), t2)); + } + case AST::REF: + if (!opts->posix_captures) { + return ast_to_re(spec, ast->ref.ast, ncap); + } + fatal_l(ast->line, + "implicit grouping is forbidden with '--posix-captures'" + " option, please wrap '%s' in capturing parenthesis", + ast->ref.name->c_str()); + return NULL; + case AST::ITER: { + const uint32_t + n = ast->iter.min, + n1 = std::max(n, 1u), + m = std::max(n, ast->iter.max); + const AST *x = ast->iter.ast; + + RE *t1 = NULL, *t2 = NULL; + if (opts->posix_captures && x->type == AST::CAP) { + x = x->cap; + if (x->type == AST::REF) x = x->ref.ast; + + t1 = re_tag(alc, tags.size(), false); + tags.push_back(Tag(2 * ncap, m > 1)); + + t2 = re_tag(alc, tags.size(), false); + tags.push_back(Tag(2 * ncap + 1, false)); + + ++ncap; + } + + RE *y = NULL; + if (m == 0) { + y = re_cat(alc, t1, t2); + } else if (m == 1) { + y = ast_to_re(spec, x, ncap); + y = re_cat(alc, t1, re_cat(alc, y, t2)); + } else { + y = ast_to_re(spec, x, ncap); + y = re_cat(alc, t1, y); + y = re_iter(alc, y, n1, m); + y = re_cat(alc, y, t2); + } + if (n == 0) { + y = re_alt(alc, y, re_nil(alc)); + } + return y; + } + } + return NULL; /* unreachable */ +} + +RE *re_schar(RE::alc_t &alc, uint32_t line, uint32_t column, uint32_t c, const opt_t *opts) +{ + if (!opts->encoding.encode(c)) { + fatal_lc(line, column, "bad code point: '0x%X'", c); + } + switch (opts->encoding.type()) { + case Enc::UTF16: + return UTF16Symbol(alc, c); + case Enc::UTF8: + return UTF8Symbol(alc, c); + case Enc::ASCII: + case Enc::EBCDIC: + case Enc::UTF32: + case Enc::UCS2: + return re_sym(alc, Range::sym(c)); + } + return NULL; /* unreachable */ +} + +RE *re_ichar(RE::alc_t &alc, uint32_t line, uint32_t column, uint32_t c, const opt_t *opts) +{ + if (is_alpha(c)) { + return re_alt(alc, + re_schar(alc, line, column, to_lower_unsafe(c), opts), + re_schar(alc, line, column, to_upper_unsafe(c), opts)); + } else { + return re_schar(alc, line, column, c, opts); + } +} + +RE *re_class(RE::alc_t &alc, uint32_t line, uint32_t column, const Range *r, const opt_t *opts, Warn &warn) +{ + if (!r) { + switch (opts->empty_class_policy) { + case EMPTY_CLASS_MATCH_EMPTY: + warn.empty_class(line); + return re_nil(alc); + case EMPTY_CLASS_MATCH_NONE: + warn.empty_class(line); + break; + case EMPTY_CLASS_ERROR: + fatal_lc(line, column, "empty character class"); + } + } + switch (opts->encoding.type()) { + case Enc::UTF16: + return UTF16Range(alc, r); + case Enc::UTF8: + return UTF8Range(alc, r); + case Enc::ASCII: + case Enc::EBCDIC: + case Enc::UTF32: + case Enc::UCS2: + return re_sym(alc, r); + } + return NULL; /* unreachable */ +} + +static void assert_tags_used_once(const Rule &rule, const std::vector &tags) +{ + std::set names; + const std::string *name = NULL; + + for (size_t t = rule.ltag; t < rule.htag; ++t) { + name = tags[t].name; + if (name && !names.insert(*name).second) { + fatal_l(rule.code->fline, + "tag '%s' is used multiple times in the same rule", + name->c_str()); + } + } +} + +static void init_rule(Rule &rule, const Code *code, const std::vector &tags, + size_t ltag, size_t ncap) +{ + rule.code = code; + rule.ltag = ltag; + rule.htag = tags.size(); + for (rule.ttag = ltag; rule.ttag < rule.htag && !trailing(tags[rule.ttag]); ++rule.ttag); + rule.ncap = ncap; + assert_tags_used_once(rule, tags); +} + +RESpec::RESpec(const std::vector &ast, const opt_t *o, Warn &w) + : alc() + , res() + , charset(*new std::vector) + , tags(*new std::vector) + , rules(*new std::valarray(ast.size())) + , opts(o) + , warn(w) +{ + for (size_t i = 0; i < ast.size(); ++i) { + size_t ltag = tags.size(), ncap = 0; + res.push_back(ast_to_re(*this, ast[i].ast, ncap)); + init_rule(rules[i], ast[i].code, tags, ltag, ncap); + } +} + +} // namespace re2c diff --git a/src/re/default_tags.cc b/src/re/default_tags.cc new file mode 100644 index 0000000..226e705 --- /dev/null +++ b/src/re/default_tags.cc @@ -0,0 +1,58 @@ +#include +#include + +#include "src/re/re.h" + +namespace re2c { + +// Fictive tags do not really need default counterparts: +// maximization can work without them based on version numbers. +// For now it does not seem like a useful optimization, but some day +// in future it might change. +static void insert_default_tags(RESpec &spec, RE *re, size_t *&tidx) +{ + RE::alc_t &alc = spec.alc; + switch (re->type) { + case RE::NIL: break; + case RE::SYM: break; + case RE::ALT: { + size_t *i = tidx; + RE *x = re_nil(alc), *y = re_nil(alc); + insert_default_tags(spec, re->alt.re1, tidx); + for (; i < tidx; ++i) { + x = re_cat(alc, x, re_tag(alc, *i, true)); + } + insert_default_tags(spec, re->alt.re2, tidx); + for (; i < tidx; ++i) { + y = re_cat(alc, y, re_tag(alc, *i, true)); + } + re->alt.re1 = re_cat(alc, re->alt.re1, y); + re->alt.re2 = re_cat(alc, re->alt.re2, x); + break; + } + case RE::CAT: + insert_default_tags(spec, re->cat.re1, tidx); + insert_default_tags(spec, re->cat.re2, tidx); + break; + case RE::ITER: + insert_default_tags(spec, re->iter.re, tidx); + break; + case RE::TAG: + *tidx++ = re->tag.idx; + break; + } +} + +void insert_default_tags(RESpec &spec) +{ + size_t *tidx0 = new size_t[spec.tags.size()], *tidx = tidx0; + std::vector::iterator + i = spec.res.begin(), + e = spec.res.end(); + for (; i != e; ++i) { + insert_default_tags(spec, *i, tidx); + } + delete[] tidx0; +} + +} // namespace re2c diff --git a/src/ir/regexp/empty_class_policy.h b/src/re/empty_class_policy.h similarity index 61% rename from src/ir/regexp/empty_class_policy.h rename to src/re/empty_class_policy.h index bb062de..caf60a4 100644 --- a/src/ir/regexp/empty_class_policy.h +++ b/src/re/empty_class_policy.h @@ -1,5 +1,5 @@ -#ifndef _RE2C_IR_REGEXP_EMPTY_CLASS_POLICY_ -#define _RE2C_IR_REGEXP_EMPTY_CLASS_POLICY_ +#ifndef _RE2C_RE_EMPTY_CLASS_POLICY_ +#define _RE2C_RE_EMPTY_CLASS_POLICY_ namespace re2c { @@ -12,4 +12,4 @@ enum empty_class_policy_t } // namespace re2c -#endif // _RE2C_IR_REGEXP_EMPTY_CLASS_POLICY_ +#endif // _RE2C_RE_EMPTY_CLASS_POLICY_ diff --git a/src/ir/regexp/encoding/case.h b/src/re/encoding/case.h similarity index 78% rename from src/ir/regexp/encoding/case.h rename to src/re/encoding/case.h index 38efa0e..dc79360 100644 --- a/src/ir/regexp/encoding/case.h +++ b/src/re/encoding/case.h @@ -1,5 +1,5 @@ -#ifndef _RE2C_IR_REGEXP_ENCODING_CASE_ -#define _RE2C_IR_REGEXP_ENCODING_CASE_ +#ifndef _RE2C_RE_ENCODING_CASE_ +#define _RE2C_RE_ENCODING_CASE_ #include "src/util/c99_stdint.h" @@ -28,4 +28,4 @@ inline uint32_t to_upper_unsafe (uint32_t c) } -#endif // _RE2C_IR_REGEXP_ENCODING_CASE_ +#endif // _RE2C_RE_ENCODING_CASE_ diff --git a/src/ir/regexp/encoding/enc.cc b/src/re/encoding/enc.cc similarity index 99% rename from src/ir/regexp/encoding/enc.cc rename to src/re/encoding/enc.cc index d8c5e98..5f65e82 100644 --- a/src/ir/regexp/encoding/enc.cc +++ b/src/re/encoding/enc.cc @@ -1,4 +1,7 @@ -#include "src/ir/regexp/encoding/enc.h" +#include "src/re/encoding/enc.h" + +#include + #include "src/util/range.h" namespace re2c { diff --git a/src/ir/regexp/encoding/enc.h b/src/re/encoding/enc.h similarity index 82% rename from src/ir/regexp/encoding/enc.h rename to src/re/encoding/enc.h index b85ae0b..b4afa83 100644 --- a/src/ir/regexp/encoding/enc.h +++ b/src/re/encoding/enc.h @@ -1,5 +1,5 @@ -#ifndef _RE2C_IR_REGEXP_ENCODING_ENC_ -#define _RE2C_IR_REGEXP_ENCODING_ENC_ +#ifndef _RE2C_RE_ENCODING_ENC_ +#define _RE2C_RE_ENCODING_ENC_ #include "src/util/c99_stdint.h" @@ -80,7 +80,7 @@ public: inline uint32_t szCodePoint() const; inline uint32_t szCodeUnit() const; - inline bool set(type_t t); + inline void set(type_t t); inline void unset(type_t); inline type_t type () const; @@ -94,86 +94,73 @@ public: inline const char * Enc::name (type_t t) { - switch (t) - { + switch (t) { case ASCII: return "ASCII"; case EBCDIC: return "EBCDIC"; case UTF8: return "UTF8"; case UCS2: return "USC2"; case UTF16: return "UTF16"; case UTF32: return "UTF32"; - default: return ""; } + return ""; /* error */ } inline uint32_t Enc::nCodePoints() const { - switch (type_) - { + switch (type_) { case ASCII: - case EBCDIC: return 0x100; - case UCS2: return 0x10000; + case EBCDIC: return 0x100; + case UCS2: return 0x10000; case UTF16: case UTF32: - case UTF8: - default: return 0x110000; + case UTF8: return 0x110000; } + return 0; /* error */ } inline uint32_t Enc::nCodeUnits() const { - switch (type_) - { + switch (type_) { case ASCII: case EBCDIC: - case UTF8: return 0x100; + case UTF8: return 0x100; case UCS2: - case UTF16: return 0x10000; - case UTF32: - default: return 0x110000; + case UTF16: return 0x10000; + case UTF32: return 0x110000; } + return 0; /* error */ } // returns *maximal* code point size for encoding inline uint32_t Enc::szCodePoint() const { - switch (type_) - { + switch (type_) { case ASCII: - case EBCDIC: return 1; - case UCS2: return 2; + case EBCDIC: return 1; + case UCS2: return 2; case UTF16: case UTF32: - case UTF8: - default: return 4; + case UTF8: return 4; } + return 0; /* error */ } inline uint32_t Enc::szCodeUnit() const { - switch (type_) - { + switch (type_) { case ASCII: case EBCDIC: - case UTF8: return 1; + case UTF8: return 1; case UCS2: - case UTF16: return 2; - case UTF32: - default: return 4; + case UTF16: return 2; + case UTF32: return 4; } + return 0; /* error */ } -inline bool Enc::set(type_t t) +inline void Enc::set(type_t t) { - if (type_ == t) - return true; - else if (type_ != ASCII) - return false; - else - { - type_ = t; - return true; - } + type_ = t; } inline void Enc::unset(type_t t) @@ -194,4 +181,4 @@ inline void Enc::setPolicy(policy_t t) } // namespace re2c -#endif // _RE2C_IR_REGEXP_ENCODING_ENC_ +#endif // _RE2C_RE_ENCODING_ENC_ diff --git a/src/re/encoding/range_suffix.cc b/src/re/encoding/range_suffix.cc new file mode 100644 index 0000000..99826fe --- /dev/null +++ b/src/re/encoding/range_suffix.cc @@ -0,0 +1,32 @@ +#include "src/re/encoding/range_suffix.h" +#include "src/util/range.h" + +namespace re2c { + +static RE *emit(RE::alc_t &alc, RangeSuffix *p, RE *re); + +free_list RangeSuffix::freeList; + +RE *to_regexp(RE::alc_t &alc, RangeSuffix *p) +{ + return p ? emit(alc, p, NULL) : re_sym(alc, NULL); +} + +/* + * Build regexp from suffix tree. + */ +RE *emit(RE::alc_t &alc, RangeSuffix *p, RE *re) +{ + if (p == NULL) { + return re; + } else { + RE *regexp = NULL; + for (; p != NULL; p = p->next) { + RE *re1 = re_cat(alc, re_sym(alc, Range::ran(p->l, p->h + 1)), re); + regexp = re_alt(alc, regexp, emit(alc, p->child, re1)); + } + return regexp; + } +} + +} // namespace re2c diff --git a/src/ir/regexp/encoding/range_suffix.h b/src/re/encoding/range_suffix.h similarity index 70% rename from src/ir/regexp/encoding/range_suffix.h rename to src/re/encoding/range_suffix.h index ea46bdd..ae7a6a5 100644 --- a/src/ir/regexp/encoding/range_suffix.h +++ b/src/re/encoding/range_suffix.h @@ -1,16 +1,15 @@ -#ifndef _RE2C_IR_REGEXP_ENCODING_RANGE_SUFFIX_ -#define _RE2C_IR_REGEXP_ENCODING_RANGE_SUFFIX_ +#ifndef _RE2C_RE_ENCODING_RANGE_SUFFIX_ +#define _RE2C_RE_ENCODING_RANGE_SUFFIX_ -#include "src/util/c99_stdint.h" #include // NULL +#include "src/util/c99_stdint.h" +#include "src/re/re.h" #include "src/util/forbid_copy.h" #include "src/util/free_list.h" namespace re2c { -class RegExp; - struct RangeSuffix { static free_list freeList; @@ -32,8 +31,8 @@ struct RangeSuffix FORBID_COPY (RangeSuffix); }; -RegExp * to_regexp (RangeSuffix * p); +RE *to_regexp(RE::alc_t &alc, RangeSuffix *p); } // namespace re2c -#endif // _RE2C_IR_REGEXP_ENCODING_RANGE_SUFFIX_ +#endif // _RE2C_RE_ENCODING_RANGE_SUFFIX_ diff --git a/src/ir/regexp/encoding/utf16/utf16.cc b/src/re/encoding/utf16/utf16.cc similarity index 82% rename from src/ir/regexp/encoding/utf16/utf16.cc rename to src/re/encoding/utf16/utf16.cc index 4b0a13b..7fad3c9 100644 --- a/src/ir/regexp/encoding/utf16/utf16.cc +++ b/src/re/encoding/utf16/utf16.cc @@ -1,4 +1,4 @@ -#include "src/ir/regexp/encoding/utf16/utf16.h" +#include "src/re/encoding/utf16/utf16.h" namespace re2c { diff --git a/src/ir/regexp/encoding/utf16/utf16.h b/src/re/encoding/utf16/utf16.h similarity index 82% rename from src/ir/regexp/encoding/utf16/utf16.h rename to src/re/encoding/utf16/utf16.h index 89cdbdb..81dc71e 100644 --- a/src/ir/regexp/encoding/utf16/utf16.h +++ b/src/re/encoding/utf16/utf16.h @@ -1,5 +1,5 @@ -#ifndef _RE2C_IR_REGEXP_ENCODING_UTF16_UTF16_ -#define _RE2C_IR_REGEXP_ENCODING_UTF16_UTF16_ +#ifndef _RE2C_RE_ENCODING_UTF16_UTF16_ +#define _RE2C_RE_ENCODING_UTF16_UTF16_ #include "src/util/c99_stdint.h" @@ -34,4 +34,4 @@ inline uint32_t utf16::trail_surr(rune r) } // namespace re2c -#endif // _RE2C_IR_REGEXP_ENCODING_UTF16_UTF16_ +#endif // _RE2C_RE_ENCODING_UTF16_UTF16_ diff --git a/src/ir/regexp/encoding/utf16/utf16_range.cc b/src/re/encoding/utf16/utf16_range.cc similarity index 97% rename from src/ir/regexp/encoding/utf16/utf16_range.cc rename to src/re/encoding/utf16/utf16_range.cc index 51f966b..f0164d1 100644 --- a/src/ir/regexp/encoding/utf16/utf16_range.cc +++ b/src/re/encoding/utf16/utf16_range.cc @@ -1,5 +1,8 @@ -#include "src/ir/regexp/encoding/utf16/utf16_range.h" -#include "src/ir/regexp/encoding/range_suffix.h" +#include "src/re/encoding/utf16/utf16_range.h" + +#include + +#include "src/re/encoding/range_suffix.h" namespace re2c { diff --git a/src/ir/regexp/encoding/utf16/utf16_range.h b/src/re/encoding/utf16/utf16_range.h similarity index 71% rename from src/ir/regexp/encoding/utf16/utf16_range.h rename to src/re/encoding/utf16/utf16_range.h index 8a74e8f..f9fabb2 100644 --- a/src/ir/regexp/encoding/utf16/utf16_range.h +++ b/src/re/encoding/utf16/utf16_range.h @@ -1,9 +1,9 @@ -#ifndef _RE2C_IR_REGEXP_ENCODING_UTF16_RANGE_ -#define _RE2C_IR_REGEXP_ENCODING_UTF16_RANGE_ +#ifndef _RE2C_RE_ENCODING_UTF16_RANGE_ +#define _RE2C_RE_ENCODING_UTF16_RANGE_ #include "src/util/c99_stdint.h" -#include "src/ir/regexp/encoding/utf16/utf16.h" +#include "src/re/encoding/utf16/utf16.h" namespace re2c { @@ -16,4 +16,4 @@ void UTF16splitByRuneLength(RangeSuffix * & root, utf16::rune l, utf16::rune h); } // namespace re2c -#endif // _RE2C_IR_REGEXP_ENCODING_UTF16_RANGE_ +#endif // _RE2C_RE_ENCODING_UTF16_RANGE_ diff --git a/src/ir/regexp/encoding/utf16/utf16_regexp.cc b/src/re/encoding/utf16/utf16_regexp.cc similarity index 53% rename from src/ir/regexp/encoding/utf16/utf16_regexp.cc rename to src/re/encoding/utf16/utf16_regexp.cc index 3b24429..43fed26 100644 --- a/src/ir/regexp/encoding/utf16/utf16_regexp.cc +++ b/src/re/encoding/utf16/utf16_regexp.cc @@ -1,23 +1,23 @@ +#include #include "src/util/c99_stdint.h" -#include "src/ir/regexp/encoding/utf16/utf16_regexp.h" -#include "src/ir/regexp/encoding/range_suffix.h" -#include "src/ir/regexp/encoding/utf16/utf16_range.h" -#include "src/ir/regexp/regexp_cat.h" -#include "src/ir/regexp/regexp_match.h" +#include "src/re/encoding/range_suffix.h" +#include "src/re/encoding/utf16/utf16_range.h" +#include "src/re/encoding/utf16/utf16_regexp.h" #include "src/util/range.h" namespace re2c { -RegExp * UTF16Symbol(utf16::rune r) +RE *UTF16Symbol(RE::alc_t &alc, utf16::rune r) { - if (r <= utf16::MAX_1WORD_RUNE) - return new MatchOp(Range::sym (r)); - else - { + if (r <= utf16::MAX_1WORD_RUNE) { + return re_sym(alc, Range::sym(r)); + } else { const uint32_t ld = utf16::lead_surr(r); const uint32_t tr = utf16::trail_surr(r); - return new CatOp(new MatchOp(Range::sym (ld)), new MatchOp(Range::sym (tr))); + return re_cat(alc, + re_sym(alc, Range::sym(ld)), + re_sym(alc, Range::sym(tr))); } } @@ -27,12 +27,12 @@ RegExp * UTF16Symbol(utf16::rune r) * them. We store partially built range in suffix tree, which * allows to eliminate common suffixes while building. */ -RegExp * UTF16Range(const Range * r) +RE *UTF16Range(RE::alc_t &alc, const Range *r) { RangeSuffix * root = NULL; for (; r != NULL; r = r->next ()) UTF16splitByRuneLength(root, r->lower (), r->upper () - 1); - return to_regexp (root); + return to_regexp(alc, root); } } // namespace re2c diff --git a/src/re/encoding/utf16/utf16_regexp.h b/src/re/encoding/utf16/utf16_regexp.h new file mode 100644 index 0000000..954ea52 --- /dev/null +++ b/src/re/encoding/utf16/utf16_regexp.h @@ -0,0 +1,16 @@ +#ifndef _RE2C_RE_ENCODING_UTF16_REGEXP_ +#define _RE2C_RE_ENCODING_UTF16_REGEXP_ + +#include "src/re/re.h" +#include "src/re/encoding/utf16/utf16.h" + +namespace re2c { + +class Range; + +RE *UTF16Symbol(RE::alc_t &alc, utf16::rune r); +RE *UTF16Range(RE::alc_t &alc, const Range *r); + +} // namespace re2c + +#endif // _RE2C_RE_ENCODING_UTF16_REGEXP_ diff --git a/src/ir/regexp/encoding/utf8/utf8.cc b/src/re/encoding/utf8/utf8.cc similarity index 97% rename from src/ir/regexp/encoding/utf8/utf8.cc rename to src/re/encoding/utf8/utf8.cc index dd4b59e..9255565 100644 --- a/src/ir/regexp/encoding/utf8/utf8.cc +++ b/src/re/encoding/utf8/utf8.cc @@ -1,4 +1,4 @@ -#include "src/ir/regexp/encoding/utf8/utf8.h" +#include "src/re/encoding/utf8/utf8.h" namespace re2c { diff --git a/src/ir/regexp/encoding/utf8/utf8.h b/src/re/encoding/utf8/utf8.h similarity index 88% rename from src/ir/regexp/encoding/utf8/utf8.h rename to src/re/encoding/utf8/utf8.h index 0ca3142..5032776 100644 --- a/src/ir/regexp/encoding/utf8/utf8.h +++ b/src/re/encoding/utf8/utf8.h @@ -1,5 +1,5 @@ -#ifndef _RE2C_IR_REGEXP_ENCODING_UTF8_UTF8_ -#define _RE2C_IR_REGEXP_ENCODING_UTF8_UTF8_ +#ifndef _RE2C_RE_ENCODING_UTF8_UTF8_ +#define _RE2C_RE_ENCODING_UTF8_UTF8_ #include "src/util/c99_stdint.h" @@ -45,4 +45,4 @@ public: } // namespace re2c -#endif // _RE2C_IR_REGEXP_ENCODING_UTF8_UTF8_ +#endif // _RE2C_RE_ENCODING_UTF8_UTF8_ diff --git a/src/ir/regexp/encoding/utf8/utf8_range.cc b/src/re/encoding/utf8/utf8_range.cc similarity index 96% rename from src/ir/regexp/encoding/utf8/utf8_range.cc rename to src/re/encoding/utf8/utf8_range.cc index d3d256c..18ef756 100644 --- a/src/ir/regexp/encoding/utf8/utf8_range.cc +++ b/src/re/encoding/utf8/utf8_range.cc @@ -1,5 +1,8 @@ -#include "src/ir/regexp/encoding/utf8/utf8_range.h" -#include "src/ir/regexp/encoding/range_suffix.h" +#include "src/re/encoding/utf8/utf8_range.h" + +#include + +#include "src/re/encoding/range_suffix.h" namespace re2c { diff --git a/src/re/encoding/utf8/utf8_range.h b/src/re/encoding/utf8/utf8_range.h new file mode 100644 index 0000000..8231ad1 --- /dev/null +++ b/src/re/encoding/utf8/utf8_range.h @@ -0,0 +1,18 @@ +#ifndef _RE2C_RE_ENCODING_UTF8_RANGE_ +#define _RE2C_RE_ENCODING_UTF8_RANGE_ + +#include "src/util/c99_stdint.h" + +#include "src/re/encoding/utf8/utf8.h" + +namespace re2c { + +struct RangeSuffix; + +void UTF8addContinuous(RangeSuffix * & root, utf8::rune l, utf8::rune h, uint32_t n); +void UTF8splitByContinuity(RangeSuffix * & root, utf8::rune l, utf8::rune h, uint32_t n); +void UTF8splitByRuneLength(RangeSuffix * & root, utf8::rune l, utf8::rune h); + +} // namespace re2c + +#endif // _RE2C_RE_ENCODING_UTF8_RANGE_ diff --git a/src/ir/regexp/encoding/utf8/utf8_regexp.cc b/src/re/encoding/utf8/utf8_regexp.cc similarity index 55% rename from src/ir/regexp/encoding/utf8/utf8_regexp.cc rename to src/re/encoding/utf8/utf8_regexp.cc index 54ef6f0..370663d 100644 --- a/src/ir/regexp/encoding/utf8/utf8_regexp.cc +++ b/src/re/encoding/utf8/utf8_regexp.cc @@ -1,21 +1,21 @@ +#include #include "src/util/c99_stdint.h" -#include "src/ir/regexp/encoding/utf8/utf8_regexp.h" -#include "src/ir/regexp/encoding/range_suffix.h" -#include "src/ir/regexp/encoding/utf8/utf8_range.h" -#include "src/ir/regexp/regexp_cat.h" -#include "src/ir/regexp/regexp_match.h" +#include "src/re/encoding/range_suffix.h" +#include "src/re/encoding/utf8/utf8_range.h" +#include "src/re/encoding/utf8/utf8_regexp.h" #include "src/util/range.h" namespace re2c { -RegExp * UTF8Symbol(utf8::rune r) +RE *UTF8Symbol(RE::alc_t &alc, utf8::rune r) { uint32_t chars[utf8::MAX_RUNE_LENGTH]; const uint32_t chars_count = utf8::rune_to_bytes(chars, r); - RegExp * re = new MatchOp(Range::sym (chars[0])); - for (uint32_t i = 1; i < chars_count; ++i) - re = new CatOp(re, new MatchOp(Range::sym (chars[i]))); + RE *re = re_sym(alc, Range::sym(chars[0])); + for (uint32_t i = 1; i < chars_count; ++i) { + re = re_cat(alc, re, re_sym(alc, Range::sym(chars[i]))); + } return re; } @@ -25,12 +25,12 @@ RegExp * UTF8Symbol(utf8::rune r) * them. We store partially built range in suffix tree, which * allows to eliminate common suffixes while building. */ -RegExp * UTF8Range(const Range * r) +RE *UTF8Range(RE::alc_t &alc, const Range *r) { RangeSuffix * root = NULL; for (; r != NULL; r = r->next ()) UTF8splitByRuneLength(root, r->lower (), r->upper () - 1); - return to_regexp (root); + return to_regexp(alc, root); } } // namespace re2c diff --git a/src/re/encoding/utf8/utf8_regexp.h b/src/re/encoding/utf8/utf8_regexp.h new file mode 100644 index 0000000..75a09f6 --- /dev/null +++ b/src/re/encoding/utf8/utf8_regexp.h @@ -0,0 +1,16 @@ +#ifndef _RE2C_RE_ENCODING_UTF8_REGEXP_ +#define _RE2C_RE_ENCODING_UTF8_REGEXP_ + +#include "src/re/re.h" +#include "src/re/encoding/utf8/utf8.h" + +namespace re2c { + +class Range; + +RE *UTF8Symbol(RE::alc_t &alc, utf8::rune r); +RE *UTF8Range(RE::alc_t &alc, const Range *r); + +} // namespace re2c + +#endif // _RE2C_RE_ENCODING_UTF8_REGEXP_ diff --git a/src/re/fixed_tags.cc b/src/re/fixed_tags.cc new file mode 100644 index 0000000..03d5f49 --- /dev/null +++ b/src/re/fixed_tags.cc @@ -0,0 +1,84 @@ +#include +#include + +#include "src/code/input_api.h" +#include "src/conf/opt.h" +#include "src/re/re.h" +#include "src/re/tag.h" + +namespace re2c { + +/* note [fixed and variable tags] + * + * If distance between two tags is constant (equal for all strings that + * match the given regexp), then lexer only needs to track one of them: + * the second tag equals the first tag plus static offset. + * + * However, this optimization is applied only to tags in top-level + * concatenation, because other tags may be uninitialized and we don't + * want to mess with conditional calculation of fixed tags. + * + * Furthermore, fixed tags are fobidden with generic API because it cannot + * express fixed offsets. + * + * Tags with history also cannot be fixed. + * + * Another special case is fictive tags (those that exist only to impose + * hierarchical laws of POSIX disambiguation). We treat them as fixed + * in order to suppress code generation. + */ + +static void find_fixed_tags(RE *re, std::vector &tags, + size_t &dist, size_t &base, bool toplevel) +{ + switch (re->type) { + case RE::NIL: break; + case RE::SYM: + if (dist != Tag::VARDIST) ++dist; + break; + case RE::ALT: { + size_t d1 = dist, d2 = dist; + find_fixed_tags(re->alt.re1, tags, d1, base, false); + find_fixed_tags(re->alt.re2, tags, d2, base, false); + dist = (d1 == d2) ? d1 : Tag::VARDIST; + break; + } + case RE::CAT: + find_fixed_tags(re->cat.re2, tags, dist, base, toplevel); + find_fixed_tags(re->cat.re1, tags, dist, base, toplevel); + break; + case RE::ITER: + find_fixed_tags(re->iter.re, tags, dist, base, false); + dist = Tag::VARDIST; + break; + case RE::TAG: { + // see note [fixed and variable tags] + Tag &tag = tags[re->tag.idx]; + if (fictive(tag)) { + tag.base = tag.dist = 0; + } else if (toplevel && dist != Tag::VARDIST && !history(tag)) { + tag.base = base; + tag.dist = dist; + } else if (toplevel) { + base = re->tag.idx; + dist = 0; + } + if (trailing(tag)) dist = 0; + break; + } + } +} + +void find_fixed_tags(RESpec &spec) +{ + const bool generic = spec.opts->input_api == INPUT_CUSTOM; + std::vector::iterator + i = spec.res.begin(), + e = spec.res.end(); + for (; i != e; ++i) { + size_t base = Tag::RIGHTMOST, dist = 0; + find_fixed_tags(*i, spec.tags, dist, base, !generic); + } +} + +} // namespace re2c diff --git a/src/re/nullable.cc b/src/re/nullable.cc new file mode 100644 index 0000000..40cb792 --- /dev/null +++ b/src/re/nullable.cc @@ -0,0 +1,51 @@ +#include +#include +#include +#include + +#include "src/conf/warn.h" +#include "src/re/re.h" +#include "src/re/rule.h" +#include "src/re/tag.h" + +namespace re2c { + +static bool nullable(const RESpec &spec, const RE *re, bool &trail) +{ + if (trail) return true; + + switch (re->type) { + case RE::NIL: return true; + case RE::SYM: return false; + case RE::ITER: + return nullable(spec, re->iter.re, trail); + case RE::TAG: + trail |= trailing(spec.tags[re->tag.idx]); + return true; + case RE::ALT: + return nullable(spec, re->alt.re1, trail) + || nullable(spec, re->alt.re2, trail); + case RE::CAT: + return nullable(spec, re->cat.re1, trail) + && nullable(spec, re->cat.re2, trail); + } + return false; /* unreachable */ +} + +/* + * warn about rules that match empty string + * (including rules with nonempty trailing context) + * false positives on partially self-shadowed rules like [^]? + */ +void warn_nullable(const RESpec &spec, const std::string &cond) +{ + const size_t nre = spec.res.size(); + for (size_t i = 0; i < nre; ++i) { + bool trail = false; + if (nullable(spec, spec.res[i], trail)) { + spec.warn.match_empty_string(spec.rules[i].code->fline, cond); + } + } +} + +} // namespace re2c diff --git a/src/re/re.h b/src/re/re.h new file mode 100644 index 0000000..305c28b --- /dev/null +++ b/src/re/re.h @@ -0,0 +1,128 @@ +#ifndef _RE2C_RE_RE_ +#define _RE2C_RE_RE_ + +#include "src/util/c99_stdint.h" + +#include "src/conf/opt.h" +#include "src/ast/ast.h" +#include "src/re/rule.h" +#include "src/util/forbid_copy.h" +#include "src/util/range.h" +#include "src/util/slab_allocator.h" + +namespace re2c +{ + +struct RE +{ + typedef slab_allocator_t<~0u, 4096, sizeof(void*)> alc_t; + enum type_t {NIL, SYM, ALT, CAT, ITER, TAG} type; + union { + const Range *sym; + struct { + RE *re1; + RE *re2; + } alt; + struct { + RE *re1; + RE *re2; + } cat; + struct { + RE *re; + uint32_t min; + uint32_t max; + } iter; + struct { + size_t idx; + bool bottom; + } tag; + }; +}; + +struct RESpec +{ + RE::alc_t alc; + std::vector res; + std::vector &charset; + std::vector &tags; + std::valarray &rules; + const opt_t *opts; + Warn &warn; + + explicit RESpec(const std::vector &ast, const opt_t *o, Warn &w); + FORBID_COPY(RESpec); +}; + +void split_charset(RESpec &spec); +void find_fixed_tags(RESpec &spec); +void insert_default_tags(RESpec &spec); +void warn_nullable(const RESpec &spec, const std::string &cond); + +inline RE *re_nil(RE::alc_t &alc) +{ + RE *x = alc.alloct(1); + x->type = RE::NIL; + return x; +} + +inline RE *re_sym(RE::alc_t &alc, const Range *r) +{ + RE *x = alc.alloct(1); + x->type = RE::SYM; + x->sym = r; + return x; +} + +inline RE *re_alt(RE::alc_t &alc, RE *x, RE *y) +{ + if (!x) return y; + if (!y) return x; + if (x->type == RE::SYM && y->type == RE::SYM) { + return re_sym(alc, Range::add(x->sym, y->sym)); + } + + RE *z = alc.alloct(1); + z->type = RE::ALT; + z->alt.re1 = x; + z->alt.re2 = y; + return z; +} + +inline RE *re_cat(RE::alc_t &alc, RE *x, RE *y) +{ + if (!x) return y; + if (!y) return x; + + RE *z = alc.alloct(1); + z->type = RE::CAT; + z->cat.re1 = x; + z->cat.re2 = y; + return z; +} + +inline RE *re_iter(RE::alc_t &alc, RE *x, uint32_t n, uint32_t m) +{ + RE *y = alc.alloct(1); + y->type = RE::ITER; + y->iter.re = x; + y->iter.min = n; + y->iter.max = m; + return y; +} + +inline RE *re_tag(RE::alc_t &alc, size_t i, bool b) +{ + RE *x = alc.alloct(1); + x->type = RE::TAG; + x->tag.idx = i; + x->tag.bottom = b; + return x; +} + +RE *re_schar(RE::alc_t &alc, uint32_t line, uint32_t column, uint32_t c, const opt_t *opts); +RE *re_ichar(RE::alc_t &alc, uint32_t line, uint32_t column, uint32_t c, const opt_t *opts); +RE *re_class(RE::alc_t &alc, uint32_t line, uint32_t column, const Range *r, const opt_t *opts, Warn &warn); + +} // namespace re2c + +#endif // _RE2C_RE_RE_ diff --git a/src/re/rule.cc b/src/re/rule.cc new file mode 100644 index 0000000..1499169 --- /dev/null +++ b/src/re/rule.cc @@ -0,0 +1,12 @@ +#include + +#include "src/re/rule.h" + +namespace re2c +{ + +free_list Code::flist; + +const size_t Rule::NONE = std::numeric_limits::max(); + +} // namespace re2c diff --git a/src/re/rule.h b/src/re/rule.h new file mode 100644 index 0000000..803281c --- /dev/null +++ b/src/re/rule.h @@ -0,0 +1,89 @@ +#ifndef _RE2C_RE_RULE_ +#define _RE2C_RE_RULE_ + +#include +#include "src/util/c99_stdint.h" +#include +#include + +#include "src/re/tag.h" +#include "src/util/free_list.h" + +namespace re2c +{ + +struct Code +{ + static free_list flist; + + std::string fname; + uint32_t fline; + bool autogen; + const std::string text; + std::string cond; + + Code(const std::string &file, uint32_t line) + : fname(file) + , fline(line) + , autogen(true) + , text("") + , cond("") + { + flist.insert(this); + } + Code(const std::string &file, uint32_t line, const char *s, size_t slen) + : fname(file) + , fline(line) + , autogen(false) + , text(s, slen) + , cond("") + { + flist.insert(this); + } + ~Code() + { + flist.erase(this); + } +}; + +struct Rule +{ + static const size_t NONE; + + const Code *code; + std::set shadow; + + // tags + size_t ltag; // first + size_t htag; // next to last + size_t ttag; // trailing context + + size_t ncap; // number of POSIX captures + + Rule(): code(NULL), shadow(), + ltag(0), htag(0), ttag(0), ncap(0) {} + + // copy ctor and assignment are required for containers on macOS + Rule(const Rule &r) + : code(r.code) + , shadow(r.shadow) + , ltag(r.ltag) + , htag(r.htag) + , ttag(r.ttag) + , ncap(r.ncap) + {} + Rule& operator= (const Rule &r) + { + code = r.code; + shadow = r.shadow; + ltag = r.ltag; + htag = r.htag; + ttag = r.ttag; + ncap = r.ncap; + return *this; + } +}; + +} // namespace re2c + +#endif // _RE2C_RE_RULE_ diff --git a/src/re/split_charset.cc b/src/re/split_charset.cc new file mode 100644 index 0000000..d2bef13 --- /dev/null +++ b/src/re/split_charset.cc @@ -0,0 +1,60 @@ +#include "src/util/c99_stdint.h" +#include +#include +#include + +#include "src/conf/opt.h" +#include "src/re/encoding/enc.h" +#include "src/re/re.h" +#include "src/util/range.h" + +namespace re2c { + +/* The original set of code units (charset) might be very large. + * A common trick it is to split charset into disjoint character ranges + * and choose a representative of each range (we choose lower bound). + * The set of all representatives is the new (compacted) charset. + * Don't forget to include zero and upper bound, even if they + * do not explicitely apper in ranges. + */ +void split_charset(RESpec &spec) +{ + std::set cs; + std::stack todo; + + std::vector::const_iterator + i = spec.res.begin(), + e = spec.res.end(); + for (; i != e; ++i) todo.push(*i); + while (!todo.empty()) { + const RE *re = todo.top(); + todo.pop(); + switch (re->type) { + case RE::NIL: break; + case RE::TAG: break; + case RE::SYM: + for (const Range *r = re->sym; r; r = r->next()) { + cs.insert(r->lower()); + cs.insert(r->upper()); + } + break; + case RE::ALT: + todo.push(re->alt.re2); + todo.push(re->alt.re1); + break; + case RE::CAT: + todo.push(re->cat.re2); + todo.push(re->cat.re1); + break; + case RE::ITER: + todo.push(re->iter.re); + break; + } + } + cs.insert(0); + cs.insert(spec.opts->encoding.nCodeUnits()); + + spec.charset.insert(spec.charset.end(), cs.begin(), cs.end()); +} + +} // namespace re2c diff --git a/src/re/tag.cc b/src/re/tag.cc new file mode 100644 index 0000000..9e6800e --- /dev/null +++ b/src/re/tag.cc @@ -0,0 +1,12 @@ +#include + +#include "src/re/tag.h" + +namespace re2c +{ + +const size_t Tag::RIGHTMOST = std::numeric_limits::max(); +const size_t Tag::VARDIST = std::numeric_limits::max(); +const size_t Tag::FICTIVE = Tag::RIGHTMOST - 1; + +} // namespace re2c diff --git a/src/re/tag.h b/src/re/tag.h new file mode 100644 index 0000000..9a9a05e --- /dev/null +++ b/src/re/tag.h @@ -0,0 +1,82 @@ +#ifndef _RE2C_RE_TAG_ +#define _RE2C_RE_TAG_ + +#include +#include "src/util/c99_stdint.h" +#include +#include +#include + +namespace re2c +{ + +typedef int32_t tagver_t; + +static const tagver_t TAGVER_BOTTOM = std::numeric_limits::min(); // default value, lowest priority +static const tagver_t TAGVER_ZERO = 0; // absense of tag +static const tagver_t TAGVER_CURSOR = std::numeric_limits::max(); // current position, highest priority + +struct Tag +{ + static const size_t RIGHTMOST; + static const size_t VARDIST; + static const size_t FICTIVE; + + const std::string *name; + size_t ncap; + size_t base; + size_t dist; + bool history; + bool orbit; + + Tag(const std::string *n, bool h) + : name(n) + , ncap(Tag::RIGHTMOST) + , base(Tag::RIGHTMOST) + , dist(Tag::VARDIST) + , history(h) + , orbit(false) + {} + Tag(size_t c, bool o) + : name(NULL) + , ncap(c) + , base(Tag::RIGHTMOST) + , dist(Tag::VARDIST) + , history(false) + , orbit(o) + {} +}; + +inline bool fixed(const Tag &tag) +{ + return tag.dist != Tag::VARDIST; +} + +inline bool fictive(const Tag &tag) +{ + return tag.ncap == Tag::FICTIVE; +} + +inline bool capture(const Tag &tag) +{ + return tag.ncap != Tag::RIGHTMOST; +} + +inline bool orbit(const Tag &tag) +{ + return tag.orbit; +} + +inline bool trailing(const Tag &tag) +{ + return !capture(tag) && tag.name == NULL; +} + +inline bool history(const Tag &tag) +{ + return tag.history; +} + +} // namespace re2c + +#endif // _RE2C_RE_TAG_ diff --git a/src/skeleton/control_flow.cc b/src/skeleton/control_flow.cc new file mode 100644 index 0000000..138def5 --- /dev/null +++ b/src/skeleton/control_flow.cc @@ -0,0 +1,116 @@ +#include "src/util/c99_stdint.h" +#include +#include +#include +#include +#include + +#include "src/conf/warn.h" +#include "src/re/rule.h" +#include "src/skeleton/path.h" +#include "src/skeleton/skeleton.h" +#include "src/util/u32lim.h" + +namespace re2c +{ + +// See note [counting skeleton edges]. +// Type for counting arcs in paths that cause undefined behaviour. +// These paths are stored on heap, so the limit should be low. +// Most real-world cases have only a few short paths. +// We don't need all paths anyway, just some examples. +typedef u32lim_t<1024> ucf_size_t; // ~1Kb + +// UCF stands for 'undefined control flow' +struct ucf_t +{ + std::valarray loops; + std::vector paths; + path_t prefix; + ucf_size_t size; + + explicit ucf_t(size_t nnodes): loops(nnodes), paths(), + prefix(0), size(ucf_size_t::from32(0u)) {} +}; + +// We don't need all patterns that cause undefined behaviour. +// We only need some examples, the shorter the better. +static void naked_paths( + const Skeleton &skel, + ucf_t &ucf, + size_t i) +{ + const Node &node = skel.nodes[i]; + bool &loop = ucf.loops[i]; + path_t &prefix = ucf.prefix; + ucf_size_t &size = ucf.size; + + if (node.rule != Rule::NONE) { + return; + } else if (node.end()) { + ucf.paths.push_back(prefix); + size = size + ucf_size_t::from64(prefix.len()); + } else if (!loop) { + loop = true; + Node::arcs_t::const_iterator + arc = node.arcs.begin(), + end = node.arcs.end(); + for (; arc != end && !size.overflow(); ++arc) { + const size_t j = arc->first; + prefix.push(j); + naked_paths(skel, ucf, j); + prefix.pop(); + } + } +} + +void warn_undefined_control_flow(const Skeleton &skel, Warn &warn) +{ + ucf_t ucf(skel.nodes_count); + naked_paths(skel, ucf, 0); + if (!ucf.paths.empty()) { + warn.undefined_control_flow(skel, ucf.paths, ucf.size.overflow()); + } else if (ucf.size.overflow()) { + warn.fail(Warn::UNDEFINED_CONTROL_FLOW, skel.line, + "DFA is too large to check undefined control flow"); + } +} + +static void fprint_default_arc(FILE *f, const Node::arc_t &arc) +{ + const size_t ranges = arc.size(); + if (ranges == 1 && arc[0].lower == arc[0].upper) { + fprintf(f, "\\x%X", arc[0].lower); + } else { + fprintf(f, "["); + for (size_t i = 0; i < ranges; ++i) { + const uint32_t + l = arc[i].lower, + u = arc[i].upper; + fprintf(f, "\\x%X", l); + if (l != u) { + fprintf(f, "-\\x%X", u); + } + } + fprintf(f, "]"); + } +} + +void fprint_default_path( + FILE *f, + const Skeleton &skel, + const path_t &p) +{ + fprintf(f, "'"); + const size_t len = p.len(); + for (size_t i = 0; i < len; ++i) { + if (i > 0) { + fprintf(f, " "); + } + const Node::arc_t &arc = p.arc(skel, i); + fprint_default_arc(stderr, arc); + } + fprintf(f, "'"); +} + +} // namespace re2c diff --git a/src/skeleton/generate_code.cc b/src/skeleton/generate_code.cc new file mode 100644 index 0000000..ca85d58 --- /dev/null +++ b/src/skeleton/generate_code.cc @@ -0,0 +1,521 @@ +#include +#include "src/util/c99_stdint.h" +#include +#include +#include +#include + +#include "src/adfa/adfa.h" +#include "src/code/bitmap.h" +#include "src/code/emit.h" +#include "src/code/output.h" +#include "src/conf/opt.h" +#include "src/re/encoding/enc.h" +#include "src/re/rule.h" +#include "src/re/tag.h" +#include "src/skeleton/skeleton.h" + +namespace re2c +{ + +static void exact_uint(OutputFile &o, size_t width) +{ + if (width == sizeof(char)) { + o.ws("unsigned char"); + } else if (width == sizeof(short)) { + o.ws("unsigned short"); + } else if (width == sizeof(int)) { + o.ws("unsigned int"); + } else if (width == sizeof(long)) { + o.ws("unsigned long"); + } else { + o.ws("uint").wu64(width * 8).ws("_t"); + } +} + +static void from_le(OutputFile &o, uint32_t ind, size_t size, const char *expr) +{ + o.ws("\n").wind(ind).ws("/* from little-endian to host-endian */"); + o.ws("\n").wind(ind).ws("unsigned char *p = (unsigned char*)&").ws(expr).ws(";"); + o.ws("\n").wind(ind).ws(expr).ws(" = p[0]"); + for (uint32_t i = 1; i < size; ++i) { + o.ws(" + (p[").wu32(i).ws("] << ").wu32(i * 8).ws("u)"); + } + o.ws(";"); +} + +void emit_prolog(OutputFile &o) +{ + o.ws("\n#include /* size_t */"); + o.ws("\n#include "); + o.ws("\n#include /* malloc, free */"); + o.ws("\n#include /* memcpy */"); + o.ws("\n"); + o.ws("\nstatic void *read_file"); + o.ws("\n").wind(1).ws("( const char *fname"); + o.ws("\n").wind(1).ws(", size_t unit"); + o.ws("\n").wind(1).ws(", size_t padding"); + o.ws("\n").wind(1).ws(", size_t *pfsize"); + o.ws("\n").wind(1).ws(")"); + o.ws("\n{"); + o.ws("\n").wind(1).ws("void *buffer = NULL;"); + o.ws("\n").wind(1).ws("size_t fsize = 0;"); + o.ws("\n"); + o.ws("\n").wind(1).ws("/* open file */"); + o.ws("\n").wind(1).ws("FILE *f = fopen(fname, \"rb\");"); + o.ws("\n").wind(1).ws("if(f == NULL) {"); + o.ws("\n").wind(2).ws("goto error;"); + o.ws("\n").wind(1).ws("}"); + o.ws("\n"); + o.ws("\n").wind(1).ws("/* get file size */"); + o.ws("\n").wind(1).ws("fseek(f, 0, SEEK_END);"); + o.ws("\n").wind(1).ws("fsize = (size_t) ftell(f) / unit;"); + o.ws("\n").wind(1).ws("fseek(f, 0, SEEK_SET);"); + o.ws("\n"); + o.ws("\n").wind(1).ws("/* allocate memory for file and padding */"); + o.ws("\n").wind(1).ws("buffer = malloc(unit * (fsize + padding));"); + o.ws("\n").wind(1).ws("if (buffer == NULL) {"); + o.ws("\n").wind(2).ws("goto error;"); + o.ws("\n").wind(1).ws("}"); + o.ws("\n"); + o.ws("\n").wind(1).ws("/* read the whole file in memory */"); + o.ws("\n").wind(1).ws("if (fread(buffer, unit, fsize, f) != fsize) {"); + o.ws("\n").wind(2).ws("goto error;"); + o.ws("\n").wind(1).ws("}"); + o.ws("\n"); + o.ws("\n").wind(1).ws("fclose(f);"); + o.ws("\n").wind(1).ws("*pfsize = fsize;"); + o.ws("\n").wind(1).ws("return buffer;"); + o.ws("\n"); + o.ws("\nerror:"); + o.ws("\n").wind(1).ws("fprintf(stderr, \"error: cannot read file '%s'\\n\", fname);"); + o.ws("\n").wind(1).ws("free(buffer);"); + o.ws("\n").wind(1).ws("if (f != NULL) {"); + o.ws("\n").wind(2).ws("fclose(f);"); + o.ws("\n").wind(1).ws("}"); + o.ws("\n").wind(1).ws("return NULL;"); + o.ws("\n}"); + o.ws("\n"); +} + +void emit_start(OutputFile &o, size_t maxfill, size_t maxnmatch, const std::string &name, + size_t sizeof_key, size_t def, bool backup, bool accept, bool oldstyle_ctxmarker, + const std::set &stagnames, const std::set &stagvars, + const std::set &mtagnames, const std::set &mtagvars, + bitmaps_t &bitmaps) +{ + const opt_t *opts = o.block().opts; + const size_t sizeof_cunit = opts->encoding.szCodeUnit(); + const uint64_t norule = rule2key(Rule::NONE, sizeof_key, def); + std::string filename = opts->output_file; + if (filename.empty()) { + filename = ""; + } + + o.ws("\n#define YYCTYPE "); + exact_uint (o, sizeof_cunit); + o.ws("\n#define YYKEYTYPE "); + exact_uint (o, sizeof_key); + o.ws("\n#define YYPEEK() *cursor"); + o.ws("\n#define YYSKIP() ++cursor"); + if (backup) { + o.ws("\n#define YYBACKUP() marker = cursor"); + o.ws("\n#define YYRESTORE() cursor = marker"); + } + if (oldstyle_ctxmarker) { + o.ws("\n#define YYBACKUPCTX() ctxmarker = cursor"); + o.ws("\n#define YYRESTORECTX() cursor = ctxmarker"); + } + if (opts->tags) { + o.ws("\n#define YYSTAGP(t) t = cursor"); + o.ws("\n#define YYSTAGN(t) t = NULL"); + o.ws("\n#define YYMTAGP(t) yymtag(&t, cursor, &yytp)"); + o.ws("\n#define YYMTAGN(t) yymtag(&t, NULL, &yytp)"); + o.ws("\n#define YYRESTORETAG(t) cursor = t"); + } + o.ws("\n#define YYLESSTHAN(n) (limit - cursor) < n"); + o.ws("\n#define YYFILL(n) { break; }"); + o.ws("\n"); + + o.ws("\nstatic int action_").wstring(name); + o.ws("\n").wind(1).ws("( unsigned *pkix"); + o.ws("\n").wind(1).ws(", const YYKEYTYPE *keys"); + o.ws("\n").wind(1).ws(", const YYCTYPE *start"); + o.ws("\n").wind(1).ws(", const YYCTYPE *token"); + o.ws("\n").wind(1).ws(", const YYCTYPE **cursor"); + o.ws("\n").wind(1).ws(", YYKEYTYPE rule_act"); + o.ws("\n").wind(1).ws(")"); + o.ws("\n{"); + o.ws("\n").wind(1).ws("const unsigned kix = *pkix;"); + o.ws("\n").wind(1).ws("const long pos = token - start;"); + o.ws("\n").wind(1).ws("const long len_act = *cursor - token;"); + o.ws("\n").wind(1).ws("const long len_exp = (long) keys[kix + 1];"); + o.ws("\n").wind(1).ws("const YYKEYTYPE rule_exp = keys[kix + 2];"); + o.ws("\n").wind(1).ws("*pkix = kix + 3;"); + o.ws("\n").wind(1).ws("if (rule_exp == ").wu64(norule).ws(") {"); + o.ws("\n").wind(2).ws("fprintf"); + o.ws("\n").wind(3).ws("( stderr"); + o.ws("\n").wind(3).ws(", \"warning: lex_").wstring(name).ws(": control flow is undefined for input\""); + o.ws("\n").wind(4).ws("\" at position %ld, rerun re2c with '-W'\\n\""); + o.ws("\n").wind(3).ws(", pos"); + o.ws("\n").wind(3).ws(");"); + o.ws("\n").wind(1).ws("}"); + o.ws("\n").wind(1).ws("if (len_act == len_exp && rule_act == rule_exp) {"); + o.ws("\n").wind(2).ws("const YYKEYTYPE offset = keys[kix];"); + o.ws("\n").wind(2).ws("*cursor = token + offset;"); + o.ws("\n").wind(2).ws("return 0;"); + o.ws("\n").wind(1).ws("} else {"); + o.ws("\n").wind(2).ws("fprintf"); + o.ws("\n").wind(3).ws("( stderr"); + o.ws("\n").wind(3).ws(", \"error: lex_").wstring(name).ws(": at position %ld (key %u):\\n\""); + o.ws("\n").wind(4).ws("\"\\texpected: match length %ld, rule %u\\n\""); + o.ws("\n").wind(4).ws("\"\\tactual: match length %ld, rule %u\\n\""); + o.ws("\n").wind(3).ws(", pos"); + o.ws("\n").wind(3).ws(", kix"); + o.ws("\n").wind(3).ws(", len_exp"); + o.ws("\n").wind(3).ws(", rule_exp"); + o.ws("\n").wind(3).ws(", len_act"); + o.ws("\n").wind(3).ws(", rule_act"); + o.ws("\n").wind(3).ws(");"); + o.ws("\n").wind(2).ws("return 1;"); + o.ws("\n").wind(1).ws("}"); + o.ws("\n}"); + + if (!stagnames.empty()) { + o.ws("\n"); + o.ws("\nstatic int check_stag_").wstring(name) + .ws("(unsigned *pkix, YYKEYTYPE *keys, const YYCTYPE *tag,\n") + .wind(1).ws("const YYCTYPE *input, const YYCTYPE *token, const char *name)"); + o.ws("\n{"); + o.ws("\n").wind(1).ws("const unsigned kix = *pkix;"); + o.ws("\n").wind(1).ws("const YYKEYTYPE\n") + .wind(2).ws("exp = keys[kix],\n") + .wind(2).ws("act = (YYKEYTYPE)(tag - token),\n") + .wind(2).ws("NIL = (YYKEYTYPE)~0u;"); + o.ws("\n").wind(1).ws("*pkix = kix + 1;"); + o.ws("\n"); + o.ws("\n").wind(1).ws("if (exp == act || (exp == NIL && tag == NULL)) return 0;"); + o.ws("\n"); + o.ws("\n").wind(1).ws("fprintf(stderr, \"error: lex_").wstring(name).ws(": at position %ld, key %u: \"") + .ws("\n").wind(2).ws("\"wrong value for tag '%s': expected %u, actual %u\\n\",") + .ws("\n").wind(2).ws("token - input, kix, name, exp, act);"); + o.ws("\n").wind(1).ws("return 1;"); + o.ws("\n}"); + } + + if (!mtagnames.empty()) { + o.ws("\n"); + o.ws("\ntypedef struct yymtag_t {"); + o.ws("\n").wind(1).ws("struct yymtag_t *pred;"); + o.ws("\n").wind(1).ws("const YYCTYPE *elem;"); + o.ws("\n} yymtag_t;"); + + o.ws("\n"); + o.ws("\ntypedef struct yymtagpool_t {"); + o.ws("\n").wind(1).ws("yymtag_t *head;"); + o.ws("\n").wind(1).ws("yymtag_t *next;"); + o.ws("\n").wind(1).ws("yymtag_t *last;"); + o.ws("\n} yymtagpool_t;"); + + o.ws("\n"); + o.ws("\nstatic void yymtagpool_clear(yymtagpool_t *tp)"); + o.ws("\n{"); + o.ws("\n").wind(1).ws("tp->next = tp->head;"); + o.ws("\n}"); + + o.ws("\n"); + o.ws("\nstatic void yymtagpool_init(yymtagpool_t *tp)"); + o.ws("\n{"); + o.ws("\n").wind(1).ws("static const unsigned size = 256;"); + o.ws("\n").wind(1).ws("tp->head = (yymtag_t*)malloc(size * sizeof(yymtag_t));"); + o.ws("\n").wind(1).ws("tp->next = tp->head;"); + o.ws("\n").wind(1).ws("tp->last = tp->head + size;"); + o.ws("\n}"); + + o.ws("\n"); + o.ws("\nstatic void yymtagpool_free(yymtagpool_t *tp)"); + o.ws("\n{"); + o.ws("\n").wind(1).ws("free(tp->head);"); + o.ws("\n").wind(1).ws("tp->head = tp->next = tp->last = NULL;"); + o.ws("\n}"); + + o.ws("\n"); + o.ws("\nstatic yymtag_t *yymtagpool_next(yymtagpool_t *tp)"); + o.ws("\n{"); + o.ws("\n").wind(1).ws("if (tp->next == tp->last) {"); + o.ws("\n").wind(2).ws("const unsigned size = tp->last - tp->head;"); + o.ws("\n").wind(2).ws("yymtag_t *head = (yymtag_t*)malloc(2 * size * sizeof(yymtag_t));"); + o.ws("\n").wind(2).ws("memcpy(head, tp->head, size * sizeof(yymtag_t));"); + o.ws("\n").wind(2).ws("free(tp->head);"); + o.ws("\n").wind(2).ws("tp->head = head;"); + o.ws("\n").wind(2).ws("tp->next = head + size;"); + o.ws("\n").wind(2).ws("tp->last = head + size * 2;"); + o.ws("\n").wind(1).ws("}"); + o.ws("\n").wind(1).ws("return tp->next++;"); + o.ws("\n}"); + + o.ws("\n"); + o.ws("\nstatic void yymtag(yymtag_t **pt, const YYCTYPE *t, yymtagpool_t *tp)"); + o.ws("\n{"); + o.ws("\n").wind(1).ws("yymtag_t *n = yymtagpool_next(tp);"); + o.ws("\n").wind(1).ws("n->pred = *pt;"); + o.ws("\n").wind(1).ws("n->elem = t;"); + o.ws("\n").wind(1).ws("*pt = n;"); + o.ws("\n}"); + + o.ws("\n"); + o.ws("\nstatic int check_mtag_").wstring(name) + .ws("(unsigned *pkix, YYKEYTYPE *keys, const yymtag_t *mtag,\n") + .wind(1).ws("const YYCTYPE *input, const YYCTYPE *token, const char *name)"); + o.ws("\n{"); +// o.ws("\n").wind(1).ws("check_key_count_").wstring(name).ws("(1) && return 1;"); + o.ws("\n").wind(1).ws("const unsigned kix = *pkix;"); + o.ws("\n").wind(1).ws("YYKEYTYPE n = keys[kix];"); + o.ws("\n").wind(1).ws("*pkix = kix + n + 1;"); +// o.ws("\n").wind(1).ws("check_key_count_").wstring(name).ws("(n) && return 1;"); + o.ws("\n").wind(1).ws("for (; n > 0; --n) {"); + o.ws("\n").wind(2).ws("if (mtag == NULL) {"); + o.ws("\n").wind(3).ws("fprintf(stderr, \"error: lex_").wstring(name).ws(": at position %ld, key %u: \"") + .ws("\n").wind(4).ws("\"history for tag '%s' is too short\\n\",") + .ws("\n").wind(4).ws("token - input, kix + n, name);"); + o.ws("\n").wind(3).ws("return 1;"); + o.ws("\n").wind(2).ws("}"); + o.ws("\n").wind(2).ws("const YYCTYPE *tag = mtag->elem;"); + o.ws("\n").wind(2).ws("mtag = mtag->pred;"); + o.ws("\n").wind(2).ws("const YYKEYTYPE\n") + .wind(3).ws("exp = keys[kix + n],\n") + .wind(3).ws("act = (YYKEYTYPE)(tag - token),\n") + .wind(3).ws("NIL = (YYKEYTYPE)~0u;"); + o.ws("\n").wind(2).ws("if (!(exp == act || (exp == NIL && tag == NULL))) {"); + o.ws("\n").wind(3).ws("fprintf(stderr, \"error: lex_").wstring(name).ws(": at position %ld, key %u: \"") + .ws("\n").wind(4).ws("\"wrong value for tag '%s': expected %u, actual %u\\n\",") + .ws("\n").wind(4).ws("token - input, kix + n, name, exp, act);"); + o.ws("\n").wind(3).ws("return 1;"); + o.ws("\n").wind(2).ws("}"); + o.ws("\n").wind(1).ws("}"); + o.ws("\n").wind(1).ws("if (mtag != NULL) {"); + o.ws("\n").wind(2).ws("fprintf(stderr, \"error: lex_").wstring(name).ws(": at position %ld, key %u: \"") + .ws("\n").wind(3).ws("\"history for tag '%s' is too long\\n\",") + .ws("\n").wind(3).ws("token - input, kix, name);"); + o.ws("\n").wind(2).ws("return 1;"); + o.ws("\n").wind(1).ws("}"); + o.ws("\n").wind(1).ws("return 0;"); + o.ws("\n}"); + } + + o.ws("\n"); + o.ws("\nstatic int check_key_count_").wstring(name).ws("(unsigned have, unsigned used, unsigned need)"); + o.ws("\n{"); + o.ws("\n").wind(1).ws("if (used + need <= have) return 0;"); + o.ws("\n").wind(1).ws("fprintf(stderr, \"error: lex_").wstring(name).ws(": not enough keys\\n\");"); + o.ws("\n").wind(1).ws("return 1;"); + o.ws("\n}"); + o.ws("\n"); + + o.ws("\nint lex_").wstring(name).ws("()"); + o.ws("\n{"); + o.ws("\n").wind(1).ws("const size_t padding = ").wu64(maxfill).ws("; /* YYMAXFILL */"); + o.ws("\n").wind(1).ws("int status = 0;"); + o.ws("\n").wind(1).ws("size_t input_len = 0;"); + o.ws("\n").wind(1).ws("size_t keys_count = 0;"); + o.ws("\n").wind(1).ws("YYCTYPE *input = NULL;"); + o.ws("\n").wind(1).ws("YYKEYTYPE *keys = NULL;"); + o.ws("\n").wind(1).ws("const YYCTYPE *cursor = NULL;"); + o.ws("\n").wind(1).ws("const YYCTYPE *limit = NULL;"); + o.ws("\n").wind(1).ws("const YYCTYPE *token = NULL;"); + o.ws("\n").wind(1).ws("const YYCTYPE *eof = NULL;"); + if (opts->posix_captures) { + o.ws("\n").wind(1).ws("size_t yynmatch;"); + o.ws("\n").wind(1).ws("const YYCTYPE *yypmatch[").wu64(maxnmatch).ws(" * 2];"); + } + o.ws("\n").wind(1).ws("unsigned int i = 0;"); + if (!mtagnames.empty()) { + o.ws("\n"); + o.ws("\n").wind(1).ws("yymtagpool_t yytp;"); + o.ws("\n").wind(1).ws("yymtagpool_init(&yytp);"); + } + o.ws("\n"); + o.ws("\n").wind(1).ws("input = (YYCTYPE *) read_file"); + o.ws("\n").wind(2).ws("(\"").wstring(filename).ws(".").wstring(name).ws(".input\""); + o.ws("\n").wind(2).ws(", sizeof (YYCTYPE)"); + o.ws("\n").wind(2).ws(", padding"); + o.ws("\n").wind(2).ws(", &input_len"); + o.ws("\n").wind(2).ws(");"); + o.ws("\n").wind(1).ws("if (input == NULL) {"); + o.ws("\n").wind(2).ws("status = 1;"); + o.ws("\n").wind(2).ws("goto end;"); + o.ws("\n").wind(1).ws("}"); + o.ws("\n"); + if (sizeof_cunit > 1) { + o.ws("\n").wind(1).ws("for (i = 0; i < input_len; ++i) {"); + from_le(o, 2, sizeof_cunit, "input[i]"); + o.ws("\n").wind(1).ws("}"); + o.ws("\n"); + } + o.ws("\n").wind(1).ws("keys = (YYKEYTYPE *) read_file"); + o.ws("\n").wind(2).ws("(\"").wstring(filename).ws(".").wstring(name).ws(".keys\""); + o.ws("\n").wind(2).ws(", sizeof (YYKEYTYPE)"); + o.ws("\n").wind(2).ws(", 0"); + o.ws("\n").wind(2).ws(", &keys_count"); + o.ws("\n").wind(2).ws(");"); + o.ws("\n").wind(1).ws("if (keys == NULL) {"); + o.ws("\n").wind(2).ws("status = 1;"); + o.ws("\n").wind(2).ws("goto end;"); + o.ws("\n").wind(1).ws("}"); + o.ws("\n"); + if (sizeof_key > 1) + { + o.ws("\n").wind(1).ws("for (i = 0; i < keys_count; ++i) {"); + from_le(o, 2, sizeof_key, "keys[i]"); + o.ws("\n").wind(1).ws("}"); + o.ws("\n"); + } + o.ws("\n").wind(1).ws("cursor = input;"); + o.ws("\n").wind(1).ws("limit = input + input_len + padding;"); + o.ws("\n").wind(1).ws("eof = input + input_len;"); + o.ws("\n"); + o.ws("\n").wind(1).ws("for (i = 0; status == 0 && cursor < eof && i < keys_count;) {"); + o.ws("\n").wind(2).ws("token = cursor;"); + if (backup) { + o.ws("\n").wind(2).ws("const YYCTYPE *marker = NULL;"); + } + if (oldstyle_ctxmarker) { + o.ws("\n").wind(2).ws("const YYCTYPE *ctxmarker = NULL;"); + } + o.ws("\n").wind(2).ws("YYCTYPE yych;"); + if (accept) { + o.ws("\n").wind(2).ws("unsigned int yyaccept = 0;"); + } + + // autogenerated stag variables + ConfTags conf("\n" + indent(2, opts->indString) + "const YYCTYPE *@@ = NULL;", ""); + output_tags(o.stream(), 0, conf, stagnames, opts); + // user-defined stag variables + std::set::const_iterator + var1 = stagvars.begin(), + var2 = stagvars.end(); + if (var1 != var2) { + o.ws("\n").wind(2).ws("const YYCTYPE *").wstring(*var1); + for (++var1; var1 != var2; ++var1) { + o.ws(", *").wstring(*var1); + } + o.ws(";"); + } + if (!mtagnames.empty()) { + o.ws("\n").wind(2).ws("yymtagpool_clear(&yytp);"); + // autogenerated mtag variables + conf.format = "yymtag_t *@@ = NULL;"; + output_tags(o.stream(), 0, conf, mtagnames, opts); + // user-defined mtag variables + var1 = mtagvars.begin(); + var2 = mtagvars.end(); + if (var1 != var2) { + o.ws("\n").wind(2).ws("yymtag_t *").wstring(*var1); + for (++var1; var1 != var2; ++var1) { + o.ws(", *").wstring(*var1); + } + o.ws(";"); + } + } + + o.ws("\n"); + if (opts->bFlag) { + bitmaps.gen(o, 2); + } + o.ws("\n"); +} + +void emit_end(OutputFile &o, const std::string &name, bool backup, bool oldstyle_ctxmarker, + const std::set &mtagnames) +{ + o.ws("\n").wind(1).ws("}"); + o.ws("\n").wind(1).ws("if (status == 0) {"); + o.ws("\n").wind(2).ws("if (cursor != eof) {"); + o.ws("\n").wind(3).ws("status = 1;"); + o.ws("\n").wind(3).ws("const long pos = token - input;"); + o.ws("\n").wind(3).ws("fprintf(stderr, \"error: lex_").wstring(name).ws(": unused input strings left at position %ld\\n\", pos);"); + o.ws("\n").wind(2).ws("}"); + o.ws("\n").wind(2).ws("if (i != keys_count) {"); + o.ws("\n").wind(3).ws("status = 1;"); + o.ws("\n").wind(3).ws("fprintf(stderr, \"error: lex_").wstring(name).ws(": unused keys left after %u keys\\n\", i);"); + o.ws("\n").wind(2).ws("}"); + o.ws("\n").wind(1).ws("}"); + o.ws("\n"); + o.ws("\nend:"); + o.ws("\n").wind(1).ws("free(input);"); + o.ws("\n").wind(1).ws("free(keys);"); + if (!mtagnames.empty()) { + o.ws("\n").wind(1).ws("yymtagpool_free(&yytp);"); + } + o.ws("\n"); + o.ws("\n").wind(1).ws("return status;"); + o.ws("\n}"); + o.ws("\n"); + o.ws("\n#undef YYCTYPE"); + o.ws("\n#undef YYKEYTYPE"); + o.ws("\n#undef YYPEEK"); + o.ws("\n#undef YYSKIP"); + if (backup) { + o.ws("\n#undef YYBACKUP"); + o.ws("\n#undef YYRESTORE"); + } + if (oldstyle_ctxmarker) { + o.ws("\n#undef YYBACKUPCTX"); + o.ws("\n#undef YYRESTORECTX"); + } + if (o.block().opts->tags) { + o.ws("\n#undef YYBACKUPTAG"); + o.ws("\n#undef YYRESTORETAG"); + o.ws("\n#undef YYCOPYTAG"); + } + o.ws("\n#undef YYLESSTHAN"); + o.ws("\n#undef YYFILL"); + o.ws("\n"); +} + +void emit_epilog(OutputFile &o, const std::set &names) +{ + o.ws("\n").ws("int main()"); + o.ws("\n").ws("{"); + + for (std::set::const_iterator i = names.begin(); i != names.end(); ++i) { + o.ws("\n").wind(1).ws("if(lex_").wstring(*i).ws("() != 0) {"); + o.ws("\n").wind(2).ws("return 1;"); + o.ws("\n").wind(1).ws("}"); + } + + o.ws("\n").wind(1).ws("return 0;"); + o.ws("\n}"); + o.ws("\n"); +} + +void emit_action(OutputFile &o, uint32_t ind, const DFA &dfa, size_t rid) +{ + const std::string &name = dfa.name; + const Rule &r = dfa.rules[rid]; + const uint64_t rkey = rule2key(rid, dfa.key_size, dfa.def_rule); + size_t ntag = 3; + for (size_t t = r.ltag; t < r.htag; ++t) { + const Tag &tag = dfa.tags[t]; + if (t != r.ttag && !fictive(tag)) ++ntag; + } + + o.wind(ind).ws("status = check_key_count_").wstring(name).ws("(keys_count, i, ") + .wu64(ntag).ws(")\n").wind(ind + 1).ws(" || action_").wstring(name) + .ws("(&i, keys, input, token, &cursor, ").wu64(rkey).ws(")"); + + for (size_t t = r.ltag; t < r.htag; ++t) { + const Tag &tag = dfa.tags[t]; + if (t == r.ttag || fictive(tag)) continue; + const std::string tname = tagname(tag), + prefix = history(tag) ? "m" : "s"; + o.ws("\n").wind(ind + 1).ws(" || check_").wstring(prefix).ws("tag").ws("_").wstring(name) + .ws("(&i, keys, ").wstring(tname).ws(", input, token, \"") + .wstring(tname).ws("\")"); + } + + o.ws(";\n"); + o.wind(ind).ws("continue;\n"); +} + +} // namespace re2c diff --git a/src/skeleton/generate_data.cc b/src/skeleton/generate_data.cc new file mode 100644 index 0000000..f2f1620 --- /dev/null +++ b/src/skeleton/generate_data.cc @@ -0,0 +1,409 @@ +#include +#include +#include "src/util/c99_stdint.h" +#include +#include +#include +#include +#include +#include +#include + +#include "src/conf/msg.h" +#include "src/conf/opt.h" +#include "src/dfa/tcmd.h" +#include "src/re/encoding/enc.h" +#include "src/re/rule.h" +#include "src/re/tag.h" +#include "src/skeleton/path.h" +#include "src/skeleton/skeleton.h" +#include "src/util/forbid_copy.h" +#include "src/util/u32lim.h" +#include "src/util/wrap_iter.h" + +namespace re2c +{ + +/* + * note [counting skeleton edges] + * + * To avoid any possible overflows all size calculations are wrapped in + * a special truncated unsigned 32-bit integer type that checks overflow + * on each binary operation or conversion from another type. + * + * Two things contribute to size calculation: path length and the number + * of outgoing arcs in each node. Some considerations on why these values + * will not overflow before they are converted to truncated type: + * + * - Maximal number of outgoing arcs in each node cannot exceed 32 bits: + * it is bounded by the number of code units in current encoding, and + * re2c doesn't support any encoding with more than 2^32 code units. + * Conversion is safe. + * + * - Maximal path length cannot exceed 32 bits: we estimate it right + * after skeleton construction and check for overflow. If path length + * does overflow, an error is reported and re2c aborts. + */ + +// See note [counting skeleton edges]. +// Type for calculating the size of path cover. +// Paths are dumped to file as soon as generated and don't eat +// heap space. The total size of path cover (measured in edges) +// is O(N^2) where N is the number of edges in skeleton. +typedef u32lim_t<1024 * 1024 * 1024> cover_size_t; // ~1Gb + +struct cover_t +{ + FILE *input; + FILE *keys; + std::vector loops; + std::vector suffixes; + path_t prefix; + cover_size_t size; + + cover_t(FILE *fi, FILE *fk, size_t nnodes): + input(fi), keys(fk), loops(nnodes), + suffixes(nnodes), prefix(0), + size(cover_size_t::from32(0u)) {} + + FORBID_COPY(cover_t); +}; + +template static uintn_t to_le(uintn_t n) +{ + uintn_t m; + uint8_t *p = reinterpret_cast(&m); + for (size_t i = 0; i < sizeof(uintn_t); ++i) { + p[i] = static_cast(n >> (i * 8)); + } + return m; +} + +// pick at most 0x100 unique edges from this range +// (for 1-byte code units this covers the whole range: [0 - 0xFF]) +// - range bounds must be included +// - values should be evenly distributed +// - values should be deterministic +static uint32_t step(uint32_t lower, uint32_t upper) +{ + return 1 + (upper - lower) / 0x100; +} + +static uint32_t nsteps(uint32_t lower, uint32_t upper) +{ + return 2 + (upper - lower - 1) / step(lower, upper); +} + +static void apply(std::vector *tags, const tcmd_t *cmd, size_t pos) +{ + for (const tcmd_t *p = cmd; p; p = p->next) { + const tagver_t l = p->lhs, r = p->rhs, *h = p->history; + std::vector &t = tags[l]; + if (tcmd_t::iscopy(p)) { + t = tags[r]; + } else if (tcmd_t::isset(p)) { + t.clear(); + t.push_back(*h == TAGVER_BOTTOM ? Skeleton::DEFTAG : pos); + } else { + if (l != r) t = tags[r]; + std::vector x; + for (; *h != TAGVER_ZERO; ++h) { + x.push_back(*h == TAGVER_BOTTOM ? Skeleton::DEFTAG : pos); + } + t.insert(t.end(), x.rbegin(), x.rend()); + } + } +} + +static size_t path_width(const path_t &path, const Skeleton &skel) +{ + size_t width = 0; + for (size_t i = 0; i < path.len(); ++i) { + + // width of multiarc: total number of characters picked from all ranges + size_t w = 0; + const Node::arc_t &arc = path.arc(skel, i); + for (Node::citer_t a = arc.begin(); a != arc.end(); ++a) { + w += nsteps(a->lower, a->upper); + } + + // width of multipath: maximal width of multiarc + width = std::max(width, w); + } + return width; +} + +template +static void write_input(const path_t &path, const Skeleton &skel, + size_t width, FILE *file) +{ + const size_t + len = path.len(), + size = len * width; + cunit_t *buffer = new cunit_t[size]; + + // pick characters from ranges + for (size_t i = 0; i < len; ++i) { + Node::wciter_t a(path.arc(skel, i)); + for (size_t w = 0; w < width; ++a) { + const uint32_t + l = a->lower, + u = a->upper, + d = step(l, u); + for (uint32_t m = l; m < u + d && w < width; m += d, ++w) { + buffer[w * len + i] = to_le(static_cast(std::min(m, u))); + } + } + } + + fwrite(buffer, sizeof(cunit_t), size, file); + + delete[] buffer; +} + +template +static void write_keys(const path_t &path, const Skeleton &skel, + size_t width, FILE *file) +{ + // find last accepting node + size_t f; + for (f = path.len(); f > 0 && path.node(skel, f).rule == Rule::NONE; --f); + + // calculate tags: start with default and apply commands step by step + const size_t + nver = skel.ntagver, + ntag = width * nver, + offby = skel.opts->lookahead ? 0 : 1; + std::vector *tags = new std::vector[ntag]; + for (size_t w = 0; w < width; ++w) { + apply(&tags[w * nver], skel.cmd0, 0); // absent in LATDFA + } + for (size_t i = 0; i < f; ++i) { + Node::wciter_t a(path.arc(skel, i)); + for (size_t w = 0; w < width; ++a) { + uint32_t n = nsteps(a->lower, a->upper); + for (; n --> 0 && w < width; ++w) { + apply(&tags[w * nver], a->cmd, i + offby); + } + } + } + const tcmd_t *fcmd = path.node(skel, f).cmd; + for (size_t w = 0; w < width; ++w) { + apply(&tags[w * nver], fcmd, f); // only present in LATDFA + } + + const size_t rule = path.node(skel, f).rule; + size_t matched = 0, ltag = 0, htag = 0, trail = 0; + if (rule != Rule::NONE) { + + const Rule &r = skel.rules[rule]; + ltag = r.ltag; + htag = r.htag; + trail = r.ttag; + + // matched length might depend on tag values + if (trail == htag) { + matched = f; + } else { + assert(!fixed(skel.tags[trail])); // no fixed trailing context + matched = tags[skel.finvers[trail]].back(); + assert(matched != Skeleton::DEFTAG); + } + } + + // count keys + size_t nkey = 0; + for (size_t w = 0; w < width; ++w) { + nkey += 3; + for (size_t t = ltag; t < htag; ++t) { + const Tag &tag = skel.tags[t]; + if (t == trail || fictive(tag)) continue; + const size_t + base = fixed(tag) ? tag.base : t, + bver = static_cast(skel.finvers[base]); + if (history(tag)) nkey += tags[w * nver + bver].size(); + ++nkey; + } + } + + // keys: 1 - scanned length, 2 - matched length, 3 - matched rule, the rest - tags + key_t *keys = new key_t[nkey], *k = keys; + for (size_t w = 0; w < width; ++w) { + *k++ = to_le(static_cast(path.len())); + *k++ = to_le(static_cast(matched)); + *k++ = to_le(rule2key(rule, skel.defrule)); + + for (size_t t = ltag; t < htag; ++t) { + const Tag &tag = skel.tags[t]; + if (t == trail || fictive(tag)) continue; + + const size_t + base = fixed(tag) ? tag.base : t, + bver = static_cast(skel.finvers[base]); + const std::vector &h = tags[w * nver + bver]; + if (history(tag)) { + const size_t hlen = h.size(); + *k++ = to_le(static_cast(hlen)); + for (size_t i = 0; i < hlen; ++i) { + *k++ = to_le(static_cast(h[i])); + } + } else { + *k++ = to_le(static_cast(h.back())); + } + } + } + + // dump to file + fwrite(keys, sizeof(key_t), nkey, file); + + delete[] tags; + delete[] keys; +} + +template +static cover_size_t cover_one(const Skeleton &skel, cover_t &cover) +{ + const path_t &path = cover.prefix; + + const size_t width = path_width(path, skel); + + const cover_size_t size + = cover_size_t::from64(path.len()) + * cover_size_t::from64(width); + + if (!size.overflow()) { + write_input(path, skel, width, cover.input); + write_keys(path, skel, width, cover.keys); + } + + return size; +} + +/* + * note [generating skeleton path cover] + * + * With --skeleton switch we need to generate lots of data: strings that + * correspond to various paths in DFA and match given regular expression. + * We try to generate path cover (a set of paths that cover all skeleton + * arcs at least once). Generation must stop as soon as the size of path + * cover exceeds limit (in which case we'll only get a partial path cover). + * + * The algorithm walks graph nodes in deep-first order and assigns suffix + * to each node (a path from this node to end node). In order to calculate + * suffix for a given node the algorithm must know suffix for any child + * node (end nodes are assigned empty suffix at start). Suffix is only + * calculated once for each node and then reused as much times as the node + * is visited. This is what reduces search space. + * + * The algorithm calculates prefix (multipath to current node). If current + * node has already been assigned suffix, the algorithm immediately + * calculates path cover from prefix and suffix. Otherwise it recurses to + * child nodes (updating prefix on the go). + * + * The algorithm avoids eternal loops by maintaining loop counter for each + * node. Loop counter is incremented on recursive enter and decremented on + * recursive return. If loop counter is greater than 1, current branch is + * abandoned and recursion returns immediately. + * + * See also note [counting skeleton edges]. + * + */ +template static void gencover( + const Skeleton &skel, + cover_t &cover, + size_t i) +{ + const Node &node = skel.nodes[i]; + uint8_t &loop = cover.loops[i]; + suffix_t &suffix = cover.suffixes[i]; + path_t &prefix = cover.prefix; + cover_size_t &size = cover.size; + + if (node.end() && !suffix.init) { + suffix.init = true; + } + + if (suffix.init) + { + prefix.push_sfx(suffix); + size = size + cover_one(skel, cover); + prefix.pop_sfx(suffix); + } else if (loop < 2) { + local_inc _(loop); + + Node::arcs_t::const_iterator + arc = node.arcs.begin(), + end = node.arcs.end(); + for (; arc != end && !size.overflow(); ++arc) { + const size_t j = arc->first; + + prefix.push(j); + gencover(skel, cover, j); + prefix.pop(); + + const suffix_t &sfx = cover.suffixes[j]; + if (sfx.init && !suffix.init) { + suffix = sfx; + suffix.push(j); + } + } + } +} + +template + static void generate_paths_cunit_key(const Skeleton &skel, cover_t &cover) +{ + gencover(skel, cover, 0); + if (cover.size.overflow()) { + warning(NULL, skel.line, false, + "DFA %sis too large: can only generate partial path cover", + incond(skel.cond).c_str()); + } +} + +template + static void generate_paths_cunit(const Skeleton &skel, cover_t &cover) +{ + switch (skel.sizeof_key) { + case 8: generate_paths_cunit_key(skel, cover); break; + case 4: generate_paths_cunit_key(skel, cover); break; + case 2: generate_paths_cunit_key(skel, cover); break; + case 1: generate_paths_cunit_key(skel, cover); break; + } +} + +static void generate_paths(const Skeleton &skel, cover_t &cover) +{ + switch (skel.opts->encoding.szCodeUnit()) { + case 4: generate_paths_cunit(skel, cover); break; + case 2: generate_paths_cunit(skel, cover); break; + case 1: generate_paths_cunit(skel, cover); break; + } +} + +void emit_data(const Skeleton &skel) +{ + std::string fname = skel.opts->output_file; + if (fname.empty()) { + fname = ""; + } + + const std::string input_name = fname + "." + skel.name + ".input"; + FILE *input = fopen(input_name.c_str(), "wb"); + if (!input) { + fatal("cannot open file: %s", input_name.c_str()); + } + const std::string keys_name = std::string(fname) + "." + skel.name + ".keys"; + FILE *keys = fopen (keys_name.c_str(), "wb"); + if (!keys) { + fatal("cannot open file: %s", keys_name.c_str()); + } + + cover_t cover(input, keys, skel.nodes_count); + generate_paths(skel, cover); + + fclose(input); + fclose(keys); +} + +} // namespace re2c diff --git a/src/skeleton/maxpath.cc b/src/skeleton/maxpath.cc new file mode 100644 index 0000000..3daa3a5 --- /dev/null +++ b/src/skeleton/maxpath.cc @@ -0,0 +1,71 @@ +#include +#include "src/util/c99_stdint.h" +#include +#include +#include +#include +#include +#include + +#include "src/conf/msg.h" +#include "src/skeleton/skeleton.h" + +namespace re2c +{ + +// 0 < DIST_MAX < DIST_ERROR <= std::numeric_limits::max() +static const uint32_t DIST_ERROR = std::numeric_limits::max(); +static const uint32_t DIST_MAX = DIST_ERROR - 1; + +// maximal distance to end node (assuming one iteration per loop) +// different from YYMAXFILL calculation +// in the way it handles loops and empty regexp +static void calc_dist( + const Skeleton &skel, + std::vector &loops, + std::vector &dists, + size_t i) +{ + const Node &node = skel.nodes[i]; + uint8_t &loop = loops[i]; + uint32_t &dist = dists[i]; + + if (dist != DIST_ERROR) { + return; + } else if (node.end()) { + dist = 0; + } else if (loop < 2) { + local_inc _(loop); + Node::arcs_t::const_iterator + arc = node.arcs.begin(), + end = node.arcs.end(); + for (; arc != end; ++arc) { + const size_t j = arc->first; + calc_dist(skel, loops, dists, j); + uint32_t &d = dists[j]; + if (d != DIST_ERROR) { + if (dist == DIST_ERROR) { + dist = d; + } else { + dist = std::max(dist, d); + } + } + } + dist = std::min(dist + 1, DIST_MAX); + } +} + +// calculate maximal path length, check overflow +uint32_t maxpath(const Skeleton &skel) +{ + std::vector loops(skel.nodes_count); + std::vector dists(skel.nodes_count, DIST_ERROR); + calc_dist(skel, loops, dists, 0); + const uint32_t maxlen = dists[0]; + if (maxlen == DIST_MAX) { + fatal("DFA path %sis too long", incond(skel.cond).c_str()); + } + return maxlen; +} + +} // namespace re2c diff --git a/src/skeleton/path.h b/src/skeleton/path.h new file mode 100644 index 0000000..fb1aee8 --- /dev/null +++ b/src/skeleton/path.h @@ -0,0 +1,78 @@ +#ifndef _RE2C_SKELETON_PATH_ +#define _RE2C_SKELETON_PATH_ + +#include "src/util/c99_stdint.h" +#include + +#include "src/skeleton/skeleton.h" + +namespace re2c +{ + +struct suffix_t +{ + bool init; + +private: + std::vector arcs; + +public: + + suffix_t(): init(false), arcs() {} + void push(size_t i) + { + arcs.push_back(i); + } + friend class path_t; +}; + +class path_t +{ + std::vector arcs; + +public: + explicit path_t(size_t i) : arcs() + { + arcs.push_back(i); + } + size_t len() const + { + return arcs.size() - 1; + } + const Node& node(const Skeleton &skel, size_t i) const + { + return skel.nodes[arcs[i]]; + } + const Node::arc_t& arc(const Skeleton &skel, size_t i) const + { + return skel.nodes[arcs[i]].arcs.find(arcs[i + 1])->second; + } + void push(size_t n) + { + arcs.push_back(n); + } + void pop() + { + arcs.pop_back(); + } + void push_sfx(const suffix_t &suffix) + { + arcs.insert(arcs.end(), suffix.arcs.rbegin(), suffix.arcs.rend()); + } + void pop_sfx(const suffix_t &suffix) + { + arcs.resize(arcs.size() - suffix.arcs.size()); + } + bool operator<(const path_t &p) const + { + const size_t + s1 = arcs.size(), + s2 = p.arcs.size(); + return (s1 == s2 && arcs < p.arcs) + || s1 < s2; + } +}; + +} // namespace re2c + +#endif // _RE2C_SKELETON_PATH_ diff --git a/src/skeleton/skeleton.cc b/src/skeleton/skeleton.cc new file mode 100644 index 0000000..5f551ab --- /dev/null +++ b/src/skeleton/skeleton.cc @@ -0,0 +1,107 @@ +#include +#include + +#include "src/dfa/dfa.h" +#include "src/skeleton/skeleton.h" + +namespace re2c +{ + +struct opt_t; +struct tcmd_t; + +Node::Node() + : arcs() + , rule(Rule::NONE) + , cmd(NULL) +{} + +void Node::init(const dfa_state_t *s, + const std::vector &charset, size_t nil) +{ + const size_t nc = charset.size() - 1; + for (uint32_t c = 0, l = 0; c < nc;) { + + size_t j = s->arcs[c]; + const tcmd_t *t = s->tcmd[c]; + for (; ++c < nc && s->arcs[c] == j && s->tcmd[c] == t;); + if (j == dfa_t::NIL) j = nil; + + // all arcs go to default node => this node is final + if (l == 0 && c == nc && j == nil) break; + + const uint32_t u = charset[c]; + arcs[j].push_back(Node::range_t(l, u - 1, t)); + + l = u; + } + + rule = s->rule; + cmd = s->tcmd[nc]; +} + +bool Node::end() const +{ + return arcs.size() == 0; +} + +const size_t Skeleton::DEFTAG = std::numeric_limits::max(); + +Skeleton::Skeleton( + const dfa_t &dfa, + const opt_t *op, + size_t def, + const std::string &dfa_name, + const std::string &dfa_cond, + uint32_t dfa_line) + : opts(op) + , name(dfa_name) + , cond(dfa_cond) + , line(dfa_line) + , nodes_count(dfa.states.size() + 1) // +1 for default state + , nodes(new Node[nodes_count]) + , cmd0(dfa.tcmd0) + , sizeof_key(8) + , defrule(def) + , ntagver(static_cast(dfa.maxtagver) + 1) + , charset(dfa.charset) + , rules(dfa.rules) + , tags(dfa.tags) + , finvers(dfa.finvers) +{ + // initialize nodes + const size_t nil = nodes_count - 1; + for (size_t i = 0; i < nil; ++i) { + nodes[i].init(dfa.states[i], charset, nil); + } + + // initialize size of key + const size_t maxlen = maxpath(*this); + const size_t maxrule = dfa.rules.size() + 1; // +1 for none-rule + const size_t max = std::max(maxlen, maxrule); + if (max <= std::numeric_limits::max()) { + sizeof_key = 1; + } else if (max <= std::numeric_limits::max()) { + sizeof_key = 2; + } else if (max <= std::numeric_limits::max()) { + sizeof_key = 4; + } +} + +Skeleton::~Skeleton() +{ + delete[] nodes; +} + +uint64_t rule2key(size_t rule, size_t key, size_t def) +{ + switch (key) { + default: assert(false); // shouldn't happen + case 8: return rule2key(rule, def); + case 4: return rule2key(rule, def); + case 2: return rule2key(rule, def); + case 1: return rule2key(rule, def); + } +} + +} // namespace re2c diff --git a/src/skeleton/skeleton.h b/src/skeleton/skeleton.h new file mode 100644 index 0000000..d565ccb --- /dev/null +++ b/src/skeleton/skeleton.h @@ -0,0 +1,125 @@ +#ifndef _RE2C_SKELETON_SKELETON_ +#define _RE2C_SKELETON_SKELETON_ + +#include "src/util/c99_stdint.h" +#include +#include +#include +#include +#include +#include +#include +#include + +#include "src/code/bitmap.h" +#include "src/conf/opt.h" +#include "src/dfa/tcmd.h" +#include "src/re/rule.h" +#include "src/re/tag.h" +#include "src/util/forbid_copy.h" +#include "src/util/local_increment.h" +#include "src/util/wrap_iter.h" + +namespace re2c +{ + +class OutputFile; +class path_t; +struct DFA; +struct dfa_state_t; +struct dfa_t; +class Warn; +class bitmaps_t; +struct opt_t; +struct tcmd_t; + +typedef local_increment_t local_inc; + +struct Node +{ + struct range_t { + uint32_t lower; + uint32_t upper; + const tcmd_t *cmd; + + range_t(): lower(0), upper(0), cmd(NULL) {} + range_t(uint32_t l, uint32_t u, const tcmd_t *c) + : lower(l), upper(u), cmd(c) {} + }; + + typedef std::vector arc_t; + typedef std::map arcs_t; + typedef arc_t::const_iterator citer_t; + typedef wrap_citer_t wciter_t; + + arcs_t arcs; + size_t rule; + const tcmd_t *cmd; + + Node(); + void init(const dfa_state_t *s, + const std::vector &charset, size_t nil); + bool end() const; + + FORBID_COPY(Node); +}; + +struct Skeleton +{ + static const size_t DEFTAG; + + const opt_t *opts; + const std::string name; + const std::string cond; + const uint32_t line; + + const size_t nodes_count; + Node *nodes; + const tcmd_t *cmd0; + + size_t sizeof_key; + size_t defrule; + size_t ntagver; + const std::vector &charset; + const std::valarray &rules; + const std::vector &tags; + const tagver_t *finvers; + + Skeleton(const dfa_t &dfa, const opt_t *op, size_t def, + const std::string &dfa_name, const std::string &dfa_cond, + uint32_t dfa_line); + ~Skeleton (); + FORBID_COPY(Skeleton); +}; + +template key_t rule2key(size_t r, size_t def) +{ + if (r == Rule::NONE) { + return std::numeric_limits::max(); + } else if (r == def) { + key_t k = std::numeric_limits::max(); + return --k; + } else { + return static_cast(r); + } +} + +uint64_t rule2key(size_t rule, size_t key, size_t def); +uint32_t maxpath(const Skeleton &skel); +void warn_undefined_control_flow(const Skeleton &skel, Warn &warn); +void fprint_default_path(FILE *f, const Skeleton &skel, const path_t &p); +void emit_data(const Skeleton &skel); +void emit_prolog(OutputFile & o); +void emit_start(OutputFile &o, size_t maxfill, size_t maxnmatch, const std::string &name, + size_t sizeof_key, size_t def, bool backup, bool accept, bool oldstyle_ctxmarker, + const std::set &stagnames, const std::set &stagvars, + const std::set &mtagnames, const std::set &mtagvars, + bitmaps_t &bitmaps); +void emit_end(OutputFile &o, const std::string &name, bool backup, bool oldstyle_ctxmarker, + const std::set &mtagnames); +void emit_epilog(OutputFile &o, const std::set &names); +void emit_action(OutputFile &o, uint32_t ind, const DFA &dfa, size_t rid); + +} // namespace re2c + +#endif // _RE2C_SKELETON_SKELETON_ diff --git a/src/util/hash32.h b/src/util/hash32.h new file mode 100644 index 0000000..87d7cee --- /dev/null +++ b/src/util/hash32.h @@ -0,0 +1,21 @@ +#ifndef _RE2C_UTIL_HASH32_ +#define _RE2C_UTIL_HASH32_ + +#include +#include "src/util/c99_stdint.h" + +namespace re2c +{ + +inline uint32_t hash32(uint32_t h, const void *data, size_t size) +{ + const uint8_t *bytes = static_cast(data); + for (size_t i = 0; i < size; ++i) { + h = h ^ ((h << 5) + (h >> 2) + bytes[i]); + } + return h; +} + +} // namespace re2c + +#endif // _RE2C_UTIL_HASH32_ diff --git a/src/util/lookup.h b/src/util/lookup.h new file mode 100644 index 0000000..e649b9c --- /dev/null +++ b/src/util/lookup.h @@ -0,0 +1,122 @@ +#ifndef _RE2C_UTIL_LOOKUP_ +#define _RE2C_UTIL_LOOKUP_ + +#include "src/util/c99_stdint.h" +#include +#include +#include +#include + +namespace re2c +{ + +/* + * O(1) random access + * O(log(n)) insertion + */ +template +struct lookup_t +{ + static const size_t NIL; + +private: + struct elem_t + { + size_t next; + data_t data; + + elem_t(size_t n, const data_t &d) + : next(n), data(d) {} + }; + + std::vector elems; + std::map lookup; + +public: + lookup_t(); + size_t size() const; + data_t& operator[](size_t idx); + const data_t& operator[](size_t idx) const; + size_t push(hash_t hash, const data_t &data); + template size_t find_with(hash_t hash, const data_t &data, pred_t &pred) const; + template size_t find_next_with(size_t prev, const data_t &data, pred_t &pred) const; + +private: + size_t head(hash_t) const; + template size_t find(size_t next, const data_t &data, pred_t &pred) const; +}; + +template +const size_t lookup_t::NIL = std::numeric_limits::max(); + +template +lookup_t::lookup_t() + : elems() + , lookup() +{} + +template +size_t lookup_t::size() const +{ + return elems.size(); +} + +template +data_t& lookup_t::operator[](size_t idx) +{ + return elems[idx].data; +} + +template +const data_t& lookup_t::operator[](size_t idx) const +{ + return elems[idx].data; +} + +template +size_t lookup_t::head(hash_t h) const +{ + typename std::map::const_iterator x = lookup.find(h); + return x == lookup.end() ? NIL : x->second; +} + +template +size_t lookup_t::push(hash_t hash, const data_t &data) +{ + const size_t idx = elems.size(); + elems.push_back(elem_t(head(hash), data)); + lookup[hash] = idx; + return idx; +} + +template +template +size_t lookup_t::find(size_t next, const data_t &data, pred_t &pred) const +{ + for (size_t i = next; i != NIL;) { + const elem_t &e = elems[i]; + if (pred(e.data, data)) { + return i; + } + i = e.next; + } + return NIL; +} + +template +template +size_t lookup_t::find_with(hash_t hash, const data_t &data, pred_t &pred) const +{ + return find(head(hash), data, pred); +} + +template +template +size_t lookup_t::find_next_with(size_t prev, const data_t &data, pred_t &pred) const +{ + return find(elems[prev].next, data, pred); +} + +} // namespace re2c + +#endif // _RE2C_UTIL_LOOKUP_ diff --git a/src/util/ord_hash_set.h b/src/util/ord_hash_set.h deleted file mode 100644 index 9a0e73e..0000000 --- a/src/util/ord_hash_set.h +++ /dev/null @@ -1,115 +0,0 @@ -#ifndef _RE2C_UTIL_ORD_HASH_SET_ -#define _RE2C_UTIL_ORD_HASH_SET_ - -#include "src/util/c99_stdint.h" -#include // malloc, free -#include // memcpy -#include -#include - -namespace re2c -{ - -/* - * ordered hash set: - * - access element by index: O(1) - * - insert element (find existing or add new): O(log(n)) - * - */ -class ord_hash_set_t -{ - struct elem_t - { - elem_t *next; - size_t index; - size_t size; - char data[1]; // inlined array of variable length - }; - typedef size_t hash_t; - - std::vector elems; - std::map lookup; - - static hash_t hash(const void *data, size_t size); - elem_t *make_elem(elem_t *next, size_t index, size_t size, const void *data); - -public: - ord_hash_set_t(); - ~ord_hash_set_t(); - size_t size() const; - size_t insert(const void *data, size_t size); - template size_t deref(size_t i, data_t *&data); -}; - -ord_hash_set_t::hash_t ord_hash_set_t::hash(const void *data, size_t size) -{ - const uint8_t *bytes = static_cast(data); - hash_t h = size; // seed - for (size_t i = 0; i < size; ++i) - { - h = h ^ ((h << 5) + (h >> 2) + bytes[i]); - } - return h; -} - -ord_hash_set_t::elem_t* ord_hash_set_t::make_elem( - elem_t *next, - size_t index, - size_t size, - const void *data) -{ - elem_t *e = static_cast(malloc(offsetof(elem_t, data) + size)); - e->next = next; - e->index = index; - e->size = size; - memcpy(e->data, data, size); - return e; -} - -ord_hash_set_t::ord_hash_set_t() - : elems() - , lookup() -{} - -ord_hash_set_t::~ord_hash_set_t() -{ - std::for_each(elems.begin(), elems.end(), free); -} - -size_t ord_hash_set_t::size() const -{ - return elems.size(); -} - -size_t ord_hash_set_t::insert(const void *data, size_t size) -{ - const hash_t h = hash(data, size); - - std::map::const_iterator i = lookup.find(h); - if (i != lookup.end()) - { - for (elem_t *e = i->second; e; e = e->next) - { - if (e->size == size - && memcmp(e->data, data, size) == 0) - { - return e->index; - } - } - } - - const size_t index = elems.size(); - elems.push_back(lookup[h] = make_elem(lookup[h], index, size, data)); - return index; -} - -template size_t ord_hash_set_t::deref(size_t i, data_t *&data) -{ - elem_t *e = elems[i]; - data = reinterpret_cast(e->data); - return e->size / sizeof(data_t); -} - -} // namespace re2c - -#endif // _RE2C_UTIL_ORD_HASH_SET_ diff --git a/src/util/range.h b/src/util/range.h index 9a9cf03..afc142c 100644 --- a/src/util/range.h +++ b/src/util/range.h @@ -1,9 +1,9 @@ #ifndef _RE2C_UTIL_RANGE_ #define _RE2C_UTIL_RANGE_ -#include "src/util/c99_stdint.h" #include #include // NULL +#include "src/util/c99_stdint.h" #include "src/test/range/test.h" #include "src/util/forbid_copy.h" diff --git a/src/util/s_to_n32_unsafe.h b/src/util/s_to_n32_unsafe.h index e733c16..27c1e1c 100644 --- a/src/util/s_to_n32_unsafe.h +++ b/src/util/s_to_n32_unsafe.h @@ -1,9 +1,10 @@ #ifndef _RE2C_UTIL_S_TO_N32_UNSAFE_ #define _RE2C_UTIL_S_TO_N32_UNSAFE_ -#include "src/util/attribute.h" #include "src/util/c99_stdint.h" +#include "src/util/attribute.h" + bool s_to_u32_unsafe (const char * s, const char * s_end, uint32_t & number) RE2C_GXX_ATTRIBUTE ((warn_unused_result)); bool s_to_i32_unsafe (const char * s, const char * s_end, int32_t & number) RE2C_GXX_ATTRIBUTE ((warn_unused_result)); diff --git a/src/util/slab_allocator.h b/src/util/slab_allocator.h new file mode 100644 index 0000000..f34600d --- /dev/null +++ b/src/util/slab_allocator.h @@ -0,0 +1,70 @@ +#ifndef _RE2C_UTIL_SLAB_ALLOCATOR_ +#define _RE2C_UTIL_SLAB_ALLOCATOR_ + +#include "src/util/c99_stdint.h" +#include // std::for_each +#include // malloc, free +#include // slab queue + +#include "src/util/forbid_copy.h" + +/* + * Works nice for tiny POD objects (~30 bytes and lower) + * WARNING: Does not free memory for distinct objects! + * + * Works ~20 times faster, than linux's glibc allocator :] + */ +template +class slab_allocator_t +{ + typedef std::vector slabs_t; + + slabs_t slabs_; /* quasilist of allocated slabs of 'SLAB_SIZE' bytes */ + char *current_slab_; + char *current_slab_end_; + +public: + slab_allocator_t(): slabs_(), current_slab_(0), current_slab_end_(0) {} + + ~slab_allocator_t() { std::for_each(slabs_.rbegin(), slabs_.rend(), free); } + + void *alloc(size_t size) + { + char *result; + + /* alignment */ + size += ALIGN - size % ALIGN; + + /* very large objects */ + if (size > MAXIMUM_INLINE) { + result = static_cast(malloc(size)); + slabs_.push_back(result); + return result; + } + + /* no space in slab */ + const size_t yet_in_slab = static_cast(current_slab_end_ - current_slab_); + if (yet_in_slab < size) { + current_slab_ = static_cast(malloc(SLAB_SIZE)); + current_slab_end_ = current_slab_ + SLAB_SIZE; + slabs_.push_back(current_slab_); + } + + result = current_slab_; + current_slab_ += size; + + return result; + } + + template + inline data_t *alloct(size_t n) + { + return static_cast(alloc(n * sizeof(data_t))); + } + + FORBID_COPY(slab_allocator_t); +}; + +#endif // _RE2C_UTIL_SLAB_ALLOCATOR_ diff --git a/src/util/string_utils.h b/src/util/string_utils.h new file mode 100644 index 0000000..65f6b85 --- /dev/null +++ b/src/util/string_utils.h @@ -0,0 +1,37 @@ +#ifndef _RE2C_UTIL_STRING_UTILS_ +#define _RE2C_UTIL_STRING_UTILS_ + +#include +#include + +namespace re2c +{ + +template void strrreplace( + std::string &s, + const std::string &s1, + const type_t &v) +{ + std::ostringstream sv; + sv << v; + const std::string &s2 = sv.str(); + const size_t l = s1.length(); + if (l != 0) { + std::string::size_type pos; + while ((pos = s.find(s1)) != std::string::npos) { + s.replace(pos, l, s2); + } + } +} + +template +static std::string to_string(const T &v) +{ + std::ostringstream s; + s << v; + return s.str(); +} + +} // namespace re2c + +#endif // _RE2C_UTIL_STRING_UTILS_ diff --git a/src/util/wrap_iter.h b/src/util/wrap_iter.h new file mode 100644 index 0000000..419c18f --- /dev/null +++ b/src/util/wrap_iter.h @@ -0,0 +1,26 @@ +#ifndef _RE2C_UTIL_WRAP_ITER_ +#define _RE2C_UTIL_WRAP_ITER_ + +namespace re2c +{ + +// immutable containter +template +class wrap_citer_t +{ + typedef typename container_t::const_iterator citer_t; + typedef const typename container_t::value_type* cpval_t; + + const citer_t beg; + const citer_t end; + citer_t cur; + +public: + explicit wrap_citer_t(const container_t &c): beg(c.begin()), end(c.end()), cur(beg) {} + wrap_citer_t& operator++() { if (++cur == end) cur = beg; return *this; } + cpval_t operator->() const { return cur.operator->(); } +}; + +} // namespace re2c + +#endif // _RE2C_UTIL_WRAP_ITER_ diff --git a/test-driver b/test-driver new file mode 100755 index 0000000..0218a01 --- /dev/null +++ b/test-driver @@ -0,0 +1,148 @@ +#! /bin/sh +# test-driver - basic testsuite driver script. + +scriptversion=2016-01-11.22; # UTC + +# Copyright (C) 2011-2017 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +# Make unconditional expansion of undefined variables an error. This +# helps a lot in preventing typo-related bugs. +set -u + +usage_error () +{ + echo "$0: $*" >&2 + print_usage >&2 + exit 2 +} + +print_usage () +{ + cat <$log_file 2>&1 +estatus=$? + +if test $enable_hard_errors = no && test $estatus -eq 99; then + tweaked_estatus=1 +else + tweaked_estatus=$estatus +fi + +case $tweaked_estatus:$expect_failure in + 0:yes) col=$red res=XPASS recheck=yes gcopy=yes;; + 0:*) col=$grn res=PASS recheck=no gcopy=no;; + 77:*) col=$blu res=SKIP recheck=no gcopy=yes;; + 99:*) col=$mgn res=ERROR recheck=yes gcopy=yes;; + *:yes) col=$lgn res=XFAIL recheck=no gcopy=yes;; + *:*) col=$red res=FAIL recheck=yes gcopy=yes;; +esac + +# Report the test outcome and exit status in the logs, so that one can +# know whether the test passed or failed simply by looking at the '.log' +# file, without the need of also peaking into the corresponding '.trs' +# file (automake bug#11814). +echo "$res $test_name (exit status: $estatus)" >>$log_file + +# Report outcome to console. +echo "${col}${res}${std}: $test_name" + +# Register the test result, and other relevant metadata. +echo ":test-result: $res" > $trs_file +echo ":global-test-result: $res" >> $trs_file +echo ":recheck: $recheck" >> $trs_file +echo ":copy-in-global-log: $gcopy" >> $trs_file + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/test/bug1054496.c b/test/bug1054496.c index a6de4a2..e68846a 100644 --- a/test/bug1054496.c +++ b/test/bug1054496.c @@ -99,8 +99,8 @@ yy6: default: goto yy5; } yy7: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 'A': case 'B': case 'C': diff --git a/test/bug116.c b/test/bug116.c index 2c53468..4540294 100644 --- a/test/bug116.c +++ b/test/bug116.c @@ -6,7 +6,6 @@ YYCTYPE yych; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; - YYCTXMARKER = YYCURSOR; switch (yych) { case 'a': goto yy3; default: goto yy2; @@ -14,12 +13,12 @@ yy2: yy3: ++YYCURSOR; - YYCURSOR = YYCTXMARKER; + YYCURSOR -= 1; #line 2 "bug116.re" {} -#line 21 "bug116.c" +#line 20 "bug116.c" } #line 3 "bug116.re" -re2c: warning: line 3: control flow is undefined for strings that match '[\x0-\x60\x62-\xFF]', use default rule '*' [-Wundefined-control-flow] re2c: warning: line 2: rule matches empty string [-Wmatch-empty-string] +re2c: warning: line 3: control flow is undefined for strings that match '[\x0-\x60\x62-\xFF]', use default rule '*' [-Wundefined-control-flow] diff --git a/test/bug1163046.--skeleton.c b/test/bug1163046.--skeleton.c index c0122fe..bd7fbe1 100644 --- a/test/bug1163046.--skeleton.c +++ b/test/bug1163046.--skeleton.c @@ -1,7 +1,9 @@ /* Generated by re2c */ +#include /* size_t */ #include #include /* malloc, free */ +#include /* memcpy */ static void *read_file ( const char *fname @@ -58,7 +60,7 @@ error: #define YYFILL(n) { break; } static int action_line26 - ( unsigned int i + ( unsigned *pkix , const YYKEYTYPE *keys , const YYCTYPE *start , const YYCTYPE *token @@ -66,10 +68,12 @@ static int action_line26 , YYKEYTYPE rule_act ) { + const unsigned kix = *pkix; const long pos = token - start; const long len_act = *cursor - token; - const long len_exp = (long) keys [3 * i + 1]; - const YYKEYTYPE rule_exp = keys [3 * i + 2]; + const long len_exp = (long) keys[kix + 1]; + const YYKEYTYPE rule_exp = keys[kix + 2]; + *pkix = kix + 3; if (rule_exp == 255) { fprintf ( stderr @@ -79,17 +83,17 @@ static int action_line26 ); } if (len_act == len_exp && rule_act == rule_exp) { - const YYKEYTYPE offset = keys[3 * i]; + const YYKEYTYPE offset = keys[kix]; *cursor = token + offset; return 0; } else { fprintf ( stderr - , "error: lex_line26: at position %ld (iteration %u):\n" + , "error: lex_line26: at position %ld (key %u):\n" "\texpected: match length %ld, rule %u\n" "\tactual: match length %ld, rule %u\n" , pos - , i + , kix , len_exp , rule_exp , len_act @@ -99,6 +103,13 @@ static int action_line26 } } +static int check_key_count_line26(unsigned have, unsigned used, unsigned need) +{ + if (used + need <= have) return 0; + fprintf(stderr, "error: lex_line26: not enough keys\n"); + return 1; +} + int lex_line26() { const size_t padding = 45; /* YYMAXFILL */ @@ -126,7 +137,7 @@ int lex_line26() keys = (YYKEYTYPE *) read_file ("bug1163046.--skeleton.c.line26.keys" - , 3 * sizeof (YYKEYTYPE) + , sizeof (YYKEYTYPE) , 0 , &keys_count ); @@ -139,7 +150,7 @@ int lex_line26() limit = input + input_len + padding; eof = input + input_len; - for (i = 0; status == 0 && i < keys_count; ++i) { + for (i = 0; status == 0 && cursor < eof && i < keys_count;) { token = cursor; const YYCTYPE *marker = NULL; YYCTYPE yych; @@ -153,12 +164,14 @@ int lex_line26() } yy2: YYSKIP (); - status = action_line26(i, keys, input, token, &cursor, 2); + status = check_key_count_line26(keys_count, i, 3) + || action_line26(&i, keys, input, token, &cursor, 2); continue; yy4: YYSKIP (); yy5: - status = action_line26(i, keys, input, token, &cursor, 1); + status = check_key_count_line26(keys_count, i, 3) + || action_line26(&i, keys, input, token, &cursor, 1); continue; yy6: YYSKIP (); @@ -507,7 +520,8 @@ yy50: } yy51: YYSKIP (); - status = action_line26(i, keys, input, token, &cursor, 0); + status = check_key_count_line26(keys_count, i, 3) + || action_line26(&i, keys, input, token, &cursor, 0); continue; } @@ -519,7 +533,7 @@ yy51: } if (i != keys_count) { status = 1; - fprintf(stderr, "error: lex_line26: unused keys left after %u iterations\n", i); + fprintf(stderr, "error: lex_line26: unused keys left after %u keys\n", i); } } @@ -538,7 +552,6 @@ end: #undef YYRESTORE #undef YYLESSTHAN #undef YYFILL -#define YYMAXFILL 45 int main() { diff --git a/test/bug1163046.c b/test/bug1163046.c index 7794fc9..4ae1138 100644 --- a/test/bug1163046.c +++ b/test/bug1163046.c @@ -358,6 +358,7 @@ yy51: #define YYMAXFILL 45 + int main(int,void**) { int res, result = 0; diff --git a/test/bug128.c b/test/bug128.c index f4b5b8e..c01ae39 100644 --- a/test/bug128.c +++ b/test/bug128.c @@ -21,8 +21,8 @@ yy3: {} #line 23 "bug128.c" yy4: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 'a': goto yy7; case 'c': goto yy8; default: goto yy5; @@ -959,7 +959,6 @@ yy138: } yy139: ++YYCURSOR; - yych = *YYCURSOR; goto yy5; } #line 7 "bug128.re" diff --git a/test/bug1297658.c b/test/bug1297658.c index 73fc417..3fbbbab 100644 --- a/test/bug1297658.c +++ b/test/bug1297658.c @@ -86,8 +86,8 @@ yy4: } #line 88 "bug1297658.c" yy6: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 'L': goto yy9; case 'e': goto yy10; default: goto yy7; @@ -106,7 +106,7 @@ yy8: default: goto yy3; } yy9: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy7; yy10: yych = *++YYCURSOR; diff --git a/test/bug142.c b/test/bug142.c new file mode 100644 index 0000000000000000000000000000000000000000..2a481bfadb731ed6431d8e44b6fb6bbba8320e5f GIT binary patch literal 46 zcmdPbQgBbrOD#$)Nlj5ms#GXSHA+^{(&tjn$;?YtFjP=VDor;uG14naRpL@(002O0 B44nV~ literal 0 HcmV?d00001 diff --git a/test/bug142.re b/test/bug142.re new file mode 100644 index 0000000000000000000000000000000000000000..fc045ebaa02d993aef95bda19db7d966c9fad52d GIT binary patch literal 2 JcmY#m0000^04D$d literal 0 HcmV?d00001 diff --git a/test/bug145.ci.c b/test/bug145.ci.c new file mode 100644 index 0000000..d4c5fd3 --- /dev/null +++ b/test/bug145.ci.c @@ -0,0 +1,59 @@ +/* Generated by re2c */ +#include + +enum YYCONDTYPE { + yycinit, + yycC2, +}; + + +int test(const char* str) +{ + const unsigned char* YYCURSOR = (const unsigned char*)str; + const unsigned char* YYMARKER; + const unsigned char *YYCTXMARKER; + int c = yycinit; + + +{ + unsigned char yych; + switch (c) { + case yycinit: goto yyc_init; + case yycC2: goto yyc_C2; + } +/* *********************************** */ +yyc_init: + yych = *YYCURSOR; + switch (yych) { + case 'A': goto yy5; + default: goto yy3; + } +yy3: + ++YYCURSOR; + { return 0; } +yy5: + ++YYCURSOR; + c = yycC2; + goto yyc_C2; +/* *********************************** */ +yyc_C2: + yych = *YYCURSOR; + switch (yych) { + case 'B': goto yy11; + default: goto yy9; + } +yy9: + ++YYCURSOR; + { return 0; } +yy11: + ++YYCURSOR; + { return 1; } +} + +} + +int main() +{ + printf("%d\n", test("AB")); + return 0; +} diff --git a/test/bug145.ci.re b/test/bug145.ci.re new file mode 100644 index 0000000..9cf0793 --- /dev/null +++ b/test/bug145.ci.re @@ -0,0 +1,32 @@ +#include + +/*!types:re2c*/ + +int test(const char* str) +{ + const unsigned char* YYCURSOR = (const unsigned char*)str; + const unsigned char* YYMARKER; + const unsigned char *YYCTXMARKER; + int c = yycinit; + + /*!re2c + re2c:define:YYCTYPE = "unsigned char"; + re2c:yyfill:enable = 0; + re2c:define:YYGETCONDITION = "c"; + re2c:define:YYGETCONDITION:naked = 1; + re2c:define:YYSETCONDITION = "c = @@;"; + re2c:define:YYSETCONDITION:naked = 1; + + //<*>* { return 0; } + * { return 0; } + "A" :=> C2 + * { return 0; } + "B" { return 1; } + */ +} + +int main() +{ + printf("%d\n", test("AB")); + return 0; +} diff --git a/test/bug147.c b/test/bug147.c new file mode 100644 index 0000000..066cd7d --- /dev/null +++ b/test/bug147.c @@ -0,0 +1 @@ +re2c: error: line 2: undefined symbol 'name1' diff --git a/test/bug147.re b/test/bug147.re new file mode 100644 index 0000000..5d9eff3 --- /dev/null +++ b/test/bug147.re @@ -0,0 +1,3 @@ +/*!re2c + name1 {} +*/ diff --git a/test/bug152.c.c b/test/bug152.c.c new file mode 100644 index 0000000..d106d33 --- /dev/null +++ b/test/bug152.c.c @@ -0,0 +1,15 @@ +/* Generated by re2c */ +#line 1 "bug152.c.re" +#line 4 "bug152.c.c" +enum YYCONDTYPE { +}; +#line 1 "bug152.c.re" + + +#warning this is line 3 + +void f() +{ +#line 9 "bug152.c.re" + +} diff --git a/test/bug152.c.re b/test/bug152.c.re new file mode 100644 index 0000000..7d235b2 --- /dev/null +++ b/test/bug152.c.re @@ -0,0 +1,10 @@ +/*!types:re2c*/ + +#warning this is line 3 + +void f() +{ +/*!re2c + <*> * {} +*/ +} diff --git a/test/bug1529351.c b/test/bug1529351.c index 1a61908..efbd10e 100644 --- a/test/bug1529351.c +++ b/test/bug1529351.c @@ -1 +1 @@ -re2c: error: line 3, column 9: missing '}' +re2c: error: line 5: missing '}' diff --git a/test/bug1682718.c b/test/bug1682718.c index 4ff1b74..85a3788 100644 --- a/test/bug1682718.c +++ b/test/bug1682718.c @@ -26,8 +26,7 @@ yy2: {return (char*)0;} #line 28 "bug1682718.c" yy4: - ++p; - yych = (unsigned char)*p; + yych = (unsigned char)*++p; switch (yych) { case '0': case '1': @@ -44,7 +43,7 @@ yy4: yy6: #line 9 "bug1682718.re" {return p;} -#line 48 "bug1682718.c" +#line 47 "bug1682718.c" } #line 11 "bug1682718.re" diff --git a/test/bug1682718.is.c b/test/bug1682718.is.c index 1f56620..3b3bc66 100644 --- a/test/bug1682718.is.c +++ b/test/bug1682718.is.c @@ -11,8 +11,7 @@ yy2: ++p; {return (char*)0;} yy4: - ++p; - yych = (unsigned char)*p; + yych = (unsigned char)*++p; if (yych <= '/') goto yy6; if (yych <= '9') goto yy4; yy6: diff --git a/test/bug1708378.ib.c b/test/bug1708378.ib.c index 6ac1efe..784d936 100644 --- a/test/bug1708378.ib.c +++ b/test/bug1708378.ib.c @@ -3904,8 +3904,8 @@ yy891: yy892: {RET("__APPROVALFVGT");} yy893: - ++YYCURSOR; - if ((yych = *YYCURSOR) == ' ') goto yy1056; + yych = *++YYCURSOR; + if (yych == ' ') goto yy1056; {RET("TVD_APPROVED");} yy895: yych = *++YYCURSOR; diff --git a/test/bug2462777.ci.c b/test/bug2462777.ci.c index 77c241d..345fcb7 100644 --- a/test/bug2462777.ci.c +++ b/test/bug2462777.ci.c @@ -21,4 +21,4 @@ yy4: {x;} } -re2c: warning: line 2: rule matches empty string [-Wmatch-empty-string] +re2c: warning: line 2: rule in condition 'X' matches empty string [-Wmatch-empty-string] diff --git a/test/bug46_infinite_loop.c b/test/bug46_infinite_loop.c index b35fa12..1e34d09 100644 --- a/test/bug46_infinite_loop.c +++ b/test/bug46_infinite_loop.c @@ -43,7 +43,6 @@ yy6: #line 44 "bug46_infinite_loop.c" yy7: ++YYCURSOR; - yych = *YYCURSOR; goto yy6; } #line 19 "bug46_infinite_loop.re" diff --git a/test/bug47_dot_escapes.--emit-dot.c b/test/bug47_dot_escapes.--emit-dot.c index ed16996..7413239 100644 --- a/test/bug47_dot_escapes.--emit-dot.c +++ b/test/bug47_dot_escapes.--emit-dot.c @@ -1,7 +1,5 @@ /* Generated by re2c */ - digraph re2c { - 1 -> 2 [label="[0x00-0x06][0x0E-!][#-&][(-[][0x5D-0xFF]"] 1 -> 3 [label="[0x07]"] 1 -> 5 [label="[0x08]"] diff --git a/test/bug57.c b/test/bug57.c index 5cc723e..2927b16 100644 --- a/test/bug57.c +++ b/test/bug57.c @@ -49,8 +49,7 @@ yy6: } yy7: yyaccept = 1; - YYMARKER = ++YYCURSOR; - yych = *YYCURSOR; + yych = *(YYMARKER = ++YYCURSOR); switch (yych) { case '\\': goto yy15; case 'a': goto yy7; @@ -60,10 +59,9 @@ yy9: ++YYCURSOR; #line 14 "bug57.re" { return YYCURSOR - p; } -#line 64 "bug57.c" +#line 63 "bug57.c" yy11: - ++YYCURSOR; - yych = *YYCURSOR; + yych = *++YYCURSOR; switch (yych) { case 'b': goto yy13; default: goto yy12; @@ -76,8 +74,7 @@ yy12: goto yy2; } yy13: - ++YYCURSOR; - yych = *YYCURSOR; + yych = *++YYCURSOR; switch (yych) { case '>': goto yy9; case '\\': goto yy11; @@ -86,8 +83,7 @@ yy13: default: goto yy12; } yy15: - ++YYCURSOR; - yych = *YYCURSOR; + yych = *++YYCURSOR; switch (yych) { case 'b': goto yy7; default: goto yy12; diff --git a/test/bug57_original.bi--case-insensitive.c b/test/bug57_original.bi--case-insensitive.c index a0bf5cf..fdaa7c6 100644 --- a/test/bug57_original.bi--case-insensitive.c +++ b/test/bug57_original.bi--case-insensitive.c @@ -120,7 +120,7 @@ int _scan_autolink_uri(const unsigned char *p) yy2: { return 0; } yy3: - yych = *++p; + ++p; goto yy2; yy4: yych = *(marker = ++p); @@ -1304,8 +1304,7 @@ yy124: if (yych == 'a') goto yy191; goto yy31; yy125: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 128) { goto yy125; } @@ -2438,8 +2437,8 @@ yy345: if (yych == 'D') goto yy346; if (yych != 'd') goto yy31; yy346: - ++p; - if ((yych = *p) == 'E') goto yy137; + yych = *++p; + if (yych == 'E') goto yy137; if (yych == 'e') goto yy137; goto yy31; } @@ -2527,7 +2526,7 @@ int _scan_autolink_email(const unsigned char *p) yy349: { return 0; } yy350: - yych = *++p; + ++p; goto yy349; yy351: yych = *(marker = ++p); @@ -2554,8 +2553,7 @@ yy351: } } yy352: - ++p; - yych = *p; + yych = *++p; yy353: if (yybm[0+yych] & 128) { goto yy352; @@ -2566,8 +2564,7 @@ yy354: p = marker; goto yy349; yy355: - ++p; - yych = *p; + yych = *++p; if (yych <= '@') { if (yych <= '/') goto yy354; if (yych >= ':') goto yy354; @@ -2577,8 +2574,7 @@ yy355: if (yych >= '{') goto yy354; } yy356: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -2599,8 +2595,7 @@ yy356: goto yy354; } } - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy361; if (yych <= '/') goto yy354; @@ -2616,8 +2611,7 @@ yy356: } } yy358: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -2643,8 +2637,7 @@ yy359: ++p; { return (p - start); } yy361: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy363; if (yych <= '/') goto yy354; @@ -2660,8 +2653,7 @@ yy361: } } yy362: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -2683,8 +2675,7 @@ yy362: } } yy363: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy365; if (yych <= '/') goto yy354; @@ -2700,8 +2691,7 @@ yy363: } } yy364: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -2723,8 +2713,7 @@ yy364: } } yy365: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy367; if (yych <= '/') goto yy354; @@ -2740,8 +2729,7 @@ yy365: } } yy366: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -2763,8 +2751,7 @@ yy366: } } yy367: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy369; if (yych <= '/') goto yy354; @@ -2780,8 +2767,7 @@ yy367: } } yy368: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -2803,8 +2789,7 @@ yy368: } } yy369: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy371; if (yych <= '/') goto yy354; @@ -2820,8 +2805,7 @@ yy369: } } yy370: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -2843,8 +2827,7 @@ yy370: } } yy371: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy373; if (yych <= '/') goto yy354; @@ -2860,8 +2843,7 @@ yy371: } } yy372: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -2883,8 +2865,7 @@ yy372: } } yy373: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy375; if (yych <= '/') goto yy354; @@ -2900,8 +2881,7 @@ yy373: } } yy374: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -2923,8 +2903,7 @@ yy374: } } yy375: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy377; if (yych <= '/') goto yy354; @@ -2940,8 +2919,7 @@ yy375: } } yy376: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -2963,8 +2941,7 @@ yy376: } } yy377: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy379; if (yych <= '/') goto yy354; @@ -2980,8 +2957,7 @@ yy377: } } yy378: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3003,8 +2979,7 @@ yy378: } } yy379: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy381; if (yych <= '/') goto yy354; @@ -3020,8 +2995,7 @@ yy379: } } yy380: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3043,8 +3017,7 @@ yy380: } } yy381: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy383; if (yych <= '/') goto yy354; @@ -3060,8 +3033,7 @@ yy381: } } yy382: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3083,8 +3055,7 @@ yy382: } } yy383: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy385; if (yych <= '/') goto yy354; @@ -3100,8 +3071,7 @@ yy383: } } yy384: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3123,8 +3093,7 @@ yy384: } } yy385: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy387; if (yych <= '/') goto yy354; @@ -3140,8 +3109,7 @@ yy385: } } yy386: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3163,8 +3131,7 @@ yy386: } } yy387: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy389; if (yych <= '/') goto yy354; @@ -3180,8 +3147,7 @@ yy387: } } yy388: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3203,8 +3169,7 @@ yy388: } } yy389: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy391; if (yych <= '/') goto yy354; @@ -3220,8 +3185,7 @@ yy389: } } yy390: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3243,8 +3207,7 @@ yy390: } } yy391: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy393; if (yych <= '/') goto yy354; @@ -3260,8 +3223,7 @@ yy391: } } yy392: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3283,8 +3245,7 @@ yy392: } } yy393: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy395; if (yych <= '/') goto yy354; @@ -3300,8 +3261,7 @@ yy393: } } yy394: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3323,8 +3283,7 @@ yy394: } } yy395: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy397; if (yych <= '/') goto yy354; @@ -3340,8 +3299,7 @@ yy395: } } yy396: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3363,8 +3321,7 @@ yy396: } } yy397: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy399; if (yych <= '/') goto yy354; @@ -3380,8 +3337,7 @@ yy397: } } yy398: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3403,8 +3359,7 @@ yy398: } } yy399: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy401; if (yych <= '/') goto yy354; @@ -3420,8 +3375,7 @@ yy399: } } yy400: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3443,8 +3397,7 @@ yy400: } } yy401: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy403; if (yych <= '/') goto yy354; @@ -3460,8 +3413,7 @@ yy401: } } yy402: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3483,8 +3435,7 @@ yy402: } } yy403: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy405; if (yych <= '/') goto yy354; @@ -3500,8 +3451,7 @@ yy403: } } yy404: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3523,8 +3473,7 @@ yy404: } } yy405: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy407; if (yych <= '/') goto yy354; @@ -3540,8 +3489,7 @@ yy405: } } yy406: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3563,8 +3511,7 @@ yy406: } } yy407: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy409; if (yych <= '/') goto yy354; @@ -3580,8 +3527,7 @@ yy407: } } yy408: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3603,8 +3549,7 @@ yy408: } } yy409: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy411; if (yych <= '/') goto yy354; @@ -3620,8 +3565,7 @@ yy409: } } yy410: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3643,8 +3587,7 @@ yy410: } } yy411: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy413; if (yych <= '/') goto yy354; @@ -3660,8 +3603,7 @@ yy411: } } yy412: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3683,8 +3625,7 @@ yy412: } } yy413: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy415; if (yych <= '/') goto yy354; @@ -3700,8 +3641,7 @@ yy413: } } yy414: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3723,8 +3663,7 @@ yy414: } } yy415: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy417; if (yych <= '/') goto yy354; @@ -3740,8 +3679,7 @@ yy415: } } yy416: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3763,8 +3701,7 @@ yy416: } } yy417: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy419; if (yych <= '/') goto yy354; @@ -3780,8 +3717,7 @@ yy417: } } yy418: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3803,8 +3739,7 @@ yy418: } } yy419: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy421; if (yych <= '/') goto yy354; @@ -3820,8 +3755,7 @@ yy419: } } yy420: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3843,8 +3777,7 @@ yy420: } } yy421: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy423; if (yych <= '/') goto yy354; @@ -3860,8 +3793,7 @@ yy421: } } yy422: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3883,8 +3815,7 @@ yy422: } } yy423: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy425; if (yych <= '/') goto yy354; @@ -3900,8 +3831,7 @@ yy423: } } yy424: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3923,8 +3853,7 @@ yy424: } } yy425: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy427; if (yych <= '/') goto yy354; @@ -3940,8 +3869,7 @@ yy425: } } yy426: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -3963,8 +3891,7 @@ yy426: } } yy427: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy429; if (yych <= '/') goto yy354; @@ -3980,8 +3907,7 @@ yy427: } } yy428: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4003,8 +3929,7 @@ yy428: } } yy429: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy431; if (yych <= '/') goto yy354; @@ -4020,8 +3945,7 @@ yy429: } } yy430: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4043,8 +3967,7 @@ yy430: } } yy431: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy433; if (yych <= '/') goto yy354; @@ -4060,8 +3983,7 @@ yy431: } } yy432: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4083,8 +4005,7 @@ yy432: } } yy433: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy435; if (yych <= '/') goto yy354; @@ -4100,8 +4021,7 @@ yy433: } } yy434: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4123,8 +4043,7 @@ yy434: } } yy435: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy437; if (yych <= '/') goto yy354; @@ -4140,8 +4059,7 @@ yy435: } } yy436: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4163,8 +4081,7 @@ yy436: } } yy437: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy439; if (yych <= '/') goto yy354; @@ -4180,8 +4097,7 @@ yy437: } } yy438: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4203,8 +4119,7 @@ yy438: } } yy439: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy441; if (yych <= '/') goto yy354; @@ -4220,8 +4135,7 @@ yy439: } } yy440: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4243,8 +4157,7 @@ yy440: } } yy441: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy443; if (yych <= '/') goto yy354; @@ -4260,8 +4173,7 @@ yy441: } } yy442: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4283,8 +4195,7 @@ yy442: } } yy443: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy445; if (yych <= '/') goto yy354; @@ -4300,8 +4211,7 @@ yy443: } } yy444: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4323,8 +4233,7 @@ yy444: } } yy445: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy447; if (yych <= '/') goto yy354; @@ -4340,8 +4249,7 @@ yy445: } } yy446: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4363,8 +4271,7 @@ yy446: } } yy447: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy449; if (yych <= '/') goto yy354; @@ -4380,8 +4287,7 @@ yy447: } } yy448: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4403,8 +4309,7 @@ yy448: } } yy449: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy451; if (yych <= '/') goto yy354; @@ -4420,8 +4325,7 @@ yy449: } } yy450: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4443,8 +4347,7 @@ yy450: } } yy451: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy453; if (yych <= '/') goto yy354; @@ -4460,8 +4363,7 @@ yy451: } } yy452: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4483,8 +4385,7 @@ yy452: } } yy453: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy455; if (yych <= '/') goto yy354; @@ -4500,8 +4401,7 @@ yy453: } } yy454: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4523,8 +4423,7 @@ yy454: } } yy455: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy457; if (yych <= '/') goto yy354; @@ -4540,8 +4439,7 @@ yy455: } } yy456: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4563,8 +4461,7 @@ yy456: } } yy457: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy459; if (yych <= '/') goto yy354; @@ -4580,8 +4477,7 @@ yy457: } } yy458: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4603,8 +4499,7 @@ yy458: } } yy459: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy461; if (yych <= '/') goto yy354; @@ -4620,8 +4515,7 @@ yy459: } } yy460: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4643,8 +4537,7 @@ yy460: } } yy461: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy463; if (yych <= '/') goto yy354; @@ -4660,8 +4553,7 @@ yy461: } } yy462: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4683,8 +4575,7 @@ yy462: } } yy463: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy465; if (yych <= '/') goto yy354; @@ -4700,8 +4591,7 @@ yy463: } } yy464: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4723,8 +4613,7 @@ yy464: } } yy465: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy467; if (yych <= '/') goto yy354; @@ -4740,8 +4629,7 @@ yy465: } } yy466: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4763,8 +4651,7 @@ yy466: } } yy467: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy469; if (yych <= '/') goto yy354; @@ -4780,8 +4667,7 @@ yy467: } } yy468: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4803,8 +4689,7 @@ yy468: } } yy469: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy471; if (yych <= '/') goto yy354; @@ -4820,8 +4705,7 @@ yy469: } } yy470: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4843,8 +4727,7 @@ yy470: } } yy471: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy473; if (yych <= '/') goto yy354; @@ -4860,8 +4743,7 @@ yy471: } } yy472: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4883,8 +4765,7 @@ yy472: } } yy473: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy475; if (yych <= '/') goto yy354; @@ -4900,8 +4781,7 @@ yy473: } } yy474: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4923,8 +4803,7 @@ yy474: } } yy475: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy477; if (yych <= '/') goto yy354; @@ -4940,8 +4819,7 @@ yy475: } } yy476: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -4963,8 +4841,7 @@ yy476: } } yy477: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych == '-') goto yy479; if (yych <= '/') goto yy354; @@ -4980,8 +4857,7 @@ yy477: } } yy478: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= ',') goto yy354; @@ -5003,8 +4879,7 @@ yy478: } } yy479: - ++p; - yych = *p; + yych = *++p; if (yych <= '@') { if (yych <= '/') goto yy354; if (yych <= '9') goto yy481; @@ -5016,8 +4891,7 @@ yy479: goto yy354; } yy480: - ++p; - yych = *p; + yych = *++p; if (yych <= '=') { if (yych <= '.') { if (yych <= '-') goto yy354; @@ -5036,8 +4910,7 @@ yy480: } } yy481: - ++p; - yych = *p; + yych = *++p; if (yych == '.') goto yy355; if (yych == '>') goto yy359; goto yy354; @@ -5144,7 +5017,7 @@ int _scan_html_tag(const unsigned char *p) yy484: { return 0; } yy485: - yych = *++p; + ++p; goto yy484; yy486: yych = *(marker = ++p); @@ -5168,25 +5041,24 @@ yy488: goto yy498; yy489: yych = *(marker = ++p); - if (yybm[0+yych] & 1) { - goto yy500; - } - if (yych <= '>') { - if (yych <= '/') { - if (yych <= '.') goto yy484; - goto yy502; + if (yych <= '9') { + if (yych <= 0x1F) { + if (yych <= 0x08) goto yy484; + if (yych <= '\r') goto yy504; + goto yy484; } else { - if (yych <= '9') goto yy503; - if (yych <= '=') goto yy484; - goto yy505; + if (yych <= ' ') goto yy504; + if (yych <= '.') goto yy484; + goto yy504; } } else { - if (yych <= 'Z') { - if (yych <= '@') goto yy484; - goto yy503; + if (yych <= '@') { + if (yych == '>') goto yy504; + goto yy484; } else { + if (yych <= 'Z') goto yy504; if (yych <= '`') goto yy484; - if (yych <= 'z') goto yy503; + if (yych <= 'z') goto yy504; goto yy484; } } @@ -5197,8 +5069,7 @@ yy491: p = marker; goto yy484; yy492: - ++p; - yych = *p; + yych = *++p; if (yybm[256+yych] & 32) { goto yy492; } @@ -5212,8 +5083,7 @@ yy494: if (yych == 'c') goto yy510; goto yy491; yy495: - ++p; - yych = *p; + yych = *++p; if (yybm[256+yych] & 64) { goto yy495; } @@ -5227,21 +5097,18 @@ yy495: goto yy491; } yy497: - ++p; - yych = *p; + yych = *++p; yy498: if (yybm[256+yych] & 128) { goto yy497; } if (yych <= 0x00) goto yy491; - ++p; - yych = *p; + yych = *++p; if (yych <= 0x00) goto yy491; if (yych == '>') goto yy505; goto yy497; yy500: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 1) { goto yy500; } @@ -5269,8 +5136,8 @@ yy502: if (yych == '>') goto yy505; goto yy491; yy503: - ++p; - yych = *p; + yych = *++p; +yy504: if (yybm[0+yych] & 1) { goto yy500; } @@ -5301,8 +5168,7 @@ yy507: if (yych == '>') goto yy491; goto yy516; yy508: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 2) { goto yy508; } @@ -5314,8 +5180,7 @@ yy510: if (yych == 'd') goto yy518; goto yy491; yy511: - ++p; - yych = *p; + yych = *++p; if (yych <= 0x1F) { if (yych <= 0x08) goto yy491; if (yych <= '\r') goto yy511; @@ -5326,8 +5191,7 @@ yy511: goto yy491; } yy513: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 4) { goto yy513; } @@ -5350,8 +5214,7 @@ yy513: } } yy515: - ++p; - yych = *p; + yych = *++p; yy516: if (yybm[0+yych] & 8) { goto yy515; @@ -5369,8 +5232,7 @@ yy518: if (yych == 'a') goto yy523; goto yy491; yy519: - ++p; - yych = *p; + yych = *++p; if (yych <= '<') { if (yych <= ' ') { if (yych <= 0x08) goto yy491; @@ -5404,8 +5266,7 @@ yy519: } } yy521: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 16) { goto yy524; } @@ -5415,8 +5276,7 @@ yy521: if (yych <= '\'') goto yy529; goto yy491; yy522: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 8) { goto yy515; } @@ -5428,8 +5288,7 @@ yy523: if (yych == 't') goto yy531; goto yy491; yy524: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 16) { goto yy524; } @@ -5438,8 +5297,7 @@ yy524: if (yych == '>') goto yy505; goto yy491; yy526: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 16) { goto yy524; } @@ -5452,16 +5310,14 @@ yy526: goto yy491; } yy527: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 32) { goto yy527; } if (yych <= 0x00) goto yy491; goto yy536; yy529: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 64) { goto yy529; } @@ -5473,8 +5329,7 @@ yy531: if (yych == 'a') goto yy537; goto yy491; yy532: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych <= ' ') { if (yych <= 0x08) { @@ -5517,8 +5372,7 @@ yy532: } } yy534: - ++p; - yych = *p; + yych = *++p; if (yych <= '9') { if (yych <= ' ') { if (yych <= 0x08) { @@ -5561,8 +5415,7 @@ yy534: } } yy536: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 1) { goto yy500; } @@ -5574,8 +5427,7 @@ yy537: if (yych == '[') goto yy540; goto yy491; yy538: - ++p; - yych = *p; + yych = *++p; if (yych <= '/') { if (yych <= '!') { if (yych <= '\r') { @@ -5621,16 +5473,14 @@ yy538: } } yy540: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 128) { goto yy540; } if (yych <= 0x00) goto yy491; goto yy544; yy542: - ++p; - yych = *p; + yych = *++p; if (yych <= ':') { if (yych <= ' ') { if (yych <= 0x08) { @@ -5674,14 +5524,12 @@ yy542: } } yy544: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 128) { goto yy540; } if (yych <= 0x00) goto yy491; - ++p; - yych = *p; + yych = *++p; if (yych <= 0x00) goto yy491; if (yych == '>') goto yy505; goto yy540; @@ -5705,7 +5553,7 @@ int _scan_html_block_tag(const unsigned char *p) yy548: { return 0; } yy549: - yych = *++p; + ++p; goto yy548; yy550: yych = *(marker = ++p); @@ -7303,8 +7151,8 @@ yy765: if (yych == 't') goto yy698; goto yy554; yy766: - ++p; - if ((yych = *p) == 'T') goto yy718; + yych = *++p; + if (yych == 'T') goto yy718; if (yych == 't') goto yy718; goto yy554; } @@ -7359,13 +7207,12 @@ int _scan_link_url(const unsigned char *p) }; yych = *p; if (yybm[0+yych] & 8) { - goto yy772; + goto yy771; } if (yych <= ')') { - if (yych <= 0x1F) goto yy770; + if (yych <= 0x1F) goto yy769; if (yych <= '\'') goto yy774; if (yych <= '(') goto yy776; - goto yy770; } else { if (yych <= '<') { if (yych <= ';') goto yy774; @@ -7376,58 +7223,56 @@ int _scan_link_url(const unsigned char *p) } } yy769: - { return (p - start); } -yy770: ++p; -yy771: +yy770: { return 0; } -yy772: +yy771: yyaccept = 0; - marker = ++p; - yych = *p; + yych = *(marker = ++p); if (yybm[0+yych] & 8) { - goto yy772; + goto yy771; } if (yych <= ')') { - if (yych <= 0x1F) goto yy769; + if (yych <= 0x1F) goto yy773; if (yych <= '\'') goto yy774; if (yych <= '(') goto yy780; - goto yy769; } else { if (yych <= '<') { - if (yych >= '<') goto yy777; + if (yych <= ';') goto yy774; + goto yy777; } else { if (yych == '\\') goto yy783; + goto yy774; } } +yy773: + { return (p - start); } yy774: yyaccept = 0; - marker = ++p; - yych = *p; + yych = *(marker = ++p); yy775: if (yybm[0+yych] & 16) { goto yy774; } - if (yych <= ' ') goto yy769; + if (yych <= ' ') goto yy773; if (yych <= '(') goto yy780; - if (yych <= ')') goto yy769; + if (yych <= ')') goto yy773; goto yy783; yy776: yyaccept = 1; yych = *(marker = ++p); - if (yych <= ' ') goto yy771; - if (yych == '(') goto yy771; + if (yych <= ' ') goto yy770; + if (yych == '(') goto yy770; goto yy781; yy777: yyaccept = 0; - marker = ++p; - yych = *p; + yych = *(marker = ++p); if (yybm[0+yych] & 32) { goto yy777; } if (yych <= ' ') { - if (yych <= 0x00) goto yy769; - if (yych == '\n') goto yy769; + if (yych <= 0x00) goto yy773; + if (yych == '\n') goto yy773; goto yy785; } else { if (yych <= ')') { @@ -7442,23 +7287,22 @@ yy777: yy779: yych = *++p; if (yych <= '@') { - if (yych <= ' ') goto yy771; + if (yych <= ' ') goto yy770; if (yych <= '/') goto yy774; - if (yych <= '9') goto yy771; + if (yych <= '9') goto yy770; goto yy774; } else { if (yych <= '`') { - if (yych <= 'Z') goto yy771; + if (yych <= 'Z') goto yy770; goto yy774; } else { - if (yych <= 'z') goto yy771; + if (yych <= 'z') goto yy770; if (yych <= '~') goto yy774; - goto yy771; + goto yy770; } } yy780: - ++p; - yych = *p; + yych = *++p; yy781: if (yych <= '(') { if (yych <= ' ') goto yy782; @@ -7472,16 +7316,15 @@ yy782: p = marker; if (yyaccept <= 1) { if (yyaccept == 0) { - goto yy769; + goto yy773; } else { - goto yy771; + goto yy770; } } else { goto yy790; } yy783: - ++p; - yych = *p; + yych = *++p; if (yych <= '@') { if (yych <= ' ') goto yy782; if (yych <= '/') goto yy774; @@ -7498,8 +7341,7 @@ yy783: } } yy784: - ++p; - yych = *p; + yych = *++p; if (yych <= '@') { if (yych <= ' ') goto yy782; if (yych <= '/') goto yy780; @@ -7516,8 +7358,7 @@ yy784: } } yy785: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 64) { goto yy785; } @@ -7525,8 +7366,7 @@ yy785: if (yych <= '>') goto yy792; goto yy793; yy787: - ++p; - yych = *p; + yych = *++p; if (yych <= ')') { if (yych <= '\n') { if (yych <= 0x00) goto yy782; @@ -7556,8 +7396,7 @@ yy789: yy790: { return (p - start); } yy791: - ++p; - yych = *p; + yych = *++p; if (yych <= '>') { if (yych <= ' ') { if (yych <= 0x00) goto yy782; @@ -7583,11 +7422,10 @@ yy791: } } yy792: - yych = *++p; + ++p; goto yy790; yy793: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 128) { goto yy793; } @@ -7606,8 +7444,7 @@ yy795: if (yych == '(') goto yy790; goto yy781; yy796: - ++p; - yych = *p; + yych = *++p; if (yych <= '>') { if (yych <= ' ') { if (yych <= 0x00) goto yy782; @@ -7634,8 +7471,7 @@ yy796: } yy797: yyaccept = 2; - marker = ++p; - yych = *p; + yych = *(marker = ++p); if (yybm[0+yych] & 32) { goto yy777; } @@ -7655,13 +7491,12 @@ yy797: } yy798: yyaccept = 0; - marker = ++p; - yych = *p; + yych = *(marker = ++p); if (yych <= '(') { if (yych <= '\n') { - if (yych <= 0x00) goto yy769; + if (yych <= 0x00) goto yy773; if (yych <= '\t') goto yy785; - goto yy769; + goto yy773; } else { if (yych <= ' ') goto yy785; if (yych <= '\'') goto yy777; @@ -7679,8 +7514,7 @@ yy798: } yy799: yyaccept = 2; - marker = ++p; - yych = *p; + yych = *(marker = ++p); if (yybm[0+yych] & 64) { goto yy785; } @@ -7689,8 +7523,7 @@ yy799: goto yy793; yy800: yyaccept = 2; - marker = ++p; - yych = *p; + yych = *(marker = ++p); if (yych <= ')') { if (yych <= '\n') { if (yych <= 0x00) goto yy790; @@ -7713,8 +7546,7 @@ yy800: } } yy801: - ++p; - yych = *p; + yych = *++p; if (yych <= '(') { if (yych <= '\n') { if (yych <= 0x00) goto yy782; @@ -7798,7 +7630,7 @@ int _scan_link_title(const unsigned char *p) yy804: { return 0; } yy805: - yych = *++p; + ++p; goto yy804; yy806: yyaccept = 0; @@ -7816,8 +7648,7 @@ yy808: if (yych <= 0x00) goto yy804; goto yy823; yy809: - ++p; - yych = *p; + yych = *++p; yy810: if (yybm[0+yych] & 16) { goto yy809; @@ -7845,8 +7676,7 @@ yy812: yy813: { return (p - start); } yy814: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 16) { goto yy809; } @@ -7854,8 +7684,7 @@ yy814: if (yych <= '"') goto yy828; goto yy814; yy816: - ++p; - yych = *p; + yych = *++p; yy817: if (yybm[0+yych] & 64) { goto yy816; @@ -7867,8 +7696,7 @@ yy818: yy819: { return (p - start); } yy820: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 64) { goto yy816; } @@ -7876,8 +7704,7 @@ yy820: if (yych <= '\'') goto yy829; goto yy820; yy822: - ++p; - yych = *p; + yych = *++p; yy823: if (yybm[0+yych] & 128) { goto yy822; @@ -7889,8 +7716,7 @@ yy824: yy825: { return (p - start); } yy826: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 128) { goto yy822; } @@ -7899,8 +7725,7 @@ yy826: goto yy826; yy828: yyaccept = 1; - marker = ++p; - yych = *p; + yych = *(marker = ++p); if (yybm[0+yych] & 16) { goto yy809; } @@ -7909,8 +7734,7 @@ yy828: goto yy814; yy829: yyaccept = 2; - marker = ++p; - yych = *p; + yych = *(marker = ++p); if (yybm[0+yych] & 64) { goto yy816; } @@ -7919,8 +7743,7 @@ yy829: goto yy820; yy830: yyaccept = 3; - marker = ++p; - yych = *p; + yych = *(marker = ++p); if (yybm[0+yych] & 128) { goto yy822; } @@ -7974,21 +7797,16 @@ int _scan_spacechars(const unsigned char *p) }; yych = *p; if (yybm[0+yych] & 128) { - goto yy836; + goto yy835; } - goto yy834; -yy833: - { return (p - start); } -yy834: ++p; { return 0; } -yy836: - ++p; - yych = *p; +yy835: + yych = *++p; if (yybm[0+yych] & 128) { - goto yy836; + goto yy835; } - goto yy833; + { return (p - start); } } } @@ -8042,7 +7860,7 @@ int _scan_atx_header_start(const unsigned char *p) yy840: { return 0; } yy841: - yych = *++p; + ++p; goto yy840; yy842: yych = *(marker = ++p); @@ -8057,8 +7875,7 @@ yy843: yy844: { return (p - start); } yy845: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 128) { goto yy845; } @@ -8092,8 +7909,8 @@ yy849: } if (yych == '\n') goto yy843; if (yych != '#') goto yy848; - ++p; - if (yybm[0+(yych = *p)] & 128) { + yych = *++p; + if (yybm[0+yych] & 128) { goto yy845; } if (yych == '\n') goto yy843; @@ -8155,7 +7972,7 @@ int _scan_setext_header_line(const unsigned char *p) yy855: { return 0; } yy856: - yych = *++p; + ++p; goto yy855; yy857: yych = *(marker = ++p); @@ -8177,8 +7994,7 @@ yy859: ++p; { return 2; } yy861: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 32) { goto yy861; } @@ -8187,8 +8003,7 @@ yy863: p = marker; goto yy855; yy864: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 32) { goto yy861; } @@ -8199,14 +8014,12 @@ yy866: ++p; { return 1; } yy868: - ++p; - yych = *p; + yych = *++p; if (yych == '\n') goto yy866; if (yych == ' ') goto yy868; goto yy863; yy870: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 128) { goto yy870; } @@ -8278,7 +8091,7 @@ int _scan_hrule(const unsigned char *p) yy874: { return 0; } yy875: - yych = *++p; + ++p; goto yy874; yy876: yych = *(marker = ++p); @@ -8298,8 +8111,7 @@ yy878: if (yych == '_') goto yy890; goto yy874; yy879: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 8) { goto yy879; } @@ -8308,36 +8120,30 @@ yy881: p = marker; goto yy874; yy882: - ++p; - yych = *p; + yych = *++p; if (yych == ' ') goto yy882; if (yych == '*') goto yy892; goto yy881; yy884: - ++p; - yych = *p; + yych = *++p; if (yych == ' ') goto yy884; if (yych != '-') goto yy881; yy886: - ++p; - yych = *p; + yych = *++p; if (yych == ' ') goto yy886; if (yych == '-') goto yy894; goto yy881; yy888: - ++p; - yych = *p; + yych = *++p; if (yych == ' ') goto yy888; if (yych != '_') goto yy881; yy890: - ++p; - yych = *p; + yych = *++p; if (yych == ' ') goto yy890; if (yych == '_') goto yy896; goto yy881; yy892: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 16) { goto yy892; } @@ -8346,8 +8152,7 @@ yy892: if (yych <= '\n') goto yy900; goto yy881; yy894: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 32) { goto yy894; } @@ -8356,8 +8161,7 @@ yy894: if (yych <= '\n') goto yy904; goto yy881; yy896: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 64) { goto yy896; } @@ -8366,8 +8170,7 @@ yy896: if (yych <= '\n') goto yy908; goto yy881; yy898: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 128) { goto yy898; } @@ -8377,8 +8180,7 @@ yy900: ++p; { return (p - start); } yy902: - ++p; - yych = *p; + yych = *++p; if (yych <= '\n') { if (yych <= 0x08) goto yy881; if (yych <= '\t') goto yy902; @@ -8390,8 +8192,7 @@ yy904: ++p; { return (p - start); } yy906: - ++p; - yych = *p; + yych = *++p; if (yych <= '\n') { if (yych <= 0x08) goto yy881; if (yych <= '\t') goto yy906; @@ -8459,7 +8260,7 @@ int _scan_open_code_fence(const unsigned char *p) yy912: { return 0; } yy913: - yych = *++p; + ++p; goto yy912; yy914: yych = *(marker = ++p); @@ -8484,28 +8285,31 @@ yy918: } goto yy917; yy919: - ++p; - yych = *p; - marker = p; - if (yybm[0+yych] & 64) { - goto yy923; + yych = *++p; + if (yybm[0+yych] & 16) { + goto yy919; } if (yych <= 0x00) goto yy917; - if (yych <= '\n') goto yy925; - goto yy919; -yy921: - ++p; - yych = *p; + if (yych == '\n') { + marker = p; + goto yy925; + } marker = p; - if (yybm[0+yych] & 128) { - goto yy927; + goto yy923; +yy921: + yych = *++p; + if (yybm[0+yych] & 32) { + goto yy921; } if (yych <= 0x00) goto yy917; - if (yych <= '\n') goto yy929; - goto yy921; + if (yych == '\n') { + marker = p; + goto yy929; + } + marker = p; + goto yy927; yy923: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 64) { goto yy923; } @@ -8516,8 +8320,7 @@ yy925: p = marker; { return (p - start); } yy927: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 128) { goto yy927; } @@ -8584,7 +8387,7 @@ int _scan_close_code_fence(const unsigned char *p) yy933: { return 0; } yy934: - yych = *++p; + ++p; goto yy933; yy935: yych = *(marker = ++p); @@ -8609,34 +8412,47 @@ yy939: } goto yy938; yy940: - ++p; - yych = *p; - marker = p; - if (yybm[0+yych] & 128) { - goto yy944; + yych = *++p; + if (yybm[0+yych] & 32) { + goto yy940; + } + if (yych <= '\n') { + if (yych <= 0x08) goto yy938; + if (yych <= '\t') { + marker = p; + goto yy944; + } + marker = p; + goto yy946; + } else { + if (yych == ' ') { + marker = p; + goto yy944; + } + goto yy938; } - if (yych <= 0x08) goto yy938; - if (yych <= '\n') goto yy946; - if (yych == '`') goto yy940; - goto yy938; yy942: - ++p; - yych = *p; - marker = p; + yych = *++p; if (yybm[0+yych] & 64) { goto yy942; } if (yych <= '\n') { if (yych <= 0x08) goto yy938; - if (yych <= '\t') goto yy948; + if (yych <= '\t') { + marker = p; + goto yy948; + } + marker = p; goto yy950; } else { - if (yych == ' ') goto yy948; + if (yych == ' ') { + marker = p; + goto yy948; + } goto yy938; } yy944: - ++p; - yych = *p; + yych = *++p; if (yybm[0+yych] & 128) { goto yy944; } @@ -8647,8 +8463,7 @@ yy946: p = marker; { return (p - start); } yy948: - ++p; - yych = *p; + yych = *++p; if (yych <= '\n') { if (yych <= 0x08) goto yy938; if (yych <= '\t') goto yy948; @@ -8680,7 +8495,7 @@ int _scan_entity(const unsigned char *p) yy954: { return 0; } yy955: - yych = *++p; + ++p; goto yy954; yy956: yych = *(marker = ++p); @@ -9344,8 +9159,8 @@ yy1006: } } yy1007: - ++p; - if ((yych = *p) <= ';') { + yych = *++p; + if (yych <= ';') { if (yych <= '/') goto yy958; if (yych <= '9') goto yy983; if (yych <= ':') goto yy958; @@ -9372,6 +9187,7 @@ re2c: warning: line 94: rule matches empty string [-Wmatch-empty-string] re2c: warning: line 105: rule matches empty string [-Wmatch-empty-string] re2c: warning: line 119: rule matches empty string [-Wmatch-empty-string] re2c: warning: line 133: rule matches empty string [-Wmatch-empty-string] +re2c: warning: line 134: rule matches empty string [-Wmatch-empty-string] re2c: warning: line 149: rule matches empty string [-Wmatch-empty-string] re2c: warning: line 158: rule matches empty string [-Wmatch-empty-string] re2c: warning: line 170: rule matches empty string [-Wmatch-empty-string] diff --git a/test/bug60_redundant_yymarker.ci.c b/test/bug60_redundant_yymarker.ci.c index 6da64e7..f5b2c47 100644 --- a/test/bug60_redundant_yymarker.ci.c +++ b/test/bug60_redundant_yymarker.ci.c @@ -8,61 +8,39 @@ } /* *********************************** */ yyc_c1: - if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = *YYCURSOR; - switch (yych) { - case 'b': goto yy5; - default: goto yy3; - } -yy3: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; -yy4: - switch (yych) { - case 'a': goto yy7; - default: goto yy3; - } -yy5: - ++YYCURSOR; - yych = *YYCURSOR; - goto yy4; - {} -yy7: + goto yy1; +yy2: ++YYCURSOR; +yy1: if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; - switch (yych) { - case 'a': goto yy7; - default: goto yy3; - } - {} + goto yy2; /* *********************************** */ yyc_c2: if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); yych = *YYCURSOR; switch (yych) { - case 'd': goto yy13; - default: goto yy12; + case 'd': goto yy7; + default: goto yy6; } -yy12: +yy6: YYCURSOR = YYMARKER; - goto yy14; -yy13: + goto yy8; +yy7: yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case 'd': goto yy15; - default: goto yy14; + case 'd': goto yy9; + default: goto yy8; } -yy14: +yy8: {} -yy15: +yy9: yych = *++YYCURSOR; switch (yych) { - case 'd': goto yy16; - default: goto yy12; + case 'd': goto yy10; + default: goto yy6; } -yy16: +yy10: ++YYCURSOR; {} } diff --git a/test/bug61.i--empty-class(error).c b/test/bug61.i--empty-class(error).c index 9bce616..3b7847d 100644 --- a/test/bug61.i--empty-class(error).c +++ b/test/bug61.i--empty-class(error).c @@ -1 +1 @@ -re2c: error: line 2, column 5: empty character class +re2c: error: line 2, column 4: empty character class diff --git a/test/bug61.i--empty-class(match-empty).c b/test/bug61.i--empty-class(match-empty).c index 5b2fa4a..9cb24ce 100644 --- a/test/bug61.i--empty-class(match-empty).c +++ b/test/bug61.i--empty-class(match-empty).c @@ -6,4 +6,4 @@ re2c: warning: line 10: empty character class [-Wempty-character-class] re2c: warning: line 10: rule matches empty string [-Wmatch-empty-string] re2c: warning: line 14: empty character class [-Wempty-character-class] re2c: warning: line 14: empty character class [-Wempty-character-class] -re2c: error: line 14, column 11: can only difference char sets +re2c: error: line 14, column 4: can only difference char sets diff --git a/test/bug61.i--empty-class(match-none)--eager-skip.c b/test/bug61.i--empty-class(match-none)--eager-skip.c new file mode 100644 index 0000000..32db514 --- /dev/null +++ b/test/bug61.i--empty-class(match-none)--eager-skip.c @@ -0,0 +1,49 @@ +/* Generated by re2c */ + +{ + YYCTYPE yych; +} + + + +{ + YYCTYPE yych; +} + + + +{ + YYCTYPE yych; +} + + + +{ + YYCTYPE yych; +} + + + +{ + YYCTYPE yych; +} + +re2c: warning: line 2: empty character class [-Wempty-character-class] +re2c: warning: line 3: control flow is undefined for strings that match '', use default rule '*' [-Wundefined-control-flow] +re2c: warning: line 2: unreachable rule [-Wunreachable-rules] +re2c: warning: line 6: empty character class [-Wempty-character-class] +re2c: warning: line 7: control flow is undefined for strings that match '', use default rule '*' [-Wundefined-control-flow] +re2c: warning: line 6: unreachable rule [-Wunreachable-rules] +re2c: warning: line 10: empty character class [-Wempty-character-class] +re2c: warning: line 11: control flow is undefined for strings that match '', use default rule '*' [-Wundefined-control-flow] +re2c: warning: line 10: unreachable rule [-Wunreachable-rules] +re2c: warning: line 14: empty character class [-Wempty-character-class] +re2c: warning: line 14: empty character class [-Wempty-character-class] +re2c: warning: line 14: empty character class [-Wempty-character-class] +re2c: warning: line 15: control flow is undefined for strings that match '', use default rule '*' [-Wundefined-control-flow] +re2c: warning: line 14: unreachable rule [-Wunreachable-rules] +re2c: warning: line 18: empty character class [-Wempty-character-class] +re2c: warning: line 18: empty character class [-Wempty-character-class] +re2c: warning: line 18: empty character class [-Wempty-character-class] +re2c: warning: line 19: control flow is undefined for strings that match '', use default rule '*' [-Wundefined-control-flow] +re2c: warning: line 18: unreachable rule [-Wunreachable-rules] diff --git a/test/bug61.i--empty-class(match-none)--eager-skip.re b/test/bug61.i--empty-class(match-none)--eager-skip.re new file mode 100644 index 0000000..6da4ba8 --- /dev/null +++ b/test/bug61.i--empty-class(match-none)--eager-skip.re @@ -0,0 +1,19 @@ +/*!re2c + [] {} +*/ + +/*!re2c + [^\x00-\xFF] {} +*/ + +/*!re2c + [\x00-\xFF]\[\x00-\xFF] {} +*/ + +/*!re2c + []\[] {} +*/ + +/*!re2c + [^\x00-\xFF]\[^\x00-\xFF] {} +*/ diff --git a/test/bug61.i.c b/test/bug61.i.c index 5b2fa4a..9cb24ce 100644 --- a/test/bug61.i.c +++ b/test/bug61.i.c @@ -6,4 +6,4 @@ re2c: warning: line 10: empty character class [-Wempty-character-class] re2c: warning: line 10: rule matches empty string [-Wmatch-empty-string] re2c: warning: line 14: empty character class [-Wempty-character-class] re2c: warning: line 14: empty character class [-Wempty-character-class] -re2c: error: line 14, column 11: can only difference char sets +re2c: error: line 14, column 4: can only difference char sets diff --git a/test/bug61_difference_full.i--empty-class(error).c b/test/bug61_difference_full.i--empty-class(error).c index 70094ae..3b7847d 100644 --- a/test/bug61_difference_full.i--empty-class(error).c +++ b/test/bug61_difference_full.i--empty-class(error).c @@ -1 +1 @@ -re2c: error: line 2, column 29: empty character class +re2c: error: line 2, column 4: empty character class diff --git a/test/bug61_difference_negative.i--empty-class(error).c b/test/bug61_difference_negative.i--empty-class(error).c index 9bce616..3b7847d 100644 --- a/test/bug61_difference_negative.i--empty-class(error).c +++ b/test/bug61_difference_negative.i--empty-class(error).c @@ -1 +1 @@ -re2c: error: line 2, column 5: empty character class +re2c: error: line 2, column 4: empty character class diff --git a/test/bug61_difference_negative.i--empty-class(match-empty).c b/test/bug61_difference_negative.i--empty-class(match-empty).c index 049b9a7..a0aee72 100644 --- a/test/bug61_difference_negative.i--empty-class(match-empty).c +++ b/test/bug61_difference_negative.i--empty-class(match-empty).c @@ -1,3 +1,3 @@ re2c: warning: line 2: empty character class [-Wempty-character-class] re2c: warning: line 2: empty character class [-Wempty-character-class] -re2c: error: line 2, column 31: can only difference char sets +re2c: error: line 2, column 4: can only difference char sets diff --git a/test/bug61_difference_negative.i.c b/test/bug61_difference_negative.i.c index 049b9a7..a0aee72 100644 --- a/test/bug61_difference_negative.i.c +++ b/test/bug61_difference_negative.i.c @@ -1,3 +1,3 @@ re2c: warning: line 2: empty character class [-Wempty-character-class] re2c: warning: line 2: empty character class [-Wempty-character-class] -re2c: error: line 2, column 31: can only difference char sets +re2c: error: line 2, column 4: can only difference char sets diff --git a/test/bug61_difference_positive.i--empty-class(error).c b/test/bug61_difference_positive.i--empty-class(error).c index 9bce616..3b7847d 100644 --- a/test/bug61_difference_positive.i--empty-class(error).c +++ b/test/bug61_difference_positive.i--empty-class(error).c @@ -1 +1 @@ -re2c: error: line 2, column 5: empty character class +re2c: error: line 2, column 4: empty character class diff --git a/test/bug61_difference_positive.i--empty-class(match-empty).c b/test/bug61_difference_positive.i--empty-class(match-empty).c index 463f74d..a0aee72 100644 --- a/test/bug61_difference_positive.i--empty-class(match-empty).c +++ b/test/bug61_difference_positive.i--empty-class(match-empty).c @@ -1,3 +1,3 @@ re2c: warning: line 2: empty character class [-Wempty-character-class] re2c: warning: line 2: empty character class [-Wempty-character-class] -re2c: error: line 2, column 11: can only difference char sets +re2c: error: line 2, column 4: can only difference char sets diff --git a/test/bug61_difference_positive.i.c b/test/bug61_difference_positive.i.c index 463f74d..a0aee72 100644 --- a/test/bug61_difference_positive.i.c +++ b/test/bug61_difference_positive.i.c @@ -1,3 +1,3 @@ re2c: warning: line 2: empty character class [-Wempty-character-class] re2c: warning: line 2: empty character class [-Wempty-character-class] -re2c: error: line 2, column 11: can only difference char sets +re2c: error: line 2, column 4: can only difference char sets diff --git a/test/bug61_negative.i--empty-class(error).c b/test/bug61_negative.i--empty-class(error).c index 9bce616..3b7847d 100644 --- a/test/bug61_negative.i--empty-class(error).c +++ b/test/bug61_negative.i--empty-class(error).c @@ -1 +1 @@ -re2c: error: line 2, column 5: empty character class +re2c: error: line 2, column 4: empty character class diff --git a/test/bug61_positive.i--empty-class(error).c b/test/bug61_positive.i--empty-class(error).c index 9bce616..3b7847d 100644 --- a/test/bug61_positive.i--empty-class(error).c +++ b/test/bug61_positive.i--empty-class(error).c @@ -1 +1 @@ -re2c: error: line 2, column 5: empty character class +re2c: error: line 2, column 4: empty character class diff --git a/test/c.c b/test/c.c index ab3c94f..f5137ab 100644 --- a/test/c.c +++ b/test/c.c @@ -263,8 +263,8 @@ yy7: } #line 265 "c.c" yy9: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy81; default: goto yy10; } @@ -280,8 +280,8 @@ yy11: default: goto yy84; } yy12: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy89; default: goto yy13; } @@ -290,8 +290,8 @@ yy13: { RET('%'); } #line 292 "c.c" yy14: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '&': goto yy91; case '=': goto yy93; default: goto yy15; @@ -318,8 +318,8 @@ yy19: { RET(')'); } #line 320 "c.c" yy21: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy99; default: goto yy22; } @@ -328,8 +328,8 @@ yy22: { RET('*'); } #line 330 "c.c" yy23: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '+': goto yy101; case '=': goto yy103; default: goto yy24; @@ -344,8 +344,8 @@ yy25: { RET(','); } #line 346 "c.c" yy27: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '-': goto yy105; case '=': goto yy107; case '>': goto yy109; @@ -377,8 +377,8 @@ yy30: { RET('.'); } #line 379 "c.c" yy31: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '*': goto yy115; case '=': goto yy117; default: goto yy32; @@ -391,36 +391,20 @@ yy33: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case '.': goto yy112; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': goto yy35; - case 'E': - case 'e': goto yy119; - case 'L': - case 'U': - case 'l': - case 'u': goto yy120; case 'X': case 'x': goto yy122; - default: goto yy34; + default: goto yy36; } yy34: #line 175 "c.re" { RET(ICON); } -#line 419 "c.c" +#line 402 "c.c" yy35: yyaccept = 2; YYMARKER = ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); yych = *YYCURSOR; +yy36: switch (yych) { case '.': goto yy112; case '0': @@ -445,15 +429,15 @@ yy37: ++YYCURSOR; #line 209 "c.re" { RET(':'); } -#line 449 "c.c" +#line 433 "c.c" yy39: ++YYCURSOR; #line 205 "c.re" { RET(';'); } -#line 454 "c.c" +#line 438 "c.c" yy41: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '<': goto yy123; case '=': goto yy125; default: goto yy42; @@ -461,20 +445,20 @@ yy41: yy42: #line 224 "c.re" { RET('<'); } -#line 465 "c.c" +#line 449 "c.c" yy43: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy127; default: goto yy44; } yy44: #line 210 "c.re" { RET('='); } -#line 475 "c.c" +#line 459 "c.c" yy45: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy129; case '>': goto yy131; default: goto yy46; @@ -482,12 +466,12 @@ yy45: yy46: #line 225 "c.re" { RET('>'); } -#line 486 "c.c" +#line 470 "c.c" yy47: ++YYCURSOR; #line 228 "c.re" { RET('?'); } -#line 491 "c.c" +#line 475 "c.c" yy49: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -562,27 +546,27 @@ yy50: yy51: #line 171 "c.re" { RET(ID); } -#line 566 "c.c" +#line 550 "c.c" yy52: ++YYCURSOR; #line 213 "c.re" { RET('['); } -#line 571 "c.c" +#line 555 "c.c" yy54: ++YYCURSOR; #line 214 "c.re" { RET(']'); } -#line 576 "c.c" +#line 560 "c.c" yy56: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy133; default: goto yy57; } yy57: #line 226 "c.re" { RET('^'); } -#line 586 "c.c" +#line 570 "c.c" yy58: yych = *++YYCURSOR; switch (yych) { @@ -687,10 +671,10 @@ yy73: ++YYCURSOR; #line 206 "c.re" { RET('{'); } -#line 691 "c.c" +#line 675 "c.c" yy75: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy162; case '|': goto yy164; default: goto yy76; @@ -698,22 +682,22 @@ yy75: yy76: #line 227 "c.re" { RET('|'); } -#line 702 "c.c" +#line 686 "c.c" yy77: ++YYCURSOR; #line 207 "c.re" { RET('}'); } -#line 707 "c.c" +#line 691 "c.c" yy79: ++YYCURSOR; #line 218 "c.re" { RET('~'); } -#line 712 "c.c" +#line 696 "c.c" yy81: ++YYCURSOR; #line 204 "c.re" { RET(NEQ); } -#line 717 "c.c" +#line 701 "c.c" yy83: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -737,7 +721,7 @@ yy86: ++YYCURSOR; #line 181 "c.re" { RET(SCON); } -#line 741 "c.c" +#line 725 "c.c" yy88: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -769,17 +753,17 @@ yy89: ++YYCURSOR; #line 190 "c.re" { RET(MODEQ); } -#line 773 "c.c" +#line 757 "c.c" yy91: ++YYCURSOR; #line 199 "c.re" { RET(ANDAND); } -#line 778 "c.c" +#line 762 "c.c" yy93: ++YYCURSOR; #line 191 "c.re" { RET(ANDEQ); } -#line 783 "c.c" +#line 767 "c.c" yy95: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -792,7 +776,7 @@ yy96: default: goto yy95; } yy97: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy34; yy98: ++YYCURSOR; @@ -825,32 +809,32 @@ yy99: ++YYCURSOR; #line 188 "c.re" { RET(MULEQ); } -#line 829 "c.c" +#line 813 "c.c" yy101: ++YYCURSOR; #line 196 "c.re" { RET(INCR); } -#line 834 "c.c" +#line 818 "c.c" yy103: ++YYCURSOR; #line 186 "c.re" { RET(ADDEQ); } -#line 839 "c.c" +#line 823 "c.c" yy105: ++YYCURSOR; #line 197 "c.re" { RET(DECR); } -#line 844 "c.c" +#line 828 "c.c" yy107: ++YYCURSOR; #line 187 "c.re" { RET(SUBEQ); } -#line 849 "c.c" +#line 833 "c.c" yy109: ++YYCURSOR; #line 198 "c.re" { RET(DEREF); } -#line 854 "c.c" +#line 838 "c.c" yy111: yych = *++YYCURSOR; switch (yych) { @@ -884,17 +868,17 @@ yy112: yy114: #line 178 "c.re" { RET(FCON); } -#line 888 "c.c" +#line 872 "c.c" yy115: ++YYCURSOR; #line 136 "c.re" { goto comment; } -#line 893 "c.c" +#line 877 "c.c" yy117: ++YYCURSOR; #line 189 "c.re" { RET(DIVEQ); } -#line 898 "c.c" +#line 882 "c.c" yy119: yych = *++YYCURSOR; switch (yych) { @@ -951,45 +935,45 @@ yy122: default: goto yy85; } yy123: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy176; default: goto yy124; } yy124: #line 195 "c.re" { RET(LSHIFT); } -#line 963 "c.c" +#line 947 "c.c" yy125: ++YYCURSOR; #line 201 "c.re" { RET(LEQ); } -#line 968 "c.c" +#line 952 "c.c" yy127: ++YYCURSOR; #line 203 "c.re" { RET(EQL); } -#line 973 "c.c" +#line 957 "c.c" yy129: ++YYCURSOR; #line 202 "c.re" { RET(GEQ); } -#line 978 "c.c" +#line 962 "c.c" yy131: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy178; default: goto yy132; } yy132: #line 194 "c.re" { RET(RSHIFT); } -#line 988 "c.c" +#line 972 "c.c" yy133: ++YYCURSOR; #line 192 "c.re" { RET(XOREQ); } -#line 993 "c.c" +#line 977 "c.c" yy135: yych = *++YYCURSOR; switch (yych) { @@ -1027,8 +1011,8 @@ yy140: default: goto yy50; } yy141: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1097,7 +1081,7 @@ yy141: yy142: #line 145 "c.re" { RET(DO); } -#line 1101 "c.c" +#line 1085 "c.c" yy143: yych = *++YYCURSOR; switch (yych) { @@ -1135,8 +1119,8 @@ yy148: default: goto yy50; } yy149: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1205,7 +1189,7 @@ yy149: yy150: #line 153 "c.re" { RET(IF); } -#line 1209 "c.c" +#line 1193 "c.c" yy151: yych = *++YYCURSOR; switch (yych) { @@ -1281,12 +1265,12 @@ yy162: ++YYCURSOR; #line 193 "c.re" { RET(OREQ); } -#line 1285 "c.c" +#line 1269 "c.c" yy164: ++YYCURSOR; #line 200 "c.re" { RET(OROR); } -#line 1290 "c.c" +#line 1274 "c.c" yy166: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -1349,9 +1333,9 @@ yy168: ++YYCURSOR; #line 183 "c.re" { RET(ELLIPSIS); } -#line 1353 "c.c" +#line 1337 "c.c" yy170: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy114; yy171: yych = *++YYCURSOR; @@ -1426,12 +1410,12 @@ yy176: ++YYCURSOR; #line 185 "c.re" { RET(LSHIFTEQ); } -#line 1430 "c.c" +#line 1414 "c.c" yy178: ++YYCURSOR; #line 184 "c.re" { RET(RSHIFTEQ); } -#line 1435 "c.c" +#line 1419 "c.c" yy180: yych = *++YYCURSOR; switch (yych) { @@ -1500,8 +1484,8 @@ yy190: default: goto yy50; } yy191: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1570,7 +1554,7 @@ yy191: yy192: #line 151 "c.re" { RET(FOR); } -#line 1574 "c.c" +#line 1558 "c.c" yy193: yych = *++YYCURSOR; switch (yych) { @@ -1578,8 +1562,8 @@ yy193: default: goto yy50; } yy194: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1648,7 +1632,7 @@ yy194: yy195: #line 154 "c.re" { RET(INT); } -#line 1652 "c.c" +#line 1636 "c.c" yy196: yych = *++YYCURSOR; switch (yych) { @@ -1740,8 +1724,8 @@ yy210: default: goto yy50; } yy211: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1810,7 +1794,7 @@ yy211: yy212: #line 138 "c.re" { RET(AUTO); } -#line 1814 "c.c" +#line 1798 "c.c" yy213: yych = *++YYCURSOR; switch (yych) { @@ -1818,8 +1802,8 @@ yy213: default: goto yy50; } yy214: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1888,10 +1872,10 @@ yy214: yy215: #line 140 "c.re" { RET(CASE); } -#line 1892 "c.c" +#line 1876 "c.c" yy216: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1960,7 +1944,7 @@ yy216: yy217: #line 141 "c.re" { RET(CHAR); } -#line 1964 "c.c" +#line 1948 "c.c" yy218: yych = *++YYCURSOR; switch (yych) { @@ -1986,8 +1970,8 @@ yy221: default: goto yy50; } yy222: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2056,10 +2040,10 @@ yy222: yy223: #line 147 "c.re" { RET(ELSE); } -#line 2060 "c.c" +#line 2044 "c.c" yy224: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2128,7 +2112,7 @@ yy224: yy225: #line 148 "c.re" { RET(ENUM); } -#line 2132 "c.c" +#line 2116 "c.c" yy226: yych = *++YYCURSOR; switch (yych) { @@ -2142,8 +2126,8 @@ yy227: default: goto yy50; } yy228: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2212,10 +2196,10 @@ yy228: yy229: #line 152 "c.re" { RET(GOTO); } -#line 2216 "c.c" +#line 2200 "c.c" yy230: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2284,7 +2268,7 @@ yy230: yy231: #line 155 "c.re" { RET(LONG); } -#line 2288 "c.c" +#line 2272 "c.c" yy232: yych = *++YYCURSOR; switch (yych) { @@ -2352,8 +2336,8 @@ yy242: default: goto yy50; } yy243: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2422,7 +2406,7 @@ yy243: yy244: #line 167 "c.re" { RET(VOID); } -#line 2426 "c.c" +#line 2410 "c.c" yy245: yych = *++YYCURSOR; switch (yych) { @@ -2436,8 +2420,8 @@ yy246: default: goto yy50; } yy247: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2506,10 +2490,10 @@ yy247: yy248: #line 139 "c.re" { RET(BREAK); } -#line 2510 "c.c" +#line 2494 "c.c" yy249: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2578,7 +2562,7 @@ yy249: yy250: #line 142 "c.re" { RET(CONST); } -#line 2582 "c.c" +#line 2566 "c.c" yy251: yych = *++YYCURSOR; switch (yych) { @@ -2604,8 +2588,8 @@ yy254: default: goto yy50; } yy255: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2674,7 +2658,7 @@ yy255: yy256: #line 150 "c.re" { RET(FLOAT); } -#line 2678 "c.c" +#line 2662 "c.c" yy257: yych = *++YYCURSOR; switch (yych) { @@ -2688,8 +2672,8 @@ yy258: default: goto yy50; } yy259: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2758,7 +2742,7 @@ yy259: yy260: #line 158 "c.re" { RET(SHORT); } -#line 2762 "c.c" +#line 2746 "c.c" yy261: yych = *++YYCURSOR; switch (yych) { @@ -2796,8 +2780,8 @@ yy266: default: goto yy50; } yy267: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2866,7 +2850,7 @@ yy267: yy268: #line 165 "c.re" { RET(UNION); } -#line 2870 "c.c" +#line 2854 "c.c" yy269: yych = *++YYCURSOR; switch (yych) { @@ -2880,8 +2864,8 @@ yy270: default: goto yy50; } yy271: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2950,7 +2934,7 @@ yy271: yy272: #line 169 "c.re" { RET(WHILE); } -#line 2954 "c.c" +#line 2938 "c.c" yy273: yych = *++YYCURSOR; switch (yych) { @@ -2964,8 +2948,8 @@ yy274: default: goto yy50; } yy275: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3034,10 +3018,10 @@ yy275: yy276: #line 146 "c.re" { RET(DOUBLE); } -#line 3038 "c.c" +#line 3022 "c.c" yy277: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3106,7 +3090,7 @@ yy277: yy278: #line 149 "c.re" { RET(EXTERN); } -#line 3110 "c.c" +#line 3094 "c.c" yy279: yych = *++YYCURSOR; switch (yych) { @@ -3114,8 +3098,8 @@ yy279: default: goto yy50; } yy280: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3184,10 +3168,10 @@ yy280: yy281: #line 157 "c.re" { RET(RETURN); } -#line 3188 "c.c" +#line 3172 "c.c" yy282: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3256,10 +3240,10 @@ yy282: yy283: #line 159 "c.re" { RET(SIGNED); } -#line 3260 "c.c" +#line 3244 "c.c" yy284: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3328,10 +3312,10 @@ yy284: yy285: #line 160 "c.re" { RET(SIZEOF); } -#line 3332 "c.c" +#line 3316 "c.c" yy286: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3400,10 +3384,10 @@ yy286: yy287: #line 161 "c.re" { RET(STATIC); } -#line 3404 "c.c" +#line 3388 "c.c" yy288: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3472,10 +3456,10 @@ yy288: yy289: #line 162 "c.re" { RET(STRUCT); } -#line 3476 "c.c" +#line 3460 "c.c" yy290: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3544,7 +3528,7 @@ yy290: yy291: #line 163 "c.re" { RET(SWITCH); } -#line 3548 "c.c" +#line 3532 "c.c" yy292: yych = *++YYCURSOR; switch (yych) { @@ -3570,8 +3554,8 @@ yy295: default: goto yy50; } yy296: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3640,7 +3624,7 @@ yy296: yy297: #line 144 "c.re" { RET(DEFAULT); } -#line 3644 "c.c" +#line 3628 "c.c" yy298: yych = *++YYCURSOR; switch (yych) { @@ -3648,8 +3632,8 @@ yy298: default: goto yy50; } yy299: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3718,7 +3702,7 @@ yy299: yy300: #line 164 "c.re" { RET(TYPEDEF); } -#line 3722 "c.c" +#line 3706 "c.c" yy301: yych = *++YYCURSOR; switch (yych) { @@ -3732,8 +3716,8 @@ yy302: default: goto yy50; } yy303: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3802,10 +3786,10 @@ yy303: yy304: #line 143 "c.re" { RET(CONTINUE); } -#line 3806 "c.c" +#line 3790 "c.c" yy305: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3874,10 +3858,10 @@ yy305: yy306: #line 156 "c.re" { RET(REGISTER); } -#line 3878 "c.c" +#line 3862 "c.c" yy307: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3946,10 +3930,10 @@ yy307: yy308: #line 166 "c.re" { RET(UNSIGNED); } -#line 3950 "c.c" +#line 3934 "c.c" yy309: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -4018,14 +4002,14 @@ yy309: yy310: #line 168 "c.re" { RET(VOLATILE); } -#line 4022 "c.c" +#line 4006 "c.c" } #line 245 "c.re" comment: -#line 4029 "c.c" +#line 4013 "c.c" { YYCTYPE yych; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); @@ -4040,7 +4024,7 @@ yy313: yy314: #line 256 "c.re" { goto comment; } -#line 4044 "c.c" +#line 4028 "c.c" yy315: ++YYCURSOR; #line 251 "c.re" @@ -4049,7 +4033,7 @@ yy315: s->tok = s->pos = cursor; s->line++; goto comment; } -#line 4053 "c.c" +#line 4037 "c.c" yy317: yych = *++YYCURSOR; switch (yych) { @@ -4060,7 +4044,7 @@ yy318: ++YYCURSOR; #line 249 "c.re" { goto std; } -#line 4064 "c.c" +#line 4048 "c.c" } #line 257 "c.re" diff --git a/test/calc_001.c b/test/calc_001.c index fc6b316..42826f0 100644 --- a/test/calc_001.c +++ b/test/calc_001.c @@ -1,7 +1,8 @@ /* Generated by re2c */ #line 1 "calc_001.re" /* re2c lesson 001_upn_calculator, calc_001, (c) M. Boerger 2006 - 2007 */ -#line 43 "calc_001.re" +#line 42 "calc_001.re" + #include #include @@ -20,7 +21,7 @@ int scan(char *s, int l) for(;;) { -#line 24 "calc_001.c" +#line 25 "calc_001.c" { YYCTYPE yych; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); @@ -45,25 +46,25 @@ yy2: ++YYCURSOR; #line 67 "calc_001.re" { printf("EOF\n"); return 0; } -#line 49 "calc_001.c" +#line 50 "calc_001.c" yy4: ++YYCURSOR; #line 68 "calc_001.re" { printf("ERR\n"); return 1; } -#line 54 "calc_001.c" +#line 55 "calc_001.c" yy6: ++YYCURSOR; #line 65 "calc_001.re" { printf("+\n"); continue; } -#line 59 "calc_001.c" +#line 60 "calc_001.c" yy8: ++YYCURSOR; #line 66 "calc_001.re" { printf("-\n"); continue; } -#line 64 "calc_001.c" +#line 65 "calc_001.c" yy10: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -79,7 +80,7 @@ yy10: yy11: #line 64 "calc_001.re" { printf("Num\n"); continue; } -#line 83 "calc_001.c" +#line 84 "calc_001.c" yy12: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -100,7 +101,7 @@ yy12: yy14: #line 63 "calc_001.re" { printf("Num\n"); continue; } -#line 104 "calc_001.c" +#line 105 "calc_001.c" yy15: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -121,7 +122,7 @@ yy15: yy17: #line 62 "calc_001.re" { printf("Oct\n"); continue; } -#line 125 "calc_001.c" +#line 126 "calc_001.c" } #line 69 "calc_001.re" diff --git a/test/calc_001.dei.c b/test/calc_001.dei.c index f57254f..980211c 100644 --- a/test/calc_001.dei.c +++ b/test/calc_001.dei.c @@ -1,6 +1,7 @@ /* Generated by re2c */ /* re2c lesson 001_upn_calculator, calc_001, (c) M. Boerger 2006 - 2007 */ + #include #include #include @@ -61,8 +62,8 @@ yy8: { printf("-\n"); continue; } yy10: YYDEBUG(10, *YYCURSOR); - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xF0: /* 0 */ case 0xF1: /* 1 */ case 0xF2: /* 2 */ diff --git a/test/calc_001.ei.c b/test/calc_001.ei.c index ac1bfa9..34533c5 100644 --- a/test/calc_001.ei.c +++ b/test/calc_001.ei.c @@ -1,6 +1,7 @@ /* Generated by re2c */ /* re2c lesson 001_upn_calculator, calc_001, (c) M. Boerger 2006 - 2007 */ + #include #include #include @@ -51,8 +52,8 @@ yy8: ++YYCURSOR; { printf("-\n"); continue; } yy10: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xF0: case 0xF1: case 0xF2: diff --git a/test/calc_002.c b/test/calc_002.c index ee4e542..9f54f3d 100644 --- a/test/calc_002.c +++ b/test/calc_002.c @@ -1,7 +1,8 @@ /* Generated by re2c */ #line 1 "calc_002.re" /* re2c lesson 001_upn_calculator, calc_002, (c) M. Boerger 2006 - 2007 */ -#line 19 "calc_002.re" +#line 18 "calc_002.re" + #include #include @@ -28,7 +29,7 @@ int scan(char *s) for(;;) { -#line 32 "calc_002.c" +#line 33 "calc_002.c" { YYCTYPE yych; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); @@ -53,25 +54,25 @@ yy2: ++YYCURSOR; #line 51 "calc_002.re" { printf("EOF\n"); return 0; } -#line 57 "calc_002.c" +#line 58 "calc_002.c" yy4: ++YYCURSOR; #line 52 "calc_002.re" { printf("ERR\n"); return 1; } -#line 62 "calc_002.c" +#line 63 "calc_002.c" yy6: ++YYCURSOR; #line 49 "calc_002.re" { printf("+\n"); continue; } -#line 67 "calc_002.c" +#line 68 "calc_002.c" yy8: ++YYCURSOR; #line 50 "calc_002.re" { printf("+\n"); continue; } -#line 72 "calc_002.c" +#line 73 "calc_002.c" yy10: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -87,7 +88,7 @@ yy10: yy11: #line 48 "calc_002.re" { printf("Num\n"); continue; } -#line 91 "calc_002.c" +#line 92 "calc_002.c" yy12: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -108,7 +109,7 @@ yy12: yy14: #line 47 "calc_002.re" { printf("Num\n"); continue; } -#line 112 "calc_002.c" +#line 113 "calc_002.c" yy15: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -129,7 +130,7 @@ yy15: yy17: #line 46 "calc_002.re" { printf("Oct\n"); continue; } -#line 133 "calc_002.c" +#line 134 "calc_002.c" } #line 53 "calc_002.re" diff --git a/test/calc_003.c b/test/calc_003.c index 0b36f28..603015a 100644 --- a/test/calc_003.c +++ b/test/calc_003.c @@ -1,7 +1,8 @@ /* Generated by re2c */ #line 1 "calc_003.re" /* re2c lesson 001_upn_calculator, calc_003, (c) M. Boerger 2006 - 2007 */ -#line 19 "calc_003.re" +#line 18 "calc_003.re" + #include #include @@ -20,7 +21,7 @@ int scan(char *s, int l) for(;;) { -#line 24 "calc_003.c" +#line 25 "calc_003.c" { YYCTYPE yych; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); @@ -45,25 +46,25 @@ yy2: ++YYCURSOR; #line 43 "calc_003.re" { printf("EOF\n"); return 0; } -#line 49 "calc_003.c" +#line 50 "calc_003.c" yy4: ++YYCURSOR; #line 44 "calc_003.re" { printf("ERR\n"); return 1; } -#line 54 "calc_003.c" +#line 55 "calc_003.c" yy6: ++YYCURSOR; #line 41 "calc_003.re" { printf("+\n"); continue; } -#line 59 "calc_003.c" +#line 60 "calc_003.c" yy8: ++YYCURSOR; #line 42 "calc_003.re" { printf("+\n"); continue; } -#line 64 "calc_003.c" +#line 65 "calc_003.c" yy10: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -79,7 +80,7 @@ yy10: yy11: #line 40 "calc_003.re" { printf("Num\n"); continue; } -#line 83 "calc_003.c" +#line 84 "calc_003.c" yy12: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -100,7 +101,7 @@ yy12: yy14: #line 39 "calc_003.re" { printf("Num\n"); continue; } -#line 104 "calc_003.c" +#line 105 "calc_003.c" yy15: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -121,7 +122,7 @@ yy15: yy17: #line 38 "calc_003.re" { printf("Oct\n"); continue; } -#line 125 "calc_003.c" +#line 126 "calc_003.c" } #line 45 "calc_003.re" diff --git a/test/calc_004.c b/test/calc_004.c index 3246dc9..bcd53bc 100644 --- a/test/calc_004.c +++ b/test/calc_004.c @@ -1,7 +1,8 @@ /* Generated by re2c */ #line 1 "calc_004.re" /* re2c lesson 001_upn_calculator, calc_004, (c) M. Boerger 2006 - 2007 */ -#line 20 "calc_004.re" +#line 19 "calc_004.re" + #include #include @@ -32,7 +33,7 @@ int scan(char *s, int l) { t = p; -#line 36 "calc_004.c" +#line 37 "calc_004.c" { YYCTYPE yych; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); @@ -57,25 +58,25 @@ yy2: ++YYCURSOR; #line 60 "calc_004.re" { printf("EOF\n"); return 0; } -#line 61 "calc_004.c" +#line 62 "calc_004.c" yy4: ++YYCURSOR; #line 61 "calc_004.re" { printf("ERR\n"); return 1; } -#line 66 "calc_004.c" +#line 67 "calc_004.c" yy6: ++YYCURSOR; #line 58 "calc_004.re" { printf("+\n"); continue; } -#line 71 "calc_004.c" +#line 72 "calc_004.c" yy8: ++YYCURSOR; #line 59 "calc_004.re" { printf("+\n"); continue; } -#line 76 "calc_004.c" +#line 77 "calc_004.c" yy10: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -91,7 +92,7 @@ yy10: yy11: #line 57 "calc_004.re" { t = tokendup(t, p); printf("Num: %s\n", t); free(t); continue; } -#line 95 "calc_004.c" +#line 96 "calc_004.c" yy12: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -129,7 +130,7 @@ yy14: yy16: #line 56 "calc_004.re" { t = tokendup(t, p); printf("Oct: %s\n", t); free(t); continue; } -#line 133 "calc_004.c" +#line 134 "calc_004.c" } #line 62 "calc_004.re" diff --git a/test/calc_005.c b/test/calc_005.c index 2f3951a..72d8d65 100644 --- a/test/calc_005.c +++ b/test/calc_005.c @@ -1,7 +1,8 @@ /* Generated by re2c */ #line 1 "calc_005.re" /* re2c lesson 001_upn_calculator, calc_005, (c) M. Boerger 2006 - 2007 */ -#line 19 "calc_005.re" +#line 18 "calc_005.re" + #include #include @@ -67,7 +68,7 @@ int scan(char *s, int l) { t = p; -#line 71 "calc_005.c" +#line 72 "calc_005.c" { YYCTYPE yych; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); @@ -93,7 +94,7 @@ yy2: ++YYCURSOR; #line 96 "calc_005.re" { res = 1; continue; } -#line 97 "calc_005.c" +#line 98 "calc_005.c" yy4: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -106,20 +107,20 @@ yy4: yy6: #line 91 "calc_005.re" { continue; } -#line 110 "calc_005.c" +#line 111 "calc_005.c" yy7: ++YYCURSOR; #line 94 "calc_005.re" { res = stack_add(); continue; } -#line 115 "calc_005.c" +#line 116 "calc_005.c" yy9: ++YYCURSOR; #line 95 "calc_005.re" { res = stack_sub(); continue; } -#line 120 "calc_005.c" +#line 121 "calc_005.c" yy11: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -135,7 +136,7 @@ yy11: yy12: #line 93 "calc_005.re" { res = push_num(t, p, 10); continue; } -#line 139 "calc_005.c" +#line 140 "calc_005.c" yy13: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -173,7 +174,7 @@ yy15: yy17: #line 92 "calc_005.re" { res = push_num(t, p, 8); continue; } -#line 177 "calc_005.c" +#line 178 "calc_005.c" } #line 97 "calc_005.re" diff --git a/test/calc_006.s.c b/test/calc_006.s.c index 3a92f30..c0707d1 100644 --- a/test/calc_006.s.c +++ b/test/calc_006.s.c @@ -1,7 +1,8 @@ /* Generated by re2c */ #line 1 "calc_006.s.re" /* re2c lesson 001_upn_calculator, calc_006, (c) M. Boerger 2006 - 2007 */ -#line 36 "calc_006.s.re" +#line 35 "calc_006.s.re" + #include #include @@ -65,7 +66,7 @@ int scan(char *s) { t = p; -#line 69 "calc_006.s.c" +#line 70 "calc_006.s.c" { YYCTYPE yych; yych = *YYCURSOR; @@ -94,15 +95,14 @@ yy2: ++YYCURSOR; #line 112 "calc_006.s.re" { res = depth == 1 ? 0 : 2; break; } -#line 98 "calc_006.s.c" +#line 99 "calc_006.s.c" yy4: ++YYCURSOR; #line 113 "calc_006.s.re" { res = 1; continue; } -#line 103 "calc_006.s.c" +#line 104 "calc_006.s.c" yy6: - ++YYCURSOR; - yych = *YYCURSOR; + yych = *++YYCURSOR; if (yych == '\t') goto yy6; if (yych == ' ') goto yy6; #line 107 "calc_006.s.re" @@ -119,28 +119,26 @@ yy11: { res = stack_sub(); continue; } #line 121 "calc_006.s.c" yy13: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy14; + yych = *++YYCURSOR; + if (yych <= '/') goto yy14; if (yych <= '9') goto yy17; yy14: #line 109 "calc_006.s.re" { res = push_num(t, p, 10); continue; } #line 129 "calc_006.s.c" yy15: - ++YYCURSOR; - yych = *YYCURSOR; + yych = *++YYCURSOR; if (yych <= '/') goto yy14; if (yych <= '9') goto yy15; goto yy14; yy17: - ++YYCURSOR; - yych = *YYCURSOR; + yych = *++YYCURSOR; if (yych <= '/') goto yy19; if (yych <= '9') goto yy17; yy19: #line 108 "calc_006.s.re" { res = push_num(t, p, 8); continue; } -#line 144 "calc_006.s.c" +#line 142 "calc_006.s.c" } #line 114 "calc_006.s.re" diff --git a/test/calc_007.b.c b/test/calc_007.b.c index 5dd2979..25530a8 100644 --- a/test/calc_007.b.c +++ b/test/calc_007.b.c @@ -1,7 +1,8 @@ /* Generated by re2c */ #line 1 "calc_007.b.re" /* re2c lesson 001_upn_calculator, calc_007, (c) M. Boerger 2006 - 2007 */ -#line 9 "calc_007.b.re" +#line 8 "calc_007.b.re" + #include #include @@ -65,7 +66,7 @@ int scan(char *s) { t = p; -#line 69 "calc_007.b.c" +#line 70 "calc_007.b.c" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -124,15 +125,14 @@ yy2: ++YYCURSOR; #line 85 "calc_007.b.re" { res = depth == 1 ? 0 : 2; break; } -#line 128 "calc_007.b.c" +#line 129 "calc_007.b.c" yy4: ++YYCURSOR; #line 86 "calc_007.b.re" { res = 1; continue; } -#line 133 "calc_007.b.c" +#line 134 "calc_007.b.c" yy6: - ++YYCURSOR; - yych = *YYCURSOR; + yych = *++YYCURSOR; if (yybm[0+yych] & 64) { goto yy6; } @@ -150,29 +150,27 @@ yy11: { res = stack_sub(); continue; } #line 152 "calc_007.b.c" yy13: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy14; + yych = *++YYCURSOR; + if (yych <= '/') goto yy14; if (yych <= '9') goto yy17; yy14: #line 82 "calc_007.b.re" { res = push_num(t, p, 10); continue; } #line 160 "calc_007.b.c" yy15: - ++YYCURSOR; - yych = *YYCURSOR; + yych = *++YYCURSOR; if (yybm[0+yych] & 128) { goto yy15; } goto yy14; yy17: - ++YYCURSOR; - yych = *YYCURSOR; + yych = *++YYCURSOR; if (yych <= '/') goto yy19; if (yych <= '9') goto yy17; yy19: #line 81 "calc_007.b.re" { res = push_num(t, p, 8); continue; } -#line 176 "calc_007.b.c" +#line 174 "calc_007.b.c" } #line 87 "calc_007.b.re" diff --git a/test/calc_008.b--skeleton.c b/test/calc_008.b--skeleton.c index a42e3aad4798f7f132ed6c9cdb6fd47941aa3862..ec125e2df933da4f00836933b0ba6796954155d0 100644 GIT binary patch delta 1019 zcmZ3nn(@|D#tCY|DXD3C8FmW#S_;LPRjKhM3R?OTC9GwYGxL&jN>fr5Y>G>YGV{`* zYI0L^lM5<0`rEOvY87N>R!pA6GFz-PuQ)S3FEvF0D4<}g0G6=knrtsEJK2FXlqDLZ zZVs!K9EhQytzZ;u&7}YYV0A$C5K-gJmsq_RnL%n5+2=B6r&dlr4x)klRF2mA;*!LY z%w&bkyb^`vjMU`pc%Xv#!U{IF3Lwpz3Pq_UrA2uP1`wB~6-*YFQC7;!FHuO%%P&pOPypIq z9FwP{36Y1YHniUSjAJp=gVud)h-S|x0 zfy!?Ft%eXf)1sq|TtPmi#`B=~+CIIYRM_B*> delta 3896 zcmeIwcW@L{9Ki8hE+HHw(nPu}2pEXK?%Un>_R$eTS5O2*N`MgH07DC45Lg8%D*Xhd zHz|rBa4H?eM(-$yf>JFMMXG@1%jk^%gy69YxUMlGXvM)tt8^uB{KvuYYCDdFg`q~@Ul zUDEHqmewbnnPFLGa-?6ev>euqh%UZ0$MtR{>gKqfRI*-<>uXD@siorzCue7;_cUr7 z?b@|WO>Jf*SFRi>SgJ)%Z$x*L@&h?OSW{+9;GdI6YnHto@Ix_%VFW^ta2u&;Fr@85-atn2HUt z5jMsq*c6*#b9@vZ!xq>QAIB%K6+Vfru?@Dxr?4G9jqR}mcEnDYhMm#x!qAl=9lK!$ zcE=vr6T{dGdt)Db1~aiQ_QU=-00&|g4#L4W1fRuh9E#83FdU8}@b1B%2jc~Xkt~eD z7jZO>!Lc|FU&5F16&#Nfa3W5^$v6e4Vgz5sX*eBU!`E>J&csuEck66|TlL7{zz-J$xV6;yPT98*n3T!p*n^Kfn*! z-`L9V5q^xH;HUT*Zo}=k19##s+>Lv1FYd$rcmNOLAv}zq;}>`YkK&hj48Ov!@i?Bq zZ_xji;UvQ;JdJ1YES|&f@O%6Lf5h{60Wabu{0V=?%lHdk!K-);uj388iNE44yp4D8 zH~by{2!*1u+}tGJj1iUsVG%SBU$hZ5LCHQ`~di5?acVmQtmJ=asg# zF5{Ty{jOz|mA(*$vh8x7#;CkL8QtMP@nhib6 zYNUl|Y}s}bUpP)v+jW~cQZ{#$dQ^JeV@m55o@ut!mi4$L#1q1{TiK5Dq~p4+T`Aj0 zrP?abd&<+goi@#zgy>+~c1Oo?I=QZ!CZ+7Gl7JDK!=&y->fWU8L+WQpok{Axr0z%R{-hp2>Vc%rBK06r4<_{xQa?-TY*G&;^>d^i zM(W|D9zklK)X$Up1yYYB^(ZOCieop9I;m%ndM2r7k$N_%=a70XsppY;KB*UwdLgM7QTh!^ zFQ)VoN-w4KGUaRiCaK>d^>R|bP3je-UPUs;+bF%=C-n|e?qM`Ug_~Nb2*XzCh}Wq`pMzpGf^PsV|fI7gAp#^;J?| zBlUGs-yro(QvXWoTco~C>N}+Vjnu!BI(nem;sie~7?YcqpS#-!{aihLFy{aMx%u@4 zW1=JFrP#=PnHcS-m*nT)h|SH*&)w~Vey*NA82exE-~Hd|A1#-9BsNknH8Fa#(W%%! E0j|7i8vp #include @@ -61,7 +62,7 @@ int scan(char *p) { t = p; -#line 65 "calc_008.b.c" +#line 66 "calc_008.b.c" { unsigned char curr; static const unsigned char yybm[] = { @@ -120,15 +121,14 @@ scan2: ++p; #line 108 "calc_008.b.re" { res = depth == 1 ? 0 : 2; break; } -#line 124 "calc_008.b.c" +#line 125 "calc_008.b.c" scan4: ++p; #line 109 "calc_008.b.re" { res = 1; continue; } -#line 129 "calc_008.b.c" +#line 130 "calc_008.b.c" scan6: - ++p; - curr = (unsigned char)*p; + curr = (unsigned char)*++p; if (yybm[0+curr] & 64) { goto scan6; } @@ -146,29 +146,27 @@ scan11: { res = stack_sub(); continue; } #line 148 "calc_008.b.c" scan13: - ++p; - if ((curr = (unsigned char)*p) <= '/') goto scan14; + curr = (unsigned char)*++p; + if (curr <= '/') goto scan14; if (curr <= '9') goto scan17; scan14: #line 105 "calc_008.b.re" { res = push_num(t, p, 10); continue; } #line 156 "calc_008.b.c" scan15: - ++p; - curr = (unsigned char)*p; + curr = (unsigned char)*++p; if (yybm[0+curr] & 128) { goto scan15; } goto scan14; scan17: - ++p; - curr = (unsigned char)*p; + curr = (unsigned char)*++p; if (curr <= '/') goto scan19; if (curr <= '9') goto scan17; scan19: #line 104 "calc_008.b.re" { res = push_num(t, p, 8); continue; } -#line 172 "calc_008.b.c" +#line 170 "calc_008.b.c" } #line 110 "calc_008.b.re" diff --git a/test/class3.i8.c b/test/class3.i8.c index fd2b173..4d6ba53 100644 --- a/test/class3.i8.c +++ b/test/class3.i8.c @@ -60,8 +60,8 @@ yy12: default: goto yy10; } yy13: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy4; default: goto yy10; } @@ -1062,8 +1062,8 @@ yy33: default: goto yy29; } yy34: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -1616,8 +1616,8 @@ yy51: default: goto yy48; } yy52: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy39; default: goto yy48; } @@ -2332,8 +2332,8 @@ yy70: default: goto yy66; } yy71: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -2888,8 +2888,8 @@ yy86: default: goto yy84; } yy87: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy76; default: goto yy84; } @@ -3452,8 +3452,8 @@ yy103: default: goto yy100; } yy104: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -3859,8 +3859,8 @@ yy119: default: goto yy116; } yy120: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy109; default: goto yy116; } @@ -4722,8 +4722,8 @@ yy140: default: goto yy136; } yy141: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -5276,8 +5276,8 @@ yy158: default: goto yy155; } yy159: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy146; default: goto yy155; } @@ -5992,8 +5992,8 @@ yy177: default: goto yy173; } yy178: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -6122,8 +6122,8 @@ yy191: default: goto yy189; } yy192: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy183; default: goto yy189; } @@ -7124,8 +7124,8 @@ yy212: default: goto yy208; } yy213: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -7761,8 +7761,8 @@ yy227: YYCURSOR = YYMARKER; goto yy217; yy228: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -8412,8 +8412,8 @@ yy248: YYCURSOR = YYMARKER; goto yy238; yy249: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -8912,8 +8912,8 @@ yy271: default: goto yy269; } yy272: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -9587,8 +9587,8 @@ yy286: default: goto yy285; } yy287: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -10028,8 +10028,8 @@ yy301: default: goto yy300; } yy302: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -10545,8 +10545,8 @@ yy314: YYCURSOR = YYMARKER; goto yy308; yy315: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -10992,8 +10992,8 @@ yy329: default: goto yy328; } yy330: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -11509,8 +11509,8 @@ yy342: YYCURSOR = YYMARKER; goto yy336; yy343: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -11954,8 +11954,8 @@ yy359: default: goto yy357; } yy360: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -12629,8 +12629,8 @@ yy374: default: goto yy373; } yy375: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -13138,8 +13138,8 @@ yy390: default: goto yy388; } yy391: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy380; default: goto yy388; } @@ -13702,8 +13702,8 @@ yy407: default: goto yy404; } yy408: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -13832,8 +13832,8 @@ yy421: default: goto yy419; } yy422: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy413; default: goto yy419; } @@ -14834,8 +14834,8 @@ yy442: default: goto yy438; } yy443: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -14964,8 +14964,8 @@ yy456: default: goto yy454; } yy457: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy448; default: goto yy454; } @@ -15966,8 +15966,8 @@ yy477: default: goto yy473; } yy478: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -16520,8 +16520,8 @@ yy495: default: goto yy492; } yy496: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy483; default: goto yy492; } @@ -17236,8 +17236,8 @@ yy514: default: goto yy510; } yy515: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -17643,8 +17643,8 @@ yy530: default: goto yy527; } yy531: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy520; default: goto yy527; } @@ -18506,8 +18506,8 @@ yy551: default: goto yy547; } yy552: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -19062,8 +19062,8 @@ yy567: default: goto yy565; } yy568: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy557; default: goto yy565; } @@ -19626,8 +19626,8 @@ yy584: default: goto yy581; } yy585: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -20033,8 +20033,8 @@ yy600: default: goto yy597; } yy601: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy590; default: goto yy597; } @@ -20896,8 +20896,8 @@ yy621: default: goto yy617; } yy622: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -21026,8 +21026,8 @@ yy635: default: goto yy633; } yy636: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy627; default: goto yy633; } @@ -22028,8 +22028,8 @@ yy656: default: goto yy652; } yy657: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -22158,8 +22158,8 @@ yy670: default: goto yy668; } yy671: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy662; default: goto yy668; } @@ -23160,8 +23160,8 @@ yy691: default: goto yy687; } yy692: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -23714,8 +23714,8 @@ yy709: default: goto yy706; } yy710: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy697; default: goto yy706; } @@ -24430,8 +24430,8 @@ yy728: default: goto yy724; } yy729: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -24986,8 +24986,8 @@ yy744: default: goto yy742; } yy745: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy734; default: goto yy742; } @@ -25550,8 +25550,8 @@ yy761: default: goto yy758; } yy762: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -25957,8 +25957,8 @@ yy777: default: goto yy774; } yy778: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy767; default: goto yy774; } @@ -26820,8 +26820,8 @@ yy798: default: goto yy794; } yy799: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -26950,8 +26950,8 @@ yy812: default: goto yy810; } yy813: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy804; default: goto yy810; } @@ -27952,8 +27952,8 @@ yy833: default: goto yy829; } yy834: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -28082,8 +28082,8 @@ yy847: default: goto yy845; } yy848: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy839; default: goto yy845; } @@ -29084,8 +29084,8 @@ yy868: default: goto yy864; } yy869: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -29214,8 +29214,8 @@ yy882: default: goto yy880; } yy883: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy874; default: goto yy880; } @@ -30216,8 +30216,8 @@ yy903: default: goto yy899; } yy904: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -30346,8 +30346,8 @@ yy917: default: goto yy915; } yy918: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy909; default: goto yy915; } @@ -31348,8 +31348,8 @@ yy938: default: goto yy934; } yy939: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -31478,8 +31478,8 @@ yy952: default: goto yy950; } yy953: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy944; default: goto yy950; } @@ -32480,8 +32480,8 @@ yy973: default: goto yy969; } yy974: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -32610,8 +32610,8 @@ yy987: default: goto yy985; } yy988: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy979; default: goto yy985; } @@ -33612,8 +33612,8 @@ yy1008: default: goto yy1004; } yy1009: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -33742,8 +33742,8 @@ yy1022: default: goto yy1020; } yy1023: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1014; default: goto yy1020; } @@ -34744,8 +34744,8 @@ yy1043: default: goto yy1039; } yy1044: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -34874,8 +34874,8 @@ yy1057: default: goto yy1055; } yy1058: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1049; default: goto yy1055; } @@ -35876,8 +35876,8 @@ yy1078: default: goto yy1074; } yy1079: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -36006,8 +36006,8 @@ yy1092: default: goto yy1090; } yy1093: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1084; default: goto yy1090; } @@ -37008,8 +37008,8 @@ yy1113: default: goto yy1109; } yy1114: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -37138,8 +37138,8 @@ yy1127: default: goto yy1125; } yy1128: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1119; default: goto yy1125; } @@ -38140,8 +38140,8 @@ yy1148: default: goto yy1144; } yy1149: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -38270,8 +38270,8 @@ yy1162: default: goto yy1160; } yy1163: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1154; default: goto yy1160; } @@ -39272,8 +39272,8 @@ yy1183: default: goto yy1179; } yy1184: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -39402,8 +39402,8 @@ yy1197: default: goto yy1195; } yy1198: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1189; default: goto yy1195; } @@ -40404,8 +40404,8 @@ yy1218: default: goto yy1214; } yy1219: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -40534,8 +40534,8 @@ yy1232: default: goto yy1230; } yy1233: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1224; default: goto yy1230; } @@ -41536,8 +41536,8 @@ yy1253: default: goto yy1249; } yy1254: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -41666,8 +41666,8 @@ yy1267: default: goto yy1265; } yy1268: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1259; default: goto yy1265; } @@ -42668,8 +42668,8 @@ yy1288: default: goto yy1284; } yy1289: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -42798,8 +42798,8 @@ yy1302: default: goto yy1300; } yy1303: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1294; default: goto yy1300; } @@ -43800,8 +43800,8 @@ yy1323: default: goto yy1319; } yy1324: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -43930,8 +43930,8 @@ yy1337: default: goto yy1335; } yy1338: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1329; default: goto yy1335; } @@ -44932,8 +44932,8 @@ yy1358: default: goto yy1354; } yy1359: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -45062,8 +45062,8 @@ yy1372: default: goto yy1370; } yy1373: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1364; default: goto yy1370; } @@ -46064,8 +46064,8 @@ yy1393: default: goto yy1389; } yy1394: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -46194,8 +46194,8 @@ yy1407: default: goto yy1405; } yy1408: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1399; default: goto yy1405; } @@ -47196,8 +47196,8 @@ yy1428: default: goto yy1424; } yy1429: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -47326,8 +47326,8 @@ yy1442: default: goto yy1440; } yy1443: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1434; default: goto yy1440; } @@ -48328,8 +48328,8 @@ yy1463: default: goto yy1459; } yy1464: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -48458,8 +48458,8 @@ yy1477: default: goto yy1475; } yy1478: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1469; default: goto yy1475; } @@ -49460,8 +49460,8 @@ yy1498: default: goto yy1494; } yy1499: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -49590,8 +49590,8 @@ yy1512: default: goto yy1510; } yy1513: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1504; default: goto yy1510; } @@ -50592,8 +50592,8 @@ yy1533: default: goto yy1529; } yy1534: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -50722,8 +50722,8 @@ yy1547: default: goto yy1545; } yy1548: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1539; default: goto yy1545; } @@ -51724,8 +51724,8 @@ yy1568: default: goto yy1564; } yy1569: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -51854,8 +51854,8 @@ yy1582: default: goto yy1580; } yy1583: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1574; default: goto yy1580; } @@ -52856,8 +52856,8 @@ yy1603: default: goto yy1599; } yy1604: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -52986,8 +52986,8 @@ yy1617: default: goto yy1615; } yy1618: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1609; default: goto yy1615; } @@ -53988,8 +53988,8 @@ yy1638: default: goto yy1634; } yy1639: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -54625,8 +54625,8 @@ yy1653: YYCURSOR = YYMARKER; goto yy1643; yy1654: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -54769,8 +54769,8 @@ yy1673: default: goto yy1671; } yy1674: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1665; default: goto yy1671; } @@ -55771,8 +55771,8 @@ yy1694: default: goto yy1690; } yy1695: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -55901,8 +55901,8 @@ yy1708: default: goto yy1706; } yy1709: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1700; default: goto yy1706; } @@ -56903,8 +56903,8 @@ yy1729: default: goto yy1725; } yy1730: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -57033,8 +57033,8 @@ yy1743: default: goto yy1741; } yy1744: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1735; default: goto yy1741; } @@ -58035,8 +58035,8 @@ yy1764: default: goto yy1760; } yy1765: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -58589,8 +58589,8 @@ yy1782: default: goto yy1779; } yy1783: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1770; default: goto yy1779; } @@ -59305,8 +59305,8 @@ yy1801: default: goto yy1797; } yy1802: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -59793,8 +59793,8 @@ yy1816: default: goto yy1815; } yy1817: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -60310,8 +60310,8 @@ yy1829: YYCURSOR = YYMARKER; goto yy1823; yy1830: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -60906,8 +60906,8 @@ yy1844: YYCURSOR = YYMARKER; goto yy1834; yy1845: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -61474,8 +61474,8 @@ yy1868: default: goto yy1865; } yy1869: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1856; default: goto yy1865; } @@ -62190,8 +62190,8 @@ yy1887: default: goto yy1883; } yy1888: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -62597,8 +62597,8 @@ yy1903: default: goto yy1900; } yy1904: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1893; default: goto yy1900; } @@ -63460,8 +63460,8 @@ yy1924: default: goto yy1920; } yy1925: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -63867,8 +63867,8 @@ yy1940: default: goto yy1937; } yy1941: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy1930; default: goto yy1937; } @@ -64730,8 +64730,8 @@ yy1961: default: goto yy1957; } yy1962: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -65216,8 +65216,8 @@ yy1978: default: goto yy1976; } yy1979: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -65891,8 +65891,8 @@ yy1993: default: goto yy1992; } yy1994: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -66332,8 +66332,8 @@ yy2008: default: goto yy2007; } yy2009: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -66849,8 +66849,8 @@ yy2021: YYCURSOR = YYMARKER; goto yy2015; yy2022: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -67296,8 +67296,8 @@ yy2036: default: goto yy2035; } yy2037: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -67813,8 +67813,8 @@ yy2049: YYCURSOR = YYMARKER; goto yy2043; yy2050: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -67902,8 +67902,8 @@ yy2063: default: goto yy2061; } yy2064: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy2055; default: goto yy2061; } @@ -68904,8 +68904,8 @@ yy2084: default: goto yy2080; } yy2085: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -69034,8 +69034,8 @@ yy2098: default: goto yy2096; } yy2099: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy2090; default: goto yy2096; } @@ -70036,8 +70036,8 @@ yy2119: default: goto yy2115; } yy2120: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -70166,8 +70166,8 @@ yy2133: default: goto yy2131; } yy2134: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy2125; default: goto yy2131; } @@ -71168,8 +71168,8 @@ yy2154: default: goto yy2150; } yy2155: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -71722,8 +71722,8 @@ yy2172: default: goto yy2169; } yy2173: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy2160; default: goto yy2169; } @@ -72438,8 +72438,8 @@ yy2191: default: goto yy2187; } yy2192: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -73075,8 +73075,8 @@ yy2206: YYCURSOR = YYMARKER; goto yy2196; yy2207: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -73577,8 +73577,8 @@ yy2227: default: goto yy2226; } yy2228: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -74094,8 +74094,8 @@ yy2240: YYCURSOR = YYMARKER; goto yy2234; yy2241: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -74607,8 +74607,8 @@ yy2258: default: goto yy2255; } yy2259: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy2246; default: goto yy2255; } @@ -75323,8 +75323,8 @@ yy2277: default: goto yy2273; } yy2278: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -75879,8 +75879,8 @@ yy2293: default: goto yy2291; } yy2294: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy2283; default: goto yy2291; } @@ -76443,8 +76443,8 @@ yy2310: default: goto yy2307; } yy2311: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -76999,8 +76999,8 @@ yy2326: default: goto yy2324; } yy2327: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy2316; default: goto yy2324; } @@ -77563,8 +77563,8 @@ yy2343: default: goto yy2340; } yy2344: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -78049,8 +78049,8 @@ yy2360: default: goto yy2358; } yy2361: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -78724,8 +78724,8 @@ yy2375: default: goto yy2374; } yy2376: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -79314,8 +79314,8 @@ yy2390: YYCURSOR = YYMARKER; goto yy2380; yy2391: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -79814,8 +79814,8 @@ yy2413: default: goto yy2411; } yy2414: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -80489,8 +80489,8 @@ yy2428: default: goto yy2427; } yy2429: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -80572,8 +80572,8 @@ yy2442: default: goto yy2440; } yy2443: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy2434; default: goto yy2440; } @@ -81574,8 +81574,8 @@ yy2463: default: goto yy2459; } yy2464: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -81704,8 +81704,8 @@ yy2477: default: goto yy2475; } yy2478: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy2469; default: goto yy2475; } @@ -82706,8 +82706,8 @@ yy2498: default: goto yy2494; } yy2499: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -82836,8 +82836,8 @@ yy2512: default: goto yy2510; } yy2513: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy2504; default: goto yy2510; } @@ -83838,8 +83838,8 @@ yy2533: default: goto yy2529; } yy2534: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -84245,8 +84245,8 @@ yy2549: default: goto yy2546; } yy2550: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy2539; default: goto yy2546; } @@ -85108,8 +85108,8 @@ yy2570: default: goto yy2566; } yy2571: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -85596,8 +85596,8 @@ yy2585: default: goto yy2584; } yy2586: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -86113,8 +86113,8 @@ yy2598: YYCURSOR = YYMARKER; goto yy2592; yy2599: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -86558,8 +86558,8 @@ yy2615: default: goto yy2613; } yy2616: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -87233,8 +87233,8 @@ yy2630: default: goto yy2629; } yy2631: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -87593,8 +87593,8 @@ yy2646: default: goto yy2643; } yy2647: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy2636; default: goto yy2643; } @@ -88456,8 +88456,8 @@ yy2667: default: goto yy2663; } yy2668: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -89010,8 +89010,8 @@ yy2685: default: goto yy2682; } yy2686: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy2673; default: goto yy2682; } @@ -89726,8 +89726,8 @@ yy2704: default: goto yy2700; } yy2705: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -90280,8 +90280,8 @@ yy2722: default: goto yy2719; } yy2723: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy2710; default: goto yy2719; } @@ -90996,8 +90996,8 @@ yy2741: default: goto yy2737; } yy2742: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -91633,8 +91633,8 @@ yy2756: YYCURSOR = YYMARKER; goto yy2746; yy2757: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -92135,8 +92135,8 @@ yy2777: default: goto yy2776; } yy2778: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -92652,8 +92652,8 @@ yy2790: YYCURSOR = YYMARKER; goto yy2784; yy2791: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -93099,8 +93099,8 @@ yy2805: default: goto yy2804; } yy2806: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -93616,8 +93616,8 @@ yy2818: YYCURSOR = YYMARKER; goto yy2812; yy2819: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -93705,8 +93705,8 @@ yy2832: default: goto yy2830; } yy2833: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy2824; default: goto yy2830; } @@ -94707,8 +94707,8 @@ yy2853: default: goto yy2849; } yy2854: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -94837,8 +94837,8 @@ yy2867: default: goto yy2865; } yy2868: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy2859; default: goto yy2865; } @@ -95839,8 +95839,8 @@ yy2888: default: goto yy2884; } yy2889: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -95969,8 +95969,8 @@ yy2902: default: goto yy2900; } yy2903: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy2894; default: goto yy2900; } @@ -96971,8 +96971,8 @@ yy2923: default: goto yy2919; } yy2924: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -97378,8 +97378,8 @@ yy2939: default: goto yy2936; } yy2940: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy2929; default: goto yy2936; } @@ -98241,8 +98241,8 @@ yy2960: default: goto yy2956; } yy2961: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -98727,8 +98727,8 @@ yy2977: default: goto yy2975; } yy2978: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -99402,8 +99402,8 @@ yy2992: default: goto yy2991; } yy2993: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -99843,8 +99843,8 @@ yy3007: default: goto yy3006; } yy3008: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -100360,8 +100360,8 @@ yy3020: YYCURSOR = YYMARKER; goto yy3014; yy3021: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -100726,8 +100726,8 @@ yy3036: default: goto yy3033; } yy3037: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy3026; default: goto yy3033; } @@ -101589,8 +101589,8 @@ yy3057: default: goto yy3053; } yy3058: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -102145,8 +102145,8 @@ yy3073: default: goto yy3071; } yy3074: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy3063; default: goto yy3071; } @@ -102709,8 +102709,8 @@ yy3090: default: goto yy3087; } yy3091: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -103265,8 +103265,8 @@ yy3106: default: goto yy3104; } yy3107: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy3096; default: goto yy3104; } @@ -103829,8 +103829,8 @@ yy3123: default: goto yy3120; } yy3124: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -104466,8 +104466,8 @@ yy3138: YYCURSOR = YYMARKER; goto yy3128; yy3139: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -104966,8 +104966,8 @@ yy3161: default: goto yy3159; } yy3162: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -105641,8 +105641,8 @@ yy3176: default: goto yy3175; } yy3177: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -106080,8 +106080,8 @@ yy3193: default: goto yy3191; } yy3194: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -106755,8 +106755,8 @@ yy3208: default: goto yy3207; } yy3209: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -106838,8 +106838,8 @@ yy3222: default: goto yy3220; } yy3223: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy3214; default: goto yy3220; } @@ -107840,8 +107840,8 @@ yy3243: default: goto yy3239; } yy3244: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -107970,8 +107970,8 @@ yy3257: default: goto yy3255; } yy3258: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy3249; default: goto yy3255; } @@ -108972,8 +108972,8 @@ yy3278: default: goto yy3274; } yy3279: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -109102,8 +109102,8 @@ yy3292: default: goto yy3290; } yy3293: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy3284; default: goto yy3290; } @@ -110104,8 +110104,8 @@ yy3313: default: goto yy3309; } yy3314: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -110660,8 +110660,8 @@ yy3329: default: goto yy3327; } yy3330: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy3319; default: goto yy3327; } @@ -111224,8 +111224,8 @@ yy3346: default: goto yy3343; } yy3347: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -111861,8 +111861,8 @@ yy3361: YYCURSOR = YYMARKER; goto yy3351; yy3362: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -112361,8 +112361,8 @@ yy3384: default: goto yy3382; } yy3385: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -113036,8 +113036,8 @@ yy3399: default: goto yy3398; } yy3400: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -113545,8 +113545,8 @@ yy3415: default: goto yy3413; } yy3416: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy3405; default: goto yy3413; } @@ -114109,8 +114109,8 @@ yy3432: default: goto yy3429; } yy3433: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -114663,8 +114663,8 @@ yy3450: default: goto yy3447; } yy3451: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy3438; default: goto yy3447; } @@ -115379,8 +115379,8 @@ yy3469: default: goto yy3465; } yy3470: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -115933,8 +115933,8 @@ yy3487: default: goto yy3484; } yy3488: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy3475; default: goto yy3484; } @@ -116649,8 +116649,8 @@ yy3506: default: goto yy3502; } yy3507: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -117137,8 +117137,8 @@ yy3521: default: goto yy3520; } yy3522: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -117654,8 +117654,8 @@ yy3534: YYCURSOR = YYMARKER; goto yy3528; yy3535: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -118250,8 +118250,8 @@ yy3549: YYCURSOR = YYMARKER; goto yy3539; yy3550: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -118901,8 +118901,8 @@ yy3570: YYCURSOR = YYMARKER; goto yy3560; yy3571: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -119045,8 +119045,8 @@ yy3590: default: goto yy3588; } yy3591: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy3582; default: goto yy3588; } @@ -120047,8 +120047,8 @@ yy3611: default: goto yy3607; } yy3612: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -120177,8 +120177,8 @@ yy3625: default: goto yy3623; } yy3626: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy3617; default: goto yy3623; } @@ -121179,8 +121179,8 @@ yy3646: default: goto yy3642; } yy3647: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -121309,8 +121309,8 @@ yy3660: default: goto yy3658; } yy3661: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy3652; default: goto yy3658; } @@ -122311,8 +122311,8 @@ yy3681: default: goto yy3677; } yy3682: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -122867,8 +122867,8 @@ yy3697: default: goto yy3695; } yy3698: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy3687; default: goto yy3695; } @@ -123431,8 +123431,8 @@ yy3714: default: goto yy3711; } yy3715: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -123917,8 +123917,8 @@ yy3731: default: goto yy3729; } yy3732: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -124592,8 +124592,8 @@ yy3746: default: goto yy3745; } yy3747: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -125182,8 +125182,8 @@ yy3761: YYCURSOR = YYMARKER; goto yy3751; yy3762: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -125752,8 +125752,8 @@ yy3783: default: goto yy3781; } yy3784: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy3773; default: goto yy3781; } @@ -126316,8 +126316,8 @@ yy3800: default: goto yy3797; } yy3801: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -126723,8 +126723,8 @@ yy3816: default: goto yy3813; } yy3817: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy3806; default: goto yy3813; } @@ -127586,8 +127586,8 @@ yy3837: default: goto yy3833; } yy3838: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -127993,8 +127993,8 @@ yy3853: default: goto yy3850; } yy3854: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0xBF: goto yy3843; default: goto yy3850; } @@ -128856,8 +128856,8 @@ yy3874: default: goto yy3870; } yy3875: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -129344,8 +129344,8 @@ yy3889: default: goto yy3888; } yy3890: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -129861,8 +129861,8 @@ yy3902: YYCURSOR = YYMARKER; goto yy3896; yy3903: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -130306,8 +130306,8 @@ yy3919: default: goto yy3917; } yy3920: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -130981,8 +130981,8 @@ yy3934: default: goto yy3933; } yy3935: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: diff --git a/test/cmmap.c b/test/cmmap.c index 04d7ac8..0f93466 100644 --- a/test/cmmap.c +++ b/test/cmmap.c @@ -246,8 +246,8 @@ yy7: } #line 248 "cmmap.c" yy9: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy81; default: goto yy10; } @@ -263,8 +263,8 @@ yy11: default: goto yy84; } yy12: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy89; default: goto yy13; } @@ -273,8 +273,8 @@ yy13: { RET('%'); } #line 275 "cmmap.c" yy14: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '&': goto yy91; case '=': goto yy93; default: goto yy15; @@ -301,8 +301,8 @@ yy19: { RET(')'); } #line 303 "cmmap.c" yy21: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy99; default: goto yy22; } @@ -311,8 +311,8 @@ yy22: { RET('*'); } #line 313 "cmmap.c" yy23: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '+': goto yy101; case '=': goto yy103; default: goto yy24; @@ -327,8 +327,8 @@ yy25: { RET(','); } #line 329 "cmmap.c" yy27: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '-': goto yy105; case '=': goto yy107; case '>': goto yy109; @@ -360,8 +360,8 @@ yy30: { RET('.'); } #line 362 "cmmap.c" yy31: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '*': goto yy115; case '=': goto yy117; default: goto yy32; @@ -374,36 +374,20 @@ yy33: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case '.': goto yy112; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': goto yy35; - case 'E': - case 'e': goto yy119; - case 'L': - case 'U': - case 'l': - case 'u': goto yy120; case 'X': case 'x': goto yy122; - default: goto yy34; + default: goto yy36; } yy34: #line 158 "cmmap.re" { RET(ICON); } -#line 402 "cmmap.c" +#line 385 "cmmap.c" yy35: yyaccept = 2; YYMARKER = ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); yych = *YYCURSOR; +yy36: switch (yych) { case '.': goto yy112; case '0': @@ -428,15 +412,15 @@ yy37: ++YYCURSOR; #line 192 "cmmap.re" { RET(':'); } -#line 432 "cmmap.c" +#line 416 "cmmap.c" yy39: ++YYCURSOR; #line 188 "cmmap.re" { RET(';'); } -#line 437 "cmmap.c" +#line 421 "cmmap.c" yy41: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '<': goto yy123; case '=': goto yy125; default: goto yy42; @@ -444,20 +428,20 @@ yy41: yy42: #line 207 "cmmap.re" { RET('<'); } -#line 448 "cmmap.c" +#line 432 "cmmap.c" yy43: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy127; default: goto yy44; } yy44: #line 193 "cmmap.re" { RET('='); } -#line 458 "cmmap.c" +#line 442 "cmmap.c" yy45: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy129; case '>': goto yy131; default: goto yy46; @@ -465,12 +449,12 @@ yy45: yy46: #line 208 "cmmap.re" { RET('>'); } -#line 469 "cmmap.c" +#line 453 "cmmap.c" yy47: ++YYCURSOR; #line 211 "cmmap.re" { RET('?'); } -#line 474 "cmmap.c" +#line 458 "cmmap.c" yy49: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -545,27 +529,27 @@ yy50: yy51: #line 154 "cmmap.re" { RET(ID); } -#line 549 "cmmap.c" +#line 533 "cmmap.c" yy52: ++YYCURSOR; #line 196 "cmmap.re" { RET('['); } -#line 554 "cmmap.c" +#line 538 "cmmap.c" yy54: ++YYCURSOR; #line 197 "cmmap.re" { RET(']'); } -#line 559 "cmmap.c" +#line 543 "cmmap.c" yy56: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy133; default: goto yy57; } yy57: #line 209 "cmmap.re" { RET('^'); } -#line 569 "cmmap.c" +#line 553 "cmmap.c" yy58: yych = *++YYCURSOR; switch (yych) { @@ -670,10 +654,10 @@ yy73: ++YYCURSOR; #line 189 "cmmap.re" { RET('{'); } -#line 674 "cmmap.c" +#line 658 "cmmap.c" yy75: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy162; case '|': goto yy164; default: goto yy76; @@ -681,22 +665,22 @@ yy75: yy76: #line 210 "cmmap.re" { RET('|'); } -#line 685 "cmmap.c" +#line 669 "cmmap.c" yy77: ++YYCURSOR; #line 190 "cmmap.re" { RET('}'); } -#line 690 "cmmap.c" +#line 674 "cmmap.c" yy79: ++YYCURSOR; #line 201 "cmmap.re" { RET('~'); } -#line 695 "cmmap.c" +#line 679 "cmmap.c" yy81: ++YYCURSOR; #line 187 "cmmap.re" { RET(NEQ); } -#line 700 "cmmap.c" +#line 684 "cmmap.c" yy83: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -720,7 +704,7 @@ yy86: ++YYCURSOR; #line 164 "cmmap.re" { RET(SCON); } -#line 724 "cmmap.c" +#line 708 "cmmap.c" yy88: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -752,17 +736,17 @@ yy89: ++YYCURSOR; #line 173 "cmmap.re" { RET(MODEQ); } -#line 756 "cmmap.c" +#line 740 "cmmap.c" yy91: ++YYCURSOR; #line 182 "cmmap.re" { RET(ANDAND); } -#line 761 "cmmap.c" +#line 745 "cmmap.c" yy93: ++YYCURSOR; #line 174 "cmmap.re" { RET(ANDEQ); } -#line 766 "cmmap.c" +#line 750 "cmmap.c" yy95: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -775,7 +759,7 @@ yy96: default: goto yy95; } yy97: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy34; yy98: ++YYCURSOR; @@ -808,32 +792,32 @@ yy99: ++YYCURSOR; #line 171 "cmmap.re" { RET(MULEQ); } -#line 812 "cmmap.c" +#line 796 "cmmap.c" yy101: ++YYCURSOR; #line 179 "cmmap.re" { RET(INCR); } -#line 817 "cmmap.c" +#line 801 "cmmap.c" yy103: ++YYCURSOR; #line 169 "cmmap.re" { RET(ADDEQ); } -#line 822 "cmmap.c" +#line 806 "cmmap.c" yy105: ++YYCURSOR; #line 180 "cmmap.re" { RET(DECR); } -#line 827 "cmmap.c" +#line 811 "cmmap.c" yy107: ++YYCURSOR; #line 170 "cmmap.re" { RET(SUBEQ); } -#line 832 "cmmap.c" +#line 816 "cmmap.c" yy109: ++YYCURSOR; #line 181 "cmmap.re" { RET(DEREF); } -#line 837 "cmmap.c" +#line 821 "cmmap.c" yy111: yych = *++YYCURSOR; switch (yych) { @@ -867,17 +851,17 @@ yy112: yy114: #line 161 "cmmap.re" { RET(FCON); } -#line 871 "cmmap.c" +#line 855 "cmmap.c" yy115: ++YYCURSOR; #line 119 "cmmap.re" { goto comment; } -#line 876 "cmmap.c" +#line 860 "cmmap.c" yy117: ++YYCURSOR; #line 172 "cmmap.re" { RET(DIVEQ); } -#line 881 "cmmap.c" +#line 865 "cmmap.c" yy119: yych = *++YYCURSOR; switch (yych) { @@ -934,45 +918,45 @@ yy122: default: goto yy85; } yy123: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy176; default: goto yy124; } yy124: #line 178 "cmmap.re" { RET(LSHIFT); } -#line 946 "cmmap.c" +#line 930 "cmmap.c" yy125: ++YYCURSOR; #line 184 "cmmap.re" { RET(LEQ); } -#line 951 "cmmap.c" +#line 935 "cmmap.c" yy127: ++YYCURSOR; #line 186 "cmmap.re" { RET(EQL); } -#line 956 "cmmap.c" +#line 940 "cmmap.c" yy129: ++YYCURSOR; #line 185 "cmmap.re" { RET(GEQ); } -#line 961 "cmmap.c" +#line 945 "cmmap.c" yy131: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy178; default: goto yy132; } yy132: #line 177 "cmmap.re" { RET(RSHIFT); } -#line 971 "cmmap.c" +#line 955 "cmmap.c" yy133: ++YYCURSOR; #line 175 "cmmap.re" { RET(XOREQ); } -#line 976 "cmmap.c" +#line 960 "cmmap.c" yy135: yych = *++YYCURSOR; switch (yych) { @@ -1010,8 +994,8 @@ yy140: default: goto yy50; } yy141: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1080,7 +1064,7 @@ yy141: yy142: #line 128 "cmmap.re" { RET(DO); } -#line 1084 "cmmap.c" +#line 1068 "cmmap.c" yy143: yych = *++YYCURSOR; switch (yych) { @@ -1118,8 +1102,8 @@ yy148: default: goto yy50; } yy149: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1188,7 +1172,7 @@ yy149: yy150: #line 136 "cmmap.re" { RET(IF); } -#line 1192 "cmmap.c" +#line 1176 "cmmap.c" yy151: yych = *++YYCURSOR; switch (yych) { @@ -1264,12 +1248,12 @@ yy162: ++YYCURSOR; #line 176 "cmmap.re" { RET(OREQ); } -#line 1268 "cmmap.c" +#line 1252 "cmmap.c" yy164: ++YYCURSOR; #line 183 "cmmap.re" { RET(OROR); } -#line 1273 "cmmap.c" +#line 1257 "cmmap.c" yy166: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -1332,9 +1316,9 @@ yy168: ++YYCURSOR; #line 166 "cmmap.re" { RET(ELLIPSIS); } -#line 1336 "cmmap.c" +#line 1320 "cmmap.c" yy170: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy114; yy171: yych = *++YYCURSOR; @@ -1409,12 +1393,12 @@ yy176: ++YYCURSOR; #line 168 "cmmap.re" { RET(LSHIFTEQ); } -#line 1413 "cmmap.c" +#line 1397 "cmmap.c" yy178: ++YYCURSOR; #line 167 "cmmap.re" { RET(RSHIFTEQ); } -#line 1418 "cmmap.c" +#line 1402 "cmmap.c" yy180: yych = *++YYCURSOR; switch (yych) { @@ -1483,8 +1467,8 @@ yy190: default: goto yy50; } yy191: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1553,7 +1537,7 @@ yy191: yy192: #line 134 "cmmap.re" { RET(FOR); } -#line 1557 "cmmap.c" +#line 1541 "cmmap.c" yy193: yych = *++YYCURSOR; switch (yych) { @@ -1561,8 +1545,8 @@ yy193: default: goto yy50; } yy194: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1631,7 +1615,7 @@ yy194: yy195: #line 137 "cmmap.re" { RET(INT); } -#line 1635 "cmmap.c" +#line 1619 "cmmap.c" yy196: yych = *++YYCURSOR; switch (yych) { @@ -1723,8 +1707,8 @@ yy210: default: goto yy50; } yy211: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1793,7 +1777,7 @@ yy211: yy212: #line 121 "cmmap.re" { RET(AUTO); } -#line 1797 "cmmap.c" +#line 1781 "cmmap.c" yy213: yych = *++YYCURSOR; switch (yych) { @@ -1801,8 +1785,8 @@ yy213: default: goto yy50; } yy214: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1871,10 +1855,10 @@ yy214: yy215: #line 123 "cmmap.re" { RET(CASE); } -#line 1875 "cmmap.c" +#line 1859 "cmmap.c" yy216: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1943,7 +1927,7 @@ yy216: yy217: #line 124 "cmmap.re" { RET(CHAR); } -#line 1947 "cmmap.c" +#line 1931 "cmmap.c" yy218: yych = *++YYCURSOR; switch (yych) { @@ -1969,8 +1953,8 @@ yy221: default: goto yy50; } yy222: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2039,10 +2023,10 @@ yy222: yy223: #line 130 "cmmap.re" { RET(ELSE); } -#line 2043 "cmmap.c" +#line 2027 "cmmap.c" yy224: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2111,7 +2095,7 @@ yy224: yy225: #line 131 "cmmap.re" { RET(ENUM); } -#line 2115 "cmmap.c" +#line 2099 "cmmap.c" yy226: yych = *++YYCURSOR; switch (yych) { @@ -2125,8 +2109,8 @@ yy227: default: goto yy50; } yy228: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2195,10 +2179,10 @@ yy228: yy229: #line 135 "cmmap.re" { RET(GOTO); } -#line 2199 "cmmap.c" +#line 2183 "cmmap.c" yy230: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2267,7 +2251,7 @@ yy230: yy231: #line 138 "cmmap.re" { RET(LONG); } -#line 2271 "cmmap.c" +#line 2255 "cmmap.c" yy232: yych = *++YYCURSOR; switch (yych) { @@ -2335,8 +2319,8 @@ yy242: default: goto yy50; } yy243: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2405,7 +2389,7 @@ yy243: yy244: #line 150 "cmmap.re" { RET(VOID); } -#line 2409 "cmmap.c" +#line 2393 "cmmap.c" yy245: yych = *++YYCURSOR; switch (yych) { @@ -2419,8 +2403,8 @@ yy246: default: goto yy50; } yy247: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2489,10 +2473,10 @@ yy247: yy248: #line 122 "cmmap.re" { RET(BREAK); } -#line 2493 "cmmap.c" +#line 2477 "cmmap.c" yy249: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2561,7 +2545,7 @@ yy249: yy250: #line 125 "cmmap.re" { RET(CONST); } -#line 2565 "cmmap.c" +#line 2549 "cmmap.c" yy251: yych = *++YYCURSOR; switch (yych) { @@ -2587,8 +2571,8 @@ yy254: default: goto yy50; } yy255: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2657,7 +2641,7 @@ yy255: yy256: #line 133 "cmmap.re" { RET(FLOAT); } -#line 2661 "cmmap.c" +#line 2645 "cmmap.c" yy257: yych = *++YYCURSOR; switch (yych) { @@ -2671,8 +2655,8 @@ yy258: default: goto yy50; } yy259: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2741,7 +2725,7 @@ yy259: yy260: #line 141 "cmmap.re" { RET(SHORT); } -#line 2745 "cmmap.c" +#line 2729 "cmmap.c" yy261: yych = *++YYCURSOR; switch (yych) { @@ -2779,8 +2763,8 @@ yy266: default: goto yy50; } yy267: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2849,7 +2833,7 @@ yy267: yy268: #line 148 "cmmap.re" { RET(UNION); } -#line 2853 "cmmap.c" +#line 2837 "cmmap.c" yy269: yych = *++YYCURSOR; switch (yych) { @@ -2863,8 +2847,8 @@ yy270: default: goto yy50; } yy271: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2933,7 +2917,7 @@ yy271: yy272: #line 152 "cmmap.re" { RET(WHILE); } -#line 2937 "cmmap.c" +#line 2921 "cmmap.c" yy273: yych = *++YYCURSOR; switch (yych) { @@ -2947,8 +2931,8 @@ yy274: default: goto yy50; } yy275: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3017,10 +3001,10 @@ yy275: yy276: #line 129 "cmmap.re" { RET(DOUBLE); } -#line 3021 "cmmap.c" +#line 3005 "cmmap.c" yy277: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3089,7 +3073,7 @@ yy277: yy278: #line 132 "cmmap.re" { RET(EXTERN); } -#line 3093 "cmmap.c" +#line 3077 "cmmap.c" yy279: yych = *++YYCURSOR; switch (yych) { @@ -3097,8 +3081,8 @@ yy279: default: goto yy50; } yy280: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3167,10 +3151,10 @@ yy280: yy281: #line 140 "cmmap.re" { RET(RETURN); } -#line 3171 "cmmap.c" +#line 3155 "cmmap.c" yy282: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3239,10 +3223,10 @@ yy282: yy283: #line 142 "cmmap.re" { RET(SIGNED); } -#line 3243 "cmmap.c" +#line 3227 "cmmap.c" yy284: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3311,10 +3295,10 @@ yy284: yy285: #line 143 "cmmap.re" { RET(SIZEOF); } -#line 3315 "cmmap.c" +#line 3299 "cmmap.c" yy286: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3383,10 +3367,10 @@ yy286: yy287: #line 144 "cmmap.re" { RET(STATIC); } -#line 3387 "cmmap.c" +#line 3371 "cmmap.c" yy288: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3455,10 +3439,10 @@ yy288: yy289: #line 145 "cmmap.re" { RET(STRUCT); } -#line 3459 "cmmap.c" +#line 3443 "cmmap.c" yy290: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3527,7 +3511,7 @@ yy290: yy291: #line 146 "cmmap.re" { RET(SWITCH); } -#line 3531 "cmmap.c" +#line 3515 "cmmap.c" yy292: yych = *++YYCURSOR; switch (yych) { @@ -3553,8 +3537,8 @@ yy295: default: goto yy50; } yy296: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3623,7 +3607,7 @@ yy296: yy297: #line 127 "cmmap.re" { RET(DEFAULT); } -#line 3627 "cmmap.c" +#line 3611 "cmmap.c" yy298: yych = *++YYCURSOR; switch (yych) { @@ -3631,8 +3615,8 @@ yy298: default: goto yy50; } yy299: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3701,7 +3685,7 @@ yy299: yy300: #line 147 "cmmap.re" { RET(TYPEDEF); } -#line 3705 "cmmap.c" +#line 3689 "cmmap.c" yy301: yych = *++YYCURSOR; switch (yych) { @@ -3715,8 +3699,8 @@ yy302: default: goto yy50; } yy303: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3785,10 +3769,10 @@ yy303: yy304: #line 126 "cmmap.re" { RET(CONTINUE); } -#line 3789 "cmmap.c" +#line 3773 "cmmap.c" yy305: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3857,10 +3841,10 @@ yy305: yy306: #line 139 "cmmap.re" { RET(REGISTER); } -#line 3861 "cmmap.c" +#line 3845 "cmmap.c" yy307: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3929,10 +3913,10 @@ yy307: yy308: #line 149 "cmmap.re" { RET(UNSIGNED); } -#line 3933 "cmmap.c" +#line 3917 "cmmap.c" yy309: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -4001,14 +3985,14 @@ yy309: yy310: #line 151 "cmmap.re" { RET(VOLATILE); } -#line 4005 "cmmap.c" +#line 3989 "cmmap.c" } #line 228 "cmmap.re" comment: -#line 4012 "cmmap.c" +#line 3996 "cmmap.c" { YYCTYPE yych; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); @@ -4023,7 +4007,7 @@ yy313: yy314: #line 239 "cmmap.re" { goto comment; } -#line 4027 "cmmap.c" +#line 4011 "cmmap.c" yy315: ++YYCURSOR; #line 234 "cmmap.re" @@ -4032,7 +4016,7 @@ yy315: s->tok = s->pos = cursor; s->line++; goto comment; } -#line 4036 "cmmap.c" +#line 4020 "cmmap.c" yy317: yych = *++YYCURSOR; switch (yych) { @@ -4043,7 +4027,7 @@ yy318: ++YYCURSOR; #line 232 "cmmap.re" { goto std; } -#line 4047 "cmmap.c" +#line 4031 "cmmap.c" } #line 240 "cmmap.re" diff --git a/test/cnokw.c b/test/cnokw.c index 789507c..6b99d29 100644 --- a/test/cnokw.c +++ b/test/cnokw.c @@ -263,8 +263,8 @@ yy7: } #line 265 "cnokw.c" yy9: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy66; default: goto yy10; } @@ -280,8 +280,8 @@ yy11: default: goto yy69; } yy12: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy74; default: goto yy13; } @@ -290,8 +290,8 @@ yy13: { RET('%'); } #line 292 "cnokw.c" yy14: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '&': goto yy76; case '=': goto yy78; default: goto yy15; @@ -318,8 +318,8 @@ yy19: { RET(')'); } #line 320 "cnokw.c" yy21: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy84; default: goto yy22; } @@ -328,8 +328,8 @@ yy22: { RET('*'); } #line 330 "cnokw.c" yy23: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '+': goto yy86; case '=': goto yy88; default: goto yy24; @@ -344,8 +344,8 @@ yy25: { RET(','); } #line 346 "cnokw.c" yy27: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '-': goto yy90; case '=': goto yy92; case '>': goto yy94; @@ -377,8 +377,8 @@ yy30: { RET('.'); } #line 379 "cnokw.c" yy31: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '*': goto yy100; case '=': goto yy102; default: goto yy32; @@ -391,36 +391,20 @@ yy33: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case '.': goto yy97; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': goto yy35; - case 'E': - case 'e': goto yy104; - case 'L': - case 'U': - case 'l': - case 'u': goto yy105; case 'X': case 'x': goto yy107; - default: goto yy34; + default: goto yy36; } yy34: #line 142 "cnokw.re" { RET(ICON); } -#line 419 "cnokw.c" +#line 402 "cnokw.c" yy35: yyaccept = 2; YYMARKER = ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); yych = *YYCURSOR; +yy36: switch (yych) { case '.': goto yy97; case '0': @@ -445,15 +429,15 @@ yy37: ++YYCURSOR; #line 176 "cnokw.re" { RET(':'); } -#line 449 "cnokw.c" +#line 433 "cnokw.c" yy39: ++YYCURSOR; #line 172 "cnokw.re" { RET(';'); } -#line 454 "cnokw.c" +#line 438 "cnokw.c" yy41: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '<': goto yy108; case '=': goto yy110; default: goto yy42; @@ -461,20 +445,20 @@ yy41: yy42: #line 191 "cnokw.re" { RET('<'); } -#line 465 "cnokw.c" +#line 449 "cnokw.c" yy43: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy112; default: goto yy44; } yy44: #line 177 "cnokw.re" { RET('='); } -#line 475 "cnokw.c" +#line 459 "cnokw.c" yy45: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy114; case '>': goto yy116; default: goto yy46; @@ -482,12 +466,12 @@ yy45: yy46: #line 192 "cnokw.re" { RET('>'); } -#line 486 "cnokw.c" +#line 470 "cnokw.c" yy47: ++YYCURSOR; #line 195 "cnokw.re" { RET('?'); } -#line 491 "cnokw.c" +#line 475 "cnokw.c" yy49: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -561,35 +545,35 @@ yy49: yy51: #line 138 "cnokw.re" { RET(ID); } -#line 565 "cnokw.c" +#line 549 "cnokw.c" yy52: ++YYCURSOR; #line 180 "cnokw.re" { RET('['); } -#line 570 "cnokw.c" +#line 554 "cnokw.c" yy54: ++YYCURSOR; #line 181 "cnokw.re" { RET(']'); } -#line 575 "cnokw.c" +#line 559 "cnokw.c" yy56: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy118; default: goto yy57; } yy57: #line 193 "cnokw.re" { RET('^'); } -#line 585 "cnokw.c" +#line 569 "cnokw.c" yy58: ++YYCURSOR; #line 173 "cnokw.re" { RET('{'); } -#line 590 "cnokw.c" +#line 574 "cnokw.c" yy60: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy120; case '|': goto yy122; default: goto yy61; @@ -597,22 +581,22 @@ yy60: yy61: #line 194 "cnokw.re" { RET('|'); } -#line 601 "cnokw.c" +#line 585 "cnokw.c" yy62: ++YYCURSOR; #line 174 "cnokw.re" { RET('}'); } -#line 606 "cnokw.c" +#line 590 "cnokw.c" yy64: ++YYCURSOR; #line 185 "cnokw.re" { RET('~'); } -#line 611 "cnokw.c" +#line 595 "cnokw.c" yy66: ++YYCURSOR; #line 171 "cnokw.re" { RET(NEQ); } -#line 616 "cnokw.c" +#line 600 "cnokw.c" yy68: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -636,7 +620,7 @@ yy71: ++YYCURSOR; #line 148 "cnokw.re" { RET(SCON); } -#line 640 "cnokw.c" +#line 624 "cnokw.c" yy73: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -668,17 +652,17 @@ yy74: ++YYCURSOR; #line 157 "cnokw.re" { RET(MODEQ); } -#line 672 "cnokw.c" +#line 656 "cnokw.c" yy76: ++YYCURSOR; #line 166 "cnokw.re" { RET(ANDAND); } -#line 677 "cnokw.c" +#line 661 "cnokw.c" yy78: ++YYCURSOR; #line 158 "cnokw.re" { RET(ANDEQ); } -#line 682 "cnokw.c" +#line 666 "cnokw.c" yy80: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -691,7 +675,7 @@ yy81: default: goto yy80; } yy82: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy34; yy83: ++YYCURSOR; @@ -724,32 +708,32 @@ yy84: ++YYCURSOR; #line 155 "cnokw.re" { RET(MULEQ); } -#line 728 "cnokw.c" +#line 712 "cnokw.c" yy86: ++YYCURSOR; #line 163 "cnokw.re" { RET(INCR); } -#line 733 "cnokw.c" +#line 717 "cnokw.c" yy88: ++YYCURSOR; #line 153 "cnokw.re" { RET(ADDEQ); } -#line 738 "cnokw.c" +#line 722 "cnokw.c" yy90: ++YYCURSOR; #line 164 "cnokw.re" { RET(DECR); } -#line 743 "cnokw.c" +#line 727 "cnokw.c" yy92: ++YYCURSOR; #line 154 "cnokw.re" { RET(SUBEQ); } -#line 748 "cnokw.c" +#line 732 "cnokw.c" yy94: ++YYCURSOR; #line 165 "cnokw.re" { RET(DEREF); } -#line 753 "cnokw.c" +#line 737 "cnokw.c" yy96: yych = *++YYCURSOR; switch (yych) { @@ -783,17 +767,17 @@ yy97: yy99: #line 145 "cnokw.re" { RET(FCON); } -#line 787 "cnokw.c" +#line 771 "cnokw.c" yy100: ++YYCURSOR; #line 136 "cnokw.re" { goto comment; } -#line 792 "cnokw.c" +#line 776 "cnokw.c" yy102: ++YYCURSOR; #line 156 "cnokw.re" { RET(DIVEQ); } -#line 797 "cnokw.c" +#line 781 "cnokw.c" yy104: yych = *++YYCURSOR; switch (yych) { @@ -850,55 +834,55 @@ yy107: default: goto yy70; } yy108: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy134; default: goto yy109; } yy109: #line 162 "cnokw.re" { RET(LSHIFT); } -#line 862 "cnokw.c" +#line 846 "cnokw.c" yy110: ++YYCURSOR; #line 168 "cnokw.re" { RET(LEQ); } -#line 867 "cnokw.c" +#line 851 "cnokw.c" yy112: ++YYCURSOR; #line 170 "cnokw.re" { RET(EQL); } -#line 872 "cnokw.c" +#line 856 "cnokw.c" yy114: ++YYCURSOR; #line 169 "cnokw.re" { RET(GEQ); } -#line 877 "cnokw.c" +#line 861 "cnokw.c" yy116: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy136; default: goto yy117; } yy117: #line 161 "cnokw.re" { RET(RSHIFT); } -#line 887 "cnokw.c" +#line 871 "cnokw.c" yy118: ++YYCURSOR; #line 159 "cnokw.re" { RET(XOREQ); } -#line 892 "cnokw.c" +#line 876 "cnokw.c" yy120: ++YYCURSOR; #line 160 "cnokw.re" { RET(OREQ); } -#line 897 "cnokw.c" +#line 881 "cnokw.c" yy122: ++YYCURSOR; #line 167 "cnokw.re" { RET(OROR); } -#line 902 "cnokw.c" +#line 886 "cnokw.c" yy124: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -961,9 +945,9 @@ yy126: ++YYCURSOR; #line 150 "cnokw.re" { RET(ELLIPSIS); } -#line 965 "cnokw.c" +#line 949 "cnokw.c" yy128: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy99; yy129: yych = *++YYCURSOR; @@ -1038,19 +1022,19 @@ yy134: ++YYCURSOR; #line 152 "cnokw.re" { RET(LSHIFTEQ); } -#line 1042 "cnokw.c" +#line 1026 "cnokw.c" yy136: ++YYCURSOR; #line 151 "cnokw.re" { RET(RSHIFTEQ); } -#line 1047 "cnokw.c" +#line 1031 "cnokw.c" } #line 212 "cnokw.re" comment: -#line 1054 "cnokw.c" +#line 1038 "cnokw.c" { YYCTYPE yych; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); @@ -1065,7 +1049,7 @@ yy140: yy141: #line 223 "cnokw.re" { goto comment; } -#line 1069 "cnokw.c" +#line 1053 "cnokw.c" yy142: ++YYCURSOR; #line 218 "cnokw.re" @@ -1074,7 +1058,7 @@ yy142: s->tok = s->pos = cursor; s->line++; goto comment; } -#line 1078 "cnokw.c" +#line 1062 "cnokw.c" yy144: yych = *++YYCURSOR; switch (yych) { @@ -1085,7 +1069,7 @@ yy145: ++YYCURSOR; #line 216 "cnokw.re" { goto std; } -#line 1089 "cnokw.c" +#line 1073 "cnokw.c" } #line 224 "cnokw.re" diff --git a/test/code_points.8.c b/test/code_points.8.c index a0a68e8..508b793 100644 --- a/test/code_points.8.c +++ b/test/code_points.8.c @@ -4808,8 +4808,8 @@ yy775: {} #line 4810 "code_points.8.c" yy777: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: @@ -5244,8 +5244,8 @@ yy787: default: goto yy780; } yy788: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: diff --git a/test/code_points.x.c b/test/code_points.x.c index aeb91e7..eede5c2 100644 --- a/test/code_points.x.c +++ b/test/code_points.x.c @@ -1192,8 +1192,8 @@ yy525: {} #line 1194 "code_points.x.c" yy526: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= 0xDBFF) goto yy525; + yych = *++YYCURSOR; + if (yych <= 0xDBFF) goto yy525; if (yych <= 0xDFFF) goto yy524; goto yy525; } diff --git a/test/code_points_error.8.c b/test/code_points_error.8.c index 271b207..10f0abd 100644 --- a/test/code_points_error.8.c +++ b/test/code_points_error.8.c @@ -1 +1 @@ -re2c: error: line 2, column 1: Bad code point: '0x110000' +re2c: error: line 2, column 21: bad code point: '0x110000' diff --git a/test/code_points_error.c b/test/code_points_error.c index 4b4f6b4..d9f68c5 100644 --- a/test/code_points_error.c +++ b/test/code_points_error.c @@ -1 +1 @@ -re2c: error: line 2, column 1: Bad code point: '0xFFFF' +re2c: error: line 2, column 5: bad code point: '0xFFFF' diff --git a/test/code_points_error.e.c b/test/code_points_error.e.c index 4b4f6b4..d9f68c5 100644 --- a/test/code_points_error.e.c +++ b/test/code_points_error.e.c @@ -1 +1 @@ -re2c: error: line 2, column 1: Bad code point: '0xFFFF' +re2c: error: line 2, column 5: bad code point: '0xFFFF' diff --git a/test/code_points_error.u.c b/test/code_points_error.u.c index 271b207..10f0abd 100644 --- a/test/code_points_error.u.c +++ b/test/code_points_error.u.c @@ -1 +1 @@ -re2c: error: line 2, column 1: Bad code point: '0x110000' +re2c: error: line 2, column 21: bad code point: '0x110000' diff --git a/test/code_points_error.w.c b/test/code_points_error.w.c index 66e9e90..54128ff 100644 --- a/test/code_points_error.w.c +++ b/test/code_points_error.w.c @@ -1 +1 @@ -re2c: error: line 2, column 1: Bad code point: '0x10FFFF' +re2c: error: line 2, column 11: bad code point: '0x10FFFF' diff --git a/test/code_points_error.x.c b/test/code_points_error.x.c index 271b207..10f0abd 100644 --- a/test/code_points_error.x.c +++ b/test/code_points_error.x.c @@ -1 +1 @@ -re2c: error: line 2, column 1: Bad code point: '0x110000' +re2c: error: line 2, column 21: bad code point: '0x110000' diff --git a/test/code_points_error_esc.c b/test/code_points_error_esc.c deleted file mode 100644 index 84c9cfd..0000000 --- a/test/code_points_error_esc.c +++ /dev/null @@ -1 +0,0 @@ -re2c: error: line 2, column 6: syntax error in escape sequence diff --git a/test/code_points_error_lf.c b/test/code_points_error_lf.c deleted file mode 100644 index 5919bf6..0000000 --- a/test/code_points_error_lf.c +++ /dev/null @@ -1 +0,0 @@ -re2c: error: line 2, column 6: syntax error diff --git a/test/cond_error_00.c b/test/cond_error_00.c index 7d3ff77..f777865 100644 --- a/test/cond_error_00.c +++ b/test/cond_error_00.c @@ -1 +1 @@ -re2c: error: line 3, column 10: conditions are only allowed when using -c switch +re2c: error: line 3: conditions are only allowed with '-c', '--conditions' option diff --git a/test/cond_error_01.c.c b/test/cond_error_01.c.c index b6bd832..90af544 100644 --- a/test/cond_error_01.c.c +++ b/test/cond_error_01.c.c @@ -1 +1 @@ -re2c: error: line 3, column 2: unnamed condition not supported +re2c: error: line 3: syntax error diff --git a/test/cond_error_02.c.c b/test/cond_error_02.c.c deleted file mode 100644 index 1aff9de..0000000 --- a/test/cond_error_02.c.c +++ /dev/null @@ -1 +0,0 @@ -re2c: error: line 3, column 4: unnamed condition not supported diff --git a/test/cond_error_02.c.re b/test/cond_error_02.c.re deleted file mode 100644 index ae3134b..0000000 --- a/test/cond_error_02.c.re +++ /dev/null @@ -1,5 +0,0 @@ -/*!re2c - -< > "a" { } - -*/ diff --git a/test/cond_error_03.c.c b/test/cond_error_03.c.c index 0e580b0..90af544 100644 --- a/test/cond_error_03.c.c +++ b/test/cond_error_03.c.c @@ -1 +1 @@ -re2c: error: line 3, column 5: no expression specified +re2c: error: line 3: syntax error diff --git a/test/cond_error_04.c.c b/test/cond_error_04.c.c deleted file mode 100644 index b6bd832..0000000 --- a/test/cond_error_04.c.c +++ /dev/null @@ -1 +0,0 @@ -re2c: error: line 3, column 2: unnamed condition not supported diff --git a/test/cond_error_04.c.re b/test/cond_error_04.c.re deleted file mode 100644 index 33e9fff..0000000 --- a/test/cond_error_04.c.re +++ /dev/null @@ -1,5 +0,0 @@ -/*!re2c - -<,> "a" { } - -*/ diff --git a/test/cond_error_05.c.c b/test/cond_error_05.c.c deleted file mode 100644 index b6bd832..0000000 --- a/test/cond_error_05.c.c +++ /dev/null @@ -1 +0,0 @@ -re2c: error: line 3, column 2: unnamed condition not supported diff --git a/test/cond_error_05.c.re b/test/cond_error_05.c.re deleted file mode 100644 index cd5f980..0000000 --- a/test/cond_error_05.c.re +++ /dev/null @@ -1,5 +0,0 @@ -/*!re2c - -<+> "a" { } - -*/ diff --git a/test/cond_error_06.c.c b/test/cond_error_06.c.c deleted file mode 100644 index b6bd832..0000000 --- a/test/cond_error_06.c.c +++ /dev/null @@ -1 +0,0 @@ -re2c: error: line 3, column 2: unnamed condition not supported diff --git a/test/cond_error_06.c.re b/test/cond_error_06.c.re deleted file mode 100644 index 99b8cfa..0000000 --- a/test/cond_error_06.c.re +++ /dev/null @@ -1,5 +0,0 @@ -/*!re2c - - "a" { } - -*/ diff --git a/test/cond_error_07.c.c b/test/cond_error_07.c.c index 24ec535..90af544 100644 --- a/test/cond_error_07.c.c +++ b/test/cond_error_07.c.c @@ -1 +1 @@ -re2c: error: line 3, column 4: syntax error +re2c: error: line 3: syntax error diff --git a/test/cond_error_08.c.c b/test/cond_error_08.c.c index 3d6d32d..5c08988 100644 --- a/test/cond_error_08.c.c +++ b/test/cond_error_08.c.c @@ -1 +1 @@ -re2c: error: line 4, column 4: code to handle illegal condition already defined +re2c: error: line 4: startup code is already defined at line 3 diff --git a/test/cond_error_09.c.c b/test/cond_error_09.c.c index dde066b..45646e1 100644 --- a/test/cond_error_09.c.c +++ b/test/cond_error_09.c.c @@ -1 +1 @@ -re2c: error: line 6, column 6: code to setup rule 'a' is already defined +re2c: error: line 6: code to setup rule 'a' is already defined at line 5 diff --git a/test/cond_error_10.c.c b/test/cond_error_10.c.c index 44e90a1..6beba58 100644 --- a/test/cond_error_10.c.c +++ b/test/cond_error_10.c.c @@ -1,3 +1 @@ -re2c: warning: line 8: control flow in condition 'a' is undefined for strings that match '[\x0-\x60\x62-\xFF]', use default rule '*' [-Wundefined-control-flow] -re2c: warning: line 8: control flow in condition 'b' is undefined for strings that match '[\x0-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] -re2c: error: line 6, column 1: setup for non existing rule 'c' found +re2c: error: line 6: setup for non existing condition 'c' found diff --git a/test/cond_error_11.c.c b/test/cond_error_11.c.c index 90c177b..be30b92 100644 --- a/test/cond_error_11.c.c +++ b/test/cond_error_11.c.c @@ -1,3 +1 @@ -re2c: warning: line 9: control flow in condition 'a' is undefined for strings that match '[\x0-\x60\x62-\xFF]', use default rule '*' [-Wundefined-control-flow] -re2c: warning: line 9: control flow in condition 'b' is undefined for strings that match '[\x0-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] -re2c: error: line 7, column 1: setup for all rules with '*' not possible when all rules are setup explicitly +re2c: error: line 7: setup for all conditions '' is illegal if setup for each condition is defined explicitly diff --git a/test/cond_error_12.c.c b/test/cond_error_12.c.c new file mode 100644 index 0000000..fb3f675 --- /dev/null +++ b/test/cond_error_12.c.c @@ -0,0 +1 @@ +re2c: error: line 3, column 3: unexpected character: '0' diff --git a/test/cond_error_12.c.re b/test/cond_error_12.c.re new file mode 100644 index 0000000..7f750a6 --- /dev/null +++ b/test/cond_error_12.c.re @@ -0,0 +1,6 @@ +/*!re2c + + <0> "a" { return 0; } + <> { return 1; } + +*/ diff --git a/test/condition_02.c.c b/test/condition_02.c.c index 36d36a0..0fb4afc 100644 --- a/test/condition_02.c.c +++ b/test/condition_02.c.c @@ -51,6 +51,6 @@ yy14: } #line 7 "condition_02.c.re" -re2c: warning: line 3: rule matches empty string [-Wmatch-empty-string] +re2c: warning: line 3: rule in condition '0' matches empty string [-Wmatch-empty-string] re2c: warning: line 7: control flow in condition 'r1' is undefined for strings that match '[\x0-\x60\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] re2c: warning: line 7: control flow in condition 'r2' is undefined for strings that match '[\x0-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] diff --git a/test/condition_02.cg.c b/test/condition_02.cg.c index cf693a6..7a18c46 100644 --- a/test/condition_02.cg.c +++ b/test/condition_02.cg.c @@ -46,7 +46,7 @@ yy14: } #line 7 "condition_02.cg.re" -re2c: warning: line 3: rule matches empty string [-Wmatch-empty-string] +re2c: warning: line 3: rule in condition '0' matches empty string [-Wmatch-empty-string] re2c: warning: line 7: control flow in condition 'r1' is undefined for strings that match '[\x0-\x60\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] re2c: warning: line 7: control flow in condition 'r2' is undefined for strings that match '[\x0-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] re2c: warning: line 7: looks like you use hardcoded numbers instead of autogenerated condition names: better add '/*!types:re2c*/' directive or '-t, --type-header' option and don't rely on fixed condition order. [-Wcondition-order] diff --git a/test/condition_03.cg.c b/test/condition_03.cg.c index aad5c09..7f5c76e 100644 --- a/test/condition_03.cg.c +++ b/test/condition_03.cg.c @@ -79,7 +79,7 @@ yy22: } #line 9 "condition_03.cg.re" -re2c: warning: line 3: rule matches empty string [-Wmatch-empty-string] +re2c: warning: line 3: rule in condition '0' matches empty string [-Wmatch-empty-string] re2c: warning: line 9: control flow in condition 'r1' is undefined for strings that match '[\x0-\x30\x33-\x60\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] re2c: warning: line 9: control flow in condition 'r2' is undefined for strings that match '[\x0-\x30\x33-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] re2c: warning: line 9: looks like you use hardcoded numbers instead of autogenerated condition names: better add '/*!types:re2c*/' directive or '-t, --type-header' option and don't rely on fixed condition order. [-Wcondition-order] diff --git a/test/condition_05.cg.c b/test/condition_05.cg.c index 4b589f4..92592bd 100644 --- a/test/condition_05.cg.c +++ b/test/condition_05.cg.c @@ -64,46 +64,46 @@ char scan(Scanner *s) }; goto *yyctable[cond]; /* *********************************** */ -yyc_comment: +yyc_normal: if ((s->lim - s->cur) < 2) { if(fill(s, 2) >= 0) break; } yych = *s->cur; - if (yych == '*') goto yy5; + if (yych == '/') goto yy5; ++s->cur; yy4: -#line 83 "condition_05.cg.re" +#line 74 "condition_05.cg.re" { - goto yyc_comment; + fputc(*s->tok, stdout); + continue; } -#line 78 "condition_05.cg.c" +#line 79 "condition_05.cg.c" yy5: yych = *++s->cur; - if (yych != '/') goto yy4; + if (yych != '*') goto yy4; ++s->cur; -#line 79 "condition_05.cg.re" +#line 70 "condition_05.cg.re" { - continue; + goto yyc_comment; } -#line 87 "condition_05.cg.c" +#line 88 "condition_05.cg.c" /* *********************************** */ -yyc_normal: +yyc_comment: if ((s->lim - s->cur) < 2) { if(fill(s, 2) >= 0) break; } yych = *s->cur; - if (yych == '/') goto yy12; + if (yych == '*') goto yy12; ++s->cur; yy11: -#line 74 "condition_05.cg.re" +#line 83 "condition_05.cg.re" { - fputc(*s->tok, stdout); - continue; + goto yyc_comment; } #line 100 "condition_05.cg.c" yy12: yych = *++s->cur; - if (yych != '*') goto yy11; + if (yych != '/') goto yy11; ++s->cur; -#line 70 "condition_05.cg.re" +#line 79 "condition_05.cg.re" { - goto yyc_comment; + continue; } #line 109 "condition_05.cg.c" } diff --git a/test/condition_05.cgitcondition_05.cgit.h.c b/test/condition_05.cgitcondition_05.cgit.h.c index 37a66ab..bf0e0ca 100644 --- a/test/condition_05.cgitcondition_05.cgit.h.c +++ b/test/condition_05.cgitcondition_05.cgit.h.c @@ -68,39 +68,39 @@ char scan(Scanner *s) }; goto *yyctable[cond]; /* *********************************** */ -yyc_comment: +yyc_normal: if ((s->lim - s->cur) < 2) { if(fill(s, 2) >= 0) break; } yych = *s->cur; - if (yych == '*') goto yy5; + if (yych == '/') goto yy5; ++s->cur; yy4: { - goto yyc_comment; + fputc(*s->tok, stdout); + continue; } yy5: yych = *++s->cur; - if (yych != '/') goto yy4; + if (yych != '*') goto yy4; ++s->cur; { - continue; + goto yyc_comment; } /* *********************************** */ -yyc_normal: +yyc_comment: if ((s->lim - s->cur) < 2) { if(fill(s, 2) >= 0) break; } yych = *s->cur; - if (yych == '/') goto yy12; + if (yych == '*') goto yy12; ++s->cur; yy11: { - fputc(*s->tok, stdout); - continue; + goto yyc_comment; } yy12: yych = *++s->cur; - if (yych != '*') goto yy11; + if (yych != '/') goto yy11; ++s->cur; { - goto yyc_comment; + continue; } } diff --git a/test/condition_05.cgtcondition_05.cgt.h.c b/test/condition_05.cgtcondition_05.cgt.h.c index 5b12b26..9738bdc 100644 --- a/test/condition_05.cgtcondition_05.cgt.h.c +++ b/test/condition_05.cgtcondition_05.cgt.h.c @@ -71,46 +71,46 @@ char scan(Scanner *s) }; goto *yyctable[cond]; /* *********************************** */ -yyc_comment: +yyc_normal: if ((s->lim - s->cur) < 2) { if(fill(s, 2) >= 0) break; } yych = *s->cur; - if (yych == '*') goto yy5; + if (yych == '/') goto yy5; ++s->cur; yy4: -#line 83 "condition_05.cgtcondition_05.cgt.h.re" +#line 74 "condition_05.cgtcondition_05.cgt.h.re" { - goto yyc_comment; + fputc(*s->tok, stdout); + continue; } -#line 78 "condition_05.cgtcondition_05.cgt.h.c" +#line 79 "condition_05.cgtcondition_05.cgt.h.c" yy5: yych = *++s->cur; - if (yych != '/') goto yy4; + if (yych != '*') goto yy4; ++s->cur; -#line 79 "condition_05.cgtcondition_05.cgt.h.re" +#line 70 "condition_05.cgtcondition_05.cgt.h.re" { - continue; + goto yyc_comment; } -#line 87 "condition_05.cgtcondition_05.cgt.h.c" +#line 88 "condition_05.cgtcondition_05.cgt.h.c" /* *********************************** */ -yyc_normal: +yyc_comment: if ((s->lim - s->cur) < 2) { if(fill(s, 2) >= 0) break; } yych = *s->cur; - if (yych == '/') goto yy12; + if (yych == '*') goto yy12; ++s->cur; yy11: -#line 74 "condition_05.cgtcondition_05.cgt.h.re" +#line 83 "condition_05.cgtcondition_05.cgt.h.re" { - fputc(*s->tok, stdout); - continue; + goto yyc_comment; } #line 100 "condition_05.cgtcondition_05.cgt.h.c" yy12: yych = *++s->cur; - if (yych != '*') goto yy11; + if (yych != '/') goto yy11; ++s->cur; -#line 70 "condition_05.cgtcondition_05.cgt.h.re" +#line 79 "condition_05.cgtcondition_05.cgt.h.re" { - goto yyc_comment; + continue; } #line 109 "condition_05.cgtcondition_05.cgt.h.c" } diff --git a/test/condition_05.cs.c b/test/condition_05.cs.c index 30e07e2..28da5e0 100644 --- a/test/condition_05.cs.c +++ b/test/condition_05.cs.c @@ -64,46 +64,46 @@ char scan(Scanner *s) goto yyc_comment; } /* *********************************** */ -yyc_comment: +yyc_normal: if ((s->lim - s->cur) < 2) { if(fill(s, 2) >= 0) break; } yych = *s->cur; - if (yych == '*') goto yy5; + if (yych == '/') goto yy5; ++s->cur; yy4: -#line 83 "condition_05.cs.re" +#line 74 "condition_05.cs.re" { - goto yyc_comment; + fputc(*s->tok, stdout); + continue; } -#line 78 "condition_05.cs.c" +#line 79 "condition_05.cs.c" yy5: yych = *++s->cur; - if (yych != '/') goto yy4; + if (yych != '*') goto yy4; ++s->cur; -#line 79 "condition_05.cs.re" +#line 70 "condition_05.cs.re" { - continue; + goto yyc_comment; } -#line 87 "condition_05.cs.c" +#line 88 "condition_05.cs.c" /* *********************************** */ -yyc_normal: +yyc_comment: if ((s->lim - s->cur) < 2) { if(fill(s, 2) >= 0) break; } yych = *s->cur; - if (yych == '/') goto yy12; + if (yych == '*') goto yy12; ++s->cur; yy11: -#line 74 "condition_05.cs.re" +#line 83 "condition_05.cs.re" { - fputc(*s->tok, stdout); - continue; + goto yyc_comment; } #line 100 "condition_05.cs.c" yy12: yych = *++s->cur; - if (yych != '*') goto yy11; + if (yych != '/') goto yy11; ++s->cur; -#line 70 "condition_05.cs.re" +#line 79 "condition_05.cs.re" { - goto yyc_comment; + continue; } #line 109 "condition_05.cs.c" } diff --git a/test/condition_06.cs.c b/test/condition_06.cs.c index 511c3b5..684e785 100644 --- a/test/condition_06.cs.c +++ b/test/condition_06.cs.c @@ -54,16 +54,15 @@ void fputl(const char *s, size_t len, FILE *stream) } #line 57 "condition_06.cs.c" - enum YYCONDTYPE { EStateNormal, EStateComment, EStateSkiptoeol, EStateString, }; - #line 54 "condition_06.cs.re" + void scan(Scanner *s) { int cond = EStateNormal; @@ -74,7 +73,7 @@ void scan(Scanner *s) { s->tok = s->cur; -#line 78 "condition_06.cs.c" +#line 77 "condition_06.cs.c" { unsigned char yych; if (cond < 2) { @@ -91,45 +90,24 @@ void scan(Scanner *s) } } /* *********************************** */ -yyc_Comment: - if ((s->lim - s->cur) < 2) { if(fill(s, 2) >= 0) break; } - yych = *s->cur; - if (yych == '*') goto yy5; - ++s->cur; -yy4: -#line 149 "condition_06.cs.re" - { - goto yyc_Comment; - } -#line 105 "condition_06.cs.c" -yy5: - yych = *++s->cur; - if (yych != '/') goto yy4; - ++s->cur; -#line 145 "condition_06.cs.re" - { - continue; - } -#line 114 "condition_06.cs.c" -/* *********************************** */ yyc_Normal: if ((s->lim - s->cur) < 3) { if(fill(s, 3) >= 0) break; } yych = *s->cur; if (yych <= '.') { - if (yych == '"') goto yy12; + if (yych == '"') goto yy5; } else { - if (yych <= '/') goto yy14; - if (yych == '?') goto yy15; + if (yych <= '/') goto yy7; + if (yych == '?') goto yy8; } ++s->cur; -yy11: +yy4: #line 140 "condition_06.cs.re" { fputc(*s->tok, stdout); continue; } -#line 132 "condition_06.cs.c" -yy12: +#line 110 "condition_06.cs.c" +yy5: ++s->cur; #line 134 "condition_06.cs.re" { @@ -137,119 +115,140 @@ yy12: state = EStateString; continue; } -#line 141 "condition_06.cs.c" -yy14: +#line 119 "condition_06.cs.c" +yy7: yych = *++s->cur; - if (yych == '*') goto yy16; - if (yych == '/') goto yy18; - goto yy11; -yy15: + if (yych == '*') goto yy9; + if (yych == '/') goto yy11; + goto yy4; +yy8: yych = *(s->tok = ++s->cur); - if (yych == '?') goto yy20; - goto yy11; -yy16: + if (yych == '?') goto yy13; + goto yy4; +yy9: ++s->cur; #line 126 "condition_06.cs.re" { goto yyc_Comment; } -#line 157 "condition_06.cs.c" -yy18: +#line 135 "condition_06.cs.c" +yy11: ++s->cur; #line 130 "condition_06.cs.re" { goto yyc_Skiptoeol; } -#line 164 "condition_06.cs.c" -yy20: +#line 142 "condition_06.cs.c" +yy13: yych = *++s->cur; switch (yych) { - case '!': goto yy22; - case '\'': goto yy24; - case '(': goto yy26; - case ')': goto yy28; - case '-': goto yy30; - case '/': goto yy32; - case '<': goto yy34; - case '=': goto yy36; - case '>': goto yy38; - default: goto yy21; + case '!': goto yy15; + case '\'': goto yy17; + case '(': goto yy19; + case ')': goto yy21; + case '-': goto yy23; + case '/': goto yy25; + case '<': goto yy27; + case '=': goto yy29; + case '>': goto yy31; + default: goto yy14; } -yy21: +yy14: s->cur = s->tok; - goto yy11; -yy22: + goto yy4; +yy15: ++s->cur; #line 116 "condition_06.cs.re" { fputc('|', stdout); continue; } -#line 189 "condition_06.cs.c" -yy24: +#line 167 "condition_06.cs.c" +yy17: ++s->cur; #line 111 "condition_06.cs.re" { fputc('^', stdout); continue; } -#line 197 "condition_06.cs.c" -yy26: +#line 175 "condition_06.cs.c" +yy19: ++s->cur; #line 81 "condition_06.cs.re" { fputc('[', stdout); continue; } -#line 205 "condition_06.cs.c" -yy28: +#line 183 "condition_06.cs.c" +yy21: ++s->cur; #line 86 "condition_06.cs.re" { fputc(']', stdout); continue; } -#line 213 "condition_06.cs.c" -yy30: +#line 191 "condition_06.cs.c" +yy23: ++s->cur; #line 121 "condition_06.cs.re" { fputc('~', stdout); continue; } -#line 221 "condition_06.cs.c" -yy32: +#line 199 "condition_06.cs.c" +yy25: ++s->cur; #line 106 "condition_06.cs.re" { fputc('\\', stdout); continue; } -#line 229 "condition_06.cs.c" -yy34: +#line 207 "condition_06.cs.c" +yy27: ++s->cur; #line 91 "condition_06.cs.re" { fputc('{', stdout); continue; } -#line 237 "condition_06.cs.c" -yy36: +#line 215 "condition_06.cs.c" +yy29: ++s->cur; #line 101 "condition_06.cs.re" { fputc('#', stdout); continue; } -#line 245 "condition_06.cs.c" -yy38: +#line 223 "condition_06.cs.c" +yy31: ++s->cur; #line 96 "condition_06.cs.re" { fputc('}', stdout); continue; } -#line 253 "condition_06.cs.c" +#line 231 "condition_06.cs.c" +/* *********************************** */ +yyc_Comment: + if ((s->lim - s->cur) < 2) { if(fill(s, 2) >= 0) break; } + yych = *s->cur; + if (yych == '*') goto yy37; + ++s->cur; +yy36: +#line 149 "condition_06.cs.re" + { + goto yyc_Comment; + } +#line 243 "condition_06.cs.c" +yy37: + yych = *++s->cur; + if (yych != '/') goto yy36; + ++s->cur; +#line 145 "condition_06.cs.re" + { + continue; + } +#line 252 "condition_06.cs.c" /* *********************************** */ yyc_Skiptoeol: if ((s->lim - s->cur) < 5) { if(fill(s, 5) >= 0) break; } @@ -266,14 +265,14 @@ yy43: { goto yyc_Skiptoeol; } -#line 270 "condition_06.cs.c" +#line 269 "condition_06.cs.c" yy44: ++s->cur; #line 161 "condition_06.cs.re" { continue; } -#line 277 "condition_06.cs.c" +#line 276 "condition_06.cs.c" yy46: yych = *(s->tok = ++s->cur); if (yych == '?') goto yy48; @@ -295,7 +294,7 @@ yy50: { goto yyc_Skiptoeol; } -#line 299 "condition_06.cs.c" +#line 298 "condition_06.cs.c" yy52: yych = *++s->cur; if (yych == '\n') goto yy50; @@ -311,10 +310,10 @@ yy54: { goto yyc_Skiptoeol; } -#line 315 "condition_06.cs.c" +#line 314 "condition_06.cs.c" yy56: - ++s->cur; - if ((yych = *s->cur) == '\n') goto yy54; + yych = *++s->cur; + if (yych == '\n') goto yy54; goto yy49; /* *********************************** */ yyc_String: @@ -329,7 +328,7 @@ yy60: fputc(*s->tok, stdout); continue; } -#line 333 "condition_06.cs.c" +#line 332 "condition_06.cs.c" yy61: ++s->cur; #line 174 "condition_06.cs.re" @@ -337,7 +336,7 @@ yy61: fputc(*s->tok, stdout); continue; } -#line 341 "condition_06.cs.c" +#line 340 "condition_06.cs.c" yy63: yych = *++s->cur; if (yych == '\n') goto yy60; @@ -347,7 +346,7 @@ yy63: fputl((const char*)s->tok, 2, stdout); continue; } -#line 351 "condition_06.cs.c" +#line 350 "condition_06.cs.c" } #line 183 "condition_06.cs.re" diff --git a/test/condition_07.cbi.c b/test/condition_07.cbi.c index bc6686c..283b56f 100644 --- a/test/condition_07.cbi.c +++ b/test/condition_07.cbi.c @@ -52,7 +52,6 @@ void fputl(const char *s, size_t len, FILE *stream) } } - enum YYCONDTYPE { EStateR1, EStateR2, diff --git a/test/condition_08.cbi.c b/test/condition_08.cbi.c index 163bb18..bb1fe57 100644 --- a/test/condition_08.cbi.c +++ b/test/condition_08.cbi.c @@ -5,7 +5,6 @@ #define BSIZE 8192 - enum ScanContition { EStateNormal, EStateComment, @@ -86,161 +85,161 @@ void scan(Scanner *s) } } /* *********************************** */ -yyc_Comment: - if ((s->lim - s->cur) < 2) if(fill(s, 2) >= 0) break; - s->yych = *s->cur; - if (s->yych == '*') goto yy5; - ++s->cur; -yy4: - { - goto yyc_Comment; - } -yy5: - s->yych = *++s->cur; - if (s->yych != '/') goto yy4; - ++s->cur; - { - s->cond = EStateNormal; - continue; - } -/* *********************************** */ yyc_Normal: if ((s->lim - s->cur) < 4) if(fill(s, 4) >= 0) break; s->yych = *s->cur; if (s->yych <= '\'') { - if (s->yych == '"') goto yy12; - if (s->yych >= '\'') goto yy14; + if (s->yych == '"') goto yy5; + if (s->yych >= '\'') goto yy7; } else { if (s->yych <= '/') { - if (s->yych >= '/') goto yy15; + if (s->yych >= '/') goto yy8; } else { - if (s->yych == '?') goto yy16; + if (s->yych == '?') goto yy9; } } ++s->cur; -yy11: +yy4: { fputc(*s->tok, stdout); continue; } -yy12: +yy5: ++s->cur; { fputc(*s->tok, stdout); s->state = EStateString; continue; } -yy14: +yy7: s->yych = *(s->tok = ++s->cur); - if (s->yych == '"') goto yy17; - if (s->yych == '\\') goto yy19; - goto yy11; -yy15: + if (s->yych == '"') goto yy10; + if (s->yych == '\\') goto yy12; + goto yy4; +yy8: s->yych = *++s->cur; - if (s->yych == '*') goto yy20; - if (s->yych == '/') goto yy22; - goto yy11; -yy16: + if (s->yych == '*') goto yy13; + if (s->yych == '/') goto yy15; + goto yy4; +yy9: s->yych = *(s->tok = ++s->cur); - if (s->yych == '?') goto yy24; - goto yy11; -yy17: + if (s->yych == '?') goto yy17; + goto yy4; +yy10: s->yych = *++s->cur; - if (s->yych == '\'') goto yy25; -yy18: + if (s->yych == '\'') goto yy18; +yy11: s->cur = s->tok; - goto yy11; -yy19: + goto yy4; +yy12: s->yych = *++s->cur; - if (s->yych == '"') goto yy17; - goto yy18; -yy20: + if (s->yych == '"') goto yy10; + goto yy11; +yy13: ++s->cur; { s->cond = EStateComment; goto yyc_Comment; } -yy22: +yy15: ++s->cur; { s->cond = EStateSkiptoeol; goto yyc_Skiptoeol; } -yy24: +yy17: s->yych = *++s->cur; switch (s->yych) { - case '!': goto yy27; - case '\'': goto yy29; - case '(': goto yy31; - case ')': goto yy33; - case '-': goto yy35; - case '/': goto yy37; - case '<': goto yy39; - case '=': goto yy41; - case '>': goto yy43; - default: goto yy18; + case '!': goto yy20; + case '\'': goto yy22; + case '(': goto yy24; + case ')': goto yy26; + case '-': goto yy28; + case '/': goto yy30; + case '<': goto yy32; + case '=': goto yy34; + case '>': goto yy36; + default: goto yy11; } -yy25: +yy18: ++s->cur; { fputl("'\"'", 3, stdout); continue; } -yy27: +yy20: ++s->cur; { fputc('|', stdout); continue; } -yy29: +yy22: ++s->cur; { fputc('^', stdout); continue; } -yy31: +yy24: ++s->cur; { fputc('[', stdout); continue; } -yy33: +yy26: ++s->cur; { fputc(']', stdout); continue; } -yy35: +yy28: ++s->cur; { fputc('~', stdout); continue; } -yy37: +yy30: ++s->cur; { fputc('\\', stdout); continue; } -yy39: +yy32: ++s->cur; { fputc('{', stdout); continue; } -yy41: +yy34: ++s->cur; { fputc('#', stdout); continue; } -yy43: +yy36: ++s->cur; { fputc('}', stdout); continue; } /* *********************************** */ +yyc_Comment: + if ((s->lim - s->cur) < 2) if(fill(s, 2) >= 0) break; + s->yych = *s->cur; + if (s->yych == '*') goto yy42; + ++s->cur; +yy41: + { + goto yyc_Comment; + } +yy42: + s->yych = *++s->cur; + if (s->yych != '/') goto yy41; + ++s->cur; + { + s->cond = EStateNormal; + continue; + } +/* *********************************** */ yyc_Skiptoeol: if ((s->lim - s->cur) < 5) if(fill(s, 5) >= 0) break; s->yych = *s->cur; @@ -296,8 +295,8 @@ yy59: goto yyc_Skiptoeol; } yy61: - ++s->cur; - if ((s->yych = *s->cur) == '\n') goto yy59; + s->yych = *++s->cur; + if (s->yych == '\n') goto yy59; goto yy54; /* *********************************** */ yyc_String: diff --git a/test/condition_08.cbif.c b/test/condition_08.cbif.c index bf268fc..bb78ee7 100644 --- a/test/condition_08.cbif.c +++ b/test/condition_08.cbif.c @@ -5,7 +5,6 @@ #define BSIZE 8192 - enum ScanContition { EStateNormal, EStateComment, @@ -95,165 +94,165 @@ yy0: } } /* *********************************** */ -yyc_Comment: - s->state = 0;(0); - if ((s->lim - s->cur) < 2) if(fill(s, 2) >= 0) break; -yyFillLabel0: - s->yych = *s->cur; - if (s->yych == '*') goto yy5; - ++s->cur; -yy4: - { - goto yyc_Comment; - } -yy5: - s->yych = *++s->cur; - if (s->yych != '/') goto yy4; - ++s->cur; - { - s->cond = EStateNormal; - continue; - } -/* *********************************** */ yyc_Normal: - s->state = 1;(1); + s->state = 0;(0); if ((s->lim - s->cur) < 4) if(fill(s, 4) >= 0) break; -yyFillLabel1: +yyFillLabel0: s->yych = *s->cur; if (s->yych <= '\'') { - if (s->yych == '"') goto yy12; - if (s->yych >= '\'') goto yy14; + if (s->yych == '"') goto yy5; + if (s->yych >= '\'') goto yy7; } else { if (s->yych <= '/') { - if (s->yych >= '/') goto yy15; + if (s->yych >= '/') goto yy8; } else { - if (s->yych == '?') goto yy16; + if (s->yych == '?') goto yy9; } } ++s->cur; -yy11: +yy4: { fputc(*s->tok, stdout); continue; } -yy12: +yy5: ++s->cur; { fputc(*s->tok, stdout); s->state = EStateString; continue; } -yy14: +yy7: s->yych = *(s->tok = ++s->cur); - if (s->yych == '"') goto yy17; - if (s->yych == '\\') goto yy19; - goto yy11; -yy15: + if (s->yych == '"') goto yy10; + if (s->yych == '\\') goto yy12; + goto yy4; +yy8: s->yych = *++s->cur; - if (s->yych == '*') goto yy20; - if (s->yych == '/') goto yy22; - goto yy11; -yy16: + if (s->yych == '*') goto yy13; + if (s->yych == '/') goto yy15; + goto yy4; +yy9: s->yych = *(s->tok = ++s->cur); - if (s->yych == '?') goto yy24; - goto yy11; -yy17: + if (s->yych == '?') goto yy17; + goto yy4; +yy10: s->yych = *++s->cur; - if (s->yych == '\'') goto yy25; -yy18: + if (s->yych == '\'') goto yy18; +yy11: s->cur = s->tok; - goto yy11; -yy19: + goto yy4; +yy12: s->yych = *++s->cur; - if (s->yych == '"') goto yy17; - goto yy18; -yy20: + if (s->yych == '"') goto yy10; + goto yy11; +yy13: ++s->cur; { s->cond = EStateComment; goto yyc_Comment; } -yy22: +yy15: ++s->cur; { s->cond = EStateSkiptoeol; goto yyc_Skiptoeol; } -yy24: +yy17: s->yych = *++s->cur; switch (s->yych) { - case '!': goto yy27; - case '\'': goto yy29; - case '(': goto yy31; - case ')': goto yy33; - case '-': goto yy35; - case '/': goto yy37; - case '<': goto yy39; - case '=': goto yy41; - case '>': goto yy43; - default: goto yy18; + case '!': goto yy20; + case '\'': goto yy22; + case '(': goto yy24; + case ')': goto yy26; + case '-': goto yy28; + case '/': goto yy30; + case '<': goto yy32; + case '=': goto yy34; + case '>': goto yy36; + default: goto yy11; } -yy25: +yy18: ++s->cur; { fputl("'\"'", 3, stdout); continue; } -yy27: +yy20: ++s->cur; { fputc('|', stdout); continue; } -yy29: +yy22: ++s->cur; { fputc('^', stdout); continue; } -yy31: +yy24: ++s->cur; { fputc('[', stdout); continue; } -yy33: +yy26: ++s->cur; { fputc(']', stdout); continue; } -yy35: +yy28: ++s->cur; { fputc('~', stdout); continue; } -yy37: +yy30: ++s->cur; { fputc('\\', stdout); continue; } -yy39: +yy32: ++s->cur; { fputc('{', stdout); continue; } -yy41: +yy34: ++s->cur; { fputc('#', stdout); continue; } -yy43: +yy36: ++s->cur; { fputc('}', stdout); continue; } /* *********************************** */ +yyc_Comment: + s->state = 1;(1); + if ((s->lim - s->cur) < 2) if(fill(s, 2) >= 0) break; +yyFillLabel1: + s->yych = *s->cur; + if (s->yych == '*') goto yy42; + ++s->cur; +yy41: + { + goto yyc_Comment; + } +yy42: + s->yych = *++s->cur; + if (s->yych != '/') goto yy41; + ++s->cur; + { + s->cond = EStateNormal; + continue; + } +/* *********************************** */ yyc_Skiptoeol: s->state = 2;(2); if ((s->lim - s->cur) < 5) if(fill(s, 5) >= 0) break; @@ -311,8 +310,8 @@ yy59: goto yyc_Skiptoeol; } yy61: - ++s->cur; - if ((s->yych = *s->cur) == '\n') goto yy59; + s->yych = *++s->cur; + if (s->yych == '\n') goto yy59; goto yy54; /* *********************************** */ yyc_String: diff --git a/test/condition_09.cbif.c b/test/condition_09.cbif.c index 6db3093..cb9f399 100644 --- a/test/condition_09.cbif.c +++ b/test/condition_09.cbif.c @@ -5,7 +5,6 @@ #define BSIZE 8192 - enum ScanContition { EStateNormal, EStateComment, @@ -85,6 +84,7 @@ void scan(Scanner *s) case 2: goto yyFillLabel2; case 3: goto yyFillLabel3; } + for(;;) { s->tok = s->cur; @@ -105,165 +105,165 @@ yy0: } } /* *********************************** */ -yyc_Comment: - s->state = 0;(0); - if ((s->lim - s->cur) < 2) if(fill(s, 2) == ~0) break; -yyFillLabel0: - s->yych = *s->cur; - if (s->yych == '*') goto yy5; - ++s->cur; -yy4: - { - goto yyc_Comment; - } -yy5: - s->yych = *++s->cur; - if (s->yych != '/') goto yy4; - ++s->cur; - s->cond = EStateNormal;(EStateNormal); - { - continue; - } -/* *********************************** */ yyc_Normal: - s->state = 1;(1); + s->state = 0;(0); if ((s->lim - s->cur) < 4) if(fill(s, 4) == ~0) break; -yyFillLabel1: +yyFillLabel0: s->yych = *s->cur; if (s->yych <= '\'') { - if (s->yych == '"') goto yy12; - if (s->yych >= '\'') goto yy14; + if (s->yych == '"') goto yy5; + if (s->yych >= '\'') goto yy7; } else { if (s->yych <= '/') { - if (s->yych >= '/') goto yy15; + if (s->yych >= '/') goto yy8; } else { - if (s->yych == '?') goto yy16; + if (s->yych == '?') goto yy9; } } ++s->cur; -yy11: +yy4: { fputc(s->cur[-1], stdout); continue; } -yy12: +yy5: ++s->cur; s->cond = EStateString;(EStateString); { fputc(s->cur[-1], stdout); continue; } -yy14: +yy7: s->yych = *(s->tok = ++s->cur); - if (s->yych == '"') goto yy17; - if (s->yych == '\\') goto yy19; - goto yy11; -yy15: + if (s->yych == '"') goto yy10; + if (s->yych == '\\') goto yy12; + goto yy4; +yy8: s->yych = *++s->cur; - if (s->yych == '*') goto yy20; - if (s->yych == '/') goto yy22; - goto yy11; -yy16: + if (s->yych == '*') goto yy13; + if (s->yych == '/') goto yy15; + goto yy4; +yy9: s->yych = *(s->tok = ++s->cur); - if (s->yych == '?') goto yy24; - goto yy11; -yy17: + if (s->yych == '?') goto yy17; + goto yy4; +yy10: s->yych = *++s->cur; - if (s->yych == '\'') goto yy25; -yy18: + if (s->yych == '\'') goto yy18; +yy11: s->cur = s->tok; - goto yy11; -yy19: + goto yy4; +yy12: s->yych = *++s->cur; - if (s->yych == '"') goto yy17; - goto yy18; -yy20: + if (s->yych == '"') goto yy10; + goto yy11; +yy13: ++s->cur; s->cond = EStateComment;(EStateComment); { goto yyc_Comment; } -yy22: +yy15: ++s->cur; s->cond = EStateSkiptoeol;(EStateSkiptoeol); { goto yyc_Skiptoeol; } -yy24: +yy17: s->yych = *++s->cur; switch (s->yych) { - case '!': goto yy27; - case '\'': goto yy29; - case '(': goto yy31; - case ')': goto yy33; - case '-': goto yy35; - case '/': goto yy37; - case '<': goto yy39; - case '=': goto yy41; - case '>': goto yy43; - default: goto yy18; + case '!': goto yy20; + case '\'': goto yy22; + case '(': goto yy24; + case ')': goto yy26; + case '-': goto yy28; + case '/': goto yy30; + case '<': goto yy32; + case '=': goto yy34; + case '>': goto yy36; + default: goto yy11; } -yy25: +yy18: ++s->cur; { fputl("'\"'", 3, stdout); continue; } -yy27: +yy20: ++s->cur; { fputc('|', stdout); continue; } -yy29: +yy22: ++s->cur; { fputc('^', stdout); continue; } -yy31: +yy24: ++s->cur; { fputc('[', stdout); continue; } -yy33: +yy26: ++s->cur; { fputc(']', stdout); continue; } -yy35: +yy28: ++s->cur; { fputc('~', stdout); continue; } -yy37: +yy30: ++s->cur; { fputc('\\', stdout); continue; } -yy39: +yy32: ++s->cur; { fputc('{', stdout); continue; } -yy41: +yy34: ++s->cur; { fputc('#', stdout); continue; } -yy43: +yy36: ++s->cur; { fputc('}', stdout); continue; } /* *********************************** */ +yyc_Comment: + s->state = 1;(1); + if ((s->lim - s->cur) < 2) if(fill(s, 2) == ~0) break; +yyFillLabel1: + s->yych = *s->cur; + if (s->yych == '*') goto yy42; + ++s->cur; +yy41: + { + goto yyc_Comment; + } +yy42: + s->yych = *++s->cur; + if (s->yych != '/') goto yy41; + ++s->cur; + s->cond = EStateNormal;(EStateNormal); + { + continue; + } +/* *********************************** */ yyc_Skiptoeol: s->state = 2;(2); if ((s->lim - s->cur) < 5) if(fill(s, 5) == ~0) break; @@ -338,8 +338,8 @@ yy62: goto yyc_Skiptoeol; } yy64: - ++s->cur; - if ((s->yych = *s->cur) == '\n') goto yy62; + s->yych = *++s->cur; + if (s->yych == '\n') goto yy62; goto yy57; /* *********************************** */ yyc_String: diff --git a/test/condition_09.cgif.c b/test/condition_09.cgif.c index 49cebe3..80cd50f 100644 --- a/test/condition_09.cgif.c +++ b/test/condition_09.cgif.c @@ -5,7 +5,6 @@ #define BSIZE 8192 - enum ScanContition { EStateNormal, EStateComment, @@ -85,6 +84,7 @@ void scan(Scanner *s) case 2: goto yyFillLabel2; case 3: goto yyFillLabel3; } + for(;;) { s->tok = s->cur; @@ -100,218 +100,218 @@ void scan(Scanner *s) yy0: goto *yyctable[s->cond]; /* *********************************** */ -yyc_Comment: - s->state = 0;(0); - if ((s->lim - s->cur) < 2) if(fill(s, 2) == ~0) break; -yyFillLabel0: - s->yych = *s->cur; - if (s->yych == '*') goto yy5; - ++s->cur; -yy4: - { - goto yyc_Comment; - } -yy5: - s->yych = *++s->cur; - if (s->yych != '/') goto yy4; - ++s->cur; - s->cond = EStateNormal;(EStateNormal); - { - continue; - } -/* *********************************** */ yyc_Normal: - s->state = 1;(1); + s->state = 0;(0); if ((s->lim - s->cur) < 4) if(fill(s, 4) == ~0) break; -yyFillLabel1: +yyFillLabel0: s->yych = *s->cur; { static void *yytarget[256] = { - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy12, &&yy10, &&yy10, &&yy10, &&yy10, &&yy14, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy15, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy16, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10 + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy5, &&yy3, &&yy3, &&yy3, &&yy3, &&yy7, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy8, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy9, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3 }; goto *yytarget[s->yych]; } -yy10: +yy3: ++s->cur; -yy11: +yy4: { fputc(s->cur[-1], stdout); continue; } -yy12: +yy5: ++s->cur; s->cond = EStateString;(EStateString); { fputc(s->cur[-1], stdout); continue; } -yy14: +yy7: s->yych = *(s->tok = ++s->cur); - if (s->yych == '"') goto yy17; - if (s->yych == '\\') goto yy19; - goto yy11; -yy15: + if (s->yych == '"') goto yy10; + if (s->yych == '\\') goto yy12; + goto yy4; +yy8: s->yych = *++s->cur; - if (s->yych == '*') goto yy20; - if (s->yych == '/') goto yy22; - goto yy11; -yy16: + if (s->yych == '*') goto yy13; + if (s->yych == '/') goto yy15; + goto yy4; +yy9: s->yych = *(s->tok = ++s->cur); - if (s->yych == '?') goto yy24; - goto yy11; -yy17: + if (s->yych == '?') goto yy17; + goto yy4; +yy10: s->yych = *++s->cur; - if (s->yych == '\'') goto yy25; -yy18: + if (s->yych == '\'') goto yy18; +yy11: s->cur = s->tok; - goto yy11; -yy19: + goto yy4; +yy12: s->yych = *++s->cur; - if (s->yych == '"') goto yy17; - goto yy18; -yy20: + if (s->yych == '"') goto yy10; + goto yy11; +yy13: ++s->cur; s->cond = EStateComment;(EStateComment); { goto yyc_Comment; } -yy22: +yy15: ++s->cur; s->cond = EStateSkiptoeol;(EStateSkiptoeol); { goto yyc_Skiptoeol; } -yy24: +yy17: s->yych = *++s->cur; { static void *yytarget[256] = { - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy27, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy29, - &&yy31, &&yy33, &&yy18, &&yy18, &&yy18, &&yy35, &&yy18, &&yy37, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy39, &&yy41, &&yy43, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18 + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy20, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy22, + &&yy24, &&yy26, &&yy11, &&yy11, &&yy11, &&yy28, &&yy11, &&yy30, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy32, &&yy34, &&yy36, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11 }; goto *yytarget[s->yych]; } -yy25: +yy18: ++s->cur; { fputl("'\"'", 3, stdout); continue; } -yy27: +yy20: ++s->cur; { fputc('|', stdout); continue; } -yy29: +yy22: ++s->cur; { fputc('^', stdout); continue; } -yy31: +yy24: ++s->cur; { fputc('[', stdout); continue; } -yy33: +yy26: ++s->cur; { fputc(']', stdout); continue; } -yy35: +yy28: ++s->cur; { fputc('~', stdout); continue; } -yy37: +yy30: ++s->cur; { fputc('\\', stdout); continue; } -yy39: +yy32: ++s->cur; { fputc('{', stdout); continue; } -yy41: +yy34: ++s->cur; { fputc('#', stdout); continue; } -yy43: +yy36: ++s->cur; { fputc('}', stdout); continue; } /* *********************************** */ +yyc_Comment: + s->state = 1;(1); + if ((s->lim - s->cur) < 2) if(fill(s, 2) == ~0) break; +yyFillLabel1: + s->yych = *s->cur; + if (s->yych == '*') goto yy42; + ++s->cur; +yy41: + { + goto yyc_Comment; + } +yy42: + s->yych = *++s->cur; + if (s->yych != '/') goto yy41; + ++s->cur; + s->cond = EStateNormal;(EStateNormal); + { + continue; + } +/* *********************************** */ yyc_Skiptoeol: s->state = 2;(2); if ((s->lim - s->cur) < 5) if(fill(s, 5) == ~0) break; @@ -414,8 +414,8 @@ yy62: goto yyc_Skiptoeol; } yy64: - ++s->cur; - if ((s->yych = *s->cur) == '\n') goto yy62; + s->yych = *++s->cur; + if (s->yych == '\n') goto yy62; goto yy57; /* *********************************** */ yyc_String: diff --git a/test/condition_10.cgif--skeleton.c b/test/condition_10.cgif--skeleton.c index 408b20c..a21253a 100644 --- a/test/condition_10.cgif--skeleton.c +++ b/test/condition_10.cgif--skeleton.c @@ -1,7 +1,9 @@ /* Generated by re2c */ +#include /* size_t */ #include #include /* malloc, free */ +#include /* memcpy */ static void *read_file ( const char *fname @@ -48,23 +50,17 @@ error: return NULL; } -enum YYCONDTYPE { - yycNormal, - yycComment, - yycSkiptoeol, - yycString, -}; - - #define YYCTYPE unsigned char #define YYKEYTYPE unsigned char #define YYPEEK() *cursor #define YYSKIP() ++cursor +#define YYBACKUP() marker = cursor +#define YYRESTORE() cursor = marker #define YYLESSTHAN(n) (limit - cursor) < n #define YYFILL(n) { break; } -static int action_line126_Comment - ( unsigned int i +static int action_line126_Normal + ( unsigned *pkix , const YYKEYTYPE *keys , const YYCTYPE *start , const YYCTYPE *token @@ -72,30 +68,32 @@ static int action_line126_Comment , YYKEYTYPE rule_act ) { + const unsigned kix = *pkix; const long pos = token - start; const long len_act = *cursor - token; - const long len_exp = (long) keys [3 * i + 1]; - const YYKEYTYPE rule_exp = keys [3 * i + 2]; + const long len_exp = (long) keys[kix + 1]; + const YYKEYTYPE rule_exp = keys[kix + 2]; + *pkix = kix + 3; if (rule_exp == 255) { fprintf ( stderr - , "warning: lex_line126_Comment: control flow is undefined for input" + , "warning: lex_line126_Normal: control flow is undefined for input" " at position %ld, rerun re2c with '-W'\n" , pos ); } if (len_act == len_exp && rule_act == rule_exp) { - const YYKEYTYPE offset = keys[3 * i]; + const YYKEYTYPE offset = keys[kix]; *cursor = token + offset; return 0; } else { fprintf ( stderr - , "error: lex_line126_Comment: at position %ld (iteration %u):\n" + , "error: lex_line126_Normal: at position %ld (key %u):\n" "\texpected: match length %ld, rule %u\n" "\tactual: match length %ld, rule %u\n" , pos - , i + , kix , len_exp , rule_exp , len_act @@ -105,9 +103,16 @@ static int action_line126_Comment } } -int lex_line126_Comment() +static int check_key_count_line126_Normal(unsigned have, unsigned used, unsigned need) { - const size_t padding = 2; /* YYMAXFILL */ + if (used + need <= have) return 0; + fprintf(stderr, "error: lex_line126_Normal: not enough keys\n"); + return 1; +} + +int lex_line126_Normal() +{ + const size_t padding = 4; /* YYMAXFILL */ int status = 0; size_t input_len = 0; size_t keys_count = 0; @@ -120,7 +125,7 @@ int lex_line126_Comment() unsigned int i = 0; input = (YYCTYPE *) read_file - ("condition_10.cgif--skeleton.c.line126_Comment.input" + ("condition_10.cgif--skeleton.c.line126_Normal.input" , sizeof (YYCTYPE) , padding , &input_len @@ -131,8 +136,8 @@ int lex_line126_Comment() } keys = (YYKEYTYPE *) read_file - ("condition_10.cgif--skeleton.c.line126_Comment.keys" - , 3 * sizeof (YYKEYTYPE) + ("condition_10.cgif--skeleton.c.line126_Normal.keys" + , sizeof (YYKEYTYPE) , 0 , &keys_count ); @@ -145,23 +150,191 @@ int lex_line126_Comment() limit = input + input_len + padding; eof = input + input_len; - for (i = 0; status == 0 && i < keys_count; ++i) { + for (i = 0; status == 0 && cursor < eof && i < keys_count;) { token = cursor; + const YYCTYPE *marker = NULL; YYCTYPE yych; - if (YYLESSTHAN (2)) YYFILL(2); + if (YYLESSTHAN (4)) YYFILL(4); yych = YYPEEK (); - if (yych == '*') goto yy5; + { + static void *yytarget[256] = { + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy5, &&yy3, &&yy3, &&yy3, &&yy3, &&yy7, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy8, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy9, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3 + }; + goto *yytarget[yych]; + } +yy3: YYSKIP (); yy4: - status = action_line126_Comment(i, keys, input, token, &cursor, 15); + status = check_key_count_line126_Normal(keys_count, i, 3) + || action_line126_Normal(&i, keys, input, token, &cursor, 13); continue; yy5: YYSKIP (); + status = check_key_count_line126_Normal(keys_count, i, 3) + || action_line126_Normal(&i, keys, input, token, &cursor, 12); + continue; +yy7: + YYSKIP (); + YYBACKUP (); + yych = YYPEEK (); + if (yych == '"') goto yy10; + if (yych == '\\') goto yy12; + goto yy4; +yy8: + YYSKIP (); + yych = YYPEEK (); + if (yych == '*') goto yy13; + if (yych == '/') goto yy15; + goto yy4; +yy9: + YYSKIP (); + YYBACKUP (); + yych = YYPEEK (); + if (yych == '?') goto yy17; + goto yy4; +yy10: + YYSKIP (); yych = YYPEEK (); - if (yych != '/') goto yy4; + if (yych == '\'') goto yy18; +yy11: + YYRESTORE (); + goto yy4; +yy12: + YYSKIP (); + yych = YYPEEK (); + if (yych == '"') goto yy10; + goto yy11; +yy13: + YYSKIP (); + status = check_key_count_line126_Normal(keys_count, i, 3) + || action_line126_Normal(&i, keys, input, token, &cursor, 9); + continue; +yy15: YYSKIP (); - status = action_line126_Comment(i, keys, input, token, &cursor, 14); + status = check_key_count_line126_Normal(keys_count, i, 3) + || action_line126_Normal(&i, keys, input, token, &cursor, 10); + continue; +yy17: + YYSKIP (); + yych = YYPEEK (); + { + static void *yytarget[256] = { + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy20, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy22, + &&yy24, &&yy26, &&yy11, &&yy11, &&yy11, &&yy28, &&yy11, &&yy30, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy32, &&yy34, &&yy36, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11 + }; + goto *yytarget[yych]; + } +yy18: + YYSKIP (); + status = check_key_count_line126_Normal(keys_count, i, 3) + || action_line126_Normal(&i, keys, input, token, &cursor, 11); + continue; +yy20: + YYSKIP (); + status = check_key_count_line126_Normal(keys_count, i, 3) + || action_line126_Normal(&i, keys, input, token, &cursor, 7); + continue; +yy22: + YYSKIP (); + status = check_key_count_line126_Normal(keys_count, i, 3) + || action_line126_Normal(&i, keys, input, token, &cursor, 6); + continue; +yy24: + YYSKIP (); + status = check_key_count_line126_Normal(keys_count, i, 3) + || action_line126_Normal(&i, keys, input, token, &cursor, 0); + continue; +yy26: + YYSKIP (); + status = check_key_count_line126_Normal(keys_count, i, 3) + || action_line126_Normal(&i, keys, input, token, &cursor, 1); + continue; +yy28: + YYSKIP (); + status = check_key_count_line126_Normal(keys_count, i, 3) + || action_line126_Normal(&i, keys, input, token, &cursor, 8); + continue; +yy30: + YYSKIP (); + status = check_key_count_line126_Normal(keys_count, i, 3) + || action_line126_Normal(&i, keys, input, token, &cursor, 5); + continue; +yy32: + YYSKIP (); + status = check_key_count_line126_Normal(keys_count, i, 3) + || action_line126_Normal(&i, keys, input, token, &cursor, 2); + continue; +yy34: + YYSKIP (); + status = check_key_count_line126_Normal(keys_count, i, 3) + || action_line126_Normal(&i, keys, input, token, &cursor, 4); + continue; +yy36: + YYSKIP (); + status = check_key_count_line126_Normal(keys_count, i, 3) + || action_line126_Normal(&i, keys, input, token, &cursor, 3); continue; } @@ -169,11 +342,11 @@ yy5: if (cursor != eof) { status = 1; const long pos = token - input; - fprintf(stderr, "error: lex_line126_Comment: unused input strings left at position %ld\n", pos); + fprintf(stderr, "error: lex_line126_Normal: unused input strings left at position %ld\n", pos); } if (i != keys_count) { status = 1; - fprintf(stderr, "error: lex_line126_Comment: unused keys left after %u iterations\n", i); + fprintf(stderr, "error: lex_line126_Normal: unused keys left after %u keys\n", i); } } @@ -188,6 +361,8 @@ end: #undef YYKEYTYPE #undef YYPEEK #undef YYSKIP +#undef YYBACKUP +#undef YYRESTORE #undef YYLESSTHAN #undef YYFILL @@ -195,13 +370,11 @@ end: #define YYKEYTYPE unsigned char #define YYPEEK() *cursor #define YYSKIP() ++cursor -#define YYBACKUP() marker = cursor -#define YYRESTORE() cursor = marker #define YYLESSTHAN(n) (limit - cursor) < n #define YYFILL(n) { break; } -static int action_line126_Normal - ( unsigned int i +static int action_line126_Comment + ( unsigned *pkix , const YYKEYTYPE *keys , const YYCTYPE *start , const YYCTYPE *token @@ -209,30 +382,32 @@ static int action_line126_Normal , YYKEYTYPE rule_act ) { + const unsigned kix = *pkix; const long pos = token - start; const long len_act = *cursor - token; - const long len_exp = (long) keys [3 * i + 1]; - const YYKEYTYPE rule_exp = keys [3 * i + 2]; + const long len_exp = (long) keys[kix + 1]; + const YYKEYTYPE rule_exp = keys[kix + 2]; + *pkix = kix + 3; if (rule_exp == 255) { fprintf ( stderr - , "warning: lex_line126_Normal: control flow is undefined for input" + , "warning: lex_line126_Comment: control flow is undefined for input" " at position %ld, rerun re2c with '-W'\n" , pos ); } if (len_act == len_exp && rule_act == rule_exp) { - const YYKEYTYPE offset = keys[3 * i]; + const YYKEYTYPE offset = keys[kix]; *cursor = token + offset; return 0; } else { fprintf ( stderr - , "error: lex_line126_Normal: at position %ld (iteration %u):\n" + , "error: lex_line126_Comment: at position %ld (key %u):\n" "\texpected: match length %ld, rule %u\n" "\tactual: match length %ld, rule %u\n" , pos - , i + , kix , len_exp , rule_exp , len_act @@ -242,9 +417,16 @@ static int action_line126_Normal } } -int lex_line126_Normal() +static int check_key_count_line126_Comment(unsigned have, unsigned used, unsigned need) { - const size_t padding = 4; /* YYMAXFILL */ + if (used + need <= have) return 0; + fprintf(stderr, "error: lex_line126_Comment: not enough keys\n"); + return 1; +} + +int lex_line126_Comment() +{ + const size_t padding = 2; /* YYMAXFILL */ int status = 0; size_t input_len = 0; size_t keys_count = 0; @@ -257,7 +439,7 @@ int lex_line126_Normal() unsigned int i = 0; input = (YYCTYPE *) read_file - ("condition_10.cgif--skeleton.c.line126_Normal.input" + ("condition_10.cgif--skeleton.c.line126_Comment.input" , sizeof (YYCTYPE) , padding , &input_len @@ -268,8 +450,8 @@ int lex_line126_Normal() } keys = (YYKEYTYPE *) read_file - ("condition_10.cgif--skeleton.c.line126_Normal.keys" - , 3 * sizeof (YYKEYTYPE) + ("condition_10.cgif--skeleton.c.line126_Comment.keys" + , sizeof (YYKEYTYPE) , 0 , &keys_count ); @@ -282,177 +464,25 @@ int lex_line126_Normal() limit = input + input_len + padding; eof = input + input_len; - for (i = 0; status == 0 && i < keys_count; ++i) { + for (i = 0; status == 0 && cursor < eof && i < keys_count;) { token = cursor; - const YYCTYPE *marker = NULL; YYCTYPE yych; - if (YYLESSTHAN (4)) YYFILL(4); - yych = YYPEEK (); - { - static void *yytarget[256] = { - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy13, &&yy11, &&yy11, &&yy11, &&yy11, &&yy15, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy16, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy17, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, - &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11 - }; - goto *yytarget[yych]; - } -yy11: - YYSKIP (); -yy12: - status = action_line126_Normal(i, keys, input, token, &cursor, 13); - continue; -yy13: - YYSKIP (); - status = action_line126_Normal(i, keys, input, token, &cursor, 12); - continue; -yy15: - YYSKIP (); - YYBACKUP (); - yych = YYPEEK (); - if (yych == '"') goto yy18; - if (yych == '\\') goto yy20; - goto yy12; -yy16: - YYSKIP (); - yych = YYPEEK (); - if (yych == '*') goto yy21; - if (yych == '/') goto yy23; - goto yy12; -yy17: - YYSKIP (); - YYBACKUP (); - yych = YYPEEK (); - if (yych == '?') goto yy25; - goto yy12; -yy18: - YYSKIP (); - yych = YYPEEK (); - if (yych == '\'') goto yy26; -yy19: - YYRESTORE (); - goto yy12; -yy20: - YYSKIP (); + if (YYLESSTHAN (2)) YYFILL(2); yych = YYPEEK (); - if (yych == '"') goto yy18; - goto yy19; -yy21: - YYSKIP (); - status = action_line126_Normal(i, keys, input, token, &cursor, 9); - continue; -yy23: + if (yych == '*') goto yy43; YYSKIP (); - status = action_line126_Normal(i, keys, input, token, &cursor, 10); +yy42: + status = check_key_count_line126_Comment(keys_count, i, 3) + || action_line126_Comment(&i, keys, input, token, &cursor, 1); continue; -yy25: +yy43: YYSKIP (); yych = YYPEEK (); - { - static void *yytarget[256] = { - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy28, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy30, - &&yy32, &&yy34, &&yy19, &&yy19, &&yy19, &&yy36, &&yy19, &&yy38, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy40, &&yy42, &&yy44, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, - &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19, &&yy19 - }; - goto *yytarget[yych]; - } -yy26: + if (yych != '/') goto yy42; YYSKIP (); - status = action_line126_Normal(i, keys, input, token, &cursor, 11); - continue; -yy28: - YYSKIP (); - status = action_line126_Normal(i, keys, input, token, &cursor, 7); - continue; -yy30: - YYSKIP (); - status = action_line126_Normal(i, keys, input, token, &cursor, 6); - continue; -yy32: - YYSKIP (); - status = action_line126_Normal(i, keys, input, token, &cursor, 0); - continue; -yy34: - YYSKIP (); - status = action_line126_Normal(i, keys, input, token, &cursor, 1); - continue; -yy36: - YYSKIP (); - status = action_line126_Normal(i, keys, input, token, &cursor, 8); - continue; -yy38: - YYSKIP (); - status = action_line126_Normal(i, keys, input, token, &cursor, 5); - continue; -yy40: - YYSKIP (); - status = action_line126_Normal(i, keys, input, token, &cursor, 2); - continue; -yy42: - YYSKIP (); - status = action_line126_Normal(i, keys, input, token, &cursor, 4); - continue; -yy44: - YYSKIP (); - status = action_line126_Normal(i, keys, input, token, &cursor, 3); + status = check_key_count_line126_Comment(keys_count, i, 3) + || action_line126_Comment(&i, keys, input, token, &cursor, 0); continue; } @@ -460,11 +490,11 @@ yy44: if (cursor != eof) { status = 1; const long pos = token - input; - fprintf(stderr, "error: lex_line126_Normal: unused input strings left at position %ld\n", pos); + fprintf(stderr, "error: lex_line126_Comment: unused input strings left at position %ld\n", pos); } if (i != keys_count) { status = 1; - fprintf(stderr, "error: lex_line126_Normal: unused keys left after %u iterations\n", i); + fprintf(stderr, "error: lex_line126_Comment: unused keys left after %u keys\n", i); } } @@ -479,8 +509,6 @@ end: #undef YYKEYTYPE #undef YYPEEK #undef YYSKIP -#undef YYBACKUP -#undef YYRESTORE #undef YYLESSTHAN #undef YYFILL @@ -494,7 +522,7 @@ end: #define YYFILL(n) { break; } static int action_line126_Skiptoeol - ( unsigned int i + ( unsigned *pkix , const YYKEYTYPE *keys , const YYCTYPE *start , const YYCTYPE *token @@ -502,10 +530,12 @@ static int action_line126_Skiptoeol , YYKEYTYPE rule_act ) { + const unsigned kix = *pkix; const long pos = token - start; const long len_act = *cursor - token; - const long len_exp = (long) keys [3 * i + 1]; - const YYKEYTYPE rule_exp = keys [3 * i + 2]; + const long len_exp = (long) keys[kix + 1]; + const YYKEYTYPE rule_exp = keys[kix + 2]; + *pkix = kix + 3; if (rule_exp == 255) { fprintf ( stderr @@ -515,17 +545,17 @@ static int action_line126_Skiptoeol ); } if (len_act == len_exp && rule_act == rule_exp) { - const YYKEYTYPE offset = keys[3 * i]; + const YYKEYTYPE offset = keys[kix]; *cursor = token + offset; return 0; } else { fprintf ( stderr - , "error: lex_line126_Skiptoeol: at position %ld (iteration %u):\n" + , "error: lex_line126_Skiptoeol: at position %ld (key %u):\n" "\texpected: match length %ld, rule %u\n" "\tactual: match length %ld, rule %u\n" , pos - , i + , kix , len_exp , rule_exp , len_act @@ -535,6 +565,13 @@ static int action_line126_Skiptoeol } } +static int check_key_count_line126_Skiptoeol(unsigned have, unsigned used, unsigned need) +{ + if (used + need <= have) return 0; + fprintf(stderr, "error: lex_line126_Skiptoeol: not enough keys\n"); + return 1; +} + int lex_line126_Skiptoeol() { const size_t padding = 5; /* YYMAXFILL */ @@ -562,7 +599,7 @@ int lex_line126_Skiptoeol() keys = (YYKEYTYPE *) read_file ("condition_10.cgif--skeleton.c.line126_Skiptoeol.keys" - , 3 * sizeof (YYKEYTYPE) + , sizeof (YYKEYTYPE) , 0 , &keys_count ); @@ -575,7 +612,7 @@ int lex_line126_Skiptoeol() limit = input + input_len + padding; eof = input + input_len; - for (i = 0; status == 0 && i < keys_count; ++i) { + for (i = 0; status == 0 && cursor < eof && i < keys_count;) { token = cursor; const YYCTYPE *marker = NULL; YYCTYPE yych; @@ -622,11 +659,13 @@ int lex_line126_Skiptoeol() yy49: YYSKIP (); yy50: - status = action_line126_Skiptoeol(i, keys, input, token, &cursor, 20); + status = check_key_count_line126_Skiptoeol(keys_count, i, 3) + || action_line126_Skiptoeol(&i, keys, input, token, &cursor, 4); continue; yy51: YYSKIP (); - status = action_line126_Skiptoeol(i, keys, input, token, &cursor, 19); + status = check_key_count_line126_Skiptoeol(keys_count, i, 3) + || action_line126_Skiptoeol(&i, keys, input, token, &cursor, 3); continue; yy53: YYSKIP (); @@ -648,7 +687,8 @@ yy55: goto yy50; yy56: YYSKIP (); - status = action_line126_Skiptoeol(i, keys, input, token, &cursor, 18); + status = check_key_count_line126_Skiptoeol(keys_count, i, 3) + || action_line126_Skiptoeol(&i, keys, input, token, &cursor, 2); continue; yy58: YYSKIP (); @@ -659,7 +699,8 @@ yy59: goto yy50; yy60: YYSKIP (); - status = action_line126_Skiptoeol(i, keys, input, token, &cursor, 17); + status = check_key_count_line126_Skiptoeol(keys_count, i, 3) + || action_line126_Skiptoeol(&i, keys, input, token, &cursor, 1); continue; yy62: YYSKIP (); @@ -674,11 +715,13 @@ yy63: goto yy59; yy64: YYSKIP (); - status = action_line126_Skiptoeol(i, keys, input, token, &cursor, 16); + status = check_key_count_line126_Skiptoeol(keys_count, i, 3) + || action_line126_Skiptoeol(&i, keys, input, token, &cursor, 0); continue; yy66: YYSKIP (); - if ((yych = YYPEEK ()) == '\n') goto yy64; + yych = YYPEEK (); + if (yych == '\n') goto yy64; goto yy59; } @@ -690,7 +733,7 @@ yy66: } if (i != keys_count) { status = 1; - fprintf(stderr, "error: lex_line126_Skiptoeol: unused keys left after %u iterations\n", i); + fprintf(stderr, "error: lex_line126_Skiptoeol: unused keys left after %u keys\n", i); } } @@ -718,7 +761,7 @@ end: #define YYFILL(n) { break; } static int action_line126_String - ( unsigned int i + ( unsigned *pkix , const YYKEYTYPE *keys , const YYCTYPE *start , const YYCTYPE *token @@ -726,10 +769,12 @@ static int action_line126_String , YYKEYTYPE rule_act ) { + const unsigned kix = *pkix; const long pos = token - start; const long len_act = *cursor - token; - const long len_exp = (long) keys [3 * i + 1]; - const YYKEYTYPE rule_exp = keys [3 * i + 2]; + const long len_exp = (long) keys[kix + 1]; + const YYKEYTYPE rule_exp = keys[kix + 2]; + *pkix = kix + 3; if (rule_exp == 255) { fprintf ( stderr @@ -739,17 +784,17 @@ static int action_line126_String ); } if (len_act == len_exp && rule_act == rule_exp) { - const YYKEYTYPE offset = keys[3 * i]; + const YYKEYTYPE offset = keys[kix]; *cursor = token + offset; return 0; } else { fprintf ( stderr - , "error: lex_line126_String: at position %ld (iteration %u):\n" + , "error: lex_line126_String: at position %ld (key %u):\n" "\texpected: match length %ld, rule %u\n" "\tactual: match length %ld, rule %u\n" , pos - , i + , kix , len_exp , rule_exp , len_act @@ -759,6 +804,13 @@ static int action_line126_String } } +static int check_key_count_line126_String(unsigned have, unsigned used, unsigned need) +{ + if (used + need <= have) return 0; + fprintf(stderr, "error: lex_line126_String: not enough keys\n"); + return 1; +} + int lex_line126_String() { const size_t padding = 2; /* YYMAXFILL */ @@ -786,7 +838,7 @@ int lex_line126_String() keys = (YYKEYTYPE *) read_file ("condition_10.cgif--skeleton.c.line126_String.keys" - , 3 * sizeof (YYKEYTYPE) + , sizeof (YYKEYTYPE) , 0 , &keys_count ); @@ -799,7 +851,7 @@ int lex_line126_String() limit = input + input_len + padding; eof = input + input_len; - for (i = 0; status == 0 && i < keys_count; ++i) { + for (i = 0; status == 0 && cursor < eof && i < keys_count;) { token = cursor; YYCTYPE yych; @@ -809,18 +861,21 @@ int lex_line126_String() if (yych == '\\') goto yy74; YYSKIP (); yy71: - status = action_line126_String(i, keys, input, token, &cursor, 23); + status = check_key_count_line126_String(keys_count, i, 3) + || action_line126_String(&i, keys, input, token, &cursor, 2); continue; yy72: YYSKIP (); - status = action_line126_String(i, keys, input, token, &cursor, 22); + status = check_key_count_line126_String(keys_count, i, 3) + || action_line126_String(&i, keys, input, token, &cursor, 1); continue; yy74: YYSKIP (); yych = YYPEEK (); if (yych == '\n') goto yy71; YYSKIP (); - status = action_line126_String(i, keys, input, token, &cursor, 21); + status = check_key_count_line126_String(keys_count, i, 3) + || action_line126_String(&i, keys, input, token, &cursor, 0); continue; } @@ -832,7 +887,7 @@ yy74: } if (i != keys_count) { status = 1; - fprintf(stderr, "error: lex_line126_String: unused keys left after %u iterations\n", i); + fprintf(stderr, "error: lex_line126_String: unused keys left after %u keys\n", i); } } @@ -868,7 +923,7 @@ int main() }   !"#$%&'()+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ*/********** * -* * * ******************* *!*"*#*$*%*&*'*(*)***+*,*-*.*0*1*2*3*4*5*6*7*8*9*:*;*<*=*>*?*@*A*B*C*D*E*F*G*H*I*J*K*L*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*\*]*^*_*`*a*b*c*d*e*f*g*h*i*j*k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*{*|*}*~**€**‚*ƒ*„*…*†*‡*ˆ*‰*Š*‹*Œ**Ž***‘*’*“*”*•*–*—*˜*™*š*›*œ**ž*Ÿ* *¡*¢*£*¤*¥*¦*§*¨*©*ª*«*¬*­*®*¯*°*±*²*³*´*µ*¶*·*¸*¹*º*»*¼*½*¾*¿*À*Á*Â*Ã*Ä*Å*Æ*Ç*È*É*Ê*Ë*Ì*Í*Î*Ï*Ð*Ñ*Ò*Ó*Ô*Õ*Ö*×*Ø*Ù*Ú*Û*Ü*Ý*Þ*ß*à*á*â*ã*ä*å*æ*ç*è*é*ê*ë*ì*í*î*ï*ð*ñ*ò*ó*ô*õ*ö*÷*ø*ù*ú*û*ü*ý*þ*ÿ +* * * ******************* *!*"*#*$*%*&*'*(*)***+*,*-*.*0*1*2*3*4*5*6*7*8*9*:*;*<*=*>*?*@*A*B*C*D*E*F*G*H*I*J*K*L*M*N*O*P*Q*R*S*T*U*V*W*X*Y*Z*[*\*]*^*_*`*a*b*c*d*e*f*g*h*i*j*k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*{*|*}*~**€**‚*ƒ*„*…*†*‡*ˆ*‰*Š*‹*Œ**Ž***‘*’*“*”*•*–*—*˜*™*š*›*œ**ž*Ÿ* *¡*¢*£*¤*¥*¦*§*¨*©*ª*«*¬*­*®*¯*°*±*²*³*´*µ*¶*·*¸*¹*º*»*¼*½*¾*¿*À*Á*Â*Ã*Ä*Å*Æ*Ç*È*É*Ê*Ë*Ì*Í*Î*Ï*Ð*Ñ*Ò*Ó*Ô*Õ*Ö*×*Ø*Ù*Ú*Û*Ü*Ý*Þ*ß*à*á*â*ã*ä*å*æ*ç*è*é*ê*ë*ì*í*î*ï*ð*ñ*ò*ó*ô*õ*ö*÷*ø*ù*ú*û*ü*ý*þ*ÿ  !#$%&()*+,-.0123456789:;<=>@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"'"''"'"'"'"'"'"'"'"'"'" '" '" '" '" '"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'"'" '"!'""'"#'"$'"%'"&'"('")'"*'"+'",'"-'".'"/'"0'"1'"2'"3'"4'"5'"6'"7'"8'"9'":'";'"<'"='">'"?'"@'"A'"B'"C'"D'"E'"F'"G'"H'"I'"J'"K'"L'"M'"N'"O'"P'"Q'"R'"S'"T'"U'"V'"W'"X'"Y'"Z'"['"\'"]'"^'"_'"`'"a'"b'"c'"d'"e'"f'"g'"h'"i'"j'"k'"l'"m'"n'"o'"p'"q'"r'"s'"t'"u'"v'"w'"x'"y'"z'"{'"|'"}'"~'"'"€'"'"‚'"ƒ'"„'"…'"†'"‡'"ˆ'"‰'"Š'"‹'"Œ'"'"Ž'"'"'"‘'"’'"“'"”'"•'"–'"—'"˜'"™'"š'"›'"œ'"'"ž'"Ÿ'" '"¡'"¢'"£'"¤'"¥'"¦'"§'"¨'"©'"ª'"«'"¬'"­'"®'"¯'"°'"±'"²'"³'"´'"µ'"¶'"·'"¸'"¹'"º'"»'"¼'"½'"¾'"¿'"À'"Á'"Â'"Ã'"Ä'"Å'"Æ'"Ç'"È'"É'"Ê'"Ë'"Ì'"Í'"Î'"Ï'"Ð'"Ñ'"Ò'"Ó'"Ô'"Õ'"Ö'"×'"Ø'"Ù'"Ú'"Û'"Ü'"Ý'"Þ'"ß'"à'"á'"â'"ã'"ä'"å'"æ'"ç'"è'"é'"ê'"ë'"ì'"í'"î'"ï'"ð'"ñ'"ò'"ó'"ô'"õ'"ö'"÷'"ø'"ù'"ú'"û'"ü'"ý'"þ'"ÿ'\"''\"'\"'\"'\"'\"'\"'\"'\"'\"'\" '\" '\" '\" '\" '\"'\"'\"'\"'\"'\"'\"'\"'\"'\"'\"'\"'\"'\"'\"'\"'\"'\"'\" '\"!'\""'\"#'\"$'\"%'\"&'\"('\")'\"*'\"+'\",'\"-'\".'\"/'\"0'\"1'\"2'\"3'\"4'\"5'\"6'\"7'\"8'\"9'\":'\";'\"<'\"='\">'\"?'\"@'\"A'\"B'\"C'\"D'\"E'\"F'\"G'\"H'\"I'\"J'\"K'\"L'\"M'\"N'\"O'\"P'\"Q'\"R'\"S'\"T'\"U'\"V'\"W'\"X'\"Y'\"Z'\"['\"\'\"]'\"^'\"_'\"`'\"a'\"b'\"c'\"d'\"e'\"f'\"g'\"h'\"i'\"j'\"k'\"l'\"m'\"n'\"o'\"p'\"q'\"r'\"s'\"t'\"u'\"v'\"w'\"x'\"y'\"z'\"{'\"|'\"}'\"~'\"'\"€'\"'\"‚'\"ƒ'\"„'\"…'\"†'\"‡'\"ˆ'\"‰'\"Š'\"‹'\"Œ'\"'\"Ž'\"'\"'\"‘'\"’'\"“'\"”'\"•'\"–'\"—'\"˜'\"™'\"š'\"›'\"œ'\"'\"ž'\"Ÿ'\" '\"¡'\"¢'\"£'\"¤'\"¥'\"¦'\"§'\"¨'\"©'\"ª'\"«'\"¬'\"­'\"®'\"¯'\"°'\"±'\"²'\"³'\"´'\"µ'\"¶'\"·'\"¸'\"¹'\"º'\"»'\"¼'\"½'\"¾'\"¿'\"À'\"Á'\"Â'\"Ã'\"Ä'\"Å'\"Æ'\"Ç'\"È'\"É'\"Ê'\"Ë'\"Ì'\"Í'\"Î'\"Ï'\"Ð'\"Ñ'\"Ò'\"Ó'\"Ô'\"Õ'\"Ö'\"×'\"Ø'\"Ù'\"Ú'\"Û'\"Ü'\"Ý'\"Þ'\"ß'\"à'\"á'\"â'\"ã'\"ä'\"å'\"æ'\"ç'\"è'\"é'\"ê'\"ë'\"ì'\"í'\"î'\"ï'\"ð'\"ñ'\"ò'\"ó'\"ô'\"õ'\"ö'\"÷'\"ø'\"ù'\"ú'\"û'\"ü'\"ý'\"þ'\"ÿ'\'\'\'\'\'\'\'\'\'\ '\ @@ -885,6 +940,6 @@ int main() ?? ?? ?? ?????????????????????????????????????? ??!??"??#??$??%??&??'??(??)??*??+??,??-??.??0??1??2??3??4??5??6??7??8??9??:??;???????@??A??B??C??D??E??F??G??H??I??J??K??L??M??N??O??P??Q??R??S??T??U??V??W??X??Y??Z??[??\??]??^??_??`??a??b??c??d??e??f??g??h??i??j??k??l??m??n??o??p??q??r??s??t??u??v??w??x??y??z??{??|??}??~????€????‚??ƒ??„??…??†??‡??ˆ??‰??Š??‹??Œ????Ž??????‘??’??“??”??•??–??—??˜??™??š??›??œ????ž??Ÿ?? ??¡??¢??£??¤??¥??¦??§??¨??©??ª??«??¬??­??®??¯??°??±??²??³??´??µ??¶??·??¸??¹??º??»??¼??½??¾??¿??À??Á??Â??Ã??Ä??Å??Æ??Ç??È??É??Ê??Ë??Ì??Í??Î??Ï??Ð??Ñ??Ò??Ó??Ô??Õ??Ö??×??Ø??Ù??Ú??Û??Ü??Ý??Þ??ß??à??á??â??ã??ä??å??æ??ç??è??é??ê??ë??ì??í??î??ï??ð??ñ??ò??ó??ô??õ??ö??÷??ø??ù??ú??û??ü??ý??þ??ÿ?????????? ? ? ? ? ??????????????????? ?!?"?#?$?%?&?'?(?)?*?+?,?-?.?/?0?1?2?3?4?5?6?7?8?9?:?;??@?A?B?C?D?E?F?G?H?I?J?K?L?M?N?O?P?Q?R?S?T?U?V?W?X?Y?Z?[?\?]?^?_?`?a?b?c?d?e?f?g?h?i?j?k?l?m?n?o?p?q?r?s?t?u?v?w?x?y?z?{?|?}?~??€??‚?ƒ?„?…?†?‡?ˆ?‰?Š?‹?Œ??Ž???‘?’?“?”?•?–?—?˜?™?š?›?œ??ž?Ÿ? ?¡?¢?£?¤?¥?¦?§?¨?©?ª?«?¬?­?®?¯?°?±?²?³?´?µ?¶?·?¸?¹?º?»?¼?½?¾?¿?À?Á?Â?Ã?Ä?Å?Æ?Ç?È?É?Ê?Ë?Ì?Í?Î?Ï?Ð?Ñ?Ò?Ó?Ô?Õ?Ö?×?Ø?Ù?Ú?Û?Ü?Ý?Þ?ß?à?á?â?ã?ä?å?æ?ç?è?é?ê?ë?ì?í?î?ï?ð?ñ?ò?ó?ô?õ?ö?÷?ø?ù?ú?û?ü?ý?þ?ÿ\ \ -\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ !\ "\ #\ $\ %\ &\ '\ (\ )\ *\ +\ ,\ -\ .\ /\ 0\ 1\ 2\ 3\ 4\ 5\ 6\ 7\ 8\ 9\ :\ ;\ <\ =\ >\ ?\ @\ A\ B\ C\ D\ E\ F\ G\ H\ I\ J\ K\ L\ M\ N\ O\ P\ Q\ R\ S\ T\ U\ V\ W\ X\ Y\ Z\ [\ \\ ]\ ^\ _\ `\ a\ b\ c\ d\ e\ f\ g\ h\ i\ j\ k\ l\ m\ n\ o\ p\ q\ r\ s\ t\ u\ v\ w\ x\ y\ z\ {\ |\ }\ ~\ \ €\ \ ‚\ ƒ\ „\ …\ †\ ‡\ ˆ\ ‰\ Š\ ‹\ Œ\ \ Ž\ \ \ ‘\ ’\ “\ ”\ •\ –\ —\ ˜\ ™\ š\ ›\ œ\ \ ž\ Ÿ\  \ ¡\ ¢\ £\ ¤\ ¥\ ¦\ §\ ¨\ ©\ ª\ «\ ¬\ ­\ ®\ ¯\ °\ ±\ ²\ ³\ ´\ µ\ ¶\ ·\ ¸\ ¹\ º\ »\ ¼\ ½\ ¾\ ¿\ À\ Á\ Â\ Ã\ Ä\ Å\ Æ\ Ç\ È\ É\ Ê\ Ë\ Ì\ Í\ Î\ Ï\ Ð\ Ñ\ Ò\ Ó\ Ô\ Õ\ Ö\ ×\ Ø\ Ù\ Ú\ Û\ Ü\ Ý\ Þ\ ß\ à\ á\ â\ ã\ ä\ å\ æ\ ç\ è\ é\ ê\ ë\ ì\ í\ î\ ï\ ð\ ñ\ ò\ ó\ ô\ õ\ ö\ ÷\ ø\ ù\ ú\ û\ ü\ ý\ þ\ ÿ\\\\\\\\\\ \ \ \\\\\\\\\\\\\\\\\\\ \!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\0\1\2\3\4\5\6\7\8\9\:\;\<\=\>\?\@\A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z\[\\\]\^\_\`\a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z\{\|\}\~\\€\\‚\ƒ\„\…\†\‡\ˆ\‰\Š\‹\Œ\\Ž\\\‘\’\“\”\•\–\—\˜\™\š\›\œ\\ž\Ÿ\ \¡\¢\£\¤\¥\¦\§\¨\©\ª\«\¬\­\®\¯\°\±\²\³\´\µ\¶\·\¸\¹\º\»\¼\½\¾\¿\À\Á\Â\Ã\Ä\Å\Æ\Ç\È\É\Ê\Ë\Ì\Í\Î\Ï\Ð\Ñ\Ò\Ó\Ô\Õ\Ö\×\Ø\Ù\Ú\Û\Ü\Ý\Þ\ß\à\á\â\ã\ä\å\æ\ç\è\é\ê\ë\ì\í\î\ï\ð\ñ\ò\ó\ô\õ\ö\÷\ø\ù\ú\û\ü\ý\þ\ÿ +\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ !\ "\ #\ $\ %\ &\ '\ (\ )\ *\ +\ ,\ -\ .\ /\ 0\ 1\ 2\ 3\ 4\ 5\ 6\ 7\ 8\ 9\ :\ ;\ <\ =\ >\ ?\ @\ A\ B\ C\ D\ E\ F\ G\ H\ I\ J\ K\ L\ M\ N\ O\ P\ Q\ R\ S\ T\ U\ V\ W\ X\ Y\ Z\ [\ \\ ]\ ^\ _\ `\ a\ b\ c\ d\ e\ f\ g\ h\ i\ j\ k\ l\ m\ n\ o\ p\ q\ r\ s\ t\ u\ v\ w\ x\ y\ z\ {\ |\ }\ ~\ \ €\ \ ‚\ ƒ\ „\ …\ †\ ‡\ ˆ\ ‰\ Š\ ‹\ Œ\ \ Ž\ \ \ ‘\ ’\ “\ ”\ •\ –\ —\ ˜\ ™\ š\ ›\ œ\ \ ž\ Ÿ\  \ ¡\ ¢\ £\ ¤\ ¥\ ¦\ §\ ¨\ ©\ ª\ «\ ¬\ ­\ ®\ ¯\ °\ ±\ ²\ ³\ ´\ µ\ ¶\ ·\ ¸\ ¹\ º\ »\ ¼\ ½\ ¾\ ¿\ À\ Á\ Â\ Ã\ Ä\ Å\ Æ\ Ç\ È\ É\ Ê\ Ë\ Ì\ Í\ Î\ Ï\ Ð\ Ñ\ Ò\ Ó\ Ô\ Õ\ Ö\ ×\ Ø\ Ù\ Ú\ Û\ Ü\ Ý\ Þ\ ß\ à\ á\ â\ ã\ ä\ å\ æ\ ç\ è\ é\ ê\ ë\ ì\ í\ î\ ï\ ð\ ñ\ ò\ ó\ ô\ õ\ ö\ ÷\ ø\ ù\ ú\ û\ ü\ ý\ þ\ ÿ\\\\\\\\\\ \ \ \\\\\\\\\\\\\\\\\\\ \!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\0\1\2\3\4\5\6\7\8\9\:\;\<\=\>\?\@\A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z\[\\\]\^\_\`\a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z\{\|\}\~\\€\\‚\ƒ\„\…\†\‡\ˆ\‰\Š\‹\Œ\\Ž\\\‘\’\“\”\•\–\—\˜\™\š\›\œ\\ž\Ÿ\ \¡\¢\£\¤\¥\¦\§\¨\©\ª\«\¬\­\®\¯\°\±\²\³\´\µ\¶\·\¸\¹\º\»\¼\½\¾\¿\À\Á\Â\Ã\Ä\Å\Æ\Ç\È\É\Ê\Ë\Ì\Í\Î\Ï\Ð\Ñ\Ò\Ó\Ô\Õ\Ö\×\Ø\Ù\Ú\Û\Ü\Ý\Þ\ß\à\á\â\ã\ä\å\æ\ç\è\é\ê\ë\ì\í\î\ï\ð\ñ\ò\ó\ô\õ\ö\÷\ø\ù\ú\û\ü\ý\þ\ÿ  !#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ"\\\\\\\\\\ \ \ \ \\\\\\\\\\\\\\\\\\\ \!\"\#\$\%\&\'\(\)\*\+\,\-\.\/\0\1\2\3\4\5\6\7\8\9\:\;\<\=\>\?\@\A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z\[\\\]\^\_\`\a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z\{\|\}\~\\€\\‚\ƒ\„\…\†\‡\ˆ\‰\Š\‹\Œ\\Ž\\\‘\’\“\”\•\–\—\˜\™\š\›\œ\\ž\Ÿ\ \¡\¢\£\¤\¥\¦\§\¨\©\ª\«\¬\­\®\¯\°\±\²\³\´\µ\¶\·\¸\¹\º\»\¼\½\¾\¿\À\Á\Â\Ã\Ä\Å\Æ\Ç\È\É\Ê\Ë\Ì\Í\Î\Ï\Ð\Ñ\Ò\Ó\Ô\Õ\Ö\×\Ø\Ù\Ú\Û\Ü\Ý\Þ\ß\à\á\â\ã\ä\å\æ\ç\è\é\ê\ë\ì\í\î\ï\ð\ñ\ò\ó\ô\õ\ö\÷\ø\ù\ú\û\ü\ý\þ\ÿ\ - \ No newline at end of file + \ No newline at end of file diff --git a/test/condition_10.cgif.c b/test/condition_10.cgif.c index 5a19f91..88e1748 100644 --- a/test/condition_10.cgif.c +++ b/test/condition_10.cgif.c @@ -5,7 +5,6 @@ #define BSIZE 8192 - enum ScanContition { EStateNormal, EStateComment, @@ -85,6 +84,7 @@ void scan(Scanner *s) case 2: goto yyFillLabel2; case 3: goto yyFillLabel3; } + for(;;) { s->tok = s->cur; @@ -100,186 +100,186 @@ void scan(Scanner *s) yy0: goto *yyctable[s->cond]; /* *********************************** */ -yyc_Comment: - s->state = 0;(0); - if ((s->lim - s->cur) < 2) if(fill(s, 2) == ~0) break; -yyFillLabel0: - s->yych = *s->cur; - if (s->yych == '*') goto yy5; - ++s->cur; -yy4: - goto yyc_Comment; -yy5: - s->yych = *++s->cur; - if (s->yych != '/') goto yy4; - ++s->cur; - s->cond = EStateNormal;(EStateNormal); - continue; -/* *********************************** */ yyc_Normal: - s->state = 1;(1); + s->state = 0;(0); if ((s->lim - s->cur) < 4) if(fill(s, 4) == ~0) break; -yyFillLabel1: +yyFillLabel0: s->yych = *s->cur; { static void *yytarget[256] = { - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy12, &&yy10, &&yy10, &&yy10, &&yy10, &&yy14, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy15, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy16, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10 + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy5, &&yy3, &&yy3, &&yy3, &&yy3, &&yy7, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy8, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy9, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3 }; goto *yytarget[s->yych]; } -yy10: +yy3: ++s->cur; -yy11: +yy4: fputc(s->cur[-1], stdout); continue; -yy12: +yy5: ++s->cur; s->cond = EStateString;(EStateString); fputc(s->cur[-1], stdout); continue; -yy14: +yy7: s->yych = *(s->tok = ++s->cur); - if (s->yych == '"') goto yy17; - if (s->yych == '\\') goto yy19; - goto yy11; -yy15: + if (s->yych == '"') goto yy10; + if (s->yych == '\\') goto yy12; + goto yy4; +yy8: s->yych = *++s->cur; - if (s->yych == '*') goto yy20; - if (s->yych == '/') goto yy22; - goto yy11; -yy16: + if (s->yych == '*') goto yy13; + if (s->yych == '/') goto yy15; + goto yy4; +yy9: s->yych = *(s->tok = ++s->cur); - if (s->yych == '?') goto yy24; - goto yy11; -yy17: + if (s->yych == '?') goto yy17; + goto yy4; +yy10: s->yych = *++s->cur; - if (s->yych == '\'') goto yy25; -yy18: + if (s->yych == '\'') goto yy18; +yy11: s->cur = s->tok; - goto yy11; -yy19: + goto yy4; +yy12: s->yych = *++s->cur; - if (s->yych == '"') goto yy17; - goto yy18; -yy20: + if (s->yych == '"') goto yy10; + goto yy11; +yy13: ++s->cur; s->cond = EStateComment;(EStateComment); goto yyc_Comment; -yy22: +yy15: ++s->cur; s->cond = EStateSkiptoeol;(EStateSkiptoeol); goto yyc_Skiptoeol; -yy24: +yy17: s->yych = *++s->cur; { static void *yytarget[256] = { - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy27, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy29, - &&yy31, &&yy33, &&yy18, &&yy18, &&yy18, &&yy35, &&yy18, &&yy37, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy39, &&yy41, &&yy43, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18 + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy20, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy22, + &&yy24, &&yy26, &&yy11, &&yy11, &&yy11, &&yy28, &&yy11, &&yy30, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy32, &&yy34, &&yy36, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11 }; goto *yytarget[s->yych]; } -yy25: +yy18: ++s->cur; fputl("'\"'", 3, stdout); continue; -yy27: +yy20: ++s->cur; fputc('|', stdout); continue; -yy29: +yy22: ++s->cur; fputc('^', stdout); continue; -yy31: +yy24: ++s->cur; fputc('[', stdout); continue; -yy33: +yy26: ++s->cur; fputc(']', stdout); continue; -yy35: +yy28: ++s->cur; fputc('~', stdout); continue; -yy37: +yy30: ++s->cur; fputc('\\', stdout); continue; -yy39: +yy32: ++s->cur; fputc('{', stdout); continue; -yy41: +yy34: ++s->cur; fputc('#', stdout); continue; -yy43: +yy36: ++s->cur; fputc('}', stdout); continue; /* *********************************** */ +yyc_Comment: + s->state = 1;(1); + if ((s->lim - s->cur) < 2) if(fill(s, 2) == ~0) break; +yyFillLabel1: + s->yych = *s->cur; + if (s->yych == '*') goto yy42; + ++s->cur; +yy41: + goto yyc_Comment; +yy42: + s->yych = *++s->cur; + if (s->yych != '/') goto yy41; + ++s->cur; + s->cond = EStateNormal;(EStateNormal); + continue; +/* *********************************** */ yyc_Skiptoeol: s->state = 2;(2); if ((s->lim - s->cur) < 5) if(fill(s, 5) == ~0) break; @@ -372,8 +372,8 @@ yy62: ++s->cur; goto yyc_Skiptoeol; yy64: - ++s->cur; - if ((s->yych = *s->cur) == '\n') goto yy62; + s->yych = *++s->cur; + if (s->yych == '\n') goto yy62; goto yy57; /* *********************************** */ yyc_String: diff --git a/test/condition_11.cg.c b/test/condition_11.cg.c index 7bbf213..7941d6d 100644 --- a/test/condition_11.cg.c +++ b/test/condition_11.cg.c @@ -84,7 +84,7 @@ yy22: } #line 9 "condition_11.cg.re" -re2c: warning: line 3: rule matches empty string [-Wmatch-empty-string] +re2c: warning: line 3: rule in condition '0' matches empty string [-Wmatch-empty-string] re2c: warning: line 9: control flow in condition 'r1' is undefined for strings that match '[\x0-\x30\x33-\x60\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] re2c: warning: line 9: control flow in condition 'r2' is undefined for strings that match '[\x0-\x30\x33-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] re2c: warning: line 9: looks like you use hardcoded numbers instead of autogenerated condition names: better add '/*!types:re2c*/' directive or '-t, --type-header' option and don't rely on fixed condition order. [-Wcondition-order] diff --git a/test/condition_12.cgif.c b/test/condition_12.cgif.c index dd6438d..da9427d 100644 --- a/test/condition_12.cgif.c +++ b/test/condition_12.cgif.c @@ -5,7 +5,6 @@ #define BSIZE 8192 - enum ScanContition { EStateNormal, EStateComment, @@ -85,6 +84,7 @@ void scan(Scanner *s) case 2: goto yyFillLabel2; case 3: goto yyFillLabel3; } + for(;;) { s->tok = s->cur; @@ -100,186 +100,186 @@ void scan(Scanner *s) yy0: goto *yyctable[s->cond]; /* *********************************** */ -yyc_Comment: - s->state = 0;(0); - if ((s->lim - s->cur) < 2) if(fill(s, 2) == ~0) break; -yyFillLabel0: - s->yych = *s->cur; - if (s->yych == '*') goto yy5; - ++s->cur; -yy4: - goto yyc_Comment; -yy5: - s->yych = *++s->cur; - if (s->yych != '/') goto yy4; - ++s->cur; - s->cond = EStateNormal;(EStateNormal); - goto yyc_Normal; -/* *********************************** */ yyc_Normal: - s->state = 1;(1); + s->state = 0;(0); if ((s->lim - s->cur) < 4) if(fill(s, 4) == ~0) break; -yyFillLabel1: +yyFillLabel0: s->yych = *s->cur; { static void *yytarget[256] = { - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy12, &&yy10, &&yy10, &&yy10, &&yy10, &&yy14, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy15, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy16, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10 + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy5, &&yy3, &&yy3, &&yy3, &&yy3, &&yy7, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy8, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy9, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3 }; goto *yytarget[s->yych]; } -yy10: +yy3: ++s->cur; -yy11: +yy4: fputc(s->cur[-1], stdout); continue; -yy12: +yy5: ++s->cur; s->cond = EStateString;(EStateString); fputc(s->cur[-1], stdout); continue; -yy14: +yy7: s->yych = *(s->tok = ++s->cur); - if (s->yych == '"') goto yy17; - if (s->yych == '\\') goto yy19; - goto yy11; -yy15: + if (s->yych == '"') goto yy10; + if (s->yych == '\\') goto yy12; + goto yy4; +yy8: s->yych = *++s->cur; - if (s->yych == '*') goto yy20; - if (s->yych == '/') goto yy22; - goto yy11; -yy16: + if (s->yych == '*') goto yy13; + if (s->yych == '/') goto yy15; + goto yy4; +yy9: s->yych = *(s->tok = ++s->cur); - if (s->yych == '?') goto yy24; - goto yy11; -yy17: + if (s->yych == '?') goto yy17; + goto yy4; +yy10: s->yych = *++s->cur; - if (s->yych == '\'') goto yy25; -yy18: + if (s->yych == '\'') goto yy18; +yy11: s->cur = s->tok; - goto yy11; -yy19: + goto yy4; +yy12: s->yych = *++s->cur; - if (s->yych == '"') goto yy17; - goto yy18; -yy20: + if (s->yych == '"') goto yy10; + goto yy11; +yy13: ++s->cur; s->cond = EStateComment;(EStateComment); goto yyc_Comment; -yy22: +yy15: ++s->cur; s->cond = EStateSkiptoeol;(EStateSkiptoeol); goto yyc_Skiptoeol; -yy24: +yy17: s->yych = *++s->cur; { static void *yytarget[256] = { - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy27, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy29, - &&yy31, &&yy33, &&yy18, &&yy18, &&yy18, &&yy35, &&yy18, &&yy37, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy39, &&yy41, &&yy43, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18 + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy20, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy22, + &&yy24, &&yy26, &&yy11, &&yy11, &&yy11, &&yy28, &&yy11, &&yy30, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy32, &&yy34, &&yy36, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11 }; goto *yytarget[s->yych]; } -yy25: +yy18: ++s->cur; fputl("'\"'", 3, stdout); continue; -yy27: +yy20: ++s->cur; fputc('|', stdout); continue; -yy29: +yy22: ++s->cur; fputc('^', stdout); continue; -yy31: +yy24: ++s->cur; fputc('[', stdout); continue; -yy33: +yy26: ++s->cur; fputc(']', stdout); continue; -yy35: +yy28: ++s->cur; fputc('~', stdout); continue; -yy37: +yy30: ++s->cur; fputc('\\', stdout); continue; -yy39: +yy32: ++s->cur; fputc('{', stdout); continue; -yy41: +yy34: ++s->cur; fputc('#', stdout); continue; -yy43: +yy36: ++s->cur; fputc('}', stdout); continue; /* *********************************** */ +yyc_Comment: + s->state = 1;(1); + if ((s->lim - s->cur) < 2) if(fill(s, 2) == ~0) break; +yyFillLabel1: + s->yych = *s->cur; + if (s->yych == '*') goto yy42; + ++s->cur; +yy41: + goto yyc_Comment; +yy42: + s->yych = *++s->cur; + if (s->yych != '/') goto yy41; + ++s->cur; + s->cond = EStateNormal;(EStateNormal); + goto yyc_Normal; +/* *********************************** */ yyc_Skiptoeol: s->state = 2;(2); if ((s->lim - s->cur) < 5) if(fill(s, 5) == ~0) break; @@ -372,8 +372,8 @@ yy62: ++s->cur; goto yyc_Skiptoeol; yy64: - ++s->cur; - if ((s->yych = *s->cur) == '\n') goto yy62; + s->yych = *++s->cur; + if (s->yych == '\n') goto yy62; goto yy57; /* *********************************** */ yyc_String: diff --git a/test/condition_13.cg.c b/test/condition_13.cg.c index 998e908..084ff3a 100644 --- a/test/condition_13.cg.c +++ b/test/condition_13.cg.c @@ -68,7 +68,7 @@ yy22: } #line 9 "condition_13.cg.re" -re2c: warning: line 3: rule matches empty string [-Wmatch-empty-string] +re2c: warning: line 3: rule in condition '0' matches empty string [-Wmatch-empty-string] re2c: warning: line 9: control flow in condition 'r1' is undefined for strings that match '[\x0-\x30\x33-\x60\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] re2c: warning: line 9: control flow in condition 'r2' is undefined for strings that match '[\x0-\x30\x33-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] re2c: warning: line 9: looks like you use hardcoded numbers instead of autogenerated condition names: better add '/*!types:re2c*/' directive or '-t, --type-header' option and don't rely on fixed condition order. [-Wcondition-order] diff --git a/test/condition_13a.cg.c b/test/condition_13a.cg.c new file mode 100644 index 0000000..c8aa76f --- /dev/null +++ b/test/condition_13a.cg.c @@ -0,0 +1,74 @@ +/* Generated by re2c */ +#line 1 "condition_13a.cg.re" + +#line 5 "condition_13a.cg.c" +{ + YYCTYPE yych; + static void *yyctable[3] = { + &&yyc_0, + &&yyc_r1, + &&yyc_r2, + }; + goto *yyctable[YYGETCONDITION()]; +/* *********************************** */ +yyc_0: + YYSETCONDITION(yycr1); + goto yyc_r1; +/* *********************************** */ +yyc_r1: + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if (yych <= '2') { + if (yych <= '0') goto yy6; + if (yych <= '1') goto yy7; + goto yy9; + } else { + if (yych <= '`') goto yy6; + if (yych <= 'a') goto yy11; + if (yych <= 'b') goto yy13; + } +yy6: +yy7: + ++YYCURSOR; + goto yyc_r1; +yy9: + ++YYCURSOR; + goto yyc_r1; +yy11: + ++YYCURSOR; + YYSETCONDITION(yycr2); + goto yyc_r2; +yy13: + ++YYCURSOR; + YYSETCONDITION(yycr2); + goto yyc_r2; +/* *********************************** */ +yyc_r2: + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if (yych <= '2') { + if (yych <= '0') goto yy17; + if (yych <= '1') goto yy18; + goto yy20; + } else { + if (yych == 'b') goto yy22; + } +yy17: +yy18: + ++YYCURSOR; + YYSETCONDITION(yycr1); + goto yyc_r1; +yy20: + ++YYCURSOR; + YYSETCONDITION(yycr1); + goto yyc_r1; +yy22: + ++YYCURSOR; + goto yyc_r2; +} +#line 9 "condition_13a.cg.re" + +re2c: warning: line 7: rule in condition '0' matches empty string [-Wmatch-empty-string] +re2c: warning: line 9: control flow in condition 'r1' is undefined for strings that match '[\x0-\x30\x33-\x60\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] +re2c: warning: line 9: control flow in condition 'r2' is undefined for strings that match '[\x0-\x30\x33-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] +re2c: warning: line 9: looks like you use hardcoded numbers instead of autogenerated condition names: better add '/*!types:re2c*/' directive or '-t, --type-header' option and don't rely on fixed condition order. [-Wcondition-order] diff --git a/test/condition_13a.cg.re b/test/condition_13a.cg.re new file mode 100644 index 0000000..ef9fd84 --- /dev/null +++ b/test/condition_13a.cg.re @@ -0,0 +1,9 @@ +/*!re2c + +<*> "1" :=> r1 +<*> "2" :=> r1 + "a" :=> r2 + "b" :=> r2 +<> :=> r1 + +*/ diff --git a/test/condition_14.cbif.c b/test/condition_14.cbif.c index ed01557..3463512 100644 --- a/test/condition_14.cbif.c +++ b/test/condition_14.cbif.c @@ -5,7 +5,6 @@ #define BSIZE 8192 - enum ScanContition { EStateNormal, EStateComment, @@ -85,6 +84,7 @@ void scan(Scanner *s) case 2: goto yyFillLabel2; case 3: goto yyFillLabel3; } + for(;;) { s->tok = s->cur; @@ -105,133 +105,133 @@ yy0: } } /* *********************************** */ -yyc_Comment: - s->state = 0;(0); - if ((s->lim - s->cur) < 2) if (fill(s, 2) == ~0) break; -yyFillLabel0: - s->yych = *s->cur; - if (s->yych == '*') goto yy5; - ++s->cur; -yy4: - continue; -yy5: - s->yych = *++s->cur; - if (s->yych != '/') goto yy4; - ++s->cur; - s->cond = EStateNormal;(EStateNormal); - continue; -/* *********************************** */ yyc_Normal: - s->state = 1;(1); + s->state = 0;(0); if ((s->lim - s->cur) < 4) if (fill(s, 4) == ~0) break; -yyFillLabel1: +yyFillLabel0: s->yych = *s->cur; if (s->yych <= '\'') { - if (s->yych == '"') goto yy12; - if (s->yych >= '\'') goto yy14; + if (s->yych == '"') goto yy5; + if (s->yych >= '\'') goto yy7; } else { if (s->yych <= '/') { - if (s->yych >= '/') goto yy15; + if (s->yych >= '/') goto yy8; } else { - if (s->yych == '?') goto yy16; + if (s->yych == '?') goto yy9; } } ++s->cur; -yy11: +yy4: fputc(s->cur[-1], stdout); continue; -yy12: +yy5: ++s->cur; s->cond = EStateString;(EStateString); fputc(s->cur[-1], stdout); continue; -yy14: +yy7: s->yych = *(s->tok = ++s->cur); - if (s->yych == '"') goto yy17; - if (s->yych == '\\') goto yy19; - goto yy11; -yy15: + if (s->yych == '"') goto yy10; + if (s->yych == '\\') goto yy12; + goto yy4; +yy8: s->yych = *++s->cur; - if (s->yych == '*') goto yy20; - if (s->yych == '/') goto yy22; - goto yy11; -yy16: + if (s->yych == '*') goto yy13; + if (s->yych == '/') goto yy15; + goto yy4; +yy9: s->yych = *(s->tok = ++s->cur); - if (s->yych == '?') goto yy24; - goto yy11; -yy17: + if (s->yych == '?') goto yy17; + goto yy4; +yy10: s->yych = *++s->cur; - if (s->yych == '\'') goto yy25; -yy18: + if (s->yych == '\'') goto yy18; +yy11: s->cur = s->tok; - goto yy11; -yy19: + goto yy4; +yy12: s->yych = *++s->cur; - if (s->yych == '"') goto yy17; - goto yy18; -yy20: + if (s->yych == '"') goto yy10; + goto yy11; +yy13: ++s->cur; s->cond = EStateComment;(EStateComment); continue; -yy22: +yy15: ++s->cur; s->cond = EStateSkiptoeol;(EStateSkiptoeol); continue; -yy24: +yy17: s->yych = *++s->cur; switch (s->yych) { - case '!': goto yy27; - case '\'': goto yy29; - case '(': goto yy31; - case ')': goto yy33; - case '-': goto yy35; - case '/': goto yy37; - case '<': goto yy39; - case '=': goto yy41; - case '>': goto yy43; - default: goto yy18; + case '!': goto yy20; + case '\'': goto yy22; + case '(': goto yy24; + case ')': goto yy26; + case '-': goto yy28; + case '/': goto yy30; + case '<': goto yy32; + case '=': goto yy34; + case '>': goto yy36; + default: goto yy11; } -yy25: +yy18: ++s->cur; fputl("'\"'", 3, stdout); continue; -yy27: +yy20: ++s->cur; fputc('|', stdout); continue; -yy29: +yy22: ++s->cur; fputc('^', stdout); continue; -yy31: +yy24: ++s->cur; fputc('[', stdout); continue; -yy33: +yy26: ++s->cur; fputc(']', stdout); continue; -yy35: +yy28: ++s->cur; fputc('~', stdout); continue; -yy37: +yy30: ++s->cur; fputc('\\', stdout); continue; -yy39: +yy32: ++s->cur; fputc('{', stdout); continue; -yy41: +yy34: ++s->cur; fputc('#', stdout); continue; -yy43: +yy36: ++s->cur; fputc('}', stdout); continue; /* *********************************** */ +yyc_Comment: + s->state = 1;(1); + if ((s->lim - s->cur) < 2) if (fill(s, 2) == ~0) break; +yyFillLabel1: + s->yych = *s->cur; + if (s->yych == '*') goto yy42; + ++s->cur; +yy41: + continue; +yy42: + s->yych = *++s->cur; + if (s->yych != '/') goto yy41; + ++s->cur; + s->cond = EStateNormal;(EStateNormal); + continue; +/* *********************************** */ yyc_Skiptoeol: s->state = 2;(2); if ((s->lim - s->cur) < 5) if (fill(s, 5) == ~0) break; @@ -296,8 +296,8 @@ yy62: ++s->cur; continue; yy64: - ++s->cur; - if ((s->yych = *s->cur) == '\n') goto yy62; + s->yych = *++s->cur; + if (s->yych == '\n') goto yy62; goto yy57; /* *********************************** */ yyc_String: diff --git a/test/condition_14.cgif.c b/test/condition_14.cgif.c index 7cb4aed..70e237f 100644 --- a/test/condition_14.cgif.c +++ b/test/condition_14.cgif.c @@ -5,7 +5,6 @@ #define BSIZE 8192 - enum ScanContition { EStateNormal, EStateComment, @@ -85,6 +84,7 @@ void scan(Scanner *s) case 2: goto yyFillLabel2; case 3: goto yyFillLabel3; } + for(;;) { s->tok = s->cur; @@ -100,186 +100,186 @@ void scan(Scanner *s) yy0: goto *yyctable[s->cond]; /* *********************************** */ -yyc_Comment: - s->state = 0;(0); - if ((s->lim - s->cur) < 2) if (fill(s, 2) == ~0) break; -yyFillLabel0: - s->yych = *s->cur; - if (s->yych == '*') goto yy5; - ++s->cur; -yy4: - continue; -yy5: - s->yych = *++s->cur; - if (s->yych != '/') goto yy4; - ++s->cur; - s->cond = EStateNormal;(EStateNormal); - continue; -/* *********************************** */ yyc_Normal: - s->state = 1;(1); + s->state = 0;(0); if ((s->lim - s->cur) < 4) if (fill(s, 4) == ~0) break; -yyFillLabel1: +yyFillLabel0: s->yych = *s->cur; { static void *yytarget[256] = { - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy12, &&yy10, &&yy10, &&yy10, &&yy10, &&yy14, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy15, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy16, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, - &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10, &&yy10 + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy5, &&yy3, &&yy3, &&yy3, &&yy3, &&yy7, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy8, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy9, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3 }; goto *yytarget[s->yych]; } -yy10: +yy3: ++s->cur; -yy11: +yy4: fputc(s->cur[-1], stdout); continue; -yy12: +yy5: ++s->cur; s->cond = EStateString;(EStateString); fputc(s->cur[-1], stdout); continue; -yy14: +yy7: s->yych = *(s->tok = ++s->cur); - if (s->yych == '"') goto yy17; - if (s->yych == '\\') goto yy19; - goto yy11; -yy15: + if (s->yych == '"') goto yy10; + if (s->yych == '\\') goto yy12; + goto yy4; +yy8: s->yych = *++s->cur; - if (s->yych == '*') goto yy20; - if (s->yych == '/') goto yy22; - goto yy11; -yy16: + if (s->yych == '*') goto yy13; + if (s->yych == '/') goto yy15; + goto yy4; +yy9: s->yych = *(s->tok = ++s->cur); - if (s->yych == '?') goto yy24; - goto yy11; -yy17: + if (s->yych == '?') goto yy17; + goto yy4; +yy10: s->yych = *++s->cur; - if (s->yych == '\'') goto yy25; -yy18: + if (s->yych == '\'') goto yy18; +yy11: s->cur = s->tok; - goto yy11; -yy19: + goto yy4; +yy12: s->yych = *++s->cur; - if (s->yych == '"') goto yy17; - goto yy18; -yy20: + if (s->yych == '"') goto yy10; + goto yy11; +yy13: ++s->cur; s->cond = EStateComment;(EStateComment); continue; -yy22: +yy15: ++s->cur; s->cond = EStateSkiptoeol;(EStateSkiptoeol); continue; -yy24: +yy17: s->yych = *++s->cur; { static void *yytarget[256] = { - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy27, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy29, - &&yy31, &&yy33, &&yy18, &&yy18, &&yy18, &&yy35, &&yy18, &&yy37, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy39, &&yy41, &&yy43, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, - &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18 + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy20, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy22, + &&yy24, &&yy26, &&yy11, &&yy11, &&yy11, &&yy28, &&yy11, &&yy30, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy32, &&yy34, &&yy36, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, + &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11, &&yy11 }; goto *yytarget[s->yych]; } -yy25: +yy18: ++s->cur; fputl("'\"'", 3, stdout); continue; -yy27: +yy20: ++s->cur; fputc('|', stdout); continue; -yy29: +yy22: ++s->cur; fputc('^', stdout); continue; -yy31: +yy24: ++s->cur; fputc('[', stdout); continue; -yy33: +yy26: ++s->cur; fputc(']', stdout); continue; -yy35: +yy28: ++s->cur; fputc('~', stdout); continue; -yy37: +yy30: ++s->cur; fputc('\\', stdout); continue; -yy39: +yy32: ++s->cur; fputc('{', stdout); continue; -yy41: +yy34: ++s->cur; fputc('#', stdout); continue; -yy43: +yy36: ++s->cur; fputc('}', stdout); continue; /* *********************************** */ +yyc_Comment: + s->state = 1;(1); + if ((s->lim - s->cur) < 2) if (fill(s, 2) == ~0) break; +yyFillLabel1: + s->yych = *s->cur; + if (s->yych == '*') goto yy42; + ++s->cur; +yy41: + continue; +yy42: + s->yych = *++s->cur; + if (s->yych != '/') goto yy41; + ++s->cur; + s->cond = EStateNormal;(EStateNormal); + continue; +/* *********************************** */ yyc_Skiptoeol: s->state = 2;(2); if ((s->lim - s->cur) < 5) if (fill(s, 5) == ~0) break; @@ -372,8 +372,8 @@ yy62: ++s->cur; continue; yy64: - ++s->cur; - if ((s->yych = *s->cur) == '\n') goto yy62; + s->yych = *++s->cur; + if (s->yych == '\n') goto yy62; goto yy57; /* *********************************** */ yyc_String: diff --git a/test/condition_14.cif.c b/test/condition_14.cif.c index e374ae4..837f948 100644 --- a/test/condition_14.cif.c +++ b/test/condition_14.cif.c @@ -5,7 +5,6 @@ #define BSIZE 8192 - enum ScanContition { EStateNormal, EStateComment, @@ -85,6 +84,7 @@ void scan(Scanner *s) case 2: goto yyFillLabel2; case 3: goto yyFillLabel3; } + for(;;) { s->tok = s->cur; @@ -98,150 +98,150 @@ yy0: case EStateString: goto yyc_String; } /* *********************************** */ -yyc_Comment: +yyc_Normal: s->state = 0;(0); - if ((s->lim - s->cur) < 2) if (fill(s, 2) == ~0) break; + if ((s->lim - s->cur) < 4) if (fill(s, 4) == ~0) break; yyFillLabel0: s->yych = *s->cur; switch (s->yych) { - case '*': goto yy5; + case '"': goto yy5; + case '\'': goto yy7; + case '/': goto yy8; + case '?': goto yy9; default: goto yy3; } yy3: ++s->cur; yy4: - continue; -yy5: - s->yych = *++s->cur; - switch (s->yych) { - case '/': goto yy6; - default: goto yy4; - } -yy6: - ++s->cur; - s->cond = EStateNormal;(EStateNormal); - continue; -/* *********************************** */ -yyc_Normal: - s->state = 1;(1); - if ((s->lim - s->cur) < 4) if (fill(s, 4) == ~0) break; -yyFillLabel1: - s->yych = *s->cur; - switch (s->yych) { - case '"': goto yy12; - case '\'': goto yy14; - case '/': goto yy15; - case '?': goto yy16; - default: goto yy10; - } -yy10: - ++s->cur; -yy11: fputc(s->cur[-1], stdout); continue; -yy12: +yy5: ++s->cur; s->cond = EStateString;(EStateString); fputc(s->cur[-1], stdout); continue; -yy14: +yy7: s->yych = *(s->tok = ++s->cur); switch (s->yych) { - case '"': goto yy17; - case '\\': goto yy19; - default: goto yy11; + case '"': goto yy10; + case '\\': goto yy12; + default: goto yy4; } -yy15: +yy8: s->yych = *++s->cur; switch (s->yych) { - case '*': goto yy20; - case '/': goto yy22; - default: goto yy11; + case '*': goto yy13; + case '/': goto yy15; + default: goto yy4; } -yy16: +yy9: s->yych = *(s->tok = ++s->cur); switch (s->yych) { - case '?': goto yy24; - default: goto yy11; + case '?': goto yy17; + default: goto yy4; } -yy17: +yy10: s->yych = *++s->cur; switch (s->yych) { - case '\'': goto yy25; - default: goto yy18; + case '\'': goto yy18; + default: goto yy11; } -yy18: +yy11: s->cur = s->tok; - goto yy11; -yy19: + goto yy4; +yy12: s->yych = *++s->cur; switch (s->yych) { - case '"': goto yy17; - default: goto yy18; + case '"': goto yy10; + default: goto yy11; } -yy20: +yy13: ++s->cur; s->cond = EStateComment;(EStateComment); continue; -yy22: +yy15: ++s->cur; s->cond = EStateSkiptoeol;(EStateSkiptoeol); continue; -yy24: +yy17: s->yych = *++s->cur; switch (s->yych) { - case '!': goto yy27; - case '\'': goto yy29; - case '(': goto yy31; - case ')': goto yy33; - case '-': goto yy35; - case '/': goto yy37; - case '<': goto yy39; - case '=': goto yy41; - case '>': goto yy43; - default: goto yy18; + case '!': goto yy20; + case '\'': goto yy22; + case '(': goto yy24; + case ')': goto yy26; + case '-': goto yy28; + case '/': goto yy30; + case '<': goto yy32; + case '=': goto yy34; + case '>': goto yy36; + default: goto yy11; } -yy25: +yy18: ++s->cur; fputl("'\"'", 3, stdout); continue; -yy27: +yy20: ++s->cur; fputc('|', stdout); continue; -yy29: +yy22: ++s->cur; fputc('^', stdout); continue; -yy31: +yy24: ++s->cur; fputc('[', stdout); continue; -yy33: +yy26: ++s->cur; fputc(']', stdout); continue; -yy35: +yy28: ++s->cur; fputc('~', stdout); continue; -yy37: +yy30: ++s->cur; fputc('\\', stdout); continue; -yy39: +yy32: ++s->cur; fputc('{', stdout); continue; -yy41: +yy34: ++s->cur; fputc('#', stdout); continue; -yy43: +yy36: ++s->cur; fputc('}', stdout); continue; /* *********************************** */ +yyc_Comment: + s->state = 1;(1); + if ((s->lim - s->cur) < 2) if (fill(s, 2) == ~0) break; +yyFillLabel1: + s->yych = *s->cur; + switch (s->yych) { + case '*': goto yy42; + default: goto yy40; + } +yy40: + ++s->cur; +yy41: + continue; +yy42: + s->yych = *++s->cur; + switch (s->yych) { + case '/': goto yy43; + default: goto yy41; + } +yy43: + ++s->cur; + s->cond = EStateNormal;(EStateNormal); + continue; +/* *********************************** */ yyc_Skiptoeol: s->state = 2;(2); if ((s->lim - s->cur) < 5) if (fill(s, 5) == ~0) break; @@ -317,8 +317,8 @@ yy62: ++s->cur; continue; yy64: - ++s->cur; - switch ((s->yych = *s->cur)) { + s->yych = *++s->cur; + switch (s->yych) { case '\n': goto yy62; default: goto yy57; } diff --git a/test/condition_14.csif.c b/test/condition_14.csif.c index ed01557..3463512 100644 --- a/test/condition_14.csif.c +++ b/test/condition_14.csif.c @@ -5,7 +5,6 @@ #define BSIZE 8192 - enum ScanContition { EStateNormal, EStateComment, @@ -85,6 +84,7 @@ void scan(Scanner *s) case 2: goto yyFillLabel2; case 3: goto yyFillLabel3; } + for(;;) { s->tok = s->cur; @@ -105,133 +105,133 @@ yy0: } } /* *********************************** */ -yyc_Comment: - s->state = 0;(0); - if ((s->lim - s->cur) < 2) if (fill(s, 2) == ~0) break; -yyFillLabel0: - s->yych = *s->cur; - if (s->yych == '*') goto yy5; - ++s->cur; -yy4: - continue; -yy5: - s->yych = *++s->cur; - if (s->yych != '/') goto yy4; - ++s->cur; - s->cond = EStateNormal;(EStateNormal); - continue; -/* *********************************** */ yyc_Normal: - s->state = 1;(1); + s->state = 0;(0); if ((s->lim - s->cur) < 4) if (fill(s, 4) == ~0) break; -yyFillLabel1: +yyFillLabel0: s->yych = *s->cur; if (s->yych <= '\'') { - if (s->yych == '"') goto yy12; - if (s->yych >= '\'') goto yy14; + if (s->yych == '"') goto yy5; + if (s->yych >= '\'') goto yy7; } else { if (s->yych <= '/') { - if (s->yych >= '/') goto yy15; + if (s->yych >= '/') goto yy8; } else { - if (s->yych == '?') goto yy16; + if (s->yych == '?') goto yy9; } } ++s->cur; -yy11: +yy4: fputc(s->cur[-1], stdout); continue; -yy12: +yy5: ++s->cur; s->cond = EStateString;(EStateString); fputc(s->cur[-1], stdout); continue; -yy14: +yy7: s->yych = *(s->tok = ++s->cur); - if (s->yych == '"') goto yy17; - if (s->yych == '\\') goto yy19; - goto yy11; -yy15: + if (s->yych == '"') goto yy10; + if (s->yych == '\\') goto yy12; + goto yy4; +yy8: s->yych = *++s->cur; - if (s->yych == '*') goto yy20; - if (s->yych == '/') goto yy22; - goto yy11; -yy16: + if (s->yych == '*') goto yy13; + if (s->yych == '/') goto yy15; + goto yy4; +yy9: s->yych = *(s->tok = ++s->cur); - if (s->yych == '?') goto yy24; - goto yy11; -yy17: + if (s->yych == '?') goto yy17; + goto yy4; +yy10: s->yych = *++s->cur; - if (s->yych == '\'') goto yy25; -yy18: + if (s->yych == '\'') goto yy18; +yy11: s->cur = s->tok; - goto yy11; -yy19: + goto yy4; +yy12: s->yych = *++s->cur; - if (s->yych == '"') goto yy17; - goto yy18; -yy20: + if (s->yych == '"') goto yy10; + goto yy11; +yy13: ++s->cur; s->cond = EStateComment;(EStateComment); continue; -yy22: +yy15: ++s->cur; s->cond = EStateSkiptoeol;(EStateSkiptoeol); continue; -yy24: +yy17: s->yych = *++s->cur; switch (s->yych) { - case '!': goto yy27; - case '\'': goto yy29; - case '(': goto yy31; - case ')': goto yy33; - case '-': goto yy35; - case '/': goto yy37; - case '<': goto yy39; - case '=': goto yy41; - case '>': goto yy43; - default: goto yy18; + case '!': goto yy20; + case '\'': goto yy22; + case '(': goto yy24; + case ')': goto yy26; + case '-': goto yy28; + case '/': goto yy30; + case '<': goto yy32; + case '=': goto yy34; + case '>': goto yy36; + default: goto yy11; } -yy25: +yy18: ++s->cur; fputl("'\"'", 3, stdout); continue; -yy27: +yy20: ++s->cur; fputc('|', stdout); continue; -yy29: +yy22: ++s->cur; fputc('^', stdout); continue; -yy31: +yy24: ++s->cur; fputc('[', stdout); continue; -yy33: +yy26: ++s->cur; fputc(']', stdout); continue; -yy35: +yy28: ++s->cur; fputc('~', stdout); continue; -yy37: +yy30: ++s->cur; fputc('\\', stdout); continue; -yy39: +yy32: ++s->cur; fputc('{', stdout); continue; -yy41: +yy34: ++s->cur; fputc('#', stdout); continue; -yy43: +yy36: ++s->cur; fputc('}', stdout); continue; /* *********************************** */ +yyc_Comment: + s->state = 1;(1); + if ((s->lim - s->cur) < 2) if (fill(s, 2) == ~0) break; +yyFillLabel1: + s->yych = *s->cur; + if (s->yych == '*') goto yy42; + ++s->cur; +yy41: + continue; +yy42: + s->yych = *++s->cur; + if (s->yych != '/') goto yy41; + ++s->cur; + s->cond = EStateNormal;(EStateNormal); + continue; +/* *********************************** */ yyc_Skiptoeol: s->state = 2;(2); if ((s->lim - s->cur) < 5) if (fill(s, 5) == ~0) break; @@ -296,8 +296,8 @@ yy62: ++s->cur; continue; yy64: - ++s->cur; - if ((s->yych = *s->cur) == '\n') goto yy62; + s->yych = *++s->cur; + if (s->yych == '\n') goto yy62; goto yy57; /* *********************************** */ yyc_String: diff --git a/test/condition_15.csif.c b/test/condition_15.csif.c index 2c38f45..a9b8703 100644 --- a/test/condition_15.csif.c +++ b/test/condition_15.csif.c @@ -5,7 +5,6 @@ #define BSIZE 8192 - enum ScanContition { EStateNormal, EStateComment, @@ -85,6 +84,7 @@ void scan(Scanner *s) case 2: goto yyFillLabel2; case 3: goto yyFillLabel3; } + for(;;) { s->tok = s->cur; @@ -105,145 +105,145 @@ yy0: } } /* *********************************** */ -yyc_Comment: - s->state = 0;(0); - if ((s->lim - s->cur) < 2) if (fill(s, 2) == ~0) break; -yyFillLabel0: - s->yych = *s->cur; - if (s->yych == '*') goto yy5; - ++s->cur; -yy4: - continue; -yy5: - s->yych = *++s->cur; - if (s->yych != '/') goto yy4; - ++s->cur; - s->cond = EStateNormal;(EStateNormal); - continue; -/* *********************************** */ yyc_Normal: - s->state = 1;(1); + s->state = 0;(0); if ((s->lim - s->cur) < 4) if (fill(s, 4) == ~0) break; -yyFillLabel1: +yyFillLabel0: s->yych = *s->cur; if (s->yych <= '\'') { - if (s->yych == '"') goto yy12; - if (s->yych >= '\'') goto yy14; + if (s->yych == '"') goto yy5; + if (s->yych >= '\'') goto yy7; } else { if (s->yych <= '/') { - if (s->yych >= '/') goto yy15; + if (s->yych >= '/') goto yy8; } else { - if (s->yych == '?') goto yy16; + if (s->yych == '?') goto yy9; } } ++s->cur; -yy11: +yy4: fprintf(stderr, "Normal\n"); fputc(s->cur[-1], stdout); continue; -yy12: +yy5: ++s->cur; s->cond = EStateString;(EStateString); fprintf(stderr, "Normal\n"); fputc(s->cur[-1], stdout); continue; -yy14: +yy7: s->yych = *(s->tok = ++s->cur); - if (s->yych == '"') goto yy17; - if (s->yych == '\\') goto yy19; - goto yy11; -yy15: + if (s->yych == '"') goto yy10; + if (s->yych == '\\') goto yy12; + goto yy4; +yy8: s->yych = *++s->cur; - if (s->yych == '*') goto yy20; - if (s->yych == '/') goto yy22; - goto yy11; -yy16: + if (s->yych == '*') goto yy13; + if (s->yych == '/') goto yy15; + goto yy4; +yy9: s->yych = *(s->tok = ++s->cur); - if (s->yych == '?') goto yy24; - goto yy11; -yy17: + if (s->yych == '?') goto yy17; + goto yy4; +yy10: s->yych = *++s->cur; - if (s->yych == '\'') goto yy25; -yy18: + if (s->yych == '\'') goto yy18; +yy11: s->cur = s->tok; - goto yy11; -yy19: + goto yy4; +yy12: s->yych = *++s->cur; - if (s->yych == '"') goto yy17; - goto yy18; -yy20: + if (s->yych == '"') goto yy10; + goto yy11; +yy13: ++s->cur; s->cond = EStateComment;(EStateComment); continue; -yy22: +yy15: ++s->cur; s->cond = EStateSkiptoeol;(EStateSkiptoeol); continue; -yy24: +yy17: s->yych = *++s->cur; switch (s->yych) { - case '!': goto yy27; - case '\'': goto yy29; - case '(': goto yy31; - case ')': goto yy33; - case '-': goto yy35; - case '/': goto yy37; - case '<': goto yy39; - case '=': goto yy41; - case '>': goto yy43; - default: goto yy18; + case '!': goto yy20; + case '\'': goto yy22; + case '(': goto yy24; + case ')': goto yy26; + case '-': goto yy28; + case '/': goto yy30; + case '<': goto yy32; + case '=': goto yy34; + case '>': goto yy36; + default: goto yy11; } -yy25: +yy18: ++s->cur; fprintf(stderr, "Normal\n"); fputl("'\"'", 3, stdout); continue; -yy27: +yy20: ++s->cur; fprintf(stderr, "Normal\n"); fputc('|', stdout); continue; -yy29: +yy22: ++s->cur; fprintf(stderr, "Normal\n"); fputc('^', stdout); continue; -yy31: +yy24: ++s->cur; fprintf(stderr, "Normal\n"); fputc('[', stdout); continue; -yy33: +yy26: ++s->cur; fprintf(stderr, "Normal\n"); fputc(']', stdout); continue; -yy35: +yy28: ++s->cur; fprintf(stderr, "Normal\n"); fputc('~', stdout); continue; -yy37: +yy30: ++s->cur; fprintf(stderr, "Normal\n"); fputc('\\', stdout); continue; -yy39: +yy32: ++s->cur; fprintf(stderr, "Normal\n"); fputc('{', stdout); continue; -yy41: +yy34: ++s->cur; fprintf(stderr, "Normal\n"); fputc('#', stdout); continue; -yy43: +yy36: ++s->cur; fprintf(stderr, "Normal\n"); fputc('}', stdout); continue; /* *********************************** */ +yyc_Comment: + s->state = 1;(1); + if ((s->lim - s->cur) < 2) if (fill(s, 2) == ~0) break; +yyFillLabel1: + s->yych = *s->cur; + if (s->yych == '*') goto yy42; + ++s->cur; +yy41: + continue; +yy42: + s->yych = *++s->cur; + if (s->yych != '/') goto yy41; + ++s->cur; + s->cond = EStateNormal;(EStateNormal); + continue; +/* *********************************** */ yyc_Skiptoeol: s->state = 2;(2); if ((s->lim - s->cur) < 5) if (fill(s, 5) == ~0) break; @@ -310,8 +310,8 @@ yy62: ++s->cur; continue; yy64: - ++s->cur; - if ((s->yych = *s->cur) == '\n') goto yy62; + s->yych = *++s->cur; + if (s->yych == '\n') goto yy62; goto yy57; /* *********************************** */ yyc_String: diff --git a/test/condtype_decl.c.c b/test/condtype_decl.c.c index fbdd797..a6fd66d 100644 --- a/test/condtype_decl.c.c +++ b/test/condtype_decl.c.c @@ -1,21 +1,20 @@ /* Generated by re2c */ #line 1 "condtype_decl.c.re" #line 4 "condtype_decl.c.c" - enum YYCONDTYPE { yyca, yycb, }; - #line 1 "condtype_decl.c.re" + int main () { YYCONDTYPE cond; char * YYCURSOR; #define YYGETCONDITION() cond -#line 19 "condtype_decl.c.c" +#line 18 "condtype_decl.c.c" { unsigned char yych; switch (YYGETCONDITION()) { @@ -34,7 +33,7 @@ yy4: ++YYCURSOR; #line 11 "condtype_decl.c.re" {} -#line 38 "condtype_decl.c.c" +#line 37 "condtype_decl.c.c" /* *********************************** */ yyc_b: yych = *YYCURSOR; @@ -47,7 +46,7 @@ yy9: ++YYCURSOR; #line 12 "condtype_decl.c.re" {} -#line 51 "condtype_decl.c.c" +#line 50 "condtype_decl.c.c" } #line 13 "condtype_decl.c.re" diff --git a/test/condtype_decl.cg.c b/test/condtype_decl.cg.c index 2daa781..5863484 100644 --- a/test/condtype_decl.cg.c +++ b/test/condtype_decl.cg.c @@ -1,21 +1,20 @@ /* Generated by re2c */ #line 1 "condtype_decl.cg.re" #line 4 "condtype_decl.cg.c" - enum YYCONDTYPE { yyca, yycb, }; - #line 1 "condtype_decl.cg.re" + int main () { YYCONDTYPE cond; char * YYCURSOR; #define YYGETCONDITION() cond -#line 19 "condtype_decl.cg.c" +#line 18 "condtype_decl.cg.c" { unsigned char yych; static void *yyctable[2] = { @@ -31,7 +30,7 @@ yy4: ++YYCURSOR; #line 11 "condtype_decl.cg.re" {} -#line 35 "condtype_decl.cg.c" +#line 34 "condtype_decl.cg.c" /* *********************************** */ yyc_b: yych = *YYCURSOR; @@ -40,7 +39,7 @@ yy9: ++YYCURSOR; #line 12 "condtype_decl.cg.re" {} -#line 44 "condtype_decl.cg.c" +#line 43 "condtype_decl.cg.c" } #line 13 "condtype_decl.cg.re" diff --git a/test/condtype_decl.cs.c b/test/condtype_decl.cs.c index ed60c69..14b1873 100644 --- a/test/condtype_decl.cs.c +++ b/test/condtype_decl.cs.c @@ -1,21 +1,20 @@ /* Generated by re2c */ #line 1 "condtype_decl.cs.re" #line 4 "condtype_decl.cs.c" - enum YYCONDTYPE { yyca, yycb, }; - #line 1 "condtype_decl.cs.re" + int main () { YYCONDTYPE cond; char * YYCURSOR; #define YYGETCONDITION() cond -#line 19 "condtype_decl.cs.c" +#line 18 "condtype_decl.cs.c" { unsigned char yych; if (YYGETCONDITION() < 1) { @@ -31,7 +30,7 @@ yy4: ++YYCURSOR; #line 11 "condtype_decl.cs.re" {} -#line 35 "condtype_decl.cs.c" +#line 34 "condtype_decl.cs.c" /* *********************************** */ yyc_b: yych = *YYCURSOR; @@ -40,7 +39,7 @@ yy9: ++YYCURSOR; #line 12 "condtype_decl.cs.re" {} -#line 44 "condtype_decl.cs.c" +#line 43 "condtype_decl.cs.c" } #line 13 "condtype_decl.cs.re" diff --git a/test/condtype_forwdecl.cg.c b/test/condtype_forwdecl.cg.c index 425031c..ae1f36b 100644 --- a/test/condtype_forwdecl.cg.c +++ b/test/condtype_forwdecl.cg.c @@ -41,12 +41,11 @@ yy9: } #line 44 "condtype_forwdecl.cg.c" - enum cond_t : int { yyca, yycb, }; - #line 18 "condtype_forwdecl.cg.re" + re2c: warning: line 14: control flow in condition 'a' is undefined for strings that match '[\x0-\x60\x62-\xFF]', use default rule '*' [-Wundefined-control-flow] re2c: warning: line 14: control flow in condition 'b' is undefined for strings that match '[\x0-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] diff --git a/test/condtype_forwdecl.cs.c b/test/condtype_forwdecl.cs.c index d3a4d7e..b408b86 100644 --- a/test/condtype_forwdecl.cs.c +++ b/test/condtype_forwdecl.cs.c @@ -41,12 +41,11 @@ yy9: } #line 44 "condtype_forwdecl.cs.c" - enum cond_t : int { yyca, yycb, }; - #line 18 "condtype_forwdecl.cs.re" + re2c: warning: line 14: control flow in condition 'a' is undefined for strings that match '[\x0-\x60\x62-\xFF]', use default rule '*' [-Wundefined-control-flow] re2c: warning: line 14: control flow in condition 'b' is undefined for strings that match '[\x0-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow] diff --git a/test/condtype_yysetcondition.cg.c b/test/condtype_yysetcondition.cg.c index 86f9baf..6c80dfa 100644 --- a/test/condtype_yysetcondition.cg.c +++ b/test/condtype_yysetcondition.cg.c @@ -29,26 +29,25 @@ int main () }; goto *yyctable[YYGETCONDITION()]; /* *********************************** */ +yyc_b: + yych = *YYCURSOR++; +#line 24 "condtype_yysetcondition.cg.re" + { printf ("b\n"); break; } +#line 37 "condtype_yysetcondition.cg.c" +/* *********************************** */ yyc_a: yych = *YYCURSOR; - if (yych == 'a') goto yy5; + if (yych == 'a') goto yy9; ++YYCURSOR; YYSETCONDITION(yycb); #line 27 "condtype_yysetcondition.cg.re" { printf ("a => b\n"); continue; } -#line 40 "condtype_yysetcondition.cg.c" -yy5: +#line 46 "condtype_yysetcondition.cg.c" +yy9: ++YYCURSOR; #line 26 "condtype_yysetcondition.cg.re" { printf ("a\n"); continue; } -#line 45 "condtype_yysetcondition.cg.c" -/* *********************************** */ -yyc_b: - yych = *YYCURSOR; - ++YYCURSOR; -#line 24 "condtype_yysetcondition.cg.re" - { printf ("b\n"); break; } -#line 52 "condtype_yysetcondition.cg.c" +#line 51 "condtype_yysetcondition.cg.c" } #line 28 "condtype_yysetcondition.cg.re" diff --git a/test/condtype_yysetcondition.cs.c b/test/condtype_yysetcondition.cs.c index 87cc0f5..2ead999 100644 --- a/test/condtype_yysetcondition.cs.c +++ b/test/condtype_yysetcondition.cs.c @@ -29,26 +29,25 @@ int main () goto yyc_a; } /* *********************************** */ +yyc_b: + yych = *YYCURSOR++; +#line 24 "condtype_yysetcondition.cs.re" + { printf ("b\n"); break; } +#line 37 "condtype_yysetcondition.cs.c" +/* *********************************** */ yyc_a: yych = *YYCURSOR; - if (yych == 'a') goto yy5; + if (yych == 'a') goto yy9; ++YYCURSOR; YYSETCONDITION(yycb); #line 27 "condtype_yysetcondition.cs.re" { printf ("a => b\n"); continue; } -#line 40 "condtype_yysetcondition.cs.c" -yy5: +#line 46 "condtype_yysetcondition.cs.c" +yy9: ++YYCURSOR; #line 26 "condtype_yysetcondition.cs.re" { printf ("a\n"); continue; } -#line 45 "condtype_yysetcondition.cs.c" -/* *********************************** */ -yyc_b: - yych = *YYCURSOR; - ++YYCURSOR; -#line 24 "condtype_yysetcondition.cs.re" - { printf ("b\n"); break; } -#line 52 "condtype_yysetcondition.cs.c" +#line 51 "condtype_yysetcondition.cs.c" } #line 28 "condtype_yysetcondition.cs.re" diff --git a/test/config/flags.c b/test/config/flags.c new file mode 100644 index 0000000..8d5fcb7 --- /dev/null +++ b/test/config/flags.c @@ -0,0 +1,3 @@ +/* Generated by re2c */ +#line 1 "config/flags.re" + diff --git a/test/config/flags.re b/test/config/flags.re new file mode 100644 index 0000000..16e91a5 --- /dev/null +++ b/test/config/flags.re @@ -0,0 +1,44 @@ +/*!re2c + re2c:flags:b = 0; + re2c:flags:bit-vectors = 1; + re2c:flags:d = 0; + re2c:flags:debug-output = 1; + re2c:flags:g = 0; + re2c:flags:computed-gotos = 1; + re2c:flags:i = 0; + re2c:flags:no-debug-info = 1; + re2c:flags:s = 0; + re2c:flags:nested-ifs = 1; + re2c:flags:T = 0; + re2c:flags:tags = 1; + re2c:flags:case-insensitive = 0; + re2c:flags:case-inverted = 1; + re2c:flags:lookahead = 0; + re2c:flags:optimize-tags = 0; + re2c:flags:eager-skip = 1; + + re2c:flags:e = 1; + re2c:flags:ecb = 0; + re2c:flags:u = 1; + re2c:flags:unicode = 0; + re2c:flags:w = 1; + re2c:flags:wide-chars = 0; + re2c:flags:x = 1; + re2c:flags:utf-16 = 0; + re2c:flags:8 = 1; + re2c:flags:utf-8 = 0; + + re2c:flags:encoding-policy = ignore; + re2c:flags:encoding-policy = substitute; + re2c:flags:encoding-policy = fail; + + re2c:flags:input = custom; + re2c:flags:input = default; + + re2c:flags:empty-class = match-empty; + re2c:flags:empty-class = match-none; + re2c:flags:empty-class = error; + + re2c:flags:dfa-minimization = table; + re2c:flags:dfa-minimization = moore; +*/ diff --git a/test/config10.--skeleton.c b/test/config10.--skeleton.c index be417ae81bd32f36f8059bc691aeda1e6d60f05a..9773e39153c2d10966b5fa23e370767baeaa9f71 100644 GIT binary patch delta 933 zcmaDdopEnJ;{-L~l+-l63_AsVErsIDs?_)r1ugxF64tWHnR&@Mr75WjHpL}HnR)3@ zHMyy|$pw`g{U@-nY87N>R!n}vGF!AXuQ)S3FEvF0D4<}g0G6mlNB=a zN)(baQj@defePZ2^Gowe;&U?dQq2uC;10-0EKAinq1Xj7i6X> zXn>@FjsgiQ*w`w7G;1mprIwTyv- zhyti`L+j0Eob#9_-{Af)pIlm0oL{71qmY`Prl6*#kO^dhG(p^Kz4;Z76O#uHpCHuf zC}ip=7;AzZ3kotYsHss%OfJdH&x83~ZF01r!sIA^d#W0^`8apo2F|o-f2R`LvMm`Y%`Rdsz%-v)x%r~FJQEX_!sb)5T;iKA RnjdGH{J>m#^9(B=K>#^{CJ+Ds delta 2071 zcmd_mWl&U66u@zJmjyutaZy*SXW;_IE(^P$Vq+`Vq9P)qKG8*G4XkHjV&D_IyX)DC z-QC^Y-TilT#u@dqd~oK@+&ky~?m73Iv{9;C<5i=*Q>qkOnVRgN6>WAwl)bf+<;FR6 z@+)lvC!wiX@FiBu(bx6oS@0A5Bb8LgYAWrIyX#I=#AU-}$K}B3 zaXE2bxLmm0xIDPLCdp*V2NZz$fdzmCfrWsDf!@F(Km!SVaK1P{Tv1#xTyb0pTuEFh zTxnbgt_-d$t{kpBt^%$it`aU3R~c6YS5*R516Bvt0M-Q70@enG0mFfHfOT>8aP@Hw za1C*daE);hxF)!!xMsLWTytC$t_3a{*Af?lYlVx&wZ^r^zz4vGz(>Hxz$d_` zz-PecxEHvWxL3H>xHq`BxOcesxDU9GxKFsxxG%V`N>Xl@9Fl`Zot{fd-|`wMUAxz) V|M&T~{x|biQq0%Xip>({@eR&0lGp$M diff --git a/test/config10.c b/test/config10.c index aab2d81..b90448d 100644 --- a/test/config10.c +++ b/test/config10.c @@ -106,7 +106,6 @@ xx8: #line 107 "config10.c" xx9: curr = *++s.cur; - s.ctx = s.cur; switch (curr) { case '0': case '2': @@ -116,8 +115,12 @@ xx9: case '6': case '7': case '8': - case '9': goto xx10; - case '1': goto xx13; + case '9': + s.ctx = s.cur; + goto xx10; + case '1': + s.ctx = s.cur; + goto xx13; default: goto xx3; } xx10: @@ -141,10 +144,10 @@ xx12: s.cur = s.ctx; #line 56 "config10.re" { return KEYWORD; } -#line 145 "config10.c" +#line 148 "config10.c" xx13: - ++s.cur; - switch ((curr = *s.cur)) { + curr = *++s.cur; + switch (curr) { case '0': case '1': case '2': @@ -158,10 +161,10 @@ xx13: default: goto xx14; } xx14: - s.cur = s.ctx; + s.cur -= 1; #line 55 "config10.re" { return KEYWORD; } -#line 165 "config10.c" +#line 168 "config10.c" } #line 70 "config10.re" diff --git a/test/config12_error1.c b/test/config12_error1.c index af2a4f4..fb53b64 100644 --- a/test/config12_error1.c +++ b/test/config12_error1.c @@ -1 +1 @@ -re2c: error: line 3, column 7: unrecognized configuration +re2c: error: line 3, column 6: unrecognized configuration 'define:YYBACKU' diff --git a/test/config4f.f.c b/test/config4f.f.c index 7033346..172699f 100644 --- a/test/config4f.f.c +++ b/test/config4f.f.c @@ -18,10 +18,11 @@ char *scan(char *p) case 1: goto yyFillLabel1; } + // after getstate -#line 25 "config4f.f.c" +#line 26 "config4f.f.c" yy0: YYSETSTATE(0); @@ -45,7 +46,7 @@ yy2: ++YYCURSOR; #line 22 "config4f.f.re" { return NULL; } -#line 49 "config4f.f.c" +#line 50 "config4f.f.c" yy4: ++YYCURSOR; YYSETSTATE(1); @@ -68,7 +69,7 @@ yyFillLabel1: yy6: #line 21 "config4f.f.re" { return YYCURSOR; } -#line 72 "config4f.f.c" +#line 73 "config4f.f.c" #line 23 "config4f.f.re" } diff --git a/test/config4g.ifs.c b/test/config4g.ifs.c index e988acb..55ce516 100644 --- a/test/config4g.ifs.c +++ b/test/config4g.ifs.c @@ -14,6 +14,7 @@ const unsigned char *scan(const unsigned char *p, unsigned int len, int *state) } + yy0: *state = 0; if (p >= e) { diff --git a/test/config5.c b/test/config5.c index 6953f2a..f1c347d 100644 --- a/test/config5.c +++ b/test/config5.c @@ -1,10 +1,11 @@ /* Generated by re2c */ #line 1 "config5.re" // ignored -#line 7 "config5.re" +#line 6 "config5.re" + // code -#line 8 "config5.c" +#line 9 "config5.c" { YYCTYPE yych; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); @@ -18,7 +19,7 @@ yy2: yy3: #line 11 "config5.re" { return 0; } -#line 22 "config5.c" +#line 23 "config5.c" yy4: yych = *(YYMARKER = ++YYCURSOR); switch (yych) { @@ -53,13 +54,15 @@ yy10: ++YYCURSOR; #line 10 "config5.re" { return 1; } -#line 57 "config5.c" +#line 58 "config5.c" } #line 13 "config5.re" // ignored -#line 20 "config5.re" +#line 19 "config5.re" + // max #define YYMAXFILL 3 -#line 26 "config5.re" +#line 25 "config5.re" + // eof diff --git a/test/config6.c b/test/config6.c index d8b6ee5..a956ed8 100644 --- a/test/config6.c +++ b/test/config6.c @@ -55,8 +55,8 @@ yy8: { printf("-\n"); continue; } #line 57 "config6.c" yy10: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -74,8 +74,7 @@ yy11: { printf("Num\n"); continue; } #line 76 "config6.c" yy12: - ++YYCURSOR; - yych = *YYCURSOR; + yych = *++YYCURSOR; switch (yych) { case '0': case '1': @@ -92,10 +91,9 @@ yy12: yy14: #line 19 "config6.re" { printf("Num\n"); continue; } -#line 96 "config6.c" +#line 95 "config6.c" yy15: - ++YYCURSOR; - yych = *YYCURSOR; + yych = *++YYCURSOR; switch (yych) { case '0': case '1': @@ -112,7 +110,7 @@ yy15: yy17: #line 18 "config6.re" { printf("Oct\n"); continue; } -#line 116 "config6.c" +#line 114 "config6.c" } #line 25 "config6.re" diff --git a/test/config8.c b/test/config8.c index aa47f4c..b59bd45 100644 --- a/test/config8.c +++ b/test/config8.c @@ -106,7 +106,6 @@ xx8: #line 107 "config8.c" xx9: curr = *++s.cur; - s.ctx = s.cur; switch (curr) { case '0': case '2': @@ -116,8 +115,12 @@ xx9: case '6': case '7': case '8': - case '9': goto xx10; - case '1': goto xx13; + case '9': + s.ctx = s.cur; + goto xx10; + case '1': + s.ctx = s.cur; + goto xx13; default: goto xx3; } xx10: @@ -141,10 +144,10 @@ xx12: s.cur = s.ctx; #line 55 "config8.re" { return KEYWORD; } -#line 145 "config8.c" +#line 148 "config8.c" xx13: - ++s.cur; - switch ((curr = *s.cur)) { + curr = *++s.cur; + switch (curr) { case '0': case '1': case '2': @@ -158,10 +161,10 @@ xx13: default: goto xx14; } xx14: - s.cur = s.ctx; + s.cur -= 1; #line 54 "config8.re" { return KEYWORD; } -#line 165 "config8.c" +#line 168 "config8.c" } #line 69 "config8.re" diff --git a/test/config9.b.c b/test/config9.b.c index b11ea35..93184ad 100644 --- a/test/config9.b.c +++ b/test/config9.b.c @@ -122,10 +122,13 @@ xx6: #line 123 "config9.b.c" xx9: curr = (unsigned char)*++s.cur; - s.ctx = s.cur; if (curr <= '/') goto xx3; - if (curr == '1') goto xx13; + if (curr == '1') { + s.ctx = s.cur; + goto xx13; + } if (curr >= ':') goto xx3; + s.ctx = s.cur; xx10: ++s.cur; if (s.lim <= s.cur) fill(1); @@ -136,16 +139,16 @@ xx12: s.cur = s.ctx; #line 57 "config9.b.re" { return KEYWORD; } -#line 140 "config9.b.c" +#line 143 "config9.b.c" xx13: - ++s.cur; - if ((curr = (unsigned char)*s.cur) <= '/') goto xx14; + curr = (unsigned char)*++s.cur; + if (curr <= '/') goto xx14; if (curr <= '9') goto xx10; xx14: - s.cur = s.ctx; + s.cur -= 1; #line 56 "config9.b.re" { return KEYWORD; } -#line 149 "config9.b.c" +#line 152 "config9.b.c" } #line 71 "config9.b.re" diff --git a/test/control_flow_fail.--skeleton.c b/test/control_flow_fail.--skeleton.c index 758aad4e643476e14b20d6a92a934247bfc63ce6..7f33d56dac8ff336c8c1998c4c21efe547943be0 100644 GIT binary patch delta 557 zcmb`Eze~eV5XY%)XsOl~L{Opjs1TZ1tXgnMD!7P)#YqrULP=hlN7|Q?yol9;lY7hC ztS;*6AOUx07Z-Q`3>VS-DAmEyo9@Tw?!NEd_5RC2pP$i?zG7@bMFa<*A%%ii8O%xf zB}~+ot09mbYGcwIF>TaVJKe`UIl+k?6Q8nvVmRv(2R8}Qz)wI8!h*zra}tLEa>a>@ zfdk91ek`TIw-E8sC|mVjxt&-%VDrgg+(cdWoV*ERC3Sh>&<4dSU_wDPkZLMEps1Eh zsM5j&ZIs6Qjm8No!#H#ur2PsBLYk014+UTyNdF(-6_+C+EVjZ-aHSTplV6f!4YVwpX;moK6kD`+bi#cp#(i ztrLnm!opBz+#|F#WxBYFdj3nZ9#^zpo1Du*e7GzqBQ1(82olhMsGv(wSo|nN?i6h; zbYKIvPxK@N79jyT$<{_6%HdorWOIpOtc`v7p16-{R%0@mYTeb1P~iaVL8wgrlH<|uvrBUbKz0goanTB9+9uv ze1Wbc+C+EVjZ-aHSTplV6f!4YVwpX;moK6kD`+bi#cpld=m6gdE3bqQ7kpZr*-U=F;nv-|%CGsXFgA9z%$;?YN Z)0iC3ACDoTuvtZ*i4kG>=9Pl1yZ|gZLoNUS diff --git a/test/control_flow_ok.c b/test/control_flow_ok.c index 7b7d24d..f2c0a57 100644 --- a/test/control_flow_ok.c +++ b/test/control_flow_ok.c @@ -5,10 +5,10 @@ { YYCTYPE yych; if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); + yych = *YYCURSOR++; + yych = *YYCURSOR++; yych = *YYCURSOR; - yych = *++YYCURSOR; - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + switch (yych) { case 'a': goto yy5; default: goto yy4; } diff --git a/test/control_flow_yymarker_fail.--skeleton.c b/test/control_flow_yymarker_fail.--skeleton.c index 38fef25baa2a202dc11ea0788451867aa1a1388c..3539a8472c3ce5e6b52df88707c104680362e527 100644 GIT binary patch delta 551 zcmb`EK}!Nb6vr{O%tDO7A}}8Yn`@Gl&}Fq_bhAU9Di)cYbq94;c4s3?2ntVKiX{jn zZ*`CT0DXmSox67L7SznHSci_i(|iB-do%wx^RaukcP-6oSYI`^pqK}noMM$hzIZdQ zq?ZUqO-I8}wwXm}eaN(M3$;5>)yqgU-)@i-_chW_In*X~iZ$Q@RKRa2arY{jc6-tN z$bsPAqWMLUzzS>}DRJQ8bDR&z&)I#s~sJ86X3r zhROjInGR)YlTf^w8<{X_$G8Ba(y_7jtE3ofa{SCUKy=87HuofCC|5uX%V1&VSQOR* zpL*LOE}F??smTCS)2SQ4Z?_L=Rt|_Ezpi-8lh0%B`_xwkIhJi&PzG%3AW1-YDux2j ziuXBv8`}PRlOL=AqyQz^H!EJuk8T%gh!K+x7ni(2qWWKFxq}3F3&{)q5xC<$%)F$& E0r?!X+yDRo delta 182 zcmbOc@-<+B+C+EVjZ^DcSTplV6f!4Evd*4-g*Ag+A=+3$3&?k1)8c`$6|@zMVmEiN zc`&j<*gq~-Av3tC5uIP8HF~athyeh5 C<~kez diff --git a/test/control_flow_yymarker_fail.c b/test/control_flow_yymarker_fail.c index 0768121..e031e64 100644 --- a/test/control_flow_yymarker_fail.c +++ b/test/control_flow_yymarker_fail.c @@ -5,8 +5,8 @@ { YYCTYPE yych; if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4); + yych = *YYCURSOR++; yych = *YYCURSOR; - yych = *++YYCURSOR; switch (yych) { case 'a': goto yy5; default: goto yy3; diff --git a/test/control_flow_yymarker_ok.--skeleton.c b/test/control_flow_yymarker_ok.--skeleton.c index dc7ee08b8f7477ad37650109ba5385ee03bcc5b3..37021630c22f0bd091591155bb5b0da40cc83c3b 100644 GIT binary patch delta 535 zcmb`Du}{K46vl&qA`q(~Q5WE8E#_ulv3aPM{hE}PP^vDw&#f&wuM_&!1xb8=KV_K|m-2)WE2z zd4PsYhcc~2DBj6UOf+g2I1iK5v9bOur5NjS{Mt7_49JPH=Sj#=u7LO~gN2!6QP>K6 z8Xb%9m-*EUH5p)PI`sy4)9o{wkpp7P7gcwC_IZlGC%%)&v24?VGGNo-qh!kcOcp~2 ye_I#Lf?e`J@=%g}cj82T^m delta 181 zcmccOywPET+C+EVjZ^DcSTplV6f!4Evd*4-g*Ag+A=+3$3&?k1)8c`$6|@zMVmEiN zc`&j<*gq~?M%!-C5r`k8HF;|BmR CiaFf? diff --git a/test/control_flow_yymarker_ok.c b/test/control_flow_yymarker_ok.c index 02eced9..1af86ae 100644 --- a/test/control_flow_yymarker_ok.c +++ b/test/control_flow_yymarker_ok.c @@ -5,9 +5,9 @@ { YYCTYPE yych; if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4); - yych = *YYCURSOR; - yych = *++YYCURSOR; - yych = *(YYMARKER = ++YYCURSOR); + yych = *YYCURSOR++; + yych = *YYCURSOR++; + yych = *(YYMARKER = YYCURSOR); goto yy5; yy4: #line 4 "control_flow_yymarker_ok.re" diff --git a/test/control_flow_yymarker_yyaccept_fail.--skeleton.c b/test/control_flow_yymarker_yyaccept_fail.--skeleton.c index 5b765bc404e66b2f22546f50b29a3c9ddb697ca0..d37d63f4aa4b4e3f21b06c0d8ff613df3f366bfb 100644 GIT binary patch delta 635 zcmb`EzfZzI6vu=75E_345_LgdFjlBUR0fBFqj7W5NlioAE4=_$(z~iCiGyL+bR;f@ zxRd@H#>ByxxVgAGIl0(t2|76PruXCX-uu407dkk*5mOq{*Nq)0N0#bD6SEtftP>^_yt*T9+PRO8$FC1 zaqc}TEpZ3dVCzH{z%!ro_#j(y7h-#%FlV*NUbv3hPCS0+#}D!D6=hY1RltOSY9O_) zcz~jsHepHw6SSQhi7=|Cr~sqTrbzn}5`?t8aOn%cI^=lS)5OzIt^jY&gN2xF5!eWH z>MaX9{ZuAPOa_RUcFh29J3S`Zd_WBOP1#*dJWn{^g5boazA~z9QPYAlAX5iX1njxI zG0-i$Gt*C@-T$xo#R`B6P|Ev)`K$TX=|ELw*d)W_MMqA8o0#p7b>7?D!MNtRa`N8$ LT-0_yQlBe7x3td) delta 209 zcmdm3ezkal+C+EVjZ^DcSTplV6f!4Evd*5oLqvG;bJkFHg=k|1EufeKn-&k0t)Q)7 z6uY^D&4ZB@B6pd6HfLr@YEfcIW`5q}LXNqNnUe)MTQ^5>on>MMDp{$q!2{#Lcpb2l56%oc zhOJ^KSw% zM5Pt(z&dQ7$^v-ia~>aLi|*p&UMS32H8u#>aodT;b;Sb| zWZ0A`4MOowb|gZtUgA8ALfgXXpO9j#=7bwx0MQ`J%bq5lhEf@La}G?*Y?H!fpi^s^ z#EB)-8EP=V)Uazhc-yTLn#l#kkl&KswW+rW=WF^qjcn60Oeg_1G!R7~p39p8&9W=Z zT!eQ2zvLIo1Ia@%=Zobp=3A!&Rm6xvhlh)9H_;#0ET@|Qw=#P;)_E^;cizY1w!5Dc Gmwx~q>C6HE delta 209 zcmX?|^geEa+C+EVjZ^DcSTplV6f!4Evd*3?Eh0SmIcq4pLbS1h7EsKAO^XN0R?t>3 zirw77=E2Ack-N-3n=`W{wJ5P9Ge2)~A;(R!n}vGFz-PuQ)S3FEvF0D4<}g0G6=kn!H*}cJd_FP?l(r zx_7Kvav+9+wt`WtHJ1VqfYkxjLqv@?tFU=8GK16>vCm=7POY3Q&M_Cv-^$TiUtE${ zl9{ZKnOCBaoRONG9S>9xpPXNsR}!C-nU`v2tO0jLMq*j2jsl!pTAZ4K#LY`hP0{44 z2D>0LO+f=B4RjPpSi#0t0i;<|p(wSav?x!(0OHWJf}+XI;)+Un`6UXedHJR3845t# zi(~SXG$9J0$_=eIn{iHIn*4@~Yw`{5uky*IMaB6=3N{L<`DqGjY6_V^CP*X1-PW5Q z@HjDf;P4GXosL4Lj)Ji!*ukJ+1B03xg~a5N%=|o<@6{#;3Mxzv;J2r$ft&a8w=q)F z#Dd8;1vj#S{W5tc(7|0o3X}ixa!%eWD6@H$&=IQIr7(Gpi23AfUW?8DMR=)e@@6Zs q7GPQhrqSc#w>NK-aA9QPQrLV&mP>r|L-T`7lRua%ZeC>NBM1Pzh#OJ> delta 2097 zcmd_mS5#D26o6sx3_}wq4xnN`(S$0IVPF8eBxr~bQ4<9faWW2aMTaP3L5Ow88+OnK$t&b^RD(7BJ^-EDR{R7l>#(L^wldn3X+7vIlE!QD}%t1}GQvVI*M0G)X z`UdCa*|S7*k(QQ{kkC#9hlHq?OzTx+KzccKv^@c1r576QTI-Ns!(NU|K2Cz<)~Rh0 zlaho*i>jR39xTd&fxaPPPxR$t9xYoFM+}pT!a0$3JxVE@= z6<{LpJzzUv5-=I~KCnG71=s=D5!VU#0q#RwXIvLtDlQGz71s^d9hZ*lfy==4#My8k z;q16xI0r5h*Bhr~0cBtxU^cKXupiI~%mIE3><=7(%f-2H195|JgKUC7z|Fudz^%Y-!0o^tz@5NdxZSutxV^Z2xc#_)aR1^C;11#r;SS@D;Ev*s;f~|V zaR1>>;7;OB;ZEahXMksc=YZ#d7l0Rmmw=anSAbW6*KpTyH*hy`w{W*{cW`%c_i*=d z4{#50|KlFv9&5wuc-K(e^ty^%O2wAfD;3(kUiYfcKlA0xUn{XJ)2Xv8;aYENlIaPU C{hdw# diff --git a/test/ctx.b.c b/test/ctx.b.c index b670fb4..ac113c7 100644 --- a/test/ctx.b.c +++ b/test/ctx.b.c @@ -126,10 +126,13 @@ yy6: #line 127 "ctx.b.c" yy9: yych = *++YYCURSOR; - YYCTXMARKER = YYCURSOR; if (yych <= '/') goto yy3; - if (yych == '1') goto yy13; + if (yych == '1') { + YYCTXMARKER = YYCURSOR; + goto yy13; + } if (yych >= ':') goto yy3; + YYCTXMARKER = YYCURSOR; yy10: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -140,16 +143,16 @@ yy12: YYCURSOR = YYCTXMARKER; #line 49 "ctx.b.re" { return KEYWORD; } -#line 144 "ctx.b.c" +#line 147 "ctx.b.c" yy13: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy14; + yych = *++YYCURSOR; + if (yych <= '/') goto yy14; if (yych <= '9') goto yy10; yy14: - YYCURSOR = YYCTXMARKER; + YYCURSOR -= 1; #line 48 "ctx.b.re" { return KEYWORD; } -#line 153 "ctx.b.c" +#line 156 "ctx.b.c" } #line 63 "ctx.b.re" @@ -157,6 +160,7 @@ yy14: #define YYMAXFILL 3 + int main(int,char**) { Scanner s("a77 a1 b8 b1"); diff --git a/test/ctx.c b/test/ctx.c index 46007e3..bcd0d8a 100644 --- a/test/ctx.c +++ b/test/ctx.c @@ -110,7 +110,6 @@ yy8: #line 111 "ctx.c" yy9: yych = *++YYCURSOR; - YYCTXMARKER = YYCURSOR; switch (yych) { case '0': case '2': @@ -120,8 +119,12 @@ yy9: case '6': case '7': case '8': - case '9': goto yy10; - case '1': goto yy13; + case '9': + YYCTXMARKER = YYCURSOR; + goto yy10; + case '1': + YYCTXMARKER = YYCURSOR; + goto yy13; default: goto yy3; } yy10: @@ -145,10 +148,10 @@ yy12: YYCURSOR = YYCTXMARKER; #line 49 "ctx.re" { return KEYWORD; } -#line 149 "ctx.c" +#line 152 "ctx.c" yy13: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -162,10 +165,10 @@ yy13: default: goto yy14; } yy14: - YYCURSOR = YYCTXMARKER; + YYCURSOR -= 1; #line 48 "ctx.re" { return KEYWORD; } -#line 169 "ctx.c" +#line 172 "ctx.c" } #line 63 "ctx.re" @@ -173,6 +176,7 @@ yy14: #define YYMAXFILL 3 + int main(int,char**) { Scanner s("a77 a1 b8 b1"); diff --git a/test/ctx.s.c b/test/ctx.s.c index 7f6dcea..0d062d1 100644 --- a/test/ctx.s.c +++ b/test/ctx.s.c @@ -93,10 +93,13 @@ yy8: #line 94 "ctx.s.c" yy9: yych = *++YYCURSOR; - YYCTXMARKER = YYCURSOR; if (yych <= '/') goto yy3; - if (yych == '1') goto yy13; + if (yych == '1') { + YYCTXMARKER = YYCURSOR; + goto yy13; + } if (yych >= ':') goto yy3; + YYCTXMARKER = YYCURSOR; yy10: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -107,16 +110,16 @@ yy12: YYCURSOR = YYCTXMARKER; #line 49 "ctx.s.re" { return KEYWORD; } -#line 111 "ctx.s.c" +#line 114 "ctx.s.c" yy13: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy14; + yych = *++YYCURSOR; + if (yych <= '/') goto yy14; if (yych <= '9') goto yy10; yy14: - YYCURSOR = YYCTXMARKER; + YYCURSOR -= 1; #line 48 "ctx.s.re" { return KEYWORD; } -#line 120 "ctx.s.c" +#line 123 "ctx.s.c" } #line 63 "ctx.s.re" @@ -124,6 +127,7 @@ yy14: #define YYMAXFILL 3 + int main(int,char**) { Scanner s("a77 a1 b8 b1"); diff --git a/test/cunroll.c b/test/cunroll.c index c8e9a1d..9d7c76b 100644 --- a/test/cunroll.c +++ b/test/cunroll.c @@ -263,8 +263,8 @@ yy7: } #line 265 "cunroll.c" yy9: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy65; default: goto yy10; } @@ -280,8 +280,8 @@ yy11: default: goto yy68; } yy12: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy73; default: goto yy13; } @@ -290,8 +290,8 @@ yy13: { RET('%'); } #line 292 "cunroll.c" yy14: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '&': goto yy75; case '=': goto yy77; default: goto yy15; @@ -318,8 +318,8 @@ yy19: { RET(')'); } #line 320 "cunroll.c" yy21: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy83; default: goto yy22; } @@ -328,8 +328,8 @@ yy22: { RET('*'); } #line 330 "cunroll.c" yy23: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '+': goto yy85; case '=': goto yy87; default: goto yy24; @@ -344,8 +344,8 @@ yy25: { RET(','); } #line 346 "cunroll.c" yy27: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '-': goto yy89; case '=': goto yy91; case '>': goto yy93; @@ -377,8 +377,8 @@ yy30: { RET('.'); } #line 379 "cunroll.c" yy31: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '*': goto yy99; case '=': goto yy101; default: goto yy32; @@ -391,36 +391,20 @@ yy33: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); switch (yych) { - case '.': goto yy96; - case '0': - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': goto yy35; - case 'E': - case 'e': goto yy103; - case 'L': - case 'U': - case 'l': - case 'u': goto yy104; case 'X': case 'x': goto yy106; - default: goto yy34; + default: goto yy36; } yy34: #line 153 "cunroll.re" { RET(ICON); } -#line 419 "cunroll.c" +#line 402 "cunroll.c" yy35: yyaccept = 2; YYMARKER = ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); yych = *YYCURSOR; +yy36: switch (yych) { case '.': goto yy96; case '0': @@ -445,15 +429,15 @@ yy37: ++YYCURSOR; #line 187 "cunroll.re" { RET(':'); } -#line 449 "cunroll.c" +#line 433 "cunroll.c" yy39: ++YYCURSOR; #line 183 "cunroll.re" { RET(';'); } -#line 454 "cunroll.c" +#line 438 "cunroll.c" yy41: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '<': goto yy107; case '=': goto yy109; default: goto yy42; @@ -461,20 +445,20 @@ yy41: yy42: #line 202 "cunroll.re" { RET('<'); } -#line 465 "cunroll.c" +#line 449 "cunroll.c" yy43: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy111; default: goto yy44; } yy44: #line 188 "cunroll.re" { RET('='); } -#line 475 "cunroll.c" +#line 459 "cunroll.c" yy45: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy113; case '>': goto yy115; default: goto yy46; @@ -482,15 +466,15 @@ yy45: yy46: #line 203 "cunroll.re" { RET('>'); } -#line 486 "cunroll.c" +#line 470 "cunroll.c" yy47: ++YYCURSOR; #line 206 "cunroll.re" { RET('?'); } -#line 491 "cunroll.c" +#line 475 "cunroll.c" yy49: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -559,35 +543,35 @@ yy49: yy50: #line 141 "cunroll.re" { RET(ID); } -#line 563 "cunroll.c" +#line 547 "cunroll.c" yy51: ++YYCURSOR; #line 191 "cunroll.re" { RET('['); } -#line 568 "cunroll.c" +#line 552 "cunroll.c" yy53: ++YYCURSOR; #line 192 "cunroll.re" { RET(']'); } -#line 573 "cunroll.c" +#line 557 "cunroll.c" yy55: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy119; default: goto yy56; } yy56: #line 204 "cunroll.re" { RET('^'); } -#line 583 "cunroll.c" +#line 567 "cunroll.c" yy57: ++YYCURSOR; #line 184 "cunroll.re" { RET('{'); } -#line 588 "cunroll.c" +#line 572 "cunroll.c" yy59: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy121; case '|': goto yy123; default: goto yy60; @@ -595,22 +579,22 @@ yy59: yy60: #line 205 "cunroll.re" { RET('|'); } -#line 599 "cunroll.c" +#line 583 "cunroll.c" yy61: ++YYCURSOR; #line 185 "cunroll.re" { RET('}'); } -#line 604 "cunroll.c" +#line 588 "cunroll.c" yy63: ++YYCURSOR; #line 196 "cunroll.re" { RET('~'); } -#line 609 "cunroll.c" +#line 593 "cunroll.c" yy65: ++YYCURSOR; #line 182 "cunroll.re" { RET(NEQ); } -#line 614 "cunroll.c" +#line 598 "cunroll.c" yy67: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -634,7 +618,7 @@ yy70: ++YYCURSOR; #line 159 "cunroll.re" { RET(SCON); } -#line 638 "cunroll.c" +#line 622 "cunroll.c" yy72: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -666,17 +650,17 @@ yy73: ++YYCURSOR; #line 168 "cunroll.re" { RET(MODEQ); } -#line 670 "cunroll.c" +#line 654 "cunroll.c" yy75: ++YYCURSOR; #line 177 "cunroll.re" { RET(ANDAND); } -#line 675 "cunroll.c" +#line 659 "cunroll.c" yy77: ++YYCURSOR; #line 169 "cunroll.re" { RET(ANDEQ); } -#line 680 "cunroll.c" +#line 664 "cunroll.c" yy79: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -689,7 +673,7 @@ yy80: default: goto yy79; } yy81: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy34; yy82: ++YYCURSOR; @@ -722,32 +706,32 @@ yy83: ++YYCURSOR; #line 166 "cunroll.re" { RET(MULEQ); } -#line 726 "cunroll.c" +#line 710 "cunroll.c" yy85: ++YYCURSOR; #line 174 "cunroll.re" { RET(INCR); } -#line 731 "cunroll.c" +#line 715 "cunroll.c" yy87: ++YYCURSOR; #line 164 "cunroll.re" { RET(ADDEQ); } -#line 736 "cunroll.c" +#line 720 "cunroll.c" yy89: ++YYCURSOR; #line 175 "cunroll.re" { RET(DECR); } -#line 741 "cunroll.c" +#line 725 "cunroll.c" yy91: ++YYCURSOR; #line 165 "cunroll.re" { RET(SUBEQ); } -#line 746 "cunroll.c" +#line 730 "cunroll.c" yy93: ++YYCURSOR; #line 176 "cunroll.re" { RET(DEREF); } -#line 751 "cunroll.c" +#line 735 "cunroll.c" yy95: yych = *++YYCURSOR; switch (yych) { @@ -781,17 +765,17 @@ yy96: yy98: #line 156 "cunroll.re" { RET(FCON); } -#line 785 "cunroll.c" +#line 769 "cunroll.c" yy99: ++YYCURSOR; #line 138 "cunroll.re" { goto comment; } -#line 790 "cunroll.c" +#line 774 "cunroll.c" yy101: ++YYCURSOR; #line 167 "cunroll.re" { RET(DIVEQ); } -#line 795 "cunroll.c" +#line 779 "cunroll.c" yy103: yych = *++YYCURSOR; switch (yych) { @@ -848,43 +832,43 @@ yy106: default: goto yy69; } yy107: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy135; default: goto yy108; } yy108: #line 173 "cunroll.re" { RET(LSHIFT); } -#line 860 "cunroll.c" +#line 844 "cunroll.c" yy109: ++YYCURSOR; #line 179 "cunroll.re" { RET(LEQ); } -#line 865 "cunroll.c" +#line 849 "cunroll.c" yy111: ++YYCURSOR; #line 181 "cunroll.re" { RET(EQL); } -#line 870 "cunroll.c" +#line 854 "cunroll.c" yy113: ++YYCURSOR; #line 180 "cunroll.re" { RET(GEQ); } -#line 875 "cunroll.c" +#line 859 "cunroll.c" yy115: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy137; default: goto yy116; } yy116: #line 172 "cunroll.re" { RET(RSHIFT); } -#line 885 "cunroll.c" +#line 869 "cunroll.c" yy117: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -953,22 +937,22 @@ yy117: yy118: #line 142 "cunroll.re" { RET(ID); } -#line 957 "cunroll.c" +#line 941 "cunroll.c" yy119: ++YYCURSOR; #line 170 "cunroll.re" { RET(XOREQ); } -#line 962 "cunroll.c" +#line 946 "cunroll.c" yy121: ++YYCURSOR; #line 171 "cunroll.re" { RET(OREQ); } -#line 967 "cunroll.c" +#line 951 "cunroll.c" yy123: ++YYCURSOR; #line 178 "cunroll.re" { RET(OROR); } -#line 972 "cunroll.c" +#line 956 "cunroll.c" yy125: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -1031,9 +1015,9 @@ yy127: ++YYCURSOR; #line 161 "cunroll.re" { RET(ELLIPSIS); } -#line 1035 "cunroll.c" +#line 1019 "cunroll.c" yy129: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy98; yy130: yych = *++YYCURSOR; @@ -1108,15 +1092,15 @@ yy135: ++YYCURSOR; #line 163 "cunroll.re" { RET(LSHIFTEQ); } -#line 1112 "cunroll.c" +#line 1096 "cunroll.c" yy137: ++YYCURSOR; #line 162 "cunroll.re" { RET(RSHIFTEQ); } -#line 1117 "cunroll.c" +#line 1101 "cunroll.c" yy139: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1185,10 +1169,10 @@ yy139: yy140: #line 143 "cunroll.re" { RET(ID); } -#line 1189 "cunroll.c" +#line 1173 "cunroll.c" yy141: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1257,10 +1241,10 @@ yy141: yy142: #line 144 "cunroll.re" { RET(ID); } -#line 1261 "cunroll.c" +#line 1245 "cunroll.c" yy143: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1329,10 +1313,10 @@ yy143: yy144: #line 145 "cunroll.re" { RET(ID); } -#line 1333 "cunroll.c" +#line 1317 "cunroll.c" yy145: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1401,10 +1385,10 @@ yy145: yy146: #line 146 "cunroll.re" { RET(ID); } -#line 1405 "cunroll.c" +#line 1389 "cunroll.c" yy147: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1473,10 +1457,10 @@ yy147: yy148: #line 147 "cunroll.re" { RET(ID); } -#line 1477 "cunroll.c" +#line 1461 "cunroll.c" yy149: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1545,7 +1529,7 @@ yy149: yy150: #line 148 "cunroll.re" { RET(ID); } -#line 1549 "cunroll.c" +#line 1533 "cunroll.c" yy151: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -1619,14 +1603,14 @@ yy151: yy153: #line 149 "cunroll.re" { RET(ID); } -#line 1623 "cunroll.c" +#line 1607 "cunroll.c" } #line 223 "cunroll.re" comment: -#line 1630 "cunroll.c" +#line 1614 "cunroll.c" { YYCTYPE yych; if ((YYLIMIT - YYCURSOR) < 8) YYFILL(8); @@ -1638,8 +1622,8 @@ comment: default: goto yy156; } yy156: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '*': case '/': goto yy157; default: goto yy163; @@ -1647,10 +1631,10 @@ yy156: yy157: #line 234 "cunroll.re" { goto comment; } -#line 1651 "cunroll.c" +#line 1635 "cunroll.c" yy158: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '*': case '/': goto yy159; default: goto yy163; @@ -1662,23 +1646,23 @@ yy159: s->tok = s->pos = cursor; s->line++; goto comment; } -#line 1666 "cunroll.c" +#line 1650 "cunroll.c" yy160: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '/': goto yy165; default: goto yy161; } yy161: #line 242 "cunroll.re" { goto comment; } -#line 1676 "cunroll.c" +#line 1660 "cunroll.c" yy162: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy161; yy163: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '*': case '/': goto yy164; default: goto yy167; @@ -1686,15 +1670,15 @@ yy163: yy164: #line 235 "cunroll.re" { goto comment; } -#line 1690 "cunroll.c" +#line 1674 "cunroll.c" yy165: ++YYCURSOR; #line 227 "cunroll.re" { goto std; } -#line 1695 "cunroll.c" +#line 1679 "cunroll.c" yy167: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '*': case '/': goto yy168; default: goto yy169; @@ -1702,10 +1686,10 @@ yy167: yy168: #line 236 "cunroll.re" { goto comment; } -#line 1706 "cunroll.c" +#line 1690 "cunroll.c" yy169: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '*': case '/': goto yy170; default: goto yy171; @@ -1713,10 +1697,10 @@ yy169: yy170: #line 237 "cunroll.re" { goto comment; } -#line 1717 "cunroll.c" +#line 1701 "cunroll.c" yy171: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '*': case '/': goto yy172; default: goto yy173; @@ -1724,10 +1708,10 @@ yy171: yy172: #line 238 "cunroll.re" { goto comment; } -#line 1728 "cunroll.c" +#line 1712 "cunroll.c" yy173: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '*': case '/': goto yy174; default: goto yy175; @@ -1735,10 +1719,10 @@ yy173: yy174: #line 239 "cunroll.re" { goto comment; } -#line 1739 "cunroll.c" +#line 1723 "cunroll.c" yy175: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '*': case '/': goto yy176; default: goto yy177; @@ -1746,12 +1730,12 @@ yy175: yy176: #line 240 "cunroll.re" { goto comment; } -#line 1750 "cunroll.c" +#line 1734 "cunroll.c" yy177: ++YYCURSOR; #line 241 "cunroll.re" { goto comment; } -#line 1755 "cunroll.c" +#line 1739 "cunroll.c" } #line 243 "cunroll.re" diff --git a/test/default.8.c b/test/default.8.c index 4e63832..03e8f00 100644 --- a/test/default.8.c +++ b/test/default.8.c @@ -5,11 +5,10 @@ { YYCTYPE yych; if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - ++YYCURSOR; + yych = *YYCURSOR++; #line 2 "default.8.re" { return DEFAULT; } -#line 13 "default.8.c" +#line 12 "default.8.c" } #line 3 "default.8.re" diff --git a/test/default.c b/test/default.c index 57b4a3e..43f4df4 100644 --- a/test/default.c +++ b/test/default.c @@ -5,11 +5,10 @@ { YYCTYPE yych; if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - ++YYCURSOR; + yych = *YYCURSOR++; #line 2 "default.re" { return DEFAULT; } -#line 13 "default.c" +#line 12 "default.c" } #line 3 "default.re" diff --git a/test/default.e.c b/test/default.e.c index 4bcfbf3..4d4b15d 100644 --- a/test/default.e.c +++ b/test/default.e.c @@ -5,11 +5,10 @@ { YYCTYPE yych; if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - ++YYCURSOR; + yych = *YYCURSOR++; #line 2 "default.e.re" { return DEFAULT; } -#line 13 "default.e.c" +#line 12 "default.e.c" } #line 3 "default.e.re" diff --git a/test/default.u.c b/test/default.u.c index 177685c..02728a7 100644 --- a/test/default.u.c +++ b/test/default.u.c @@ -5,11 +5,10 @@ { YYCTYPE yych; if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - ++YYCURSOR; + yych = *YYCURSOR++; #line 2 "default.u.re" { return DEFAULT; } -#line 13 "default.u.c" +#line 12 "default.u.c" } #line 3 "default.u.re" diff --git a/test/default.w.c b/test/default.w.c index 62e1b33..9577883 100644 --- a/test/default.w.c +++ b/test/default.w.c @@ -5,11 +5,10 @@ { YYCTYPE yych; if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - ++YYCURSOR; + yych = *YYCURSOR++; #line 2 "default.w.re" { return DEFAULT; } -#line 13 "default.w.c" +#line 12 "default.w.c" } #line 3 "default.w.re" diff --git a/test/default.x.c b/test/default.x.c index 75acf6d..22e1908 100644 --- a/test/default.x.c +++ b/test/default.x.c @@ -5,11 +5,10 @@ { YYCTYPE yych; if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - ++YYCURSOR; + yych = *YYCURSOR++; #line 2 "default.x.re" { return DEFAULT; } -#line 13 "default.x.c" +#line 12 "default.x.c" } #line 3 "default.x.re" diff --git a/test/default_dup.i.c b/test/default_dup.i.c index df77c5b..0e8cf77 100644 --- a/test/default_dup.i.c +++ b/test/default_dup.i.c @@ -1 +1 @@ -re2c: error: line 3, column 4: code to default rule is already defined +re2c: error: line 3: code to default rule is already defined at line 2 diff --git a/test/default_dup.ic.c b/test/default_dup.ic.c index 548466b..56729dc 100644 --- a/test/default_dup.ic.c +++ b/test/default_dup.ic.c @@ -1 +1 @@ -re2c: error: line 3, column 9: code to default rule 'c1' is already defined +re2c: error: line 3: code to default rule in condition 'c1' is already defined at line 2 diff --git a/test/default_dup_star_1.ic.c b/test/default_dup_star_1.ic.c index 940756b..5283056 100644 --- a/test/default_dup_star_1.ic.c +++ b/test/default_dup_star_1.ic.c @@ -3,29 +3,26 @@ { YYCTYPE yych; switch (YYGETCONDITION()) { + case yycc1: goto yyc_c1; + case yycc2: goto yyc_c2; case yycc3: goto yyc_c3; } /* *********************************** */ yyc_c1: if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - ++YYCURSOR; + yych = *YYCURSOR++; { return DEFAULT-1; } /* *********************************** */ yyc_c2: if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - ++YYCURSOR; + yych = *YYCURSOR++; { return DEFAULT-2; } /* *********************************** */ yyc_c3: if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - goto yy12; - { return C3; } -yy12: - ++YYCURSOR; + yych = *YYCURSOR++; { return DEFAULT-*; } } +re2c: warning: line 4: rule in condition 'c3' matches empty string [-Wmatch-empty-string] re2c: warning: line 4: unreachable rule in condition 'c3' (shadowed by rule at line 5) [-Wunreachable-rules] diff --git a/test/default_dup_star_2.ic.c b/test/default_dup_star_2.ic.c index 7991093..e49c0c2 100644 --- a/test/default_dup_star_2.ic.c +++ b/test/default_dup_star_2.ic.c @@ -1 +1 @@ -re2c: error: line 3, column 8: code to default rule '*' is already defined +re2c: error: line 3: code to default rule in condition '*' is already defined at line 2 diff --git a/test/default_full.8--encoding-policy(fail).c b/test/default_full.8--encoding-policy(fail).c index b952814..aa04109 100644 --- a/test/default_full.8--encoding-policy(fail).c +++ b/test/default_full.8--encoding-policy(fail).c @@ -627,8 +627,8 @@ yy14: YYCURSOR = YYMARKER; goto yy5; yy15: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: diff --git a/test/default_full.8--encoding-policy(substitute).c b/test/default_full.8--encoding-policy(substitute).c index 2b4815d..d6fd4b6 100644 --- a/test/default_full.8--encoding-policy(substitute).c +++ b/test/default_full.8--encoding-policy(substitute).c @@ -627,8 +627,8 @@ yy14: YYCURSOR = YYMARKER; goto yy5; yy15: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: diff --git a/test/default_full.8.c b/test/default_full.8.c index b3236da..5a9543e 100644 --- a/test/default_full.8.c +++ b/test/default_full.8.c @@ -590,8 +590,8 @@ yy13: YYCURSOR = YYMARKER; goto yy5; yy14: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 0x80: case 0x81: case 0x82: diff --git a/test/default_full.c b/test/default_full.c index 2104f65..05a7618 100644 --- a/test/default_full.c +++ b/test/default_full.c @@ -5,11 +5,10 @@ { YYCTYPE yych; if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - ++YYCURSOR; + yych = *YYCURSOR++; #line 3 "default_full.re" { return FULL; } -#line 13 "default_full.c" +#line 12 "default_full.c" } #line 4 "default_full.re" diff --git a/test/default_full.e.c b/test/default_full.e.c index de5a4fe..93bc385 100644 --- a/test/default_full.e.c +++ b/test/default_full.e.c @@ -5,11 +5,10 @@ { YYCTYPE yych; if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - ++YYCURSOR; + yych = *YYCURSOR++; #line 3 "default_full.e.re" { return FULL; } -#line 13 "default_full.e.c" +#line 12 "default_full.e.c" } #line 4 "default_full.e.re" diff --git a/test/default_full.u.c b/test/default_full.u.c index c5f9679..7ef2460 100644 --- a/test/default_full.u.c +++ b/test/default_full.u.c @@ -5,11 +5,10 @@ { YYCTYPE yych; if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - ++YYCURSOR; + yych = *YYCURSOR++; #line 3 "default_full.u.re" { return FULL; } -#line 13 "default_full.u.c" +#line 12 "default_full.u.c" } #line 4 "default_full.u.re" diff --git a/test/default_full.w.c b/test/default_full.w.c index 3f81f8b..c976f0a 100644 --- a/test/default_full.w.c +++ b/test/default_full.w.c @@ -5,11 +5,10 @@ { YYCTYPE yych; if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - ++YYCURSOR; + yych = *YYCURSOR++; #line 3 "default_full.w.re" { return FULL; } -#line 13 "default_full.w.c" +#line 12 "default_full.w.c" } #line 4 "default_full.w.re" diff --git a/test/default_full.x--encoding-policy(fail).c b/test/default_full.x--encoding-policy(fail).c index bfcb2c7..ac78989 100644 --- a/test/default_full.x--encoding-policy(fail).c +++ b/test/default_full.x--encoding-policy(fail).c @@ -15,8 +15,8 @@ yy2: { return FULL; } #line 17 "default_full.x--encoding-policy(fail).c" yy4: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= 0xDBFF) goto yy5; + yych = *++YYCURSOR; + if (yych <= 0xDBFF) goto yy5; if (yych <= 0xDFFF) goto yy2; yy5: #line 2 "default_full.x--encoding-policy(fail).re" @@ -24,7 +24,6 @@ yy5: #line 25 "default_full.x--encoding-policy(fail).c" yy6: ++YYCURSOR; - yych = *YYCURSOR; goto yy5; } #line 4 "default_full.x--encoding-policy(fail).re" diff --git a/test/default_full.x--encoding-policy(substitute).c b/test/default_full.x--encoding-policy(substitute).c index a1d4762..b355026 100644 --- a/test/default_full.x--encoding-policy(substitute).c +++ b/test/default_full.x--encoding-policy(substitute).c @@ -15,8 +15,8 @@ yy2: { return FULL; } #line 17 "default_full.x--encoding-policy(substitute).c" yy4: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= 0xDBFF) goto yy5; + yych = *++YYCURSOR; + if (yych <= 0xDBFF) goto yy5; if (yych <= 0xDFFF) goto yy2; yy5: #line 2 "default_full.x--encoding-policy(substitute).re" @@ -24,7 +24,6 @@ yy5: #line 25 "default_full.x--encoding-policy(substitute).c" yy6: ++YYCURSOR; - yych = *YYCURSOR; goto yy5; } #line 4 "default_full.x--encoding-policy(substitute).re" diff --git a/test/default_full.x.c b/test/default_full.x.c index ced17d1..dd8f166 100644 --- a/test/default_full.x.c +++ b/test/default_full.x.c @@ -15,8 +15,8 @@ yy3: { return FULL; } #line 17 "default_full.x.c" yy4: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= 0xDBFF) goto yy3; + yych = *++YYCURSOR; + if (yych <= 0xDBFF) goto yy3; if (yych <= 0xDFFF) goto yy2; goto yy3; } diff --git a/test/dot.--emit-dot.c b/test/dot.--emit-dot.c index d971672..ca08117 100644 --- a/test/dot.--emit-dot.c +++ b/test/dot.--emit-dot.c @@ -1,7 +1,5 @@ /* Generated by re2c */ - digraph re2c { - 1 -> 2 [label="[0x00-`][b-d][f-0xFF]"] 1 -> 4 [label="[a]"] 1 -> 5 [label="[e]"] @@ -13,7 +11,7 @@ digraph re2c { 5 -> 8 [label="[f]"] 6 -> 7 [label="[0x00-b][d-0xFF]"] 6 -> 9 [label="[c]"] -7 -> 3 +7 -> 3 [label="yyaccept=0"] 8 -> 7 [label="[0x00-f][h-0xFF]"] 8 -> 11 [label="[g]"] 9 -> 10 diff --git a/test/dot2.--emit-dot.c b/test/dot2.--emit-dot.c index d590eba..0edb41a 100644 --- a/test/dot2.--emit-dot.c +++ b/test/dot2.--emit-dot.c @@ -1,9 +1,7 @@ /* Generated by re2c */ - digraph re2c { - -1 -> 2 [label="[0x00]"] 1 -> 4 [label="[0x01-0xFF]"] +1 -> 2 [label="[0x00]"] 2 -> 3 3 [label="dot2.--emit-dot.re:3"] 4 -> 5 diff --git a/test/dot_backslash.--emit-dot.c b/test/dot_backslash.--emit-dot.c index 73c7a22..d881861 100644 --- a/test/dot_backslash.--emit-dot.c +++ b/test/dot_backslash.--emit-dot.c @@ -1,7 +1,5 @@ /* Generated by re2c */ - digraph re2c { - 1 -> 2 [label="[0x00-[][0x5D-0xFF]"] 1 -> 3 [label="[\\]"] 3 -> 4 diff --git a/test/dot_conditions.c--emit-dot.c b/test/dot_conditions.c--emit-dot.c index 828284e..4e34159 100644 --- a/test/dot_conditions.c--emit-dot.c +++ b/test/dot_conditions.c--emit-dot.c @@ -1,10 +1,7 @@ /* Generated by re2c */ - digraph re2c { - 0 -> state1 [label="state=state1"] 0 -> state2 [label="state=state2"] -/* *********************************** */ state1 -> 2 2 -> 3 [label="[0x00-`][b-e][g-0xFF]"] 2 -> 4 [label="[a]"] @@ -21,7 +18,6 @@ state1 -> 2 9 [label="dot_conditions.c--emit-dot.re:6"] 10 -> 11 11 [label="dot_conditions.c--emit-dot.re:8"] -/* *********************************** */ state2 -> 13 13 -> 14 [label="[0x00-`][b-0xFF]"] 13 -> 15 [label="[a]"] diff --git a/test/dot_ranges.--emit-dot.c b/test/dot_ranges.--emit-dot.c index cc77513..4609cd5 100644 --- a/test/dot_ranges.--emit-dot.c +++ b/test/dot_ranges.--emit-dot.c @@ -1,10 +1,8 @@ /* Generated by re2c */ - digraph re2c { - +1 -> 6 [label="[a-b][0xFE-0xFF]"] 1 -> 2 [label="[0x00-/][9-0x5D][_-`][c-0xFD]"] 1 -> 4 [label="[0-8][^]"] -1 -> 6 [label="[a-b][0xFE-0xFF]"] 2 -> 3 3 [label="dot_ranges.--emit-dot.re:5"] 4 -> 5 diff --git a/test/enc_reset.i.c b/test/enc_reset.i.c new file mode 100644 index 0000000..fafdfc4 --- /dev/null +++ b/test/enc_reset.i.c @@ -0,0 +1,47 @@ +/* Generated by re2c */ + +{ + YYCTYPE yych; + if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; + if (yych <= 0xD7FF) goto yy2; + if (yych <= 0xDBFF) goto yy4; +yy2: + ++YYCURSOR; +yy3: + {} +yy4: + yych = *++YYCURSOR; + if (yych <= 0xDBFF) goto yy3; + if (yych <= 0xDFFF) goto yy2; + goto yy3; +} + + + +{ + YYCTYPE yych; + if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); + yych = *YYCURSOR; + if (yych <= 0xD7FF) goto yy7; + if (yych <= 0xDBFF) goto yy9; +yy7: + ++YYCURSOR; +yy8: + {} +yy9: + yych = *++YYCURSOR; + if (yych <= 0xDBFF) goto yy8; + if (yych <= 0xDFFF) goto yy7; + goto yy8; +} + + + +{ + YYCTYPE yych; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR++; + {} +} + diff --git a/test/enc_reset.i.re b/test/enc_reset.i.re new file mode 100644 index 0000000..ca735fa --- /dev/null +++ b/test/enc_reset.i.re @@ -0,0 +1,14 @@ +/*!re2c + re2c:flags:x = 1; // set UTF-16 + [^] {} +*/ + +/*!re2c + re2c:flags:w = 0; // don't reset, still UTF-16 + [^] {} +*/ + +/*!re2c + re2c:flags:x = 0; // reset, ASCII + [^] {} +*/ diff --git a/test/error1.c b/test/error1.c index 2ae3624..a6d6bbf 100644 --- a/test/error1.c +++ b/test/error1.c @@ -1 +1 @@ -re2c: error: line 18, column 5: illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers +re2c: error: line 18, column 4: illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers diff --git a/test/error10.c b/test/error10.c index 22627fc..6c0ae27 100644 --- a/test/error10.c +++ b/test/error10.c @@ -1 +1 @@ -re2c: error: line 2, column 1: Bad code point range: '0x900000 - 0x900000' +re2c: error: line 2, column 1: bad code point range: '0x900000 - 0x900000' diff --git a/test/error11.c b/test/error11.c index a510ff6..00e7f96 100644 --- a/test/error11.c +++ b/test/error11.c @@ -1 +1 @@ -re2c: error: line 2, column 2: syntax error in hexadecimal escape sequence +re2c: error: line 2, column 1: syntax error in hexadecimal escape sequence diff --git a/test/error12.c b/test/error12.c index 3ddbb09..905bbfd 100644 --- a/test/error12.c +++ b/test/error12.c @@ -1 +1 @@ -re2c: error: line 3, column 17: trailing contexts are not allowed in named definitions +re2c: error: line 3: trailing contexts are not allowed in named definitions diff --git a/test/error13.1.c b/test/error13.1.c index 64b41ff..bbcc9f8 100644 --- a/test/error13.1.c +++ b/test/error13.1.c @@ -3,7 +3,8 @@ #define YYMAXFILL 3 -#line 7 "error13.1.c" + +#line 8 "error13.1.c" { YYCTYPE yych; if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); @@ -17,7 +18,7 @@ yy2: yy3: #line 6 "error13.1.re" { return 0; } -#line 21 "error13.1.c" +#line 22 "error13.1.c" yy4: yych = *(YYMARKER = ++YYCURSOR); switch (yych) { @@ -38,12 +39,12 @@ yy7: ++YYCURSOR; #line 4 "error13.1.re" { return 1; } -#line 42 "error13.1.c" +#line 43 "error13.1.c" yy9: ++YYCURSOR; #line 5 "error13.1.re" { return 2; } -#line 47 "error13.1.c" +#line 48 "error13.1.c" } #line 7 "error13.1.re" diff --git a/test/error13.c b/test/error13.c index 7f0ed32..042ad19 100644 --- a/test/error13.c +++ b/test/error13.c @@ -3,7 +3,8 @@ #define YYMAXFILL 3 -#line 7 "error13.c" + +#line 8 "error13.c" { YYCTYPE yych; if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); @@ -17,7 +18,7 @@ yy2: yy3: #line 6 "error13.re" { return 0; } -#line 21 "error13.c" +#line 22 "error13.c" yy4: yych = *(YYMARKER = ++YYCURSOR); switch (yych) { @@ -38,12 +39,12 @@ yy7: ++YYCURSOR; #line 4 "error13.re" { return 1; } -#line 42 "error13.c" +#line 43 "error13.c" yy9: ++YYCURSOR; #line 5 "error13.re" { return 2; } -#line 47 "error13.c" +#line 48 "error13.c" } #line 7 "error13.re" diff --git a/test/error14.1.c b/test/error14.1.c index ead3220..f3f6c68 100644 --- a/test/error14.1.c +++ b/test/error14.1.c @@ -48,4 +48,6 @@ yy9: #define YYMAXFILL 3 + #define YYMAXFILL 3 + diff --git a/test/error14.c b/test/error14.c index 4d4f4d6..3dc5c97 100644 --- a/test/error14.c +++ b/test/error14.c @@ -48,4 +48,6 @@ yy9: #define YYMAXFILL 3 + #define YYMAXFILL 3 + diff --git a/test/error15.c b/test/error15.c new file mode 100644 index 0000000..23acb84 --- /dev/null +++ b/test/error15.c @@ -0,0 +1 @@ +re2c: error: line 3, column 2: unexpected character: '1' diff --git a/test/error15.re b/test/error15.re new file mode 100644 index 0000000..9e92e37 --- /dev/null +++ b/test/error15.re @@ -0,0 +1,7 @@ +/*!re2c + + 1 = "a"; + + 1 {} + +*/ diff --git a/test/error2.c b/test/error2.c index 2ae3624..a6d6bbf 100644 --- a/test/error2.c +++ b/test/error2.c @@ -1 +1 @@ -re2c: error: line 18, column 5: illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers +re2c: error: line 18, column 4: illegal closure form, use '{n}', '{n,}', '{n,m}' where n and m are numbers diff --git a/test/error3.c b/test/error3.c index 37a3fa2..92bd3de 100644 --- a/test/error3.c +++ b/test/error3.c @@ -1 +1 @@ -re2c: error: line 18, column 5: unexpected character: ']' +re2c: error: line 18, column 4: unexpected character: ']' diff --git a/test/error4.c b/test/error4.c index a510ff6..00e7f96 100644 --- a/test/error4.c +++ b/test/error4.c @@ -1 +1 @@ -re2c: error: line 2, column 2: syntax error in hexadecimal escape sequence +re2c: error: line 2, column 1: syntax error in hexadecimal escape sequence diff --git a/test/error5.c b/test/error5.c index a510ff6..00e7f96 100644 --- a/test/error5.c +++ b/test/error5.c @@ -1 +1 @@ -re2c: error: line 2, column 2: syntax error in hexadecimal escape sequence +re2c: error: line 2, column 1: syntax error in hexadecimal escape sequence diff --git a/test/error6.c b/test/error6.c index a510ff6..00e7f96 100644 --- a/test/error6.c +++ b/test/error6.c @@ -1 +1 @@ -re2c: error: line 2, column 2: syntax error in hexadecimal escape sequence +re2c: error: line 2, column 1: syntax error in hexadecimal escape sequence diff --git a/test/error7.c b/test/error7.c index b3e2386..25f6e7d 100644 --- a/test/error7.c +++ b/test/error7.c @@ -1 +1 @@ -re2c: error: line 2, column 2: syntax error in octal escape sequence +re2c: error: line 2, column 1: syntax error in octal escape sequence diff --git a/test/error8.c b/test/error8.c index b3e2386..25f6e7d 100644 --- a/test/error8.c +++ b/test/error8.c @@ -1 +1 @@ -re2c: error: line 2, column 2: syntax error in octal escape sequence +re2c: error: line 2, column 1: syntax error in octal escape sequence diff --git a/test/error9.c b/test/error9.c index b3e2386..25f6e7d 100644 --- a/test/error9.c +++ b/test/error9.c @@ -1 +1 @@ -re2c: error: line 2, column 2: syntax error in octal escape sequence +re2c: error: line 2, column 1: syntax error in octal escape sequence diff --git a/test/flex-01.i.c b/test/flex-01.i.c index 3c58001..ab1757b 100644 --- a/test/flex-01.i.c +++ b/test/flex-01.i.c @@ -1 +1 @@ -re2c: error: line 6, column 1: curly braces for names only allowed with -F switch +re2c: error: line 6, column 0: curly braces for names only allowed with -F switch diff --git a/test/input11.b--eager-skip.c b/test/input11.b--eager-skip.c new file mode 100644 index 0000000..1878df1 --- /dev/null +++ b/test/input11.b--eager-skip.c @@ -0,0 +1,139 @@ +/* Generated by re2c */ +#line 1 "input11.b--eager-skip.re" + +#line 5 "input11.b--eager-skip.c" +{ + YYCTYPE yych; + if ((YYLIMIT - YYCURSOR) < 6) YYFILL(6); + yych = *YYCURSOR++; + if (yych <= '@') { + if (yych <= '/') { + if (yych == '-') goto yy4; + } else { + if (yych <= '0') goto yy5; + if (yych <= '9') goto yy7; + } + } else { + if (yych <= 'q') { + if (yych <= 'Z') goto yy9; + if (yych >= 'a') goto yy9; + } else { + if (yych <= 'r') goto yy12; + if (yych <= 'z') goto yy9; + } + } +yy3: +#line 15 "input11.b--eager-skip.re" + { return -1; } +#line 29 "input11.b--eager-skip.c" +yy4: + yych = *YYCURSOR; + if (yych <= '0') goto yy3; + if (yych <= '9') { + ++YYCURSOR; + goto yy7; + } + goto yy3; +yy5: +yy6: +#line 13 "input11.b--eager-skip.re" + { return 2; } +#line 42 "input11.b--eager-skip.c" +yy7: + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if (yych <= '/') goto yy6; + if (yych <= '9') { + ++YYCURSOR; + goto yy7; + } + goto yy6; +yy9: + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; +yy10: + if (yych <= '@') { + if (yych <= '/') goto yy11; + if (yych <= '9') { + ++YYCURSOR; + goto yy9; + } + } else { + if (yych <= 'Z') { + ++YYCURSOR; + goto yy9; + } + if (yych <= '`') goto yy11; + if (yych <= 'z') { + ++YYCURSOR; + goto yy9; + } + } +yy11: +#line 12 "input11.b--eager-skip.re" + { return 1; } +#line 76 "input11.b--eager-skip.c" +yy12: + yych = *YYCURSOR; + if (yych != 'e') goto yy10; + ++YYCURSOR; + yych = *YYCURSOR; + if (yych != '2') goto yy10; + ++YYCURSOR; + yych = *YYCURSOR; + if (yych != 'c') goto yy10; + ++YYCURSOR; + yych = *(YYMARKER = YYCURSOR); + if (yych != ':') goto yy10; + ++YYCURSOR; + yych = *YYCURSOR; + if (yych <= '^') { + if (yych <= '@') goto yy17; + if (yych <= 'Z') { + ++YYCURSOR; + goto yy18; + } + } else { + if (yych == '`') goto yy17; + if (yych <= 'z') { + ++YYCURSOR; + goto yy18; + } + } +yy17: + YYCURSOR = YYMARKER; + goto yy11; +yy18: + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; + if (yych <= 'Z') { + if (yych <= '/') goto yy20; + if (yych <= ':') { + ++YYCURSOR; + goto yy18; + } + if (yych >= 'A') { + ++YYCURSOR; + goto yy18; + } + } else { + if (yych <= '_') { + if (yych >= '_') { + ++YYCURSOR; + goto yy18; + } + } else { + if (yych <= '`') goto yy20; + if (yych <= 'z') { + ++YYCURSOR; + goto yy18; + } + } + } +yy20: +#line 11 "input11.b--eager-skip.re" + { return 0; } +#line 137 "input11.b--eager-skip.c" +} +#line 17 "input11.b--eager-skip.re" + diff --git a/test/input11.b--eager-skip.re b/test/input11.b--eager-skip.re new file mode 100644 index 0000000..705eca7 --- /dev/null +++ b/test/input11.b--eager-skip.re @@ -0,0 +1,17 @@ +/*!re2c + +re2c:yybm:hex = 1; + +letter = [a-zA-Z]; +digit = [0-9]; +number = "0" | ("-"? [1-9] digit*); +name = letter (letter|digit)*; +config = "re2c:" (letter|"_") (letter|digit|"_"|":")*; + +config { return 0; } +name { return 1; } +number { return 2; } + +.|"\n" { return -1; } + +*/ diff --git a/test/input2.b.c b/test/input2.b.c index a4cf343..f04e954 100644 --- a/test/input2.b.c +++ b/test/input2.b.c @@ -65,7 +65,5 @@ yy3: re2c: warning: line 5: control flow is undefined for strings that match '[\x0-\x60\x62-\xFF]' '\x61 [\x0-\x60\x63-\xFF]' - '\x61 \x61 [\x0-\x60\x63-\xFF]' '\x61 \x62 [\x0-\x61\x63-\xFF]' - '\x61 \x61 \x62 [\x0-\x61\x63-\xFF]' , use default rule '*' [-Wundefined-control-flow] diff --git a/test/input2.c b/test/input2.c index 4304bc3..c93767a 100644 --- a/test/input2.c +++ b/test/input2.c @@ -37,7 +37,5 @@ yy6: re2c: warning: line 5: control flow is undefined for strings that match '[\x0-\x60\x62-\xFF]' '\x61 [\x0-\x60\x63-\xFF]' - '\x61 \x61 [\x0-\x60\x63-\xFF]' '\x61 \x62 [\x0-\x61\x63-\xFF]' - '\x61 \x61 \x62 [\x0-\x61\x63-\xFF]' , use default rule '*' [-Wundefined-control-flow] diff --git a/test/input3.c b/test/input3.c index f3871c1..163aeee 100644 --- a/test/input3.c +++ b/test/input3.c @@ -37,7 +37,5 @@ yy6: re2c: warning: line 5: control flow is undefined for strings that match '[\x0-\x60\x62-\xFF]' '\x61 [\x0-\x60\x63-\xFF]' - '\x61 \x61 [\x0-\x60\x63-\xFF]' '\x61 \x62 [\x0-\x61\x63-\xFF]' - '\x61 \x61 \x62 [\x0-\x61\x63-\xFF]' , use default rule '*' [-Wundefined-control-flow] diff --git a/test/input4.--empty-class(error).c b/test/input4.--empty-class(error).c index ed80caf..87fd500 100644 --- a/test/input4.--empty-class(error).c +++ b/test/input4.--empty-class(error).c @@ -1 +1 @@ -re2c: error: line 3, column 1: empty character class +re2c: error: line 3, column 0: empty character class diff --git a/test/input4.--empty-class(match-empty).c b/test/input4.--empty-class(match-empty).c index 1ef8d80..a38637e 100644 --- a/test/input4.--empty-class(match-empty).c +++ b/test/input4.--empty-class(match-empty).c @@ -5,19 +5,14 @@ { YYCTYPE yych; if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - goto yy3; -#line 3 "input4.--empty-class(match-empty).re" - { return 0; } -#line 13 "input4.--empty-class(match-empty).c" -yy3: - ++YYCURSOR; + yych = *YYCURSOR++; #line 4 "input4.--empty-class(match-empty).re" { return 1; } -#line 18 "input4.--empty-class(match-empty).c" +#line 12 "input4.--empty-class(match-empty).c" } #line 7 "input4.--empty-class(match-empty).re" re2c: warning: line 3: empty character class [-Wempty-character-class] +re2c: warning: line 3: rule matches empty string [-Wmatch-empty-string] re2c: warning: line 3: unreachable rule (shadowed by rule at line 4) [-Wunreachable-rules] re2c: warning: line 5: unreachable rule (shadowed by rule at line 4) [-Wunreachable-rules] diff --git a/test/input4.--empty-class(match-none).c b/test/input4.--empty-class(match-none).c index 932b85d..19e4ec4 100644 --- a/test/input4.--empty-class(match-none).c +++ b/test/input4.--empty-class(match-none).c @@ -5,11 +5,10 @@ { YYCTYPE yych; if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - ++YYCURSOR; + yych = *YYCURSOR++; #line 4 "input4.--empty-class(match-none).re" { return 1; } -#line 13 "input4.--empty-class(match-none).c" +#line 12 "input4.--empty-class(match-none).c" } #line 7 "input4.--empty-class(match-none).re" diff --git a/test/input4.c b/test/input4.c index 517b828..0812d88 100644 --- a/test/input4.c +++ b/test/input4.c @@ -5,19 +5,14 @@ { YYCTYPE yych; if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - goto yy3; -#line 3 "input4.re" - { return 0; } -#line 13 "input4.c" -yy3: - ++YYCURSOR; + yych = *YYCURSOR++; #line 4 "input4.re" { return 1; } -#line 18 "input4.c" +#line 12 "input4.c" } #line 7 "input4.re" re2c: warning: line 3: empty character class [-Wempty-character-class] +re2c: warning: line 3: rule matches empty string [-Wmatch-empty-string] re2c: warning: line 3: unreachable rule (shadowed by rule at line 4) [-Wunreachable-rules] re2c: warning: line 5: unreachable rule (shadowed by rule at line 4) [-Wunreachable-rules] diff --git a/test/input6.--empty-class(error).c b/test/input6.--empty-class(error).c index ed80caf..87fd500 100644 --- a/test/input6.--empty-class(error).c +++ b/test/input6.--empty-class(error).c @@ -1 +1 @@ -re2c: error: line 3, column 1: empty character class +re2c: error: line 3, column 0: empty character class diff --git a/test/input6.--empty-class(match-empty).c b/test/input6.--empty-class(match-empty).c index a791a5b..2fd51a0 100644 --- a/test/input6.--empty-class(match-empty).c +++ b/test/input6.--empty-class(match-empty).c @@ -5,19 +5,14 @@ { YYCTYPE yych; if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - goto yy3; -#line 3 "input6.--empty-class(match-empty).re" - { return 0; } -#line 13 "input6.--empty-class(match-empty).c" -yy3: - ++YYCURSOR; + yych = *YYCURSOR++; #line 4 "input6.--empty-class(match-empty).re" { return 1; } -#line 18 "input6.--empty-class(match-empty).c" +#line 12 "input6.--empty-class(match-empty).c" } #line 6 "input6.--empty-class(match-empty).re" re2c: warning: line 3: empty character class [-Wempty-character-class] re2c: warning: line 3: empty character class [-Wempty-character-class] +re2c: warning: line 3: rule matches empty string [-Wmatch-empty-string] re2c: warning: line 3: unreachable rule (shadowed by rule at line 4) [-Wunreachable-rules] diff --git a/test/input6.--empty-class(match-none).c b/test/input6.--empty-class(match-none).c index 5bee0a6..deba960 100644 --- a/test/input6.--empty-class(match-none).c +++ b/test/input6.--empty-class(match-none).c @@ -5,11 +5,10 @@ { YYCTYPE yych; if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - ++YYCURSOR; + yych = *YYCURSOR++; #line 4 "input6.--empty-class(match-none).re" { return 1; } -#line 13 "input6.--empty-class(match-none).c" +#line 12 "input6.--empty-class(match-none).c" } #line 6 "input6.--empty-class(match-none).re" diff --git a/test/input6.c b/test/input6.c index f7c3937..0ce16df 100644 --- a/test/input6.c +++ b/test/input6.c @@ -5,19 +5,14 @@ { YYCTYPE yych; if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - goto yy3; -#line 3 "input6.re" - { return 0; } -#line 13 "input6.c" -yy3: - ++YYCURSOR; + yych = *YYCURSOR++; #line 4 "input6.re" { return 1; } -#line 18 "input6.c" +#line 12 "input6.c" } #line 6 "input6.re" re2c: warning: line 3: empty character class [-Wempty-character-class] re2c: warning: line 3: empty character class [-Wempty-character-class] +re2c: warning: line 3: rule matches empty string [-Wmatch-empty-string] re2c: warning: line 3: unreachable rule (shadowed by rule at line 4) [-Wunreachable-rules] diff --git a/test/input8.b.c b/test/input8.b.c index cbb33ef..d53dde0 100644 --- a/test/input8.b.c +++ b/test/input8.b.c @@ -50,7 +50,6 @@ yy11: if (yych >= 0x01) goto yy9; yy12: ++YYCURSOR; - yych = *YYCURSOR; goto yy7; } #line 9 "input8.b.re" diff --git a/test/input8.c b/test/input8.c index ab8e41d..839a63f 100644 --- a/test/input8.c +++ b/test/input8.c @@ -63,7 +63,6 @@ yy11: if (yych >= 0x01) goto yy9; yy12: ++YYCURSOR; - yych = *YYCURSOR; goto yy7; } #line 9 "input8.re" diff --git a/test/input8.g.c b/test/input8.g.c index 71f1465..e3b46ec 100644 --- a/test/input8.g.c +++ b/test/input8.g.c @@ -50,7 +50,6 @@ yy11: if (yych >= 0x01) goto yy9; yy12: ++YYCURSOR; - yych = *YYCURSOR; goto yy7; } #line 9 "input8.g.re" diff --git a/test/input_custom_default.--input(custom).c b/test/input_custom_default.--input(custom).c index d1e1bc9..076118a 100644 --- a/test/input_custom_default.--input(custom).c +++ b/test/input_custom_default.--input(custom).c @@ -106,9 +106,10 @@ yy14: yy15: YYSKIP (); yych = YYPEEK (); - YYBACKUPCTX (); switch (yych) { - case '[': goto yy16; + case '[': + YYBACKUPCTX (); + goto yy16; default: goto yy6; } yy16: @@ -150,7 +151,7 @@ yy19: YYRESTORECTX (); #line 15 "input_custom_default.--input(custom).re" { return true; } -#line 154 "input_custom_default.--input(custom).c" +#line 155 "input_custom_default.--input(custom).c" } #line 17 "input_custom_default.--input(custom).re" diff --git a/test/input_custom_default.--skeleton--input(custom).c b/test/input_custom_default.--skeleton--input(custom).c index c85e3d0dae607f03deb05c6507cfba195090a054..8387d18df0b23e450e2de98a0d1f74169a577e58 100644 GIT binary patch delta 559 zcmb`EzfZzI6vqPvL;^Sv5-^cGF+nIqL}E-VIO}9^a6xTId(g9RCGFLSVoZ$gnj8JG z`3IOz#?^s;z_>d5HyE`oNL<`})4lKe+wVBjMpQs9eM z31Maq6RB;=2r35EF=>sM4(dqV-oxgr&(C*Ne8}?t>$ph_+#*N@TYxIK1%W;J4PV_s zmIHjsIY1tkc7+hw;UYFVRLhnc*zj-;`#5pKsi?>Hg12t|5xh7xXoF%2FrgqRNK!=` z5GBndRBU5{N-Np10i|((3NTJh1IfQqf{>gG9lH*26S7X(Hs#1rse*Gk2RfprPGE6p zwAs~}lAKKwjRGQ?*;2rsZtReBZU~I@~ delta 207 zcmbQ&#Qf?X(*(7N?z$VNUS?s<%qvmIoSe%#d-6{y;mOu)q3jCL#tK?Mu_k c=4f@R&9B9@nb8z(j+0u#h_H4utBmAQ0Ma=`H2?qr diff --git a/test/input_custom_fgetc.--input(custom).c b/test/input_custom_fgetc.--input(custom).c index 095c659..30140d6 100644 --- a/test/input_custom_fgetc.--input(custom).c +++ b/test/input_custom_fgetc.--input(custom).c @@ -115,9 +115,10 @@ yy14: yy15: YYSKIP (); yych = YYPEEK (); - YYBACKUPCTX (); switch (yych) { - case '[': goto yy16; + case '[': + YYBACKUPCTX (); + goto yy16; default: goto yy6; } yy16: @@ -159,7 +160,7 @@ yy19: YYRESTORECTX (); #line 24 "input_custom_fgetc.--input(custom).re" { return true; } -#line 163 "input_custom_fgetc.--input(custom).c" +#line 164 "input_custom_fgetc.--input(custom).c" } #line 26 "input_custom_fgetc.--input(custom).re" diff --git a/test/input_custom_fgetc.--skeleton--input(custom).c b/test/input_custom_fgetc.--skeleton--input(custom).c index b83fe9dd02cac29e77788f861ad1c396bdc76e20..1b7f65eeb765e049606cb81cfc529a67f22ca9af 100644 GIT binary patch delta 579 zcmb`EO-lk%6o$#KOsYj;XrP@8CLJYHsYRo$D+oboWhF9mow=xYWads}89~s#xVt{U zMg4%7RX?Luw2yv8RP$lhrd?-s&U>E2dC$FXAD*i-?*%t4p~jN34p|;_e1vKg`0Qmw zh%I0uwhReDQKuRv@_=chw%F-Dl%IWmzSG2qEbYIZF^G<3f+Vm6D1p-uLM#`Ju^0c2 zuWEBE0X}XgkcRx85CSV4&f;CQU^WArBVL<*9KG>2QJ3upZ=L!*cz&wWI>jPjLP1oJ z*sNJVO;im+Yb{Jrelp@+lSS8<=bF3c$^L277z{*qcV0CfL8DLx( XOgWtP{@Wh2AGx!>2zAZv+35Wj7LvNv delta 203 zcmbQ$#Qf|Z(*(7N?z$VNUS?s<%qvmIoSe%#d$I;w2D?JEv4R$mKZQ+;2g+8^Rxpa) ze22}Gkrg7R!7+z3vm~`Bu_QA;Z}M@Dxr~{U(>Yr=Z{j-3#0*rjxQ>@mI8(t!Av?9Q zI6gVQG_S;3L0da>^IX0lM!v*kkhb`o%)C@1GmXhnQVN^H1-#fMpBIyuyiY)mIa=Ln Y^K&t6W;BJHqokHFBCOraC?mNP0C3Dgp#T5? diff --git a/test/input_custom_istringstream.--input(custom).c b/test/input_custom_istringstream.--input(custom).c index b13f47d..efefd5b 100644 --- a/test/input_custom_istringstream.--input(custom).c +++ b/test/input_custom_istringstream.--input(custom).c @@ -108,9 +108,10 @@ yy14: yy15: YYSKIP (); yych = YYPEEK (); - YYBACKUPCTX (); switch (yych) { - case '[': goto yy16; + case '[': + YYBACKUPCTX (); + goto yy16; default: goto yy6; } yy16: @@ -152,7 +153,7 @@ yy19: YYRESTORECTX (); #line 17 "input_custom_istringstream.--input(custom).re" { return true; } -#line 156 "input_custom_istringstream.--input(custom).c" +#line 157 "input_custom_istringstream.--input(custom).c" } #line 19 "input_custom_istringstream.--input(custom).re" diff --git a/test/input_custom_istringstream.--skeleton--input(custom).c b/test/input_custom_istringstream.--skeleton--input(custom).c index 3711031b652846acdfdcf54cdf9d31e56970f7dd..e3f99c12ec54bc323f034aa15c5babaa2b58328a 100644 GIT binary patch delta 583 zcmb`E&r1SP5XbRnW$@b*b$~9O<;|1+7dP7(2(sGX+k|Lnx~f4QkXnI6 z0<~0o`2h8w!^p9H=(9k8jsw40he~X!2kdN delta 203 zcmZ40#Qg0a(*(7N?z$VNUS?s<%qvmIoSe%#d$I;w2D?JEv4R$mKZQ+;2g+8^Rxpa) ze22}Gkrg7R!7+z3vm~`Bu_QA;Z}M@Dxr~{U(>Yr=Z{oVk#0*rjxQ~}nI8(t!Av?9Q zI6gVQG_S;3L0da>^IE`)Ia=Ln Y^LH_AW;BJHv!s?VBCOpkC?mNP0IpO+WdHyG diff --git a/test/input_custom_mjson.--input(custom).c b/test/input_custom_mjson.--input(custom).c index 614d9fd..5d25012 100644 --- a/test/input_custom_mjson.--input(custom).c +++ b/test/input_custom_mjson.--input(custom).c @@ -670,8 +670,9 @@ yy14: } yy15: YYSKIP (); - switch ((yych = YYPEEK ())) { - case '.': goto yy47; + yych = YYPEEK (); + switch (yych) { + case '.': case '0': case '1': case '2': @@ -679,13 +680,14 @@ yy15: case '4': case '5': case '6': - case '7': goto yy54; + case '7': case '8': - case '9': goto yy57; + case '9': case 'A': case 'B': case 'C': case 'D': + case 'E': case 'F': case 'G': case 'H': @@ -711,6 +713,7 @@ yy15: case 'b': case 'c': case 'd': + case 'e': case 'f': case 'g': case 'h': @@ -730,9 +733,7 @@ yy15: case 'v': case 'w': case 'y': - case 'z': goto yy60; - case 'E': - case 'e': goto yy62; + case 'z': goto yy55; case 'X': case 'x': goto yy63; default: goto yy16; @@ -743,7 +744,7 @@ yy16: token = TOK_DEC_NUMBER; goto done; } -#line 747 "input_custom_mjson.--input(custom).c" +#line 748 "input_custom_mjson.--input(custom).c" yy17: YYSKIP (); yych = YYPEEK (); @@ -821,7 +822,7 @@ yy19: token = TOK_COLON; goto done; } -#line 825 "input_custom_mjson.--input(custom).c" +#line 826 "input_custom_mjson.--input(custom).c" yy21: YYSKIP (); #line 552 "input_custom_mjson.--input(custom).re" @@ -829,7 +830,7 @@ yy21: token = TOK_EQUAL; goto done; } -#line 833 "input_custom_mjson.--input(custom).c" +#line 834 "input_custom_mjson.--input(custom).c" yy23: YYSKIP (); yych = YYPEEK (); @@ -906,7 +907,7 @@ yy25: token = TOK_IDENTIFIER; goto done; } -#line 910 "input_custom_mjson.--input(custom).c" +#line 911 "input_custom_mjson.--input(custom).c" yy26: YYSKIP (); #line 537 "input_custom_mjson.--input(custom).re" @@ -914,7 +915,7 @@ yy26: token = TOK_LEFT_BRACKET; goto done; } -#line 918 "input_custom_mjson.--input(custom).c" +#line 919 "input_custom_mjson.--input(custom).c" yy28: YYSKIP (); #line 542 "input_custom_mjson.--input(custom).re" @@ -922,7 +923,7 @@ yy28: token = TOK_RIGHT_BRACKET; goto done; } -#line 926 "input_custom_mjson.--input(custom).c" +#line 927 "input_custom_mjson.--input(custom).c" yy30: YYSKIP (); yych = YYPEEK (); @@ -951,7 +952,7 @@ yy33: token = TOK_LEFT_CURLY_BRACKET; goto done; } -#line 955 "input_custom_mjson.--input(custom).c" +#line 956 "input_custom_mjson.--input(custom).c" yy35: YYSKIP (); #line 532 "input_custom_mjson.--input(custom).re" @@ -959,7 +960,7 @@ yy35: token = TOK_RIGHT_CURLY_BRACKET; goto done; } -#line 963 "input_custom_mjson.--input(custom).c" +#line 964 "input_custom_mjson.--input(custom).c" yy37: YYSKIP (); yych = YYPEEK (); @@ -973,11 +974,11 @@ yy38: yy39: YYRESTORE (); switch (yyaccept) { - case 0: goto yy5; - case 1: goto yy16; - case 2: goto yy49; - case 3: goto yy59; - default: goto yy93; + case 0: goto yy5; + case 1: goto yy16; + case 2: goto yy49; + case 3: goto yy59; + default: goto yy93; } yy40: YYSKIP (); @@ -986,7 +987,7 @@ yy40: token = TOK_NOESC_STRING; goto done; } -#line 990 "input_custom_mjson.--input(custom).c" +#line 991 "input_custom_mjson.--input(custom).c" yy42: YYSKIP (); yych = YYPEEK (); @@ -1086,7 +1087,7 @@ yy49: token = TOK_FLOAT_NUMBER; goto done; } -#line 1090 "input_custom_mjson.--input(custom).c" +#line 1091 "input_custom_mjson.--input(custom).c" yy50: YYSKIP (); yych = YYPEEK (); @@ -1106,6 +1107,7 @@ yy52: yy54: YYSKIP (); yych = YYPEEK (); +yy55: switch (yych) { case '.': goto yy47; case '0': @@ -1179,7 +1181,7 @@ yy56: token = TOK_OCT_NUMBER; goto done; } -#line 1183 "input_custom_mjson.--input(custom).c" +#line 1185 "input_custom_mjson.--input(custom).c" yy57: YYSKIP (); yych = YYPEEK (); @@ -1256,10 +1258,11 @@ yy59: context->token = TOK_INVALID; return; } -#line 1260 "input_custom_mjson.--input(custom).c" +#line 1262 "input_custom_mjson.--input(custom).c" yy60: YYSKIP (); yych = YYPEEK (); +yy61: switch (yych) { case '0': case '1': @@ -1344,60 +1347,7 @@ yy62: case '7': case '8': case '9': goto yy77; - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': goto yy60; - default: goto yy59; + default: goto yy61; } yy63: YYSKIP (); @@ -1578,7 +1528,7 @@ yy74: { continue; } -#line 1582 "input_custom_mjson.--input(custom).c" +#line 1532 "input_custom_mjson.--input(custom).c" yy76: YYSKIP (); yych = YYPEEK (); @@ -1740,7 +1690,7 @@ yy81: token = TOK_HEX_NUMBER; goto done; } -#line 1744 "input_custom_mjson.--input(custom).c" +#line 1694 "input_custom_mjson.--input(custom).c" yy82: YYSKIP (); yych = YYPEEK (); @@ -1769,7 +1719,7 @@ yy85: token = TOK_STRING; goto done; } -#line 1773 "input_custom_mjson.--input(custom).c" +#line 1723 "input_custom_mjson.--input(custom).c" yy87: YYSKIP (); yych = YYPEEK (); @@ -1830,7 +1780,7 @@ yy93: { continue; } -#line 1834 "input_custom_mjson.--input(custom).c" +#line 1784 "input_custom_mjson.--input(custom).c" yy94: YYSKIP (); yych = YYPEEK (); @@ -1840,7 +1790,8 @@ yy94: } yy95: YYSKIP (); - switch ((yych = YYPEEK ())) { + yych = YYPEEK (); + switch (yych) { case '0': case '1': case '2': @@ -1912,10 +1863,11 @@ yy96: token = TOK_NULL; goto done; } -#line 1916 "input_custom_mjson.--input(custom).c" +#line 1867 "input_custom_mjson.--input(custom).c" yy97: YYSKIP (); - switch ((yych = YYPEEK ())) { + yych = YYPEEK (); + switch (yych) { case '0': case '1': case '2': @@ -1987,7 +1939,7 @@ yy98: token = TOK_TRUE; goto done; } -#line 1991 "input_custom_mjson.--input(custom).c" +#line 1943 "input_custom_mjson.--input(custom).c" yy99: YYSKIP (); yych = YYPEEK (); @@ -2028,7 +1980,8 @@ yy100: } yy101: YYSKIP (); - switch ((yych = YYPEEK ())) { + yych = YYPEEK (); + switch (yych) { case '0': case '1': case '2': @@ -2100,7 +2053,7 @@ yy102: token = TOK_FALSE; goto done; } -#line 2104 "input_custom_mjson.--input(custom).c" +#line 2057 "input_custom_mjson.--input(custom).c" yy103: YYSKIP (); yych = YYPEEK (); @@ -2250,7 +2203,7 @@ static int parse_string(mjson_parser_t *context, uint32_t id) s = c; -#line 2254 "input_custom_mjson.--input(custom).c" +#line 2207 "input_custom_mjson.--input(custom).c" { YYCTYPE yych; yych = YYPEEK (); @@ -2267,7 +2220,7 @@ yy107: { assert(!"reachable"); } -#line 2271 "input_custom_mjson.--input(custom).c" +#line 2224 "input_custom_mjson.--input(custom).c" yy108: YYSKIP (); yych = YYPEEK (); @@ -2288,7 +2241,7 @@ yy110: continue; } -#line 2292 "input_custom_mjson.--input(custom).c" +#line 2245 "input_custom_mjson.--input(custom).c" yy111: YYSKIP (); #line 801 "input_custom_mjson.--input(custom).re" @@ -2300,7 +2253,7 @@ yy111: return 1; } -#line 2304 "input_custom_mjson.--input(custom).c" +#line 2257 "input_custom_mjson.--input(custom).c" yy113: YYSKIP (); YYBACKUP (); @@ -2350,7 +2303,7 @@ yy114: continue; } -#line 2354 "input_custom_mjson.--input(custom).c" +#line 2307 "input_custom_mjson.--input(custom).c" yy116: YYSKIP (); yych = YYPEEK (); @@ -2482,7 +2435,7 @@ yy121: continue; } -#line 2486 "input_custom_mjson.--input(custom).c" +#line 2439 "input_custom_mjson.--input(custom).c" } #line 813 "input_custom_mjson.--input(custom).re" diff --git a/test/input_custom_mjson.--skeleton--input(custom).c b/test/input_custom_mjson.--skeleton--input(custom).c index a6a5d3a..4c334f6 100644 --- a/test/input_custom_mjson.--skeleton--input(custom).c +++ b/test/input_custom_mjson.--skeleton--input(custom).c @@ -1,7 +1,9 @@ /* Generated by re2c */ +#include /* size_t */ #include #include /* malloc, free */ +#include /* memcpy */ static void *read_file ( const char *fname @@ -58,7 +60,7 @@ error: #define YYFILL(n) { break; } static int action_line626 - ( unsigned int i + ( unsigned *pkix , const YYKEYTYPE *keys , const YYCTYPE *start , const YYCTYPE *token @@ -66,10 +68,12 @@ static int action_line626 , YYKEYTYPE rule_act ) { + const unsigned kix = *pkix; const long pos = token - start; const long len_act = *cursor - token; - const long len_exp = (long) keys [3 * i + 1]; - const YYKEYTYPE rule_exp = keys [3 * i + 2]; + const long len_exp = (long) keys[kix + 1]; + const YYKEYTYPE rule_exp = keys[kix + 2]; + *pkix = kix + 3; if (rule_exp == 255) { fprintf ( stderr @@ -79,17 +83,17 @@ static int action_line626 ); } if (len_act == len_exp && rule_act == rule_exp) { - const YYKEYTYPE offset = keys[3 * i]; + const YYKEYTYPE offset = keys[kix]; *cursor = token + offset; return 0; } else { fprintf ( stderr - , "error: lex_line626: at position %ld (iteration %u):\n" + , "error: lex_line626: at position %ld (key %u):\n" "\texpected: match length %ld, rule %u\n" "\tactual: match length %ld, rule %u\n" , pos - , i + , kix , len_exp , rule_exp , len_act @@ -99,6 +103,13 @@ static int action_line626 } } +static int check_key_count_line626(unsigned have, unsigned used, unsigned need) +{ + if (used + need <= have) return 0; + fprintf(stderr, "error: lex_line626: not enough keys\n"); + return 1; +} + int lex_line626() { const size_t padding = 6; /* YYMAXFILL */ @@ -126,7 +137,7 @@ int lex_line626() keys = (YYKEYTYPE *) read_file ("input_custom_mjson.--skeleton--input(custom).c.line626.keys" - , 3 * sizeof (YYKEYTYPE) + , sizeof (YYKEYTYPE) , 0 , &keys_count ); @@ -139,7 +150,7 @@ int lex_line626() limit = input + input_len + padding; eof = input + input_len; - for (i = 0; status == 0 && i < keys_count; ++i) { + for (i = 0; status == 0 && cursor < eof && i < keys_count;) { token = cursor; const YYCTYPE *marker = NULL; YYCTYPE yych; @@ -232,12 +243,14 @@ int lex_line626() } yy2: YYSKIP (); - status = action_line626(i, keys, input, token, &cursor, 20); + status = check_key_count_line626(keys_count, i, 3) + || action_line626(&i, keys, input, token, &cursor, 20); continue; yy4: YYSKIP (); yy5: - status = action_line626(i, keys, input, token, &cursor, 22); + status = check_key_count_line626(keys_count, i, 3) + || action_line626(&i, keys, input, token, &cursor, 22); continue; yy6: YYSKIP (); @@ -251,7 +264,8 @@ yy6: default: goto yy8; } yy8: - status = action_line626(i, keys, input, token, &cursor, 0); + status = check_key_count_line626(keys_count, i, 3) + || action_line626(&i, keys, input, token, &cursor, 0); continue; yy9: yyaccept = 0; @@ -281,7 +295,8 @@ yy10: } yy11: YYSKIP (); - status = action_line626(i, keys, input, token, &cursor, 9); + status = check_key_count_line626(keys_count, i, 3) + || action_line626(&i, keys, input, token, &cursor, 9); continue; yy13: YYSKIP (); @@ -311,8 +326,9 @@ yy14: } yy15: YYSKIP (); - switch ((yych = YYPEEK ())) { - case '.': goto yy47; + yych = YYPEEK (); + switch (yych) { + case '.': case '0': case '1': case '2': @@ -320,13 +336,14 @@ yy15: case '4': case '5': case '6': - case '7': goto yy54; + case '7': case '8': - case '9': goto yy57; + case '9': case 'A': case 'B': case 'C': case 'D': + case 'E': case 'F': case 'G': case 'H': @@ -352,6 +369,7 @@ yy15: case 'b': case 'c': case 'd': + case 'e': case 'f': case 'g': case 'h': @@ -371,15 +389,14 @@ yy15: case 'v': case 'w': case 'y': - case 'z': goto yy60; - case 'E': - case 'e': goto yy62; + case 'z': goto yy55; case 'X': case 'x': goto yy63; default: goto yy16; } yy16: - status = action_line626(i, keys, input, token, &cursor, 12); + status = check_key_count_line626(keys_count, i, 3) + || action_line626(&i, keys, input, token, &cursor, 12); continue; yy17: YYSKIP (); @@ -454,11 +471,13 @@ yy17: } yy19: YYSKIP (); - status = action_line626(i, keys, input, token, &cursor, 7); + status = check_key_count_line626(keys_count, i, 3) + || action_line626(&i, keys, input, token, &cursor, 7); continue; yy21: YYSKIP (); - status = action_line626(i, keys, input, token, &cursor, 8); + status = check_key_count_line626(keys_count, i, 3) + || action_line626(&i, keys, input, token, &cursor, 8); continue; yy23: YYSKIP (); @@ -532,15 +551,18 @@ yy24: default: goto yy25; } yy25: - status = action_line626(i, keys, input, token, &cursor, 17); + status = check_key_count_line626(keys_count, i, 3) + || action_line626(&i, keys, input, token, &cursor, 17); continue; yy26: YYSKIP (); - status = action_line626(i, keys, input, token, &cursor, 5); + status = check_key_count_line626(keys_count, i, 3) + || action_line626(&i, keys, input, token, &cursor, 5); continue; yy28: YYSKIP (); - status = action_line626(i, keys, input, token, &cursor, 6); + status = check_key_count_line626(keys_count, i, 3) + || action_line626(&i, keys, input, token, &cursor, 6); continue; yy30: YYSKIP (); @@ -565,11 +587,13 @@ yy32: } yy33: YYSKIP (); - status = action_line626(i, keys, input, token, &cursor, 3); + status = check_key_count_line626(keys_count, i, 3) + || action_line626(&i, keys, input, token, &cursor, 3); continue; yy35: YYSKIP (); - status = action_line626(i, keys, input, token, &cursor, 4); + status = check_key_count_line626(keys_count, i, 3) + || action_line626(&i, keys, input, token, &cursor, 4); continue; yy37: YYSKIP (); @@ -585,15 +609,16 @@ yy38: yy39: YYRESTORE (); switch (yyaccept) { - case 0: goto yy5; - case 1: goto yy16; - case 2: goto yy49; - case 3: goto yy59; - default: goto yy93; + case 0: goto yy5; + case 1: goto yy16; + case 2: goto yy49; + case 3: goto yy59; + default: goto yy93; } yy40: YYSKIP (); - status = action_line626(i, keys, input, token, &cursor, 18); + status = check_key_count_line626(keys_count, i, 3) + || action_line626(&i, keys, input, token, &cursor, 18); continue; yy42: YYSKIP (); @@ -692,7 +717,8 @@ yy47: default: goto yy49; } yy49: - status = action_line626(i, keys, input, token, &cursor, 13); + status = check_key_count_line626(keys_count, i, 3) + || action_line626(&i, keys, input, token, &cursor, 13); continue; yy50: YYSKIP (); @@ -716,6 +742,7 @@ yy54: YYSKIP (); if (YYLESSTHAN (3)) YYFILL(3); yych = YYPEEK (); +yy55: switch (yych) { case '.': goto yy47; case '0': @@ -784,7 +811,8 @@ yy54: default: goto yy56; } yy56: - status = action_line626(i, keys, input, token, &cursor, 10); + status = check_key_count_line626(keys_count, i, 3) + || action_line626(&i, keys, input, token, &cursor, 10); continue; yy57: YYSKIP (); @@ -858,12 +886,14 @@ yy57: default: goto yy59; } yy59: - status = action_line626(i, keys, input, token, &cursor, 21); + status = check_key_count_line626(keys_count, i, 3) + || action_line626(&i, keys, input, token, &cursor, 21); continue; yy60: YYSKIP (); if (YYLESSTHAN (1)) YYFILL(1); yych = YYPEEK (); +yy61: switch (yych) { case '0': case '1': @@ -948,60 +978,7 @@ yy62: case '7': case '8': case '9': goto yy77; - case 'A': - case 'B': - case 'C': - case 'D': - case 'E': - case 'F': - case 'G': - case 'H': - case 'I': - case 'J': - case 'K': - case 'L': - case 'M': - case 'N': - case 'O': - case 'P': - case 'Q': - case 'R': - case 'S': - case 'T': - case 'U': - case 'V': - case 'W': - case 'X': - case 'Y': - case 'Z': - case '_': - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': goto yy60; - default: goto yy59; + default: goto yy61; } yy63: YYSKIP (); @@ -1182,7 +1159,8 @@ yy73: } yy74: YYSKIP (); - status = action_line626(i, keys, input, token, &cursor, 1); + status = check_key_count_line626(keys_count, i, 3) + || action_line626(&i, keys, input, token, &cursor, 1); continue; yy76: YYSKIP (); @@ -1342,7 +1320,8 @@ yy80: default: goto yy81; } yy81: - status = action_line626(i, keys, input, token, &cursor, 11); + status = check_key_count_line626(keys_count, i, 3) + || action_line626(&i, keys, input, token, &cursor, 11); continue; yy82: YYSKIP (); @@ -1367,7 +1346,8 @@ yy84: } yy85: YYSKIP (); - status = action_line626(i, keys, input, token, &cursor, 19); + status = check_key_count_line626(keys_count, i, 3) + || action_line626(&i, keys, input, token, &cursor, 19); continue; yy87: YYSKIP (); @@ -1428,7 +1408,8 @@ yy90: yy92: YYSKIP (); yy93: - status = action_line626(i, keys, input, token, &cursor, 2); + status = check_key_count_line626(keys_count, i, 3) + || action_line626(&i, keys, input, token, &cursor, 2); continue; yy94: YYSKIP (); @@ -1439,7 +1420,8 @@ yy94: } yy95: YYSKIP (); - switch ((yych = YYPEEK ())) { + yych = YYPEEK (); + switch (yych) { case '0': case '1': case '2': @@ -1506,11 +1488,13 @@ yy95: default: goto yy96; } yy96: - status = action_line626(i, keys, input, token, &cursor, 16); + status = check_key_count_line626(keys_count, i, 3) + || action_line626(&i, keys, input, token, &cursor, 16); continue; yy97: YYSKIP (); - switch ((yych = YYPEEK ())) { + yych = YYPEEK (); + switch (yych) { case '0': case '1': case '2': @@ -1577,7 +1561,8 @@ yy97: default: goto yy98; } yy98: - status = action_line626(i, keys, input, token, &cursor, 14); + status = check_key_count_line626(keys_count, i, 3) + || action_line626(&i, keys, input, token, &cursor, 14); continue; yy99: YYSKIP (); @@ -1621,7 +1606,8 @@ yy100: } yy101: YYSKIP (); - switch ((yych = YYPEEK ())) { + yych = YYPEEK (); + switch (yych) { case '0': case '1': case '2': @@ -1688,7 +1674,8 @@ yy101: default: goto yy102; } yy102: - status = action_line626(i, keys, input, token, &cursor, 15); + status = check_key_count_line626(keys_count, i, 3) + || action_line626(&i, keys, input, token, &cursor, 15); continue; yy103: YYSKIP (); @@ -1729,7 +1716,7 @@ yy103: } if (i != keys_count) { status = 1; - fprintf(stderr, "error: lex_line626: unused keys left after %u iterations\n", i); + fprintf(stderr, "error: lex_line626: unused keys left after %u keys\n", i); } } @@ -1759,7 +1746,7 @@ end: #define YYFILL(n) { break; } static int action_line813 - ( unsigned int i + ( unsigned *pkix , const YYKEYTYPE *keys , const YYCTYPE *start , const YYCTYPE *token @@ -1767,10 +1754,12 @@ static int action_line813 , YYKEYTYPE rule_act ) { + const unsigned kix = *pkix; const long pos = token - start; const long len_act = *cursor - token; - const long len_exp = (long) keys [3 * i + 1]; - const YYKEYTYPE rule_exp = keys [3 * i + 2]; + const long len_exp = (long) keys[kix + 1]; + const YYKEYTYPE rule_exp = keys[kix + 2]; + *pkix = kix + 3; if (rule_exp == 255) { fprintf ( stderr @@ -1780,17 +1769,17 @@ static int action_line813 ); } if (len_act == len_exp && rule_act == rule_exp) { - const YYKEYTYPE offset = keys[3 * i]; + const YYKEYTYPE offset = keys[kix]; *cursor = token + offset; return 0; } else { fprintf ( stderr - , "error: lex_line813: at position %ld (iteration %u):\n" + , "error: lex_line813: at position %ld (key %u):\n" "\texpected: match length %ld, rule %u\n" "\tactual: match length %ld, rule %u\n" , pos - , i + , kix , len_exp , rule_exp , len_act @@ -1800,6 +1789,13 @@ static int action_line813 } } +static int check_key_count_line813(unsigned have, unsigned used, unsigned need) +{ + if (used + need <= have) return 0; + fprintf(stderr, "error: lex_line813: not enough keys\n"); + return 1; +} + int lex_line813() { const size_t padding = 6; /* YYMAXFILL */ @@ -1827,7 +1823,7 @@ int lex_line813() keys = (YYKEYTYPE *) read_file ("input_custom_mjson.--skeleton--input(custom).c.line813.keys" - , 3 * sizeof (YYKEYTYPE) + , sizeof (YYKEYTYPE) , 0 , &keys_count ); @@ -1840,7 +1836,7 @@ int lex_line813() limit = input + input_len + padding; eof = input + input_len; - for (i = 0; status == 0 && i < keys_count; ++i) { + for (i = 0; status == 0 && cursor < eof && i < keys_count;) { token = cursor; const YYCTYPE *marker = NULL; YYCTYPE yych; @@ -1856,7 +1852,8 @@ int lex_line813() yy106: YYSKIP (); yy107: - status = action_line813(i, keys, input, token, &cursor, 4); + status = check_key_count_line813(keys_count, i, 3) + || action_line813(&i, keys, input, token, &cursor, 4); continue; yy108: YYSKIP (); @@ -1869,11 +1866,13 @@ yy108: default: goto yy108; } yy110: - status = action_line813(i, keys, input, token, &cursor, 0); + status = check_key_count_line813(keys_count, i, 3) + || action_line813(&i, keys, input, token, &cursor, 0); continue; yy111: YYSKIP (); - status = action_line813(i, keys, input, token, &cursor, 3); + status = check_key_count_line813(keys_count, i, 3) + || action_line813(&i, keys, input, token, &cursor, 3); continue; yy113: YYSKIP (); @@ -1893,7 +1892,8 @@ yy113: } yy114: YYSKIP (); - status = action_line813(i, keys, input, token, &cursor, 1); + status = check_key_count_line813(keys_count, i, 3) + || action_line813(&i, keys, input, token, &cursor, 1); continue; yy116: YYSKIP (); @@ -2012,7 +2012,8 @@ yy120: } yy121: YYSKIP (); - status = action_line813(i, keys, input, token, &cursor, 2); + status = check_key_count_line813(keys_count, i, 3) + || action_line813(&i, keys, input, token, &cursor, 2); continue; } @@ -2024,7 +2025,7 @@ yy121: } if (i != keys_count) { status = 1; - fprintf(stderr, "error: lex_line813: unused keys left after %u iterations\n", i); + fprintf(stderr, "error: lex_line813: unused keys left after %u keys\n", i); } } @@ -2054,196 +2055,7 @@ int main() } return 0; } - !#$%&'()*;<>?@\^`|~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ - - -    - - -    - - -   - - -    - - -    - - -    - - -    - - -! " # $ - - -% & ' ( - - -) * + , - - -- . / 0 - - -1 2 3 4 - - -5 6 7 8 - - -9 : ; < - - -= > ? @ - - -A B C D - - -E F G H - - -I J K L - - -M N O P - - -Q R S T - - -U V W X - - -Y Z [ \ - - -] ^ _ ` - - -a b c d - - -e f g h - - -i j k l - - -m n o p - - -q r s t - - -u v w x - - -y z { | - - -} ~  € - - - ‚ ƒ „ - - -… † ‡ ˆ - - -‰ Š ‹ Œ - - - Ž   - - -‘ ’ “ ” - - -• – — ˜ - - -™ š › œ - - - ž Ÿ   - - -¡ ¢ £ ¤ - - -¥ ¦ § ¨ - - -© ª « ¬ - - -­ ® ¯ ° - - -± ² ³ ´ - - -µ ¶ · ¸ - - -¹ º » ¼ - - -½ ¾ ¿ À - - -Á Â Ã Ä - - -Å Æ Ç È - - -É Ê Ë Ì - - -Í Î Ï Ð - - -Ñ Ò Ó Ô - - -Õ Ö × Ø - - -Ù Ú Û Ü - - -Ý Þ ß à - - -á â ã ä - - -å æ ç è - - -é ê ë ì - - -í î ï ð - - -ñ ò ó ô - - -õ ö ÷ ø - - -ù ú û ü - - -ý þ ÿ + !#$%&'()*;<>?@\^`|~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ     @@ -2835,17 +2647,15 @@ y z { | 0xBBR 0XCCS 0xDDT 0XEEU0xFFV0XaaW0xbbX0XccY0xddZ0Xee_0xffg0X00h0x11i0X22j0x33k0X44l0x55m0X66n0x77o0X88p0x99q0XAAr 0xBBs!0XCCt"0xDDu#0XEEv$0xFFw%0Xaax&0xbby'0Xccz(0xddG)0XeeH*0xffI+0X00J,0x11K-0X22L.0x33M/0X44N:0x55O;0X66P<0x77Q=0X88R>0x99S?0XAAT@0xBBU[0XCCV\0xDDW]0XEEX^0xFFY`0XaaZ{0xbb_|0Xccg}0xddh~0Xeei0xffj€0X00k0x11l‚0X22mƒ0x33n„0X44o…0x55p†0X66q‡0x77rˆ0X88s‰0x99tŠ0XAAu‹0xBBvŒ0XCCw0xDDxŽ0XEEy0xFFz0XaaG‘0xbbH’0XccI“0xddJ”0XeeK•0xffL–0X00M—0x11N˜0X22O™0x33Pš0X44Q›0x55Rœ0X66S0x77Tž0X88UŸ0x99V 0XAAW¡0xBBX¢0XCCY£0xDDZ¤0XEE_¥0xFFg¦0Xaah§0xbbi¨0Xccj©0xddkª0Xeel«0xffm¬0X00n­0x11o®0X22p¯0x33q°0X44r±0x55s²0X66t³0x77u´0X88vµ0x99w¶0XAAx·0xBBy¸0XCCz¹0xDDGº0XEEH»0xFFI¼0XaaJ½0xbbK¾0XccL¿0xddMÀ0XeeNÁ0xffOÂ0X00PÃ0x11QÄ0X22RÅ0x33SÆ0X44TÇ0x55UÈ0X66VÉ0x77WÊ0X88XË0x99YÌ0XAAZÍ0xBB_Î0XCCgÏ0xDDhÐ0XEEiÑ0xFFjÒ0XaakÓ0xbblÔ0XccmÕ0xddnÖ0Xeeo×0xffpØ0X00qÙ0x11rÚ0X22sÛ0x33tÜ0X44uÝ0x55vÞ0X66wß0x77xà0X88yá0x99zâ0XAAGã0xBBHä0XCCIå0xDDJæ0XEEKç0xFFLè0XaaMé0xbbNê0XccOë0xddPì0XeeQí0xffRî0X00Sï0x11Tð0X22Uñ0x33Vò0X44Wó0x55Xô0X66Yõ0x77Zö0X88_÷0x99gø0XAAhù0xBBiú0XCCjû0xDDkü0XEElý0xFFmþ0Xaanÿ0X00x10X20x30X40x50X60x70X80x9 0XA 0xB 0XC 0xD 0XE0xF0Xa0xb0Xc0xd0Xe0xf0X00x10X20x30X40x50X60x70X80x90XA 0xB!0XC"0xD#0XE$0xF%0Xa&0xb'0Xc(0xd)0Xe*0xf+0X0,0x1-0X2.0x3/0X4:0x5;0X6<0x7=0X8>0x9?0XA@0xB[0XC\0xD]0XE^0xF`0Xa{0xb|0Xc}0xd~0Xe0xf€0X00x1‚0X2ƒ0x3„0X4…0x5†0X6‡0x7ˆ0X8‰0x9Š0XA‹0xBŒ0XC0xDŽ0XE0xF0Xa‘0xb’0Xc“0xd”0Xe•0xf–0X0—0x1˜0X2™0x3š0X4›0x5œ0X60x7ž0X8Ÿ0x9 0XA¡0xB¢0XC£0xD¤0XE¥0xF¦0Xa§0xb¨0Xc©0xdª0Xe«0xf¬0X0­0x1®0X2¯0x3°0X4±0x5²0X6³0x7´0X8µ0x9¶0XA·0xB¸0XC¹0xDº0XE»0xF¼0Xa½0xb¾0Xc¿0xdÀ0XeÁ0xfÂ0X0Ã0x1Ä0X2Å0x3Æ0X4Ç0x5È0X6É0x7Ê0X8Ë0x9Ì0XAÍ0xBÎ0XCÏ0xDÐ0XEÑ0xFÒ0XaÓ0xbÔ0XcÕ0xdÖ0Xe×0xfØ0X0Ù0x1Ú0X2Û0x3Ü0X4Ý0x5Þ0X6ß0x7à0X8á0x9â0XAã0xBä0XCå0xDæ0XEç0xFè0Xaé0xbê0Xcë0xdì0Xeí0xfî0X0ï0x1ð0X2ñ0x3ò0X4ó0x5ô0X6õ0x7ö0X8÷0x9ø0XAù0xBú0XCû0xDü0XEý0xFþ0Xaÿ0X0x0X0x0X0x0X0x0X0x 0X 0x 0X 0x 0X0x0X0x0X0x0X0x0X0x0X0x0X0x0X0x0X0x0X 0x!0X"0x#0X$0x%0X&0x'0X(0x)0X*0x+0X,0x-0X.0x/0X:0x;0X<0x=0X>0x?0X@0x[0X\0x]0X^0x`0X{0x|0X}0x~0X0x€0X0x‚0Xƒ0x„0X…0x†0X‡0xˆ0X‰0xŠ0X‹0xŒ0X0xŽ0X0x0X‘0x’0X“0x”0X•0x–0X—0x˜0X™0xš0X›0xœ0X0xž0XŸ0x 0X¡0x¢0X£0x¤0X¥0x¦0X§0x¨0X©0xª0X«0x¬0X­0x®0X¯0x°0X±0x²0X³0x´0Xµ0x¶0X·0x¸0X¹0xº0X»0x¼0X½0x¾0X¿0xÀ0XÁ0xÂ0XÃ0xÄ0XÅ0xÆ0XÇ0xÈ0XÉ0xÊ0XË0xÌ0XÍ0xÎ0XÏ0xÐ0XÑ0xÒ0XÓ0xÔ0XÕ0xÖ0X×0xØ0XÙ0xÚ0XÛ0xÜ0XÝ0xÞ0Xß0xà0Xá0xâ0Xã0xä0Xå0xæ0Xç0xè0Xé0xê0Xë0xì0Xí0xî0Xï0xð0Xñ0xò0Xó0xô0Xõ0xö0X÷0xø0Xù0xú0Xû0xü0Xý0xþ0Xÿ0000000000 0 -0 0 0 0000000000000000000 0!0"0#0$0%0&0'0(0)0*0+0,0-0/0:0;0<0=0>0?0@0[0\0]0^0`0{0|0}0~00€00‚0ƒ0„0…0†0‡0ˆ0‰0Š0‹0Œ00Ž000‘0’0“0”0•0–0—0˜0™0š0›0œ00ž0Ÿ0 0¡0¢0£0¤0¥0¦0§0¨0©0ª0«0¬0­0®0¯0°0±0²0³0´0µ0¶0·0¸0¹0º0»0¼0½0¾0¿0À0Á0Â0Ã0Ä0Å0Æ0Ç0È0É0Ê0Ë0Ì0Í0Î0Ï0Ð0Ñ0Ò0Ó0Ô0Õ0Ö0×0Ø0Ù0Ú0Û0Ü0Ý0Þ0ß0à0á0â0ã0ä0å0æ0ç0è0é0ê0ë0ì0í0î0ï0ð0ñ0ò0ó0ô0õ0ö0÷0ø0ù0ú0û0ü0ý0þ0ÿ1.0E+02.1e-13.2E+24.3e-35.4E+46.5e-57.6E+68.7e-79.8E+81.9e-9 2.0E+0 -3.1e-1 4.2E+2 5.3e-3 6.4E+47.5e-58.6E+69.7e-71.8E+82.9e-93.0E+04.1e-15.2E+26.3e-37.4E+48.5e-59.6E+61.7e-72.8E+83.9e-94.0E+05.1e-16.2E+2 7.3e-3!8.4E+4"9.5e-5#1.6E+6$2.7e-7%3.8E+8&4.9e-9'5.0E+0(6.1e-1)7.2E+2*8.3e-3+9.4E+4,1.5e-5-2.6E+6.3.7e-7/4.8E+8:5.9e-9;6.0E+0<7.1e-1=8.2E+2>9.3e-3?1.4E+4@2.5e-5A3.6E+6B4.7e-7C5.8E+8D6.9e-9E7.0E+0F8.1e-1G9.2E+2H1.3e-3I2.4E+4J3.5e-5K4.6E+6L5.7e-7M6.8E+8N7.9e-9O8.0E+0P9.1e-1Q1.2E+2R2.3e-3S3.4E+4T4.5e-5U5.6E+6V6.7e-7W7.8E+8X8.9e-9Y9.0E+0Z1.1e-1[2.2E+2\3.3e-3]4.4E+4^5.5e-5_6.6E+6`7.7e-7a8.8E+8b9.9e-9c1.0E+0d2.1e-1e3.2E+2f4.3e-3g5.4E+4h6.5e-5i7.6E+6j8.7e-7k9.8E+8l1.9e-9m2.0E+0n3.1e-1o4.2E+2p5.3e-3q6.4E+4r7.5e-5s8.6E+6t9.7e-7u1.8E+8v2.9e-9w3.0E+0x4.1e-1y5.2E+2z6.3e-3{7.4E+4|8.5e-5}9.6E+6~1.7e-72.8E+8€3.9e-94.0E+0‚5.1e-1ƒ6.2E+2„7.3e-3…8.4E+4†9.5e-5‡1.6E+6ˆ2.7e-7‰3.8E+8Š4.9e-9‹5.0E+0Œ6.1e-17.2E+2Ž8.3e-39.4E+41.5e-5‘2.6E+6’3.7e-7“4.8E+8”5.9e-9•6.0E+0–7.1e-1—8.2E+2˜9.3e-3™1.4E+4š2.5e-5›3.6E+6œ4.7e-75.8E+8ž6.9e-9Ÿ7.0E+0 8.1e-1¡9.2E+2¢1.3e-3£2.4E+4¤3.5e-5¥4.6E+6¦5.7e-7§6.8E+8¨7.9e-9©8.0E+0ª9.1e-1«1.2E+2¬2.3e-3­3.4E+4®4.5e-5¯5.6E+6°6.7e-7±7.8E+8²8.9e-9³9.0E+0´1.1e-1µ2.2E+2¶3.3e-3·4.4E+4¸5.5e-5¹6.6E+6º7.7e-7»8.8E+8¼9.9e-9½1.0E+0¾2.1e-1¿3.2E+2À4.3e-3Á5.4E+4Â6.5e-5Ã7.6E+6Ä8.7e-7Å9.8E+8Æ1.9e-9Ç2.0E+0È3.1e-1É4.2E+2Ê5.3e-3Ë6.4E+4Ì7.5e-5Í8.6E+6Î9.7e-7Ï1.8E+8Ð2.9e-9Ñ3.0E+0Ò4.1e-1Ó5.2E+2Ô6.3e-3Õ7.4E+4Ö8.5e-5×9.6E+6Ø1.7e-7Ù2.8E+8Ú3.9e-9Û4.0E+0Ü5.1e-1Ý6.2E+2Þ7.3e-3ß8.4E+4à9.5e-5á1.6E+6â2.7e-7ã3.8E+8ä4.9e-9å5.0E+0æ6.1e-1ç7.2E+2è8.3e-3é9.4E+4ê1.5e-5ë2.6E+6ì3.7e-7í4.8E+8î5.9e-9ï6.0E+0ð7.1e-1ñ8.2E+2ò9.3e-3ó1.4E+4ô2.5e-5õ3.6E+6ö4.7e-7÷5.8E+8ø6.9e-9ù7.0E+0ú8.1e-1û9.2E+2ü1.3e-3ý2.4E+4þ3.5e-5ÿ1A2B3C4D5F6G7H8I9J1K 2L -3M 4N 5O 6P7Q8R9S1T2U3V4W5X6Y7Z8_9a1b2c3d4f5g6h 7i!8j"9k#1l$2m%3n&4o'5p(6q)7r*8s+9t,1u-2v.3w/4x:5y;6z<7A=8B>9C?1D@2F[3G\4H]5I^6J`7K{8L|9M}1N~2O3P€4Q5R‚6Sƒ7T„8U…9V†1W‡2Xˆ3Y‰4ZŠ5_‹6aŒ7b8cŽ9d1f2g‘3h’4i“5j”6k•7l–8m—9n˜1o™2pš3q›4rœ5s6tž7uŸ8v 9w¡1x¢2y£3z¤4A¥5B¦6C§7D¨8F©9Gª1H«2I¬3J­4K®5L¯6M°7N±8O²9P³1Q´2Rµ3S¶4T·5U¸6V¹7Wº8X»9Y¼1Z½2_¾3a¿4bÀ5cÁ6dÂ7fÃ8gÄ9hÅ1iÆ2jÇ3kÈ4lÉ5mÊ6nË7oÌ8pÍ9qÎ1rÏ2sÐ3tÑ4uÒ5vÓ6wÔ7xÕ8yÖ9z×1AØ2BÙ3CÚ4DÛ5FÜ6GÝ7HÞ8Iß9Jà1Ká2Lâ3Mã4Nä5Oå6Pæ7Qç8Rè9Sé1Tê2Uë3Vì4Wí5Xî6Yï7Zð8_ñ9aò1bó2cô3dõ4fö5g÷6hø7iù8jú9kû1lü2mý3nþ4oÿ1EA2eB3EC4eD5EE6eF7EG8eH9EI1eJ 2EK -3eL 4EM 5eN 6EO7eP8EQ9eR1ES2eT3EU4eV5EW6eX7EY8eZ9E_1ea2Eb3ec4Ed5ee6Ef 7eg!8Eh"9ei#1Ej$2ek%3El&4em'5En(6eo)7Ep*8eq+9Er,1es-2Et.3eu/4Ev:5ew;6Ex<7ey=8Ez>9eA?1EB@2eC[3ED\4eE]5EF^6eG`7EH{8eI|9EJ}1eK~2EL3eM€4EN5eO‚6EPƒ7eQ„8ER…9eS†1ET‡2eUˆ3EV‰4eWŠ5EX‹6eYŒ7EZ8e_Ž9Ea1eb2Ec‘3ed’4Ee“5ef”6Eg•7eh–8Ei—9ej˜1Ek™2elš3Em›4enœ5Eo6epž7EqŸ8er 9Es¡1et¢2Eu£3ev¤4Ew¥5ex¦6Ey§7ez¨8EA©9eBª1EC«2eD¬3EE­4eF®5EG¯6eH°7EI±8eJ²9EK³1eL´2EMµ3eN¶4EO·5eP¸6EQ¹7eRº8ES»9eT¼1EU½2eV¾3EW¿4eXÀ5EYÁ6eZÂ7E_Ã8eaÄ9EbÅ1ecÆ2EdÇ3eeÈ4EfÉ5egÊ6EhË7eiÌ8EjÍ9ekÎ1ElÏ2emÐ3EnÑ4eoÒ5EpÓ6eqÔ7ErÕ8esÖ9Et×1euØ2EvÙ3ewÚ4ExÛ5eyÜ6EzÝ7eAÞ8EBß9eCà1EDá2eEâ3EFã4eGä5EHå6eIæ7EJç8eKè9ELé1eMê2ENë3eOì4EPí5eQî6ERï7eSð8ETñ9eUò1EVó2eWô3EXõ4eYö5EZ÷6e_ø7Eaù8ebú9Ecû1edü2Eeý3efþ4Egÿ10.0E+021.1e-132.2E+243.3e-354.4E+465.5e-576.6E+687.7e-798.8E+819.9e-9 20.0E+0 +0 0 0 0000000000000000000 0!0"0#0$0%0&0'0(0)0*0+0,0-0/0:0;0<0=0>0?0@0[0\0]0^0`0{0|0}0~00€00‚0ƒ0„0…0†0‡0ˆ0‰0Š0‹0Œ00Ž000‘0’0“0”0•0–0—0˜0™0š0›0œ00ž0Ÿ0 0¡0¢0£0¤0¥0¦0§0¨0©0ª0«0¬0­0®0¯0°0±0²0³0´0µ0¶0·0¸0¹0º0»0¼0½0¾0¿0À0Á0Â0Ã0Ä0Å0Æ0Ç0È0É0Ê0Ë0Ì0Í0Î0Ï0Ð0Ñ0Ò0Ó0Ô0Õ0Ö0×0Ø0Ù0Ú0Û0Ü0Ý0Þ0ß0à0á0â0ã0ä0å0æ0ç0è0é0ê0ë0ì0í0î0ï0ð0ñ0ò0ó0ô0õ0ö0÷0ø0ù0ú0û0ü0ý0þ0ÿ10.0E+021.1e-132.2E+243.3e-354.4E+465.5e-576.6E+687.7e-798.8E+819.9e-9 20.0E+0 31.1e-1 42.2E+2 53.3e-3 64.4E+475.5e-586.6E+697.7e-718.8E+829.9e-930.0E+041.1e-152.2E+263.3e-374.4E+485.5e-596.6E+617.7e-728.8E+839.9e-940.0E+051.1e-162.2E+2 73.3e-3!84.4E+4"95.5e-5#16.6E+6$27.7e-7%38.8E+8&49.9e-9'50.0E+0(61.1e-1)72.2E+2*83.3e-3+94.4E+4,15.5e-5-26.6E+6.37.7e-7/48.8E+8:59.9e-9;60.0E+0<71.1e-1=82.2E+2>93.3e-3?14.4E+4@25.5e-5A36.6E+6B47.7e-7C58.8E+8D69.9e-9E70.0E+0F81.1e-1G92.2E+2H13.3e-3I24.4E+4J35.5e-5K46.6E+6L57.7e-7M68.8E+8N79.9e-9O80.0E+0P91.1e-1Q12.2E+2R23.3e-3S34.4E+4T45.5e-5U56.6E+6V67.7e-7W78.8E+8X89.9e-9Y90.0E+0Z11.1e-1[22.2E+2\33.3e-3]44.4E+4^55.5e-5_66.6E+6`77.7e-7a88.8E+8b99.9e-9c10.0E+0d21.1e-1e32.2E+2f43.3e-3g54.4E+4h65.5e-5i76.6E+6j87.7e-7k98.8E+8l19.9e-9m20.0E+0n31.1e-1o42.2E+2p53.3e-3q64.4E+4r75.5e-5s86.6E+6t97.7e-7u18.8E+8v29.9e-9w30.0E+0x41.1e-1y52.2E+2z63.3e-3{74.4E+4|85.5e-5}96.6E+6~17.7e-728.8E+8€39.9e-940.0E+0‚51.1e-1ƒ62.2E+2„73.3e-3…84.4E+4†95.5e-5‡16.6E+6ˆ27.7e-7‰38.8E+8Š49.9e-9‹50.0E+0Œ61.1e-172.2E+2Ž83.3e-394.4E+415.5e-5‘26.6E+6’37.7e-7“48.8E+8”59.9e-9•60.0E+0–71.1e-1—82.2E+2˜93.3e-3™14.4E+4š25.5e-5›36.6E+6œ47.7e-758.8E+8ž69.9e-9Ÿ70.0E+0 81.1e-1¡92.2E+2¢13.3e-3£24.4E+4¤35.5e-5¥46.6E+6¦57.7e-7§68.8E+8¨79.9e-9©80.0E+0ª91.1e-1«12.2E+2¬23.3e-3­34.4E+4®45.5e-5¯56.6E+6°67.7e-7±78.8E+8²89.9e-9³90.0E+0´11.1e-1µ22.2E+2¶33.3e-3·44.4E+4¸55.5e-5¹66.6E+6º77.7e-7»88.8E+8¼99.9e-9½10.0E+0¾21.1e-1¿32.2E+2À43.3e-3Á54.4E+4Â65.5e-5Ã76.6E+6Ä87.7e-7Å98.8E+8Æ19.9e-9Ç20.0E+0È31.1e-1É42.2E+2Ê53.3e-3Ë64.4E+4Ì75.5e-5Í86.6E+6Î97.7e-7Ï18.8E+8Ð29.9e-9Ñ30.0E+0Ò41.1e-1Ó52.2E+2Ô63.3e-3Õ74.4E+4Ö85.5e-5×96.6E+6Ø17.7e-7Ù28.8E+8Ú39.9e-9Û40.0E+0Ü51.1e-1Ý62.2E+2Þ73.3e-3ß84.4E+4à95.5e-5á16.6E+6â27.7e-7ã38.8E+8ä49.9e-9å50.0E+0æ61.1e-1ç72.2E+2è83.3e-3é94.4E+4ê15.5e-5ë26.6E+6ì37.7e-7í48.8E+8î59.9e-9ï60.0E+0ð71.1e-1ñ82.2E+2ò93.3e-3ó14.4E+4ô25.5e-5õ36.6E+6ö47.7e-7÷58.8E+8ø69.9e-9ù70.0E+0ú81.1e-1û92.2E+2ü13.3e-3ý24.4E+4þ35.5e-5ÿ10A21B32C43D54F65G76H87I98J19K 20L 31M 42N 53O 64P75Q86R97S18T29U30V41W52X63Y74Z85_96a17b28c39d40f51g62h 73i!84j"95k#16l$27m%38n&49o'50p(61q)72r*83s+94t,15u-26v.37w/48x:59y;60z<71A=82B>93C?14D@25F[36G\47H]58I^69J`70K{81L|92M}13N~24O35P€46Q57R‚68Sƒ79T„80U…91V†12W‡23Xˆ34Y‰45ZŠ56_‹67aŒ78b89cŽ90d11f22g‘33h’44i“55j”66k•77l–88m—99n˜10o™21pš32q›43rœ54s65tž76uŸ87v 98w¡19x¢20y£31z¤42A¥53B¦64C§75D¨86F©97Gª18H«29I¬30J­41K®52L¯63M°74N±85O²96P³17Q´28Rµ39S¶40T·51U¸62V¹73Wº84X»95Y¼16Z½27_¾38a¿49bÀ50cÁ61dÂ72fÃ83gÄ94hÅ15iÆ26jÇ37kÈ48lÉ59mÊ60nË71oÌ82pÍ93qÎ14rÏ25sÐ36tÑ47uÒ58vÓ69wÔ70xÕ81yÖ92z×13AØ24BÙ35CÚ46DÛ57FÜ68GÝ79HÞ80Iß91Jà12Ká23Lâ34Mã45Nä56Oå67Pæ78Qç89Rè90Sé11Tê22Uë33Vì44Wí55Xî66Yï77Zð88_ñ99aò10bó21cô32dõ43fö54g÷65hø76iù87jú98kû19lü20mý31nþ42oÿ10EA21eB32EC43eD54EE65eF76EG87eH98EI19eJ 20EK -31eL 42EM 53eN 64EO75eP86EQ97eR18ES29eT30EU41eV52EW63eX74EY85eZ96E_17ea28Eb39ec40Ed51ee62Ef 73eg!84Eh"95ei#16Ej$27ek%38El&49em'50En(61eo)72Ep*83eq+94Er,15es-26Et.37eu/48Ev:59ew;60Ex<71ey=82Ez>93eA?14EB@25eC[36ED\47eE]58EF^69eG`70EH{81eI|92EJ}13eK~24EL35eM€46EN57eO‚68EPƒ79eQ„80ER…91eS†12ET‡23eUˆ34EV‰45eWŠ56EX‹67eYŒ78EZ89e_Ž90Ea11eb22Ec‘33ed’44Ee“55ef”66Eg•77eh–88Ei—99ej˜10Ek™21elš32Em›43enœ54Eo65epž76EqŸ87er 98Es¡19et¢20Eu£31ev¤42Ew¥53ex¦64Ey§75ez¨86EA©97eBª18EC«29eD¬30EE­41eF®52EG¯63eH°74EI±85eJ²96EK³17eL´28EMµ39eN¶40EO·51eP¸62EQ¹73eRº84ES»95eT¼16EU½27eV¾38EW¿49eXÀ50EYÁ61eZÂ72E_Ã83eaÄ94EbÅ15ecÆ26EdÇ37eeÈ48EfÉ59egÊ60EhË71eiÌ82EjÍ93ekÎ14ElÏ25emÐ36EnÑ47eoÒ58EpÓ69eqÔ70ErÕ81esÖ92Et×13euØ24EvÙ35ewÚ46ExÛ57eyÜ68EzÝ79eAÞ80EBß91eCà12EDá23eEâ34EFã45eGä56EHå67eIæ78EJç89eKè90ELé11eMê22ENë33eOì44EPí55eQî66ERï77eSð88ETñ99eUò10EVó21eWô32EXõ43eYö54EZ÷65e_ø76Eaù87ebú98Ecû19edü20Eeý31efþ42Egÿ100.0E+0211.1e-1322.2E+2433.3e-3544.4E+4655.5e-5766.6E+6877.7e-7988.8E+8199.9e-9 200.0E+0 -311.1e-1 422.2E+2 533.3e-3 644.4E+4755.5e-5866.6E+6977.7e-7188.8E+8299.9e-9300.0E+0411.1e-1522.2E+2633.3e-3744.4E+4855.5e-5966.6E+6177.7e-7288.8E+8399.9e-9400.0E+0511.1e-1622.2E+2 733.3e-3!844.4E+4"955.5e-5#166.6E+6$277.7e-7%388.8E+8&499.9e-9'500.0E+0(611.1e-1)722.2E+2*833.3e-3+944.4E+4,155.5e-5-266.6E+6.377.7e-7/488.8E+8:599.9e-9;600.0E+0<711.1e-1=822.2E+2>933.3e-3?144.4E+4@255.5e-5A366.6E+6B477.7e-7C588.8E+8D699.9e-9E700.0E+0F811.1e-1G922.2E+2H133.3e-3I244.4E+4J355.5e-5K466.6E+6L577.7e-7M688.8E+8N799.9e-9O800.0E+0P911.1e-1Q122.2E+2R233.3e-3S344.4E+4T455.5e-5U566.6E+6V677.7e-7W788.8E+8X899.9e-9Y900.0E+0Z111.1e-1[222.2E+2\333.3e-3]444.4E+4^555.5e-5_666.6E+6`777.7e-7a888.8E+8b999.9e-9c100.0E+0d211.1e-1e322.2E+2f433.3e-3g544.4E+4h655.5e-5i766.6E+6j877.7e-7k988.8E+8l199.9e-9m200.0E+0n311.1e-1o422.2E+2p533.3e-3q644.4E+4r755.5e-5s866.6E+6t977.7e-7u188.8E+8v299.9e-9w300.0E+0x411.1e-1y522.2E+2z633.3e-3{744.4E+4|855.5e-5}966.6E+6~177.7e-7288.8E+8€399.9e-9400.0E+0‚511.1e-1ƒ622.2E+2„733.3e-3…844.4E+4†955.5e-5‡166.6E+6ˆ277.7e-7‰388.8E+8Š499.9e-9‹500.0E+0Œ611.1e-1722.2E+2Ž833.3e-3944.4E+4155.5e-5‘266.6E+6’377.7e-7“488.8E+8”599.9e-9•600.0E+0–711.1e-1—822.2E+2˜933.3e-3™144.4E+4š255.5e-5›366.6E+6œ477.7e-7588.8E+8ž699.9e-9Ÿ700.0E+0 811.1e-1¡922.2E+2¢133.3e-3£244.4E+4¤355.5e-5¥466.6E+6¦577.7e-7§688.8E+8¨799.9e-9©800.0E+0ª911.1e-1«122.2E+2¬233.3e-3­344.4E+4®455.5e-5¯566.6E+6°677.7e-7±788.8E+8²899.9e-9³900.0E+0´111.1e-1µ222.2E+2¶333.3e-3·444.4E+4¸555.5e-5¹666.6E+6º777.7e-7»888.8E+8¼999.9e-9½100.0E+0¾211.1e-1¿322.2E+2À433.3e-3Á544.4E+4Â655.5e-5Ã766.6E+6Ä877.7e-7Å988.8E+8Æ199.9e-9Ç200.0E+0È311.1e-1É422.2E+2Ê533.3e-3Ë644.4E+4Ì755.5e-5Í866.6E+6Î977.7e-7Ï188.8E+8Ð299.9e-9Ñ300.0E+0Ò411.1e-1Ó522.2E+2Ô633.3e-3Õ744.4E+4Ö855.5e-5×966.6E+6Ø177.7e-7Ù288.8E+8Ú399.9e-9Û400.0E+0Ü511.1e-1Ý622.2E+2Þ733.3e-3ß844.4E+4à955.5e-5á166.6E+6â277.7e-7ã388.8E+8ä499.9e-9å500.0E+0æ611.1e-1ç722.2E+2è833.3e-3é944.4E+4ê155.5e-5ë266.6E+6ì377.7e-7í488.8E+8î599.9e-9ï600.0E+0ð711.1e-1ñ822.2E+2ò933.3e-3ó144.4E+4ô255.5e-5õ366.6E+6ö477.7e-7÷588.8E+8ø699.9e-9ù700.0E+0ú811.1e-1û922.2E+2ü133.3e-3ý244.4E+4þ355.5e-5ÿ10213243546576879819 20 -31 42 53 64758697182930415263748596172839405162 73!84"95#16$27%38&49'50(61)72*83+94,15-26/37:48;59<60=71>82?93@14[25\36]47^58`69{70|81}92~1324€3546‚57ƒ68„79…80†91‡12ˆ23‰34Š45‹56Œ6778Ž899011‘22’33“44”55•66–77—88˜99™10š21›32œ4354ž65Ÿ76 87¡98¢19£20¤31¥42¦53§64¨75©86ª97«18¬29­30®41¯52°63±74²85³96´17µ28¶39·40¸51¹62º73»84¼95½16¾27¿38À49Á50Â61Ã72Ä83Å94Æ15Ç26È37É48Ê59Ë60Ì71Í82Î93Ï14Ð25Ñ36Ò47Ó58Ô69Õ70Ö81×92Ø13Ù24Ú35Û46Ü57Ý68Þ79ß80à91á12â23ã34ä45å56æ67ç78è89é90ê11ë22ì33í44î55ï66ð77ñ88ò99ó10ô21õ32ö43÷54ø65ù76ú87û98ü19ý20þ31ÿ1234567891 2 -3 4 5 6789123456789123456 7!8"9#1$2%3&4'5(6)7*8+9,1-2/3:4;5<6=7>8?9@1[2\3]4^5`6{7|8}9~12€34‚5ƒ6„7…8†9‡1ˆ2‰3Š4‹5Œ67Ž891‘2’3“4”5•6–7—8˜9™1š2›3œ45ž6Ÿ7 8¡9¢1£2¤3¥4¦5§6¨7©8ª9«1¬2­3®4¯5°6±7²8³9´1µ2¶3·4¸5¹6º7»8¼9½1¾2¿3À4Á5Â6Ã7Ä8Å9Æ1Ç2È3É4Ê5Ë6Ì7Í8Î9Ï1Ð2Ñ3Ò4Ó5Ô6Õ7Ö8×9Ø1Ù2Ú3Û4Ü5Ý6Þ7ß8à9á1â2ã3ä4å5æ6ç7è8é9ê1ë2ì3í4î5ï6ð7ñ8ò9ó1ô2õ3ö4÷5ø6ù7ú8û9ü1ý2þ3ÿ:=A00B11C22D33E44F55G66H77I88J99 KAA -LBB MCC NDD OEEPFFQGGRHHSIITJJUKKVLLWMMXNNYOOZPP_QQaRRbSScTTdUUeVVgWW hXX!iYY"jZZ#k__$laa%mbb&occ'pdd(qee)rff*sgg+uhh,vii-wjj.xkk/yll:zmm;AnnDqq?Err@Fss[Gtt\Huu]Ivv^Jww`Kxx{Lyy|Mzz}N00~O11P22€Q33R44‚S55ƒT66„U77…V88†W99‡XAAˆYBB‰ZCCŠ_DD‹aEEŒbFFcGGŽdHHeIIgJJ‘hKK’iLL“jMM”kNN•lOO–mPP—oQQ˜pRR™qSSšrTT›sUUœuVVvWWžwXXŸxYY yZZ¡z__¢Aaa£Bbb¤Ccc¥Ddd¦Eee§Fff¨Ggg©HhhªIii«Jjj¬Kkk­Lll®Mmm¯Nnn°Ooo±Ppp²Qqq³Rrr´SssµTtt¶Uuu·Vvv¸Www¹XxxºYyy»Zzz¼_00½a11¾b22¿c33Àd44Áe55Âg66Ãh77Äi88Åj99ÆkAAÇlBBÈmCCÉoDDÊpEEËqFFÌrGGÍsHHÎuIIÏvJJÐwKKÑxLLÒyMMÓzNNÔAOOÕBPPÖCQQ×DRRØESSÙFTTÚGUUÛHVVÜIWWÝJXXÞKYYßLZZàM__áNaaâObbãPccäQddåReeæSffçTggèUhhéViiêWjjëXkkìYllíZmmî_nnïaooðbppñcqqòdrróessôgttõhuuöivv÷jwwøkxxùlyyúmzzûo00üp11ýq22þr33ÿA0B1C2D3E4F5G6H7I8J9 KA +31eL 42EM 53eN 64EO75eP86EQ97eR18ES29eT30EU41eV52EW63eX74EY85eZ96E_17ea28Eb39ec40Ed51ee62Ef 73eg!84Eh"95ei#16Ej$27ek%38El&49em'50En(61eo)72Ep*83eq+94Er,15es-26Et.37eu/48Ev:59ew;60Ex<71ey=82Ez>93eA?14EB@25eC[36ED\47eE]58EF^69eG`70EH{81eI|92EJ}13eK~24EL35eM€46EN57eO‚68EPƒ79eQ„80ER…91eS†12ET‡23eUˆ34EV‰45eWŠ56EX‹67eYŒ78EZ89e_Ž90Ea11eb22Ec‘33ed’44Ee“55ef”66Eg•77eh–88Ei—99ej˜10Ek™21elš32Em›43enœ54Eo65epž76EqŸ87er 98Es¡19et¢20Eu£31ev¤42Ew¥53ex¦64Ey§75ez¨86EA©97eBª18EC«29eD¬30EE­41eF®52EG¯63eH°74EI±85eJ²96EK³17eL´28EMµ39eN¶40EO·51eP¸62EQ¹73eRº84ES»95eT¼16EU½27eV¾38EW¿49eXÀ50EYÁ61eZÂ72E_Ã83eaÄ94EbÅ15ecÆ26EdÇ37eeÈ48EfÉ59egÊ60EhË71eiÌ82EjÍ93ekÎ14ElÏ25emÐ36EnÑ47eoÒ58EpÓ69eqÔ70ErÕ81esÖ92Et×13euØ24EvÙ35ewÚ46ExÛ57eyÜ68EzÝ79eAÞ80EBß91eCà12EDá23eEâ34EFã45eGä56EHå67eIæ78EJç89eKè90ELé11eMê22ENë33eOì44EPí55eQî66ERï77eSð88ETñ99eUò10EVó21eWô32EXõ43eYö54EZ÷65e_ø76Eaù87ebú98Ecû19edü20Eeý31efþ42Egÿ10213243546576879819 20 +31 42 53 64758697182930415263748596172839405162 73!84"95#16$27%38&49'50(61)72*83+94,15-26/37:48;59<60=71>82?93@14[25\36]47^58`69{70|81}92~1324€3546‚57ƒ68„79…80†91‡12ˆ23‰34Š45‹56Œ6778Ž899011‘22’33“44”55•66–77—88˜99™10š21›32œ4354ž65Ÿ76 87¡98¢19£20¤31¥42¦53§64¨75©86ª97«18¬29­30®41¯52°63±74²85³96´17µ28¶39·40¸51¹62º73»84¼95½16¾27¿38À49Á50Â61Ã72Ä83Å94Æ15Ç26È37É48Ê59Ë60Ì71Í82Î93Ï14Ð25Ñ36Ò47Ó58Ô69Õ70Ö81×92Ø13Ù24Ú35Û46Ü57Ý68Þ79ß80à91á12â23ã34ä45å56æ67ç78è89é90ê11ë22ì33í44î55ï66ð77ñ88ò99ó10ô21õ32ö43÷54ø65ù76ú87û98ü19ý20þ31ÿ1.0E+02.1e-13.2E+24.3e-35.4E+46.5e-57.6E+68.7e-79.8E+81.9e-9 2.0E+0 +3.1e-1 4.2E+2 5.3e-3 6.4E+47.5e-58.6E+69.7e-71.8E+82.9e-93.0E+04.1e-15.2E+26.3e-37.4E+48.5e-59.6E+61.7e-72.8E+83.9e-94.0E+05.1e-16.2E+2 7.3e-3!8.4E+4"9.5e-5#1.6E+6$2.7e-7%3.8E+8&4.9e-9'5.0E+0(6.1e-1)7.2E+2*8.3e-3+9.4E+4,1.5e-5-2.6E+6.3.7e-7/4.8E+8:5.9e-9;6.0E+0<7.1e-1=8.2E+2>9.3e-3?1.4E+4@2.5e-5A3.6E+6B4.7e-7C5.8E+8D6.9e-9E7.0E+0F8.1e-1G9.2E+2H1.3e-3I2.4E+4J3.5e-5K4.6E+6L5.7e-7M6.8E+8N7.9e-9O8.0E+0P9.1e-1Q1.2E+2R2.3e-3S3.4E+4T4.5e-5U5.6E+6V6.7e-7W7.8E+8X8.9e-9Y9.0E+0Z1.1e-1[2.2E+2\3.3e-3]4.4E+4^5.5e-5_6.6E+6`7.7e-7a8.8E+8b9.9e-9c1.0E+0d2.1e-1e3.2E+2f4.3e-3g5.4E+4h6.5e-5i7.6E+6j8.7e-7k9.8E+8l1.9e-9m2.0E+0n3.1e-1o4.2E+2p5.3e-3q6.4E+4r7.5e-5s8.6E+6t9.7e-7u1.8E+8v2.9e-9w3.0E+0x4.1e-1y5.2E+2z6.3e-3{7.4E+4|8.5e-5}9.6E+6~1.7e-72.8E+8€3.9e-94.0E+0‚5.1e-1ƒ6.2E+2„7.3e-3…8.4E+4†9.5e-5‡1.6E+6ˆ2.7e-7‰3.8E+8Š4.9e-9‹5.0E+0Œ6.1e-17.2E+2Ž8.3e-39.4E+41.5e-5‘2.6E+6’3.7e-7“4.8E+8”5.9e-9•6.0E+0–7.1e-1—8.2E+2˜9.3e-3™1.4E+4š2.5e-5›3.6E+6œ4.7e-75.8E+8ž6.9e-9Ÿ7.0E+0 8.1e-1¡9.2E+2¢1.3e-3£2.4E+4¤3.5e-5¥4.6E+6¦5.7e-7§6.8E+8¨7.9e-9©8.0E+0ª9.1e-1«1.2E+2¬2.3e-3­3.4E+4®4.5e-5¯5.6E+6°6.7e-7±7.8E+8²8.9e-9³9.0E+0´1.1e-1µ2.2E+2¶3.3e-3·4.4E+4¸5.5e-5¹6.6E+6º7.7e-7»8.8E+8¼9.9e-9½1.0E+0¾2.1e-1¿3.2E+2À4.3e-3Á5.4E+4Â6.5e-5Ã7.6E+6Ä8.7e-7Å9.8E+8Æ1.9e-9Ç2.0E+0È3.1e-1É4.2E+2Ê5.3e-3Ë6.4E+4Ì7.5e-5Í8.6E+6Î9.7e-7Ï1.8E+8Ð2.9e-9Ñ3.0E+0Ò4.1e-1Ó5.2E+2Ô6.3e-3Õ7.4E+4Ö8.5e-5×9.6E+6Ø1.7e-7Ù2.8E+8Ú3.9e-9Û4.0E+0Ü5.1e-1Ý6.2E+2Þ7.3e-3ß8.4E+4à9.5e-5á1.6E+6â2.7e-7ã3.8E+8ä4.9e-9å5.0E+0æ6.1e-1ç7.2E+2è8.3e-3é9.4E+4ê1.5e-5ë2.6E+6ì3.7e-7í4.8E+8î5.9e-9ï6.0E+0ð7.1e-1ñ8.2E+2ò9.3e-3ó1.4E+4ô2.5e-5õ3.6E+6ö4.7e-7÷5.8E+8ø6.9e-9ù7.0E+0ú8.1e-1û9.2E+2ü1.3e-3ý2.4E+4þ3.5e-5ÿ1A2B3C4D5F6G7H8I9J1K 2L +3M 4N 5O 6P7Q8R9S1T2U3V4W5X6Y7Z8_9a1b2c3d4f5g6h 7i!8j"9k#1l$2m%3n&4o'5p(6q)7r*8s+9t,1u-2v.3w/4x:5y;6z<7A=8B>9C?1D@2F[3G\4H]5I^6J`7K{8L|9M}1N~2O3P€4Q5R‚6Sƒ7T„8U…9V†1W‡2Xˆ3Y‰4ZŠ5_‹6aŒ7b8cŽ9d1f2g‘3h’4i“5j”6k•7l–8m—9n˜1o™2pš3q›4rœ5s6tž7uŸ8v 9w¡1x¢2y£3z¤4A¥5B¦6C§7D¨8F©9Gª1H«2I¬3J­4K®5L¯6M°7N±8O²9P³1Q´2Rµ3S¶4T·5U¸6V¹7Wº8X»9Y¼1Z½2_¾3a¿4bÀ5cÁ6dÂ7fÃ8gÄ9hÅ1iÆ2jÇ3kÈ4lÉ5mÊ6nË7oÌ8pÍ9qÎ1rÏ2sÐ3tÑ4uÒ5vÓ6wÔ7xÕ8yÖ9z×1AØ2BÙ3CÚ4DÛ5FÜ6GÝ7HÞ8Iß9Jà1Ká2Lâ3Mã4Nä5Oå6Pæ7Qç8Rè9Sé1Tê2Uë3Vì4Wí5Xî6Yï7Zð8_ñ9aò1bó2cô3dõ4fö5g÷6hø7iù8jú9kû1lü2mý3nþ4oÿ1EA2eB3EC4eD5EE6eF7EG8eH9EI1eJ 2EK +3eL 4EM 5eN 6EO7eP8EQ9eR1ES2eT3EU4eV5EW6eX7EY8eZ9E_1ea2Eb3ec4Ed5ee6Ef 7eg!8Eh"9ei#1Ej$2ek%3El&4em'5En(6eo)7Ep*8eq+9Er,1es-2Et.3eu/4Ev:5ew;6Ex<7ey=8Ez>9eA?1EB@2eC[3ED\4eE]5EF^6eG`7EH{8eI|9EJ}1eK~2EL3eM€4EN5eO‚6EPƒ7eQ„8ER…9eS†1ET‡2eUˆ3EV‰4eWŠ5EX‹6eYŒ7EZ8e_Ž9Ea1eb2Ec‘3ed’4Ee“5ef”6Eg•7eh–8Ei—9ej˜1Ek™2elš3Em›4enœ5Eo6epž7EqŸ8er 9Es¡1et¢2Eu£3ev¤4Ew¥5ex¦6Ey§7ez¨8EA©9eBª1EC«2eD¬3EE­4eF®5EG¯6eH°7EI±8eJ²9EK³1eL´2EMµ3eN¶4EO·5eP¸6EQ¹7eRº8ES»9eT¼1EU½2eV¾3EW¿4eXÀ5EYÁ6eZÂ7E_Ã8eaÄ9EbÅ1ecÆ2EdÇ3eeÈ4EfÉ5egÊ6EhË7eiÌ8EjÍ9ekÎ1ElÏ2emÐ3EnÑ4eoÒ5EpÓ6eqÔ7ErÕ8esÖ9Et×1euØ2EvÙ3ewÚ4ExÛ5eyÜ6EzÝ7eAÞ8EBß9eCà1EDá2eEâ3EFã4eGä5EHå6eIæ7EJç8eKè9ELé1eMê2ENë3eOì4EPí5eQî6ERï7eSð8ETñ9eUò1EVó2eWô3EXõ4eYö5EZ÷6e_ø7Eaù8ebú9Ecû1edü2Eeý3efþ4Egÿ1234567891 2 +3 4 5 6789123456789123456 7!8"9#1$2%3&4'5(6)7*8+9,1-2/3:4;5<6=7>8?9@1[2\3]4^5`6{7|8}9~12€34‚5ƒ6„7…8†9‡1ˆ2‰3Š4‹5Œ67Ž891‘2’3“4”5•6–7—8˜9™1š2›3œ45ž6Ÿ7 8¡9¢1£2¤3¥4¦5§6¨7©8ª9«1¬2­3®4¯5°6±7²8³9´1µ2¶3·4¸5¹6º7»8¼9½1¾2¿3À4Á5Â6Ã7Ä8Å9Æ1Ç2È3É4Ê5Ë6Ì7Í8Î9Ï1Ð2Ñ3Ò4Ó5Ô6Õ7Ö8×9Ø1Ù2Ú3Û4Ü5Ý6Þ7ß8à9á1â2ã3ä4å5æ6ç7è8é9ê1ë2ì3í4î5ï6ð7ñ8ò9ó1ô2õ3ö4÷5ø6ù7ú8û9ü1ý2þ3ÿ:=A0B1C2D3E4F5G6H7I8J9 KA LB MC ND OEPFQGRHSITJUKVLWMXNYOZP_QaRbScTdUeVgW hX!iY"jZ#k_$la%mb&oc'pd(qe)rf*sg+uh,vi-wj.xk/yl:zm;AnDq?Er@Fs[Gt\Hu]Iv^Jw`Kx{Ly|Mz}N0~O1P2€Q3R4‚S5ƒT6„U7…V8†W9‡XAˆYB‰ZCŠ_D‹aEŒbFcGŽdHeIgJ‘hK’iL“jM”kN•lO–mP—oQ˜pR™qSšrT›sUœuVvWžwXŸxY yZ¡z_¢Aa£Bb¤Cc¥Dd¦Ee§Ff¨Gg©HhªIi«Jj¬Kk­Ll®Mm¯Nn°Oo±Pp²Qq³Rr´SsµTt¶Uu·Vv¸Ww¹XxºYy»Zz¼_0½a1¾b2¿c3Àd4Áe5Âg6Ãh7Äi8Åj9ÆkAÇlBÈmCÉoDÊpEËqFÌrGÍsHÎuIÏvJÐwKÑxLÒyMÓzNÔAOÕBPÖCQ×DRØESÙFTÚGUÛHVÜIWÝJXÞKYßLZàM_áNaâObãPcäQdåReæSfçTgèUhéViêWjëXkìYlíZmî_nïaoðbpñcqòdróesôgtõhuöiv÷jwøkxùlyúmzûo0üp1ýq2þr3ÿABCDEFGHIJ K L M N OPQRSTUVWXYZ_abcdeg h!i"j#k$l%m&o'p(q)r*s+u,v-w.x/y:z;AD?E@F[G\H]I^J`K{L|M}N~OP€QR‚SƒT„U…V†W‡XˆY‰ZŠ_‹aŒbcŽdeg‘h’i“j”k•l–m—o˜p™qšr›sœuvžwŸx y¡z¢A£B¤C¥D¦E§F¨G©HªI«J¬K­L®M¯N°O±P²Q³R´SµT¶U·V¸W¹XºY»Z¼_½a¾b¿cÀdÁeÂgÃhÄiÅjÆkÇlÈmÉoÊpËqÌrÍsÎuÏvÐwÑxÒyÓzÔAÕBÖC×DØEÙFÚGÛHÜIÝJÞKßLàMáNâOãPäQåRæSçTèUéVêWëXìYíZî_ïaðbñcòdóeôgõhöi÷jøkùlúmûoüpýqþrÿ[]f0f1f2f3f4f5f6f7f8f9 fA fB fC fD fEfFfGfHfIfJfKfLfMfNfOfPfQfRfSfTfUfVfW fX!fY"fZ#f_$fb%fc&fd'fe(ff)fg*fh+fi,fj-fk.fl/fm:fn;fofr?fs@ft[fu\fv]fw^fx`fy{fz|f0}f1~f2f3€f4f5‚f6ƒf7„f8…f9†fA‡fBˆfC‰fDŠfE‹fFŒfGfHŽfIfJfK‘fL’fM“fN”fO•fP–fQ—fR˜fS™fTšfU›fVœfWfXžfYŸfZ f_¡fb¢fc£fd¤fe¥ff¦fg§fh¨fi©fjªfk«fl¬fm­fn®fo¯fp°fq±fr²fs³ft´fuµfv¶fw·fx¸fy¹fzºf0»f1¼f2½f3¾f4¿f5Àf6Áf7Âf8Ãf9ÄfAÅfBÆfCÇfDÈfEÉfFÊfGËfHÌfIÍfJÎfKÏfLÐfMÑfNÒfOÓfPÔfQÕfRÖfS×fTØfUÙfVÚfWÛfXÜfYÝfZÞf_ßfbàfcáfdâfeãffäfgåfhæfiçfjèfkéflêfmëfnìfoífpîfqïfrðfsñftòfuófvôfwõfxöfy÷fzøf0ùf1úf2ûf3üf4ýf5þf6ÿfa0fa1fa2fa3fa4fa5fa6fa7fa8fa9 faA @@ -2873,7 +2683,7 @@ trueB trueC trueD trueEtrueFtrueGtrueHtrueItrueJtrueKtrueLtrueMtrueNtr true true true truetruetruetruetruetruetruetruetruetruetruetruetruetruetruetruetruetruetrue true!true"true#true$true%true&true'true(true)true*true+true,true-true.true/true:true;truetrue?true@true[true\true]true^true`true{true|true}true~truetrue€truetrue‚trueƒtrue„true…true†true‡trueˆtrue‰trueŠtrue‹trueŒtruetrueŽtruetruetrue‘true’true“true”true•true–true—true˜true™trueštrue›trueœtruetruežtrueŸtrue true¡true¢true£true¤true¥true¦true§true¨true©trueªtrue«true¬true­true®true¯true°true±true²true³true´trueµtrue¶true·true¸true¹trueºtrue»true¼true½true¾true¿trueÀtrueÁtrueÂtrueÃtrueÄtrueÅtrueÆtrueÇtrueÈtrueÉtrueÊtrueËtrueÌtrueÍtrueÎtrueÏtrueÐtrueÑtrueÒtrueÓtrueÔtrueÕtrueÖtrue×trueØtrueÙtrueÚtrueÛtrueÜtrueÝtrueÞtrueßtrueàtrueátrueâtrueãtrueätrueåtrueætrueçtrueètrueétrueêtrueëtrueìtrueítrueîtrueïtrueðtrueñtrueòtrueótrueôtrueõtrueötrue÷trueøtrueùtrueútrueûtrueütrueýtrueþtrueÿtrutrutrutrutrutrutrutrutrutru tru tru tru tru trutrutrutrutrutrutrutrutrutrutrutrutrutrutrutrutrutrutru tru!tru"tru#tru$tru%tru&tru'tru(tru)tru*tru+tru,tru-tru.tru/tru:tru;trutru?tru@tru[tru\tru]tru^tru`tru{tru|tru}tru~trutru€trutru‚truƒtru„tru…tru†tru‡truˆtru‰truŠtru‹truŒtrutruŽtrutrutru‘tru’tru“tru”tru•tru–tru—tru˜tru™truštru›truœtrutružtruŸtru tru¡tru¢tru£tru¤tru¥tru¦tru§tru¨tru©truªtru«tru¬tru­tru®tru¯tru°tru±tru²tru³tru´truµtru¶tru·tru¸tru¹truºtru»tru¼tru½tru¾tru¿truÀtruÁtruÂtruÃtruÄtruÅtruÆtruÇtruÈtruÉtruÊtruËtruÌtruÍtruÎtruÏtruÐtruÑtruÒtruÓtruÔtruÕtruÖtru×truØtruÙtruÚtruÛtruÜtruÝtruÞtrußtruàtruátruâtruãtruätruåtruætruçtruètruétruêtruëtruìtruítruîtruïtruðtruñtruòtruótruôtruõtruötru÷truøtruùtruútruûtruütruýtruþtruÿtrtrtrtrtrtrtrtrtrtr tr tr tr tr trtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtrtr tr!tr"tr#tr$tr%tr&tr'tr(tr)tr*tr+tr,tr-tr.tr/tr:tr;trtr?tr@tr[tr\tr]tr^tr`tr{tr|tr}tr~trtr€trtr‚trƒtr„tr…tr†tr‡trˆtr‰trŠtr‹trŒtrtrŽtrtrtr‘tr’tr“tr”tr•tr–tr—tr˜tr™trštr›trœtrtržtrŸtr tr¡tr¢tr£tr¤tr¥tr¦tr§tr¨tr©trªtr«tr¬tr­tr®tr¯tr°tr±tr²tr³tr´trµtr¶tr·tr¸tr¹trºtr»tr¼tr½tr¾tr¿trÀtrÁtrÂtrÃtrÄtrÅtrÆtrÇtrÈtrÉtrÊtrËtrÌtrÍtrÎtrÏtrÐtrÑtrÒtrÓtrÔtrÕtrÖtr×trØtrÙtrÚtrÛtrÜtrÝtrÞtrßtràtrátrâtrãträtråtrætrçtrètrétrêtrëtrìtrítrîtrïtrðtrñtròtrótrôtrõtrötr÷trøtrùtrútrûtrütrýtrþtrÿtttttttttt t -t t t ttttttttttttttttttt t!t"t#t$t%t&t't(t)t*t+t,t-t.t/t:t;tt?t@t[t\t]t^t`t{t|t}t~tt€tt‚tƒt„t…t†t‡tˆt‰tŠt‹tŒttŽttt‘t’t“t”t•t–t—t˜t™tšt›tœttžtŸt t¡t¢t£t¤t¥t¦t§t¨t©tªt«t¬t­t®t¯t°t±t²t³t´tµt¶t·t¸t¹tºt»t¼t½t¾t¿tÀtÁtÂtÃtÄtÅtÆtÇtÈtÉtÊtËtÌtÍtÎtÏtÐtÑtÒtÓtÔtÕtÖt×tØtÙtÚtÛtÜtÝtÞtßtàtátâtãtätåtætçtètétêtëtìtítîtïtðtñtòtótôtõtöt÷tøtùtútûtütýtþtÿ{}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           +t t t ttttttttttttttttttt t!t"t#t$t%t&t't(t)t*t+t,t-t.t/t:t;tt?t@t[t\t]t^t`t{t|t}t~tt€tt‚tƒt„t…t†t‡tˆt‰tŠt‹tŒttŽttt‘t’t“t”t•t–t—t˜t™tšt›tœttžtŸt t¡t¢t£t¤t¥t¦t§t¨t©tªt«t¬t­t®t¯t°t±t²t³t´tµt¶t·t¸t¹tºt»t¼t½t¾t¿tÀtÁtÂtÃtÄtÅtÆtÇtÈtÉtÊtËtÌtÍtÎtÏtÐtÑtÒtÓtÔtÕtÖt×tØtÙtÚtÛtÜtÝtÞtßtàtátâtãtätåtætçtètétêtëtìtítîtïtðtñtòtótôtõtöt÷tøtùtútûtütýtþtÿ{}                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              @@ -4816,10 +4626,7 @@ t t t ttttttttttttttttttt t!t"t#t$t%t&t't(t)t*t+t,t-t.t/t:t;t<    -                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          "\"\" \ - - - " \ "\"\"\"\"\"\ "!!!\###$$$"%%%\&&&'''"(((\)))***"+++\,,,---"...\///000"111\222333"444\555666"777\888999":::\;;;<<<"===\>>>???"@@@\AAABBB"CCC\DDDEEE"FFF\GGGHHH"III\JJJKKK"LLL\MMMNNN"OOO\PPPQQQ"RRR\SSSTTT"UUU\VVVWWW"XXX\YYYZZZ"[[[\]]]^^^"___\```aaa"bbb\cccddd"eee\fffggg"hhh\iiijjj"kkk\lllmmm"nnn\oooppp"qqq\rrrsss"ttt\uuuvvv"www\xxxyyy"zzz\{{{|||"}}}\~~~"€€€\‚‚‚"ƒƒƒ\„„„………"†††\‡‡‡ˆˆˆ"‰‰‰\ŠŠŠ‹‹‹"ŒŒŒ\ŽŽŽ"\‘‘‘"’’’\“““”””"•••\–––———"˜˜˜\™™™ššš"›››\œœœ"žžž\ŸŸŸ   "¡¡¡\¢¢¢£££"¤¤¤\¥¥¥¦¦¦"§§§\¨¨¨©©©"ªªª\«««¬¬¬"­­­\®®®¯¯¯"°°°\±±±²²²"³³³\´´´µµµ"¶¶¶\···¸¸¸"¹¹¹\ººº»»»"¼¼¼\½½½¾¾¾"¿¿¿\ÀÀÀÁÁÁ"ÂÂÂ\ÃÃÃÄÄÄ"ÅÅÅ\ÆÆÆÇÇÇ"ÈÈÈ\ÉÉÉÊÊÊ"ËËË\ÌÌÌÍÍÍ"ÎÎÎ\ÏÏÏÐÐÐ"ÑÑÑ\ÒÒÒÓÓÓ"ÔÔÔ\ÕÕÕÖÖÖ"×××\ØØØÙÙÙ"ÚÚÚ\ÛÛÛÜÜÜ"ÝÝÝ\ÞÞÞßßß"ààà\áááâââ"ããã\äääååå"æææ\çççèèè"ééé\êêêëëë"ììì\íííîîî"ïïï\ðððñññ"òòò\óóóôôô"õõõ\ööö÷÷÷"øøø\ùùùúúú"ûûû\üüüýýý"þþþ\ÿÿÿ"\"\" \ +                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   "\"\" \ " \ "\"\"\"\"\"\ "!!\##$$"%%\&&''"((\))**"++\,,--"..\//00"11\2233"44\5566"77\8899"::\;;<<"==\>>??"@@\AABB"CC\DDEE"FF\GGHH"II\JJKK"LL\MMNN"OO\PPQQ"RR\SSTT"UU\VVWW"XX\YYZZ"[[\]]^^"__\``aa"bb\ccdd"ee\ffgg"hh\iijj"kk\llmm"nn\oopp"qq\rrss"tt\uuvv"ww\xxyy"zz\{{||"}}\~~"€€\‚‚"ƒƒ\„„……"††\‡‡ˆˆ"‰‰\ŠŠ‹‹"ŒŒ\ŽŽ"\‘‘"’’\““””"••\––——"˜˜\™™šš"››\œœ"žž\ŸŸ  "¡¡\¢¢££"¤¤\¥¥¦¦"§§\¨¨©©"ªª\««¬¬"­­\®®¯¯"°°\±±²²"³³\´´µµ"¶¶\··¸¸"¹¹\ºº»»"¼¼\½½¾¾"¿¿\ÀÀÁÁ"ÂÂ\ÃÃÄÄ"ÅÅ\ÆÆÇÇ"ÈÈ\ÉÉÊÊ"ËË\ÌÌÍÍ"ÎÎ\ÏÏÐÐ"ÑÑ\ÒÒÓÓ"ÔÔ\ÕÕÖÖ"××\ØØÙÙ"ÚÚ\ÛÛÜÜ"ÝÝ\ÞÞßß"àà\ááââ"ãã\ääåå"ææ\ççèè"éé\êêëë"ìì\ííîî"ïï\ððññ"òò\óóôô"õõ\öö÷÷"øø\ùùúú"ûû\üüýý"þþ\ÿÿ"\"\" \ " \ "\"\"\"\"\"\ "!\#$"%\&'"(\)*"+\,-".\/0"1\23"4\56"7\89":\;<"=\>?"@\AB"C\DE"F\GH"I\JK"L\MN"O\PQ"R\ST"U\VW"X\YZ"[\]^"_\`a"b\cd"e\fg"h\ij"k\lm"n\op"q\rs"t\uv"w\xy"z\{|"}\~"€\‚"ƒ\„…"†\‡ˆ"‰\Š‹"Œ\Ž"\‘"’\“”"•\–—"˜\™š"›\œ"ž\Ÿ "¡\¢£"¤\¥¦"§\¨©"ª\«¬"­\®¯"°\±²"³\´µ"¶\·¸"¹\º»"¼\½¾"¿\ÀÁ"Â\ÃÄ"Å\ÆÇ"È\ÉÊ"Ë\ÌÍ"Î\ÏÐ"Ñ\ÒÓ"Ô\ÕÖ"×\ØÙ"Ú\ÛÜ"Ý\Þß"à\áâ"ã\äå"æ\çè"é\êë"ì\íî"ï\ðñ"ò\óô"õ\ö÷"ø\ùú"û\üý"þ\ÿ"\"\/\\\b\f\n\r\t\u0000\u1111\u2222\u3333\u4444\u5555\u6666\u7777\u8888\u9999\uAAAA\uBBBB\uCCCC\uDDDD\uEEEE\uFFFF\uaaaa\ubbbb\ucccc\udddd\ueeee\uffff\u000\u111\u222\u333\u444\u555\u666\u777\u888\u999 \uAAA @@ -4827,6 +4634,6 @@ t t t ttttttttttttttttttt t!t"t#t$t%t&t't(t)t*t+t,t-t.t/t:t;t< \uBB \uCC \uDD \uEE\uFF\uaa\ubb\ucc\udd\uee\uff\u00\u11\u22\u33\u44\u55\u66\u77\u88\u99\uAA \uBB!\uCC"\uDD#\uEE$\uFF%\uaa&\ubb'\ucc(\udd)\uee*\uff+\u00,\u11-\u22.\u33/\u44:\u55;\u66<\u77=\u88>\u99?\uAA@\uBBG\uCCH\uDDI\uEEJ\uFFK\uaaL\ubbM\uccN\uddO\ueeP\uffQ\u00R\u11S\u22T\u33U\u44V\u55W\u66X\u77Y\u88Z\u99[\uAA\\uBB]\uCC^\uDD_\uEE`\uFFg\uaah\ubbi\uccj\uddk\ueel\uffm\u00n\u11o\u22p\u33q\u44r\u55s\u66t\u77u\u88v\u99w\uAAx\uBBy\uCCz\uDD{\uEE|\uFF}\uaa~\ubb\ucc€\udd\uee‚\uffƒ\u00„\u11…\u22†\u33‡\u44ˆ\u55‰\u66Š\u77‹\u88Œ\u99\uAAŽ\uBB\uCC\uDD‘\uEE’\uFF“\uaa”\ubb•\ucc–\udd—\uee˜\uff™\u00š\u11›\u22œ\u33\u44ž\u55Ÿ\u66 \u77¡\u88¢\u99£\uAA¤\uBB¥\uCC¦\uDD§\uEE¨\uFF©\uaaª\ubb«\ucc¬\udd­\uee®\uff¯\u00°\u11±\u22²\u33³\u44´\u55µ\u66¶\u77·\u88¸\u99¹\uAAº\uBB»\uCC¼\uDD½\uEE¾\uFF¿\uaaÀ\ubbÁ\uccÂ\uddÃ\ueeÄ\uffÅ\u00Æ\u11Ç\u22È\u33É\u44Ê\u55Ë\u66Ì\u77Í\u88Î\u99Ï\uAAÐ\uBBÑ\uCCÒ\uDDÓ\uEEÔ\uFFÕ\uaaÖ\ubb×\uccØ\uddÙ\ueeÚ\uffÛ\u00Ü\u11Ý\u22Þ\u33ß\u44à\u55á\u66â\u77ã\u88ä\u99å\uAAæ\uBBç\uCCè\uDDé\uEEê\uFFë\uaaì\ubbí\uccî\uddï\ueeð\uffñ\u00ò\u11ó\u22ô\u33õ\u44ö\u55÷\u66ø\u77ù\u88ú\u99û\uAAü\uBBý\uCCþ\uDDÿ\u0\u1\u2\u3\u4\u5\u6\u7\u8\u9 \uA \uB \uC \uD \uE\uF\ua\ub\uc\ud\ue\uf\u0\u1\u2\u3\u4\u5\u6\u7\u8\u9\uA \uB!\uC"\uD#\uE$\uF%\ua&\ub'\uc(\ud)\ue*\uf+\u0,\u1-\u2.\u3/\u4:\u5;\u6<\u7=\u8>\u9?\uA@\uBG\uCH\uDI\uEJ\uFK\uaL\ubM\ucN\udO\ueP\ufQ\u0R\u1S\u2T\u3U\u4V\u5W\u6X\u7Y\u8Z\u9[\uA\\uB]\uC^\uD_\uE`\uFg\uah\ubi\ucj\udk\uel\ufm\u0n\u1o\u2p\u3q\u4r\u5s\u6t\u7u\u8v\u9w\uAx\uBy\uCz\uD{\uE|\uF}\ua~\ub\uc€\ud\ue‚\ufƒ\u0„\u1…\u2†\u3‡\u4ˆ\u5‰\u6Š\u7‹\u8Œ\u9\uAŽ\uB\uC\uD‘\uE’\uF“\ua”\ub•\uc–\ud—\ue˜\uf™\u0š\u1›\u2œ\u3\u4ž\u5Ÿ\u6 \u7¡\u8¢\u9£\uA¤\uB¥\uC¦\uD§\uE¨\uF©\uaª\ub«\uc¬\ud­\ue®\uf¯\u0°\u1±\u2²\u3³\u4´\u5µ\u6¶\u7·\u8¸\u9¹\uAº\uB»\uC¼\uD½\uE¾\uF¿\uaÀ\ubÁ\ucÂ\udÃ\ueÄ\ufÅ\u0Æ\u1Ç\u2È\u3É\u4Ê\u5Ë\u6Ì\u7Í\u8Î\u9Ï\uAÐ\uBÑ\uCÒ\uDÓ\uEÔ\uFÕ\uaÖ\ub×\ucØ\udÙ\ueÚ\ufÛ\u0Ü\u1Ý\u2Þ\u3ß\u4à\u5á\u6â\u7ã\u8ä\u9å\uAæ\uBç\uCè\uDé\uEê\uFë\uaì\ubí\ucî\udï\ueð\ufñ\u0ò\u1ó\u2ô\u3õ\u4ö\u5÷\u6ø\u7ù\u8ú\u9û\uAü\uBý\uCþ\uDÿ\u\u\u\u\u\u\u\u\u\u \u \u \u \u \u\u\u\u\u\u\u\u\u\u\u\u\u\u\u\u\u\u\u \u!\u"\u#\u$\u%\u&\u'\u(\u)\u*\u+\u,\u-\u.\u/\u:\u;\u<\u=\u>\u?\u@\uG\uH\uI\uJ\uK\uL\uM\uN\uO\uP\uQ\uR\uS\uT\uU\uV\uW\uX\uY\uZ\u[\u\\u]\u^\u_\u`\ug\uh\ui\uj\uk\ul\um\un\uo\up\uq\ur\us\ut\uu\uv\uw\ux\uy\uz\u{\u|\u}\u~\u\u€\u\u‚\uƒ\u„\u…\u†\u‡\uˆ\u‰\uŠ\u‹\uŒ\u\uŽ\u\u\u‘\u’\u“\u”\u•\u–\u—\u˜\u™\uš\u›\uœ\u\už\uŸ\u \u¡\u¢\u£\u¤\u¥\u¦\u§\u¨\u©\uª\u«\u¬\u­\u®\u¯\u°\u±\u²\u³\u´\uµ\u¶\u·\u¸\u¹\uº\u»\u¼\u½\u¾\u¿\uÀ\uÁ\uÂ\uÃ\uÄ\uÅ\uÆ\uÇ\uÈ\uÉ\uÊ\uË\uÌ\uÍ\uÎ\uÏ\uÐ\uÑ\uÒ\uÓ\uÔ\uÕ\uÖ\u×\uØ\uÙ\uÚ\uÛ\uÜ\uÝ\uÞ\uß\uà\uá\uâ\uã\uä\uå\uæ\uç\uè\ué\uê\uë\uì\uí\uî\uï\uð\uñ\uò\uó\uô\uõ\uö\u÷\uø\uù\uú\uû\uü\uý\uþ\uÿ\\\\\\\\\\ \ -\ \ \ \\\\\\\\\\\\\\\\\\\ \!\#\$\%\&\'\(\)\*\+\,\-\.\0\1\2\3\4\5\6\7\8\9\:\;\<\=\>\?\@\A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z\[\]\^\_\`\a\c\d\e\g\h\i\j\k\l\m\o\p\q\s\v\w\x\y\z\{\|\}\~\\€\\‚\ƒ\„\…\†\‡\ˆ\‰\Š\‹\Œ\\Ž\\\‘\’\“\”\•\–\—\˜\™\š\›\œ\\ž\Ÿ\ \¡\¢\£\¤\¥\¦\§\¨\©\ª\«\¬\­\®\¯\°\±\²\³\´\µ\¶\·\¸\¹\º\»\¼\½\¾\¿\À\Á\Â\Ã\Ä\Å\Æ\Ç\È\É\Ê\Ë\Ì\Í\Î\Ï\Ð\Ñ\Ò\Ó\Ô\Õ\Ö\×\Ø\Ù\Ú\Û\Ü\Ý\Þ\ß\à\á\â\ã\ä\å\æ\ç\è\é\ê\ë\ì\í\î\ï\ð\ñ\ò\ó\ô\õ\ö\÷\ø\ù\ú\û\ü\ý\þ\ÿre2c: warning: line 490: column 26: escape has no effect: '\/' [-Wuseless-escape] +\ \ \ \\\\\\\\\\\\\\\\\\\ \!\#\$\%\&\'\(\)\*\+\,\-\.\0\1\2\3\4\5\6\7\8\9\:\;\<\=\>\?\@\A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z\[\]\^\_\`\a\c\d\e\g\h\i\j\k\l\m\o\p\q\s\v\w\x\y\z\{\|\}\~\\€\\‚\ƒ\„\…\†\‡\ˆ\‰\Š\‹\Œ\\Ž\\\‘\’\“\”\•\–\—\˜\™\š\›\œ\\ž\Ÿ\ \¡\¢\£\¤\¥\¦\§\¨\©\ª\«\¬\­\®\¯\°\±\²\³\´\µ\¶\·\¸\¹\º\»\¼\½\¾\¿\À\Á\Â\Ã\Ä\Å\Æ\Ç\È\É\Ê\Ë\Ì\Í\Î\Ï\Ð\Ñ\Ò\Ó\Ô\Õ\Ö\×\Ø\Ù\Ú\Û\Ü\Ý\Þ\ß\à\á\â\ã\ä\å\æ\ç\è\é\ê\ë\ì\í\î\ï\ð\ñ\ò\ó\ô\õ\ö\÷\ø\ù\ú\û\ü\ý\þ\ÿre2c: warning: line 490: column 26: escape has no effect: '\/' [-Wuseless-escape] re2c: warning: line 490: column 50: escape has no effect: '\/' [-Wuseless-escape] re2c: warning: line 490: column 77: escape has no effect: '\/' [-Wuseless-escape] diff --git a/test/main.b.c b/test/main.b.c index 14a852f..d737f70 100644 --- a/test/main.b.c +++ b/test/main.b.c @@ -1,7 +1,8 @@ /* Generated by re2c */ #line 1 "main.b.re" /* re2c lesson 001_upn_calculator, main.b.re, (c) M. Boerger, L. Allan 2006 */ -#line 43 "main.b.re" +#line 42 "main.b.re" + #define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers @@ -51,7 +52,7 @@ int ScanFullSpeed(char *pzStrToScan, size_t lenStrToScan) for(;;) { -#line 55 "main.b.c" +#line 56 "main.b.c" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -108,23 +109,23 @@ yy2: ++YYCURSOR; #line 97 "main.b.re" { return 0; } -#line 112 "main.b.c" +#line 113 "main.b.c" yy4: ++YYCURSOR; yy5: #line 98 "main.b.re" { return 1; } -#line 118 "main.b.c" +#line 119 "main.b.c" yy6: ++YYCURSOR; #line 95 "main.b.re" { continue; } -#line 123 "main.b.c" +#line 124 "main.b.c" yy8: ++YYCURSOR; #line 96 "main.b.re" { continue; } -#line 128 "main.b.c" +#line 129 "main.b.c" yy10: yych = *++YYCURSOR; if (yych <= '/') goto yy5; @@ -139,7 +140,7 @@ yy11: } #line 93 "main.b.re" { continue; } -#line 143 "main.b.c" +#line 144 "main.b.c" yy14: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -149,7 +150,7 @@ yy14: yy16: #line 94 "main.b.re" { continue; } -#line 153 "main.b.c" +#line 154 "main.b.c" } #line 99 "main.b.re" @@ -172,7 +173,7 @@ int scan(char *pzStrToScan, size_t lenStrToScan) for(;;) { -#line 176 "main.b.c" +#line 177 "main.b.c" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -229,23 +230,23 @@ yy19: ++YYCURSOR; #line 124 "main.b.re" { printf("EOF\n"); return 0; } -#line 233 "main.b.c" +#line 234 "main.b.c" yy21: ++YYCURSOR; yy22: #line 125 "main.b.re" { printf("ERR\n"); strcat(gTestBuf, "ERR "); return 1; } -#line 239 "main.b.c" +#line 240 "main.b.c" yy23: ++YYCURSOR; #line 122 "main.b.re" { printf("+\n"); strcat(gTestBuf, "+ "); continue; } -#line 244 "main.b.c" +#line 245 "main.b.c" yy25: ++YYCURSOR; #line 123 "main.b.re" { printf("-\n"); strcat(gTestBuf, "- "); continue; } -#line 249 "main.b.c" +#line 250 "main.b.c" yy27: yych = *++YYCURSOR; if (yych <= '/') goto yy22; @@ -260,7 +261,7 @@ yy28: } #line 120 "main.b.re" { printf("Num\n"); strcat(gTestBuf, "Num "); continue; } -#line 264 "main.b.c" +#line 265 "main.b.c" yy31: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -270,7 +271,7 @@ yy31: yy33: #line 121 "main.b.re" { printf("Oct\n"); strcat(gTestBuf, "Oct "); continue; } -#line 274 "main.b.c" +#line 275 "main.b.c" } #line 126 "main.b.re" diff --git a/test/modula.c b/test/modula.c index 89b6780..a0d5572 100644 --- a/test/modula.c +++ b/test/modula.c @@ -218,8 +218,8 @@ yy14: default: goto yy88; } yy15: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '*': goto yy89; default: goto yy16; } @@ -253,8 +253,8 @@ yy25: {RETURN(14);} #line 255 "modula.c" yy27: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '.': goto yy91; default: goto yy28; } @@ -272,7 +272,6 @@ yy31: YYMARKER = ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4); yych = *YYCURSOR; - YYCTXMARKER = YYCURSOR; switch (yych) { case '.': goto yy93; case '0': @@ -297,13 +296,12 @@ yy31: yy33: #line 70 "modula.re" {RETURN(1);} -#line 301 "modula.c" +#line 300 "modula.c" yy34: yyaccept = 1; YYMARKER = ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4); yych = *YYCURSOR; - YYCTXMARKER = YYCURSOR; switch (yych) { case '.': goto yy93; case '0': @@ -326,23 +324,23 @@ yy34: default: goto yy33; } yy36: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy103; default: goto yy37; } yy37: #line 89 "modula.re" {RETURN(18);} -#line 338 "modula.c" +#line 336 "modula.c" yy38: ++YYCURSOR; #line 91 "modula.re" {RETURN(20);} -#line 343 "modula.c" +#line 341 "modula.c" yy40: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy105; case '>': goto yy107; default: goto yy41; @@ -350,25 +348,25 @@ yy40: yy41: #line 92 "modula.re" {RETURN(21);} -#line 354 "modula.c" +#line 352 "modula.c" yy42: ++YYCURSOR; #line 95 "modula.re" {RETURN(24);} -#line 359 "modula.c" +#line 357 "modula.c" yy44: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '=': goto yy109; default: goto yy45; } yy45: #line 96 "modula.re" {RETURN(25);} -#line 369 "modula.c" +#line 367 "modula.c" yy46: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 'N': goto yy111; case 'R': goto yy112; default: goto yy54; @@ -376,7 +374,7 @@ yy46: yy47: #line 147 "modula.re" {RETURN(74);} -#line 380 "modula.c" +#line 378 "modula.c" yy48: yych = *++YYCURSOR; switch (yych) { @@ -573,37 +571,37 @@ yy68: ++YYCURSOR; #line 98 "modula.re" {RETURN(27);} -#line 577 "modula.c" +#line 575 "modula.c" yy70: ++YYCURSOR; #line 99 "modula.re" {RETURN(28);} -#line 582 "modula.c" +#line 580 "modula.c" yy72: ++YYCURSOR; #line 100 "modula.re" {RETURN(29);} -#line 587 "modula.c" +#line 585 "modula.c" yy74: ++YYCURSOR; #line 101 "modula.re" {RETURN(30);} -#line 592 "modula.c" +#line 590 "modula.c" yy76: ++YYCURSOR; #line 102 "modula.re" {RETURN(31);} -#line 597 "modula.c" +#line 595 "modula.c" yy78: ++YYCURSOR; #line 103 "modula.re" {RETURN(32);} -#line 602 "modula.c" +#line 600 "modula.c" yy80: ++YYCURSOR; #line 104 "modula.re" {RETURN(33);} -#line 607 "modula.c" +#line 605 "modula.c" yy82: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -627,7 +625,7 @@ yy85: ++YYCURSOR; #line 76 "modula.re" {RETURN(6);} -#line 631 "modula.c" +#line 629 "modula.c" yy87: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -642,12 +640,12 @@ yy89: ++YYCURSOR; #line 68 "modula.re" { depth = 1; goto comment; } -#line 646 "modula.c" +#line 644 "modula.c" yy91: ++YYCURSOR; #line 87 "modula.re" {RETURN(16);} -#line 651 "modula.c" +#line 649 "modula.c" yy93: yyaccept = 2; yych = *(YYMARKER = ++YYCURSOR); @@ -658,7 +656,7 @@ yy93: yy94: #line 75 "modula.re" {RETURN(5);} -#line 662 "modula.c" +#line 660 "modula.c" yy95: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -709,7 +707,7 @@ yy97: yy98: #line 72 "modula.re" {RETURN(2);} -#line 713 "modula.c" +#line 711 "modula.c" yy99: yyaccept = 4; yych = *(YYMARKER = ++YYCURSOR); @@ -736,32 +734,32 @@ yy99: yy100: #line 73 "modula.re" {RETURN(3);} -#line 740 "modula.c" +#line 738 "modula.c" yy101: ++YYCURSOR; #line 74 "modula.re" {RETURN(4);} -#line 745 "modula.c" +#line 743 "modula.c" yy103: ++YYCURSOR; #line 90 "modula.re" {RETURN(19);} -#line 750 "modula.c" +#line 748 "modula.c" yy105: ++YYCURSOR; #line 93 "modula.re" {RETURN(22);} -#line 755 "modula.c" +#line 753 "modula.c" yy107: ++YYCURSOR; #line 94 "modula.re" {RETURN(23);} -#line 760 "modula.c" +#line 758 "modula.c" yy109: ++YYCURSOR; #line 97 "modula.re" {RETURN(26);} -#line 765 "modula.c" +#line 763 "modula.c" yy111: yych = *++YYCURSOR; switch (yych) { @@ -781,8 +779,8 @@ yy113: default: goto yy54; } yy114: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -850,7 +848,7 @@ yy114: yy115: #line 109 "modula.re" {RETURN(37);} -#line 854 "modula.c" +#line 852 "modula.c" yy116: yych = *++YYCURSOR; switch (yych) { @@ -876,8 +874,8 @@ yy119: default: goto yy54; } yy120: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -945,7 +943,7 @@ yy120: yy121: #line 114 "modula.re" {RETURN(42);} -#line 949 "modula.c" +#line 947 "modula.c" yy122: yych = *++YYCURSOR; switch (yych) { @@ -978,8 +976,8 @@ yy126: default: goto yy54; } yy127: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1047,7 +1045,7 @@ yy127: yy128: #line 122 "modula.re" {RETURN(50);} -#line 1051 "modula.c" +#line 1049 "modula.c" yy129: yych = *++YYCURSOR; switch (yych) { @@ -1055,8 +1053,8 @@ yy129: default: goto yy54; } yy130: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1124,7 +1122,7 @@ yy130: yy131: #line 125 "modula.re" {RETURN(53);} -#line 1128 "modula.c" +#line 1126 "modula.c" yy132: yych = *++YYCURSOR; switch (yych) { @@ -1144,8 +1142,8 @@ yy134: default: goto yy54; } yy135: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1213,10 +1211,10 @@ yy135: yy136: #line 130 "modula.re" {RETURN(58);} -#line 1217 "modula.c" +#line 1215 "modula.c" yy137: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1284,7 +1282,7 @@ yy137: yy138: #line 131 "modula.re" {RETURN(59);} -#line 1288 "modula.c" +#line 1286 "modula.c" yy139: yych = *++YYCURSOR; switch (yych) { @@ -1324,8 +1322,8 @@ yy144: default: goto yy54; } yy145: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1393,7 +1391,7 @@ yy145: yy146: #line 140 "modula.re" {RETURN(68);} -#line 1397 "modula.c" +#line 1395 "modula.c" yy147: yych = *++YYCURSOR; switch (yych) { @@ -1426,10 +1424,10 @@ yy151: } yy152: ++YYCURSOR; - YYCURSOR = YYCTXMARKER; + YYCURSOR -= 2; #line 71 "modula.re" {RETURN(1);} -#line 1433 "modula.c" +#line 1431 "modula.c" yy154: yyaccept = 2; YYMARKER = ++YYCURSOR; @@ -1468,8 +1466,8 @@ yy156: default: goto yy84; } yy157: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1537,7 +1535,7 @@ yy157: yy158: #line 106 "modula.re" {RETURN(34);} -#line 1541 "modula.c" +#line 1539 "modula.c" yy159: yych = *++YYCURSOR; switch (yych) { @@ -1569,8 +1567,8 @@ yy163: default: goto yy54; } yy164: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1638,7 +1636,7 @@ yy164: yy165: #line 113 "modula.re" {RETURN(41);} -#line 1642 "modula.c" +#line 1640 "modula.c" yy166: yych = *++YYCURSOR; switch (yych) { @@ -1647,8 +1645,8 @@ yy166: default: goto yy54; } yy167: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1716,7 +1714,7 @@ yy167: yy168: #line 117 "modula.re" {RETURN(45);} -#line 1720 "modula.c" +#line 1718 "modula.c" yy169: yych = *++YYCURSOR; switch (yych) { @@ -1730,8 +1728,8 @@ yy170: default: goto yy54; } yy171: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1799,7 +1797,7 @@ yy171: yy172: #line 120 "modula.re" {RETURN(48);} -#line 1803 "modula.c" +#line 1801 "modula.c" yy173: yych = *++YYCURSOR; switch (yych) { @@ -1820,8 +1818,8 @@ yy175: default: goto yy54; } yy176: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1889,10 +1887,10 @@ yy176: yy177: #line 127 "modula.re" {RETURN(55);} -#line 1893 "modula.c" +#line 1891 "modula.c" yy178: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -1960,7 +1958,7 @@ yy178: yy179: #line 129 "modula.re" {RETURN(57);} -#line 1964 "modula.c" +#line 1962 "modula.c" yy180: yych = *++YYCURSOR; switch (yych) { @@ -1998,8 +1996,8 @@ yy185: default: goto yy54; } yy186: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2067,7 +2065,7 @@ yy186: yy187: #line 138 "modula.re" {RETURN(66);} -#line 2071 "modula.c" +#line 2069 "modula.c" yy188: yych = *++YYCURSOR; switch (yych) { @@ -2087,8 +2085,8 @@ yy190: default: goto yy54; } yy191: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2156,7 +2154,7 @@ yy191: yy192: #line 143 "modula.re" {RETURN(71);} -#line 2160 "modula.c" +#line 2158 "modula.c" yy193: yych = *++YYCURSOR; switch (yych) { @@ -2214,8 +2212,8 @@ yy199: default: goto yy54; } yy200: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2283,7 +2281,7 @@ yy200: yy201: #line 110 "modula.re" {RETURN(38);} -#line 2287 "modula.c" +#line 2285 "modula.c" yy202: yych = *++YYCURSOR; switch (yych) { @@ -2297,8 +2295,8 @@ yy203: default: goto yy54; } yy204: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2366,7 +2364,7 @@ yy204: yy205: #line 115 "modula.re" {RETURN(43);} -#line 2370 "modula.c" +#line 2368 "modula.c" yy206: yych = *++YYCURSOR; switch (yych) { @@ -2374,8 +2372,8 @@ yy206: default: goto yy54; } yy207: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2443,7 +2441,7 @@ yy207: yy208: #line 118 "modula.re" {RETURN(46);} -#line 2447 "modula.c" +#line 2445 "modula.c" yy209: yych = *++YYCURSOR; switch (yych) { @@ -2451,8 +2449,8 @@ yy209: default: goto yy54; } yy210: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2520,7 +2518,7 @@ yy210: yy211: #line 121 "modula.re" {RETURN(49);} -#line 2524 "modula.c" +#line 2522 "modula.c" yy212: yych = *++YYCURSOR; switch (yych) { @@ -2534,8 +2532,8 @@ yy213: default: goto yy54; } yy214: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2603,7 +2601,7 @@ yy214: yy215: #line 126 "modula.re" {RETURN(54);} -#line 2607 "modula.c" +#line 2605 "modula.c" yy216: yych = *++YYCURSOR; switch (yych) { @@ -2647,8 +2645,8 @@ yy222: default: goto yy54; } yy223: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2716,10 +2714,10 @@ yy223: yy224: #line 139 "modula.re" {RETURN(67);} -#line 2720 "modula.c" +#line 2718 "modula.c" yy225: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2787,7 +2785,7 @@ yy225: yy226: #line 141 "modula.re" {RETURN(69);} -#line 2791 "modula.c" +#line 2789 "modula.c" yy227: yych = *++YYCURSOR; switch (yych) { @@ -2801,8 +2799,8 @@ yy228: default: goto yy54; } yy229: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2870,10 +2868,10 @@ yy229: yy230: #line 145 "modula.re" {RETURN(73);} -#line 2874 "modula.c" +#line 2872 "modula.c" yy231: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -2941,10 +2939,10 @@ yy231: yy232: #line 107 "modula.re" {RETURN(35);} -#line 2945 "modula.c" +#line 2943 "modula.c" yy233: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3012,10 +3010,10 @@ yy233: yy234: #line 108 "modula.re" {RETURN(36);} -#line 3016 "modula.c" +#line 3014 "modula.c" yy235: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3083,7 +3081,7 @@ yy235: yy236: #line 111 "modula.re" {RETURN(39);} -#line 3087 "modula.c" +#line 3085 "modula.c" yy237: yych = *++YYCURSOR; switch (yych) { @@ -3091,8 +3089,8 @@ yy237: default: goto yy54; } yy238: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3160,7 +3158,7 @@ yy238: yy239: #line 116 "modula.re" {RETURN(44);} -#line 3164 "modula.c" +#line 3162 "modula.c" yy240: yych = *++YYCURSOR; switch (yych) { @@ -3222,8 +3220,8 @@ yy249: default: goto yy54; } yy250: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3291,10 +3289,10 @@ yy250: yy251: #line 142 "modula.re" {RETURN(70);} -#line 3295 "modula.c" +#line 3293 "modula.c" yy252: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3362,7 +3360,7 @@ yy252: yy253: #line 144 "modula.re" {RETURN(72);} -#line 3366 "modula.c" +#line 3364 "modula.c" yy254: yych = *++YYCURSOR; switch (yych) { @@ -3370,8 +3368,8 @@ yy254: default: goto yy54; } yy255: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3439,7 +3437,7 @@ yy255: yy256: #line 119 "modula.re" {RETURN(47);} -#line 3443 "modula.c" +#line 3441 "modula.c" yy257: yych = *++YYCURSOR; switch (yych) { @@ -3447,8 +3445,8 @@ yy257: default: goto yy54; } yy258: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3516,10 +3514,10 @@ yy258: yy259: #line 124 "modula.re" {RETURN(52);} -#line 3520 "modula.c" +#line 3518 "modula.c" yy260: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3587,7 +3585,7 @@ yy260: yy261: #line 128 "modula.re" {RETURN(56);} -#line 3591 "modula.c" +#line 3589 "modula.c" yy262: yych = *++YYCURSOR; switch (yych) { @@ -3607,8 +3605,8 @@ yy264: default: goto yy54; } yy265: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3676,10 +3674,10 @@ yy265: yy266: #line 135 "modula.re" {RETURN(63);} -#line 3680 "modula.c" +#line 3678 "modula.c" yy267: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3747,10 +3745,10 @@ yy267: yy268: #line 136 "modula.re" {RETURN(64);} -#line 3751 "modula.c" +#line 3749 "modula.c" yy269: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3818,7 +3816,7 @@ yy269: yy270: #line 137 "modula.re" {RETURN(65);} -#line 3822 "modula.c" +#line 3820 "modula.c" yy271: yych = *++YYCURSOR; switch (yych) { @@ -3832,8 +3830,8 @@ yy272: default: goto yy54; } yy273: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -3901,7 +3899,7 @@ yy273: yy274: #line 132 "modula.re" {RETURN(60);} -#line 3905 "modula.c" +#line 3903 "modula.c" yy275: yych = *++YYCURSOR; switch (yych) { @@ -3951,8 +3949,8 @@ yy282: default: goto yy54; } yy283: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -4020,10 +4018,10 @@ yy283: yy284: #line 133 "modula.re" {RETURN(61);} -#line 4024 "modula.c" +#line 4022 "modula.c" yy285: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -4091,10 +4089,10 @@ yy285: yy286: #line 134 "modula.re" {RETURN(62);} -#line 4095 "modula.c" +#line 4093 "modula.c" yy287: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -4162,7 +4160,7 @@ yy287: yy288: #line 112 "modula.re" {RETURN(40);} -#line 4166 "modula.c" +#line 4164 "modula.c" yy289: yych = *++YYCURSOR; switch (yych) { @@ -4188,8 +4186,8 @@ yy292: default: goto yy54; } yy293: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -4257,13 +4255,13 @@ yy293: yy294: #line 123 "modula.re" {RETURN(51);} -#line 4261 "modula.c" +#line 4259 "modula.c" } #line 163 "modula.re" comment: -#line 4267 "modula.c" +#line 4265 "modula.c" { YYCTYPE yych; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); @@ -4279,7 +4277,7 @@ yy297: yy298: #line 180 "modula.re" { goto comment; } -#line 4283 "modula.c" +#line 4281 "modula.c" yy299: ++YYCURSOR; #line 175 "modula.re" @@ -4288,7 +4286,7 @@ yy299: s->tok = s->pos = cursor; s->line++; goto comment; } -#line 4292 "modula.c" +#line 4290 "modula.c" yy301: yych = *++YYCURSOR; switch (yych) { @@ -4305,7 +4303,7 @@ yy303: ++YYCURSOR; #line 173 "modula.re" { ++depth; goto comment; } -#line 4309 "modula.c" +#line 4307 "modula.c" yy305: ++YYCURSOR; #line 167 "modula.re" @@ -4315,7 +4313,7 @@ yy305: else goto comment; } -#line 4319 "modula.c" +#line 4317 "modula.c" } #line 181 "modula.re" diff --git a/test/overflow-2.c b/test/overflow-2.c index 6e170e1..3d9ede4 100644 --- a/test/overflow-2.c +++ b/test/overflow-2.c @@ -1 +1 @@ -re2c: error: line 2, column 8219: can't find symbol +re2c: error: line 2: undefined symbol 'x0000_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00040_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00080_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x000C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00100_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00140_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00180_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x001C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00200_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00240_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00280_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x002C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00300_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00340_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00380_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x003C0_1st_KByte_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00400_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00440_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00480_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x004C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00500_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00540_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00580_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x005C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00600_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00640_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00680_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x006C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00700_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00740_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00780_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x007C0_2nd_KByte_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00800_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00840_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00880_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x008C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00900_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00940_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00980_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x009C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00A00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00A40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00A80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00AC0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00B00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00B40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00B80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00BC0_3rd_KByte_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00C00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00C40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00C80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00CC0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00D00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00D40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00D80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00DC0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00E00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00E40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00E80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00EC0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00F00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00F40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00F80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00FC0_4th_KByte_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01000_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01040_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01080_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x010C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01100_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01140_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01180_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x011C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01200_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01240_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01280_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x012C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01300_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01340_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01380_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x013C0_5th_KByte_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01400_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01440_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01480_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x014C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01500_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01540_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01580_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x015C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01600_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01640_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01680_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x016C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01700_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01740_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01780_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x017C0_6th_KByte_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01800_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01840_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01880_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x018C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01900_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01940_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01980_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x019C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01A00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01A40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01A80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01AC0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01B00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01B40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01B80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01BC0_7th_KByte_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01C00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01C40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01C80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01CC0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01D00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01D40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01D80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01DC0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01E00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01E40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01E80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01EC0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01F00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01F40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01F80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01FC0_8th_KByte_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_and_here_is_the_overflfowQ' diff --git a/test/overflow-3.c b/test/overflow-3.c index 6e170e1..3d9ede4 100644 --- a/test/overflow-3.c +++ b/test/overflow-3.c @@ -1 +1 @@ -re2c: error: line 2, column 8219: can't find symbol +re2c: error: line 2: undefined symbol 'x0000_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00040_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00080_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x000C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00100_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00140_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00180_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x001C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00200_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00240_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00280_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x002C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00300_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00340_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00380_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x003C0_1st_KByte_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00400_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00440_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00480_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x004C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00500_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00540_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00580_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x005C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00600_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00640_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00680_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x006C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00700_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00740_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00780_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x007C0_2nd_KByte_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00800_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00840_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00880_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x008C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00900_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00940_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00980_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x009C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00A00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00A40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00A80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00AC0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00B00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00B40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00B80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00BC0_3rd_KByte_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00C00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00C40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00C80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00CC0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00D00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00D40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00D80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00DC0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00E00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00E40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00E80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00EC0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00F00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00F40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00F80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x00FC0_4th_KByte_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01000_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01040_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01080_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x010C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01100_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01140_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01180_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x011C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01200_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01240_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01280_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x012C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01300_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01340_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01380_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x013C0_5th_KByte_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01400_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01440_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01480_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x014C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01500_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01540_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01580_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x015C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01600_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01640_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01680_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x016C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01700_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01740_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01780_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x017C0_6th_KByte_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01800_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01840_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01880_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x018C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01900_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01940_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01980_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x019C0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01A00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01A40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01A80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01AC0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01B00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01B40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01B80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01BC0_7th_KByte_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01C00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01C40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01C80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01CC0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01D00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01D40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01D80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01DC0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01E00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01E40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01E80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01EC0_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01F00_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01F40_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01F80_aaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_x01FC0_8th_KByte_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaaa_aaaaaaaaaaaaaa_and_here_is_the_overflfowQ' diff --git a/test/parse_date.b.c b/test/parse_date.b.c index fd97cba..5ae16e8 100644 --- a/test/parse_date.b.c +++ b/test/parse_date.b.c @@ -904,7 +904,7 @@ yy9: if (yych <= '9') goto yy58; goto yy5; yy10: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy7; yy11: yyaccept = 1; @@ -1227,8 +1227,8 @@ yy16: if (yych <= '9') goto yy99; goto yy5; yy17: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= 'U') { + yych = *++YYCURSOR; + if (yych <= 'U') { if (yych <= 'F') { if (yych == ')') goto yy102; if (yych >= 'A') goto yy103; @@ -3020,7 +3020,7 @@ yy101: } #line 3022 "parse_date.b.c" yy102: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy18; yy103: yych = *++YYCURSOR; @@ -3554,8 +3554,8 @@ yy127: if (yych <= '9') goto yy126; goto yy18; yy128: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy282; + yych = *++YYCURSOR; + if (yych <= '/') goto yy282; if (yych <= '9') goto yy283; goto yy282; yy129: @@ -5184,8 +5184,8 @@ yy220: if (yych <= '/') goto yy53; if (yych >= ':') goto yy53; yy222: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy223; + yych = *++YYCURSOR; + if (yych <= '/') goto yy223; if (yych <= '9') goto yy369; yy223: #line 1073 "parse_date.b.re" @@ -5429,8 +5429,8 @@ yy249: if (yych == 'M') goto yy250; if (yych != 'm') goto yy53; yy250: - ++YYCURSOR; - if ((yych = *YYCURSOR) == '.') goto yy388; + yych = *++YYCURSOR; + if (yych == '.') goto yy388; yy251: #line 929 "parse_date.b.re" { @@ -5499,8 +5499,8 @@ yy254: goto yy18; } yy255: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '@') { + yych = *++YYCURSOR; + if (yych <= '@') { if (yych == ')') goto yy102; } else { if (yych <= 'Z') goto yy400; @@ -5966,8 +5966,8 @@ yy273: } } yy274: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= 'D') { + yych = *++YYCURSOR; + if (yych <= 'D') { if (yych <= ')') { if (yych >= ')') goto yy102; } else { @@ -6656,8 +6656,8 @@ yy302: } } yy303: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '@') { + yych = *++YYCURSOR; + if (yych <= '@') { if (yych == ')') goto yy102; } else { if (yych <= 'Z') goto yy400; @@ -7744,8 +7744,8 @@ yy361: } } yy362: - ++YYCURSOR; - if ((yych = *YYCURSOR) == 'S') goto yy520; + yych = *++YYCURSOR; + if (yych == 'S') goto yy520; if (yych == 's') goto yy520; yy363: #line 1379 "parse_date.b.re" @@ -8058,7 +8058,7 @@ yy387: } } yy388: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy251; yy389: yych = *++YYCURSOR; @@ -8770,8 +8770,8 @@ yy441: } } yy442: - ++YYCURSOR; - if ((yych = *YYCURSOR) == ')') goto yy102; + yych = *++YYCURSOR; + if (yych == ')') goto yy102; yy443: #line 871 "parse_date.b.re" { @@ -9637,8 +9637,8 @@ yy503: } } yy504: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= 'U') { + yych = *++YYCURSOR; + if (yych <= 'U') { if (yych == 'I') goto yy674; } else { if (yych == 'W') goto yy505; @@ -9784,7 +9784,7 @@ yy519: if (yych == 's') goto yy689; goto yy53; yy520: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy363; yy521: yych = *++YYCURSOR; @@ -10059,25 +10059,9 @@ yy561: } yy562: yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '/') { - if (yych <= '.') goto yy53; - goto yy259; - } else { - if (yych == 'T') goto yy125; - goto yy53; - } - } else { - if (yych <= 's') { - if (yych <= '_') goto yy259; - if (yych <= '`') goto yy53; - goto yy559; - } else { - if (yych <= 't') goto yy561; - if (yych <= 'z') goto yy559; - goto yy53; - } - } + if (yych == 'T') goto yy125; + if (yych == 't') goto yy561; + goto yy560; yy563: yych = *++YYCURSOR; if (yych == 'B') goto yy609; @@ -10187,25 +10171,9 @@ yy573: goto yy560; yy574: yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '/') { - if (yych <= '.') goto yy53; - goto yy259; - } else { - if (yych == 'H') goto yy565; - goto yy53; - } - } else { - if (yych <= 'g') { - if (yych <= '_') goto yy259; - if (yych <= '`') goto yy53; - goto yy559; - } else { - if (yych <= 'h') goto yy568; - if (yych <= 'z') goto yy559; - goto yy53; - } - } + if (yych == 'H') goto yy565; + if (yych == 'h') goto yy568; + goto yy560; yy575: yych = *++YYCURSOR; if (yych == 'Y') goto yy704; @@ -10294,7 +10262,7 @@ yy583: TIMELIB_DEINIT; return TIMELIB_DATE_NO_DAY; } -#line 10298 "parse_date.b.c" +#line 10266 "parse_date.b.c" yy584: yych = *++YYCURSOR; if (yych <= '/') goto yy583; @@ -10337,7 +10305,7 @@ yy586: TIMELIB_DEINIT; return TIMELIB_SHORTDATE_WITH_TIME; } -#line 10341 "parse_date.b.c" +#line 10309 "parse_date.b.c" yy587: yyaccept = 16; yych = *(YYMARKER = ++YYCURSOR); @@ -10588,25 +10556,9 @@ yy617: goto yy560; yy618: yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '/') { - if (yych <= '.') goto yy53; - goto yy259; - } else { - if (yych == 'D') goto yy565; - goto yy53; - } - } else { - if (yych <= 'c') { - if (yych <= '_') goto yy259; - if (yych <= '`') goto yy53; - goto yy559; - } else { - if (yych <= 'd') goto yy568; - if (yych <= 'z') goto yy559; - goto yy53; - } - } + if (yych == 'D') goto yy565; + if (yych == 'd') goto yy568; + goto yy560; yy619: yych = *++YYCURSOR; if (yych == 'M') goto yy563; @@ -10629,7 +10581,7 @@ yy622: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 10633 "parse_date.b.c" +#line 10585 "parse_date.b.c" yy623: yych = *++YYCURSOR; if (yych == 'R') goto yy746; @@ -10707,8 +10659,8 @@ yy636: if (yych <= '9') goto yy753; goto yy192; yy637: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy638; + yych = *++YYCURSOR; + if (yych <= '/') goto yy638; if (yych <= '9') goto yy753; yy638: #line 1087 "parse_date.b.re" @@ -10723,7 +10675,7 @@ yy638: TIMELIB_DEINIT; return TIMELIB_DATE_FULL_POINTED; } -#line 10727 "parse_date.b.c" +#line 10679 "parse_date.b.c" yy639: yych = *++YYCURSOR; if (yych <= '/') goto yy197; @@ -10919,7 +10871,7 @@ yy663: TIMELIB_DEINIT; return TIMELIB_ISO_NOCOLON; } -#line 10923 "parse_date.b.c" +#line 10875 "parse_date.b.c" yy664: yyaccept = 18; yych = *(YYMARKER = ++YYCURSOR); @@ -11104,7 +11056,7 @@ yy674: yych = *++YYCURSOR; if (yych != 'I') goto yy505; yy675: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy505; yy676: yych = *++YYCURSOR; @@ -11229,7 +11181,7 @@ yy692: if (yych == 'y') goto yy520; goto yy53; yy693: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy223; yy694: yych = *++YYCURSOR; @@ -11336,7 +11288,7 @@ yy703: default: goto yy282; } yy704: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy275; yy705: yyaccept = 7; @@ -11390,7 +11342,7 @@ yy710: if (yych <= '9') goto yy801; goto yy53; yy711: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy129; yy712: yych = *++YYCURSOR; @@ -11399,25 +11351,9 @@ yy712: goto yy53; yy713: yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '/') { - if (yych <= '.') goto yy53; - goto yy259; - } else { - if (yych == 'Y') goto yy125; - goto yy53; - } - } else { - if (yych <= 'x') { - if (yych <= '_') goto yy259; - if (yych <= '`') goto yy53; - goto yy559; - } else { - if (yych <= 'y') goto yy561; - if (yych <= 'z') goto yy559; - goto yy53; - } - } + if (yych == 'Y') goto yy125; + if (yych == 'y') goto yy561; + goto yy560; yy714: yych = *++YYCURSOR; if (yych == 'Y') goto yy802; @@ -11579,25 +11515,9 @@ yy742: goto yy53; yy743: yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '/') { - if (yych <= '.') goto yy53; - goto yy259; - } else { - if (yych == 'R') goto yy125; - goto yy53; - } - } else { - if (yych <= 'q') { - if (yych <= '_') goto yy259; - if (yych <= '`') goto yy53; - goto yy559; - } else { - if (yych <= 'r') goto yy561; - if (yych <= 'z') goto yy559; - goto yy53; - } - } + if (yych == 'R') goto yy125; + if (yych == 'r') goto yy561; + goto yy560; yy744: yych = *++YYCURSOR; if (yych == 'U') goto yy829; @@ -11629,7 +11549,7 @@ yy749: if (yych == 'd') goto yy834; goto yy560; yy750: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy474; yy751: ++YYCURSOR; @@ -11821,7 +11741,7 @@ yy775: TIMELIB_DEINIT; return TIMELIB_PG_YEARDAY; } -#line 11825 "parse_date.b.c" +#line 11745 "parse_date.b.c" yy776: yyaccept = 19; yych = *(YYMARKER = ++YYCURSOR); @@ -11983,8 +11903,8 @@ yy789: if (yych == 't') goto yy782; goto yy505; yy790: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy791; + yych = *++YYCURSOR; + if (yych <= '/') goto yy791; if (yych <= '7') goto yy869; yy791: #line 1219 "parse_date.b.re" @@ -12005,7 +11925,7 @@ yy791: TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 12009 "parse_date.b.c" +#line 11929 "parse_date.b.c" yy792: yych = *++YYCURSOR; if (yych == 'G') goto yy871; @@ -12065,11 +11985,11 @@ yy800: if (yych == '0') goto yy878; goto yy586; yy801: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy586; yy802: - ++YYCURSOR; - if ((yych = *YYCURSOR) == 'S') goto yy879; + yych = *++YYCURSOR; + if (yych == 'S') goto yy879; if (yych == 's') goto yy879; yy803: #line 1323 "parse_date.b.re" @@ -12088,7 +12008,7 @@ yy803: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 12092 "parse_date.b.c" +#line 12012 "parse_date.b.c" yy804: yych = *++YYCURSOR; if (yych == 'T') goto yy880; @@ -12418,25 +12338,9 @@ yy829: goto yy53; yy830: yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '/') { - if (yych <= '.') goto yy53; - goto yy259; - } else { - if (yych == 'S') goto yy565; - goto yy53; - } - } else { - if (yych <= 'r') { - if (yych <= '_') goto yy259; - if (yych <= '`') goto yy53; - goto yy559; - } else { - if (yych <= 's') goto yy568; - if (yych <= 'z') goto yy559; - goto yy53; - } - } + if (yych == 'S') goto yy565; + if (yych == 's') goto yy568; + goto yy560; yy831: yych = *++YYCURSOR; if (yych == 'W') goto yy899; @@ -12458,10 +12362,10 @@ yy834: if (yych == 'a') goto yy903; goto yy560; yy835: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy638; yy836: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy197; yy837: yych = *++YYCURSOR; @@ -12655,7 +12559,7 @@ yy852: goto yy505; } yy853: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy775; yy854: yyaccept = 22; @@ -12684,7 +12588,7 @@ yy855: TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 12688 "parse_date.b.c" +#line 12592 "parse_date.b.c" yy856: yyaccept = 22; yych = *(YYMARKER = ++YYCURSOR); @@ -12764,7 +12668,7 @@ yy860: TIMELIB_DEINIT; return TIMELIB_DATE_NOCOLON; } -#line 12768 "parse_date.b.c" +#line 12672 "parse_date.b.c" yy861: yych = *++YYCURSOR; if (yych <= '/') goto yy53; @@ -12826,7 +12730,7 @@ yy869: TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 12830 "parse_date.b.c" +#line 12734 "parse_date.b.c" yy871: yych = *++YYCURSOR; if (yych == 'H') goto yy926; @@ -12848,8 +12752,8 @@ yy874: if (yych <= '1') goto yy927; goto yy53; yy875: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy876; + yych = *++YYCURSOR; + if (yych <= '/') goto yy876; if (yych <= '9') goto yy929; yy876: #line 1238 "parse_date.b.re" @@ -12864,7 +12768,7 @@ yy876: TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 12868 "parse_date.b.c" +#line 12772 "parse_date.b.c" yy877: yyaccept = 16; yych = *(YYMARKER = ++YYCURSOR); @@ -12914,7 +12818,7 @@ yy878: } } yy879: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy803; yy880: yych = *++YYCURSOR; @@ -13050,7 +12954,7 @@ yy900: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 13054 "parse_date.b.c" +#line 12958 "parse_date.b.c" yy901: yyaccept = 24; yych = *(YYMARKER = ++YYCURSOR); @@ -13327,7 +13231,7 @@ yy927: TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 13331 "parse_date.b.c" +#line 13235 "parse_date.b.c" yy929: yych = *++YYCURSOR; if (yych <= '/') goto yy876; @@ -13455,7 +13359,7 @@ yy947: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 13459 "parse_date.b.c" +#line 13363 "parse_date.b.c" yy948: yyaccept = 25; yych = *(YYMARKER = ++YYCURSOR); @@ -13511,7 +13415,7 @@ yy954: } } yy955: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy855; yy956: yyaccept = 22; @@ -13703,7 +13607,7 @@ yy981: if (yych <= '2') goto yy1000; goto yy53; yy982: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy876; yy983: yych = *++YYCURSOR; @@ -13935,8 +13839,8 @@ yy1018: if (yych <= '5') goto yy1024; goto yy53; yy1019: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy1020; + yych = *++YYCURSOR; + if (yych <= '/') goto yy1020; if (yych <= '9') goto yy1022; yy1020: #line 1163 "parse_date.b.re" @@ -13962,12 +13866,12 @@ yy1020: TIMELIB_DEINIT; return TIMELIB_XMLRPC_SOAP; } -#line 13966 "parse_date.b.c" +#line 13870 "parse_date.b.c" yy1021: yych = *++YYCURSOR; if (yych != '0') goto yy1020; yy1022: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy1020; yy1023: yych = *++YYCURSOR; @@ -14073,8 +13977,8 @@ yy1040: goto yy1020; } yy1042: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy1043; + yych = *++YYCURSOR; + if (yych <= '/') goto yy1043; if (yych <= '9') goto yy1045; if (yych <= ':') goto yy1047; yy1043: @@ -14096,7 +14000,7 @@ yy1043: TIMELIB_DEINIT; return TIMELIB_CLF; } -#line 14100 "parse_date.b.c" +#line 14004 "parse_date.b.c" yy1044: yych = *++YYCURSOR; if (yych <= '5') { @@ -14132,7 +14036,7 @@ yy1048: if (yych <= '/') goto yy1043; if (yych >= ':') goto yy1043; yy1049: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy1043; yy1050: yych = *++YYCURSOR; @@ -14157,8 +14061,8 @@ yy1052: if (yych <= '9') goto yy1022; if (yych >= ';') goto yy1020; yy1053: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy1020; + yych = *++YYCURSOR; + if (yych <= '/') goto yy1020; if (yych <= '5') goto yy1019; if (yych <= '9') goto yy1022; goto yy1020; @@ -14169,6 +14073,7 @@ yy1053: #define YYMAXFILL 26 + timelib_time* timelib_strtotime(char *s, int len, int *errors, timelib_tzdb *tzdb) { Scanner in; diff --git a/test/parse_date.c b/test/parse_date.c index 6394884..8967558 100644 --- a/test/parse_date.c +++ b/test/parse_date.c @@ -935,7 +935,7 @@ yy9: default: goto yy5; } yy10: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy7; yy11: yyaccept = 1; @@ -1267,8 +1267,8 @@ yy16: default: goto yy5; } yy17: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case ')': goto yy102; case 'A': case 'B': @@ -4136,7 +4136,7 @@ yy101: } #line 4138 "parse_date.c" yy102: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy18; yy103: yych = *++YYCURSOR; @@ -5512,8 +5512,8 @@ yy127: default: goto yy18; } yy128: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -8755,8 +8755,8 @@ yy220: default: goto yy53; } yy222: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -9086,8 +9086,8 @@ yy249: default: goto yy53; } yy250: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '.': goto yy388; default: goto yy251; } @@ -9214,8 +9214,8 @@ yy254: default: goto yy18; } yy255: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case ')': goto yy102; case 'A': case 'B': @@ -10442,8 +10442,8 @@ yy273: default: goto yy18; } yy274: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case ')': goto yy102; case 'A': case 'B': @@ -12164,8 +12164,8 @@ yy302: default: goto yy18; } yy303: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case ')': goto yy102; case 'A': case 'B': @@ -14601,8 +14601,8 @@ yy361: default: goto yy74; } yy362: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 'S': case 's': goto yy520; default: goto yy363; @@ -15051,7 +15051,7 @@ yy387: default: goto yy192; } yy388: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy251; yy389: yych = *++YYCURSOR; @@ -16097,8 +16097,8 @@ yy441: default: goto yy18; } yy442: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case ')': goto yy102; default: goto yy443; } @@ -17276,8 +17276,8 @@ yy503: default: goto yy53; } yy504: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 'I': goto yy674; case 'V': case 'X': goto yy675; @@ -17442,7 +17442,7 @@ yy519: default: goto yy53; } yy520: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy363; yy521: yych = *++YYCURSOR; @@ -17879,36 +17879,9 @@ yy561: yy562: yych = *++YYCURSOR; switch (yych) { - case '/': - case '_': goto yy259; case 'T': goto yy125; - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': goto yy559; case 't': goto yy561; - default: goto yy53; + default: goto yy560; } yy563: yych = *++YYCURSOR; @@ -18027,36 +18000,9 @@ yy573: yy574: yych = *++YYCURSOR; switch (yych) { - case '/': - case '_': goto yy259; case 'H': goto yy565; - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': goto yy559; case 'h': goto yy568; - default: goto yy53; + default: goto yy560; } yy575: yych = *++YYCURSOR; @@ -18201,7 +18147,7 @@ yy583: TIMELIB_DEINIT; return TIMELIB_DATE_NO_DAY; } -#line 18205 "parse_date.c" +#line 18151 "parse_date.c" yy584: yych = *++YYCURSOR; switch (yych) { @@ -18263,7 +18209,7 @@ yy586: TIMELIB_DEINIT; return TIMELIB_SHORTDATE_WITH_TIME; } -#line 18267 "parse_date.c" +#line 18213 "parse_date.c" yy587: yyaccept = 16; yych = *(YYMARKER = ++YYCURSOR); @@ -18513,36 +18459,9 @@ yy617: yy618: yych = *++YYCURSOR; switch (yych) { - case '/': - case '_': goto yy259; case 'D': goto yy565; - case 'a': - case 'b': - case 'c': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': goto yy559; case 'd': goto yy568; - default: goto yy53; + default: goto yy560; } yy619: yych = *++YYCURSOR; @@ -18570,7 +18489,7 @@ yy622: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 18574 "parse_date.c" +#line 18493 "parse_date.c" yy623: yych = *++YYCURSOR; switch (yych) { @@ -18712,8 +18631,8 @@ yy636: default: goto yy192; } yy637: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -18739,7 +18658,7 @@ yy638: TIMELIB_DEINIT; return TIMELIB_DATE_FULL_POINTED; } -#line 18743 "parse_date.c" +#line 18662 "parse_date.c" yy639: yych = *++YYCURSOR; switch (yych) { @@ -19013,7 +18932,7 @@ yy663: TIMELIB_DEINIT; return TIMELIB_ISO_NOCOLON; } -#line 19017 "parse_date.c" +#line 18936 "parse_date.c" yy664: yyaccept = 18; yych = *(YYMARKER = ++YYCURSOR); @@ -19203,7 +19122,7 @@ yy674: default: goto yy505; } yy675: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy505; yy676: yych = *++YYCURSOR; @@ -19380,7 +19299,7 @@ yy692: default: goto yy53; } yy693: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy223; yy694: yych = *++YYCURSOR; @@ -19493,7 +19412,7 @@ yy703: default: goto yy282; } yy704: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy275; yy705: yyaccept = 7; @@ -19611,7 +19530,7 @@ yy710: default: goto yy53; } yy711: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy129; yy712: yych = *++YYCURSOR; @@ -19623,36 +19542,9 @@ yy712: yy713: yych = *++YYCURSOR; switch (yych) { - case '/': - case '_': goto yy259; case 'Y': goto yy125; - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'z': goto yy559; case 'y': goto yy561; - default: goto yy53; + default: goto yy560; } yy714: yych = *++YYCURSOR; @@ -19864,36 +19756,9 @@ yy742: yy743: yych = *++YYCURSOR; switch (yych) { - case '/': - case '_': goto yy259; case 'R': goto yy125; - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 's': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': goto yy559; case 'r': goto yy561; - default: goto yy53; + default: goto yy560; } yy744: yych = *++YYCURSOR; @@ -19938,7 +19803,7 @@ yy749: default: goto yy560; } yy750: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy474; yy751: ++YYCURSOR; @@ -20212,7 +20077,7 @@ yy775: TIMELIB_DEINIT; return TIMELIB_PG_YEARDAY; } -#line 20216 "parse_date.c" +#line 20081 "parse_date.c" yy776: yyaccept = 19; yych = *(YYMARKER = ++YYCURSOR); @@ -20396,8 +20261,8 @@ yy789: default: goto yy505; } yy790: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -20427,7 +20292,7 @@ yy791: TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 20431 "parse_date.c" +#line 20296 "parse_date.c" yy792: yych = *++YYCURSOR; switch (yych) { @@ -20522,11 +20387,11 @@ yy800: default: goto yy586; } yy801: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy586; yy802: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case 'S': case 's': goto yy879; default: goto yy803; @@ -20548,7 +20413,7 @@ yy803: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 20552 "parse_date.c" +#line 20417 "parse_date.c" yy804: yych = *++YYCURSOR; switch (yych) { @@ -21003,36 +20868,9 @@ yy829: yy830: yych = *++YYCURSOR; switch (yych) { - case '/': - case '_': goto yy259; case 'S': goto yy565; - case 'a': - case 'b': - case 'c': - case 'd': - case 'e': - case 'f': - case 'g': - case 'h': - case 'i': - case 'j': - case 'k': - case 'l': - case 'm': - case 'n': - case 'o': - case 'p': - case 'q': - case 'r': - case 't': - case 'u': - case 'v': - case 'w': - case 'x': - case 'y': - case 'z': goto yy559; case 's': goto yy568; - default: goto yy53; + default: goto yy560; } yy831: yych = *++YYCURSOR; @@ -21063,10 +20901,10 @@ yy834: default: goto yy560; } yy835: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy638; yy836: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy197; yy837: yych = *++YYCURSOR; @@ -21241,7 +21079,7 @@ yy852: default: goto yy505; } yy853: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy775; yy854: yyaccept = 22; @@ -21275,7 +21113,7 @@ yy855: TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 21279 "parse_date.c" +#line 21117 "parse_date.c" yy856: yyaccept = 22; yych = *(YYMARKER = ++YYCURSOR); @@ -21358,7 +21196,7 @@ yy860: TIMELIB_DEINIT; return TIMELIB_DATE_NOCOLON; } -#line 21362 "parse_date.c" +#line 21200 "parse_date.c" yy861: yych = *++YYCURSOR; switch (yych) { @@ -21437,7 +21275,7 @@ yy869: TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 21441 "parse_date.c" +#line 21279 "parse_date.c" yy871: yych = *++YYCURSOR; switch (yych) { @@ -21482,8 +21320,8 @@ yy874: default: goto yy53; } yy875: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -21509,7 +21347,7 @@ yy876: TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 21513 "parse_date.c" +#line 21351 "parse_date.c" yy877: yyaccept = 16; yych = *(YYMARKER = ++YYCURSOR); @@ -21637,7 +21475,7 @@ yy878: default: goto yy586; } yy879: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy803; yy880: yych = *++YYCURSOR; @@ -21817,7 +21655,7 @@ yy900: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 21821 "parse_date.c" +#line 21659 "parse_date.c" yy901: yyaccept = 24; yych = *(YYMARKER = ++YYCURSOR); @@ -22155,7 +21993,7 @@ yy927: TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 22159 "parse_date.c" +#line 21997 "parse_date.c" yy929: yych = *++YYCURSOR; switch (yych) { @@ -22506,7 +22344,7 @@ yy947: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 22510 "parse_date.c" +#line 22348 "parse_date.c" yy948: yyaccept = 25; yych = *(YYMARKER = ++YYCURSOR); @@ -22598,7 +22436,7 @@ yy954: default: goto yy855; } yy955: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy855; yy956: yyaccept = 22; @@ -23008,7 +22846,7 @@ yy981: default: goto yy53; } yy982: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy876; yy983: yych = *++YYCURSOR; @@ -23587,8 +23425,8 @@ yy1018: default: goto yy53; } yy1019: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -23625,7 +23463,7 @@ yy1020: TIMELIB_DEINIT; return TIMELIB_XMLRPC_SOAP; } -#line 23629 "parse_date.c" +#line 23467 "parse_date.c" yy1021: yych = *++YYCURSOR; switch (yych) { @@ -23633,7 +23471,7 @@ yy1021: default: goto yy1020; } yy1022: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy1020; yy1023: yych = *++YYCURSOR; @@ -23836,8 +23674,8 @@ yy1040: default: goto yy1020; } yy1042: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -23870,7 +23708,7 @@ yy1043: TIMELIB_DEINIT; return TIMELIB_CLF; } -#line 23874 "parse_date.c" +#line 23712 "parse_date.c" yy1044: yych = *++YYCURSOR; switch (yych) { @@ -23949,7 +23787,7 @@ yy1048: default: goto yy1043; } yy1049: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy1043; yy1050: yych = *++YYCURSOR; @@ -24000,8 +23838,8 @@ yy1052: default: goto yy1020; } yy1053: - ++YYCURSOR; - switch ((yych = *YYCURSOR)) { + yych = *++YYCURSOR; + switch (yych) { case '0': case '1': case '2': @@ -24021,6 +23859,7 @@ yy1053: #define YYMAXFILL 26 + timelib_time* timelib_strtotime(char *s, int len, int *errors, timelib_tzdb *tzdb) { Scanner in; diff --git a/test/parse_date.db.c b/test/parse_date.db.c index b817a47..39fff1f 100644 --- a/test/parse_date.db.c +++ b/test/parse_date.db.c @@ -934,7 +934,7 @@ yy9: goto yy5; yy10: YYDEBUG(10, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy7; yy11: YYDEBUG(11, *YYCURSOR); @@ -1209,8 +1209,8 @@ yy16: goto yy5; yy17: YYDEBUG(17, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= 'U') { + yych = *++YYCURSOR; + if (yych <= 'U') { if (yych <= 'F') { if (yych == ')') goto yy102; if (yych >= 'A') goto yy103; @@ -3295,7 +3295,7 @@ yy101: #line 3296 "parse_date.db.c" yy102: YYDEBUG(102, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy18; yy103: YYDEBUG(103, *YYCURSOR); @@ -5774,8 +5774,8 @@ yy227: } yy229: YYDEBUG(229, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy230; + yych = *++YYCURSOR; + if (yych <= '/') goto yy230; if (yych <= '9') goto yy378; yy230: YYDEBUG(230, *YYCURSOR); @@ -6152,8 +6152,8 @@ yy260: } yy261: YYDEBUG(261, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '@') { + yych = *++YYCURSOR; + if (yych <= '@') { if (yych == ')') goto yy102; } else { if (yych <= 'Z') goto yy411; @@ -6705,8 +6705,8 @@ yy279: } yy280: YYDEBUG(280, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= 'D') { + yych = *++YYCURSOR; + if (yych <= 'D') { if (yych <= ')') { if (yych >= ')') goto yy102; } else { @@ -7525,8 +7525,8 @@ yy309: } yy310: YYDEBUG(310, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '@') { + yych = *++YYCURSOR; + if (yych <= '@') { if (yych == ')') goto yy102; } else { if (yych <= 'Z') goto yy411; @@ -8722,8 +8722,8 @@ yy370: } yy371: YYDEBUG(371, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) == 'S') goto yy535; + yych = *++YYCURSOR; + if (yych == 'S') goto yy535; if (yych == 's') goto yy535; yy372: YYDEBUG(372, *YYCURSOR); @@ -10179,8 +10179,8 @@ yy455: } yy456: YYDEBUG(456, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '@') { + yych = *++YYCURSOR; + if (yych <= '@') { if (yych == ')') goto yy102; } else { if (yych <= 'Z') goto yy568; @@ -10944,8 +10944,8 @@ yy487: } yy488: YYDEBUG(488, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy489; + yych = *++YYCURSOR; + if (yych <= '/') goto yy489; if (yych <= '9') goto yy650; yy489: YYDEBUG(489, *YYCURSOR); @@ -11304,8 +11304,8 @@ yy518: } yy519: YYDEBUG(519, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= 'U') { + yych = *++YYCURSOR; + if (yych <= 'U') { if (yych == 'I') goto yy694; } else { if (yych == 'W') goto yy520; @@ -11467,7 +11467,7 @@ yy534: goto yy53; yy535: YYDEBUG(535, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy372; yy536: YYDEBUG(536, *YYCURSOR); @@ -13317,8 +13317,8 @@ yy638: goto yy366; yy639: YYDEBUG(639, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '@') { + yych = *++YYCURSOR; + if (yych <= '@') { if (yych == ')') goto yy102; } else { if (yych <= 'Z') goto yy725; @@ -14180,7 +14180,7 @@ yy694: if (yych != 'I') goto yy520; yy695: YYDEBUG(695, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy520; yy696: YYDEBUG(696, *YYCURSOR); @@ -14323,7 +14323,7 @@ yy712: goto yy53; yy713: YYDEBUG(713, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy230; yy714: YYDEBUG(714, *YYCURSOR); @@ -15206,7 +15206,7 @@ yy760: goto yy53; yy761: YYDEBUG(761, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy128; yy762: YYDEBUG(762, *YYCURSOR); @@ -16160,7 +16160,7 @@ yy820: goto yy489; yy821: YYDEBUG(821, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy491; yy822: YYDEBUG(822, *YYCURSOR); @@ -16647,8 +16647,8 @@ yy859: goto yy520; yy860: YYDEBUG(860, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy861; + yych = *++YYCURSOR; + if (yych <= '/') goto yy861; if (yych <= '7') goto yy992; yy861: YYDEBUG(861, *YYCURSOR); @@ -16728,25 +16728,9 @@ yy869: yy870: YYDEBUG(870, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '/') { - if (yych <= '.') goto yy53; - goto yy265; - } else { - if (yych == 'R') goto yy125; - goto yy53; - } - } else { - if (yych <= 'q') { - if (yych <= '_') goto yy265; - if (yych <= '`') goto yy53; - goto yy867; - } else { - if (yych <= 'r') goto yy914; - if (yych <= 'z') goto yy867; - goto yy53; - } - } + if (yych == 'R') goto yy125; + if (yych == 'r') goto yy914; + goto yy868; yy871: YYDEBUG(871, *YYCURSOR); yych = *++YYCURSOR; @@ -16926,25 +16910,9 @@ yy897: yy898: YYDEBUG(898, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '/') { - if (yych <= '.') goto yy53; - goto yy265; - } else { - if (yych == 'H') goto yy606; - goto yy53; - } - } else { - if (yych <= 'g') { - if (yych <= '_') goto yy265; - if (yych <= '`') goto yy53; - goto yy867; - } else { - if (yych <= 'h') goto yy948; - if (yych <= 'z') goto yy867; - goto yy53; - } - } + if (yych == 'H') goto yy606; + if (yych == 'h') goto yy948; + goto yy868; yy899: YYDEBUG(899, *YYCURSOR); yych = *++YYCURSOR; @@ -16954,25 +16922,9 @@ yy899: yy900: YYDEBUG(900, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '/') { - if (yych <= '.') goto yy53; - goto yy265; - } else { - if (yych == 'Y') goto yy125; - goto yy53; - } - } else { - if (yych <= 'x') { - if (yych <= '_') goto yy265; - if (yych <= '`') goto yy53; - goto yy867; - } else { - if (yych <= 'y') goto yy914; - if (yych <= 'z') goto yy867; - goto yy53; - } - } + if (yych == 'Y') goto yy125; + if (yych == 'y') goto yy914; + goto yy868; yy901: YYDEBUG(901, *YYCURSOR); yych = *++YYCURSOR; @@ -17104,7 +17056,7 @@ yy912: goto yy601; yy913: YYDEBUG(913, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy601; yy914: YYDEBUG(914, *YYCURSOR); @@ -17120,8 +17072,8 @@ yy914: } yy915: YYDEBUG(915, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) == 'S') goto yy1002; + yych = *++YYCURSOR; + if (yych == 'S') goto yy1002; if (yych == 's') goto yy1002; yy916: YYDEBUG(916, *YYCURSOR); @@ -17141,7 +17093,7 @@ yy916: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 17145 "parse_date.db.c" +#line 17097 "parse_date.db.c" yy917: YYDEBUG(917, *YYCURSOR); yych = *++YYCURSOR; @@ -17498,25 +17450,9 @@ yy942: yy943: YYDEBUG(943, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '/') { - if (yych <= '.') goto yy53; - goto yy265; - } else { - if (yych == 'S') goto yy606; - goto yy53; - } - } else { - if (yych <= 'r') { - if (yych <= '_') goto yy265; - if (yych <= '`') goto yy53; - goto yy867; - } else { - if (yych <= 's') goto yy948; - if (yych <= 'z') goto yy867; - goto yy53; - } - } + if (yych == 'S') goto yy606; + if (yych == 's') goto yy948; + goto yy868; yy944: YYDEBUG(944, *YYCURSOR); yych = *++YYCURSOR; @@ -17586,7 +17522,7 @@ yy948: } yy949: YYDEBUG(949, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy683; yy950: YYDEBUG(950, *YYCURSOR); @@ -17596,7 +17532,7 @@ yy950: goto yy53; yy951: YYDEBUG(951, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy281; yy952: YYDEBUG(952, *YYCURSOR); @@ -17643,11 +17579,11 @@ yy957: goto yy868; yy958: YYDEBUG(958, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy489; yy959: YYDEBUG(959, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy204; yy960: YYDEBUG(960, *YYCURSOR); @@ -17858,7 +17794,7 @@ yy975: } yy976: YYDEBUG(976, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy845; yy977: YYDEBUG(977, *YYCURSOR); @@ -17889,7 +17825,7 @@ yy978: TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 17893 "parse_date.db.c" +#line 17829 "parse_date.db.c" yy979: YYDEBUG(979, *YYCURSOR); yyaccept = 22; @@ -18003,7 +17939,7 @@ yy983: TIMELIB_DEINIT; return TIMELIB_DATE_NOCOLON; } -#line 18007 "parse_date.db.c" +#line 17943 "parse_date.db.c" yy984: YYDEBUG(984, *YYCURSOR); yych = *++YYCURSOR; @@ -18075,7 +18011,7 @@ yy992: TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 18079 "parse_date.db.c" +#line 18015 "parse_date.db.c" yy994: YYDEBUG(994, *YYCURSOR); yych = *++YYCURSOR; @@ -18102,8 +18038,8 @@ yy997: goto yy53; yy998: YYDEBUG(998, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy999; + yych = *++YYCURSOR; + if (yych <= '/') goto yy999; if (yych <= '9') goto yy1054; yy999: YYDEBUG(999, *YYCURSOR); @@ -18119,7 +18055,7 @@ yy999: TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 18123 "parse_date.db.c" +#line 18059 "parse_date.db.c" yy1000: YYDEBUG(1000, *YYCURSOR); yyaccept = 16; @@ -18182,7 +18118,7 @@ yy1001: } yy1002: YYDEBUG(1002, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy916; yy1003: YYDEBUG(1003, *YYCURSOR); @@ -18325,7 +18261,7 @@ yy1021: goto yy868; yy1022: YYDEBUG(1022, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy640; yy1023: YYDEBUG(1023, *YYCURSOR); @@ -18356,7 +18292,7 @@ yy1025: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 18360 "parse_date.db.c" +#line 18296 "parse_date.db.c" yy1026: YYDEBUG(1026, *YYCURSOR); yyaccept = 24; @@ -18661,7 +18597,7 @@ yy1052: TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 18665 "parse_date.db.c" +#line 18601 "parse_date.db.c" yy1054: YYDEBUG(1054, *YYCURSOR); yych = *++YYCURSOR; @@ -18808,7 +18744,7 @@ yy1072: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 18812 "parse_date.db.c" +#line 18748 "parse_date.db.c" yy1073: YYDEBUG(1073, *YYCURSOR); yyaccept = 25; @@ -18872,7 +18808,7 @@ yy1079: } yy1080: YYDEBUG(1080, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy978; yy1081: YYDEBUG(1081, *YYCURSOR); @@ -19091,7 +19027,7 @@ yy1106: goto yy53; yy1107: YYDEBUG(1107, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy999; yy1108: YYDEBUG(1108, *YYCURSOR); @@ -19392,8 +19328,8 @@ yy1143: goto yy53; yy1144: YYDEBUG(1144, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy1145; + yych = *++YYCURSOR; + if (yych <= '/') goto yy1145; if (yych <= '9') goto yy1147; yy1145: YYDEBUG(1145, *YYCURSOR); @@ -19422,14 +19358,14 @@ yy1145: TIMELIB_DEINIT; return TIMELIB_XMLRPC_SOAP; } -#line 19426 "parse_date.db.c" +#line 19362 "parse_date.db.c" yy1146: YYDEBUG(1146, *YYCURSOR); yych = *++YYCURSOR; if (yych != '0') goto yy1145; yy1147: YYDEBUG(1147, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy1145; yy1148: YYDEBUG(1148, *YYCURSOR); @@ -19599,8 +19535,8 @@ yy1169: } yy1171: YYDEBUG(1171, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy1172; + yych = *++YYCURSOR; + if (yych <= '/') goto yy1172; if (yych <= '9') goto yy1174; if (yych <= ':') goto yy1176; yy1172: @@ -19625,7 +19561,7 @@ yy1172: TIMELIB_DEINIT; return TIMELIB_CLF; } -#line 19629 "parse_date.db.c" +#line 19565 "parse_date.db.c" yy1173: YYDEBUG(1173, *YYCURSOR); yych = *++YYCURSOR; @@ -19667,7 +19603,7 @@ yy1177: if (yych >= ':') goto yy1172; yy1178: YYDEBUG(1178, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy1172; yy1179: YYDEBUG(1179, *YYCURSOR); @@ -19696,8 +19632,8 @@ yy1181: if (yych >= ';') goto yy1145; yy1182: YYDEBUG(1182, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy1145; + yych = *++YYCURSOR; + if (yych <= '/') goto yy1145; if (yych <= '5') goto yy1144; if (yych <= '9') goto yy1147; goto yy1145; @@ -19708,6 +19644,7 @@ yy1182: #define YYMAXFILL 29 + timelib_time* timelib_strtotime(char *s, int len, struct timelib_error_container **errors, timelib_tzdb *tzdb) { Scanner in; diff --git a/test/parse_date.g.c b/test/parse_date.g.c index a2a1831..108088e 100644 --- a/test/parse_date.g.c +++ b/test/parse_date.g.c @@ -867,7 +867,7 @@ yy9: if (yych <= '9') goto yy58; goto yy5; yy10: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy7; yy11: yyaccept = 1; @@ -1077,7 +1077,7 @@ yy16: if (yych <= '9') goto yy99; goto yy5; yy17: - ++YYCURSOR; + yych = *++YYCURSOR; { static void *yytarget[256] = { &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, @@ -1113,7 +1113,7 @@ yy17: &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18, &&yy18 }; - goto *yytarget[(yych = *YYCURSOR)]; + goto *yytarget[yych]; } yy18: #line 1340 "parse_date.g.re" @@ -2842,7 +2842,7 @@ yy101: } #line 2844 "parse_date.g.c" yy102: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy18; yy103: yych = *++YYCURSOR; @@ -3377,8 +3377,8 @@ yy127: if (yych <= '9') goto yy126; goto yy18; yy128: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy282; + yych = *++YYCURSOR; + if (yych <= '/') goto yy282; if (yych <= '9') goto yy283; goto yy282; yy129: @@ -5027,8 +5027,8 @@ yy220: if (yych <= '/') goto yy53; if (yych >= ':') goto yy53; yy222: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy223; + yych = *++YYCURSOR; + if (yych <= '/') goto yy223; if (yych <= '9') goto yy369; yy223: #line 1073 "parse_date.g.re" @@ -5290,8 +5290,8 @@ yy249: if (yych == 'M') goto yy250; if (yych != 'm') goto yy53; yy250: - ++YYCURSOR; - if ((yych = *YYCURSOR) == '.') goto yy388; + yych = *++YYCURSOR; + if (yych == '.') goto yy388; yy251: #line 929 "parse_date.g.re" { @@ -5368,8 +5368,8 @@ yy254: goto yy18; } yy255: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '@') { + yych = *++YYCURSOR; + if (yych <= '@') { if (yych == ')') goto yy102; } else { if (yych <= 'Z') goto yy400; @@ -5882,8 +5882,8 @@ yy273: } } yy274: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= 'D') { + yych = *++YYCURSOR; + if (yych <= 'D') { if (yych <= ')') { if (yych >= ')') goto yy102; } else { @@ -6621,8 +6621,8 @@ yy302: } } yy303: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '@') { + yych = *++YYCURSOR; + if (yych <= '@') { if (yych == ')') goto yy102; } else { if (yych <= 'Z') goto yy400; @@ -7703,8 +7703,8 @@ yy361: } } yy362: - ++YYCURSOR; - if ((yych = *YYCURSOR) == 'S') goto yy520; + yych = *++YYCURSOR; + if (yych == 'S') goto yy520; if (yych == 's') goto yy520; yy363: #line 1379 "parse_date.g.re" @@ -8017,7 +8017,7 @@ yy387: } } yy388: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy251; yy389: yych = *++YYCURSOR; @@ -8741,8 +8741,8 @@ yy441: } } yy442: - ++YYCURSOR; - if ((yych = *YYCURSOR) == ')') goto yy102; + yych = *++YYCURSOR; + if (yych == ')') goto yy102; yy443: #line 871 "parse_date.g.re" { @@ -9619,8 +9619,8 @@ yy503: } } yy504: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= 'U') { + yych = *++YYCURSOR; + if (yych <= 'U') { if (yych == 'I') goto yy674; } else { if (yych == 'W') goto yy505; @@ -9766,7 +9766,7 @@ yy519: if (yych == 's') goto yy689; goto yy53; yy520: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy363; yy521: yych = *++YYCURSOR; @@ -10041,25 +10041,9 @@ yy561: } yy562: yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '/') { - if (yych <= '.') goto yy53; - goto yy259; - } else { - if (yych == 'T') goto yy125; - goto yy53; - } - } else { - if (yych <= 's') { - if (yych <= '_') goto yy259; - if (yych <= '`') goto yy53; - goto yy559; - } else { - if (yych <= 't') goto yy561; - if (yych <= 'z') goto yy559; - goto yy53; - } - } + if (yych == 'T') goto yy125; + if (yych == 't') goto yy561; + goto yy560; yy563: yych = *++YYCURSOR; if (yych == 'B') goto yy609; @@ -10183,25 +10167,9 @@ yy573: goto yy560; yy574: yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '/') { - if (yych <= '.') goto yy53; - goto yy259; - } else { - if (yych == 'H') goto yy565; - goto yy53; - } - } else { - if (yych <= 'g') { - if (yych <= '_') goto yy259; - if (yych <= '`') goto yy53; - goto yy559; - } else { - if (yych <= 'h') goto yy568; - if (yych <= 'z') goto yy559; - goto yy53; - } - } + if (yych == 'H') goto yy565; + if (yych == 'h') goto yy568; + goto yy560; yy575: yych = *++YYCURSOR; if (yych == 'Y') goto yy704; @@ -10290,7 +10258,7 @@ yy583: TIMELIB_DEINIT; return TIMELIB_DATE_NO_DAY; } -#line 10294 "parse_date.g.c" +#line 10262 "parse_date.g.c" yy584: yych = *++YYCURSOR; if (yych <= '/') goto yy583; @@ -10333,7 +10301,7 @@ yy586: TIMELIB_DEINIT; return TIMELIB_SHORTDATE_WITH_TIME; } -#line 10337 "parse_date.g.c" +#line 10305 "parse_date.g.c" yy587: yyaccept = 16; yych = *(YYMARKER = ++YYCURSOR); @@ -10584,25 +10552,9 @@ yy617: goto yy560; yy618: yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '/') { - if (yych <= '.') goto yy53; - goto yy259; - } else { - if (yych == 'D') goto yy565; - goto yy53; - } - } else { - if (yych <= 'c') { - if (yych <= '_') goto yy259; - if (yych <= '`') goto yy53; - goto yy559; - } else { - if (yych <= 'd') goto yy568; - if (yych <= 'z') goto yy559; - goto yy53; - } - } + if (yych == 'D') goto yy565; + if (yych == 'd') goto yy568; + goto yy560; yy619: yych = *++YYCURSOR; if (yych == 'M') goto yy563; @@ -10625,7 +10577,7 @@ yy622: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 10629 "parse_date.g.c" +#line 10581 "parse_date.g.c" yy623: yych = *++YYCURSOR; if (yych == 'R') goto yy746; @@ -10703,8 +10655,8 @@ yy636: if (yych <= '9') goto yy753; goto yy192; yy637: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy638; + yych = *++YYCURSOR; + if (yych <= '/') goto yy638; if (yych <= '9') goto yy753; yy638: #line 1087 "parse_date.g.re" @@ -10719,7 +10671,7 @@ yy638: TIMELIB_DEINIT; return TIMELIB_DATE_FULL_POINTED; } -#line 10723 "parse_date.g.c" +#line 10675 "parse_date.g.c" yy639: yych = *++YYCURSOR; if (yych <= '/') goto yy197; @@ -10922,7 +10874,7 @@ yy663: TIMELIB_DEINIT; return TIMELIB_ISO_NOCOLON; } -#line 10926 "parse_date.g.c" +#line 10878 "parse_date.g.c" yy664: yyaccept = 18; yych = *(YYMARKER = ++YYCURSOR); @@ -11117,7 +11069,7 @@ yy674: yych = *++YYCURSOR; if (yych != 'I') goto yy505; yy675: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy505; yy676: yych = *++YYCURSOR; @@ -11242,7 +11194,7 @@ yy692: if (yych == 'y') goto yy520; goto yy53; yy693: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy223; yy694: yych = *++YYCURSOR; @@ -11349,7 +11301,7 @@ yy703: default: goto yy282; } yy704: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy275; yy705: yyaccept = 7; @@ -11403,7 +11355,7 @@ yy710: if (yych <= '9') goto yy801; goto yy53; yy711: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy129; yy712: yych = *++YYCURSOR; @@ -11412,25 +11364,9 @@ yy712: goto yy53; yy713: yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '/') { - if (yych <= '.') goto yy53; - goto yy259; - } else { - if (yych == 'Y') goto yy125; - goto yy53; - } - } else { - if (yych <= 'x') { - if (yych <= '_') goto yy259; - if (yych <= '`') goto yy53; - goto yy559; - } else { - if (yych <= 'y') goto yy561; - if (yych <= 'z') goto yy559; - goto yy53; - } - } + if (yych == 'Y') goto yy125; + if (yych == 'y') goto yy561; + goto yy560; yy714: yych = *++YYCURSOR; if (yych == 'Y') goto yy802; @@ -11592,25 +11528,9 @@ yy742: goto yy53; yy743: yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '/') { - if (yych <= '.') goto yy53; - goto yy259; - } else { - if (yych == 'R') goto yy125; - goto yy53; - } - } else { - if (yych <= 'q') { - if (yych <= '_') goto yy259; - if (yych <= '`') goto yy53; - goto yy559; - } else { - if (yych <= 'r') goto yy561; - if (yych <= 'z') goto yy559; - goto yy53; - } - } + if (yych == 'R') goto yy125; + if (yych == 'r') goto yy561; + goto yy560; yy744: yych = *++YYCURSOR; if (yych == 'U') goto yy829; @@ -11642,7 +11562,7 @@ yy749: if (yych == 'd') goto yy834; goto yy560; yy750: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy474; yy751: ++YYCURSOR; @@ -11831,7 +11751,7 @@ yy775: TIMELIB_DEINIT; return TIMELIB_PG_YEARDAY; } -#line 11835 "parse_date.g.c" +#line 11755 "parse_date.g.c" yy776: yyaccept = 19; yych = *(YYMARKER = ++YYCURSOR); @@ -12014,8 +11934,8 @@ yy789: if (yych == 't') goto yy782; goto yy505; yy790: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy791; + yych = *++YYCURSOR; + if (yych <= '/') goto yy791; if (yych <= '7') goto yy869; yy791: #line 1219 "parse_date.g.re" @@ -12036,7 +11956,7 @@ yy791: TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 12040 "parse_date.g.c" +#line 11960 "parse_date.g.c" yy792: yych = *++YYCURSOR; if (yych == 'G') goto yy871; @@ -12096,11 +12016,11 @@ yy800: if (yych == '0') goto yy878; goto yy586; yy801: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy586; yy802: - ++YYCURSOR; - if ((yych = *YYCURSOR) == 'S') goto yy879; + yych = *++YYCURSOR; + if (yych == 'S') goto yy879; if (yych == 's') goto yy879; yy803: #line 1323 "parse_date.g.re" @@ -12119,7 +12039,7 @@ yy803: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 12123 "parse_date.g.c" +#line 12043 "parse_date.g.c" yy804: yych = *++YYCURSOR; if (yych == 'T') goto yy880; @@ -12449,25 +12369,9 @@ yy829: goto yy53; yy830: yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '/') { - if (yych <= '.') goto yy53; - goto yy259; - } else { - if (yych == 'S') goto yy565; - goto yy53; - } - } else { - if (yych <= 'r') { - if (yych <= '_') goto yy259; - if (yych <= '`') goto yy53; - goto yy559; - } else { - if (yych <= 's') goto yy568; - if (yych <= 'z') goto yy559; - goto yy53; - } - } + if (yych == 'S') goto yy565; + if (yych == 's') goto yy568; + goto yy560; yy831: yych = *++YYCURSOR; if (yych == 'W') goto yy899; @@ -12489,10 +12393,10 @@ yy834: if (yych == 'a') goto yy903; goto yy560; yy835: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy638; yy836: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy197; yy837: yych = *++YYCURSOR; @@ -12686,7 +12590,7 @@ yy852: goto yy505; } yy853: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy775; yy854: yyaccept = 22; @@ -12715,7 +12619,7 @@ yy855: TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 12719 "parse_date.g.c" +#line 12623 "parse_date.g.c" yy856: yyaccept = 22; yych = *(YYMARKER = ++YYCURSOR); @@ -12809,7 +12713,7 @@ yy860: TIMELIB_DEINIT; return TIMELIB_DATE_NOCOLON; } -#line 12813 "parse_date.g.c" +#line 12717 "parse_date.g.c" yy861: yych = *++YYCURSOR; if (yych <= '/') goto yy53; @@ -12871,7 +12775,7 @@ yy869: TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 12875 "parse_date.g.c" +#line 12779 "parse_date.g.c" yy871: yych = *++YYCURSOR; if (yych == 'H') goto yy926; @@ -12893,8 +12797,8 @@ yy874: if (yych <= '1') goto yy927; goto yy53; yy875: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy876; + yych = *++YYCURSOR; + if (yych <= '/') goto yy876; if (yych <= '9') goto yy929; yy876: #line 1238 "parse_date.g.re" @@ -12909,7 +12813,7 @@ yy876: TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 12913 "parse_date.g.c" +#line 12817 "parse_date.g.c" yy877: yyaccept = 16; yych = *(YYMARKER = ++YYCURSOR); @@ -12974,7 +12878,7 @@ yy878: } } yy879: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy803; yy880: yych = *++YYCURSOR; @@ -13110,7 +13014,7 @@ yy900: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 13114 "parse_date.g.c" +#line 13018 "parse_date.g.c" yy901: yyaccept = 24; yych = *(YYMARKER = ++YYCURSOR); @@ -13387,7 +13291,7 @@ yy927: TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 13391 "parse_date.g.c" +#line 13295 "parse_date.g.c" yy929: yych = *++YYCURSOR; if (yych <= '/') goto yy876; @@ -13515,7 +13419,7 @@ yy947: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 13519 "parse_date.g.c" +#line 13423 "parse_date.g.c" yy948: yyaccept = 25; yych = *(YYMARKER = ++YYCURSOR); @@ -13571,7 +13475,7 @@ yy954: } } yy955: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy855; yy956: yyaccept = 22; @@ -13763,7 +13667,7 @@ yy981: if (yych <= '2') goto yy1000; goto yy53; yy982: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy876; yy983: yych = *++YYCURSOR; @@ -13995,8 +13899,8 @@ yy1018: if (yych <= '5') goto yy1024; goto yy53; yy1019: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy1020; + yych = *++YYCURSOR; + if (yych <= '/') goto yy1020; if (yych <= '9') goto yy1022; yy1020: #line 1163 "parse_date.g.re" @@ -14022,12 +13926,12 @@ yy1020: TIMELIB_DEINIT; return TIMELIB_XMLRPC_SOAP; } -#line 14026 "parse_date.g.c" +#line 13930 "parse_date.g.c" yy1021: yych = *++YYCURSOR; if (yych != '0') goto yy1020; yy1022: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy1020; yy1023: yych = *++YYCURSOR; @@ -14133,8 +14037,8 @@ yy1040: goto yy1020; } yy1042: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy1043; + yych = *++YYCURSOR; + if (yych <= '/') goto yy1043; if (yych <= '9') goto yy1045; if (yych <= ':') goto yy1047; yy1043: @@ -14156,7 +14060,7 @@ yy1043: TIMELIB_DEINIT; return TIMELIB_CLF; } -#line 14160 "parse_date.g.c" +#line 14064 "parse_date.g.c" yy1044: yych = *++YYCURSOR; if (yych <= '5') { @@ -14192,7 +14096,7 @@ yy1048: if (yych <= '/') goto yy1043; if (yych >= ':') goto yy1043; yy1049: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy1043; yy1050: yych = *++YYCURSOR; @@ -14217,8 +14121,8 @@ yy1052: if (yych <= '9') goto yy1022; if (yych >= ';') goto yy1020; yy1053: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy1020; + yych = *++YYCURSOR; + if (yych <= '/') goto yy1020; if (yych <= '5') goto yy1019; if (yych <= '9') goto yy1022; goto yy1020; @@ -14229,6 +14133,7 @@ yy1053: #define YYMAXFILL 26 + timelib_time* timelib_strtotime(char *s, int len, int *errors, timelib_tzdb *tzdb) { Scanner in; diff --git a/test/parse_date.s.c b/test/parse_date.s.c index 82b5670..77a9cdb 100644 --- a/test/parse_date.s.c +++ b/test/parse_date.s.c @@ -869,7 +869,7 @@ yy9: goto yy5; } yy10: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy7; yy11: yyaccept = 1; @@ -1192,8 +1192,8 @@ yy16: if (yych <= '9') goto yy99; goto yy5; yy17: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= 'U') { + yych = *++YYCURSOR; + if (yych <= 'U') { if (yych <= 'F') { if (yych == ')') goto yy102; if (yych >= 'A') goto yy103; @@ -3002,7 +3002,7 @@ yy101: } #line 3004 "parse_date.s.c" yy102: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy18; yy103: yych = *++YYCURSOR; @@ -3536,8 +3536,8 @@ yy127: if (yych <= '9') goto yy126; goto yy18; yy128: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy282; + yych = *++YYCURSOR; + if (yych <= '/') goto yy282; if (yych <= '9') goto yy283; goto yy282; yy129: @@ -5148,8 +5148,8 @@ yy220: if (yych <= '/') goto yy53; if (yych >= ':') goto yy53; yy222: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy223; + yych = *++YYCURSOR; + if (yych <= '/') goto yy223; if (yych <= '9') goto yy369; yy223: #line 1073 "parse_date.s.re" @@ -5393,8 +5393,8 @@ yy249: if (yych == 'M') goto yy250; if (yych != 'm') goto yy53; yy250: - ++YYCURSOR; - if ((yych = *YYCURSOR) == '.') goto yy388; + yych = *++YYCURSOR; + if (yych == '.') goto yy388; yy251: #line 929 "parse_date.s.re" { @@ -5463,8 +5463,8 @@ yy254: goto yy18; } yy255: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '@') { + yych = *++YYCURSOR; + if (yych <= '@') { if (yych == ')') goto yy102; } else { if (yych <= 'Z') goto yy400; @@ -5930,8 +5930,8 @@ yy273: } } yy274: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= 'D') { + yych = *++YYCURSOR; + if (yych <= 'D') { if (yych <= ')') { if (yych >= ')') goto yy102; } else { @@ -6648,8 +6648,8 @@ yy302: } } yy303: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '@') { + yych = *++YYCURSOR; + if (yych <= '@') { if (yych == ')') goto yy102; } else { if (yych <= 'Z') goto yy400; @@ -7736,8 +7736,8 @@ yy361: } } yy362: - ++YYCURSOR; - if ((yych = *YYCURSOR) == 'S') goto yy520; + yych = *++YYCURSOR; + if (yych == 'S') goto yy520; if (yych == 's') goto yy520; yy363: #line 1379 "parse_date.s.re" @@ -8050,7 +8050,7 @@ yy387: } } yy388: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy251; yy389: yych = *++YYCURSOR; @@ -8761,8 +8761,8 @@ yy441: } } yy442: - ++YYCURSOR; - if ((yych = *YYCURSOR) == ')') goto yy102; + yych = *++YYCURSOR; + if (yych == ')') goto yy102; yy443: #line 871 "parse_date.s.re" { @@ -9628,8 +9628,8 @@ yy503: } } yy504: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= 'U') { + yych = *++YYCURSOR; + if (yych <= 'U') { if (yych == 'I') goto yy674; } else { if (yych == 'W') goto yy505; @@ -9775,7 +9775,7 @@ yy519: if (yych == 's') goto yy689; goto yy53; yy520: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy363; yy521: yych = *++YYCURSOR; @@ -10053,25 +10053,9 @@ yy561: } yy562: yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '/') { - if (yych <= '.') goto yy53; - goto yy259; - } else { - if (yych == 'T') goto yy125; - goto yy53; - } - } else { - if (yych <= 's') { - if (yych <= '_') goto yy259; - if (yych <= '`') goto yy53; - goto yy559; - } else { - if (yych <= 't') goto yy561; - if (yych <= 'z') goto yy559; - goto yy53; - } - } + if (yych == 'T') goto yy125; + if (yych == 't') goto yy561; + goto yy560; yy563: yych = *++YYCURSOR; if (yych == 'B') goto yy609; @@ -10181,25 +10165,9 @@ yy573: goto yy560; yy574: yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '/') { - if (yych <= '.') goto yy53; - goto yy259; - } else { - if (yych == 'H') goto yy565; - goto yy53; - } - } else { - if (yych <= 'g') { - if (yych <= '_') goto yy259; - if (yych <= '`') goto yy53; - goto yy559; - } else { - if (yych <= 'h') goto yy568; - if (yych <= 'z') goto yy559; - goto yy53; - } - } + if (yych == 'H') goto yy565; + if (yych == 'h') goto yy568; + goto yy560; yy575: yych = *++YYCURSOR; if (yych == 'Y') goto yy704; @@ -10288,7 +10256,7 @@ yy583: TIMELIB_DEINIT; return TIMELIB_DATE_NO_DAY; } -#line 10292 "parse_date.s.c" +#line 10260 "parse_date.s.c" yy584: yych = *++YYCURSOR; if (yych <= '/') goto yy583; @@ -10331,7 +10299,7 @@ yy586: TIMELIB_DEINIT; return TIMELIB_SHORTDATE_WITH_TIME; } -#line 10335 "parse_date.s.c" +#line 10303 "parse_date.s.c" yy587: yyaccept = 16; yych = *(YYMARKER = ++YYCURSOR); @@ -10582,25 +10550,9 @@ yy617: goto yy560; yy618: yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '/') { - if (yych <= '.') goto yy53; - goto yy259; - } else { - if (yych == 'D') goto yy565; - goto yy53; - } - } else { - if (yych <= 'c') { - if (yych <= '_') goto yy259; - if (yych <= '`') goto yy53; - goto yy559; - } else { - if (yych <= 'd') goto yy568; - if (yych <= 'z') goto yy559; - goto yy53; - } - } + if (yych == 'D') goto yy565; + if (yych == 'd') goto yy568; + goto yy560; yy619: yych = *++YYCURSOR; if (yych == 'M') goto yy563; @@ -10623,7 +10575,7 @@ yy622: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 10627 "parse_date.s.c" +#line 10579 "parse_date.s.c" yy623: yych = *++YYCURSOR; if (yych == 'R') goto yy746; @@ -10701,8 +10653,8 @@ yy636: if (yych <= '9') goto yy753; goto yy192; yy637: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy638; + yych = *++YYCURSOR; + if (yych <= '/') goto yy638; if (yych <= '9') goto yy753; yy638: #line 1087 "parse_date.s.re" @@ -10717,7 +10669,7 @@ yy638: TIMELIB_DEINIT; return TIMELIB_DATE_FULL_POINTED; } -#line 10721 "parse_date.s.c" +#line 10673 "parse_date.s.c" yy639: yych = *++YYCURSOR; if (yych <= '/') goto yy197; @@ -10913,7 +10865,7 @@ yy663: TIMELIB_DEINIT; return TIMELIB_ISO_NOCOLON; } -#line 10917 "parse_date.s.c" +#line 10869 "parse_date.s.c" yy664: yyaccept = 18; yych = *(YYMARKER = ++YYCURSOR); @@ -11080,7 +11032,7 @@ yy674: yych = *++YYCURSOR; if (yych != 'I') goto yy505; yy675: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy505; yy676: yych = *++YYCURSOR; @@ -11205,7 +11157,7 @@ yy692: if (yych == 'y') goto yy520; goto yy53; yy693: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy223; yy694: yych = *++YYCURSOR; @@ -11312,7 +11264,7 @@ yy703: default: goto yy282; } yy704: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy275; yy705: yyaccept = 7; @@ -11366,7 +11318,7 @@ yy710: if (yych <= '9') goto yy801; goto yy53; yy711: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy129; yy712: yych = *++YYCURSOR; @@ -11375,25 +11327,9 @@ yy712: goto yy53; yy713: yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '/') { - if (yych <= '.') goto yy53; - goto yy259; - } else { - if (yych == 'Y') goto yy125; - goto yy53; - } - } else { - if (yych <= 'x') { - if (yych <= '_') goto yy259; - if (yych <= '`') goto yy53; - goto yy559; - } else { - if (yych <= 'y') goto yy561; - if (yych <= 'z') goto yy559; - goto yy53; - } - } + if (yych == 'Y') goto yy125; + if (yych == 'y') goto yy561; + goto yy560; yy714: yych = *++YYCURSOR; if (yych == 'Y') goto yy802; @@ -11555,25 +11491,9 @@ yy742: goto yy53; yy743: yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '/') { - if (yych <= '.') goto yy53; - goto yy259; - } else { - if (yych == 'R') goto yy125; - goto yy53; - } - } else { - if (yych <= 'q') { - if (yych <= '_') goto yy259; - if (yych <= '`') goto yy53; - goto yy559; - } else { - if (yych <= 'r') goto yy561; - if (yych <= 'z') goto yy559; - goto yy53; - } - } + if (yych == 'R') goto yy125; + if (yych == 'r') goto yy561; + goto yy560; yy744: yych = *++YYCURSOR; if (yych == 'U') goto yy829; @@ -11605,7 +11525,7 @@ yy749: if (yych == 'd') goto yy834; goto yy560; yy750: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy474; yy751: ++YYCURSOR; @@ -11787,7 +11707,7 @@ yy775: TIMELIB_DEINIT; return TIMELIB_PG_YEARDAY; } -#line 11791 "parse_date.s.c" +#line 11711 "parse_date.s.c" yy776: yyaccept = 19; yych = *(YYMARKER = ++YYCURSOR); @@ -11949,8 +11869,8 @@ yy789: if (yych == 't') goto yy782; goto yy505; yy790: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy791; + yych = *++YYCURSOR; + if (yych <= '/') goto yy791; if (yych <= '7') goto yy869; yy791: #line 1219 "parse_date.s.re" @@ -11971,7 +11891,7 @@ yy791: TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 11975 "parse_date.s.c" +#line 11895 "parse_date.s.c" yy792: yych = *++YYCURSOR; if (yych == 'G') goto yy871; @@ -12031,11 +11951,11 @@ yy800: if (yych == '0') goto yy878; goto yy586; yy801: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy586; yy802: - ++YYCURSOR; - if ((yych = *YYCURSOR) == 'S') goto yy879; + yych = *++YYCURSOR; + if (yych == 'S') goto yy879; if (yych == 's') goto yy879; yy803: #line 1323 "parse_date.s.re" @@ -12054,7 +11974,7 @@ yy803: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 12058 "parse_date.s.c" +#line 11978 "parse_date.s.c" yy804: yych = *++YYCURSOR; if (yych == 'T') goto yy880; @@ -12384,25 +12304,9 @@ yy829: goto yy53; yy830: yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '/') { - if (yych <= '.') goto yy53; - goto yy259; - } else { - if (yych == 'S') goto yy565; - goto yy53; - } - } else { - if (yych <= 'r') { - if (yych <= '_') goto yy259; - if (yych <= '`') goto yy53; - goto yy559; - } else { - if (yych <= 's') goto yy568; - if (yych <= 'z') goto yy559; - goto yy53; - } - } + if (yych == 'S') goto yy565; + if (yych == 's') goto yy568; + goto yy560; yy831: yych = *++YYCURSOR; if (yych == 'W') goto yy899; @@ -12424,10 +12328,10 @@ yy834: if (yych == 'a') goto yy903; goto yy560; yy835: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy638; yy836: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy197; yy837: yych = *++YYCURSOR; @@ -12621,7 +12525,7 @@ yy852: goto yy505; } yy853: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy775; yy854: yyaccept = 22; @@ -12650,7 +12554,7 @@ yy855: TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 12654 "parse_date.s.c" +#line 12558 "parse_date.s.c" yy856: yyaccept = 22; yych = *(YYMARKER = ++YYCURSOR); @@ -12737,7 +12641,7 @@ yy860: TIMELIB_DEINIT; return TIMELIB_DATE_NOCOLON; } -#line 12741 "parse_date.s.c" +#line 12645 "parse_date.s.c" yy861: yych = *++YYCURSOR; if (yych <= '/') goto yy53; @@ -12799,7 +12703,7 @@ yy869: TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 12803 "parse_date.s.c" +#line 12707 "parse_date.s.c" yy871: yych = *++YYCURSOR; if (yych == 'H') goto yy926; @@ -12821,8 +12725,8 @@ yy874: if (yych <= '1') goto yy927; goto yy53; yy875: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy876; + yych = *++YYCURSOR; + if (yych <= '/') goto yy876; if (yych <= '9') goto yy929; yy876: #line 1238 "parse_date.s.re" @@ -12837,7 +12741,7 @@ yy876: TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 12841 "parse_date.s.c" +#line 12745 "parse_date.s.c" yy877: yyaccept = 16; yych = *(YYMARKER = ++YYCURSOR); @@ -12887,7 +12791,7 @@ yy878: } } yy879: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy803; yy880: yych = *++YYCURSOR; @@ -13023,7 +12927,7 @@ yy900: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 13027 "parse_date.s.c" +#line 12931 "parse_date.s.c" yy901: yyaccept = 24; yych = *(YYMARKER = ++YYCURSOR); @@ -13300,7 +13204,7 @@ yy927: TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 13304 "parse_date.s.c" +#line 13208 "parse_date.s.c" yy929: yych = *++YYCURSOR; if (yych <= '/') goto yy876; @@ -13428,7 +13332,7 @@ yy947: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 13432 "parse_date.s.c" +#line 13336 "parse_date.s.c" yy948: yyaccept = 25; yych = *(YYMARKER = ++YYCURSOR); @@ -13484,7 +13388,7 @@ yy954: } } yy955: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy855; yy956: yyaccept = 22; @@ -13676,7 +13580,7 @@ yy981: if (yych <= '2') goto yy1000; goto yy53; yy982: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy876; yy983: yych = *++YYCURSOR; @@ -13908,8 +13812,8 @@ yy1018: if (yych <= '5') goto yy1024; goto yy53; yy1019: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy1020; + yych = *++YYCURSOR; + if (yych <= '/') goto yy1020; if (yych <= '9') goto yy1022; yy1020: #line 1163 "parse_date.s.re" @@ -13935,12 +13839,12 @@ yy1020: TIMELIB_DEINIT; return TIMELIB_XMLRPC_SOAP; } -#line 13939 "parse_date.s.c" +#line 13843 "parse_date.s.c" yy1021: yych = *++YYCURSOR; if (yych != '0') goto yy1020; yy1022: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy1020; yy1023: yych = *++YYCURSOR; @@ -14046,8 +13950,8 @@ yy1040: goto yy1020; } yy1042: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy1043; + yych = *++YYCURSOR; + if (yych <= '/') goto yy1043; if (yych <= '9') goto yy1045; if (yych <= ':') goto yy1047; yy1043: @@ -14069,7 +13973,7 @@ yy1043: TIMELIB_DEINIT; return TIMELIB_CLF; } -#line 14073 "parse_date.s.c" +#line 13977 "parse_date.s.c" yy1044: yych = *++YYCURSOR; if (yych <= '5') { @@ -14105,7 +14009,7 @@ yy1048: if (yych <= '/') goto yy1043; if (yych >= ':') goto yy1043; yy1049: - yych = *++YYCURSOR; + ++YYCURSOR; goto yy1043; yy1050: yych = *++YYCURSOR; @@ -14130,8 +14034,8 @@ yy1052: if (yych <= '9') goto yy1022; if (yych >= ';') goto yy1020; yy1053: - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy1020; + yych = *++YYCURSOR; + if (yych <= '/') goto yy1020; if (yych <= '5') goto yy1019; if (yych <= '9') goto yy1022; goto yy1020; @@ -14142,6 +14046,7 @@ yy1053: #define YYMAXFILL 26 + timelib_time* timelib_strtotime(char *s, int len, int *errors, timelib_tzdb *tzdb) { Scanner in; diff --git a/test/parse_date_1_78.db.c b/test/parse_date_1_78.db.c index faa75cf..504d42d 100644 --- a/test/parse_date_1_78.db.c +++ b/test/parse_date_1_78.db.c @@ -1026,7 +1026,7 @@ yy9: } yy10: YYDEBUG(10, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy7; yy11: YYDEBUG(11, *YYCURSOR); @@ -1301,8 +1301,8 @@ yy16: goto yy5; yy17: YYDEBUG(17, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= 'U') { + yych = *++YYCURSOR; + if (yych <= 'U') { if (yych <= 'F') { if (yych == ')') goto yy105; if (yych >= 'A') goto yy106; @@ -3452,7 +3452,7 @@ yy104: #line 3453 "parse_date_1_78.db.c" yy105: YYDEBUG(105, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy18; yy106: YYDEBUG(106, *YYCURSOR); @@ -6050,8 +6050,8 @@ yy233: } yy235: YYDEBUG(235, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy236; + yych = *++YYCURSOR; + if (yych <= '/') goto yy236; if (yych <= '9') goto yy399; yy236: YYDEBUG(236, *YYCURSOR); @@ -6428,8 +6428,8 @@ yy266: } yy267: YYDEBUG(267, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '@') { + yych = *++YYCURSOR; + if (yych <= '@') { if (yych == ')') goto yy105; } else { if (yych <= 'Z') goto yy433; @@ -6992,8 +6992,8 @@ yy286: } yy287: YYDEBUG(287, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= 'D') { + yych = *++YYCURSOR; + if (yych <= 'D') { if (yych <= ')') { if (yych >= ')') goto yy105; } else { @@ -7918,8 +7918,8 @@ yy321: } yy322: YYDEBUG(322, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '@') { + yych = *++YYCURSOR; + if (yych <= '@') { if (yych == ')') goto yy105; } else { if (yych <= 'Z') goto yy433; @@ -9376,8 +9376,8 @@ yy391: } yy392: YYDEBUG(392, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) == 'S') goto yy575; + yych = *++YYCURSOR; + if (yych == 'S') goto yy575; if (yych == 's') goto yy575; yy393: YYDEBUG(393, *YYCURSOR); @@ -10939,8 +10939,8 @@ yy487: } yy488: YYDEBUG(488, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '@') { + yych = *++YYCURSOR; + if (yych <= '@') { if (yych == ')') goto yy105; } else { if (yych <= 'Z') goto yy611; @@ -12244,8 +12244,8 @@ yy558: } yy559: YYDEBUG(559, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= 'U') { + yych = *++YYCURSOR; + if (yych <= 'U') { if (yych == 'I') goto yy743; } else { if (yych == 'W') goto yy560; @@ -12407,7 +12407,7 @@ yy574: goto yy54; yy575: YYDEBUG(575, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy393; yy576: YYDEBUG(576, *YYCURSOR); @@ -13957,8 +13957,8 @@ yy680: goto yy387; yy681: YYDEBUG(681, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '@') { + yych = *++YYCURSOR; + if (yych <= '@') { if (yych == ')') goto yy105; } else { if (yych <= 'Z') goto yy777; @@ -14915,7 +14915,7 @@ yy743: if (yych != 'I') goto yy560; yy744: YYDEBUG(744, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy560; yy745: YYDEBUG(745, *YYCURSOR); @@ -15059,7 +15059,7 @@ yy761: goto yy54; yy762: YYDEBUG(762, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy236; yy763: YYDEBUG(763, *YYCURSOR); @@ -15810,7 +15810,7 @@ yy810: } yy811: YYDEBUG(811, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy132; yy812: YYDEBUG(812, *YYCURSOR); @@ -16359,7 +16359,7 @@ yy849: goto yy54; yy850: YYDEBUG(850, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy528; yy851: YYDEBUG(851, *YYCURSOR); @@ -17069,7 +17069,7 @@ yy915: goto yy651; yy916: YYDEBUG(916, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy651; yy917: YYDEBUG(917, *YYCURSOR); @@ -17342,28 +17342,12 @@ yy949: yy950: YYDEBUG(950, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '.') { - if (yych <= '\t') { - if (yych <= 0x08) goto yy54; - goto yy786; - } else { - if (yych == ' ') goto yy786; - goto yy54; - } - } else { - if (yych <= '_') { - if (yych <= '/') goto yy272; - if (yych <= '^') goto yy54; - goto yy272; - } else { - if (yych <= '`') goto yy54; - if (yych <= 'z') goto yy901; - goto yy54; - } - } + if (yych == '\t') goto yy786; + if (yych == ' ') goto yy786; + goto yy902; yy951: YYDEBUG(951, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy732; yy952: YYDEBUG(952, *YYCURSOR); @@ -17373,7 +17357,7 @@ yy952: goto yy54; yy953: YYDEBUG(953, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy288; yy954: YYDEBUG(954, *YYCURSOR); @@ -17467,10 +17451,10 @@ yy963: TIMELIB_DEINIT; return TIMELIB_DATE_FULL_POINTED; } -#line 17471 "parse_date_1_78.db.c" +#line 17455 "parse_date_1_78.db.c" yy965: YYDEBUG(965, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy209; yy966: YYDEBUG(966, *YYCURSOR); @@ -17508,7 +17492,7 @@ yy968: TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 17512 "parse_date_1_78.db.c" +#line 17496 "parse_date_1_78.db.c" yy969: YYDEBUG(969, *YYCURSOR); yyaccept = 15; @@ -17708,7 +17692,7 @@ yy983: } yy984: YYDEBUG(984, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy877; yy985: YYDEBUG(985, *YYCURSOR); @@ -17739,7 +17723,7 @@ yy986: TIMELIB_DEINIT; return TIMELIB_ISO_DATE; } -#line 17743 "parse_date_1_78.db.c" +#line 17727 "parse_date_1_78.db.c" yy987: YYDEBUG(987, *YYCURSOR); yyaccept = 26; @@ -17849,7 +17833,7 @@ yy991: TIMELIB_DEINIT; return TIMELIB_DATE_NOCOLON; } -#line 17853 "parse_date_1_78.db.c" +#line 17837 "parse_date_1_78.db.c" yy992: YYDEBUG(992, *YYCURSOR); yych = *++YYCURSOR; @@ -17925,7 +17909,7 @@ yy1001: TIMELIB_DEINIT; return TIMELIB_ISO_WEEK; } -#line 17929 "parse_date_1_78.db.c" +#line 17913 "parse_date_1_78.db.c" yy1003: YYDEBUG(1003, *YYCURSOR); yych = *++YYCURSOR; @@ -17971,8 +17955,8 @@ yy1008: goto yy54; yy1009: YYDEBUG(1009, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy1010; + yych = *++YYCURSOR; + if (yych <= '/') goto yy1010; if (yych <= '9') goto yy1070; yy1010: YYDEBUG(1010, *YYCURSOR); @@ -17988,7 +17972,7 @@ yy1010: TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 17992 "parse_date_1_78.db.c" +#line 17976 "parse_date_1_78.db.c" yy1011: YYDEBUG(1011, *YYCURSOR); yych = *++YYCURSOR; @@ -18176,8 +18160,8 @@ yy1018: } yy1019: YYDEBUG(1019, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) == 'S') goto yy1086; + yych = *++YYCURSOR; + if (yych == 'S') goto yy1086; if (yych == 's') goto yy1086; yy1020: YYDEBUG(1020, *YYCURSOR); @@ -18197,7 +18181,7 @@ yy1020: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 18201 "parse_date_1_78.db.c" +#line 18185 "parse_date_1_78.db.c" yy1021: YYDEBUG(1021, *YYCURSOR); yych = *++YYCURSOR; @@ -18330,10 +18314,10 @@ yy1033: TIMELIB_DEINIT; return TIMELIB_LF_DAY_OF_MONTH; } -#line 18334 "parse_date_1_78.db.c" +#line 18318 "parse_date_1_78.db.c" yy1034: YYDEBUG(1034, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy682; yy1035: YYDEBUG(1035, *YYCURSOR); @@ -18357,25 +18341,9 @@ yy1036: yy1037: YYDEBUG(1037, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '.') { - if (yych <= '\t') { - if (yych <= 0x08) goto yy54; - goto yy663; - } else { - if (yych == ' ') goto yy663; - goto yy54; - } - } else { - if (yych <= '_') { - if (yych <= '/') goto yy272; - if (yych <= '^') goto yy54; - goto yy272; - } else { - if (yych <= '`') goto yy54; - if (yych <= 'z') goto yy901; - goto yy54; - } - } + if (yych == '\t') goto yy663; + if (yych == ' ') goto yy663; + goto yy902; yy1038: YYDEBUG(1038, *YYCURSOR); ++YYCURSOR; @@ -18392,7 +18360,7 @@ yy1039: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 18396 "parse_date_1_78.db.c" +#line 18364 "parse_date_1_78.db.c" yy1040: YYDEBUG(1040, *YYCURSOR); yyaccept = 30; @@ -18700,7 +18668,7 @@ yy1068: TIMELIB_DEINIT; return TIMELIB_PG_TEXT; } -#line 18704 "parse_date_1_78.db.c" +#line 18672 "parse_date_1_78.db.c" yy1070: YYDEBUG(1070, *YYCURSOR); yych = *++YYCURSOR; @@ -18925,7 +18893,7 @@ yy1083: TIMELIB_DEINIT; return TIMELIB_SHORTDATE_WITH_TIME; } -#line 18929 "parse_date_1_78.db.c" +#line 18897 "parse_date_1_78.db.c" yy1085: YYDEBUG(1085, *YYCURSOR); yych = *++YYCURSOR; @@ -18939,7 +18907,7 @@ yy1085: } yy1086: YYDEBUG(1086, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy1020; yy1087: YYDEBUG(1087, *YYCURSOR); @@ -19043,7 +19011,7 @@ yy1097: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 19047 "parse_date_1_78.db.c" +#line 19015 "parse_date_1_78.db.c" yy1098: YYDEBUG(1098, *YYCURSOR); yych = *++YYCURSOR; @@ -19066,7 +19034,7 @@ yy1100: TIMELIB_DEINIT; return TIMELIB_RELATIVE; } -#line 19070 "parse_date_1_78.db.c" +#line 19038 "parse_date_1_78.db.c" yy1101: YYDEBUG(1101, *YYCURSOR); yyaccept = 32; @@ -19142,7 +19110,7 @@ yy1109: } yy1110: YYDEBUG(1110, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy986; yy1111: YYDEBUG(1111, *YYCURSOR); @@ -19501,7 +19469,7 @@ yy1147: } yy1148: YYDEBUG(1148, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy1010; yy1149: YYDEBUG(1149, *YYCURSOR); @@ -19590,7 +19558,7 @@ yy1155: goto yy54; yy1156: YYDEBUG(1156, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy1033; yy1157: YYDEBUG(1157, *YYCURSOR); @@ -19685,7 +19653,7 @@ yy1168: TIMELIB_DEINIT; return TIMELIB_TIME24_WITH_ZONE; } -#line 19689 "parse_date_1_78.db.c" +#line 19657 "parse_date_1_78.db.c" yy1170: YYDEBUG(1170, *YYCURSOR); yych = *++YYCURSOR; @@ -19858,8 +19826,8 @@ yy1188: goto yy54; yy1189: YYDEBUG(1189, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy1190; + yych = *++YYCURSOR; + if (yych <= '/') goto yy1190; if (yych <= '9') goto yy1192; yy1190: YYDEBUG(1190, *YYCURSOR); @@ -19888,14 +19856,14 @@ yy1190: TIMELIB_DEINIT; return TIMELIB_XMLRPC_SOAP; } -#line 19892 "parse_date_1_78.db.c" +#line 19860 "parse_date_1_78.db.c" yy1191: YYDEBUG(1191, *YYCURSOR); yych = *++YYCURSOR; if (yych != '0') goto yy1190; yy1192: YYDEBUG(1192, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy1190; yy1193: YYDEBUG(1193, *YYCURSOR); @@ -20078,8 +20046,8 @@ yy1215: } yy1217: YYDEBUG(1217, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '/') goto yy1218; + yych = *++YYCURSOR; + if (yych <= '/') goto yy1218; if (yych <= '9') goto yy1220; if (yych <= ':') goto yy1224; yy1218: @@ -20104,7 +20072,7 @@ yy1218: TIMELIB_DEINIT; return TIMELIB_CLF; } -#line 20108 "parse_date_1_78.db.c" +#line 20076 "parse_date_1_78.db.c" yy1219: YYDEBUG(1219, *YYCURSOR); yych = *++YYCURSOR; @@ -20156,7 +20124,7 @@ yy1225: if (yych >= ':') goto yy1218; yy1226: YYDEBUG(1226, *YYCURSOR); - yych = *++YYCURSOR; + ++YYCURSOR; goto yy1218; yy1227: YYDEBUG(1227, *YYCURSOR); @@ -20204,8 +20172,8 @@ yy1232: goto yy1190; yy1233: YYDEBUG(1233, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) == '+') goto yy1222; + yych = *++YYCURSOR; + if (yych == '+') goto yy1222; if (yych == '-') goto yy1222; goto yy54; } @@ -20215,6 +20183,7 @@ yy1233: #define YYMAXFILL 30 + timelib_time* timelib_strtotime(char *s, int len, struct timelib_error_container **errors, const timelib_tzdb *tzdb) { Scanner in; diff --git a/test/php20140822_zend_language_scanner.igcd--flex-syntax.c b/test/php20140822_zend_language_scanner.igcd--flex-syntax.c index e75a98f..e60c566 100644 --- a/test/php20140822_zend_language_scanner.igcd--flex-syntax.c +++ b/test/php20140822_zend_language_scanner.igcd--flex-syntax.c @@ -74,6 +74,7 @@ /* perform sanity check. If this message is triggered you should increase the ZEND_MMAP_AHEAD value in the zend_streams.h file */ #define YYMAXFILL 16 + #if ZEND_MMAP_AHEAD < YYMAXFILL # error ZEND_MMAP_AHEAD should be greater than or equal to YYMAXFILL #endif @@ -1022,49 +1023,85 @@ yymore_restart: }; goto *yyctable[YYGETCONDITION()]; /* *********************************** */ -yyc_INITIAL: +yyc_ST_IN_SCRIPTING: { static const unsigned char yybm[] = { 0, 0, 0, 0, 0, 0, 0, 0, - 0, 128, 128, 0, 0, 128, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 128, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 0, 36, 4, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 36, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 216, 216, 152, 152, 152, 152, 152, 152, + 152, 152, 0, 0, 0, 0, 0, 0, + 0, 144, 144, 144, 144, 144, 144, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 16, + 0, 144, 144, 144, 144, 144, 144, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, }; YYDEBUG(1, *YYCURSOR); - YYFILL(8); + YYFILL(16); yych = *YYCURSOR; - if (yych == '<') goto yy5; + { + static void *yytarget[256] = { + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy5, &&yy5, &&yy3, &&yy3, &&yy5, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, &&yy3, + &&yy5, &&yy8, &&yy10, &&yy12, &&yy14, &&yy15, &&yy16, &&yy17, + &&yy19, &&yy20, &&yy21, &&yy22, &&yy20, &&yy23, &&yy24, &&yy25, + &&yy26, &&yy28, &&yy28, &&yy28, &&yy28, &&yy28, &&yy28, &&yy28, + &&yy28, &&yy28, &&yy30, &&yy20, &&yy31, &&yy32, &&yy33, &&yy34, + &&yy20, &&yy35, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, + &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy39, + &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, + &&yy40, &&yy37, &&yy37, &&yy20, &&yy41, &&yy20, &&yy43, &&yy44, + &&yy45, &&yy47, &&yy48, &&yy49, &&yy50, &&yy51, &&yy52, &&yy53, + &&yy37, &&yy54, &&yy37, &&yy37, &&yy55, &&yy37, &&yy56, &&yy37, + &&yy57, &&yy37, &&yy58, &&yy59, &&yy60, &&yy61, &&yy62, &&yy63, + &&yy37, &&yy64, &&yy37, &&yy65, &&yy67, &&yy68, &&yy20, &&yy37, + &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, + &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, + &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, + &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, + &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, + &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, + &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, + &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, + &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, + &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, + &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, + &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, + &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, + &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, + &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, + &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37, &&yy37 + }; + goto *yytarget[yych]; + } +yy3: YYDEBUG(3, *YYCURSOR); ++YYCURSOR; -yy4: YYDEBUG(4, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); { @@ -1072,1299 +1109,1103 @@ yy4: return 0; } -inline_char_handler: - - while (1) { - YYCTYPE *ptr = memchr(YYCURSOR, '<', YYLIMIT - YYCURSOR); - - YYCURSOR = ptr ? ptr + 1 : YYLIMIT; - - if (YYCURSOR < YYLIMIT) { - switch (*YYCURSOR) { - case '?': - if (CG(short_tags) || !strncasecmp((char*)YYCURSOR + 1, "php", 3) || (*(YYCURSOR + 1) == '=')) { /* Assume [ \t\n\r] follows "php" */ - break; - } - continue; - case '%': - if (CG(asp_tags)) { - break; - } - continue; - case 's': - case 'S': - /* Probably NOT an opening PHP