rattler 0.5.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
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