rattler 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. data/README.rdoc +3 -175
  2. data/features/README.markdown +27 -0
  3. data/features/Tutorial.md +224 -0
  4. data/features/command_line/output_option.feature +2 -1
  5. data/features/command_line/{parser_generator.feature → rtlr.feature} +43 -15
  6. data/features/error_reporting/automatic_error_messages.feature +40 -0
  7. data/features/error_reporting/custom_error_messages.feature +28 -0
  8. data/features/examples/json_parser.markdown +88 -0
  9. data/features/{grammar → extended_matching_syntax}/back_reference.feature +5 -3
  10. data/features/{grammar → extended_matching_syntax}/e_symbol.feature +2 -2
  11. data/features/{grammar → extended_matching_syntax}/eof.feature +4 -3
  12. data/features/{grammar → extended_matching_syntax}/fail.feature +8 -6
  13. data/features/extended_matching_syntax/fragments.feature +29 -0
  14. data/features/extended_matching_syntax/include.feature +42 -0
  15. data/features/{grammar → extended_matching_syntax}/list_matching.feature +7 -6
  16. data/features/extended_matching_syntax/posix_class.feature +127 -0
  17. data/features/{grammar → extended_matching_syntax}/repeat.feature +29 -3
  18. data/features/{grammar → extended_matching_syntax}/skip_operator.feature +2 -1
  19. data/features/extended_matching_syntax/super.feature +24 -0
  20. data/features/{grammar → extended_matching_syntax}/token.feature +6 -5
  21. data/features/{grammar → extended_matching_syntax}/whitespace.feature +7 -6
  22. data/features/{grammar → extended_matching_syntax}/word_literal.feature +10 -6
  23. data/features/grammar_heading/explicit_start_rule.feature +20 -0
  24. data/features/grammar_heading/grammar_declaration.feature +60 -0
  25. data/features/grammar_heading/include.feature +19 -0
  26. data/features/grammar_heading/require.feature +27 -0
  27. data/features/{grammar → peg_syntax}/any_character.feature +1 -1
  28. data/features/peg_syntax/character_class.feature +25 -0
  29. data/features/{grammar → peg_syntax}/comments.feature +1 -1
  30. data/features/{grammar → peg_syntax}/literal.feature +5 -3
  31. data/features/{grammar → peg_syntax}/negative_lookahead.feature +5 -3
  32. data/features/peg_syntax/nonterminal.feature +46 -0
  33. data/features/peg_syntax/one_or_more.feature +59 -0
  34. data/features/{grammar → peg_syntax}/optional.feature +2 -2
  35. data/features/peg_syntax/ordered_choice.feature +24 -0
  36. data/features/{grammar → peg_syntax}/positive_lookahead.feature +6 -4
  37. data/features/peg_syntax/sequence.feature +23 -0
  38. data/features/{grammar → peg_syntax}/start_rule.feature +1 -1
  39. data/features/peg_syntax/zero_or_more.feature +59 -0
  40. data/features/{grammar → semantics}/labels.feature +0 -0
  41. data/features/{grammar → semantics}/negative_semantic_predicate.feature +30 -9
  42. data/features/{grammar → semantics}/node_action.feature +0 -0
  43. data/features/{grammar → semantics}/positive_semantic_predicate.feature +29 -8
  44. data/features/{grammar/symantic_action.feature → semantics/semantic_action.feature} +2 -2
  45. data/features/semantics/semantic_result.feature +86 -0
  46. data/features/{grammar → semantics}/side_effect.feature +33 -21
  47. data/features/step_definitions/cli_steps.rb +1 -1
  48. data/features/step_definitions/grammar_steps.rb +19 -5
  49. data/features/support/env.rb +5 -0
  50. data/lib/rattler.rb +21 -44
  51. data/lib/rattler/compiler.rb +69 -0
  52. data/lib/rattler/{grammar → compiler}/grammar_parser.rb +58 -24
  53. data/lib/rattler/compiler/metagrammar.rb +1570 -0
  54. data/lib/rattler/compiler/optimizer.rb +77 -0
  55. data/lib/rattler/{back_end → compiler}/optimizer/composite_reducing.rb +2 -2
  56. data/lib/rattler/{back_end → compiler}/optimizer/flatten_choice.rb +3 -12
  57. data/lib/rattler/{back_end → compiler}/optimizer/flatten_sequence.rb +4 -16
  58. data/lib/rattler/{back_end → compiler}/optimizer/flattening.rb +2 -2
  59. data/lib/rattler/compiler/optimizer/inline_regular_rules.rb +24 -0
  60. data/lib/rattler/{back_end → compiler}/optimizer/join_match_capturing_sequence.rb +16 -14
  61. data/lib/rattler/{back_end → compiler}/optimizer/join_match_choice.rb +4 -13
  62. data/lib/rattler/{back_end → compiler}/optimizer/join_match_matching_sequence.rb +4 -13
  63. data/lib/rattler/compiler/optimizer/join_match_sequence.rb +7 -0
  64. data/lib/rattler/{back_end → compiler}/optimizer/join_predicate_bare_match.rb +3 -12
  65. data/lib/rattler/compiler/optimizer/join_predicate_match.rb +7 -0
  66. data/lib/rattler/{back_end → compiler}/optimizer/join_predicate_nested_match.rb +4 -13
  67. data/lib/rattler/{back_end → compiler}/optimizer/join_predicate_or_bare_match.rb +3 -12
  68. data/lib/rattler/compiler/optimizer/join_predicate_or_match.rb +7 -0
  69. data/lib/rattler/{back_end → compiler}/optimizer/join_predicate_or_nested_match.rb +4 -13
  70. data/lib/rattler/{back_end → compiler}/optimizer/match_joining.rb +2 -2
  71. data/lib/rattler/{back_end → compiler}/optimizer/optimization.rb +12 -34
  72. data/lib/rattler/compiler/optimizer/optimization_context.rb +83 -0
  73. data/lib/rattler/{back_end → compiler}/optimizer/optimization_sequence.rb +3 -11
  74. data/lib/rattler/compiler/optimizer/optimizations.rb +27 -0
  75. data/lib/rattler/{back_end → compiler}/optimizer/optimize_children.rb +6 -14
  76. data/lib/rattler/{back_end → compiler}/optimizer/reduce_repeat_match.rb +4 -13
  77. data/lib/rattler/compiler/optimizer/remove_meaningless_wrapper.rb +22 -0
  78. data/lib/rattler/{back_end → compiler}/optimizer/simplify_redundant_repeat.rb +4 -13
  79. data/lib/rattler/{back_end → compiler}/optimizer/simplify_token_match.rb +4 -13
  80. data/lib/rattler/compiler/parser_generator.rb +108 -0
  81. data/lib/rattler/{back_end → compiler}/parser_generator/apply_generator.rb +7 -21
  82. data/lib/rattler/{back_end → compiler}/parser_generator/assert_generator.rb +11 -19
  83. data/lib/rattler/compiler/parser_generator/attributed_sequence_generator.rb +37 -0
  84. data/lib/rattler/{back_end → compiler}/parser_generator/back_reference_generator.rb +10 -10
  85. data/lib/rattler/{back_end → compiler}/parser_generator/choice_generator.rb +10 -22
  86. data/lib/rattler/{back_end → compiler}/parser_generator/delegating_generator.rb +2 -2
  87. data/lib/rattler/{back_end → compiler}/parser_generator/disallow_generator.rb +11 -19
  88. data/lib/rattler/{back_end → compiler}/parser_generator/e_symbol_generator.rb +2 -10
  89. data/lib/rattler/{back_end → compiler}/parser_generator/eof_generator.rb +2 -10
  90. data/lib/rattler/{back_end → compiler}/parser_generator/expr_generator.rb +9 -35
  91. data/lib/rattler/{back_end → compiler}/parser_generator/fail_generator.rb +7 -3
  92. data/lib/rattler/{back_end → compiler}/parser_generator/gen_method_names.rb +3 -5
  93. data/lib/rattler/{back_end → compiler}/parser_generator/general_list_generator.rb +6 -18
  94. data/lib/rattler/{back_end → compiler}/parser_generator/general_repeat_generator.rb +16 -22
  95. data/lib/rattler/{back_end/parser_generator/rule_set_generator.rb → compiler/parser_generator/grammar_generator.rb} +24 -33
  96. data/lib/rattler/compiler/parser_generator/group_match.rb +33 -0
  97. data/lib/rattler/{back_end → compiler}/parser_generator/group_match_generator.rb +4 -17
  98. data/lib/rattler/compiler/parser_generator/label_generator.rb +37 -0
  99. data/lib/rattler/{back_end → compiler}/parser_generator/list0_generating.rb +5 -5
  100. data/lib/rattler/{back_end → compiler}/parser_generator/list1_generating.rb +3 -3
  101. data/lib/rattler/{back_end → compiler}/parser_generator/list_generator.rb +2 -2
  102. data/lib/rattler/{back_end → compiler}/parser_generator/match_generator.rb +10 -10
  103. data/lib/rattler/{back_end → compiler}/parser_generator/nested.rb +2 -2
  104. data/lib/rattler/compiler/parser_generator/node_action_generator.rb +49 -0
  105. data/lib/rattler/{back_end → compiler}/parser_generator/one_or_more_generating.rb +3 -3
  106. data/lib/rattler/{back_end → compiler}/parser_generator/optional_generating.rb +6 -22
  107. data/lib/rattler/compiler/parser_generator/predicate_propogating.rb +24 -0
  108. data/lib/rattler/{back_end → compiler}/parser_generator/repeat_generator.rb +2 -2
  109. data/lib/rattler/compiler/parser_generator/rule_generator.rb +66 -0
  110. data/lib/rattler/compiler/parser_generator/rule_set_generator.rb +33 -0
  111. data/lib/rattler/compiler/parser_generator/semantic_action_generator.rb +58 -0
  112. data/lib/rattler/compiler/parser_generator/sequence_generating.rb +138 -0
  113. data/lib/rattler/compiler/parser_generator/sequence_generator.rb +57 -0
  114. data/lib/rattler/{back_end → compiler}/parser_generator/skip_generator.rb +4 -18
  115. data/lib/rattler/compiler/parser_generator/skip_propogating.rb +16 -0
  116. data/lib/rattler/{back_end → compiler}/parser_generator/sub_generating.rb +19 -11
  117. data/lib/rattler/compiler/parser_generator/super_generator.rb +54 -0
  118. data/lib/rattler/{back_end → compiler}/parser_generator/token_generator.rb +3 -3
  119. data/lib/rattler/compiler/parser_generator/token_propogating.rb +10 -0
  120. data/lib/rattler/{back_end → compiler}/parser_generator/top_level.rb +2 -2
  121. data/lib/rattler/{back_end → compiler}/parser_generator/zero_or_more_generating.rb +5 -5
  122. data/lib/rattler/compiler/rattler.rtlr +201 -0
  123. data/lib/rattler/{back_end → compiler}/ruby_generator.rb +16 -25
  124. data/lib/rattler/parsers.rb +12 -33
  125. data/lib/rattler/parsers/action_code.rb +25 -16
  126. data/lib/rattler/{grammar → parsers}/analysis.rb +32 -11
  127. data/lib/rattler/parsers/apply.rb +10 -19
  128. data/lib/rattler/parsers/assert.rb +4 -14
  129. data/lib/rattler/parsers/atomic.rb +3 -10
  130. data/lib/rattler/parsers/attributed_sequence.rb +50 -0
  131. data/lib/rattler/parsers/back_reference.rb +19 -14
  132. data/lib/rattler/parsers/choice.rb +11 -12
  133. data/lib/rattler/parsers/combinator_parser.rb +15 -7
  134. data/lib/rattler/parsers/combining.rb +15 -9
  135. data/lib/rattler/parsers/disallow.rb +5 -12
  136. data/lib/rattler/parsers/e_symbol.rb +5 -14
  137. data/lib/rattler/parsers/eof.rb +10 -15
  138. data/lib/rattler/parsers/fail.rb +16 -26
  139. data/lib/rattler/{grammar → parsers}/grammar.rb +15 -20
  140. data/lib/rattler/parsers/label.rb +10 -16
  141. data/lib/rattler/parsers/list_parser.rb +14 -14
  142. data/lib/rattler/parsers/match.rb +5 -17
  143. data/lib/rattler/parsers/node_action.rb +72 -0
  144. data/lib/rattler/parsers/node_code.rb +47 -30
  145. data/lib/rattler/parsers/parser.rb +63 -32
  146. data/lib/rattler/parsers/parser_scope.rb +88 -0
  147. data/lib/rattler/parsers/predicate.rb +12 -10
  148. data/lib/rattler/parsers/repeat.rb +15 -8
  149. data/lib/rattler/parsers/rule.rb +8 -23
  150. data/lib/rattler/parsers/rule_set.rb +67 -12
  151. data/lib/rattler/parsers/semantic.rb +36 -0
  152. data/lib/rattler/parsers/semantic_action.rb +39 -0
  153. data/lib/rattler/parsers/sequence.rb +25 -40
  154. data/lib/rattler/parsers/sequencing.rb +40 -0
  155. data/lib/rattler/parsers/skip.rb +11 -12
  156. data/lib/rattler/parsers/super.rb +33 -0
  157. data/lib/rattler/parsers/token.rb +3 -13
  158. data/lib/rattler/rake_task.rb +50 -0
  159. data/lib/rattler/runner.rb +19 -22
  160. data/lib/rattler/runtime.rb +0 -10
  161. data/lib/rattler/runtime/extended_packrat_parser.rb +40 -45
  162. data/lib/rattler/runtime/packrat_parser.rb +17 -31
  163. data/lib/rattler/runtime/parse_failure.rb +16 -26
  164. data/lib/rattler/runtime/parse_node.rb +8 -18
  165. data/lib/rattler/runtime/parser.rb +6 -18
  166. data/lib/rattler/runtime/parser_helper.rb +3 -10
  167. data/lib/rattler/runtime/recursive_descent_parser.rb +26 -23
  168. data/lib/rattler/runtime/syntax_error.rb +0 -10
  169. data/lib/rattler/util.rb +2 -6
  170. data/lib/rattler/util/grammar_cli.rb +19 -0
  171. data/lib/rattler/util/graphviz.rb +6 -17
  172. data/lib/rattler/util/graphviz/digraph_builder.rb +10 -17
  173. data/lib/rattler/util/graphviz/node_builder.rb +45 -31
  174. data/lib/rattler/util/line_counter.rb +11 -20
  175. data/lib/rattler/util/node.rb +52 -30
  176. data/lib/rattler/util/parser_cli.rb +84 -0
  177. data/lib/rattler/util/parser_spec_helper.rb +8 -12
  178. data/spec/rattler/compiler/assert_compiler_examples.rb +284 -0
  179. data/spec/rattler/compiler/attributed_sequence_compiler_examples.rb +154 -0
  180. data/spec/rattler/compiler/disallow_compiler_examples.rb +293 -0
  181. data/spec/rattler/compiler/grammar_parser_spec.rb +700 -0
  182. data/spec/rattler/{back_end → compiler}/optimizer/flatten_choice_spec.rb +1 -1
  183. data/spec/rattler/{back_end → compiler}/optimizer/flatten_sequence_spec.rb +1 -1
  184. data/spec/rattler/compiler/optimizer/inline_regular_rules_spec.rb +50 -0
  185. data/spec/rattler/{back_end → compiler}/optimizer/join_match_capturing_sequence_spec.rb +106 -22
  186. data/spec/rattler/{back_end → compiler}/optimizer/join_match_choice_spec.rb +1 -1
  187. data/spec/rattler/{back_end → compiler}/optimizer/join_match_matching_sequence_spec.rb +1 -1
  188. data/spec/rattler/{back_end → compiler}/optimizer/join_predicate_bare_match_spec.rb +1 -1
  189. data/spec/rattler/{back_end → compiler}/optimizer/join_predicate_nested_match_spec.rb +1 -1
  190. data/spec/rattler/{back_end → compiler}/optimizer/join_predicate_or_bare_match_spec.rb +1 -1
  191. data/spec/rattler/{back_end → compiler}/optimizer/join_predicate_or_nested_match_spec.rb +1 -1
  192. data/spec/rattler/{back_end → compiler}/optimizer/reduce_repeat_match_spec.rb +1 -1
  193. data/spec/rattler/compiler/optimizer/remove_meaningless_wrapper_spec.rb +82 -0
  194. data/spec/rattler/{back_end → compiler}/optimizer/simplify_redundant_repeat_spec.rb +1 -1
  195. data/spec/rattler/{back_end → compiler}/optimizer/simplify_token_match_spec.rb +1 -1
  196. data/spec/rattler/{back_end → compiler}/optimizer_spec.rb +1 -1
  197. data/spec/rattler/{back_end → compiler}/parser_generator/apply_generator_spec.rb +1 -39
  198. data/spec/rattler/{back_end → compiler}/parser_generator/assert_generator_spec.rb +1 -55
  199. data/spec/rattler/compiler/parser_generator/attributed_sequence_generator_spec.rb +699 -0
  200. data/spec/rattler/{back_end → compiler}/parser_generator/back_reference_generator_spec.rb +3 -56
  201. data/spec/rattler/{back_end → compiler}/parser_generator/choice_generator_spec.rb +1 -63
  202. data/spec/rattler/{back_end → compiler}/parser_generator/disallow_generator_spec.rb +1 -55
  203. data/spec/rattler/{back_end → compiler}/parser_generator/e_symbol_generator_spec.rb +1 -39
  204. data/spec/rattler/{back_end → compiler}/parser_generator/eof_generator_spec.rb +1 -39
  205. data/spec/rattler/{back_end → compiler}/parser_generator/fail_generator_spec.rb +94 -23
  206. data/spec/rattler/compiler/parser_generator/grammar_generator_spec.rb +98 -0
  207. data/spec/rattler/compiler/parser_generator/group_match_generator_spec.rb +67 -0
  208. data/spec/rattler/{back_end → compiler}/parser_generator/group_match_spec.rb +1 -1
  209. data/spec/rattler/{back_end → compiler}/parser_generator/label_generator_spec.rb +1 -55
  210. data/spec/rattler/{back_end → compiler}/parser_generator/list0_generator_examples.rb +0 -88
  211. data/spec/rattler/{back_end → compiler}/parser_generator/list1_generator_examples.rb +0 -88
  212. data/spec/rattler/{back_end → compiler}/parser_generator/list_generator_spec.rb +1 -227
  213. data/spec/rattler/{back_end → compiler}/parser_generator/match_generator_spec.rb +1 -55
  214. data/spec/rattler/compiler/parser_generator/node_action_generator_spec.rb +135 -0
  215. data/spec/rattler/{back_end → compiler}/parser_generator/one_or_more_generator_examples.rb +0 -74
  216. data/spec/rattler/{back_end → compiler}/parser_generator/optional_generator_examples.rb +0 -62
  217. data/spec/rattler/{back_end → compiler}/parser_generator/repeat_generator_spec.rb +66 -1
  218. data/spec/rattler/{back_end → compiler}/parser_generator/rule_generator_spec.rb +3 -2
  219. data/spec/rattler/{back_end → compiler}/parser_generator/rule_set_generator_spec.rb +9 -27
  220. data/spec/rattler/compiler/parser_generator/semantic_action_generator_spec.rb +437 -0
  221. data/spec/rattler/{back_end → compiler}/parser_generator/sequence_generator_spec.rb +234 -68
  222. data/spec/rattler/{back_end → compiler}/parser_generator/skip_generator_spec.rb +1 -55
  223. data/spec/rattler/compiler/parser_generator/super_generator_spec.rb +93 -0
  224. data/spec/rattler/{back_end → compiler}/parser_generator/token_generator_spec.rb +1 -55
  225. data/spec/rattler/{back_end → compiler}/parser_generator/zero_or_more_generator_examples.rb +0 -74
  226. data/spec/rattler/{back_end → compiler}/ruby_generator_spec.rb +13 -13
  227. data/spec/rattler/compiler/semantic_action_compiler_examples.rb +57 -0
  228. data/spec/rattler/{back_end → compiler}/shared_compiler_examples.rb +111 -140
  229. data/spec/rattler/{back_end → compiler}/skip_compiler_examples.rb +60 -57
  230. data/spec/rattler/{back_end → compiler}/token_compiler_examples.rb +99 -104
  231. data/spec/rattler/compiler_spec.rb +67 -0
  232. data/spec/rattler/parsers/action_code_spec.rb +34 -18
  233. data/spec/rattler/{grammar → parsers}/analysis_spec.rb +13 -67
  234. data/spec/rattler/parsers/apply_spec.rb +6 -0
  235. data/spec/rattler/parsers/assert_spec.rb +38 -2
  236. data/spec/rattler/parsers/attributed_sequence_spec.rb +204 -0
  237. data/spec/rattler/parsers/back_reference_spec.rb +6 -0
  238. data/spec/rattler/parsers/choice_spec.rb +38 -1
  239. data/spec/rattler/parsers/combinator_parser_spec.rb +2 -1
  240. data/spec/rattler/parsers/disallow_spec.rb +38 -2
  241. data/spec/rattler/parsers/e_symbol_spec.rb +6 -0
  242. data/spec/rattler/parsers/eof_spec.rb +6 -0
  243. data/spec/rattler/parsers/fail_spec.rb +6 -0
  244. data/spec/rattler/{grammar → parsers}/grammar_spec.rb +10 -15
  245. data/spec/rattler/parsers/label_spec.rb +30 -0
  246. data/spec/rattler/parsers/list_parser_spec.rb +31 -2
  247. data/spec/rattler/parsers/match_spec.rb +6 -0
  248. data/spec/rattler/parsers/node_action_spec.rb +121 -0
  249. data/spec/rattler/parsers/parser_scope_spec.rb +105 -0
  250. data/spec/rattler/parsers/repeat_spec.rb +56 -0
  251. data/spec/rattler/parsers/rule_set_spec.rb +42 -0
  252. data/spec/rattler/parsers/semantic_action_spec.rb +89 -0
  253. data/spec/rattler/parsers/sequence_spec.rb +156 -12
  254. data/spec/rattler/parsers/skip_spec.rb +21 -0
  255. data/spec/rattler/parsers/super_spec.rb +45 -0
  256. data/spec/rattler/parsers/token_spec.rb +33 -14
  257. data/spec/rattler/runtime/extended_packrat_parser_spec.rb +10 -8
  258. data/spec/rattler/runtime/recursive_descent_parser_spec.rb +26 -0
  259. data/spec/rattler/runtime/shared_parser_examples.rb +22 -16
  260. data/spec/rattler/util/graphviz/node_builder_spec.rb +33 -17
  261. data/spec/rattler/util/line_counter_spec.rb +21 -21
  262. data/spec/rattler/util/node_spec.rb +62 -0
  263. data/spec/rattler_spec.rb +7 -41
  264. data/spec/spec_helper.rb +1 -2
  265. data/spec/support/combinator_parser_spec_helper.rb +1 -1
  266. data/spec/support/compiler_spec_helper.rb +0 -4
  267. data/spec/support/parser_generator_spec_helper.rb +7 -7
  268. data/spec/support/runtime_parser_spec_helper.rb +57 -3
  269. metadata +447 -303
  270. data/features/grammar/character_class.feature +0 -20
  271. data/features/grammar/nonterminal.feature +0 -24
  272. data/features/grammar/one_or_more.feature +0 -34
  273. data/features/grammar/ordered_choice.feature +0 -21
  274. data/features/grammar/posix_class.feature +0 -70
  275. data/features/grammar/sequence.feature +0 -20
  276. data/features/grammar/zero_or_more.feature +0 -34
  277. data/lib/rattler/back_end.rb +0 -22
  278. data/lib/rattler/back_end/compiler.rb +0 -128
  279. data/lib/rattler/back_end/optimizer.rb +0 -101
  280. data/lib/rattler/back_end/optimizer/inline_regular_rules.rb +0 -46
  281. data/lib/rattler/back_end/optimizer/join_match_sequence.rb +0 -17
  282. data/lib/rattler/back_end/optimizer/join_predicate_match.rb +0 -17
  283. data/lib/rattler/back_end/optimizer/join_predicate_or_match.rb +0 -17
  284. data/lib/rattler/back_end/optimizer/optimization_context.rb +0 -72
  285. data/lib/rattler/back_end/optimizer/remove_meaningless_wrapper.rb +0 -32
  286. data/lib/rattler/back_end/optimizer/specialize_repeat.rb +0 -40
  287. data/lib/rattler/back_end/parser_generator.rb +0 -113
  288. data/lib/rattler/back_end/parser_generator/direct_action_generator.rb +0 -45
  289. data/lib/rattler/back_end/parser_generator/dispatch_action_generator.rb +0 -45
  290. data/lib/rattler/back_end/parser_generator/group_match.rb +0 -26
  291. data/lib/rattler/back_end/parser_generator/label_generator.rb +0 -64
  292. data/lib/rattler/back_end/parser_generator/predicate_propogating.rb +0 -24
  293. data/lib/rattler/back_end/parser_generator/rule_generator.rb +0 -53
  294. data/lib/rattler/back_end/parser_generator/sequence_generator.rb +0 -190
  295. data/lib/rattler/back_end/parser_generator/skip_propogating.rb +0 -16
  296. data/lib/rattler/back_end/parser_generator/token_propogating.rb +0 -10
  297. data/lib/rattler/grammar.rb +0 -43
  298. data/lib/rattler/grammar/grammar_dsl.rb +0 -51
  299. data/lib/rattler/grammar/metagrammar.rb +0 -990
  300. data/lib/rattler/grammar/rattler.rtlr +0 -183
  301. data/lib/rattler/parsers/assert_code.rb +0 -31
  302. data/lib/rattler/parsers/direct_action.rb +0 -85
  303. data/lib/rattler/parsers/disallow_code.rb +0 -31
  304. data/lib/rattler/parsers/dispatch_action.rb +0 -121
  305. data/lib/rattler/parsers/effect_code.rb +0 -31
  306. data/lib/rattler/parsers/parser_dsl.rb +0 -414
  307. data/lib/rattler/parsers/semantic_assert.rb +0 -19
  308. data/lib/rattler/parsers/semantic_disallow.rb +0 -19
  309. data/lib/rattler/parsers/side_effect.rb +0 -19
  310. data/spec/rattler/back_end/assert_compiler_examples.rb +0 -187
  311. data/spec/rattler/back_end/compiler_spec.rb +0 -43
  312. data/spec/rattler/back_end/direct_action_compiler_examples.rb +0 -227
  313. data/spec/rattler/back_end/disallow_compiler_examples.rb +0 -187
  314. data/spec/rattler/back_end/dispatch_action_compiler_examples.rb +0 -225
  315. data/spec/rattler/back_end/optimizer/inline_regular_rules_spec.rb +0 -80
  316. data/spec/rattler/back_end/parser_generator/direct_action_generator_spec.rb +0 -204
  317. data/spec/rattler/back_end/parser_generator/dispatch_action_generator_spec.rb +0 -204
  318. data/spec/rattler/back_end/parser_generator/group_match_generator_spec.rb +0 -185
  319. data/spec/rattler/back_end/semantic_assert_compiler_examples.rb +0 -152
  320. data/spec/rattler/back_end/semantic_disallow_compiler_examples.rb +0 -152
  321. data/spec/rattler/back_end/side_effect_compiler_examples.rb +0 -227
  322. data/spec/rattler/grammar/grammar_parser_spec.rb +0 -626
  323. data/spec/rattler/parsers/direct_action_spec.rb +0 -224
  324. data/spec/rattler/parsers/dispatch_action_spec.rb +0 -209
  325. data/spec/rattler/parsers/node_code_spec.rb +0 -59
  326. data/spec/rattler/parsers/parser_dsl_spec.rb +0 -334
  327. data/spec/rattler/parsers/semantic_assert_spec.rb +0 -83
  328. data/spec/rattler/parsers/semantic_disallow_spec.rb +0 -83
  329. data/spec/rattler/parsers/side_effect_spec.rb +0 -214
@@ -1,13 +1,23 @@
1
- Given /grammar with\:/ do |source|
2
- @parser_class = Rattler.compile_parser(source)
1
+ Given /grammar with:$/ do |source|
2
+ @source = source
3
3
  end
4
4
 
5
- Given /class definition\:/ do |source|
5
+ Given /grammar called "([^\"]*)" with:$/ do |name, source|
6
+ Rattler.compile((::Grammars[name.to_sym] = Module.new), source)
7
+ end
8
+
9
+ Given /class definition:$/ do |source|
6
10
  eval(source, TOPLEVEL_BINDING)
7
11
  end
8
12
 
13
+ When /generate parser code$/ do
14
+ model = Rattler::Compiler::GrammarParser.parse!(@source)
15
+ @parser_code = Rattler::Compiler::ParserGenerator.code_for(model)
16
+ end
17
+
9
18
  When /parse ([^[:alpha:]].*)$/ do |expr|
10
- @parser = @parser_class.new(eval(expr, TOPLEVEL_BINDING))
19
+ parser_class = Rattler.compile_parser(@source)
20
+ @parser = parser_class.new(eval(expr, TOPLEVEL_BINDING))
11
21
  end
12
22
 
13
23
  When /parse position is (.+)$/ do |expr|
@@ -23,7 +33,7 @@ Then /parse should fail/ do
23
33
  end
24
34
 
25
35
  Then /parse result should be FAIL$/ do
26
- Then "parse should fail"
36
+ step "parse should fail"
27
37
  end
28
38
 
29
39
  Then /parse position should be (.+)$/ do |expr|
@@ -41,3 +51,7 @@ end
41
51
  Then /^\$x should be (.+)$/ do |expr|
42
52
  $x.should == eval(expr, TOPLEVEL_BINDING)
43
53
  end
54
+
55
+ Then /^the code should contain:$/ do |partial_content|
56
+ @parser_code.should include(partial_content)
57
+ end
@@ -13,6 +13,11 @@ require 'rattler'
13
13
  require 'rspec/expectations'
14
14
  require 'aruba/cucumber'
15
15
 
16
+ ::Grammars = {}
17
+ def Object.const_missing(name)
18
+ ::Grammars[name] || super
19
+ end
20
+
16
21
  Before do
17
22
  @aruba_timeout_seconds = 5
18
23
  end
@@ -1,79 +1,56 @@
1
- #
2
- # = rattler.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
-
8
1
  # Rattler - Ruby Tool for Language Recognition
9
2
  #
10
- # @author Jason Arhart
11
3
  module Rattler
12
-
4
+
13
5
  autoload :Runtime, 'rattler/runtime'
14
- autoload :Grammar, 'rattler/grammar'
15
6
  autoload :Parsers, 'rattler/parsers'
16
- autoload :BackEnd, 'rattler/back_end'
7
+ autoload :Compiler, 'rattler/compiler'
17
8
  autoload :Util, 'rattler/util'
18
-
9
+
19
10
  # Convenience methods for defining parsers
20
- #
21
- # @author Jason Arhart
22
11
  module HelperMethods
23
-
12
+
24
13
  # @private
25
14
  @@defaults = {
26
15
  :type => :extended_packrat
27
16
  }
28
-
17
+
29
18
  # @private
30
19
  @@parser_types = {
31
20
  :recursive_descent => :RecursiveDescentParser,
32
21
  :packrat => :PackratParser,
33
22
  :extended_packrat => :ExtendedPackratParser
34
23
  }
35
-
36
- # Define parse rules with the given block
37
- #
38
- # @return [Rattler::Parsers::Rules] a set of parse rules
39
- #
40
- def define_rules(&block)
41
- Rattler::Parsers.define(&block)
42
- end
43
-
44
- # Define a parser with the given block and compile it into a parser class
24
+
25
+ # Define a parser with the given grammar and compile it into a parser class
45
26
  # using the given options
46
27
  #
47
28
  # @return [Class] a new parser class
48
- def compile_parser(*args, &block)
49
- options = @@defaults
29
+ def compile_parser(*args)
30
+ options = @@defaults.dup
50
31
  grammar = nil
51
32
  for arg in args
52
33
  case arg
53
- when Hash then options = options.merge(arg)
34
+ when Hash then options.merge!(arg)
54
35
  when String then grammar = arg
55
36
  end
56
37
  end
57
- base_class = options.fetch(:class) do
58
- Rattler::Runtime::const_get @@parser_types[options[:type]]
59
- end
60
- Rattler::BackEnd::Compiler.compile_parser(base_class,
61
- grammar || Rattler::Parsers.define(&block))
38
+ base_class = options.delete(:class) ||
39
+ (Rattler::Runtime::const_get @@parser_types[options[:type]])
40
+ Rattler::Compiler.compile_parser(base_class, grammar, options)
62
41
  end
63
-
64
- # Define a parser with the given block and compile it into match methods in
65
- # the given module
66
- def compile(mod, grammar=nil, &block)
67
- grammar_or_rules = grammar || Rattler::Parsers.define(&block)
68
- Rattler::BackEnd::Compiler.compile(mod, grammar_or_rules)
42
+
43
+ # (see Rattler::Compiler::ModuleMethods#compile)
44
+ def compile(mod, grammar_or_parser, opts={})
45
+ Rattler::Compiler.compile(mod, grammar_or_parser, opts)
69
46
  end
70
-
47
+
71
48
  end
72
-
49
+
73
50
  include HelperMethods
74
-
51
+
75
52
  class <<self
76
53
  include HelperMethods
77
54
  end
78
-
55
+
79
56
  end
@@ -0,0 +1,69 @@
1
+ require 'rattler'
2
+
3
+ module Rattler
4
+
5
+ # The +Compiler+ module contains the classes and methods used to turn
6
+ # parser models into ruby code.
7
+ module Compiler
8
+ autoload :GrammarParser, 'rattler/compiler/grammar_parser'
9
+ autoload :Metagrammar, 'rattler/compiler/metagrammar'
10
+ autoload :ParserGenerator, 'rattler/compiler/parser_generator'
11
+ autoload :RubyGenerator, 'rattler/compiler/ruby_generator'
12
+ autoload :Optimizer, 'rattler/compiler/optimizer'
13
+
14
+ # Compiler module methods
15
+ module ModuleMethods
16
+
17
+ include Rattler::Parsers
18
+
19
+ # Compile grammar source or a parser model into a new parser subclass of
20
+ # +base+.
21
+ #
22
+ # @overload compile(base, grammar, opts)
23
+ # @param [Class] base the base class for the new parser class
24
+ # @param [String] grammar the grammar source to compile
25
+ # @return [Class] a new sublcass of +base+ with compiled match methods
26
+ #
27
+ # @overload compile(base, parser, opts)
28
+ # @param [Class] base the base class for the new parser class
29
+ # @param [Rattler::Parsers::Grammar,Rattler::Parsers::RuleSet,Rattler::Parsers::Rule]
30
+ # parser the parser model to compile
31
+ # @return [Class] a new sublcass of +base+ with compiled match methods
32
+ #
33
+ def compile_parser(base, grammar_or_parser, opts={})
34
+ compile(Class.new(base), grammar_or_parser, opts)
35
+ end
36
+
37
+ # Compile grammar source or a parser model into match methods in a
38
+ # module.
39
+ #
40
+ # @overload compile(mod, grammar, opts)
41
+ # @param [Module] mod the target module for the match methods
42
+ # @param [String] grammar the grammar source to compile
43
+ # @return [Module] +mod+
44
+ #
45
+ # @overload compile(mod, parser, opts)
46
+ # @param [Module] mod the target module for the match methods
47
+ # @param [Rattler::Parsers::Grammar,Rattler::Parsers::RuleSet,Rattler::Parsers::Rule]
48
+ # parser the parser model to compile
49
+ # @return [Module] +mod+
50
+ #
51
+ def compile(mod, grammar_or_parser, opts={})
52
+ model = parser_model(grammar_or_parser)
53
+ mod.module_eval ParserGenerator.code_for(model, opts)
54
+ mod
55
+ end
56
+
57
+ private
58
+
59
+ def parser_model(arg)
60
+ case arg
61
+ when Grammar, RuleSet, Rule then arg
62
+ else GrammarParser.parse!(arg.to_str)
63
+ end
64
+ end
65
+ end
66
+
67
+ extend ModuleMethods
68
+ end
69
+ end
@@ -1,12 +1,6 @@
1
- #
2
- # = rattler/grammar/grammar_parser.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
- require 'rattler/grammar'
8
-
9
- module Rattler::Grammar
1
+ require 'rattler/compiler'
2
+
3
+ module Rattler::Compiler
10
4
  # @private
11
5
  class GrammarParser < Rattler::Runtime::ExtendedPackratParser #:nodoc:
12
6
 
@@ -23,6 +17,21 @@ module Rattler::Grammar
23
17
 
24
18
  private
25
19
 
20
+ def expand_relative(e)
21
+ "File.expand_path(#{e}, File.dirname(__FILE__))"
22
+ end
23
+
24
+ def heading(requires, modules, includes, start)
25
+ requires.
26
+ merge(modules.first || {}).
27
+ merge(includes).
28
+ merge(start.first || {})
29
+ end
30
+
31
+ def parser_decl(name, base)
32
+ {:parser_name => name, :base_name => base.first}
33
+ end
34
+
26
35
  def start_ws(e)
27
36
  @directive_stack.push :type => :ws, :value => @ws
28
37
  set_ws e
@@ -52,25 +61,28 @@ module Rattler::Grammar
52
61
  @inline = true
53
62
  end
54
63
 
64
+ def start_fragments
65
+ @directive_stack.push :type => :fragments, :value => [@ws, @inline]
66
+ set_fragments
67
+ end
68
+
69
+ def set_fragments
70
+ @ws = nil
71
+ @inline = true
72
+ end
73
+
55
74
  def end_block
56
75
  if d = @directive_stack.pop
57
76
  case d[:type]
58
- when :wc then @wc = d[:value]
59
- when :ws then @ws = d[:value]
60
- when :inline then @inline = d[:value]
77
+ when :wc then @wc = d[:value]
78
+ when :ws then @ws = d[:value]
79
+ when :inline then @inline = d[:value]
80
+ when :fragments then @ws, @inline = d[:value]
61
81
  end
62
82
  true
63
83
  end
64
84
  end
65
85
 
66
- def heading(requires, modules, includes)
67
- requires.merge(modules.first || {}).merge(includes)
68
- end
69
-
70
- def parser_decl(name, base)
71
- {:parser_name => name, :base_name => base.first}
72
- end
73
-
74
86
  def list0(term_parser, sep_parser)
75
87
  ListParser[term_parser, sep_parser, 0, nil]
76
88
  end
@@ -79,20 +91,24 @@ module Rattler::Grammar
79
91
  ListParser[term_parser, sep_parser, 1, nil]
80
92
  end
81
93
 
94
+ def attributed(o, action)
95
+ (o + [action]).reduce {|s, a| s >> a }
96
+ end
97
+
82
98
  def optional(parser)
83
- Repeat[parser, 0, 1]
99
+ parser.optional
84
100
  end
85
101
 
86
102
  def zero_or_more(parser)
87
- Repeat[parser, 0, nil]
103
+ parser.zero_or_more
88
104
  end
89
105
 
90
106
  def one_or_more(parser)
91
- Repeat[parser, 1, nil]
107
+ parser.one_or_more
92
108
  end
93
109
 
94
110
  def rule(name, parser)
95
- Rule[name, (@ws ? parser.with_ws(@ws) : parser), {:inline => @inline}]
111
+ Rule[name, finish_expr(parser, name), {:inline => @inline}]
96
112
  end
97
113
 
98
114
  def literal(e)
@@ -115,5 +131,23 @@ module Rattler::Grammar
115
131
  end
116
132
  end
117
133
 
134
+ def finish_expr(parser, rule_name)
135
+ parser = finish_super(parser, rule_name)
136
+ @ws ? parser.with_ws(@ws) : parser
137
+ end
138
+
139
+ def finish_super(parser, rule_name)
140
+ case parser
141
+ when Super
142
+ parser.with_attrs(:rule_name => rule_name)
143
+ when Eof, ESymbol
144
+ parser
145
+ when Parser
146
+ parser.with_children(parser.map {|_| finish_super(_, rule_name) })
147
+ else
148
+ parser
149
+ end
150
+ end
151
+
118
152
  end
119
153
  end
@@ -0,0 +1,1570 @@
1
+ # encoding: utf-8
2
+
3
+ require 'rattler/compiler'
4
+
5
+ module Rattler
6
+ module Compiler
7
+ # @private
8
+ module Metagrammar #:nodoc:
9
+
10
+ include Rattler::Parsers
11
+
12
+ # @private
13
+ def start_rule #:nodoc:
14
+ :grammar
15
+ end
16
+
17
+ # @private
18
+ def match_grammar #:nodoc:
19
+ apply :match_grammar!
20
+ end
21
+
22
+ # @private
23
+ def match_grammar! #:nodoc:
24
+ begin
25
+ p0 = @scanner.pos
26
+ begin
27
+ (r0_0 = match(:heading)) &&
28
+ (r0_1 = match(:rules)) &&
29
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)\z/) &&
30
+ Grammar.parsed(select_captures([r0_0, r0_1]))
31
+ end || begin
32
+ @scanner.pos = p0
33
+ false
34
+ end
35
+ end ||
36
+ fail { :grammar }
37
+ end
38
+
39
+ # @private
40
+ def match_heading #:nodoc:
41
+ apply :match_heading!
42
+ end
43
+
44
+ # @private
45
+ def match_heading! #:nodoc:
46
+ begin
47
+ p0 = @scanner.pos
48
+ begin
49
+ (r0_0 = match(:requires)) &&
50
+ (r0_1 = ((r = match(:module_decl)) ? [r] : [])) &&
51
+ (r0_2 = match(:includes)) &&
52
+ (r0_3 = ((r = match(:start_directive)) ? [r] : [])) &&
53
+ (heading r0_0, r0_1, r0_2, r0_3)
54
+ end || begin
55
+ @scanner.pos = p0
56
+ false
57
+ end
58
+ end ||
59
+ fail { :heading }
60
+ end
61
+
62
+ # @private
63
+ def match_requires #:nodoc:
64
+ apply :match_requires!
65
+ end
66
+
67
+ # @private
68
+ def match_requires! #:nodoc:
69
+ begin
70
+ p0 = @scanner.pos
71
+ begin
72
+ (r0_0 = begin
73
+ a0 = []
74
+ while r = match(:require_statement)
75
+ a0 << r
76
+ end
77
+ select_captures(a0)
78
+ end) &&
79
+ ({ :requires => r0_0 })
80
+ end || begin
81
+ @scanner.pos = p0
82
+ false
83
+ end
84
+ end ||
85
+ fail { :requires }
86
+ end
87
+
88
+ # @private
89
+ def match_require_statement #:nodoc:
90
+ apply :match_require_statement!
91
+ end
92
+
93
+ # @private
94
+ def match_require_statement! #:nodoc:
95
+ begin
96
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>require)(?![[:alnum:]_])))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?!(?>(?>[[:blank:]])*)(?>\z|;|(?>(?>\r)?)(?>\n)|(?>\#)(?>(?>[^\n])*)))(?>.))+))(?>(?>(?>[[:blank:]])*)(?>\z|;|(?>(?>\r)?)(?>\n)|(?>\#)(?>(?>[^\n])*)))/) &&
97
+ @scanner[1]
98
+ end ||
99
+ begin
100
+ p0 = @scanner.pos
101
+ begin
102
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>require_relative)(?![[:alnum:]_]))/) &&
103
+ (r0_0 = begin
104
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?!(?>(?>[[:blank:]])*)(?>\z|;|(?>(?>\r)?)(?>\n)|(?>\#)(?>(?>[^\n])*)))(?>.))+)/) &&
105
+ @scanner[1]
106
+ end) &&
107
+ @scanner.skip(/(?>(?>[[:blank:]])*)(?>\z|;|(?>(?>\r)?)(?>\n)|(?>\#)(?>(?>[^\n])*))/) &&
108
+ (expand_relative r0_0)
109
+ end || begin
110
+ @scanner.pos = p0
111
+ false
112
+ end
113
+ end ||
114
+ fail { :require_statement }
115
+ end
116
+
117
+ # @private
118
+ def match_module_decl #:nodoc:
119
+ apply :match_module_decl!
120
+ end
121
+
122
+ # @private
123
+ def match_module_decl! #:nodoc:
124
+ begin
125
+ p0 = @scanner.pos
126
+ begin
127
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>parser)(?![[:alnum:]_]))/) &&
128
+ (r0_0 = begin
129
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?>(?>[[:upper:]])(?>(?>[[:alnum:]_])*)(?>::))*)(?>[[:upper:]])(?>(?>[[:alnum:]_])*))/) &&
130
+ @scanner[1]
131
+ end) &&
132
+ (r0_1 = ((r = begin
133
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?>(?>[[:upper:]])(?>(?>[[:alnum:]_])*)(?>::))*)(?>[[:upper:]])(?>(?>[[:alnum:]_])*)))/) &&
134
+ @scanner[1]
135
+ end) ? [r] : [])) &&
136
+ @scanner.skip(/(?>(?>[[:blank:]])*)(?>\z|;|(?>(?>\r)?)(?>\n)|(?>\#)(?>(?>[^\n])*))/) &&
137
+ (parser_decl r0_0, r0_1)
138
+ end || begin
139
+ @scanner.pos = p0
140
+ false
141
+ end
142
+ end ||
143
+ begin
144
+ p0 = @scanner.pos
145
+ begin
146
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>grammar)(?![[:alnum:]_]))/) &&
147
+ (r0_0 = begin
148
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?>(?>[[:upper:]])(?>(?>[[:alnum:]_])*)(?>::))*)(?>[[:upper:]])(?>(?>[[:alnum:]_])*))/) &&
149
+ @scanner[1]
150
+ end) &&
151
+ @scanner.skip(/(?>(?>[[:blank:]])*)(?>\z|;|(?>(?>\r)?)(?>\n)|(?>\#)(?>(?>[^\n])*))/) &&
152
+ ({ :grammar_name => r0_0 })
153
+ end || begin
154
+ @scanner.pos = p0
155
+ false
156
+ end
157
+ end ||
158
+ fail { :module_decl }
159
+ end
160
+
161
+ # @private
162
+ def match_includes #:nodoc:
163
+ apply :match_includes!
164
+ end
165
+
166
+ # @private
167
+ def match_includes! #:nodoc:
168
+ begin
169
+ p0 = @scanner.pos
170
+ begin
171
+ (r0_0 = begin
172
+ a0 = []
173
+ while r = begin
174
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>include)(?![[:alnum:]_])))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?>(?>[[:upper:]])(?>(?>[[:alnum:]_])*)(?>::))*)(?>[[:upper:]])(?>(?>[[:alnum:]_])*)))(?>(?>(?>[[:blank:]])*)(?>\z|;|(?>(?>\r)?)(?>\n)|(?>\#)(?>(?>[^\n])*)))/) &&
175
+ @scanner[1]
176
+ end
177
+ a0 << r
178
+ end
179
+ a0
180
+ end) &&
181
+ ({ :includes => r0_0 })
182
+ end || begin
183
+ @scanner.pos = p0
184
+ false
185
+ end
186
+ end ||
187
+ fail { :includes }
188
+ end
189
+
190
+ # @private
191
+ def match_start_directive #:nodoc:
192
+ apply :match_start_directive!
193
+ end
194
+
195
+ # @private
196
+ def match_start_directive! #:nodoc:
197
+ begin
198
+ p0 = @scanner.pos
199
+ begin
200
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>%start)(?![[:alnum:]_]))/) &&
201
+ (r0_0 = begin
202
+ p1 = @scanner.pos
203
+ begin
204
+ @scanner.skip(/(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>EOF)(?![[:alnum:]_])))/) &&
205
+ begin
206
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:alpha:]])(?>(?>[[:alnum:]_])*))/) &&
207
+ @scanner[1]
208
+ end
209
+ end || begin
210
+ @scanner.pos = p1
211
+ false
212
+ end
213
+ end) &&
214
+ ({ :start_rule => r0_0 })
215
+ end || begin
216
+ @scanner.pos = p0
217
+ false
218
+ end
219
+ end ||
220
+ fail { :start_directive }
221
+ end
222
+
223
+ # @private
224
+ def match_rules #:nodoc:
225
+ apply :match_rules!
226
+ end
227
+
228
+ # @private
229
+ def match_rules! #:nodoc:
230
+ begin
231
+ p0 = @scanner.pos
232
+ begin
233
+ (r0_0 = begin
234
+ a0 = []
235
+ while r = begin
236
+ match(:directive) ||
237
+ match(:rule) ||
238
+ match(:block_close)
239
+ end
240
+ a0 << r
241
+ end
242
+ select_captures(a0)
243
+ end) &&
244
+ RuleSet.parsed(select_captures([r0_0]))
245
+ end || begin
246
+ @scanner.pos = p0
247
+ false
248
+ end
249
+ end ||
250
+ fail { :rules }
251
+ end
252
+
253
+ # @private
254
+ def match_directive #:nodoc:
255
+ apply :match_directive!
256
+ end
257
+
258
+ # @private
259
+ def match_directive! #:nodoc:
260
+ match(:ws_directive) ||
261
+ match(:wc_directive) ||
262
+ match(:inline_directive) ||
263
+ match(:fragments) ||
264
+ fail! { :directive }
265
+ end
266
+
267
+ # @private
268
+ def match_ws_directive #:nodoc:
269
+ apply :match_ws_directive!
270
+ end
271
+
272
+ # @private
273
+ def match_ws_directive! #:nodoc:
274
+ begin
275
+ p0 = @scanner.pos
276
+ begin
277
+ (r0_0 = match(:ws_decl)) &&
278
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{)/) &&
279
+ (start_ws r0_0)
280
+ end || begin
281
+ @scanner.pos = p0
282
+ false
283
+ end
284
+ end ||
285
+ begin
286
+ p0 = @scanner.pos
287
+ begin
288
+ (r0_0 = match(:ws_decl)) &&
289
+ (set_ws r0_0)
290
+ end || begin
291
+ @scanner.pos = p0
292
+ false
293
+ end
294
+ end ||
295
+ fail { :ws_directive }
296
+ end
297
+
298
+ # @private
299
+ def match_ws_decl #:nodoc:
300
+ apply :match_ws_decl!
301
+ end
302
+
303
+ # @private
304
+ def match_ws_decl! #:nodoc:
305
+ begin
306
+ p0 = @scanner.pos
307
+ begin
308
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>%whitespace)(?![[:alnum:]_]))/) &&
309
+ match(:unattributed)
310
+ end || begin
311
+ @scanner.pos = p0
312
+ false
313
+ end
314
+ end ||
315
+ fail { :ws_decl }
316
+ end
317
+
318
+ # @private
319
+ def match_wc_directive #:nodoc:
320
+ apply :match_wc_directive!
321
+ end
322
+
323
+ # @private
324
+ def match_wc_directive! #:nodoc:
325
+ begin
326
+ p0 = @scanner.pos
327
+ begin
328
+ (r0_0 = match(:wc_decl)) &&
329
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{)/) &&
330
+ (start_wc r0_0)
331
+ end || begin
332
+ @scanner.pos = p0
333
+ false
334
+ end
335
+ end ||
336
+ begin
337
+ p0 = @scanner.pos
338
+ begin
339
+ (r0_0 = match(:wc_decl)) &&
340
+ (set_wc r0_0)
341
+ end || begin
342
+ @scanner.pos = p0
343
+ false
344
+ end
345
+ end ||
346
+ fail { :wc_directive }
347
+ end
348
+
349
+ # @private
350
+ def match_wc_decl #:nodoc:
351
+ apply :match_wc_decl!
352
+ end
353
+
354
+ # @private
355
+ def match_wc_decl! #:nodoc:
356
+ begin
357
+ p0 = @scanner.pos
358
+ begin
359
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>%word_character)(?![[:alnum:]_]))/) &&
360
+ match(:unattributed)
361
+ end || begin
362
+ @scanner.pos = p0
363
+ false
364
+ end
365
+ end ||
366
+ fail { :wc_decl }
367
+ end
368
+
369
+ # @private
370
+ def match_inline_directive #:nodoc:
371
+ apply :match_inline_directive!
372
+ end
373
+
374
+ # @private
375
+ def match_inline_directive! #:nodoc:
376
+ begin
377
+ p0 = @scanner.pos
378
+ begin
379
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>%inline)(?![[:alnum:]_]))/) &&
380
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{)/) &&
381
+ (start_inline)
382
+ end || begin
383
+ @scanner.pos = p0
384
+ false
385
+ end
386
+ end ||
387
+ begin
388
+ p0 = @scanner.pos
389
+ begin
390
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>%inline)(?![[:alnum:]_]))/) &&
391
+ (set_inline)
392
+ end || begin
393
+ @scanner.pos = p0
394
+ false
395
+ end
396
+ end ||
397
+ fail { :inline_directive }
398
+ end
399
+
400
+ # @private
401
+ def match_fragments #:nodoc:
402
+ apply :match_fragments!
403
+ end
404
+
405
+ # @private
406
+ def match_fragments! #:nodoc:
407
+ begin
408
+ p0 = @scanner.pos
409
+ begin
410
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>%fragments)(?![[:alnum:]_]))/) &&
411
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{)/) &&
412
+ (start_fragments)
413
+ end || begin
414
+ @scanner.pos = p0
415
+ false
416
+ end
417
+ end ||
418
+ begin
419
+ p0 = @scanner.pos
420
+ begin
421
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>%fragments)(?![[:alnum:]_]))/) &&
422
+ (set_fragments)
423
+ end || begin
424
+ @scanner.pos = p0
425
+ false
426
+ end
427
+ end ||
428
+ fail { :fragments }
429
+ end
430
+
431
+ # @private
432
+ def match_block_close #:nodoc:
433
+ apply :match_block_close!
434
+ end
435
+
436
+ # @private
437
+ def match_block_close! #:nodoc:
438
+ begin
439
+ p0 = @scanner.pos
440
+ begin
441
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\})/) &&
442
+ (end_block)
443
+ end || begin
444
+ @scanner.pos = p0
445
+ false
446
+ end
447
+ end ||
448
+ fail { :block_close }
449
+ end
450
+
451
+ # @private
452
+ def match_rule #:nodoc:
453
+ apply :match_rule!
454
+ end
455
+
456
+ # @private
457
+ def match_rule! #:nodoc:
458
+ begin
459
+ p0 = @scanner.pos
460
+ begin
461
+ (r0_0 = begin
462
+ p1 = @scanner.pos
463
+ begin
464
+ @scanner.skip(/(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>EOF)(?![[:alnum:]_])))/) &&
465
+ begin
466
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:alpha:]])(?>(?>[[:alnum:]_])*))/) &&
467
+ @scanner[1]
468
+ end
469
+ end || begin
470
+ @scanner.pos = p1
471
+ false
472
+ end
473
+ end) &&
474
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><\-)/) &&
475
+ (r0_1 = match(:expression)) &&
476
+ (rule r0_0, r0_1)
477
+ end || begin
478
+ @scanner.pos = p0
479
+ false
480
+ end
481
+ end ||
482
+ fail { :rule }
483
+ end
484
+
485
+ # @private
486
+ def match_unattributed #:nodoc:
487
+ apply :match_unattributed!
488
+ end
489
+
490
+ # @private
491
+ def match_unattributed! #:nodoc:
492
+ begin
493
+ p0 = @scanner.pos
494
+ begin
495
+ (r0_0 = match(:unattributed)) &&
496
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\/)/) &&
497
+ (r0_1 = match(:terms)) &&
498
+ Choice.parsed(select_captures([r0_0, r0_1]))
499
+ end || begin
500
+ @scanner.pos = p0
501
+ false
502
+ end
503
+ end ||
504
+ match(:terms) ||
505
+ fail! { :unattributed }
506
+ end
507
+
508
+ # @private
509
+ def match_expression #:nodoc:
510
+ apply :match_expression!
511
+ end
512
+
513
+ # @private
514
+ def match_expression! #:nodoc:
515
+ begin
516
+ p0 = @scanner.pos
517
+ begin
518
+ (r0_0 = match(:expression)) &&
519
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\/)/) &&
520
+ (r0_1 = match(:attributed)) &&
521
+ Choice.parsed(select_captures([r0_0, r0_1]))
522
+ end || begin
523
+ @scanner.pos = p0
524
+ false
525
+ end
526
+ end ||
527
+ match(:attributed) ||
528
+ fail! { :expression }
529
+ end
530
+
531
+ # @private
532
+ def match_attributed #:nodoc:
533
+ apply :match_attributed!
534
+ end
535
+
536
+ # @private
537
+ def match_attributed! #:nodoc:
538
+ begin
539
+ p0 = @scanner.pos
540
+ begin
541
+ (r0_0 = ((r = match(:attributed)) ? [r] : [])) &&
542
+ (r0_1 = begin
543
+ match(:semantic_action) ||
544
+ match(:node_action)
545
+ end) &&
546
+ AttributedSequence.parsed(select_captures([r0_0, r0_1]))
547
+ end || begin
548
+ @scanner.pos = p0
549
+ false
550
+ end
551
+ end ||
552
+ match(:attributed_terms) ||
553
+ fail! { :attributed }
554
+ end
555
+
556
+ # @private
557
+ def match_old_node_action #:nodoc:
558
+ apply :match_old_node_action!
559
+ end
560
+
561
+ # @private
562
+ def match_old_node_action! #:nodoc:
563
+ begin
564
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>[[:lower:]])(?>(?>[[:alnum:]_])*))|(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>(?>(?>[[:upper:]])(?>(?>[[:alnum:]_])*)(?>::))*)(?>[[:upper:]])(?>(?>[[:alnum:]_])*)))(?>(?>(?>\.)(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>[[:lower:]])(?>(?>[[:alnum:]_])*))))?))/) &&
565
+ @scanner[1]
566
+ end ||
567
+ fail { :old_node_action }
568
+ end
569
+
570
+ # @private
571
+ def match_semantic_action #:nodoc:
572
+ apply :match_semantic_action!
573
+ end
574
+
575
+ # @private
576
+ def match_semantic_action! #:nodoc:
577
+ begin
578
+ p0 = @scanner.pos
579
+ begin
580
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{)/) &&
581
+ (r0_0 = match(:action_code)) &&
582
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\})/) &&
583
+ SemanticAction.parsed(select_captures([r0_0]))
584
+ end || begin
585
+ @scanner.pos = p0
586
+ false
587
+ end
588
+ end ||
589
+ fail { :semantic_action }
590
+ end
591
+
592
+ # @private
593
+ def match_action_code #:nodoc:
594
+ apply :match_action_code!
595
+ end
596
+
597
+ # @private
598
+ def match_action_code! #:nodoc:
599
+ begin
600
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?>\{)(?>(?>[^}])*)(?>\})|[^{}])*)/) &&
601
+ @scanner[1]
602
+ end ||
603
+ fail { :action_code }
604
+ end
605
+
606
+ # @private
607
+ def match_node_action #:nodoc:
608
+ apply :match_node_action!
609
+ end
610
+
611
+ # @private
612
+ def match_node_action! #:nodoc:
613
+ begin
614
+ p0 = @scanner.pos
615
+ begin
616
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><)/) &&
617
+ (r0_0 = ((r = begin
618
+ p1 = @scanner.pos
619
+ begin
620
+ (r1_0 = begin
621
+ begin
622
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:lower:]])(?>(?>[[:alnum:]_])*))/) &&
623
+ @scanner[1]
624
+ end ||
625
+ begin
626
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?>(?>[[:upper:]])(?>(?>[[:alnum:]_])*)(?>::))*)(?>[[:upper:]])(?>(?>[[:alnum:]_])*))/) &&
627
+ @scanner[1]
628
+ end
629
+ end) &&
630
+ (r1_1 = ((r = begin
631
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\.))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:lower:]])(?>(?>[[:alnum:]_])*)))/) &&
632
+ @scanner[1]
633
+ end) ? [r] : [])) &&
634
+ [r1_0, r1_1]
635
+ end || begin
636
+ @scanner.pos = p1
637
+ false
638
+ end
639
+ end) ? [r] : [])) &&
640
+ (r0_1 = ((r = begin
641
+ begin
642
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>")(?>(?>(?>\\)(?>.)|[^"])*)(?>"))/) &&
643
+ @scanner[1]
644
+ end ||
645
+ begin
646
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>')(?>(?>(?>\\)(?>.)|[^'])*)(?>'))/) &&
647
+ @scanner[1]
648
+ end ||
649
+ begin
650
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%\()(?>(?>(?>\\)(?>.)|[^)])*)(?>\)))/) &&
651
+ @scanner[1]
652
+ end ||
653
+ begin
654
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%\{)(?>(?>(?>\\)(?>.)|[^}])*)(?>\}))/) &&
655
+ @scanner[1]
656
+ end ||
657
+ begin
658
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%\[)(?>(?>(?>\\)(?>.)|[^\]])*)(?>\]))/) &&
659
+ @scanner[1]
660
+ end ||
661
+ begin
662
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%<)(?>(?>(?>\\)(?>.)|[^>])*)(?>>))/) &&
663
+ @scanner[1]
664
+ end ||
665
+ begin
666
+ p1 = @scanner.pos
667
+ begin
668
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
669
+ begin
670
+ p2 = @scanner.pos
671
+ begin
672
+ @scanner.skip(/%/) &&
673
+ (r2_0 = @scanner.scan(/[[:punct:]]/)) &&
674
+ begin
675
+ while begin
676
+ @scanner.skip(/(?>\\)(?>.)/) ||
677
+ begin
678
+ p3 = @scanner.pos
679
+ begin
680
+ @scanner.skip(/(?!#{r2_0})/) &&
681
+ @scanner.skip(/./) &&
682
+ true
683
+ end || begin
684
+ @scanner.pos = p3
685
+ false
686
+ end
687
+ end
688
+ end; end
689
+ true
690
+ end &&
691
+ @scanner.skip(/#{r2_0}/) &&
692
+ @scanner.string[p2...(@scanner.pos)]
693
+ end || begin
694
+ @scanner.pos = p2
695
+ false
696
+ end
697
+ end
698
+ end || begin
699
+ @scanner.pos = p1
700
+ false
701
+ end
702
+ end
703
+ end) ? [r] : [])) &&
704
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>>)/) &&
705
+ NodeAction.parsed([r0_0, r0_1])
706
+ end || begin
707
+ @scanner.pos = p0
708
+ false
709
+ end
710
+ end ||
711
+ fail { :node_action }
712
+ end
713
+
714
+ # @private
715
+ def match_attributed_terms #:nodoc:
716
+ apply :match_attributed_terms!
717
+ end
718
+
719
+ # @private
720
+ def match_attributed_terms! #:nodoc:
721
+ begin
722
+ p0 = @scanner.pos
723
+ begin
724
+ (r0_0 = match(:attributed)) &&
725
+ (r0_1 = match(:term)) &&
726
+ Sequence.parsed(select_captures([r0_0, r0_1]))
727
+ end || begin
728
+ @scanner.pos = p0
729
+ false
730
+ end
731
+ end ||
732
+ match(:terms) ||
733
+ fail! { :attributed_terms }
734
+ end
735
+
736
+ # @private
737
+ def match_terms #:nodoc:
738
+ apply :match_terms!
739
+ end
740
+
741
+ # @private
742
+ def match_terms! #:nodoc:
743
+ begin
744
+ p0 = @scanner.pos
745
+ begin
746
+ (r0_0 = match(:terms)) &&
747
+ (r0_1 = match(:term)) &&
748
+ Sequence.parsed(select_captures([r0_0, r0_1]))
749
+ end || begin
750
+ @scanner.pos = p0
751
+ false
752
+ end
753
+ end ||
754
+ match(:term) ||
755
+ fail! { :terms }
756
+ end
757
+
758
+ # @private
759
+ def match_term #:nodoc:
760
+ apply :match_term!
761
+ end
762
+
763
+ # @private
764
+ def match_term! #:nodoc:
765
+ match(:fail_expr) ||
766
+ match(:labeled) ||
767
+ match(:labelable) ||
768
+ fail! { :term }
769
+ end
770
+
771
+ # @private
772
+ def match_fail_expr #:nodoc:
773
+ apply :match_fail_expr!
774
+ end
775
+
776
+ # @private
777
+ def match_fail_expr! #:nodoc:
778
+ begin
779
+ p0 = @scanner.pos
780
+ begin
781
+ (r0_0 = begin
782
+ begin
783
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>fail)(?![[:alnum:]_]))/) &&
784
+ @scanner[1]
785
+ end ||
786
+ begin
787
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>fail_rule)(?![[:alnum:]_]))/) &&
788
+ @scanner[1]
789
+ end ||
790
+ begin
791
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>fail_parse)(?![[:alnum:]_]))/) &&
792
+ @scanner[1]
793
+ end ||
794
+ begin
795
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>expected)(?![[:alnum:]_]))/) &&
796
+ @scanner[1]
797
+ end
798
+ end) &&
799
+ (r0_1 = begin
800
+ begin
801
+ p1 = @scanner.pos
802
+ begin
803
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\()/) &&
804
+ (r1_0 = begin
805
+ begin
806
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>")(?>(?>(?>\\)(?>.)|[^"])*)(?>"))/) &&
807
+ @scanner[1]
808
+ end ||
809
+ begin
810
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>')(?>(?>(?>\\)(?>.)|[^'])*)(?>'))/) &&
811
+ @scanner[1]
812
+ end ||
813
+ begin
814
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%\()(?>(?>(?>\\)(?>.)|[^)])*)(?>\)))/) &&
815
+ @scanner[1]
816
+ end ||
817
+ begin
818
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%\{)(?>(?>(?>\\)(?>.)|[^}])*)(?>\}))/) &&
819
+ @scanner[1]
820
+ end ||
821
+ begin
822
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%\[)(?>(?>(?>\\)(?>.)|[^\]])*)(?>\]))/) &&
823
+ @scanner[1]
824
+ end ||
825
+ begin
826
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%<)(?>(?>(?>\\)(?>.)|[^>])*)(?>>))/) &&
827
+ @scanner[1]
828
+ end ||
829
+ begin
830
+ p2 = @scanner.pos
831
+ begin
832
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
833
+ begin
834
+ p3 = @scanner.pos
835
+ begin
836
+ @scanner.skip(/%/) &&
837
+ (r3_0 = @scanner.scan(/[[:punct:]]/)) &&
838
+ begin
839
+ while begin
840
+ @scanner.skip(/(?>\\)(?>.)/) ||
841
+ begin
842
+ p4 = @scanner.pos
843
+ begin
844
+ @scanner.skip(/(?!#{r3_0})/) &&
845
+ @scanner.skip(/./) &&
846
+ true
847
+ end || begin
848
+ @scanner.pos = p4
849
+ false
850
+ end
851
+ end
852
+ end; end
853
+ true
854
+ end &&
855
+ @scanner.skip(/#{r3_0}/) &&
856
+ @scanner.string[p3...(@scanner.pos)]
857
+ end || begin
858
+ @scanner.pos = p3
859
+ false
860
+ end
861
+ end
862
+ end || begin
863
+ @scanner.pos = p2
864
+ false
865
+ end
866
+ end
867
+ end) &&
868
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\))/) &&
869
+ r1_0
870
+ end || begin
871
+ @scanner.pos = p1
872
+ false
873
+ end
874
+ end ||
875
+ begin
876
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>")(?>(?>(?>\\)(?>.)|[^"])*)(?>"))/) &&
877
+ @scanner[1]
878
+ end ||
879
+ begin
880
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>')(?>(?>(?>\\)(?>.)|[^'])*)(?>'))/) &&
881
+ @scanner[1]
882
+ end ||
883
+ begin
884
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%\()(?>(?>(?>\\)(?>.)|[^)])*)(?>\)))/) &&
885
+ @scanner[1]
886
+ end ||
887
+ begin
888
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%\{)(?>(?>(?>\\)(?>.)|[^}])*)(?>\}))/) &&
889
+ @scanner[1]
890
+ end ||
891
+ begin
892
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%\[)(?>(?>(?>\\)(?>.)|[^\]])*)(?>\]))/) &&
893
+ @scanner[1]
894
+ end ||
895
+ begin
896
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%<)(?>(?>(?>\\)(?>.)|[^>])*)(?>>))/) &&
897
+ @scanner[1]
898
+ end ||
899
+ begin
900
+ p1 = @scanner.pos
901
+ begin
902
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
903
+ begin
904
+ p2 = @scanner.pos
905
+ begin
906
+ @scanner.skip(/%/) &&
907
+ (r2_0 = @scanner.scan(/[[:punct:]]/)) &&
908
+ begin
909
+ while begin
910
+ @scanner.skip(/(?>\\)(?>.)/) ||
911
+ begin
912
+ p3 = @scanner.pos
913
+ begin
914
+ @scanner.skip(/(?!#{r2_0})/) &&
915
+ @scanner.skip(/./) &&
916
+ true
917
+ end || begin
918
+ @scanner.pos = p3
919
+ false
920
+ end
921
+ end
922
+ end; end
923
+ true
924
+ end &&
925
+ @scanner.skip(/#{r2_0}/) &&
926
+ @scanner.string[p2...(@scanner.pos)]
927
+ end || begin
928
+ @scanner.pos = p2
929
+ false
930
+ end
931
+ end
932
+ end || begin
933
+ @scanner.pos = p1
934
+ false
935
+ end
936
+ end
937
+ end) &&
938
+ Fail.parsed([r0_0, r0_1])
939
+ end || begin
940
+ @scanner.pos = p0
941
+ false
942
+ end
943
+ end ||
944
+ fail { :fail_expr }
945
+ end
946
+
947
+ # @private
948
+ def match_labeled #:nodoc:
949
+ apply :match_labeled!
950
+ end
951
+
952
+ # @private
953
+ def match_labeled! #:nodoc:
954
+ begin
955
+ p0 = @scanner.pos
956
+ begin
957
+ (r0_0 = begin
958
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:lower:]])(?>(?>[[:alnum:]_])*))/) &&
959
+ @scanner[1]
960
+ end) &&
961
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>:)/) &&
962
+ (r0_1 = match(:labelable)) &&
963
+ Label.parsed(select_captures([r0_0, r0_1]))
964
+ end || begin
965
+ @scanner.pos = p0
966
+ false
967
+ end
968
+ end ||
969
+ fail { :labeled }
970
+ end
971
+
972
+ # @private
973
+ def match_labelable #:nodoc:
974
+ apply :match_labelable!
975
+ end
976
+
977
+ # @private
978
+ def match_labelable! #:nodoc:
979
+ match(:semantic_term) ||
980
+ match(:list) ||
981
+ match(:list_term) ||
982
+ fail! { :labelable }
983
+ end
984
+
985
+ # @private
986
+ def match_semantic_term #:nodoc:
987
+ apply :match_semantic_term!
988
+ end
989
+
990
+ # @private
991
+ def match_semantic_term! #:nodoc:
992
+ begin
993
+ p0 = @scanner.pos
994
+ begin
995
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\^)/) &&
996
+ match(:semantic_action)
997
+ end || begin
998
+ @scanner.pos = p0
999
+ false
1000
+ end
1001
+ end ||
1002
+ begin
1003
+ p0 = @scanner.pos
1004
+ begin
1005
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>&)/) &&
1006
+ (r0_0 = match(:semantic_action)) &&
1007
+ (Assert[r0_0])
1008
+ end || begin
1009
+ @scanner.pos = p0
1010
+ false
1011
+ end
1012
+ end ||
1013
+ begin
1014
+ p0 = @scanner.pos
1015
+ begin
1016
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>!)/) &&
1017
+ (r0_0 = match(:semantic_action)) &&
1018
+ (Disallow[r0_0])
1019
+ end || begin
1020
+ @scanner.pos = p0
1021
+ false
1022
+ end
1023
+ end ||
1024
+ begin
1025
+ p0 = @scanner.pos
1026
+ begin
1027
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>~)/) &&
1028
+ (r0_0 = match(:semantic_action)) &&
1029
+ (Skip[r0_0])
1030
+ end || begin
1031
+ @scanner.pos = p0
1032
+ false
1033
+ end
1034
+ end ||
1035
+ fail { :semantic_term }
1036
+ end
1037
+
1038
+ # @private
1039
+ def match_list #:nodoc:
1040
+ apply :match_list!
1041
+ end
1042
+
1043
+ # @private
1044
+ def match_list! #:nodoc:
1045
+ begin
1046
+ p0 = @scanner.pos
1047
+ begin
1048
+ (r0_0 = match(:list_term)) &&
1049
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\*))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>,))/) &&
1050
+ (r0_1 = match(:list_term)) &&
1051
+ (list0 r0_0, r0_1)
1052
+ end || begin
1053
+ @scanner.pos = p0
1054
+ false
1055
+ end
1056
+ end ||
1057
+ begin
1058
+ p0 = @scanner.pos
1059
+ begin
1060
+ (r0_0 = match(:list_term)) &&
1061
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\+))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>,))/) &&
1062
+ (r0_1 = match(:list_term)) &&
1063
+ (list1 r0_0, r0_1)
1064
+ end || begin
1065
+ @scanner.pos = p0
1066
+ false
1067
+ end
1068
+ end ||
1069
+ begin
1070
+ p0 = @scanner.pos
1071
+ begin
1072
+ (r0_0 = match(:list_term)) &&
1073
+ (r0_1 = match(:repeat_count)) &&
1074
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>,)/) &&
1075
+ (r0_2 = match(:list_term)) &&
1076
+ ListParser.parsed(select_captures([r0_0, r0_1, r0_2]))
1077
+ end || begin
1078
+ @scanner.pos = p0
1079
+ false
1080
+ end
1081
+ end ||
1082
+ fail { :list }
1083
+ end
1084
+
1085
+ # @private
1086
+ def match_list_term #:nodoc:
1087
+ apply :match_list_term!
1088
+ end
1089
+
1090
+ # @private
1091
+ def match_list_term! #:nodoc:
1092
+ match(:prefixed) ||
1093
+ match(:prefixable) ||
1094
+ (fail! { :term })
1095
+ end
1096
+
1097
+ # @private
1098
+ def match_prefixed #:nodoc:
1099
+ apply :match_prefixed!
1100
+ end
1101
+
1102
+ # @private
1103
+ def match_prefixed! #:nodoc:
1104
+ begin
1105
+ p0 = @scanner.pos
1106
+ begin
1107
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>&)/) &&
1108
+ (r0_0 = match(:prefixable)) &&
1109
+ Assert.parsed(select_captures([r0_0]))
1110
+ end || begin
1111
+ @scanner.pos = p0
1112
+ false
1113
+ end
1114
+ end ||
1115
+ begin
1116
+ p0 = @scanner.pos
1117
+ begin
1118
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>!)/) &&
1119
+ (r0_0 = match(:prefixable)) &&
1120
+ Disallow.parsed(select_captures([r0_0]))
1121
+ end || begin
1122
+ @scanner.pos = p0
1123
+ false
1124
+ end
1125
+ end ||
1126
+ begin
1127
+ p0 = @scanner.pos
1128
+ begin
1129
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>~)/) &&
1130
+ (r0_0 = match(:prefixable)) &&
1131
+ Skip.parsed(select_captures([r0_0]))
1132
+ end || begin
1133
+ @scanner.pos = p0
1134
+ false
1135
+ end
1136
+ end ||
1137
+ begin
1138
+ p0 = @scanner.pos
1139
+ begin
1140
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>@)/) &&
1141
+ (r0_0 = match(:prefixable)) &&
1142
+ Token.parsed(select_captures([r0_0]))
1143
+ end || begin
1144
+ @scanner.pos = p0
1145
+ false
1146
+ end
1147
+ end ||
1148
+ fail { :prefixed }
1149
+ end
1150
+
1151
+ # @private
1152
+ def match_prefixable #:nodoc:
1153
+ apply :match_prefixable!
1154
+ end
1155
+
1156
+ # @private
1157
+ def match_prefixable! #:nodoc:
1158
+ match(:prefixed) ||
1159
+ match(:suffixable) ||
1160
+ (fail! { :primary })
1161
+ end
1162
+
1163
+ # @private
1164
+ def match_suffixed #:nodoc:
1165
+ apply :match_suffixed!
1166
+ end
1167
+
1168
+ # @private
1169
+ def match_suffixed! #:nodoc:
1170
+ begin
1171
+ p0 = @scanner.pos
1172
+ begin
1173
+ (r0_0 = match(:suffixable)) &&
1174
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\?)/) &&
1175
+ (optional r0_0)
1176
+ end || begin
1177
+ @scanner.pos = p0
1178
+ false
1179
+ end
1180
+ end ||
1181
+ begin
1182
+ p0 = @scanner.pos
1183
+ begin
1184
+ (r0_0 = match(:suffixable)) &&
1185
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\*)/) &&
1186
+ @scanner.skip(/(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>,))/) &&
1187
+ (zero_or_more r0_0)
1188
+ end || begin
1189
+ @scanner.pos = p0
1190
+ false
1191
+ end
1192
+ end ||
1193
+ begin
1194
+ p0 = @scanner.pos
1195
+ begin
1196
+ (r0_0 = match(:suffixable)) &&
1197
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\+)/) &&
1198
+ @scanner.skip(/(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>,))/) &&
1199
+ (one_or_more r0_0)
1200
+ end || begin
1201
+ @scanner.pos = p0
1202
+ false
1203
+ end
1204
+ end ||
1205
+ begin
1206
+ p0 = @scanner.pos
1207
+ begin
1208
+ (r0_0 = match(:suffixable)) &&
1209
+ (r0_1 = match(:repeat_count)) &&
1210
+ @scanner.skip(/(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>,))/) &&
1211
+ Repeat.parsed(select_captures([r0_0, r0_1]))
1212
+ end || begin
1213
+ @scanner.pos = p0
1214
+ false
1215
+ end
1216
+ end ||
1217
+ fail { :suffixed }
1218
+ end
1219
+
1220
+ # @private
1221
+ def match_repeat_count #:nodoc:
1222
+ apply :match_repeat_count!
1223
+ end
1224
+
1225
+ # @private
1226
+ def match_repeat_count! #:nodoc:
1227
+ begin
1228
+ p0 = @scanner.pos
1229
+ begin
1230
+ (r0_0 = begin
1231
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:digit:]])+)/) &&
1232
+ @scanner[1]
1233
+ end) &&
1234
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\.\.)/) &&
1235
+ (r0_1 = begin
1236
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:digit:]])+)/) &&
1237
+ @scanner[1]
1238
+ end) &&
1239
+ ([r0_0, r0_1].map {|s| s.to_i })
1240
+ end || begin
1241
+ @scanner.pos = p0
1242
+ false
1243
+ end
1244
+ end ||
1245
+ begin
1246
+ p0 = @scanner.pos
1247
+ begin
1248
+ (r0_0 = begin
1249
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:digit:]])+)/) &&
1250
+ @scanner[1]
1251
+ end) &&
1252
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\.\.)/) &&
1253
+ ([r0_0.to_i, nil])
1254
+ end || begin
1255
+ @scanner.pos = p0
1256
+ false
1257
+ end
1258
+ end ||
1259
+ begin
1260
+ p0 = @scanner.pos
1261
+ begin
1262
+ (r0_0 = begin
1263
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:digit:]])+)/) &&
1264
+ @scanner[1]
1265
+ end) &&
1266
+ ([r0_0.to_i] * 2)
1267
+ end || begin
1268
+ @scanner.pos = p0
1269
+ false
1270
+ end
1271
+ end ||
1272
+ fail { :repeat_count }
1273
+ end
1274
+
1275
+ # @private
1276
+ def match_suffixable #:nodoc:
1277
+ apply :match_suffixable!
1278
+ end
1279
+
1280
+ # @private
1281
+ def match_suffixable! #:nodoc:
1282
+ match(:suffixed) ||
1283
+ match(:primary) ||
1284
+ (fail! { :primary })
1285
+ end
1286
+
1287
+ # @private
1288
+ def match_primary #:nodoc:
1289
+ apply :match_primary!
1290
+ end
1291
+
1292
+ # @private
1293
+ def match_primary! #:nodoc:
1294
+ begin
1295
+ p0 = @scanner.pos
1296
+ begin
1297
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\()/) &&
1298
+ (r0_0 = match(:expression)) &&
1299
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\))/) &&
1300
+ r0_0
1301
+ end || begin
1302
+ @scanner.pos = p0
1303
+ false
1304
+ end
1305
+ end ||
1306
+ match(:atom) ||
1307
+ fail! { :primary }
1308
+ end
1309
+
1310
+ # @private
1311
+ def match_atom #:nodoc:
1312
+ apply :match_atom!
1313
+ end
1314
+
1315
+ # @private
1316
+ def match_atom! #:nodoc:
1317
+ begin
1318
+ p0 = @scanner.pos
1319
+ begin
1320
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>EOF)(?![[:alnum:]_]))/) &&
1321
+ Eof.parsed([])
1322
+ end || begin
1323
+ @scanner.pos = p0
1324
+ false
1325
+ end
1326
+ end ||
1327
+ begin
1328
+ p0 = @scanner.pos
1329
+ begin
1330
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>E)(?![[:alnum:]_]))/) &&
1331
+ ESymbol.parsed([])
1332
+ end || begin
1333
+ @scanner.pos = p0
1334
+ false
1335
+ end
1336
+ end ||
1337
+ begin
1338
+ p0 = @scanner.pos
1339
+ begin
1340
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>super)(?![[:alnum:]_]))/) &&
1341
+ (Super[:pending])
1342
+ end || begin
1343
+ @scanner.pos = p0
1344
+ false
1345
+ end
1346
+ end ||
1347
+ begin
1348
+ p0 = @scanner.pos
1349
+ begin
1350
+ (r0_0 = begin
1351
+ begin
1352
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>ALNUM)(?![[:alnum:]_]))/) &&
1353
+ @scanner[1]
1354
+ end ||
1355
+ begin
1356
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>ALPHA)(?![[:alnum:]_]))/) &&
1357
+ @scanner[1]
1358
+ end ||
1359
+ begin
1360
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>ASCII)(?![[:alnum:]_]))/) &&
1361
+ @scanner[1]
1362
+ end ||
1363
+ begin
1364
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>BLANK)(?![[:alnum:]_]))/) &&
1365
+ @scanner[1]
1366
+ end ||
1367
+ begin
1368
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>CNTRL)(?![[:alnum:]_]))/) &&
1369
+ @scanner[1]
1370
+ end ||
1371
+ begin
1372
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>DIGIT)(?![[:alnum:]_]))/) &&
1373
+ @scanner[1]
1374
+ end ||
1375
+ begin
1376
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>GRAPH)(?![[:alnum:]_]))/) &&
1377
+ @scanner[1]
1378
+ end ||
1379
+ begin
1380
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>LOWER)(?![[:alnum:]_]))/) &&
1381
+ @scanner[1]
1382
+ end ||
1383
+ begin
1384
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>PRINT)(?![[:alnum:]_]))/) &&
1385
+ @scanner[1]
1386
+ end ||
1387
+ begin
1388
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>PUNCT)(?![[:alnum:]_]))/) &&
1389
+ @scanner[1]
1390
+ end ||
1391
+ begin
1392
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>SPACE)(?![[:alnum:]_]))/) &&
1393
+ @scanner[1]
1394
+ end ||
1395
+ begin
1396
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>UPPER)(?![[:alnum:]_]))/) &&
1397
+ @scanner[1]
1398
+ end ||
1399
+ begin
1400
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>XDIGIT)(?![[:alnum:]_]))/) &&
1401
+ @scanner[1]
1402
+ end ||
1403
+ begin
1404
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>WORD)(?![[:alnum:]_]))/) &&
1405
+ @scanner[1]
1406
+ end
1407
+ end) &&
1408
+ (posix_class r0_0)
1409
+ end || begin
1410
+ @scanner.pos = p0
1411
+ false
1412
+ end
1413
+ end ||
1414
+ begin
1415
+ p0 = @scanner.pos
1416
+ begin
1417
+ (r0_0 = begin
1418
+ p1 = @scanner.pos
1419
+ begin
1420
+ @scanner.skip(/(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>EOF)(?![[:alnum:]_])))/) &&
1421
+ begin
1422
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:alpha:]])(?>(?>[[:alnum:]_])*))/) &&
1423
+ @scanner[1]
1424
+ end
1425
+ end || begin
1426
+ @scanner.pos = p1
1427
+ false
1428
+ end
1429
+ end) &&
1430
+ @scanner.skip(/(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><\-))/) &&
1431
+ Apply.parsed([r0_0])
1432
+ end || begin
1433
+ @scanner.pos = p0
1434
+ false
1435
+ end
1436
+ end ||
1437
+ begin
1438
+ p0 = @scanner.pos
1439
+ begin
1440
+ (r0_0 = begin
1441
+ begin
1442
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>")(?>(?>(?>\\)(?>.)|[^"])*)(?>"))/) &&
1443
+ @scanner[1]
1444
+ end ||
1445
+ begin
1446
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>')(?>(?>(?>\\)(?>.)|[^'])*)(?>'))/) &&
1447
+ @scanner[1]
1448
+ end ||
1449
+ begin
1450
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%\()(?>(?>(?>\\)(?>.)|[^)])*)(?>\)))/) &&
1451
+ @scanner[1]
1452
+ end ||
1453
+ begin
1454
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%\{)(?>(?>(?>\\)(?>.)|[^}])*)(?>\}))/) &&
1455
+ @scanner[1]
1456
+ end ||
1457
+ begin
1458
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%\[)(?>(?>(?>\\)(?>.)|[^\]])*)(?>\]))/) &&
1459
+ @scanner[1]
1460
+ end ||
1461
+ begin
1462
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%<)(?>(?>(?>\\)(?>.)|[^>])*)(?>>))/) &&
1463
+ @scanner[1]
1464
+ end ||
1465
+ begin
1466
+ p1 = @scanner.pos
1467
+ begin
1468
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
1469
+ begin
1470
+ p2 = @scanner.pos
1471
+ begin
1472
+ @scanner.skip(/%/) &&
1473
+ (r2_0 = @scanner.scan(/[[:punct:]]/)) &&
1474
+ begin
1475
+ while begin
1476
+ @scanner.skip(/(?>\\)(?>.)/) ||
1477
+ begin
1478
+ p3 = @scanner.pos
1479
+ begin
1480
+ @scanner.skip(/(?!#{r2_0})/) &&
1481
+ @scanner.skip(/./) &&
1482
+ true
1483
+ end || begin
1484
+ @scanner.pos = p3
1485
+ false
1486
+ end
1487
+ end
1488
+ end; end
1489
+ true
1490
+ end &&
1491
+ @scanner.skip(/#{r2_0}/) &&
1492
+ @scanner.string[p2...(@scanner.pos)]
1493
+ end || begin
1494
+ @scanner.pos = p2
1495
+ false
1496
+ end
1497
+ end
1498
+ end || begin
1499
+ @scanner.pos = p1
1500
+ false
1501
+ end
1502
+ end
1503
+ end) &&
1504
+ (literal r0_0)
1505
+ end || begin
1506
+ @scanner.pos = p0
1507
+ false
1508
+ end
1509
+ end ||
1510
+ begin
1511
+ p0 = @scanner.pos
1512
+ begin
1513
+ (r0_0 = begin
1514
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>`)(?>(?>(?>\\)(?>.)|[^`])*)(?>`))/) &&
1515
+ @scanner[1]
1516
+ end) &&
1517
+ (word_literal r0_0)
1518
+ end || begin
1519
+ @scanner.pos = p0
1520
+ false
1521
+ end
1522
+ end ||
1523
+ begin
1524
+ p0 = @scanner.pos
1525
+ begin
1526
+ (r0_0 = begin
1527
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>\[)(?>(?>(?!\])(?>(?>\[:)(?>(?>alnum)(?![[:alnum:]_])|(?>alpha)(?![[:alnum:]_])|(?>ascii)(?![[:alnum:]_])|(?>blank)(?![[:alnum:]_])|(?>cntrl)(?![[:alnum:]_])|(?>digit)(?![[:alnum:]_])|(?>graph)(?![[:alnum:]_])|(?>lower)(?![[:alnum:]_])|(?>print)(?![[:alnum:]_])|(?>punct)(?![[:alnum:]_])|(?>space)(?![[:alnum:]_])|(?>upper)(?![[:alnum:]_])|(?>xdigit)(?![[:alnum:]_]))(?>:\])|(?>(?>\\)(?>[0-3])(?>[0-7])(?>[0-7])|(?>\\x)(?>[[:xdigit:]])(?>[[:xdigit:]])|(?>\\)(?>.)|[^\\\]])(?>(?>(?>\-)(?>(?>\\)(?>[0-3])(?>[0-7])(?>[0-7])|(?>\\x)(?>[[:xdigit:]])(?>[[:xdigit:]])|(?>\\)(?>.)|[^\\\]]))?)))+)(?>\]))/) &&
1528
+ @scanner[1]
1529
+ end) &&
1530
+ (char_class r0_0)
1531
+ end || begin
1532
+ @scanner.pos = p0
1533
+ false
1534
+ end
1535
+ end ||
1536
+ begin
1537
+ p0 = @scanner.pos
1538
+ begin
1539
+ (r0_0 = begin
1540
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>\$)(?>[[:lower:]])(?>(?>[[:alnum:]_])*))/) &&
1541
+ @scanner[1]
1542
+ end) &&
1543
+ BackReference.parsed([r0_0])
1544
+ end || begin
1545
+ @scanner.pos = p0
1546
+ false
1547
+ end
1548
+ end ||
1549
+ begin
1550
+ p0 = @scanner.pos
1551
+ begin
1552
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\.)/) &&
1553
+ (Match[/./])
1554
+ end || begin
1555
+ @scanner.pos = p0
1556
+ false
1557
+ end
1558
+ end ||
1559
+ fail { :atom }
1560
+ end
1561
+
1562
+ end
1563
+ end
1564
+ end
1565
+
1566
+ if __FILE__ == $0
1567
+ require 'rubygems'
1568
+ require 'rattler'
1569
+ Rattler::Util::GrammarCLI.run(Rattler::Compiler::Metagrammar)
1570
+ end