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,152 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
-
3
- shared_examples_for 'a compiled parser with a positive semantic predicate' 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) { semantic_assert(/\d+/, '_.to_i > 200') }
13
- end }
14
- it { should parse('451a').succeeding.like reference_parser }
15
- it { should parse(' ').failing.like reference_parser }
16
- it { should parse('123a').failing.like reference_parser }
17
-
18
- context 'with a label' do
19
- let(:grammar) { define_grammar do
20
- rule(:digits) { semantic_assert(label(:num, /\d+/), 'num.to_i > 200') }
21
- end }
22
- it { should parse('451a').succeeding.like reference_parser }
23
- it { should parse(' ').failing.like reference_parser }
24
- it { should parse('123a').failing.like reference_parser }
25
- end
26
- end
27
-
28
- context 'with a nested apply rule' do
29
- let(:grammar) { define_grammar do
30
- rule(:foo) { semantic_assert :digit, '_.to_i > 200' }
31
- rule(:digit) { match(/\d+/) }
32
- end }
33
- it { should parse('451a').succeeding.like reference_parser }
34
- it { should parse(' ').failing.like reference_parser }
35
- it { should parse('123a').failing.like reference_parser }
36
-
37
- context 'with a label' do
38
- let(:grammar) { define_grammar do
39
- rule(:num) { semantic_assert(label(:num, :digits), 'num.to_i > 200') }
40
- rule(:digits) { match(/\d+/) }
41
- end }
42
- it { should parse('451a').succeeding.like reference_parser }
43
- it { should parse(' ').failing.like reference_parser }
44
- it { should parse('123a').failing.like reference_parser }
45
- end
46
- end
47
-
48
- context 'with a nested choice rule' do
49
- let(:grammar) { define_grammar do
50
- rule :foo do
51
- semantic_assert(
52
- match(/[[:alpha:]]+/) | match(/[[:digit:]]+/),
53
- '_.size > 2'
54
- )
55
- end
56
- end }
57
-
58
- it { should parse('abc123').succeeding.like reference_parser }
59
- it { should parse('12abc').failing.like reference_parser }
60
- it { should parse(' ').failing.like reference_parser }
61
- end
62
-
63
- context 'with a nested sequence rule' do
64
- let(:grammar) { define_grammar do
65
- rule :assignment do
66
- semantic_assert(
67
- match(/\w+/) & match('=') & match(/\w+/),
68
- '|l,_,r| l == r'
69
- )
70
- end
71
- end }
72
- it { should parse('451a=451a ').succeeding.like reference_parser }
73
- it { should parse('451a=123a ').failing.like reference_parser }
74
-
75
- context 'with labels' do
76
- let(:grammar) { define_grammar do
77
- rule :assignment do
78
- semantic_assert(
79
- label(:lt, /\w+/) & match('=') & label(:rt, /\w+/),
80
- 'lt == rt'
81
- )
82
- end
83
- end }
84
- it { should parse('451a=451a ').succeeding.like reference_parser }
85
- it { should parse('451a=123a ').failing.like reference_parser }
86
- end
87
- end
88
-
89
- context 'with a nested optional rule' do
90
- let(:grammar) { define_grammar do
91
- rule :foo do
92
- semantic_assert(optional(/\w+/), '|_| _.empty?')
93
- end
94
- end }
95
- it { should parse('foo ').failing.like reference_parser }
96
- it { should parse(' ').succeeding.like reference_parser }
97
- end
98
-
99
- context 'with a nested zero-or-more rule' do
100
- let(:grammar) { define_grammar do
101
- rule :foo do
102
- semantic_assert(zero_or_more(/\w/), '|_| _.size < 4')
103
- end
104
- end }
105
- it { should parse('foo ').succeeding.like reference_parser }
106
- it { should parse('food').failing.like reference_parser }
107
- it { should parse(' ').succeeding.like reference_parser }
108
- end
109
-
110
- context 'with a nested one-or-more rule' do
111
- let(:grammar) { define_grammar do
112
- rule :foo do
113
- semantic_assert(one_or_more(/\w/), '|_| _.size < 4')
114
- end
115
- end }
116
- it { should parse('foo ').succeeding.like reference_parser }
117
- it { should parse('food').failing.like reference_parser }
118
- it { should parse(' ').failing.like reference_parser }
119
- end
120
-
121
- context 'with a nested list rule' do
122
- let(:grammar) { define_grammar do
123
- rule :foo do
124
- semantic_assert(list(/\w+/, /,/, 1, nil), '|_| _.size < 4')
125
- end
126
- end }
127
- it { should parse('a,bc,d ').succeeding.like reference_parser }
128
- it { should parse('a,b,c,d').failing.like reference_parser }
129
- it { should parse(' ').failing.like reference_parser }
130
- end
131
-
132
- context 'with a nested apply rule' do
133
- let(:grammar) { define_grammar do
134
- rule(:foo) { semantic_assert :digit, '_.to_i > 200' }
135
- rule(:digit) { match /\d+/ }
136
- end }
137
- it { should parse('451a').succeeding.like reference_parser }
138
- it { should parse(' ').failing.like reference_parser }
139
- it { should parse('123a').failing.like reference_parser }
140
- end
141
-
142
- context 'with a nested token rule' do
143
- let(:grammar) { define_grammar do
144
- rule :foo do
145
- semantic_assert(token(/\w+/), '_.size > 5')
146
- end
147
- end }
148
- it { should parse('abc123').succeeding.like reference_parser }
149
- it { should parse(' ').failing.like reference_parser }
150
- it { should parse('abc12 ').failing.like reference_parser }
151
- end
152
- end
@@ -1,152 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
-
3
- shared_examples_for 'a compiled parser with a negative semantic predicate' 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) { semantic_disallow(/\d+/, '_.to_i > 200') }
13
- end }
14
- it { should parse('123a').succeeding.like reference_parser }
15
- it { should parse(' ').failing.like reference_parser }
16
- it { should parse('451a').failing.like reference_parser }
17
-
18
- context 'with a label' do
19
- let(:grammar) { define_grammar do
20
- rule(:digits) { semantic_disallow(label(:num, /\d+/), 'num.to_i > 200') }
21
- end }
22
- it { should parse('123a').succeeding.like reference_parser }
23
- it { should parse(' ').failing.like reference_parser }
24
- it { should parse('451a').failing.like reference_parser }
25
- end
26
- end
27
-
28
- context 'with a nested apply rule' do
29
- let(:grammar) { define_grammar do
30
- rule(:foo) { semantic_disallow :digit, '_.to_i > 200' }
31
- rule(:digit) { match(/\d+/) }
32
- end }
33
- it { should parse('123a').succeeding.like reference_parser }
34
- it { should parse(' ').failing.like reference_parser }
35
- it { should parse('451a').failing.like reference_parser }
36
-
37
- context 'with a label' do
38
- let(:grammar) { define_grammar do
39
- rule(:num) { semantic_disallow(label(:num, :digits), 'num.to_i > 200') }
40
- rule(:digits) { match(/\d+/) }
41
- end }
42
- it { should parse('123a').succeeding.like reference_parser }
43
- it { should parse(' ').failing.like reference_parser }
44
- it { should parse('451a').failing.like reference_parser }
45
- end
46
- end
47
-
48
- context 'with a nested choice rule' do
49
- let(:grammar) { define_grammar do
50
- rule :foo do
51
- semantic_disallow(
52
- match(/[[:alpha:]]+/) | match(/[[:digit:]]+/),
53
- '_.size > 2'
54
- )
55
- end
56
- end }
57
-
58
- it { should parse('12abc').succeeding.like reference_parser }
59
- it { should parse('abc123').failing.like reference_parser }
60
- it { should parse(' ').failing.like reference_parser }
61
- end
62
-
63
- context 'with a nested sequence rule' do
64
- let(:grammar) { define_grammar do
65
- rule :assignment do
66
- semantic_disallow(
67
- match(/\w+/) & match('=') & match(/\w+/),
68
- '|l,_,r| l == r'
69
- )
70
- end
71
- end }
72
- it { should parse('451a=123a ').succeeding.like reference_parser }
73
- it { should parse('451a=451a ').failing.like reference_parser }
74
-
75
- context 'with labels' do
76
- let(:grammar) { define_grammar do
77
- rule :assignment do
78
- semantic_disallow(
79
- label(:lt, /\w+/) & match('=') & label(:rt, /\w+/),
80
- 'lt == rt'
81
- )
82
- end
83
- end }
84
- it { should parse('451a=123a ').succeeding.like reference_parser }
85
- it { should parse('451a=451a ').failing.like reference_parser }
86
- end
87
- end
88
-
89
- context 'with a nested optional rule' do
90
- let(:grammar) { define_grammar do
91
- rule :foo do
92
- semantic_disallow(optional(/\w+/), '|_| _.empty?')
93
- end
94
- end }
95
- it { should parse(' ').failing.like reference_parser }
96
- it { should parse('foo ').succeeding.like reference_parser }
97
- end
98
-
99
- context 'with a nested zero-or-more rule' do
100
- let(:grammar) { define_grammar do
101
- rule :foo do
102
- semantic_disallow(zero_or_more(/\w/), '|_| _.size > 3')
103
- end
104
- end }
105
- it { should parse('foo ').succeeding.like reference_parser }
106
- it { should parse('food').failing.like reference_parser }
107
- it { should parse(' ').succeeding.like reference_parser }
108
- end
109
-
110
- context 'with a nested one-or-more rule' do
111
- let(:grammar) { define_grammar do
112
- rule :foo do
113
- semantic_disallow(one_or_more(/\w/), '|_| _.size > 3')
114
- end
115
- end }
116
- it { should parse('foo ').succeeding.like reference_parser }
117
- it { should parse('food').failing.like reference_parser }
118
- it { should parse(' ').failing.like reference_parser }
119
- end
120
-
121
- context 'with a nested list rule' do
122
- let(:grammar) { define_grammar do
123
- rule :foo do
124
- semantic_disallow(list(/\w+/, /,/, 1, nil), '|_| _.size > 3')
125
- end
126
- end }
127
- it { should parse('a,bc,d ').succeeding.like reference_parser }
128
- it { should parse('a,b,c,d').failing.like reference_parser }
129
- it { should parse(' ').failing.like reference_parser }
130
- end
131
-
132
- context 'with a nested apply rule' do
133
- let(:grammar) { define_grammar do
134
- rule(:foo) { semantic_disallow :digit, '_.to_i > 200' }
135
- rule(:digit) { match /\d+/ }
136
- end }
137
- it { should parse('123a').succeeding.like reference_parser }
138
- it { should parse(' ').failing.like reference_parser }
139
- it { should parse('451a').failing.like reference_parser }
140
- end
141
-
142
- context 'with a nested token rule' do
143
- let(:grammar) { define_grammar do
144
- rule :foo do
145
- semantic_disallow(token(/\w+/), '_.size > 5')
146
- end
147
- end }
148
- it { should parse('abc12 ').succeeding.like reference_parser }
149
- it { should parse(' ').failing.like reference_parser }
150
- it { should parse('abc123').failing.like reference_parser }
151
- end
152
- 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 side effect' 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) { side_effect(/\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) { side_effect(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) { side_effect :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) { side_effect(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) { side_effect(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) { side_effect(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) { side_effect(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) { side_effect(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
- side_effect(
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
- side_effect(
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
- side_effect(
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
- side_effect(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
- side_effect(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
- side_effect(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
- side_effect(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
- side_effect(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
- side_effect(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
- side_effect(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
- side_effect(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) { side_effect :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
- side_effect(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
- side_effect(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