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 BackReferenceGenerator do
@@ -9,7 +9,8 @@ describe BackReferenceGenerator do
9
9
 
10
10
  let(:ref) { BackReference[:a] }
11
11
 
12
- let(:scope) { {:a => 'r0_2'} }
12
+ let(:scope) { ParserScope.new(bindings) }
13
+ let(:bindings) { {:a => 'r0_2'} }
13
14
 
14
15
  describe '#gen_basic' do
15
16
 
@@ -62,60 +63,6 @@ describe BackReferenceGenerator do
62
63
  end
63
64
  end
64
65
 
65
- describe '#gen_dispatch_action' do
66
-
67
- let(:code) { NodeCode.new('Word', 'parsed') }
68
-
69
- context 'when nested' do
70
- it 'generates nested regex matching code with a dispatch action' do
71
- nested_code {|g| g.gen_dispatch_action ref, code, scope }.
72
- should == (<<-CODE).strip
73
- begin
74
- (r = @scanner.scan(/\#{r0_2}/)) &&
75
- Word.parsed([r], :labeled => {:a => r0_2})
76
- end
77
- CODE
78
- end
79
- end
80
-
81
- context 'when top-level' do
82
- it 'generates top level regex matching code with a dispatch action' do
83
- top_level_code {|g| g.gen_dispatch_action ref, code, scope }.
84
- should == (<<-CODE).strip
85
- (r = @scanner.scan(/\#{r0_2}/)) &&
86
- Word.parsed([r], :labeled => {:a => r0_2})
87
- CODE
88
- end
89
- end
90
- end
91
-
92
- describe '#gen_direct_action' do
93
-
94
- let(:code) { ActionCode.new('|_| _.to_sym') }
95
-
96
- context 'when nested' do
97
- it 'generates nested regex matching code with a direct action' do
98
- nested_code {|g| g.gen_direct_action ref, code, scope }.
99
- should == (<<-CODE).strip
100
- begin
101
- (r = @scanner.scan(/\#{r0_2}/)) &&
102
- (r.to_sym)
103
- end
104
- CODE
105
- end
106
- end
107
-
108
- context 'when top-level' do
109
- it 'generates top level regex matching code with a direct action' do
110
- top_level_code {|g| g.gen_direct_action ref, code, scope }.
111
- should == (<<-CODE).strip
112
- (r = @scanner.scan(/\#{r0_2}/)) &&
113
- (r.to_sym)
114
- CODE
115
- end
116
- end
117
- end
118
-
119
66
  describe '#gen_token' do
120
67
 
121
68
  context 'when nested' do
@@ -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 ChoiceGenerator do
@@ -88,68 +88,6 @@ end
88
88
  end
89
89
  end
90
90
 
91
- describe '#gen_dispatch_action' do
92
-
93
- let(:code) { NodeCode.new('Atom', 'parsed') }
94
-
95
- context 'when nested' do
96
- it 'generates nested choice matching code with a dispatch action' do
97
- nested_code(:choice_level => 2) {|g| g.gen_dispatch_action choice, code }.
98
- should == (<<-CODE).strip
99
- begin
100
- (r = begin
101
- @scanner.scan(/[[:alpha:]]+/) ||
102
- @scanner.scan(/[[:digit:]]+/)
103
- end) && Atom.parsed([r])
104
- end
105
- CODE
106
- end
107
- end
108
-
109
- context 'when top-level' do
110
- it 'generates top-level choice matching code with a dispatch action' do
111
- top_level_code(:choice_level => 0) {|g| g.gen_dispatch_action choice, code }.
112
- should == (<<-CODE).strip
113
- (r = begin
114
- @scanner.scan(/[[:alpha:]]+/) ||
115
- @scanner.scan(/[[:digit:]]+/)
116
- end) && Atom.parsed([r])
117
- CODE
118
- end
119
- end
120
- end
121
-
122
- describe '#gen_direct_action' do
123
-
124
- let(:code) { ActionCode.new('|_| _.size') }
125
-
126
- context 'when nested' do
127
- it 'generates nested choice matching code with a direct action' do
128
- nested_code(:choice_level => 2) {|g| g.gen_direct_action choice, code }.
129
- should == (<<-CODE).strip
130
- begin
131
- (r = begin
132
- @scanner.scan(/[[:alpha:]]+/) ||
133
- @scanner.scan(/[[:digit:]]+/)
134
- end) && (r.size)
135
- end
136
- CODE
137
- end
138
- end
139
-
140
- context 'when top-level' do
141
- it 'generates nested choice matching code with a direct action' do
142
- top_level_code(:choice_level => 0) {|g| g.gen_direct_action choice, code }.
143
- should == (<<-CODE).strip
144
- (r = begin
145
- @scanner.scan(/[[:alpha:]]+/) ||
146
- @scanner.scan(/[[:digit:]]+/)
147
- end) && (r.size)
148
- CODE
149
- end
150
- end
151
- end
152
-
153
91
  describe '#gen_token' do
154
92
 
155
93
  context 'when nested' do
@@ -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 DisallowGenerator do
@@ -58,60 +58,6 @@ describe DisallowGenerator do
58
58
  end
59
59
  end
60
60
 
61
- describe '#gen_dispatch_action' do
62
-
63
- let(:code) { NodeCode.new('Word', 'parsed') }
64
-
65
- context 'when nested' do
66
- it 'generates nested negative lookahead code with a dispatch action' do
67
- nested_code {|g| g.gen_dispatch_action disallow, code }.
68
- should == (<<-CODE).strip
69
- begin
70
- @scanner.skip(/(?!\\d)/) &&
71
- Word.parsed([])
72
- end
73
- CODE
74
- end
75
- end
76
-
77
- context 'when top-level' do
78
- it 'generates top level negative lookahead code with a dispatch action' do
79
- top_level_code {|g| g.gen_dispatch_action disallow, code }.
80
- should == (<<-CODE).strip
81
- @scanner.skip(/(?!\\d)/) &&
82
- Word.parsed([])
83
- CODE
84
- end
85
- end
86
- end
87
-
88
- describe '#gen_direct_action' do
89
-
90
- let(:code) { ActionCode.new(':t') }
91
-
92
- context 'when nested' do
93
- it 'generates nested negative lookahead code with a direct action' do
94
- nested_code {|g| g.gen_direct_action disallow, code }.
95
- should == (<<-CODE).strip
96
- begin
97
- @scanner.skip(/(?!\\d)/) &&
98
- (:t)
99
- end
100
- CODE
101
- end
102
- end
103
-
104
- context 'when top-level' do
105
- it 'generates top level negative lookahead code with a direct action' do
106
- top_level_code {|g| g.gen_direct_action disallow, code }.
107
- should == (<<-CODE).strip
108
- @scanner.skip(/(?!\\d)/) &&
109
- (:t)
110
- CODE
111
- end
112
- end
113
- end
114
-
115
61
  describe '#gen_token' do
116
62
 
117
63
  context 'when nested' do
@@ -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 ESymbolGenerator do
@@ -52,44 +52,6 @@ describe ESymbolGenerator do
52
52
  end
53
53
  end
54
54
 
55
- describe '#gen_dispatch_action' do
56
-
57
- let(:code) { NodeCode.new('Word', 'parsed') }
58
-
59
- context 'when nested' do
60
- it 'generates nested eof matching code with a dispatch action' do
61
- nested_code {|g| g.gen_dispatch_action ESymbol[], code }.
62
- should == 'Word.parsed([])'
63
- end
64
- end
65
-
66
- context 'when top-level' do
67
- it 'generates top level eof matching code with a dispatch action' do
68
- top_level_code {|g| g.gen_dispatch_action ESymbol[], code }.
69
- should == 'Word.parsed([])'
70
- end
71
- end
72
- end
73
-
74
- describe '#gen_direct_action' do
75
-
76
- let(:code) { ActionCode.new(':foo') }
77
-
78
- context 'when nested' do
79
- it 'generates nested eof matching code with a direct action' do
80
- nested_code {|g| g.gen_direct_action ESymbol[], code }.
81
- should == '(:foo)'
82
- end
83
- end
84
-
85
- context 'when top-level' do
86
- it 'generates top level eof matching code with a direct action' do
87
- top_level_code {|g| g.gen_direct_action ESymbol[], code }.
88
- should == ':foo'
89
- end
90
- end
91
- end
92
-
93
55
  describe '#gen_token' do
94
56
 
95
57
  context 'when nested' do
@@ -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 EofGenerator do
@@ -52,44 +52,6 @@ describe EofGenerator do
52
52
  end
53
53
  end
54
54
 
55
- describe '#gen_dispatch_action' do
56
-
57
- let(:code) { NodeCode.new('Word', 'parsed') }
58
-
59
- context 'when nested' do
60
- it 'generates nested eof matching code with a dispatch action' do
61
- nested_code {|g| g.gen_dispatch_action Eof[], code }.
62
- should == '(Word.parsed([]) if @scanner.eos?)'
63
- end
64
- end
65
-
66
- context 'when top-level' do
67
- it 'generates top level eof matching code with a dispatch action' do
68
- top_level_code {|g| g.gen_dispatch_action Eof[], code }.
69
- should == 'Word.parsed([]) if @scanner.eos?'
70
- end
71
- end
72
- end
73
-
74
- describe '#gen_direct_action' do
75
-
76
- let(:code) { ActionCode.new(':eof') }
77
-
78
- context 'when nested' do
79
- it 'generates nested eof matching code with a direct action' do
80
- nested_code {|g| g.gen_direct_action Eof[], code }.
81
- should == '((:eof) if @scanner.eos?)'
82
- end
83
- end
84
-
85
- context 'when top-level' do
86
- it 'generates top level eof matching code with a direct action' do
87
- top_level_code {|g| g.gen_direct_action Eof[], code }.
88
- should == '(:eof) if @scanner.eos?'
89
- end
90
- end
91
- end
92
-
93
55
  describe '#gen_token' do
94
56
 
95
57
  context 'when nested' do
@@ -2,27 +2,27 @@ require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
2
 
3
3
  include Rattler::Parsers
4
4
 
5
- describe Rattler::BackEnd::ParserGenerator::FailGenerator do
6
-
5
+ describe Rattler::Compiler::ParserGenerator::FailGenerator do
6
+
7
7
  include ParserGeneratorSpecHelper
8
-
8
+
9
9
  describe '#gen_basic' do
10
-
10
+
11
11
  context 'when nested' do
12
12
  context 'and fail type is :expr' do
13
-
13
+
14
14
  let(:fail) { Fail[:expr, 'operator expected'] }
15
-
15
+
16
16
  it 'generates a nested fail expression' do
17
17
  nested_code {|g| g.gen_basic fail }.
18
18
  should == '(fail! { "operator expected" })'
19
19
  end
20
20
  end
21
-
21
+
22
22
  context 'and fail type is :rule' do
23
-
23
+
24
24
  let(:fail) { Fail[:rule, 'identifier expected'] }
25
-
25
+
26
26
  it 'generates a nested return statement returning a fail expression' do
27
27
  nested_code {|g| g.gen_basic fail }.
28
28
  should == (<<-CODE).strip
@@ -31,50 +31,121 @@ false
31
31
  CODE
32
32
  end
33
33
  end
34
-
34
+
35
35
  context 'and fail type is :parse' do
36
-
36
+
37
37
  let(:fail) { Fail[:parse, 'unexpected operator'] }
38
-
38
+
39
39
  it 'generates a nested fail_parse statement' do
40
40
  nested_code {|g| g.gen_basic fail }.
41
41
  should == '(fail_parse { "unexpected operator" })'
42
42
  end
43
43
  end
44
44
  end
45
-
45
+
46
46
  context 'when top-level' do
47
47
  context 'and fail type is :expr' do
48
-
48
+
49
49
  let(:fail) { Fail[:expr, 'operator expected'] }
50
-
50
+
51
51
  it 'generates a top-level fail expression' do
52
52
  top_level_code {|g| g.gen_basic fail }.
53
53
  should == 'fail! { "operator expected" }'
54
54
  end
55
55
  end
56
-
56
+
57
57
  context 'and fail type is :rule' do
58
-
58
+
59
59
  let(:fail) { Fail[:rule, 'identifier expected'] }
60
-
60
+
61
61
  it 'generates a return statement returning a fail expression' do
62
62
  top_level_code {|g| g.gen_basic fail }.
63
63
  should == 'return(fail! { "identifier expected" })'
64
64
  end
65
65
  end
66
-
66
+
67
67
  context 'and fail type is :parse' do
68
-
68
+
69
69
  let(:fail) { Fail[:parse, 'unexpected operator'] }
70
-
70
+
71
71
  it 'generates a top-level fail_parse statement' do
72
72
  top_level_code {|g| g.gen_basic fail }.
73
73
  should == 'fail_parse { "unexpected operator" }'
74
74
  end
75
75
  end
76
76
  end
77
-
77
+
78
+ end
79
+
80
+ describe '#gen_skip' do
81
+
82
+ context 'when nested' do
83
+ context 'and fail type is :expr' do
84
+
85
+ let(:fail) { Fail[:expr, 'operator expected'] }
86
+
87
+ it 'generates a nested fail expression' do
88
+ nested_code {|g| g.gen_skip fail }.
89
+ should == '(fail! { "operator expected" })'
90
+ end
91
+ end
92
+
93
+ context 'and fail type is :rule' do
94
+
95
+ let(:fail) { Fail[:rule, 'identifier expected'] }
96
+
97
+ it 'generates a nested return statement returning a fail expression' do
98
+ nested_code {|g| g.gen_skip fail }.
99
+ should == (<<-CODE).strip
100
+ return(fail! { "identifier expected" })
101
+ false
102
+ CODE
103
+ end
104
+ end
105
+
106
+ context 'and fail type is :parse' do
107
+
108
+ let(:fail) { Fail[:parse, 'unexpected operator'] }
109
+
110
+ it 'generates a nested fail_parse statement' do
111
+ nested_code {|g| g.gen_skip fail }.
112
+ should == '(fail_parse { "unexpected operator" })'
113
+ end
114
+ end
115
+ end
116
+
117
+ context 'when top-level' do
118
+ context 'and fail type is :expr' do
119
+
120
+ let(:fail) { Fail[:expr, 'operator expected'] }
121
+
122
+ it 'generates a top-level fail expression' do
123
+ top_level_code {|g| g.gen_skip fail }.
124
+ should == 'fail! { "operator expected" }'
125
+ end
126
+ end
127
+
128
+ context 'and fail type is :rule' do
129
+
130
+ let(:fail) { Fail[:rule, 'identifier expected'] }
131
+
132
+ it 'generates a return statement returning a fail expression' do
133
+ top_level_code {|g| g.gen_skip fail }.
134
+ should == 'return(fail! { "identifier expected" })'
135
+ end
136
+ end
137
+
138
+ context 'and fail type is :parse' do
139
+
140
+ let(:fail) { Fail[:parse, 'unexpected operator'] }
141
+
142
+ it 'generates a top-level fail_parse statement' do
143
+ top_level_code {|g| g.gen_skip fail }.
144
+ should == 'fail_parse { "unexpected operator" }'
145
+ end
146
+ end
147
+ end
148
+
78
149
  end
79
-
150
+
80
151
  end