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,19 +0,0 @@
1
- require 'rattler/parsers'
2
-
3
- module Rattler::Parsers
4
- #
5
- # +SemanticDisallow+ decorates a parser to peform a symantic action on success
6
- # by evaluating ruby code and succeed if the result is a false value.
7
- #
8
- # @author Jason Arhart
9
- #
10
- class SemanticDisallow < DirectAction
11
-
12
- protected
13
-
14
- def create_bindable_code
15
- DisallowCode.new(code)
16
- end
17
-
18
- end
19
- end
@@ -1,19 +0,0 @@
1
- require 'rattler/parsers'
2
-
3
- module Rattler::Parsers
4
- #
5
- # +SideEffect+ decorates a parser to peform a symantic action on success by
6
- # evaluating ruby code for effect and discarding the result.
7
- #
8
- # @author Jason Arhart
9
- #
10
- class SideEffect < DirectAction
11
-
12
- protected
13
-
14
- def create_bindable_code
15
- EffectCode.new(code)
16
- end
17
-
18
- end
19
- end
@@ -1,187 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
-
3
- shared_examples_for 'a compiled parser with an assert' do
4
- include CompilerSpecHelper
5
-
6
- subject { compiled_parser }
7
-
8
- let(:reference_parser) { combinator_parser grammar }
9
-
10
- context 'with a nested match rule' do
11
- let(:grammar) { define_grammar do
12
- rule(:word) { assert /\w+/ }
13
- end }
14
- it { should parse('abc123 ').succeeding.like reference_parser }
15
- it { should parse(' ').failing.like reference_parser }
16
- end
17
-
18
- context 'with a nested eof rule' do
19
- let(:grammar) { define_grammar do
20
- rule(:foo) { assert(eof) }
21
- end }
22
- it { should parse('').succeeding.like reference_parser }
23
- it { should parse('foo').from(3).succeeding.like reference_parser }
24
- it { should parse('foo').failing.like reference_parser }
25
- end
26
-
27
- context 'with a nested "E" symbol rule' do
28
- let(:grammar) { define_grammar do
29
- rule(:foo) { assert(e) }
30
- end }
31
- it { should parse('').succeeding.like reference_parser }
32
- it { should parse('foo').succeeding.like reference_parser }
33
- end
34
-
35
- context 'with a nested choice rule' do
36
- let(:grammar) { define_grammar do
37
- rule(:word) { assert(match(/[[:alpha:]]+/) | match(/[[:digit:]]+/)) }
38
- end }
39
- it { should parse('abc123 ').succeeding.like reference_parser }
40
- it { should parse(' ').failing.like reference_parser }
41
- end
42
-
43
- context 'with a nested sequence rule' do
44
- let(:grammar) { define_grammar do
45
- rule(:word) { assert(match(/[[:alpha:]]+/) & match(/[[:digit:]]+/)) }
46
- end }
47
- it { should parse('abc123 ').succeeding.like reference_parser }
48
- it { should parse(' ').failing.like reference_parser }
49
- end
50
-
51
- context 'with a nested optional rule' do
52
- let(:grammar) { define_grammar do
53
- rule(:word) { assert(optional(/\w+/)) }
54
- end }
55
- it { should parse('abc123 ').succeeding.like reference_parser }
56
- it { should parse(' ').succeeding.like reference_parser }
57
- end
58
-
59
- context 'with a nested zero-or-more rule' do
60
- let(:grammar) { define_grammar do
61
- rule(:word) { assert(zero_or_more(/\w/)) }
62
- end }
63
- it { should parse('abc123 ').succeeding.like reference_parser }
64
- it { should parse(' ').succeeding.like reference_parser }
65
- end
66
-
67
- context 'with a nested one-or-more rule' do
68
- let(:grammar) { define_grammar do
69
- rule(:word) { assert(one_or_more(/\w/)) }
70
- end }
71
- it { should parse('abc123 ').succeeding.like reference_parser }
72
- it { should parse(' ').failing.like reference_parser }
73
- end
74
-
75
- context 'with a nested repeat rule' do
76
- let(:grammar) { define_grammar do
77
- rule(:word) { assert(repeat(/\w/, 2, nil)) }
78
- end }
79
- it { should parse('abc123 ').succeeding.like reference_parser }
80
- it { should parse('a ').failing.like reference_parser }
81
-
82
- context 'with zero-or-more bounds' do
83
- let(:grammar) { define_grammar do
84
- rule(:word) { assert(repeat(/\w/, 0, nil)) }
85
- end }
86
- it { should parse('abc123 ').succeeding.like reference_parser }
87
- it { should parse(' ').succeeding.like reference_parser }
88
-
89
- context 'with an upper bound' do
90
- let(:grammar) { define_grammar do
91
- rule(:word) { assert(repeat(/\w/, 0, 2)) }
92
- end }
93
- it { should parse('abc123 ').succeeding.like reference_parser }
94
- it { should parse(' ').succeeding.like reference_parser }
95
- end
96
- end
97
-
98
- context 'with one-or-more bounds' do
99
- let(:grammar) { define_grammar do
100
- rule(:word) { assert(repeat(/\w/, 1, nil)) }
101
- end }
102
- it { should parse('abc123 ').succeeding.like reference_parser }
103
- it { should parse(' ').failing.like reference_parser }
104
-
105
- context 'with an upper bound' do
106
- let(:grammar) { define_grammar do
107
- rule(:word) { assert(repeat(/\w/, 1, 2)) }
108
- end }
109
- it { should parse('abc123 ').succeeding.like reference_parser }
110
- it { should parse(' ').failing.like reference_parser }
111
- end
112
- end
113
- end
114
-
115
- context 'with a nested list rule' do
116
- let(:grammar) { define_grammar do
117
- rule :foo do
118
- assert list(/\w+/, /[,;]/, 2, nil)
119
- end
120
- end }
121
- it { should parse('foo ').failing.like reference_parser }
122
- it { should parse('foo,bar;baz ').succeeding.like reference_parser }
123
-
124
- context 'with an upper bound' do
125
- let(:grammar) { define_grammar do
126
- rule :foo do
127
- assert list(/\w+/, /[,;]/, 2, 4)
128
- end
129
- end }
130
- it { should parse('foo ').failing.like reference_parser }
131
- it { should parse('foo,bar;baz ').succeeding.like reference_parser }
132
- end
133
-
134
- context 'with a non-capturing parser' do
135
- let(:grammar) { define_grammar do
136
- rule :foo do
137
- assert list(skip(/\w+/), /[,;]/, 2, nil)
138
- end
139
- end }
140
- it { should parse('foo ').failing.like reference_parser }
141
- it { should parse('foo,bar;baz ').succeeding.like reference_parser }
142
-
143
- context 'with an upper bound' do
144
- let(:grammar) { define_grammar do
145
- rule :foo do
146
- assert list(skip(/\w+/), /[,;]/, 2, 4)
147
- end
148
- end }
149
- it { should parse('foo ').failing.like reference_parser }
150
- it { should parse('foo,bar;baz ').succeeding.like reference_parser }
151
- end
152
- end
153
- end
154
-
155
- context 'with a nested apply rule' do
156
- let(:grammar) { define_grammar do
157
- rule(:foo) { match :word }
158
- rule(:word) { assert /\w+/ }
159
- end }
160
- it { should parse('abc123 ').succeeding.like reference_parser }
161
- it { should parse(' ').failing.like reference_parser }
162
- end
163
-
164
- context 'with a nested dispatch-action rule' do
165
- let(:grammar) { define_grammar do
166
- rule(:word) { assert(dispatch_action(/\w+/)) }
167
- end }
168
- it { should parse('abc123 ').succeeding.like reference_parser }
169
- it { should parse(' ').failing.like reference_parser }
170
- end
171
-
172
- context 'with a nested token rule' do
173
- let(:grammar) { define_grammar do
174
- rule(:word) { assert(token(match(/\w+/))) }
175
- end }
176
- it { should parse('abc123 ').succeeding.like reference_parser }
177
- it { should parse(' ').failing.like reference_parser }
178
- end
179
-
180
- context 'with a nested skip rule' do
181
- let(:grammar) { define_grammar do
182
- rule(:word) { assert(skip(/\w+/)) }
183
- end }
184
- it { should parse('abc123 ').succeeding.like reference_parser }
185
- it { should parse(' ').failing.like reference_parser }
186
- end
187
- end
@@ -1,43 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
- require File.expand_path(File.dirname(__FILE__) + '/shared_compiler_examples')
3
-
4
- describe Rattler::BackEnd::Compiler do
5
- include CompilerSpecHelper
6
-
7
- describe '.compile_parser result' do
8
-
9
- let :compiled_parser do
10
- described_class.compile_parser compiled_parser_base, grammar
11
- end
12
-
13
- let(:compiled_parser_base) { Rattler::Runtime::RecursiveDescentParser }
14
-
15
- it_behaves_like 'a compiled parser'
16
- end
17
-
18
- describe '.compile_parser' do
19
-
20
- context 'given parse rules' do
21
-
22
- let(:grammar) { define_grammar do
23
- rule(:word) { match /\w+/ }
24
- rule(:space) { match /\s*/ }
25
- end }
26
-
27
- let(:parser_base) { Rattler::Runtime::RecursiveDescentParser }
28
-
29
- let(:result) { described_class.compile_parser(parser_base, grammar) }
30
-
31
- it 'compiles a match_xxx method for each rule' do
32
- result.should have_method(:match_word)
33
- result.should have_method(:match_space)
34
- end
35
- end
36
-
37
- end
38
-
39
- def have_method(rule_name)
40
- be_method_defined(rule_name)
41
- end
42
-
43
- end
@@ -1,227 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
-
3
- shared_examples_for 'a compiled parser with a direct action' do
4
- include CompilerSpecHelper
5
-
6
- subject { compiled_parser }
7
-
8
- let(:reference_parser) { combinator_parser grammar }
9
-
10
- context 'with a nested match rule' do
11
- let(:grammar) { define_grammar do
12
- rule(:num) { direct_action(/\d+/, '|_| _.to_i') }
13
- end }
14
- it { should parse('451a').succeeding.like reference_parser }
15
- it { should parse(' ').failing.like reference_parser }
16
-
17
- context 'with a label' do
18
- let(:grammar) { define_grammar do
19
- rule(:digits) { direct_action(label(:num, /\d+/), 'num.to_i') }
20
- end }
21
- it { should parse('451a').succeeding.like reference_parser }
22
- it { should parse(' ').failing.like reference_parser }
23
- end
24
- end
25
-
26
- context 'with a nested apply rule' do
27
- let(:grammar) { define_grammar do
28
- rule(:foo) { direct_action :digit, '|_| _.to_i' }
29
- rule(:digit) { match(/\d/) }
30
- end }
31
- it { should parse('451 ').twice.succeeding.like reference_parser }
32
- it { should parse('hi').failing.like reference_parser }
33
-
34
- context 'with a label' do
35
- let(:grammar) { define_grammar do
36
- rule(:num) { direct_action(label(:num, :digits), 'num.to_i') }
37
- rule(:digits) { match(/\d+/) }
38
- end }
39
- it { should parse('451a').succeeding.like reference_parser }
40
- it { should parse(' ').failing.like reference_parser }
41
- end
42
- end
43
-
44
- context 'with a nested assert rule' do
45
- let(:grammar) { define_grammar do
46
- rule(:foo) { direct_action(assert(/\d/), ':digit') }
47
- end }
48
- it { should parse('451a').succeeding.like reference_parser }
49
- it { should parse(' ').failing.like reference_parser }
50
- end
51
-
52
- context 'with a nested disallow rule' do
53
- let(:grammar) { define_grammar do
54
- rule(:foo) { direct_action(disallow(/\d/), ':nondigit') }
55
- end }
56
- it { should parse(' ').succeeding.like reference_parser }
57
- it { should parse('451a').failing.like reference_parser }
58
- end
59
-
60
- context 'with a nested EOF rule' do
61
- let(:grammar) { define_grammar do
62
- rule(:foo) { direct_action(eof, ':eof') }
63
- end }
64
- it { should parse('foo').failing.like reference_parser }
65
- it { should parse('').succeeding.like reference_parser }
66
- it { should parse('foo').from(3).succeeding.like reference_parser }
67
- end
68
-
69
- context 'with a nested "E" symbol rule' do
70
- let(:grammar) { define_grammar do
71
- rule(:foo) { direct_action(e, ':e') }
72
- end }
73
- it { should parse('').succeeding.like reference_parser }
74
- it { should parse('foo').succeeding.like reference_parser }
75
- end
76
-
77
- context 'with a nested choice rule' do
78
- let(:grammar) { define_grammar do
79
- rule :foo do
80
- direct_action(
81
- match(/[[:alpha:]]+/) | match(/[[:digit:]]+/),
82
- '|_| _.size'
83
- )
84
- end
85
- end }
86
-
87
- it { should parse('abc123').succeeding.like reference_parser }
88
- it { should parse('451a').succeeding.like reference_parser }
89
- it { should parse(' ').failing.like reference_parser }
90
- end
91
-
92
- context 'with a nested sequence rule' do
93
- let(:grammar) { define_grammar do
94
- rule :assignment do
95
- direct_action(
96
- match(/[[:alpha:]]+/) & match('=') & match(/[[:digit:]]+/),
97
- '|l,_,r| "#{r} -> #{l}"'
98
- )
99
- end
100
- end }
101
-
102
- it { should parse('val=42 ').succeeding.like reference_parser }
103
- it { should parse('val=x').failing.like reference_parser }
104
-
105
- context 'with labels' do
106
- let(:grammar) { define_grammar do
107
- rule :assignment do
108
- direct_action(
109
- label(:name, /[[:alpha:]]+/) & match('=') & label(:value, /[[:digit:]]+/),
110
- '"#{value} -> #{name}"'
111
- )
112
- end
113
- end }
114
- it { should parse('val=42 ').succeeding.like reference_parser }
115
- end
116
- end
117
-
118
- context 'with a nested optional rule' do
119
- let(:grammar) { define_grammar do
120
- rule :foo do
121
- direct_action(optional(/\w+/), '|_| _.size')
122
- end
123
- end }
124
- it { should parse('foo ').succeeding.like reference_parser }
125
- it { should parse(' ').succeeding.like reference_parser }
126
- end
127
-
128
- context 'with a nested zero-or-more rule' do
129
- let(:grammar) { define_grammar do
130
- rule :foo do
131
- direct_action(zero_or_more(/\w/), '|_| _.size')
132
- end
133
- end }
134
- it { should parse('foo ').succeeding.like reference_parser }
135
- it { should parse(' ').succeeding.like reference_parser }
136
- end
137
-
138
- context 'with a nested one-or-more rule' do
139
- let(:grammar) { define_grammar do
140
- rule :foo do
141
- direct_action(one_or_more(/\w/), '|_| _.size')
142
- end
143
- end }
144
- it { should parse('foo ').succeeding.like reference_parser }
145
- it { should parse(' ').failing.like reference_parser }
146
- end
147
-
148
- context 'with a nested repeat rule' do
149
- let(:grammar) { define_grammar do
150
- rule :foo do
151
- direct_action(repeat(/\w/, 2, 4), '|_| _.size')
152
- end
153
- end }
154
- it { should parse('foo ').succeeding.like reference_parser }
155
- it { should parse('abcde ').succeeding.like reference_parser }
156
- it { should parse('a ').failing.like reference_parser }
157
-
158
- context 'with optional bounds' do
159
- let(:grammar) { define_grammar do
160
- rule :foo do
161
- direct_action(repeat(/\w+/, 0, 1), '|_| _.size')
162
- end
163
- end }
164
- it { should parse('foo ').succeeding.like reference_parser }
165
- it { should parse(' ').succeeding.like reference_parser }
166
- end
167
-
168
- context 'with zero-or-more bounds' do
169
- let(:grammar) { define_grammar do
170
- rule :foo do
171
- direct_action(repeat(/\w/, 0, nil), '|_| _.size')
172
- end
173
- end }
174
- it { should parse('foo ').succeeding.like reference_parser }
175
- it { should parse(' ').succeeding.like reference_parser }
176
- end
177
-
178
- context 'with one-or-more bounds' do
179
- let(:grammar) { define_grammar do
180
- rule :foo do
181
- direct_action(repeat(/\w/, 1, nil), '|_| _.size')
182
- end
183
- end }
184
- it { should parse('foo ').succeeding.like reference_parser }
185
- it { should parse(' ').failing.like reference_parser }
186
- end
187
- end
188
-
189
- context 'with a nested list rule' do
190
- let(:grammar) { define_grammar do
191
- rule :foo do
192
- direct_action(list(/\w+/, /,/, 1, nil), '|_| _.reduce(:+)')
193
- end
194
- end }
195
- it { should parse('a,bc,d ').succeeding.like reference_parser }
196
- it { should parse(' ').failing.like reference_parser }
197
- end
198
-
199
- context 'with a nested apply rule' do
200
- let(:grammar) { define_grammar do
201
- rule(:foo) { direct_action :digit, '|_| _.to_i' }
202
- rule(:digit) { match /\d/ }
203
- end }
204
- it { should parse('451a').succeeding.twice.like reference_parser }
205
- it { should parse(' ').failing.like reference_parser }
206
- end
207
-
208
- context 'with a nested token rule' do
209
- let(:grammar) { define_grammar do
210
- rule :foo do
211
- direct_action(token(/\w+/), '|_| _.size')
212
- end
213
- end }
214
- it { should parse('abc123').succeeding.like reference_parser }
215
- it { should parse(' ').failing.like reference_parser }
216
- end
217
-
218
- context 'with a nested skip rule' do
219
- let(:grammar) { define_grammar do
220
- rule :foo do
221
- direct_action(skip(/\w+/), '42' )
222
- end
223
- end }
224
- it { should parse('abc123').succeeding.like reference_parser }
225
- it { should parse(' ').failing.like reference_parser }
226
- end
227
- end