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
@@ -0,0 +1,37 @@
1
+ require 'rattler/compiler/parser_generator'
2
+
3
+ module Rattler::Compiler::ParserGenerator
4
+
5
+ # @private
6
+ class AttributedSequenceGenerator < ExprGenerator #:nodoc:
7
+ include SequenceGenerating
8
+
9
+ def gen_basic(sequence, scope = ParserScope.empty)
10
+ with_backtracking do
11
+ gen_children_capturing(sequence, scope.nest) do |last_child, scope|
12
+ gen_nested last_child, :basic, scope
13
+ end
14
+ end
15
+ end
16
+
17
+ end
18
+
19
+ # @private
20
+ class NestedAttributedSequenceGenerator < AttributedSequenceGenerator #:nodoc:
21
+ include Nested
22
+ end
23
+
24
+ def AttributedSequenceGenerator.nested(*args)
25
+ NestedAttributedSequenceGenerator.new(*args)
26
+ end
27
+
28
+ # @private
29
+ class TopLevelAttributedSequenceGenerator < AttributedSequenceGenerator #:nodoc:
30
+ include TopLevel
31
+ end
32
+
33
+ def AttributedSequenceGenerator.top_level(*args)
34
+ TopLevelAttributedSequenceGenerator.new(*args)
35
+ end
36
+
37
+ end
@@ -1,48 +1,48 @@
1
- require 'rattler/back_end/parser_generator'
1
+ require 'rattler/compiler/parser_generator'
2
2
 
3
- module Rattler::BackEnd::ParserGenerator
3
+ module Rattler::Compiler::ParserGenerator
4
4
 
5
5
  # @private
6
6
  class BackReferenceGenerator < ExprGenerator #:nodoc:
7
7
 
8
- def gen_basic(ref, scope={})
8
+ def gen_basic(ref, scope = ParserScope.empty)
9
9
  @g << "@scanner.scan(#{ref.re_expr(scope)})"
10
10
  end
11
11
 
12
- def gen_assert(ref, scope={})
12
+ def gen_assert(ref, scope = ParserScope.empty)
13
13
  expr do
14
14
  gen_intermediate_assert ref, scope
15
15
  @g << ' && true'
16
16
  end
17
17
  end
18
18
 
19
- def gen_disallow(ref, scope={})
19
+ def gen_disallow(ref, scope = ParserScope.empty)
20
20
  expr do
21
21
  gen_intermediate_disallow ref, scope
22
22
  @g << ' && true'
23
23
  end
24
24
  end
25
25
 
26
- def gen_token(ref, scope={})
26
+ def gen_token(ref, scope = ParserScope.empty)
27
27
  gen_basic ref, scope
28
28
  end
29
29
 
30
- def gen_skip(ref, scope={})
30
+ def gen_skip(ref, scope = ParserScope.empty)
31
31
  expr do
32
32
  gen_intermediate_skip ref, scope
33
33
  @g << ' && true'
34
34
  end
35
35
  end
36
36
 
37
- def gen_intermediate_assert(ref, scope={})
37
+ def gen_intermediate_assert(ref, scope = ParserScope.empty)
38
38
  @g << "@scanner.skip(/(?=#{ref.re_source(scope)})/)"
39
39
  end
40
40
 
41
- def gen_intermediate_disallow(ref, scope={})
41
+ def gen_intermediate_disallow(ref, scope = ParserScope.empty)
42
42
  @g << "@scanner.skip(/(?!#{ref.re_source(scope)})/)"
43
43
  end
44
44
 
45
- def gen_intermediate_skip(ref, scope={})
45
+ def gen_intermediate_skip(ref, scope = ParserScope.empty)
46
46
  @g << "@scanner.skip(#{ref.re_expr(scope)})"
47
47
  end
48
48
 
@@ -1,55 +1,43 @@
1
- require 'rattler/back_end/parser_generator'
1
+ require 'rattler/compiler/parser_generator'
2
2
 
3
- module Rattler::BackEnd::ParserGenerator
3
+ module Rattler::Compiler::ParserGenerator
4
4
 
5
5
  # @private
6
6
  class ChoiceGenerator < ExprGenerator #:nodoc:
7
7
  include NestedSubGenerating
8
8
 
9
- def gen_basic(choice, scope={})
9
+ def gen_basic(choice, scope = ParserScope.empty)
10
10
  expr :block do
11
11
  @g.intersperse_nl(choice, ' ||') {|_| generate _, :basic, scope }
12
12
  end
13
13
  end
14
14
 
15
- def gen_assert(choice, scope={})
15
+ def gen_assert(choice, scope = ParserScope.empty)
16
16
  expr do
17
17
  gen_intermediate_assert choice, scope
18
18
  @g << ' && true'
19
19
  end
20
20
  end
21
21
 
22
- def gen_disallow(choice, scope={})
22
+ def gen_disallow(choice, scope = ParserScope.empty)
23
23
  @g << '!'
24
24
  gen_intermediate_assert choice, scope
25
25
  end
26
26
 
27
- def gen_dispatch_action(choice, code, scope={})
28
- expr :block do
29
- gen_action_code(choice) { code.bind scope, "[#{result_name}]" }
30
- end
31
- end
32
-
33
- def gen_direct_action(choice, code, scope={})
34
- expr :block do
35
- gen_action_code(choice) { "(#{code.bind scope, [result_name]})" }
36
- end
37
- end
38
-
39
- def gen_token(choice, scope={})
27
+ def gen_token(choice, scope = ParserScope.empty)
40
28
  expr :block do
41
29
  @g.intersperse_nl(choice, ' ||') {|_| generate _, :token, scope }
42
30
  end
43
31
  end
44
32
 
45
- def gen_skip(choice, scope={})
33
+ def gen_skip(choice, scope = ParserScope.empty)
46
34
  expr do
47
35
  gen_intermediate_skip choice, scope
48
36
  @g << ' && true'
49
37
  end
50
38
  end
51
39
 
52
- def gen_intermediate_assert(choice, scope={})
40
+ def gen_intermediate_assert(choice, scope = ParserScope.empty)
53
41
  @g.block 'begin' do
54
42
  @g.intersperse_nl(choice, ' ||') do |_|
55
43
  generate _, :intermediate_assert, scope
@@ -57,7 +45,7 @@ module Rattler::BackEnd::ParserGenerator
57
45
  end
58
46
  end
59
47
 
60
- def gen_intermediate_skip(choice, scope={})
48
+ def gen_intermediate_skip(choice, scope = ParserScope.empty)
61
49
  @g.block 'begin' do
62
50
  @g.intersperse_nl(choice, ' ||') do |_|
63
51
  generate _, :intermediate_skip, scope
@@ -67,7 +55,7 @@ module Rattler::BackEnd::ParserGenerator
67
55
 
68
56
  private
69
57
 
70
- def gen_action_code(choice, scope={})
58
+ def gen_action_code(choice, scope = ParserScope.empty)
71
59
  @g.block("(#{result_name} = begin", 'end)') do
72
60
  @g.intersperse_nl(choice, ' ||') {|child| generate child }
73
61
  end << ' && '
@@ -1,6 +1,6 @@
1
- require 'rattler/back_end/parser_generator'
1
+ require 'rattler/compiler/parser_generator'
2
2
 
3
- module Rattler::BackEnd::ParserGenerator
3
+ module Rattler::Compiler::ParserGenerator
4
4
 
5
5
  # @private
6
6
  class DelegatingGenerator < ExprGenerator #:nodoc:
@@ -1,53 +1,45 @@
1
- require 'rattler/back_end/parser_generator'
1
+ require 'rattler/compiler/parser_generator'
2
2
 
3
- module Rattler::BackEnd::ParserGenerator
3
+ module Rattler::Compiler::ParserGenerator
4
4
 
5
5
  # @private
6
6
  class DisallowGenerator < ExprGenerator #:nodoc:
7
7
 
8
- def gen_basic(disallow, scope={})
8
+ def gen_basic(disallow, scope = ParserScope.empty)
9
9
  generate disallow.child, :disallow, scope
10
10
  end
11
11
 
12
- def gen_assert(disallow, scope={})
12
+ def gen_assert(disallow, scope = ParserScope.empty)
13
13
  @g << 'false'
14
14
  end
15
15
 
16
- def gen_disallow(disallow, scope={})
16
+ def gen_disallow(disallow, scope = ParserScope.empty)
17
17
  gen_basic disallow, scope
18
18
  end
19
19
 
20
- def gen_skip(disallow, scope={})
20
+ def gen_skip(disallow, scope = ParserScope.empty)
21
21
  gen_basic disallow, scope
22
22
  end
23
23
 
24
- def gen_dispatch_action(disallow, code, scope={})
25
- expr(:block) { gen_action disallow, code.bind(scope, '[]'), scope }
26
- end
27
-
28
- def gen_direct_action(disallow, code, scope={})
29
- expr(:block) { gen_action disallow, "(#{code.bind scope, []})", scope }
30
- end
31
-
32
- def gen_token(disallow, scope={})
24
+ def gen_token(disallow, scope = ParserScope.empty)
33
25
  expr(:block) { gen_action disallow, "''", scope }
34
26
  end
35
27
 
36
- def gen_intermediate(disallow, scope={})
28
+ def gen_intermediate(disallow, scope = ParserScope.empty)
37
29
  generate disallow.child, :intermediate_disallow, scope
38
30
  end
39
31
 
40
- def gen_intermediate_disallow(disallow, scope={})
32
+ def gen_intermediate_disallow(disallow, scope = ParserScope.empty)
41
33
  gen_intermediate disallow, scope
42
34
  end
43
35
 
44
- def gen_intermediate_skip(disallow, scope={})
36
+ def gen_intermediate_skip(disallow, scope = ParserScope.empty)
45
37
  gen_intermediate disallow, scope
46
38
  end
47
39
 
48
40
  private
49
41
 
50
- def gen_action(disallow, result_code, scope={})
42
+ def gen_action(disallow, result_code, scope = ParserScope.empty)
51
43
  gen_intermediate disallow, scope
52
44
  (@g << ' &&').newline << result_code
53
45
  end
@@ -1,6 +1,6 @@
1
- require 'rattler/back_end/parser_generator'
1
+ require 'rattler/compiler/parser_generator'
2
2
 
3
- module Rattler::BackEnd::ParserGenerator
3
+ module Rattler::Compiler::ParserGenerator
4
4
 
5
5
  # @private
6
6
  class ESymbolGenerator < ExprGenerator #:nodoc:
@@ -15,14 +15,6 @@ module Rattler::BackEnd::ParserGenerator
15
15
  @g << 'false'
16
16
  end
17
17
 
18
- def gen_dispatch_action(eof, code, scope={})
19
- @g << code.bind(scope, '[]')
20
- end
21
-
22
- def gen_direct_action(eof, code, scope={})
23
- expr { @g << code.bind(scope, []) }
24
- end
25
-
26
18
  def gen_token(*_)
27
19
  @g << "''"
28
20
  end
@@ -1,6 +1,6 @@
1
- require 'rattler/back_end/parser_generator'
1
+ require 'rattler/compiler/parser_generator'
2
2
 
3
- module Rattler::BackEnd::ParserGenerator
3
+ module Rattler::Compiler::ParserGenerator
4
4
 
5
5
  # @private
6
6
  class EofGenerator < ExprGenerator #:nodoc:
@@ -15,14 +15,6 @@ module Rattler::BackEnd::ParserGenerator
15
15
  expr { @g << '!@scanner.eos?' }
16
16
  end
17
17
 
18
- def gen_dispatch_action(eof, code, scope={})
19
- gen_symantic code.bind(scope, '[]')
20
- end
21
-
22
- def gen_direct_action(eof, code, scope={})
23
- gen_symantic '(' + code.bind(scope, []) + ')'
24
- end
25
-
26
18
  def gen_token(*_)
27
19
  gen_symantic "''"
28
20
  end
@@ -1,6 +1,6 @@
1
- require 'rattler/back_end/parser_generator'
1
+ require 'rattler/compiler/parser_generator'
2
2
 
3
- module Rattler::BackEnd::ParserGenerator
3
+ module Rattler::Compiler::ParserGenerator
4
4
 
5
5
  # @private
6
6
  class ExprGenerator #:nodoc:
@@ -14,21 +14,7 @@ module Rattler::BackEnd::ParserGenerator
14
14
  @repeat_level = repeat_level
15
15
  end
16
16
 
17
- def gen_dispatch_action(parser, code, scope={})
18
- expr :block do
19
- gen_capture { block_given? ? yield : gen_basic(parser, scope) }
20
- (@g << ' &&').newline << code.bind(scope, dispatch_action_args)
21
- end
22
- end
23
-
24
- def gen_direct_action(parser, code, scope={})
25
- expr :block do
26
- gen_capture { block_given? ? yield : gen_basic(parser, scope) }
27
- (@g << ' &&').newline << '(' << code.bind(scope, direct_action_args) << ')'
28
- end
29
- end
30
-
31
- def gen_token(parser, scope={})
17
+ def gen_token(parser, scope = ParserScope.empty)
32
18
  expr :block do
33
19
  (@g << "#{token_pos_name} = @scanner.pos").newline
34
20
  gen_intermediate_skip parser, scope
@@ -37,19 +23,19 @@ module Rattler::BackEnd::ParserGenerator
37
23
  end
38
24
  end
39
25
 
40
- def gen_intermediate(parser, scope={})
26
+ def gen_intermediate(parser, scope = ParserScope.empty)
41
27
  gen_basic parser, scope
42
28
  end
43
29
 
44
- def gen_intermediate_assert(parser, scope={})
30
+ def gen_intermediate_assert(parser, scope = ParserScope.empty)
45
31
  gen_assert parser, scope
46
32
  end
47
33
 
48
- def gen_intermediate_disallow(parser, scope={})
34
+ def gen_intermediate_disallow(parser, scope = ParserScope.empty)
49
35
  gen_disallow parser, scope
50
36
  end
51
37
 
52
- def gen_intermediate_skip(parser, scope={})
38
+ def gen_intermediate_skip(parser, scope = ParserScope.empty)
53
39
  gen_skip parser, scope
54
40
  end
55
41
 
@@ -79,23 +65,11 @@ module Rattler::BackEnd::ParserGenerator
79
65
  @g.surround("(#{result_name} = ", ')') { yield }
80
66
  end
81
67
 
82
- def dispatch_action_args
83
- "[#{result_name}]"
84
- end
85
-
86
- def direct_action_args
87
- [result_name]
88
- end
89
-
90
68
  end
91
69
 
92
70
  # @private
93
- class TopLevelGenerator < ExprGenerator #:nodoc:
94
- include TopLevelSubGenerating
95
-
96
- def generate(parser)
97
- super
98
- end
71
+ class NestedExprGenerator < ExprGenerator #:nodoc:
72
+ include NestedSubGenerating
99
73
  end
100
74
 
101
75
  end
@@ -1,11 +1,11 @@
1
- require 'rattler/back_end/parser_generator'
1
+ require 'rattler/compiler/parser_generator'
2
2
 
3
- module Rattler::BackEnd::ParserGenerator
3
+ module Rattler::Compiler::ParserGenerator
4
4
 
5
5
  # @private
6
6
  class FailGenerator < ExprGenerator #:nodoc:
7
7
 
8
- def gen_basic(fail, scope={})
8
+ def gen_basic(fail, scope = ParserScope.empty)
9
9
  case fail.attrs[:type]
10
10
  when :expr then gen_fail_expr fail.message
11
11
  when :rule then gen_fail_rule fail.message
@@ -13,6 +13,10 @@ module Rattler::BackEnd::ParserGenerator
13
13
  end
14
14
  end
15
15
 
16
+ def gen_skip(fail, scope = ParserScope.empty)
17
+ gen_basic fail, scope
18
+ end
19
+
16
20
  private
17
21
 
18
22
  def gen_fail_expr(message)
@@ -1,14 +1,12 @@
1
- require 'rattler/back_end/parser_generator'
1
+ require 'rattler/compiler/parser_generator'
2
2
 
3
- module Rattler::BackEnd::ParserGenerator
3
+ module Rattler::Compiler::ParserGenerator
4
4
 
5
5
  # @private
6
6
  GEN_METHOD_TYPES = %w{
7
7
  basic
8
8
  assert
9
9
  disallow
10
- dispatch_action
11
- direct_action
12
10
  token
13
11
  skip
14
12
  intermediate
@@ -17,7 +15,7 @@ module Rattler::BackEnd::ParserGenerator
17
15
  intermediate_skip
18
16
  }
19
17
 
20
- @private
18
+ # @private
21
19
  GEN_METHOD_NAMES = GEN_METHOD_TYPES.map {|_| :"gen_#{_}" }
22
20
 
23
21
  end
@@ -1,6 +1,6 @@
1
- require 'rattler/back_end/parser_generator'
1
+ require 'rattler/compiler/parser_generator'
2
2
 
3
- module Rattler::BackEnd::ParserGenerator
3
+ module Rattler::Compiler::ParserGenerator
4
4
 
5
5
  # @private
6
6
  class GeneralListGenerator < ExprGenerator #:nodoc:
@@ -11,7 +11,7 @@ module Rattler::BackEnd::ParserGenerator
11
11
  super
12
12
  end
13
13
 
14
- def gen_basic(list, scope={})
14
+ def gen_basic(list, scope = ParserScope.empty)
15
15
  if list.capturing?
16
16
  gen_capturing list, scope
17
17
  else
@@ -19,31 +19,19 @@ module Rattler::BackEnd::ParserGenerator
19
19
  end
20
20
  end
21
21
 
22
- def gen_dispatch_action(list, code, scope={})
23
- gen_capturing list, scope do |a|
24
- code.bind scope, "select_captures(#{a})"
25
- end
26
- end
27
-
28
- def gen_direct_action(list, code, scope={})
29
- gen_capturing list, scope do |a|
30
- '(' + code.bind(scope, ["select_captures(#{a})"]) + ')'
31
- end
32
- end
33
-
34
- def gen_assert(list, scope={})
22
+ def gen_assert(list, scope = ParserScope.empty)
35
23
  gen_predicate(list, scope) do
36
24
  @g.newline << "#{count_name} >= #{list.lower_bound}"
37
25
  end
38
26
  end
39
27
 
40
- def gen_disallow(list, scope={})
28
+ def gen_disallow(list, scope = ParserScope.empty)
41
29
  gen_predicate(list, scope) do
42
30
  @g.newline << "#{count_name} < #{list.lower_bound}"
43
31
  end
44
32
  end
45
33
 
46
- def gen_skip(list, scope={})
34
+ def gen_skip(list, scope = ParserScope.empty)
47
35
  expr :block do
48
36
  (@g << "#{count_name} = 0").newline
49
37
  (@g << "#{start_pos_name} = @scanner.pos").newline