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,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 MatchGenerator do
@@ -60,60 +60,6 @@ describe MatchGenerator 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 regex matching code with a dispatch action' do
69
- nested_code {|g| g.gen_dispatch_action match, code }.
70
- should == (<<-CODE).strip
71
- begin
72
- (r = @scanner.scan(/\\w+/)) &&
73
- Word.parsed([r])
74
- end
75
- CODE
76
- end
77
- end
78
-
79
- context 'when top-level' do
80
- it 'generates top level regex matching code with a dispatch action' do
81
- top_level_code {|g| g.gen_dispatch_action match, code }.
82
- should == (<<-CODE).strip
83
- (r = @scanner.scan(/\\w+/)) &&
84
- Word.parsed([r])
85
- CODE
86
- end
87
- end
88
- end
89
-
90
- describe '#gen_direct_action' do
91
-
92
- let(:code) { ActionCode.new('|_| _.to_sym') }
93
-
94
- context 'when nested' do
95
- it 'generates nested regex matching code with a direct action' do
96
- nested_code {|g| g.gen_direct_action match, code }.
97
- should == (<<-CODE).strip
98
- begin
99
- (r = @scanner.scan(/\\w+/)) &&
100
- (r.to_sym)
101
- end
102
- CODE
103
- end
104
- end
105
-
106
- context 'when top-level' do
107
- it 'generates top level regex matching code with a direct action' do
108
- top_level_code {|g| g.gen_direct_action match, code }.
109
- should == (<<-CODE).strip
110
- (r = @scanner.scan(/\\w+/)) &&
111
- (r.to_sym)
112
- CODE
113
- end
114
- end
115
- end
116
-
117
63
  describe '#gen_token' do
118
64
 
119
65
  context 'when nested' do
@@ -0,0 +1,135 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
+
3
+ include Rattler::Compiler::ParserGenerator
4
+ include Rattler::Parsers
5
+
6
+ describe NodeActionGenerator do
7
+
8
+ include ParserGeneratorSpecHelper
9
+ include Rattler::Runtime
10
+
11
+ let(:action) { NodeAction['Expr'] }
12
+
13
+ let(:scope) { ParserScope.new(bindings, captures) }
14
+ let(:bindings) { {} }
15
+ let(:captures) { [] }
16
+
17
+ describe '#gen_basic' do
18
+
19
+ context 'with no bindings or captures' do
20
+ it 'generates node action code' do
21
+ top_level_code {|g| g.gen_basic action, scope }.
22
+ should == 'Expr.parsed([])'
23
+ end
24
+ end
25
+
26
+ context 'with a single capture' do
27
+
28
+ let(:captures) { ['r0_0'] }
29
+
30
+ it 'generates node action code with the capture in an array' do
31
+ top_level_code {|g| g.gen_basic action, scope }.
32
+ should == 'Expr.parsed([r0_0])'
33
+ end
34
+ end
35
+
36
+ context 'with multiple captures' do
37
+
38
+ let(:captures) { ['r0_0', 'r0_1'] }
39
+
40
+ it 'generates node action code with the capture in an array' do
41
+ top_level_code {|g| g.gen_basic action, scope }.
42
+ should == 'Expr.parsed([r0_0, r0_1])'
43
+ end
44
+ end
45
+
46
+ context 'with bindings' do
47
+
48
+ let(:bindings) { {:a => 'r0_1'} }
49
+
50
+ it 'generates node action code with the bindings as a :labeled attribute' do
51
+ top_level_code {|g| g.gen_basic action, scope }.
52
+ should == 'Expr.parsed([], :labeled => {:a => r0_1})'
53
+ end
54
+ end
55
+
56
+ context 'with undecidable captures' do
57
+
58
+ let(:captures) { ['r0_0', 'r0_1'] }
59
+
60
+ it 'generates node action code that uses select_captures' do
61
+ top_level_code {|g| g.gen_basic action, scope.with_undecidable_captures }.
62
+ should == 'Expr.parsed(select_captures([r0_0, r0_1]))'
63
+ end
64
+ end
65
+
66
+ context 'when the action has an alternate factory method' do
67
+
68
+ let(:action) { NodeAction['Expr', {:method => 'create'}] }
69
+
70
+ it 'generates node action code with the factory method' do
71
+ top_level_code {|g| g.gen_basic action, scope }.
72
+ should == 'Expr.create([])'
73
+ end
74
+ end
75
+
76
+ context 'when the action has node attributes' do
77
+
78
+ let(:action) { NodeAction['Expr', {:node_attrs => {:name => "FOO"}}] }
79
+
80
+ it 'generates node action code with the node attributes' do
81
+ top_level_code {|g| g.gen_basic action, scope }.
82
+ should == 'Expr.parsed([], :name => "FOO")'
83
+ end
84
+ end
85
+ end
86
+
87
+ describe '#gen_assert' do
88
+
89
+ context 'when nested' do
90
+ it 'generates nested node assert code' do
91
+ nested_code {|g| g.gen_assert action }.
92
+ should == '(Expr.parsed([]) && true)'
93
+ end
94
+ end
95
+
96
+ context 'when top-level' do
97
+ it 'generates top level node assert code' do
98
+ top_level_code {|g| g.gen_assert action }.
99
+ should == 'Expr.parsed([]) && true'
100
+ end
101
+ end
102
+ end
103
+
104
+ describe '#gen_disallow' do
105
+ it 'generates node disallow code' do
106
+ top_level_code {|g| g.gen_disallow action }.
107
+ should == '!Expr.parsed([])'
108
+ end
109
+ end
110
+
111
+ describe '#gen_token' do
112
+ it 'generates node token code' do
113
+ top_level_code {|g| g.gen_token action }.
114
+ should == 'Expr.parsed([]).to_s'
115
+ end
116
+ end
117
+
118
+ describe '#gen_skip' do
119
+
120
+ context 'when nested' do
121
+ it 'generates nested node skipping code' do
122
+ nested_code {|g| g.gen_skip action }.
123
+ should == '(Expr.parsed([]); true)'
124
+ end
125
+ end
126
+
127
+ context 'when top-level' do
128
+ it 'generates top level node skipping code' do
129
+ top_level_code {|g| g.gen_skip action }.
130
+ should == 'Expr.parsed([]); true'
131
+ end
132
+ end
133
+ end
134
+
135
+ end
@@ -87,80 +87,6 @@ a unless a.empty?
87
87
  end
88
88
  end
89
89
 
90
- describe '#gen_dispatch_action' do
91
-
92
- let(:nested) { Match[/w+/] }
93
- let(:code) { NodeCode.new('Word', 'parsed') }
94
-
95
- context 'given a repeat with one-or-more bounds' do
96
-
97
- context 'when nested' do
98
- it 'generates nested one-or-more matching code with a dispatch action' do
99
- nested_code {|g| g.gen_dispatch_action repeat, code }.
100
- should == (<<-CODE).strip
101
- begin
102
- a = []
103
- while r = @scanner.scan(/w+/)
104
- a << r
105
- end
106
- Word.parsed(select_captures(a)) unless a.empty?
107
- end
108
- CODE
109
- end
110
- end
111
-
112
- context 'when top-level' do
113
- it 'generates top level one-or-more matching code with a dispatch action' do
114
- top_level_code {|g| g.gen_dispatch_action repeat, code }.
115
- should == (<<-CODE).strip
116
- a = []
117
- while r = @scanner.scan(/w+/)
118
- a << r
119
- end
120
- Word.parsed(select_captures(a)) unless a.empty?
121
- CODE
122
- end
123
- end
124
- end
125
- end
126
-
127
- describe '#gen_direct_action' do
128
-
129
- let(:nested) { Match[/w+/] }
130
- let(:code) { ActionCode.new('|_| _.size') }
131
-
132
- context 'given a repeat with one-or-more bounds' do
133
-
134
- context 'when nested' do
135
- it 'generates nested one-or-more matching code with a direct action' do
136
- nested_code {|g| g.gen_direct_action repeat, code }.
137
- should == (<<-CODE).strip
138
- begin
139
- a = []
140
- while r = @scanner.scan(/w+/)
141
- a << r
142
- end
143
- (select_captures(a).size) unless a.empty?
144
- end
145
- CODE
146
- end
147
- end
148
-
149
- context 'when top-level' do
150
- it 'generates top level one-or-more matching code with a direct action' do
151
- top_level_code {|g| g.gen_direct_action repeat, code }.
152
- should == (<<-CODE).strip
153
- a = []
154
- while r = @scanner.scan(/w+/)
155
- a << r
156
- end
157
- (select_captures(a).size) unless a.empty?
158
- CODE
159
- end
160
- end
161
- end
162
- end
163
-
164
90
  describe '#gen_token' do
165
91
 
166
92
  let(:nested) { Match[/w+/] }
@@ -61,68 +61,6 @@ shared_examples_for 'an optional generator' do
61
61
  end
62
62
  end
63
63
 
64
- describe '#gen_dispatch_action' do
65
-
66
- let(:nested) { Match[/w+/] }
67
- let(:code) { NodeCode.new('Word', 'parsed') }
68
-
69
- context 'given a repeat with optional bounds' do
70
-
71
- context 'when nested' do
72
- it 'generates nested optional matching code with a dispatch action' do
73
- nested_code {|g| g.gen_dispatch_action repeat, code }.
74
- should == (<<-CODE).strip
75
- begin
76
- r = @scanner.scan(/w+/)
77
- Word.parsed(r ? [r] : [])
78
- end
79
- CODE
80
- end
81
- end
82
-
83
- context 'when top-level' do
84
- it 'generates top level optional matching code with a dispatch action' do
85
- top_level_code {|g| g.gen_dispatch_action repeat, code }.
86
- should == (<<-CODE).strip
87
- r = @scanner.scan(/w+/)
88
- Word.parsed(r ? [r] : [])
89
- CODE
90
- end
91
- end
92
- end
93
- end
94
-
95
- describe '#gen_direct_action' do
96
-
97
- let(:nested) { Match[/w+/] }
98
- let(:code) { ActionCode.new('|_| _.size') }
99
-
100
- context 'given a repeat with optional bounds' do
101
-
102
- context 'when nested' do
103
- it 'generates nested optional matching code with a direct action' do
104
- nested_code {|g| g.gen_direct_action repeat, code }.
105
- should == (<<-CODE).strip
106
- begin
107
- r = @scanner.scan(/w+/)
108
- ((r ? [r] : []).size)
109
- end
110
- CODE
111
- end
112
- end
113
-
114
- context 'when top-level' do
115
- it 'generates top level optional matching code with a direct action' do
116
- top_level_code {|g| g.gen_direct_action repeat, code }.
117
- should == (<<-CODE).strip
118
- r = @scanner.scan(/w+/)
119
- ((r ? [r] : []).size)
120
- CODE
121
- end
122
- end
123
- end
124
- end
125
-
126
64
  describe '#gen_token' do
127
65
 
128
66
  let(:nested) { Match[/w+/] }
@@ -3,7 +3,7 @@ require File.expand_path(File.dirname(__FILE__) + '/zero_or_more_generator_examp
3
3
  require File.expand_path(File.dirname(__FILE__) + '/one_or_more_generator_examples')
4
4
  require File.expand_path(File.dirname(__FILE__) + '/optional_generator_examples')
5
5
 
6
- include Rattler::BackEnd::ParserGenerator
6
+ include Rattler::Compiler::ParserGenerator
7
7
  include Rattler::Parsers
8
8
 
9
9
  describe RepeatGenerator do
@@ -107,6 +107,71 @@ end
107
107
  end
108
108
  end
109
109
  end
110
+
111
+ context 'with an Apply parser' do
112
+
113
+ let(:bounds) { [0, nil] }
114
+ let(:nested) { Apply[:a] }
115
+
116
+ it 'generates repeat code that selects only the captures for the result' do
117
+ top_level_code {|g| g.gen_basic repeat }.should == <<-CODE.strip
118
+ a = []
119
+ while r = match(:a)
120
+ a << r
121
+ end
122
+ select_captures(a)
123
+ CODE
124
+ end
125
+ end
126
+
127
+ context 'with a choice of capturing or non-capturing parsers' do
128
+
129
+ let(:bounds) { [0, nil] }
130
+ let(:nested) { Choice[
131
+ Match[/a/],
132
+ Skip[Match[/b/]]
133
+ ] }
134
+
135
+ it 'generates repeat code that selects only the captures for the result' do
136
+ top_level_code {|g| g.gen_basic repeat }.should == <<-CODE.strip
137
+ a = []
138
+ while r = begin
139
+ @scanner.scan(/a/) ||
140
+ (@scanner.skip(/b/) && true)
141
+ end
142
+ a << r
143
+ end
144
+ select_captures(a)
145
+ CODE
146
+ end
147
+ end
148
+
149
+ context 'with an attributed sequence with a semantic action' do
150
+
151
+ let(:bounds) { [0, nil] }
152
+ let(:nested) do
153
+ AttributedSequence[Match[/\w/], SemanticAction['_']]
154
+ end
155
+
156
+ it 'generates repeat code that selects only the captures for the result' do
157
+ top_level_code {|g| g.gen_basic repeat }.should == <<-'CODE'.strip
158
+ a = []
159
+ while r = begin
160
+ p0 = @scanner.pos
161
+ begin
162
+ (r0_0 = @scanner.scan(/\w/)) &&
163
+ (r0_0)
164
+ end || begin
165
+ @scanner.pos = p0
166
+ false
167
+ end
168
+ end
169
+ a << r
170
+ end
171
+ select_captures(a)
172
+ CODE
173
+ end
174
+ end
110
175
  end
111
176
 
112
177
  describe '#gen_assert' do
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
2
 
3
3
  include Rattler::Parsers
4
4
 
5
- describe Rattler::BackEnd::ParserGenerator::RuleGenerator do
5
+ describe Rattler::Compiler::ParserGenerator::RuleGenerator do
6
6
 
7
7
  include ParserGeneratorSpecHelper
8
8
 
@@ -21,7 +21,8 @@ end
21
21
  # @private
22
22
  def match_a! #:nodoc:
23
23
  @scanner.scan("a") ||
24
- match(:b)
24
+ match(:b) ||
25
+ fail! { :a }
25
26
  end
26
27
  CODE
27
28
  end