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,16 +1,18 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
2
 
3
- include Rattler::BackEnd::ParserGenerator
3
+ include Rattler::Compiler::ParserGenerator
4
4
  include Rattler::Parsers
5
5
 
6
6
  describe SequenceGenerator do
7
7
 
8
8
  include ParserGeneratorSpecHelper
9
9
 
10
- let(:sequence) { Sequence[Match[/[[:alpha:]]+/], Match[/[[:digit:]]+/]] }
10
+ let(:sequence) { Sequence[*children] }
11
11
 
12
12
  describe '#gen_basic' do
13
13
 
14
+ let(:children) { [Match[/[[:alpha:]]+/], Match[/[[:digit:]]+/]] }
15
+
14
16
  context 'when nested' do
15
17
  it 'generates nested sequence matching code' do
16
18
  nested_code(:sequence_level => 2) {|g| g.gen_basic sequence }.
@@ -42,6 +44,148 @@ begin
42
44
  end || begin
43
45
  @scanner.pos = p0
44
46
  false
47
+ end
48
+ CODE
49
+ end
50
+ end
51
+
52
+ context 'given a sequence with a single capture and a semantic action' do
53
+
54
+ let(:children) { [Match[/\w+/], action] }
55
+
56
+ context 'when the action uses a parameter' do
57
+
58
+ let(:action) { SemanticAction['|s| "<#{s}>"'] }
59
+
60
+ it 'generates code that binds the capture to the parameter' do
61
+ top_level_code(:sequence_level => 0) {|g| g.gen_basic sequence }.
62
+ should == (<<-'CODE').strip
63
+ p0 = @scanner.pos
64
+ begin
65
+ (r0_0 = @scanner.scan(/\w+/)) &&
66
+ (r0_1 = ("<#{r0_0}>")) &&
67
+ [r0_0, r0_1]
68
+ end || begin
69
+ @scanner.pos = p0
70
+ false
71
+ end
72
+ CODE
73
+ end
74
+ end
75
+
76
+ context 'when the action uses a "_"' do
77
+
78
+ let(:action) { SemanticAction['"<#{_}>"'] }
79
+
80
+ it 'generates code that binds the capture to "_"' do
81
+ top_level_code(:sequence_level => 0) {|g| g.gen_basic sequence }.
82
+ should == (<<-'CODE').strip
83
+ p0 = @scanner.pos
84
+ begin
85
+ (r0_0 = @scanner.scan(/\w+/)) &&
86
+ (r0_1 = ("<#{r0_0}>")) &&
87
+ [r0_0, r0_1]
88
+ end || begin
89
+ @scanner.pos = p0
90
+ false
91
+ end
92
+ CODE
93
+ end
94
+ end
95
+ end
96
+
97
+ context 'given a sequence with multiple captures and a semantic action' do
98
+
99
+ let(:children) { [Match[/\d+/], Skip[Match[/\s+/]], Match[/\d+/], action] }
100
+
101
+ context 'when the action uses parameters' do
102
+
103
+ let(:action) { SemanticAction['|a,b| b + a'] }
104
+
105
+ it 'generates code that binds the captures to the parameter' do
106
+ top_level_code(:sequence_level => 0) {|g| g.gen_basic sequence }.
107
+ should == (<<-'CODE').strip
108
+ p0 = @scanner.pos
109
+ begin
110
+ (r0_0 = @scanner.scan(/\d+/)) &&
111
+ @scanner.skip(/\s+/) &&
112
+ (r0_1 = @scanner.scan(/\d+/)) &&
113
+ (r0_2 = (r0_1 + r0_0)) &&
114
+ [r0_0, r0_1, r0_2]
115
+ end || begin
116
+ @scanner.pos = p0
117
+ false
118
+ end
119
+ CODE
120
+ end
121
+ end
122
+
123
+ context 'when the action uses "_"' do
124
+
125
+ let(:action) { SemanticAction['_ * 2'] }
126
+
127
+ it 'generates code that binds the array of captures to the parameter' do
128
+ top_level_code(:sequence_level => 0) {|g| g.gen_basic sequence }.
129
+ should == (<<-'CODE').strip
130
+ p0 = @scanner.pos
131
+ begin
132
+ (r0_0 = @scanner.scan(/\d+/)) &&
133
+ @scanner.skip(/\s+/) &&
134
+ (r0_1 = @scanner.scan(/\d+/)) &&
135
+ (r0_2 = ([r0_0, r0_1] * 2)) &&
136
+ [r0_0, r0_1, r0_2]
137
+ end || begin
138
+ @scanner.pos = p0
139
+ false
140
+ end
141
+ CODE
142
+ end
143
+ end
144
+ end
145
+
146
+ context 'given a sequence with labeled captures and a semantic action' do
147
+
148
+ let(:children) { [
149
+ Label[:x, Match[/\d+/]],
150
+ Skip[Match[/\s+/]],
151
+ Label[:y, Match[/\d+/]],
152
+ SemanticAction['y + x']
153
+ ] }
154
+
155
+ it 'generates code that binds the labeled captures to the parameter' do
156
+ top_level_code(:sequence_level => 0) {|g| g.gen_basic sequence }.
157
+ should == (<<-'CODE').strip
158
+ p0 = @scanner.pos
159
+ begin
160
+ (r0_0 = @scanner.scan(/\d+/)) &&
161
+ @scanner.skip(/\s+/) &&
162
+ (r0_1 = @scanner.scan(/\d+/)) &&
163
+ (r0_2 = (r0_1 + r0_0)) &&
164
+ [r0_0, r0_1, r0_2]
165
+ end || begin
166
+ @scanner.pos = p0
167
+ false
168
+ end
169
+ CODE
170
+ end
171
+ end
172
+
173
+ context 'given a sequence with an apply' do
174
+
175
+ let(:children) { [Match[/a/], Apply[:b], Match[/c/]] }
176
+
177
+ it 'generates code that selects only the captures for the result' do
178
+ top_level_code(:sequence_level => 0) {|g| g.gen_basic sequence }.
179
+ should == (<<-CODE).strip
180
+ p0 = @scanner.pos
181
+ begin
182
+ (r0_0 = @scanner.scan(/a/)) &&
183
+ (r0_1 = match(:b)) &&
184
+ (r0_2 = @scanner.scan(/c/)) &&
185
+ select_captures([r0_0, r0_1, r0_2])
186
+ end || begin
187
+ @scanner.pos = p0
188
+ false
45
189
  end
46
190
  CODE
47
191
  end
@@ -50,6 +194,8 @@ end
50
194
 
51
195
  describe '#gen_assert' do
52
196
 
197
+ let(:children) { [Match[/[[:alpha:]]+/], Match[/[[:digit:]]+/]] }
198
+
53
199
  context 'when nested' do
54
200
  it 'generates nested sequence positive lookahead code' do
55
201
  nested_code(:sequence_level => 2) {|g| g.gen_assert sequence }.
@@ -83,10 +229,55 @@ r
83
229
  CODE
84
230
  end
85
231
  end
232
+
233
+ context 'given a sequence with a capture and a semantic action' do
234
+
235
+ let(:children) { [Match[/\w+/], action] }
236
+
237
+ context 'when the action uses a parameter' do
238
+
239
+ let(:action) { SemanticAction['|s| "<#{s}>"'] }
240
+
241
+ it 'generates code that binds the capture to the parameter and asserts the result' do
242
+ top_level_code(:sequence_level => 0) {|g| g.gen_assert sequence }.
243
+ should == (<<-'CODE').strip
244
+ p0 = @scanner.pos
245
+ r = begin
246
+ (r0_0 = @scanner.scan(/\w+/)) &&
247
+ ("<#{r0_0}>") &&
248
+ true
249
+ end
250
+ @scanner.pos = p0
251
+ r
252
+ CODE
253
+ end
254
+ end
255
+
256
+ context 'when the action uses a "_"' do
257
+
258
+ let(:action) { SemanticAction['"<#{_}>"'] }
259
+
260
+ it 'generates code that binds the capture to "_" and asserts the result' do
261
+ top_level_code(:sequence_level => 0) {|g| g.gen_assert sequence }.
262
+ should == (<<-'CODE').strip
263
+ p0 = @scanner.pos
264
+ r = begin
265
+ (r0_0 = @scanner.scan(/\w+/)) &&
266
+ ("<#{r0_0}>") &&
267
+ true
268
+ end
269
+ @scanner.pos = p0
270
+ r
271
+ CODE
272
+ end
273
+ end
274
+ end
86
275
  end
87
276
 
88
277
  describe '#gen_disallow' do
89
278
 
279
+ let(:children) { [Match[/[[:alpha:]]+/], Match[/[[:digit:]]+/]] }
280
+
90
281
  context 'when nested' do
91
282
  it 'generates nested sequence negative lookahead code' do
92
283
  nested_code(:sequence_level => 2) {|g| g.gen_disallow sequence }.
@@ -118,92 +309,53 @@ r
118
309
  CODE
119
310
  end
120
311
  end
121
- end
122
312
 
123
- describe '#gen_dispatch_action' do
313
+ context 'given a sequence with a capture and a semantic action' do
124
314
 
125
- let(:code) { NodeCode.new('Atom', 'parsed') }
315
+ let(:children) { [Match[/\w+/], action] }
126
316
 
127
- context 'when nested' do
128
- it 'generates nested sequence matching code with a dispatch action' do
129
- nested_code(:sequence_level => 2) {|g| g.gen_dispatch_action sequence, code }.
130
- should == (<<-CODE).strip
131
- begin
132
- p2 = @scanner.pos
133
- begin
134
- (r2_0 = @scanner.scan(/[[:alpha:]]+/)) &&
135
- (r2_1 = @scanner.scan(/[[:digit:]]+/)) &&
136
- Atom.parsed([r2_0, r2_1])
137
- end || begin
138
- @scanner.pos = p2
139
- false
140
- end
141
- end
142
- CODE
143
- end
144
- end
317
+ context 'when the action uses a parameter' do
145
318
 
146
- context 'when top-level' do
147
- it 'generates top-level sequence matching code with a dispatch action' do
148
- top_level_code(:sequence_level => 0) {|g| g.gen_dispatch_action sequence, code }.
149
- should == (<<-CODE).strip
319
+ let(:action) { SemanticAction['|s| "<#{s}>"'] }
320
+
321
+ it 'generates code that binds the capture to the parameter and asserts the result' do
322
+ top_level_code(:sequence_level => 0) {|g| g.gen_disallow sequence }.
323
+ should == (<<-'CODE').strip
150
324
  p0 = @scanner.pos
151
- begin
152
- (r0_0 = @scanner.scan(/[[:alpha:]]+/)) &&
153
- (r0_1 = @scanner.scan(/[[:digit:]]+/)) &&
154
- Atom.parsed([r0_0, r0_1])
155
- end || begin
156
- @scanner.pos = p0
157
- false
325
+ r = !begin
326
+ (r0_0 = @scanner.scan(/\w+/)) &&
327
+ ("<#{r0_0}>")
158
328
  end
329
+ @scanner.pos = p0
330
+ r
159
331
  CODE
332
+ end
160
333
  end
161
- end
162
- end
163
334
 
164
- describe '#gen_direct_action' do
335
+ context 'when the action uses a "_"' do
165
336
 
166
- let(:code) { ActionCode.new('|a,b| a + b') }
167
-
168
- context 'when nested' do
169
- it 'generates nested sequence matching code with a direct action' do
170
- nested_code(:sequence_level => 2) {|g| g.gen_direct_action sequence, code }.
171
- should == (<<-CODE).strip
172
- begin
173
- p2 = @scanner.pos
174
- begin
175
- (r2_0 = @scanner.scan(/[[:alpha:]]+/)) &&
176
- (r2_1 = @scanner.scan(/[[:digit:]]+/)) &&
177
- (r2_0 + r2_1)
178
- end || begin
179
- @scanner.pos = p2
180
- false
181
- end
182
- end
183
- CODE
184
- end
185
- end
337
+ let(:action) { SemanticAction['"<#{_}>"'] }
186
338
 
187
- context 'when top-level' do
188
- it 'generates nested sequence matching code with a direct action' do
189
- top_level_code(:sequence_level => 0) {|g| g.gen_direct_action sequence, code }.
190
- should == (<<-CODE).strip
339
+ it 'generates code that binds the capture to "_" and asserts the result' do
340
+ top_level_code(:sequence_level => 0) {|g| g.gen_disallow sequence }.
341
+ should == (<<-'CODE').strip
191
342
  p0 = @scanner.pos
192
- begin
193
- (r0_0 = @scanner.scan(/[[:alpha:]]+/)) &&
194
- (r0_1 = @scanner.scan(/[[:digit:]]+/)) &&
195
- (r0_0 + r0_1)
196
- end || begin
197
- @scanner.pos = p0
198
- false
343
+ r = !begin
344
+ (r0_0 = @scanner.scan(/\w+/)) &&
345
+ ("<#{r0_0}>")
199
346
  end
347
+ @scanner.pos = p0
348
+ r
200
349
  CODE
350
+ end
201
351
  end
202
352
  end
203
353
  end
204
354
 
205
355
  describe '#gen_skip' do
206
356
 
357
+ let(:children) { [Match[/[[:alpha:]]+/], Match[/[[:digit:]]+/]] }
358
+
207
359
  context 'when nested' do
208
360
  it 'generates nested token sequence matching code' do
209
361
  nested_code(:sequence_level => 2) {|g| g.gen_skip sequence }.
@@ -243,6 +395,8 @@ end
243
395
 
244
396
  describe '#gen_token' do
245
397
 
398
+ let(:children) { [Match[/[[:alpha:]]+/], Match[/[[:digit:]]+/]] }
399
+
246
400
  context 'when nested' do
247
401
  it 'generates nested token sequence matching code' do
248
402
  nested_code(:sequence_level => 2) {|g| g.gen_token sequence }.
@@ -281,6 +435,9 @@ end
281
435
  end
282
436
 
283
437
  describe '#gen_intermediate' do
438
+
439
+ let(:children) { [Match[/[[:alpha:]]+/], Match[/[[:digit:]]+/]] }
440
+
284
441
  it 'generates nested sequence matching code' do
285
442
  nested_code(:sequence_level => 2) {|g| g.gen_intermediate sequence }.
286
443
  should == (<<-CODE).strip
@@ -300,6 +457,9 @@ end
300
457
  end
301
458
 
302
459
  describe '#gen_intermediate_assert' do
460
+
461
+ let(:children) { [Match[/[[:alpha:]]+/], Match[/[[:digit:]]+/]] }
462
+
303
463
  it 'generates nested sequence positive lookahead code' do
304
464
  nested_code(:sequence_level => 2) {|g| g.gen_intermediate_assert sequence }.
305
465
  should == (<<-CODE).strip
@@ -318,6 +478,9 @@ end
318
478
  end
319
479
 
320
480
  describe '#gen_intermediate_disallow' do
481
+
482
+ let(:children) { [Match[/[[:alpha:]]+/], Match[/[[:digit:]]+/]] }
483
+
321
484
  it 'generates nested sequence negative lookahead code' do
322
485
  nested_code(:sequence_level => 2) {|g| g.gen_intermediate_disallow sequence }.
323
486
  should == (<<-CODE).strip
@@ -335,6 +498,9 @@ end
335
498
  end
336
499
 
337
500
  describe '#gen_intermediate_skip' do
501
+
502
+ let(:children) { [Match[/[[:alpha:]]+/], Match[/[[:digit:]]+/]] }
503
+
338
504
  it 'generates nested sequence skipping code' do
339
505
  nested_code(:sequence_level => 2) {|g| g.gen_intermediate_skip sequence }.
340
506
  should == (<<-CODE).strip
@@ -1,6 +1,6 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
2
 
3
- include Rattler::BackEnd::ParserGenerator
3
+ include Rattler::Compiler::ParserGenerator
4
4
  include Rattler::Parsers
5
5
 
6
6
  describe SkipGenerator do
@@ -60,60 +60,6 @@ describe SkipGenerator do
60
60
  end
61
61
  end
62
62
 
63
- describe '#gen_dispatch_action' do
64
-
65
- let(:code) { NodeCode.new('Word', 'parsed') }
66
-
67
- context 'when nested' do
68
- it 'generates nested matching code with a dispatch action' do
69
- nested_code {|g| g.gen_dispatch_action skip, code }.
70
- should == (<<-CODE).strip
71
- begin
72
- @scanner.skip(/\\w+/) &&
73
- Word.parsed([])
74
- end
75
- CODE
76
- end
77
- end
78
-
79
- context 'when top-level' do
80
- it 'generates top level matching code with a dispatch action' do
81
- top_level_code {|g| g.gen_dispatch_action skip, code }.
82
- should == (<<-CODE).strip
83
- @scanner.skip(/\\w+/) &&
84
- Word.parsed([])
85
- CODE
86
- end
87
- end
88
- end
89
-
90
- describe '#gen_direct_action' do
91
-
92
- let(:code) { ActionCode.new('[]') }
93
-
94
- context 'when nested' do
95
- it 'generates nested matching code with a direct action' do
96
- nested_code {|g| g.gen_direct_action skip, code }.
97
- should == (<<-CODE).strip
98
- begin
99
- @scanner.skip(/\\w+/) &&
100
- ([])
101
- end
102
- CODE
103
- end
104
- end
105
-
106
- context 'when top-level' do
107
- it 'generates top level matching code with a direct action' do
108
- top_level_code {|g| g.gen_direct_action skip, code }.
109
- should == (<<-CODE).strip
110
- @scanner.skip(/\\w+/) &&
111
- ([])
112
- CODE
113
- end
114
- end
115
- end
116
-
117
63
  describe '#gen_token' do
118
64
 
119
65
  context 'when nested' do