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
@@ -28,6 +28,27 @@ describe Skip do
28
28
  end
29
29
  end
30
30
 
31
+ describe '#capturing_decidable?' do
32
+
33
+ context 'with a capturing_decidable parser' do
34
+
35
+ let(:nested) { Match[/\w+/] }
36
+
37
+ it 'is true' do
38
+ subject.should be_capturing_decidable
39
+ end
40
+ end
41
+
42
+ context 'with a non-capturing_decidable parser' do
43
+
44
+ let(:nested) { Apply[:foo] }
45
+
46
+ it 'is true' do
47
+ subject.should be_capturing_decidable
48
+ end
49
+ end
50
+ end
51
+
31
52
  describe '#with_ws' do
32
53
 
33
54
  let(:ws) { Match[/\s*/] }
@@ -0,0 +1,45 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe Super do
4
+ include CombinatorParserSpecHelper
5
+
6
+ subject { Super[:word] }
7
+
8
+ let(:rules) { RuleSet.new(:includes => [included_rules]) }
9
+
10
+ let(:included_rules) { RuleSet[Rule[:word, Match[/\w+/]]] }
11
+
12
+ describe '#parse' do
13
+
14
+ context 'when the inherited rule matches' do
15
+ it 'succeeds returns the result' do
16
+ parsing('abc123 ').should result_in('abc123').at(6)
17
+ end
18
+ end
19
+
20
+ context 'when the inherited rule fails' do
21
+ it 'fails' do
22
+ parsing('==').should fail
23
+ end
24
+ end
25
+ end
26
+
27
+ describe '#capturing?' do
28
+ it 'is true' do
29
+ subject.should be_capturing
30
+ end
31
+ end
32
+
33
+ describe '#capturing_decidable?' do
34
+ it 'is false' do
35
+ subject.should_not be_capturing_decidable
36
+ end
37
+ end
38
+
39
+ describe '#with_ws' do
40
+ it 'returns self' do
41
+ subject.with_ws(Match[/\s*/]).should == subject
42
+ end
43
+ end
44
+
45
+ end
@@ -2,53 +2,72 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Token do
4
4
  include CombinatorParserSpecHelper
5
-
5
+
6
6
  describe '#parse' do
7
-
7
+
8
8
  subject do
9
9
  Token[Sequence[Match[/[[:alpha:]]+/], Match[/\=/], Match[/[[:digit:]]+/]]]
10
10
  end
11
-
11
+
12
12
  context 'when the parser matches' do
13
13
  it 'matches returning the entire matched string' do
14
14
  parsing('val=42 ').should result_in('val=42').at(6)
15
15
  end
16
16
  end
17
-
17
+
18
18
  context 'when the parser fails' do
19
19
  it 'fails' do
20
20
  parsing('val=x').should fail
21
21
  end
22
22
  end
23
-
23
+
24
24
  context 'with a non-capturing parser' do
25
-
25
+
26
26
  subject { Token[Skip[Match[/\w+/]]] }
27
-
27
+
28
28
  context 'when the parser matches' do
29
29
  it 'matches returning the entire matched string' do
30
30
  parsing('abc123 ').should result_in('abc123').at(6)
31
31
  end
32
32
  end
33
33
  end
34
-
34
+
35
35
  end
36
-
36
+
37
37
  describe '#capturing?' do
38
-
38
+
39
39
  subject { Token[Match[/\w+/]] }
40
-
40
+
41
41
  it 'is true' do
42
42
  subject.should be_capturing
43
43
  end
44
-
44
+
45
45
  context 'with a non-capturing parser' do
46
+
46
47
  subject { Token[Skip[Match[/\s*/]]] }
48
+
47
49
  it 'is true' do
48
50
  subject.should be_capturing
49
51
  end
50
52
  end
51
-
52
53
  end
53
-
54
+
55
+ describe '#capturing_decidable?' do
56
+
57
+ subject { Token[Match[/\w+/]] }
58
+
59
+ it 'is true' do
60
+ subject.should be_capturing_decidable
61
+ end
62
+
63
+ context 'with a non-capturing_decidable parser' do
64
+
65
+ subject { Token[Apply[:foo]] }
66
+
67
+ it 'is true' do
68
+ subject.should be_capturing_decidable
69
+ end
70
+ end
71
+ end
72
+
54
73
  end
@@ -7,18 +7,20 @@ describe Rattler::Runtime::ExtendedPackratParser do
7
7
  it_behaves_like 'a generated packrat parser'
8
8
 
9
9
  let :parser_class do
10
- Rattler::BackEnd::Compiler.compile_parser described_class, grammar
10
+ Rattler::Compiler.compile_parser described_class, grammar
11
11
  end
12
12
 
13
+ let(:grammar) { Rattler::Parsers::Grammar[Rattler::Parsers::RuleSet[*rules]] }
14
+
13
15
  describe '#match' do
14
16
 
15
17
  context 'given a directly left-recursive rule' do
16
- let(:grammar) { define_grammar do
17
- rule :a do
18
+ let(:rules) { [
19
+ rule(:a) {
18
20
  ( match(:a) & match(/\d/) \
19
21
  | match(/\d/) )
20
- end
21
- end }
22
+ }
23
+ ] }
22
24
 
23
25
  it 'parses correctly' do
24
26
  parsing('12345a').should result_in([[[['1', '2'], '3'], '4'], '5']).at(5)
@@ -26,10 +28,10 @@ describe Rattler::Runtime::ExtendedPackratParser do
26
28
  end
27
29
 
28
30
  context 'given indirectly left-recursive rules' do
29
- let(:grammar) { define_grammar do
30
- rule(:a) { match(:b) | match(/\d/) }
31
+ let(:rules) { [
32
+ rule(:a) { match(:b) | match(/\d/) },
31
33
  rule(:b) { match(:a) & match(/\d/) }
32
- end }
34
+ ] }
33
35
 
34
36
  it 'parses correctly' do
35
37
  parsing('12345a').should result_in([[[['1', '2'], '3'], '4'], '5']).at(5)
@@ -2,5 +2,31 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
  require File.expand_path(File.dirname(__FILE__) + '/shared_parser_examples')
3
3
 
4
4
  describe Rattler::Runtime::RecursiveDescentParser do
5
+
5
6
  it_behaves_like 'a generated recursive descent parser'
7
+
8
+ describe '.grammar' do
9
+
10
+ let(:parser_class) { Class.new(described_class) }
11
+
12
+ context 'given a string' do
13
+
14
+ before { parser_class.module_eval do
15
+ grammar <<-G
16
+ word <- @WORD+
17
+ num <- @DIGIT+
18
+ G
19
+ end }
20
+
21
+ it 'defines rule methods using the grammar syntax' do
22
+ parser_class.should have_method(:match_word)
23
+ parser_class.should have_method(:match_num )
24
+ end
25
+ end
26
+ end
27
+
28
+ def have_method(rule_name)
29
+ be_method_defined(rule_name)
30
+ end
31
+
6
32
  end
@@ -3,11 +3,13 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
3
3
  shared_examples_for 'a recursive descent parser' do
4
4
  include RuntimeParserSpecHelper
5
5
 
6
+ let(:grammar) { Rattler::Parsers::Grammar[Rattler::Parsers::RuleSet[*rules]] }
7
+
6
8
  describe '#parse' do
7
9
 
8
- let(:grammar) { define_grammar do
10
+ let(:rules) { [
9
11
  rule(:word) { match(/\w+/) }
10
- end }
12
+ ] }
11
13
 
12
14
  it 'applies the start rule to the source' do
13
15
  parsing('Hello World!').should result_in('Hello').at(5)
@@ -22,14 +24,16 @@ shared_examples_for 'a generated recursive descent parser' do
22
24
  it_behaves_like 'a recursive descent parser'
23
25
 
24
26
  let(:parser_class) do
25
- Rattler::BackEnd::Compiler.compile_parser described_class, grammar
27
+ Rattler::Compiler.compile_parser described_class, grammar
26
28
  end
27
29
 
30
+ let(:grammar) { Rattler::Parsers::Grammar[Rattler::Parsers::RuleSet[*rules]] }
31
+
28
32
  describe '#match' do
29
33
 
30
- let(:grammar) { define_grammar do
34
+ let(:rules) { [
31
35
  rule(:word) { match(/\w+/) }
32
- end }
36
+ ] }
33
37
 
34
38
  it 'dispatches to the correct match method' do
35
39
  matching('Hello World!').as(:word).should result_in('Hello').at(5)
@@ -42,12 +46,12 @@ shared_examples_for 'a generated recursive descent parser' do
42
46
 
43
47
  context 'given recursive rules' do
44
48
 
45
- let(:grammar) { define_grammar do
46
- rule :a do
49
+ let(:rules) { [
50
+ rule(:a) {
47
51
  ( match(/\d/) & match(:a) \
48
52
  | match(/\d/) )
49
- end
50
- end }
53
+ }
54
+ ] }
51
55
 
52
56
  it 'applies the rules recursively' do
53
57
  matching('1234abc').as(:a).should result_in(['1', ['2', ['3', '4']]]).at(4)
@@ -63,22 +67,24 @@ shared_examples_for 'a generated packrat parser' do
63
67
  it_behaves_like 'a generated recursive descent parser'
64
68
 
65
69
  let(:parser_class) do
66
- Rattler::BackEnd::Compiler.compile_parser described_class, grammar
70
+ Rattler::Compiler.compile_parser described_class, grammar
67
71
  end
68
72
 
73
+ let(:grammar) { Rattler::Parsers::Grammar[Rattler::Parsers::RuleSet[*rules]] }
74
+
69
75
  describe '#match' do
70
76
 
71
77
  context 'given recursive rules' do
72
78
 
73
- let(:grammar) { define_grammar do
74
- rule :a do
79
+ let(:rules) { [
80
+ rule(:a) {
75
81
  ( match(:b) & match('a') \
76
82
  | match(:b) & eof )
77
- end
78
- rule :b do
83
+ },
84
+ rule(:b) {
79
85
  match('b') & disallow(:a)
80
- end
81
- end }
86
+ }
87
+ ] }
82
88
 
83
89
  let(:example) { matching('bag').as(:a) }
84
90
 
@@ -3,42 +3,58 @@ require 'set'
3
3
 
4
4
  describe Rattler::Util::GraphViz::NodeBuilder do
5
5
 
6
+ let(:builder) { Rattler::Util::GraphViz::NodeBuilder }
7
+
6
8
  describe '#node_label' do
7
9
 
8
10
  context 'given a number' do
9
11
  it 'returns a number as a string' do
10
- subject.node_label(42).should == '42'
12
+ builder.node_label(42).should == '42'
11
13
  end
12
14
  end
13
15
 
14
16
  context 'given a string' do
15
- it 'returns the string surrounded by escaped quotes' do
16
- subject.node_label('abc').should == '"abc"'
17
+ it 'returns the string surrounded by quotes' do
18
+ builder.node_label('abc').should == '"abc"'
17
19
  end
18
20
  end
19
21
 
20
22
  context 'given an unnamed record-like object' do
21
23
  it 'returns a record label with the class name' do
22
- subject.node_label(Rattler::Util::Node[]).should == '{Rattler::Util::Node}'
24
+ builder.node_label(Rattler::Util::Node[]).should == '{Rattler::Util::Node}'
23
25
  end
24
26
  end
25
27
 
26
28
  context 'given a named record-like object' do
27
29
  it 'returns a record label with a name' do
28
- subject.node_label(Rattler::Util::Node[{:name => 'IDENT'}]).
30
+ builder.node_label(Rattler::Util::Node[{:name => 'IDENT'}]).
29
31
  should == '{IDENT}'
30
32
  end
31
33
  end
32
34
 
33
35
  context 'given an array-like object' do
34
36
  it 'returns "[]" escaped' do
35
- subject.node_label(['let', 'x', '=', '1']).should == '\\[\\]'
37
+ builder.node_label(['let', 'x', '=', '1']).should == '\\[\\]'
36
38
  end
37
39
  end
38
40
 
39
41
  context 'given a hash with compound values' do
40
42
  it 'returns "{}" escaped' do
41
- subject.node_label({:a => 'a', :b => ['a1', 'a2']}).should == '\\{\\}'
43
+ builder.node_label({:a => 'a', :b => ['a1', 'a2']}).should == '\\{\\}'
44
+ end
45
+ end
46
+
47
+ context 'given a hash with simple values' do
48
+ it 'returns a record label with the values' do
49
+ builder.node_label({:a => 'a', :b => 'b'}).should ==
50
+ '{\\{\\}|{:a|"a"}|{:b|"b"}}'
51
+ end
52
+
53
+ context 'with special characters' do
54
+ it 'escapes the special characters' do
55
+ builder.node_label({:a => '<|>\\'}).should ==
56
+ '{\\{\\}|{:a|"\\<\\|\\>\\\\"}}'
57
+ end
42
58
  end
43
59
  end
44
60
  end
@@ -47,19 +63,19 @@ describe Rattler::Util::GraphViz::NodeBuilder do
47
63
 
48
64
  context 'given an array' do
49
65
  it 'returns true' do
50
- subject.array_like?(['a']).should be_true
66
+ builder.array_like?(['a']).should be_true
51
67
  end
52
68
  end
53
69
 
54
70
  context 'given a simple hash' do
55
71
  it 'returns true' do
56
- subject.array_like?({:a => 'a'}).should be_true
72
+ builder.array_like?({:a => 'a'}).should be_true
57
73
  end
58
74
  end
59
75
 
60
76
  context 'given a string' do
61
77
  it 'returns false' do
62
- subject.array_like?('a').should be_false
78
+ builder.array_like?('a').should be_false
63
79
  end
64
80
  end
65
81
  end
@@ -68,24 +84,24 @@ describe Rattler::Util::GraphViz::NodeBuilder do
68
84
 
69
85
  context 'given a hash of simple values' do
70
86
  it 'returns true' do
71
- subject.record_like?({:a => 'a', :b => 'b'}).should be_true
87
+ builder.record_like?({:a => 'a', :b => 'b'}).should be_true
72
88
  end
73
89
  end
74
90
 
75
91
  context 'given a hash with compound values' do
76
92
  it 'returns false' do
77
- subject.record_like?({:a => ['a1', 'a2'], :b => 'b'}).should be_false
93
+ builder.record_like?({:a => ['a1', 'a2'], :b => 'b'}).should be_false
78
94
  end
79
95
  end
80
96
 
81
97
  context 'given an array' do
82
98
  it 'returns false' do
83
- subject.record_like?(['a']).should be_false
99
+ builder.record_like?(['a']).should be_false
84
100
  end
85
101
  end
86
102
  end
87
103
 
88
- describe '#each_child_of' do
104
+ describe '#each_child_node_of' do
89
105
 
90
106
  context 'given an array' do
91
107
 
@@ -93,7 +109,7 @@ describe Rattler::Util::GraphViz::NodeBuilder do
93
109
 
94
110
  it 'iterates over the members' do
95
111
  children = []
96
- subject.each_child_of(object) {|_| children << _ }
112
+ builder.each_child_node_of(object) {|_| children << _ }
97
113
  children.should == ['a', 'b', 'c']
98
114
  end
99
115
  end
@@ -104,7 +120,7 @@ describe Rattler::Util::GraphViz::NodeBuilder do
104
120
 
105
121
  it 'iterates over the pairs yielding Mappings' do
106
122
  children = Set[]
107
- subject.each_child_of(object) {|_| children << _ }
123
+ builder.each_child_node_of(object) {|_| children << _ }
108
124
  children.should have(2).mappings
109
125
  end
110
126
  end
@@ -115,7 +131,7 @@ describe Rattler::Util::GraphViz::NodeBuilder do
115
131
 
116
132
  it 'does nothing' do
117
133
  children = Set[]
118
- subject.each_child_of(object) {|_| children << _}
134
+ builder.each_child_node_of(object) {|_| children << _}
119
135
  children.should be_empty
120
136
  end
121
137
  end