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,98 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
+
3
+ include Rattler::Parsers
4
+
5
+ describe Rattler::Compiler::ParserGenerator::GrammarGenerator do
6
+
7
+ include ParserGeneratorSpecHelper
8
+
9
+ describe '#generate' do
10
+
11
+ context 'given a grammar with a :grammar_name option' do
12
+
13
+ let(:grammar) { Grammar.new(rules, :grammar_name => 'ExprGrammar') }
14
+
15
+ let(:rules) { RuleSet[Rule[:a, Match['a']]] }
16
+
17
+ it 'generates a grammar module with a CLI' do
18
+ trim_lines(generated_code {|g| g.generate grammar }).strip.
19
+ should == (<<-CODE).strip
20
+ # encoding: utf-8
21
+
22
+ # @private
23
+ module ExprGrammar #:nodoc:
24
+
25
+ # @private
26
+ def start_rule #:nodoc:
27
+ :a
28
+ end
29
+
30
+ # @private
31
+ def match_a #:nodoc:
32
+ apply :match_a!
33
+ end
34
+
35
+ # @private
36
+ def match_a! #:nodoc:
37
+ @scanner.scan("a") ||
38
+ fail { :a }
39
+ end
40
+
41
+ end
42
+
43
+ if __FILE__ == $0
44
+ require 'rubygems'
45
+ require 'rattler'
46
+ Rattler::Util::GrammarCLI.run(ExprGrammar)
47
+ end
48
+ CODE
49
+ end
50
+ end
51
+
52
+ context 'given a grammar with a :parser_name option' do
53
+
54
+ let(:grammar) { Grammar.new(rules, :parser_name => 'ExprParser') }
55
+
56
+ let(:rules) { RuleSet[Rule[:a, Match['a']]] }
57
+
58
+ it 'generates a parser module with a CLI' do
59
+ trim_lines(generated_code {|g| g.generate grammar }).strip.
60
+ should == (<<-CODE).strip
61
+ # encoding: utf-8
62
+
63
+ # @private
64
+ class ExprParser < Rattler::Runtime::PackratParser #:nodoc:
65
+
66
+ # @private
67
+ def start_rule #:nodoc:
68
+ :a
69
+ end
70
+
71
+ # @private
72
+ def match_a #:nodoc:
73
+ apply :match_a!
74
+ end
75
+
76
+ # @private
77
+ def match_a! #:nodoc:
78
+ @scanner.scan("a") ||
79
+ fail { :a }
80
+ end
81
+
82
+ end
83
+
84
+ if __FILE__ == $0
85
+ require 'rubygems'
86
+ require 'rattler'
87
+ Rattler::Util::ParserCLI.run(ExprParser)
88
+ end
89
+ CODE
90
+ end
91
+ end
92
+ end
93
+
94
+ def trim_lines(s)
95
+ s.each_line.map {|_| "#{_.rstrip}\n" }.join
96
+ end
97
+
98
+ end
@@ -0,0 +1,67 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
+
3
+ include Rattler::Compiler::ParserGenerator
4
+ include Rattler::Parsers
5
+
6
+ describe GroupMatchGenerator do
7
+
8
+ include ParserGeneratorSpecHelper
9
+
10
+ let(:single_group) { GroupMatch[Match[/\s*(\w+)/], {:num_groups => 1}] }
11
+
12
+ let(:multi_group) { GroupMatch[Match[/\s*(\w+)\s+(\w+)/], {:num_groups => 2}] }
13
+
14
+ describe '#gen_basic' do
15
+
16
+ context 'given a single-group match' do
17
+
18
+ context 'when nested' do
19
+ it 'generates nested regex group matching code returning the group' do
20
+ nested_code {|g| g.gen_basic single_group }.
21
+ should == (<<-CODE).strip
22
+ begin
23
+ @scanner.skip(/\\s*(\\w+)/) &&
24
+ @scanner[1]
25
+ end
26
+ CODE
27
+ end
28
+ end
29
+
30
+ context 'when top-level' do
31
+ it 'generates top-level regex group matching code returning the group' do
32
+ top_level_code {|g| g.gen_basic single_group }.
33
+ should == (<<-CODE).strip
34
+ @scanner.skip(/\\s*(\\w+)/) &&
35
+ @scanner[1]
36
+ CODE
37
+ end
38
+ end
39
+ end
40
+
41
+ context 'given a multi-group match' do
42
+
43
+ context 'when nested' do
44
+ it 'generates nested regex matching code returning an array of groups' do
45
+ nested_code {|g| g.gen_basic multi_group }.
46
+ should == (<<-CODE).strip
47
+ begin
48
+ @scanner.skip(/\\s*(\\w+)\\s+(\\w+)/) &&
49
+ [@scanner[1], @scanner[2]]
50
+ end
51
+ CODE
52
+ end
53
+ end
54
+
55
+ context 'when top-level' do
56
+ it 'generates top-level regex matching code returning an array of groups' do
57
+ top_level_code {|g| g.gen_basic multi_group }.
58
+ should == (<<-CODE).strip
59
+ @scanner.skip(/\\s*(\\w+)\\s+(\\w+)/) &&
60
+ [@scanner[1], @scanner[2]]
61
+ CODE
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+ end
@@ -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
 
5
5
  describe GroupMatch do
6
6
  include CombinatorParserSpecHelper
@@ -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 LabelGenerator do
@@ -60,60 +60,6 @@ describe LabelGenerator 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 label, code }.
70
- should == (<<-CODE).strip
71
- begin
72
- (r = @scanner.scan(/\\w+/)) &&
73
- Word.parsed([r], :labeled => {:word => r})
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 label, code }.
82
- should == (<<-CODE).strip
83
- (r = @scanner.scan(/\\w+/)) &&
84
- Word.parsed([r], :labeled => {:word => r})
85
- CODE
86
- end
87
- end
88
- end
89
-
90
- describe '#gen_direct_action' do
91
-
92
- let(:code) { ActionCode.new('word.to_sym') }
93
-
94
- context 'when nested' do
95
- it 'generates nested matching code with a direct action using the label' do
96
- nested_code {|g| g.gen_direct_action label, 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 matching code with a direct action' do
108
- top_level_code {|g| g.gen_direct_action label, 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
@@ -133,94 +133,6 @@ true
133
133
  end
134
134
  end
135
135
 
136
- describe '#gen_dispatch_action' do
137
-
138
- let(:code) { NodeCode.new('Word', 'parsed') }
139
-
140
- context 'given a list with zero-or-more bounds' do
141
-
142
- context 'when nested' do
143
- it 'generates nested list matching code with a dispatch action' do
144
- nested_code {|g| g.gen_dispatch_action list, code }.
145
- should == (<<-CODE).strip
146
- begin
147
- a = []
148
- ep = nil
149
- while r = @scanner.scan(/w+/)
150
- ep = @scanner.pos
151
- a << r
152
- break unless @scanner.skip(/[,;]/)
153
- end
154
- @scanner.pos = ep unless ep.nil?
155
- Word.parsed(select_captures(a))
156
- end
157
- CODE
158
- end
159
- end
160
-
161
- context 'when top-level' do
162
- it 'generates top level list matching code with a dispatch action' do
163
- top_level_code {|g| g.gen_dispatch_action list, code }.
164
- should == (<<-CODE).strip
165
- a = []
166
- ep = nil
167
- while r = @scanner.scan(/w+/)
168
- ep = @scanner.pos
169
- a << r
170
- break unless @scanner.skip(/[,;]/)
171
- end
172
- @scanner.pos = ep unless ep.nil?
173
- Word.parsed(select_captures(a))
174
- CODE
175
- end
176
- end
177
- end
178
- end
179
-
180
- describe '#gen_direct_action' do
181
-
182
- let(:code) { ActionCode.new('|_| _.size') }
183
-
184
- context 'given a list with zero-or-more bounds' do
185
-
186
- context 'when nested' do
187
- it 'generates nested list matching code with a dispatch action' do
188
- nested_code {|g| g.gen_direct_action list, code }.
189
- should == (<<-CODE).strip
190
- begin
191
- a = []
192
- ep = nil
193
- while r = @scanner.scan(/w+/)
194
- ep = @scanner.pos
195
- a << r
196
- break unless @scanner.skip(/[,;]/)
197
- end
198
- @scanner.pos = ep unless ep.nil?
199
- (select_captures(a).size)
200
- end
201
- CODE
202
- end
203
- end
204
-
205
- context 'when top-level' do
206
- it 'generates top level list matching code with a dispatch action' do
207
- top_level_code {|g| g.gen_direct_action list, code }.
208
- should == (<<-CODE).strip
209
- a = []
210
- ep = nil
211
- while r = @scanner.scan(/w+/)
212
- ep = @scanner.pos
213
- a << r
214
- break unless @scanner.skip(/[,;]/)
215
- end
216
- @scanner.pos = ep unless ep.nil?
217
- (select_captures(a).size)
218
- CODE
219
- end
220
- end
221
- end
222
- end
223
-
224
136
  describe '#gen_skip' do
225
137
 
226
138
  context 'given a list with zero-or-more bounds' do
@@ -142,94 +142,6 @@ r
142
142
  end
143
143
  end
144
144
 
145
- describe '#gen_dispatch_action' do
146
-
147
- let(:code) { NodeCode.new('Word', 'parsed') }
148
-
149
- context 'given a list with one-or-more bounds' do
150
-
151
- context 'when nested' do
152
- it 'generates nested list matching code with a dispatch action' do
153
- nested_code {|g| g.gen_dispatch_action list, code }.
154
- should == (<<-CODE).strip
155
- begin
156
- a = []
157
- ep = nil
158
- while r = @scanner.scan(/w+/)
159
- ep = @scanner.pos
160
- a << r
161
- break unless @scanner.skip(/[,;]/)
162
- end
163
- @scanner.pos = ep unless ep.nil?
164
- Word.parsed(select_captures(a)) unless a.empty?
165
- end
166
- CODE
167
- end
168
- end
169
-
170
- context 'when top-level' do
171
- it 'generates top level list matching code with a dispatch action' do
172
- top_level_code {|g| g.gen_dispatch_action list, code }.
173
- should == (<<-CODE).strip
174
- a = []
175
- ep = nil
176
- while r = @scanner.scan(/w+/)
177
- ep = @scanner.pos
178
- a << r
179
- break unless @scanner.skip(/[,;]/)
180
- end
181
- @scanner.pos = ep unless ep.nil?
182
- Word.parsed(select_captures(a)) unless a.empty?
183
- CODE
184
- end
185
- end
186
- end
187
- end
188
-
189
- describe '#gen_direct_action' do
190
-
191
- let(:code) { ActionCode.new('|_| _.size') }
192
-
193
- context 'given a list with one-or-more bounds' do
194
-
195
- context 'when nested' do
196
- it 'generates nested list matching code with a dispatch action' do
197
- nested_code {|g| g.gen_direct_action list, code }.
198
- should == (<<-CODE).strip
199
- begin
200
- a = []
201
- ep = nil
202
- while r = @scanner.scan(/w+/)
203
- ep = @scanner.pos
204
- a << r
205
- break unless @scanner.skip(/[,;]/)
206
- end
207
- @scanner.pos = ep unless ep.nil?
208
- (select_captures(a).size) unless a.empty?
209
- end
210
- CODE
211
- end
212
- end
213
-
214
- context 'when top-level' do
215
- it 'generates top level list matching code with a dispatch action' do
216
- top_level_code {|g| g.gen_direct_action list, code }.
217
- should == (<<-CODE).strip
218
- a = []
219
- ep = nil
220
- while r = @scanner.scan(/w+/)
221
- ep = @scanner.pos
222
- a << r
223
- break unless @scanner.skip(/[,;]/)
224
- end
225
- @scanner.pos = ep unless ep.nil?
226
- (select_captures(a).size) unless a.empty?
227
- CODE
228
- end
229
- end
230
- end
231
- end
232
-
233
145
  describe '#gen_skip' do
234
146
 
235
147
  context 'given a list with one-or-more bounds' do
@@ -4,7 +4,7 @@ require File.expand_path(File.dirname(__FILE__) + '/list1_generator_examples')
4
4
 
5
5
  include Rattler::Parsers
6
6
 
7
- describe Rattler::BackEnd::ParserGenerator::ListGenerator do
7
+ describe Rattler::Compiler::ParserGenerator::ListGenerator do
8
8
 
9
9
  include ParserGeneratorSpecHelper
10
10
 
@@ -412,232 +412,6 @@ c < 2
412
412
  end
413
413
  end
414
414
 
415
- describe '#gen_dispatch_action' do
416
-
417
- let(:code) { NodeCode.new('Word', 'parsed') }
418
-
419
- context 'given a list with an upper bound' do
420
-
421
- let(:bounds) { [2, 4] }
422
-
423
- context 'when nested' do
424
- it 'generates nested list matching code with a dispatch action' do
425
- nested_code {|g| g.gen_dispatch_action list, code }.
426
- should == (<<-CODE).strip
427
- begin
428
- a = []
429
- sp = @scanner.pos
430
- ep = nil
431
- while r = @scanner.scan(/w+/)
432
- ep = @scanner.pos
433
- a << r
434
- break unless a.size < 4
435
- break unless @scanner.skip(/[,;]/)
436
- end
437
- if a.size >= 2
438
- @scanner.pos = ep unless ep.nil?
439
- Word.parsed(select_captures(a))
440
- else
441
- @scanner.pos = sp
442
- false
443
- end
444
- end
445
- CODE
446
- end
447
- end
448
-
449
- context 'when top-level' do
450
- it 'generates top level list matching code with a dispatch action' do
451
- top_level_code {|g| g.gen_dispatch_action list, code }.
452
- should == (<<-CODE).strip
453
- a = []
454
- sp = @scanner.pos
455
- ep = nil
456
- while r = @scanner.scan(/w+/)
457
- ep = @scanner.pos
458
- a << r
459
- break unless a.size < 4
460
- break unless @scanner.skip(/[,;]/)
461
- end
462
- if a.size >= 2
463
- @scanner.pos = ep unless ep.nil?
464
- Word.parsed(select_captures(a))
465
- else
466
- @scanner.pos = sp
467
- false
468
- end
469
- CODE
470
- end
471
- end
472
- end
473
-
474
- context 'given a list with no upper bound' do
475
-
476
- let(:bounds) { [2, nil] }
477
-
478
- context 'when nested' do
479
- it 'generates nested list matching code with a dispatch action' do
480
- nested_code {|g| g.gen_dispatch_action list, code }.
481
- should == (<<-CODE).strip
482
- begin
483
- a = []
484
- sp = @scanner.pos
485
- ep = nil
486
- while r = @scanner.scan(/w+/)
487
- ep = @scanner.pos
488
- a << r
489
- break unless @scanner.skip(/[,;]/)
490
- end
491
- if a.size >= 2
492
- @scanner.pos = ep unless ep.nil?
493
- Word.parsed(select_captures(a))
494
- else
495
- @scanner.pos = sp
496
- false
497
- end
498
- end
499
- CODE
500
- end
501
- end
502
-
503
- context 'when top-level' do
504
- it 'generates top level list matching code with a dispatch action' do
505
- top_level_code {|g| g.gen_dispatch_action list, code }.
506
- should == (<<-CODE).strip
507
- a = []
508
- sp = @scanner.pos
509
- ep = nil
510
- while r = @scanner.scan(/w+/)
511
- ep = @scanner.pos
512
- a << r
513
- break unless @scanner.skip(/[,;]/)
514
- end
515
- if a.size >= 2
516
- @scanner.pos = ep unless ep.nil?
517
- Word.parsed(select_captures(a))
518
- else
519
- @scanner.pos = sp
520
- false
521
- end
522
- CODE
523
- end
524
- end
525
- end
526
- end
527
-
528
- describe '#gen_direct_action' do
529
-
530
- let(:code) { ActionCode.new('|_| _.size') }
531
-
532
- context 'given a list with an upper bound' do
533
-
534
- let(:bounds) { [2, 4] }
535
-
536
- context 'when nested' do
537
- it 'generates nested list matching code with a dispatch action' do
538
- nested_code {|g| g.gen_direct_action list, code }.
539
- should == (<<-CODE).strip
540
- begin
541
- a = []
542
- sp = @scanner.pos
543
- ep = nil
544
- while r = @scanner.scan(/w+/)
545
- ep = @scanner.pos
546
- a << r
547
- break unless a.size < 4
548
- break unless @scanner.skip(/[,;]/)
549
- end
550
- if a.size >= 2
551
- @scanner.pos = ep unless ep.nil?
552
- (select_captures(a).size)
553
- else
554
- @scanner.pos = sp
555
- false
556
- end
557
- end
558
- CODE
559
- end
560
- end
561
-
562
- context 'when top-level' do
563
- it 'generates top level list matching code with a dispatch action' do
564
- top_level_code {|g| g.gen_direct_action list, code }.
565
- should == (<<-CODE).strip
566
- a = []
567
- sp = @scanner.pos
568
- ep = nil
569
- while r = @scanner.scan(/w+/)
570
- ep = @scanner.pos
571
- a << r
572
- break unless a.size < 4
573
- break unless @scanner.skip(/[,;]/)
574
- end
575
- if a.size >= 2
576
- @scanner.pos = ep unless ep.nil?
577
- (select_captures(a).size)
578
- else
579
- @scanner.pos = sp
580
- false
581
- end
582
- CODE
583
- end
584
- end
585
- end
586
-
587
- context 'given a list with no upper bound' do
588
-
589
- let(:bounds) { [2, nil] }
590
-
591
- context 'when nested' do
592
- it 'generates nested list matching code with a dispatch action' do
593
- nested_code {|g| g.gen_direct_action list, code }.
594
- should == (<<-CODE).strip
595
- begin
596
- a = []
597
- sp = @scanner.pos
598
- ep = nil
599
- while r = @scanner.scan(/w+/)
600
- ep = @scanner.pos
601
- a << r
602
- break unless @scanner.skip(/[,;]/)
603
- end
604
- if a.size >= 2
605
- @scanner.pos = ep unless ep.nil?
606
- (select_captures(a).size)
607
- else
608
- @scanner.pos = sp
609
- false
610
- end
611
- end
612
- CODE
613
- end
614
- end
615
-
616
- context 'when top-level' do
617
- it 'generates top level list matching code with a dispatch action' do
618
- top_level_code {|g| g.gen_direct_action list, code }.
619
- should == (<<-CODE).strip
620
- a = []
621
- sp = @scanner.pos
622
- ep = nil
623
- while r = @scanner.scan(/w+/)
624
- ep = @scanner.pos
625
- a << r
626
- break unless @scanner.skip(/[,;]/)
627
- end
628
- if a.size >= 2
629
- @scanner.pos = ep unless ep.nil?
630
- (select_captures(a).size)
631
- else
632
- @scanner.pos = sp
633
- false
634
- end
635
- CODE
636
- end
637
- end
638
- end
639
- end
640
-
641
415
  describe '#gen_skip' do
642
416
 
643
417
  context 'given a list with no upper bound' do