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,224 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
-
3
- describe DirectAction do
4
- include CombinatorParserSpecHelper
5
-
6
- subject { DirectAction[nested, code] }
7
-
8
- describe '#parse' do
9
-
10
- context 'with a capturing parser' do
11
-
12
- let(:nested) { Match[/[[:digit:]]+/] }
13
- let(:code) { '|s| s * 2' }
14
-
15
- context 'when the parser matches' do
16
- it 'applies the action binding the captured results as arguments' do
17
- parsing('451a').should result_in('451451').at(3)
18
- end
19
- end
20
-
21
- context 'when the parser fails' do
22
- it 'fails' do
23
- parsing('foo').should fail
24
- end
25
- end
26
-
27
- context 'using the "_" character' do
28
-
29
- let(:code) { '_ * 2' }
30
-
31
- it 'applies the action binding the captured result as "_"' do
32
- parsing('451a').should result_in('451451').at(3)
33
- end
34
- end
35
- end
36
-
37
- context 'with a sequence parser' do
38
-
39
- let :nested do
40
- Sequence[Match[/[[:alpha:]]+/], Skip[Match[/\=/]], Match[/[[:digit:]]+/]]
41
- end
42
-
43
- let(:code) { '|l, r| "#{r} -> #{l}"' }
44
-
45
- context 'when the parser matches' do
46
- it 'applies the action binding the captured results as arguments' do
47
- parsing('val=42 ').should result_in('42 -> val').at(6)
48
- end
49
- end
50
-
51
- context 'using the "_" character' do
52
-
53
- let(:code) { '_.join " <- "' }
54
-
55
- it 'applies the action binding the captured result array as "_"' do
56
- parsing('val=42 ').should result_in('val <- 42').at(6)
57
- end
58
- end
59
- end
60
-
61
- context 'with an optional parser' do
62
-
63
- let(:nested) { Repeat[Match[/\d/], 0, 1] }
64
- let(:code) { '|s| s' }
65
-
66
- context 'when the nested parser matches' do
67
- it 'applies the action to an array containing the match' do
68
- parsing('451a').should result_in(['4']).at(1)
69
- end
70
- end
71
-
72
- context 'when the nested parser fails' do
73
- it 'applies the action to an empty array' do
74
- parsing('foo').should result_in([]).at(0)
75
- end
76
- end
77
- end
78
-
79
- context 'with a zero-or-more parser' do
80
-
81
- let(:nested) { Repeat[Match[/\d/], 0, nil] }
82
- let(:code) { '|s| s * 2' }
83
-
84
- context 'when the nested parser matches' do
85
- it 'applies the action to an array containing the matches' do
86
- parsing('451a').should result_in(%w{4 5 1 4 5 1}).at(3)
87
- end
88
- end
89
-
90
- context 'when the nested parser fails' do
91
- it 'applies the action to an empty array' do
92
- parsing('foo').should result_in([]).at(0)
93
- end
94
- end
95
- end
96
-
97
- context 'with a one-or-more parser' do
98
-
99
- let(:nested) { Repeat[Match[/\d/], 1, nil] }
100
- let(:code) { '|s| s * 2' }
101
-
102
- context 'when the nested parser matches' do
103
- it 'applies the action to an array containing the matches' do
104
- parsing('451a').should result_in(%w{4 5 1 4 5 1}).at(3)
105
- end
106
- end
107
-
108
- context 'when the nested parser fails' do
109
- it 'fails' do
110
- parsing('foo').should fail
111
- end
112
- end
113
- end
114
-
115
- context 'with a list parser' do
116
-
117
- let(:nested) { ListParser[Match[/[[:digit:]]+/], Match[/,/], 2, 4] }
118
- let(:code) { '_.map {|s| s.to_i }' }
119
-
120
- context 'when the nested parser matches' do
121
- it 'applies the action to an array containing the matches' do
122
- parsing('1,2,42').should result_in([1, 2, 42]).at(6)
123
- end
124
- end
125
-
126
- context 'when the nested parser fails' do
127
- it 'fails' do
128
- parsing('foo').should fail
129
- end
130
- end
131
- end
132
-
133
- context 'with a token parser' do
134
-
135
- let(:nested) { Token[Match[/[[:digit:]]+/]] }
136
- let(:code) { '|s| s.to_i' }
137
-
138
- context 'when the parser matches' do
139
- it 'applies the action to the matched string' do
140
- parsing('42 ').should result_in(42).at(2)
141
- end
142
- end
143
- end
144
-
145
- context 'with a non-capturing parser' do
146
-
147
- let(:nested) { Skip[Match[/\w+/]] }
148
- let(:code) { '42' }
149
-
150
- context 'when the parser matches' do
151
- it 'applies the action with no arguments' do
152
- parsing('abc123 ').should result_in(42).at(6)
153
- end
154
- end
155
- end
156
-
157
- context 'with a labeled parser' do
158
-
159
- let(:nested) { Label[:word, Match[/[[:alpha:]]+/]] }
160
- let(:code) { 'word * 2' }
161
-
162
- context 'when the parser matches' do
163
- it 'applies the action binding the label to the result' do
164
- parsing('foo ').should result_in('foofoo').at(3)
165
- end
166
- end
167
- end
168
-
169
- context 'with a sequence of labeled parsers' do
170
-
171
- let :nested do
172
- Sequence[
173
- Label[:left, Match[/[[:alpha:]]+/]],
174
- Match[/\=/],
175
- Label[:right, Match[/[[:digit:]]+/]]
176
- ]
177
- end
178
-
179
- let(:code) { '"#{right} -> #{left}"' }
180
-
181
- context 'when the parser matches' do
182
- it 'applies the action binding the labels to the results' do
183
- parsing('val=42 ').should result_in('42 -> val').at(6)
184
- end
185
- end
186
- end
187
- end
188
-
189
- describe '#capturing?' do
190
-
191
- let(:code) { '' }
192
-
193
- context 'with a capturing parser' do
194
-
195
- let(:nested) { Match[/\w+/] }
196
-
197
- it 'is true' do
198
- subject.should be_capturing
199
- end
200
- end
201
-
202
- context 'with a non-capturing parser' do
203
-
204
- let(:nested) { Skip[Match[/\s*/]] }
205
-
206
- it 'is false' do
207
- subject.should_not be_capturing
208
- end
209
- end
210
- end
211
-
212
- describe '#with_ws' do
213
-
214
- let(:ws) { Match[/\s*/] }
215
- let(:nested) { Match[/\w+/] }
216
- let(:code) { '' }
217
-
218
- it 'applies #with_ws to the nested parser' do
219
- subject.with_ws(ws).
220
- should == DirectAction[Sequence[Skip[ws], nested], code]
221
- end
222
- end
223
-
224
- end
@@ -1,209 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
-
3
- describe DispatchAction do
4
- include CombinatorParserSpecHelper
5
-
6
- subject { DispatchAction[nested] }
7
-
8
- describe '#parse' do
9
-
10
- context 'with a capturing parser' do
11
-
12
- let(:nested) { Match[/[[:digit:]]+/] }
13
-
14
- context 'when the parser matches' do
15
- it 'applies the action to the result' do
16
- parsing('451a').
17
- should result_in(Rattler::Runtime::ParseNode.parsed(['451'])).at(3)
18
- end
19
- end
20
-
21
- context 'when the parser fails' do
22
- it 'fails' do
23
- parsing('foo').should fail
24
- end
25
- end
26
- end
27
-
28
- context 'with a sequence parser' do
29
-
30
- let(:nested) { Sequence[
31
- Match[/[[:alpha:]]+/], Match[/\=/], Match[/[[:digit:]]+/]
32
- ] }
33
-
34
- context 'when the parser matches' do
35
- it 'applies the action to the result' do
36
- parsing('val=42').
37
- should result_in(Rattler::Runtime::ParseNode.parsed(['val','=','42'])).at(6)
38
- end
39
- end
40
-
41
- context 'when the parser fails' do
42
- it 'fails' do
43
- parsing('val=x').should fail
44
- end
45
- end
46
- end
47
-
48
- context 'with an optional parser' do
49
-
50
- let(:nested) { Repeat[Match[/\d/], 0, 1] }
51
-
52
- context 'when the nested parser matches' do
53
- it 'applies the action to an array containing the match' do
54
- parsing('451a').
55
- should result_in(Rattler::Runtime::ParseNode.parsed(['4'])).at(1)
56
- end
57
- end
58
-
59
- context 'when the nested parser fails' do
60
- it 'applies the action to an empty array' do
61
- parsing('foo').
62
- should result_in(Rattler::Runtime::ParseNode.parsed([])).at(0)
63
- end
64
- end
65
- end
66
-
67
- context 'with a zero-or-more parser' do
68
-
69
- let(:nested) { Repeat[Match[/\d/], 0, nil] }
70
-
71
- context 'when the nested parser matches' do
72
- it 'applies the action to an array containing the matches' do
73
- parsing('451a').
74
- should result_in(Rattler::Runtime::ParseNode.parsed(['4', '5', '1'])).at(3)
75
- end
76
- end
77
-
78
- context 'when the nested parser fails' do
79
- it 'applies the action to an empty array' do
80
- parsing('foo').
81
- should result_in(Rattler::Runtime::ParseNode.parsed([])).at(0)
82
- end
83
- end
84
- end
85
-
86
- context 'with a one-or-more parser' do
87
-
88
- let(:nested) { Repeat[Match[/\d/], 1, nil] }
89
-
90
- context 'when the nested parser matches' do
91
- it 'applies the action to an array containing the matches' do
92
- parsing('451a').
93
- should result_in(Rattler::Runtime::ParseNode.parsed(['4', '5', '1'])).at(3)
94
- end
95
- end
96
-
97
- context 'when the nested parser fails' do
98
- it 'fails' do
99
- parsing('foo').should fail
100
- end
101
- end
102
- end
103
-
104
- context 'with a list parser' do
105
-
106
- let(:nested) { ListParser[Match[/[[:digit:]]+/], Match[/,/], 2, 4] }
107
-
108
- context 'when the nested parser matches' do
109
- it 'applies the action to an array containing the matches' do
110
- parsing('1,2,42').
111
- should result_in(Rattler::Runtime::ParseNode.parsed(['1', '2', '42'])).at(6)
112
- end
113
- end
114
-
115
- context 'when the nested parser fails' do
116
- it 'fails' do
117
- parsing('foo').should fail
118
- end
119
- end
120
- end
121
-
122
- context 'with a token parser' do
123
-
124
- let(:nested) { Token[Match[/\w+/]] }
125
-
126
- context 'when the parser matches' do
127
- it 'applies the action to the matched string' do
128
- parsing('foo ').
129
- should result_in(Rattler::Runtime::ParseNode.parsed(['foo'])).at(3)
130
- end
131
- end
132
- end
133
-
134
- context 'with a non-capturing parser' do
135
-
136
- let(:nested) { Skip[Match[/,/]] }
137
-
138
- context 'when the parser matches' do
139
- it 'applies the action to an empty array' do
140
- parsing(', ').
141
- should result_in(Rattler::Runtime::ParseNode.parsed([])).at(1)
142
- end
143
- end
144
- end
145
-
146
- context 'with a labeled parser' do
147
-
148
- let(:nested) { Label[:word, Match[/[[:alpha:]]+/]] }
149
-
150
- context 'when the parser matches' do
151
- it 'applies the action binding the label to the result' do
152
- parsing('foo ').
153
- should result_in(Rattler::Runtime::ParseNode.parsed(['foo'],
154
- :labeled => {:word => 'foo'}))
155
- end
156
- end
157
- end
158
-
159
- context 'with a sequence of labeled parsers' do
160
-
161
- let(:nested) { Sequence[
162
- Label[:name, Match[/[[:alpha:]]+/]],
163
- Match[/\=/],
164
- Label[:value, Match[/[[:digit:]]+/]]
165
- ] }
166
-
167
- context 'when the parser matches' do
168
- it 'applies the action binding the labels to the results' do
169
- parsing('val=42 ').
170
- should result_in(Rattler::Runtime::ParseNode.parsed(['val','=','42'],
171
- :labeled => {:name => 'val', :value => '42'}))
172
- end
173
- end
174
- end
175
- end
176
-
177
- describe '#capturing?' do
178
-
179
- context 'with a capturing parser' do
180
-
181
- let(:nested) { Match[/\w+/] }
182
-
183
- it 'is true' do
184
- subject.should be_capturing
185
- end
186
- end
187
-
188
- context 'with a non-capturing parser' do
189
-
190
- let(:nested) { Skip[Match[/\s*/]] }
191
-
192
- it 'is false' do
193
- subject.should_not be_capturing
194
- end
195
- end
196
- end
197
-
198
- describe '#with_ws' do
199
-
200
- let(:ws) { Match[/\s*/] }
201
- let(:nested) { Match[/\w+/] }
202
-
203
- it 'applies #with_ws to the nested parser' do
204
- subject.with_ws(ws).
205
- should == DispatchAction[Sequence[Skip[ws], nested]]
206
- end
207
- end
208
-
209
- end
@@ -1,59 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
-
3
- describe Rattler::Parsers::NodeCode do
4
-
5
- subject { described_class.new(target_name, method_name, target_attrs) }
6
-
7
- let(:target_name) { 'Expr' }
8
- let(:method_name) { 'parsed' }
9
- let(:target_attrs) { {} }
10
-
11
- describe '#bind' do
12
-
13
- let(:scope) { {} }
14
-
15
- context 'given empty bind args' do
16
- it 'binds "[]"' do
17
- subject.bind(scope, []).should == 'Expr.parsed([])'
18
- end
19
- end
20
-
21
- context 'given a single bind arg' do
22
- it 'binds the an array with the arg' do
23
- subject.bind(scope, ['a']).should == 'Expr.parsed([a])'
24
- end
25
- end
26
-
27
- context 'given a multiple bind args' do
28
- it 'binds the an array with the arg' do
29
- subject.bind(scope, ['a', 'b', 'c']).should == 'Expr.parsed([a, b, c])'
30
- end
31
- end
32
-
33
- context 'given a string as bind args' do
34
- it 'binds the exact string' do
35
- subject.bind(scope, 'a').should == 'Expr.parsed(a)'
36
- end
37
- end
38
-
39
- context 'with scope' do
40
-
41
- let(:scope) { {:word => 'w'} }
42
-
43
- it 'binds the scope as labeled results' do
44
- subject.bind(scope, ['a', 'b']).
45
- should == 'Expr.parsed([a, b], :labeled => {:word => w})'
46
- end
47
- end
48
-
49
- context 'with target_attrs' do
50
-
51
- let(:target_attrs) { {:name => 'expression'} }
52
-
53
- it '' do
54
- subject.bind(scope, ['a', 'b']).
55
- should == 'Expr.parsed([a, b], :name => "expression")'
56
- end
57
- end
58
- end
59
- end