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,204 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
-
3
- include Rattler::BackEnd::ParserGenerator
4
- include Rattler::Parsers
5
-
6
- describe DirectActionGenerator do
7
-
8
- include ParserGeneratorSpecHelper
9
-
10
- let(:action) { DirectAction[Match[/\w+/], '|_| _.to_sym'] }
11
-
12
- describe '#gen_basic' do
13
-
14
- context 'when nested' do
15
- it 'generates nested matching code with a direct action' do
16
- nested_code {|g| g.gen_basic action }.
17
- should == (<<-CODE).strip
18
- begin
19
- (r = @scanner.scan(/\\w+/)) &&
20
- (r.to_sym)
21
- end
22
- CODE
23
- end
24
- end
25
-
26
- context 'when top-level' do
27
- it 'generates top level matching code with a direct action' do
28
- top_level_code {|g| g.gen_basic action }.
29
- should == (<<-CODE).strip
30
- (r = @scanner.scan(/\\w+/)) &&
31
- (r.to_sym)
32
- CODE
33
- end
34
- end
35
- end
36
-
37
- describe '#gen_assert' do
38
-
39
- context 'when nested' do
40
- it 'generates nested positive lookahead code' do
41
- nested_code {|g| g.gen_assert action }.
42
- should == '(@scanner.skip(/(?=\w+)/) && true)'
43
- end
44
- end
45
-
46
- context 'when top-level' do
47
- it 'generates top level positive lookahead code' do
48
- top_level_code {|g| g.gen_assert action }.
49
- should == '@scanner.skip(/(?=\w+)/) && true'
50
- end
51
- end
52
- end
53
-
54
- describe '#gen_disallow' do
55
-
56
- context 'when nested' do
57
- it 'generates nested negative lookahead code' do
58
- nested_code {|g| g.gen_disallow action }.
59
- should == '(@scanner.skip(/(?!\w+)/) && true)'
60
- end
61
- end
62
-
63
- context 'when top-level' do
64
- it 'generates top level negative lookahead code' do
65
- top_level_code {|g| g.gen_disallow action }.
66
- should == '@scanner.skip(/(?!\w+)/) && true'
67
- end
68
- end
69
- end
70
-
71
- describe '#gen_dispatch_action' do
72
-
73
- let(:code) { NodeCode.new('Word', 'parsed') }
74
-
75
- context 'when nested' do
76
- it 'generates nested matching code with a direct action and a dispatch action' do
77
- nested_code {|g| g.gen_dispatch_action action, code }.
78
- should == (<<-CODE).strip
79
- begin
80
- (r = begin
81
- (r = @scanner.scan(/\\w+/)) &&
82
- (r.to_sym)
83
- end) &&
84
- Word.parsed([r])
85
- end
86
- CODE
87
- end
88
- end
89
-
90
- context 'when top-level' do
91
- it 'generates top level matching code with a direct action and a dispatch action' do
92
- top_level_code {|g| g.gen_dispatch_action action, code }.
93
- should == (<<-CODE).strip
94
- (r = begin
95
- (r = @scanner.scan(/\\w+/)) &&
96
- (r.to_sym)
97
- end) &&
98
- Word.parsed([r])
99
- CODE
100
- end
101
- end
102
- end
103
-
104
- describe '#gen_direct_action' do
105
-
106
- let(:code) { ActionCode.new('|_| _.size') }
107
-
108
- context 'when nested' do
109
- it 'generates nested matching code with nested direct actions' do
110
- nested_code {|g| g.gen_direct_action action, code }.
111
- should == (<<-CODE).strip
112
- begin
113
- (r = begin
114
- (r = @scanner.scan(/\\w+/)) &&
115
- (r.to_sym)
116
- end) &&
117
- (r.size)
118
- end
119
- CODE
120
- end
121
- end
122
-
123
- context 'when top-level' do
124
- it 'generates top level matching code with nested direct actions' do
125
- top_level_code {|g| g.gen_direct_action action, code }.
126
- should == (<<-CODE).strip
127
- (r = begin
128
- (r = @scanner.scan(/\\w+/)) &&
129
- (r.to_sym)
130
- end) &&
131
- (r.size)
132
- CODE
133
- end
134
- end
135
- end
136
-
137
- describe '#gen_token' do
138
-
139
- context 'when nested' do
140
- it 'generates nested token matching code' do
141
- nested_code {|g| g.gen_token action }.
142
- should == '@scanner.scan(/\w+/)'
143
- end
144
- end
145
-
146
- context 'when top-level' do
147
- it 'generates top level token matching code' do
148
- top_level_code {|g| g.gen_token action }.
149
- should == '@scanner.scan(/\w+/)'
150
- end
151
- end
152
- end
153
-
154
- describe '#gen_skip' do
155
-
156
- context 'when nested' do
157
- it 'generates nested skipping code' do
158
- nested_code {|g| g.gen_skip action }.
159
- should == '(@scanner.skip(/\w+/) && true)'
160
- end
161
- end
162
-
163
- context 'when top-level' do
164
- it 'generates top level skipping code' do
165
- top_level_code {|g| g.gen_skip action }.
166
- should == '@scanner.skip(/\w+/) && true'
167
- end
168
- end
169
- end
170
-
171
- describe '#gen_intermediate' do
172
- it 'generates nested matching code with a direct action' do
173
- nested_code {|g| g.gen_intermediate action }.
174
- should == (<<-CODE).strip
175
- begin
176
- (r = @scanner.scan(/\\w+/)) &&
177
- (r.to_sym)
178
- end
179
- CODE
180
- end
181
- end
182
-
183
- describe '#gen_intermediate_assert' do
184
- it 'generates intermediate positive lookahead code' do
185
- nested_code {|g| g.gen_intermediate_assert action }.
186
- should == '@scanner.skip(/(?=\w+)/)'
187
- end
188
- end
189
-
190
- describe '#gen_intermediate_disallow' do
191
- it 'generates intermediate negative lookahead code' do
192
- nested_code {|g| g.gen_intermediate_disallow action }.
193
- should == '@scanner.skip(/(?!\w+)/)'
194
- end
195
- end
196
-
197
- describe '#gen_intermediate_skip' do
198
- it 'generates intermediate skipping code' do
199
- nested_code {|g| g.gen_intermediate_skip action }.
200
- should == '@scanner.skip(/\w+/)'
201
- end
202
- end
203
-
204
- end
@@ -1,204 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
-
3
- include Rattler::BackEnd::ParserGenerator
4
- include Rattler::Parsers
5
-
6
- describe DispatchActionGenerator do
7
-
8
- include ParserGeneratorSpecHelper
9
-
10
- let(:action) { DispatchAction[Match[/\w+/]] }
11
-
12
- describe '#gen_basic' do
13
-
14
- context 'when nested' do
15
- it 'generates nested matching code with a dispatch action' do
16
- nested_code {|g| g.gen_basic action }.
17
- should == (<<-CODE).strip
18
- begin
19
- (r = @scanner.scan(/\\w+/)) &&
20
- Rattler::Runtime::ParseNode.parsed([r])
21
- end
22
- CODE
23
- end
24
- end
25
-
26
- context 'when top-level' do
27
- it 'generates top level matching code with a dispatch action' do
28
- top_level_code {|g| g.gen_basic action }.
29
- should == (<<-CODE).strip
30
- (r = @scanner.scan(/\\w+/)) &&
31
- Rattler::Runtime::ParseNode.parsed([r])
32
- CODE
33
- end
34
- end
35
- end
36
-
37
- describe '#gen_assert' do
38
-
39
- context 'when nested' do
40
- it 'generates nested positive lookahead code' do
41
- nested_code {|g| g.gen_assert action }.
42
- should == '(@scanner.skip(/(?=\w+)/) && true)'
43
- end
44
- end
45
-
46
- context 'when top-level' do
47
- it 'generates top level positive lookahead code' do
48
- top_level_code {|g| g.gen_assert action }.
49
- should == '@scanner.skip(/(?=\w+)/) && true'
50
- end
51
- end
52
- end
53
-
54
- describe '#gen_disallow' do
55
-
56
- context 'when nested' do
57
- it 'generates nested negative lookahead code' do
58
- nested_code {|g| g.gen_disallow action }.
59
- should == '(@scanner.skip(/(?!\w+)/) && true)'
60
- end
61
- end
62
-
63
- context 'when top-level' do
64
- it 'generates top level negative lookahead code' do
65
- top_level_code {|g| g.gen_disallow action }.
66
- should == '@scanner.skip(/(?!\w+)/) && true'
67
- end
68
- end
69
- end
70
-
71
- describe '#gen_dispatch_action' do
72
-
73
- let(:code) { NodeCode.new('Word', 'parsed') }
74
-
75
- context 'when nested' do
76
- it 'generates nested matching code with nested dispatch actions' do
77
- nested_code {|g| g.gen_dispatch_action action, code }.
78
- should == (<<-CODE).strip
79
- begin
80
- (r = begin
81
- (r = @scanner.scan(/\\w+/)) &&
82
- Rattler::Runtime::ParseNode.parsed([r])
83
- end) &&
84
- Word.parsed([r])
85
- end
86
- CODE
87
- end
88
- end
89
-
90
- context 'when top-level' do
91
- it 'generates top level matching code with nested dispatch actions' do
92
- top_level_code {|g| g.gen_dispatch_action action, code }.
93
- should == (<<-CODE).strip
94
- (r = begin
95
- (r = @scanner.scan(/\\w+/)) &&
96
- Rattler::Runtime::ParseNode.parsed([r])
97
- end) &&
98
- Word.parsed([r])
99
- CODE
100
- end
101
- end
102
- end
103
-
104
- describe '#gen_direct_action' do
105
-
106
- let(:code) { ActionCode.new('|_| _.children') }
107
-
108
- context 'when nested' do
109
- it 'generates nested matching code with a dispatch action and a direct action' do
110
- nested_code {|g| g.gen_direct_action action, code }.
111
- should == (<<-CODE).strip
112
- begin
113
- (r = begin
114
- (r = @scanner.scan(/\\w+/)) &&
115
- Rattler::Runtime::ParseNode.parsed([r])
116
- end) &&
117
- (r.children)
118
- end
119
- CODE
120
- end
121
- end
122
-
123
- context 'when top-level' do
124
- it 'generates top level matching code with a dispatch action and a direct action' do
125
- top_level_code {|g| g.gen_direct_action action, code }.
126
- should == (<<-CODE).strip
127
- (r = begin
128
- (r = @scanner.scan(/\\w+/)) &&
129
- Rattler::Runtime::ParseNode.parsed([r])
130
- end) &&
131
- (r.children)
132
- CODE
133
- end
134
- end
135
- end
136
-
137
- describe '#gen_token' do
138
-
139
- context 'when nested' do
140
- it 'generates nested token matching code' do
141
- nested_code {|g| g.gen_token action }.
142
- should == '@scanner.scan(/\w+/)'
143
- end
144
- end
145
-
146
- context 'when top-level' do
147
- it 'generates top level token matching code' do
148
- top_level_code {|g| g.gen_token action }.
149
- should == '@scanner.scan(/\w+/)'
150
- end
151
- end
152
- end
153
-
154
- describe '#gen_skip' do
155
-
156
- context 'when nested' do
157
- it 'generates nested skipping code' do
158
- nested_code {|g| g.gen_skip action }.
159
- should == '(@scanner.skip(/\w+/) && true)'
160
- end
161
- end
162
-
163
- context 'when top-level' do
164
- it 'generates top level skipping code' do
165
- top_level_code {|g| g.gen_skip action }.
166
- should == '@scanner.skip(/\w+/) && true'
167
- end
168
- end
169
- end
170
-
171
- describe '#gen_intermediate' do
172
- it 'generates nested matching code with a dispatch action' do
173
- nested_code {|g| g.gen_intermediate action }.
174
- should == (<<-CODE).strip
175
- begin
176
- (r = @scanner.scan(/\\w+/)) &&
177
- Rattler::Runtime::ParseNode.parsed([r])
178
- end
179
- CODE
180
- end
181
- end
182
-
183
- describe '#gen_intermediate_assert' do
184
- it 'generates intermediate positive lookahead code' do
185
- nested_code {|g| g.gen_intermediate_assert action }.
186
- should == '@scanner.skip(/(?=\w+)/)'
187
- end
188
- end
189
-
190
- describe '#gen_intermediate_disallow' do
191
- it 'generates intermediate negative lookahead code' do
192
- nested_code {|g| g.gen_intermediate_disallow action }.
193
- should == '@scanner.skip(/(?!\w+)/)'
194
- end
195
- end
196
-
197
- describe '#gen_intermediate_skip' do
198
- it 'generates intermediate skipping code' do
199
- nested_code {|g| g.gen_intermediate_skip action }.
200
- should == '@scanner.skip(/\w+/)'
201
- end
202
- end
203
-
204
- end
@@ -1,185 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
-
3
- include Rattler::BackEnd::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
- describe '#gen_dispatch_action' do
68
-
69
- let(:code) { NodeCode.new('Word', 'parsed') }
70
-
71
- context 'given a single-group match' do
72
-
73
- let(:match) { single_group }
74
-
75
- context 'when nested' do
76
- it 'generates nested regex group matching code with a dispatch action' do
77
- nested_code {|g| g.gen_dispatch_action match, code }.
78
- should == (<<-CODE).strip
79
- begin
80
- @scanner.skip(/\\s*(\\w+)/) &&
81
- Word.parsed([@scanner[1]])
82
- end
83
- CODE
84
- end
85
- end
86
-
87
- context 'when top-level' do
88
- it 'generates top-level regex group matching code with a dispatch action' do
89
- top_level_code {|g| g.gen_dispatch_action match, code }.
90
- should == (<<-CODE).strip
91
- @scanner.skip(/\\s*(\\w+)/) &&
92
- Word.parsed([@scanner[1]])
93
- CODE
94
- end
95
- end
96
- end
97
-
98
- context 'given a multi-group match' do
99
-
100
- let(:match) { multi_group }
101
-
102
- context 'when nested' do
103
- it 'generates nested regex group matching code with a dispatch action' do
104
- nested_code {|g| g.gen_dispatch_action match, code }.
105
- should == (<<-CODE).strip
106
- begin
107
- @scanner.skip(/\\s*(\\w+)\\s+(\\w+)/) &&
108
- Word.parsed([@scanner[1], @scanner[2]])
109
- end
110
- CODE
111
- end
112
- end
113
-
114
- context 'when top-level' do
115
- it 'generates top-level regex group matching code with a dispatch action' do
116
- top_level_code {|g| g.gen_dispatch_action match, code }.
117
- should == (<<-CODE).strip
118
- @scanner.skip(/\\s*(\\w+)\\s+(\\w+)/) &&
119
- Word.parsed([@scanner[1], @scanner[2]])
120
- CODE
121
- end
122
- end
123
- end
124
- end
125
-
126
- describe '#gen_direct_action' do
127
-
128
- context 'given a single-group match' do
129
-
130
- let(:match) { single_group }
131
- let(:code) { ActionCode.new('_.to_sym') }
132
-
133
- context 'when nested' do
134
- it 'generates nested regex matching code with a direct action' do
135
- nested_code {|g| g.gen_direct_action match, code }.
136
- should == (<<-CODE).strip
137
- begin
138
- @scanner.skip(/\\s*(\\w+)/) &&
139
- (@scanner[1].to_sym)
140
- end
141
- CODE
142
- end
143
- end
144
-
145
- context 'when top-level' do
146
- it 'generates top level regex matching code with a direct action' do
147
- top_level_code {|g| g.gen_direct_action match, code }.
148
- should == (<<-CODE).strip
149
- @scanner.skip(/\\s*(\\w+)/) &&
150
- (@scanner[1].to_sym)
151
- CODE
152
- end
153
- end
154
- end
155
-
156
- context 'given a multi-group match' do
157
-
158
- let(:match) { multi_group }
159
- let(:code) { ActionCode.new('_.size') }
160
-
161
- context 'when nested' do
162
- it 'generates nested regex matching code with a direct action' do
163
- nested_code {|g| g.gen_direct_action match, code }.
164
- should == (<<-CODE).strip
165
- begin
166
- @scanner.skip(/\\s*(\\w+)\\s+(\\w+)/) &&
167
- ([@scanner[1], @scanner[2]].size)
168
- end
169
- CODE
170
- end
171
- end
172
-
173
- context 'when top-level' do
174
- it 'generates top level regex matching code with a direct action' do
175
- top_level_code {|g| g.gen_direct_action match, code }.
176
- should == (<<-CODE).strip
177
- @scanner.skip(/\\s*(\\w+)\\s+(\\w+)/) &&
178
- ([@scanner[1], @scanner[2]].size)
179
- CODE
180
- end
181
- end
182
-
183
- end
184
- end
185
- end