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,334 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
-
3
- include Rattler::Parsers
4
-
5
- describe ParserDSL do
6
-
7
- subject { ParserDSL.new }
8
-
9
- describe '#match' do
10
- context 'given a regexp' do
11
- it 'creates a regexp match parser' do
12
- subject.match(/\w+/).should == Match[/\w+/]
13
- end
14
- end
15
- context 'given a string' do
16
- it 'creates a literal match parser' do
17
- subject.match('.').should == Match[/\./]
18
- end
19
- end
20
- context 'given a posix name' do
21
- it 'creates a posix class match parser' do
22
- subject.match(:ALNUM).should == Match[/[[:alnum:]]/]
23
- subject.match(:DIGIT).should == Match[/[[:digit:]]/]
24
- end
25
- end
26
- context 'given a symbol' do
27
- it 'creates an apply parser' do
28
- subject.match(:expr).should == Apply[:expr]
29
- end
30
- end
31
- context 'given :EOF' do
32
- it 'creates the eof parser' do
33
- subject.match(:EOF).should == Eof[]
34
- end
35
- end
36
- context 'given :E' do
37
- it 'creates the "E" symbol parser' do
38
- subject.match(:E).should == ESymbol[]
39
- end
40
- end
41
- end
42
-
43
- describe '#optional' do
44
- context 'given a parser' do
45
- it 'creates a repeat parser with optional bounds' do
46
- subject.optional(subject.match(/\w+/)).
47
- should == Repeat[Match[/\w+/], 0, 1]
48
- end
49
- end
50
- context 'given a match argument' do
51
- it 'creates a repeat parser with optional bounds' do
52
- subject.optional(/\w+/).should == Repeat[Match[/\w+/], 0, 1]
53
- end
54
- end
55
- end
56
-
57
- describe '#zero_or_more' do
58
- context 'given a parser' do
59
- it 'creates a repeat parser with zero-or-more bounds' do
60
- subject.zero_or_more(subject.match(/\w+/)).
61
- should == Repeat[Match[/\w+/], 0, nil]
62
- end
63
- end
64
- context 'given a match argument' do
65
- it 'creates a repeat parser with zero-or-more bounds' do
66
- subject.zero_or_more(/\w+/).should == Repeat[Match[/\w+/], 0, nil]
67
- end
68
- end
69
- end
70
-
71
- describe '#one_or_more' do
72
- context 'given a parser' do
73
- it 'creates a repeat parser with one-or-more bounds' do
74
- subject.one_or_more(subject.match(/\w+/)).
75
- should == Repeat[Match[/\w+/], 1, nil]
76
- end
77
- end
78
- context 'given a match argument' do
79
- it 'creates a repeat parser with one-or-more bounds' do
80
- subject.one_or_more(/\w+/).should == Repeat[Match[/\w+/], 1, nil]
81
- end
82
- end
83
- end
84
-
85
- describe '#repeat' do
86
- context 'given parsers' do
87
- it 'creates a repeat parser' do
88
- subject.repeat(subject.match(/\w+/), 2, 4).
89
- should == Repeat[Match[/\w+/], 2, 4]
90
- end
91
- end
92
- context 'given match arguments' do
93
- it 'creates a repeat parser' do
94
- subject.repeat(/\w+/, 2, 4).should == Repeat[Match[/\w+/], 2, 4]
95
- end
96
- end
97
- end
98
-
99
- describe '#list' do
100
- context 'given parsers' do
101
- it 'creates a list parser' do
102
- subject.list(subject.match(/\w+/), subject.match(/,/), 2, 4).
103
- should == ListParser[Match[/\w+/], Match[/,/], 2, 4]
104
- end
105
- end
106
- context 'given match arguments' do
107
- it 'creates a list parser' do
108
- subject.list(/\w+/, ',', 2, 4).
109
- should == ListParser[Match[/\w+/], Match[/,/], 2, 4]
110
- end
111
- end
112
- end
113
-
114
- describe '#assert' do
115
- context 'given a parser' do
116
- it 'create an assert parser' do
117
- subject.assert(subject.match(/\w+/)).should == Assert[Match[/\w+/]]
118
- end
119
- end
120
- context 'given a match argument' do
121
- it 'create an assert match parser' do
122
- subject.assert(/\w+/).should == Assert[Match[/\w+/]]
123
- end
124
- end
125
- end
126
-
127
- describe '#disallow' do
128
- context 'given a parser' do
129
- it 'creates a disallow parser' do
130
- subject.disallow(subject.match(/\w+/)).should == Disallow[Match[/\w+/]]
131
- end
132
- end
133
- context 'given a match argument' do
134
- it 'creates a disallow match parser' do
135
- subject.disallow(/\w+/).should == Disallow[Match[/\w+/]]
136
- end
137
- end
138
- end
139
-
140
- describe '#eof' do
141
- it 'creates the eof parser' do
142
- subject.eof.should == Eof[]
143
- end
144
- end
145
-
146
- describe '#e' do
147
- it 'creates the "E" symbol parser' do
148
- subject.e.should == ESymbol[]
149
- end
150
- end
151
-
152
- describe '#dispatch_action' do
153
- context 'given a parser' do
154
- context 'given options' do
155
- it 'creates an dispatch-action parser with the options' do
156
- subject.dispatch_action(subject.match(/\w+/), :method => 'word').
157
- should == DispatchAction[Match[/\w+/], {:method => 'word'}]
158
- end
159
- end
160
- context 'given no options' do
161
- it 'creates a default dispatch-action parser' do
162
- subject.dispatch_action(subject.match(/\w+/)).should == DispatchAction[Match[/\w+/]]
163
- end
164
- end
165
- end
166
- context 'given a match argument' do
167
- context 'given options' do
168
- it 'creates an dispatch-action match parser with the options' do
169
- subject.dispatch_action(/\w+/, :method => 'word').
170
- should == DispatchAction[Match[/\w+/], {:method => 'word'}]
171
- end
172
- end
173
- context 'given no options' do
174
- it 'creates a default dispatch-action match parser' do
175
- subject.dispatch_action(/\w+/).should == DispatchAction[Match[/\w+/]]
176
- end
177
- end
178
- end
179
- end
180
-
181
- describe '#direct_action' do
182
- context 'given a parser' do
183
- it 'creates a direct-action parser' do
184
- subject.direct_action(subject.match(/\d+/), '|_| _.to_i').
185
- should == DirectAction[Match[/\d+/], '|_| _.to_i']
186
- end
187
- end
188
- context 'given a match argument' do
189
- it 'creates a direct-action match parser' do
190
- subject.direct_action(/\d+/, '|_| _.to_i').
191
- should == DirectAction[Match[/\d+/], '|_| _.to_i']
192
- end
193
- end
194
- end
195
-
196
- describe '#side_effect' do
197
- context 'given a parser' do
198
- it 'creates a side-effect parser' do
199
- subject.side_effect(subject.match(/\d+/), '@i = _.to_i').
200
- should == SideEffect[Match[/\d+/], '@i = _.to_i']
201
- end
202
- end
203
- context 'given a match argument' do
204
- it 'creates a side-effect match parser' do
205
- subject.side_effect(/\d+/, '@i = _.to_i').
206
- should == SideEffect[Match[/\d+/], '@i = _.to_i']
207
- end
208
- end
209
- end
210
-
211
- describe '#semantic_assert' do
212
- context 'given a parser' do
213
- it 'creates a positive Semantic predicate parser' do
214
- subject.semantic_assert(subject.match(/\d+/), '_.to_i < 7').
215
- should == SemanticAssert[Match[/\d+/], '_.to_i < 7']
216
- end
217
- end
218
- context 'given a match argument' do
219
- it 'creates a positive Semantic predicate match parser' do
220
- subject.semantic_assert(/\d+/, '_.to_i < 7').
221
- should == SemanticAssert[Match[/\d+/], '_.to_i < 7']
222
- end
223
- end
224
- end
225
-
226
- describe '#semantic_disallow' do
227
- context 'given a parser' do
228
- it 'creates a negative Semantic predicate parser' do
229
- subject.semantic_disallow(subject.match(/\d+/), '_.to_i < 7').
230
- should == SemanticDisallow[Match[/\d+/], '_.to_i < 7']
231
- end
232
- end
233
- context 'given a match argument' do
234
- it 'creates a negative Semantic match parser' do
235
- subject.semantic_disallow(/\d+/, '_.to_i < 7').
236
- should == SemanticDisallow[Match[/\d+/], '_.to_i < 7']
237
- end
238
- end
239
- end
240
-
241
- describe '#token' do
242
- context 'given a parser' do
243
- it 'creates a token parser' do
244
- subject.token(subject.match(/\w+/)).should == Token[Match[/\w+/]]
245
- end
246
- end
247
- context 'given a match argument' do
248
- it 'create a token match parser' do
249
- subject.token(/\w+/).should == Token[Match[/\w+/]]
250
- end
251
- end
252
- context 'given a block' do
253
- it 'creates token rules' do
254
- subject.token(:word) { match(/\w+/) }.
255
- should == Rule[:word, Token[Match[/\w+/]]]
256
- end
257
- end
258
- end
259
-
260
- describe '#skip' do
261
- context 'given a parser' do
262
- it 'creates a skip parser' do
263
- subject.skip(subject.match(/\w+/)).should == Skip[Match[/\w+/]]
264
- end
265
- end
266
- context 'given a match argument' do
267
- it 'creates a skip match parser' do
268
- subject.skip(/\w+/).should == Skip[Match[/\w+/]]
269
- end
270
- end
271
- end
272
-
273
- describe '#label' do
274
- context 'given a parser' do
275
- it 'creates a label parser' do
276
- subject.label(:word, subject.match(/\w+/)).should == Label[:word, Match[/\w+/]]
277
- end
278
- end
279
- context 'given a match argument' do
280
- it 'create a label match parser' do
281
- subject.label(:word, /\w+/).should == Label[:word, Match[/\w+/]]
282
- end
283
- end
284
- end
285
-
286
- describe '#fail' do
287
- it 'creates a fail-expr parser' do
288
- subject.fail('var expected').should == Fail[:expr, 'var expected']
289
- end
290
- end
291
-
292
- describe '#fail_rule' do
293
- it 'creates a fail-rule parser' do
294
- subject.fail_rule('var expected').should == Fail[:rule, 'var expected']
295
- end
296
- end
297
-
298
- describe '#fail_parse' do
299
- it 'creates a fail-parse parser' do
300
- subject.fail_parse('var expected').should == Fail[:parse, 'var expected']
301
- end
302
- end
303
-
304
- describe '#rule' do
305
- context 'given a block' do
306
- it 'creates a rule' do
307
- subject.rule(:word) { skip(/\s*/) & match(/\w+/) }.
308
- should == Rule[:word, Sequence[Skip[Match[/\s*/]], Match[/\w+/]]]
309
- end
310
- context 'with whitespace defined' do
311
- it 'creates rules that skip the whitespace' do
312
- subject.with_ws(/\s*/) { rule(:word) { match(/\w+/) } }.
313
- should == Rule[:word, Sequence[Skip[Match[/\s*/]], Match[/\w+/]]]
314
- end
315
- end
316
- end
317
- end
318
-
319
- describe '#rules' do
320
- context 'given a block' do
321
- it 'creates multiple rules' do
322
- subject.rules do
323
- rule(:word) { match(/\w+/) }
324
- rule(:number) { match(/\d+/) }
325
- end.
326
- should == RuleSet[
327
- Rule[:word, Match[/\w+/]],
328
- Rule[:number, Match[/\d+/]]
329
- ]
330
- end
331
- end
332
- end
333
-
334
- end
@@ -1,83 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
-
3
- describe SemanticAssert do
4
- include CombinatorParserSpecHelper
5
-
6
- subject { SemanticAssert[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 == "451"' }
14
-
15
- context 'when the parser matches' do
16
-
17
- context 'if the semantic action results in a true value' do
18
- it 'succeeds' do
19
- parsing('451a').should result_in('451').at(3)
20
- end
21
- end
22
-
23
- context 'if the semantic action results in a false value' do
24
- it 'fails' do
25
- parsing('321a').should fail
26
- end
27
- end
28
- end
29
-
30
- context 'when the parser fails' do
31
- it 'fails' do
32
- parsing('foo').should fail
33
- end
34
- end
35
-
36
- context 'using the "_" character' do
37
-
38
- let(:code) { '_ == "451"' }
39
-
40
- it 'evaluates the predicate binding the captured result as "_"' do
41
- parsing('451a').should result_in('451').at(3)
42
- parsing('321a').should fail
43
- end
44
- end
45
- end
46
- end
47
-
48
- describe '#capturing?' do
49
-
50
- let(:code) { '' }
51
-
52
- context 'with a capturing parser' do
53
-
54
- let(:nested) { Match[/\w+/] }
55
-
56
- it 'is true' do
57
- subject.should be_capturing
58
- end
59
- end
60
-
61
- context 'with a non-capturing parser' do
62
-
63
- let(:nested) { Skip[Match[/\s*/]] }
64
-
65
- it 'is false' do
66
- subject.should_not be_capturing
67
- end
68
- end
69
- end
70
-
71
- describe '#with_ws' do
72
-
73
- let(:ws) { Match[/\s*/] }
74
- let(:nested) { Match[/\w+/] }
75
- let(:code) { '' }
76
-
77
- it 'applies #with_ws to the nested parser' do
78
- subject.with_ws(ws).
79
- should == SemanticAssert[Sequence[Skip[ws], nested], code]
80
- end
81
- end
82
-
83
- end
@@ -1,83 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
-
3
- describe SemanticDisallow do
4
- include CombinatorParserSpecHelper
5
-
6
- subject { SemanticDisallow[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 == "451"' }
14
-
15
- context 'when the parser matches' do
16
-
17
- context 'if the semantic action results in a true value' do
18
- it 'fails' do
19
- parsing('451a').should fail
20
- end
21
- end
22
-
23
- context 'if the semantic action results in a false value' do
24
- it 'succeeds' do
25
- parsing('321a').should result_in('321').at(3)
26
- end
27
- end
28
- end
29
-
30
- context 'when the parser fails' do
31
- it 'fails' do
32
- parsing('foo').should fail
33
- end
34
- end
35
-
36
- context 'using the "_" character' do
37
-
38
- let(:code) { '_ == "451"' }
39
-
40
- it 'evaluates the predicate binding the captured result as "_"' do
41
- parsing('451a').should fail
42
- parsing('321a').should result_in('321').at(3)
43
- end
44
- end
45
- end
46
- end
47
-
48
- describe '#capturing?' do
49
-
50
- let(:code) { '' }
51
-
52
- context 'with a capturing parser' do
53
-
54
- let(:nested) { Match[/\w+/] }
55
-
56
- it 'is true' do
57
- subject.should be_capturing
58
- end
59
- end
60
-
61
- context 'with a non-capturing parser' do
62
-
63
- let(:nested) { Skip[Match[/\s*/]] }
64
-
65
- it 'is false' do
66
- subject.should_not be_capturing
67
- end
68
- end
69
- end
70
-
71
- describe '#with_ws' do
72
-
73
- let(:ws) { Match[/\s*/] }
74
- let(:nested) { Match[/\w+/] }
75
- let(:code) { '' }
76
-
77
- it 'applies #with_ws to the nested parser' do
78
- subject.with_ws(ws).
79
- should == SemanticDisallow[Sequence[Skip[ws], nested], code]
80
- end
81
- end
82
-
83
- end