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,187 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
-
3
- shared_examples_for 'a compiled parser with a disallow' 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) { disallow /\w+/ }
13
- end }
14
- it { should parse(' ').succeeding.like reference_parser }
15
- it { should parse('abc123 ').failing.like reference_parser }
16
- end
17
-
18
- context 'with a nested eof rule' do
19
- let(:grammar) { define_grammar do
20
- rule(:foo) { disallow(eof) }
21
- end }
22
- it { should parse('foo').succeeding.like reference_parser }
23
- it { should parse('').failing.like reference_parser }
24
- it { should parse('foo').from(3).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) { disallow(e) }
30
- end }
31
- it { should parse('').failing.like reference_parser }
32
- it { should parse('foo').failing.like reference_parser }
33
- end
34
-
35
- context 'with a nested choice rule' do
36
- let(:grammar) { define_grammar do
37
- rule(:word) { disallow(match(/[[:alpha:]]/) | match(/[[:digit:]]/)) }
38
- end }
39
- it { should parse(' ').succeeding.like reference_parser }
40
- it { should parse('abc123 ').failing.like reference_parser }
41
- end
42
-
43
- context 'with a nested sequence rule' do
44
- let(:grammar) { define_grammar do
45
- rule(:word) { disallow(match(/[[:alpha:]]+/) & match(/[[:digit:]]+/)) }
46
- end }
47
- it { should parse(' ').succeeding.like reference_parser }
48
- it { should parse('abc123 ').failing.like reference_parser }
49
- end
50
-
51
- context 'with a nested optional rule' do
52
- let(:grammar) { define_grammar do
53
- rule(:word) { disallow(optional(/\w+/)) }
54
- end }
55
- it { should parse(' ').failing.like reference_parser }
56
- it { should parse('abc123 ').failing.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) { disallow(zero_or_more(/\w/)) }
62
- end }
63
- it { should parse(' ').failing.like reference_parser }
64
- it { should parse('abc123 ').failing.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) { disallow(one_or_more(/\w/)) }
70
- end }
71
- it { should parse(' ').succeeding.like reference_parser }
72
- it { should parse('abc123 ').failing.like reference_parser }
73
- end
74
-
75
- context 'with a nested repeat rule' do
76
- let(:grammar) { define_grammar do
77
- rule(:word) { disallow(repeat(/\w/, 2, nil)) }
78
- end }
79
- it { should parse('a ').succeeding.like reference_parser }
80
- it { should parse('abc123 ').failing.like reference_parser }
81
-
82
- context 'with zero-or-more bounds' do
83
- let(:grammar) { define_grammar do
84
- rule(:word) { disallow(repeat(/\w/, 0, nil)) }
85
- end }
86
- it { should parse(' ').failing.like reference_parser }
87
- it { should parse('abc123 ').failing.like reference_parser }
88
-
89
- context 'with an upper bound' do
90
- let(:grammar) { define_grammar do
91
- rule(:word) { disallow(repeat(/\w/, 0, 2)) }
92
- end }
93
- it { should parse(' ').failing.like reference_parser }
94
- it { should parse('abc123 ').failing.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) { disallow(repeat(/\w/, 1, nil)) }
101
- end }
102
- it { should parse(' ').succeeding.like reference_parser }
103
- it { should parse('abc123 ').failing.like reference_parser }
104
-
105
- context 'with an upper bound' do
106
- let(:grammar) { define_grammar do
107
- rule(:word) { disallow(repeat(/\w/, 1, 2)) }
108
- end }
109
- it { should parse(' ').succeeding.like reference_parser }
110
- it { should parse('abc123 ').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
- disallow list(/\w+/, /[,;]/, 2, nil)
119
- end
120
- end }
121
- it { should parse('foo ').succeeding.like reference_parser }
122
- it { should parse('foo,bar;baz ').failing.like reference_parser }
123
-
124
- context 'with an upper bound' do
125
- let(:grammar) { define_grammar do
126
- rule :foo do
127
- disallow list(/\w+/, /[,;]/, 2, 4)
128
- end
129
- end }
130
- it { should parse('foo ').succeeding.like reference_parser }
131
- it { should parse('foo,bar;baz ').failing.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
- disallow list(skip(/\w+/), /[,;]/, 2, nil)
138
- end
139
- end }
140
- it { should parse('foo ').succeeding.like reference_parser }
141
- it { should parse('foo,bar;baz ').failing.like reference_parser }
142
-
143
- context 'with an upper bound' do
144
- let(:grammar) { define_grammar do
145
- rule :foo do
146
- disallow list(skip(/\w+/), /[,;]/, 2, 4)
147
- end
148
- end }
149
- it { should parse('foo ').succeeding.like reference_parser }
150
- it { should parse('foo,bar;baz ').failing.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) { disallow /\w+/ }
159
- end }
160
- it { should parse(' ').succeeding.like reference_parser }
161
- it { should parse('abc123 ').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) { disallow(dispatch_action(/\w+/)) }
167
- end }
168
- it { should parse(' ').succeeding.like reference_parser }
169
- it { should parse('abc123 ').failing.like reference_parser }
170
- end
171
-
172
- context 'with a nested token rule' do
173
- let(:grammar) { define_grammar do
174
- rule(:word) { disallow(token(match(/\w+/))) }
175
- end }
176
- it { should parse(' ').succeeding.like reference_parser }
177
- it { should parse('abc123 ').failing.like reference_parser }
178
- end
179
-
180
- context 'with a nested skip rule' do
181
- let(:grammar) { define_grammar do
182
- rule(:word) { disallow(skip(/\w+/)) }
183
- end }
184
- it { should parse(' ').succeeding.like reference_parser }
185
- it { should parse('abc123 ').failing.like reference_parser }
186
- end
187
- end
@@ -1,225 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
-
3
- shared_examples_for 'a compiled parser with a dispatch 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(:digits) { dispatch_action(/\d+/) }
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) { dispatch_action(label(:num, /\d+/)) }
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(:digit) { match(/\d/) }
29
- rule(:foo) { dispatch_action :digit }
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(:digits) { match(/\d+/) }
37
- rule(:num) { dispatch_action(label(:num, :digits)) }
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) { dispatch_action(assert(/\d/)) }
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) { dispatch_action(disallow(/\d/)) }
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) { dispatch_action(eof) }
63
- end }
64
- it { should parse('').succeeding.like reference_parser }
65
- it { should parse('foo').from(3).succeeding.like reference_parser }
66
- it { should parse('foo').failing.like reference_parser }
67
- end
68
-
69
- context 'with a nested "E" symbol rule' do
70
- let(:grammar) { define_grammar do
71
- rule(:foo) { dispatch_action(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 :atom do
80
- dispatch_action(match(/[[:alpha:]]+/) | match(/[[:digit:]]+/))
81
- end
82
- end }
83
-
84
- it { should parse('451a').succeeding.like reference_parser }
85
- it { should parse(' ').failing.like reference_parser }
86
- end
87
-
88
- context 'with a nested sequence rule' do
89
- let(:grammar) { define_grammar do
90
- rule :assignment do
91
- dispatch_action(
92
- match(/[[:alpha:]]+/) &
93
- match('=') &
94
- match(/[[:digit:]]+/)
95
- )
96
- end
97
- end }
98
-
99
- it { should parse('val=42 ').succeeding.like reference_parser }
100
- it { should parse('val=x').failing.like reference_parser }
101
-
102
- context 'with labels' do
103
- let(:grammar) { define_grammar do
104
- rule :assignment do
105
- dispatch_action(
106
- label(:name, /[[:alpha:]]+/) &
107
- match('=') &
108
- label(:value, /[[:digit:]]+/)
109
- )
110
- end
111
- end }
112
- it { should parse('val=42 ').succeeding.like reference_parser }
113
- end
114
- end
115
-
116
- context 'with a nested optional rule' do
117
- let(:grammar) { define_grammar do
118
- rule :foo do
119
- dispatch_action(optional(/\w+/))
120
- end
121
- end }
122
- it { should parse('foo ').succeeding.like reference_parser }
123
- it { should parse(' ').succeeding.like reference_parser }
124
- end
125
-
126
- context 'with a nested zero-or-more rule' do
127
- let(:grammar) { define_grammar do
128
- rule :foo do
129
- dispatch_action(zero_or_more(/\w/))
130
- end
131
- end }
132
- it { should parse('foo ').succeeding.like reference_parser }
133
- it { should parse(' ').succeeding.like reference_parser }
134
- end
135
-
136
- context 'with a nested one-or-more rule' do
137
- let(:grammar) { define_grammar do
138
- rule :foo do
139
- dispatch_action(one_or_more(/\w/))
140
- end
141
- end }
142
- it { should parse('foo ').succeeding.like reference_parser }
143
- it { should parse(' ').failing.like reference_parser }
144
- end
145
-
146
- context 'with a nested repeat rule' do
147
- let(:grammar) { define_grammar do
148
- rule :foo do
149
- dispatch_action(repeat(/\w/, 2, 4))
150
- end
151
- end }
152
- it { should parse('foo ').succeeding.like reference_parser }
153
- it { should parse('abcde ').succeeding.like reference_parser }
154
- it { should parse('a ').failing.like reference_parser }
155
-
156
- context 'with optional bounds' do
157
- let(:grammar) { define_grammar do
158
- rule :foo do
159
- dispatch_action(repeat(/\w+/, 0, 1))
160
- end
161
- end }
162
- it { should parse('foo ').succeeding.like reference_parser }
163
- it { should parse(' ').succeeding.like reference_parser }
164
- end
165
-
166
- context 'with zero-or-more bounds' do
167
- let(:grammar) { define_grammar do
168
- rule :foo do
169
- dispatch_action(repeat(/\w/, 0, nil))
170
- end
171
- end }
172
- it { should parse('foo ').succeeding.like reference_parser }
173
- it { should parse(' ').succeeding.like reference_parser }
174
- end
175
-
176
- context 'with one-or-more bounds' do
177
- let(:grammar) { define_grammar do
178
- rule :foo do
179
- dispatch_action(repeat(/\w/, 1, nil))
180
- end
181
- end }
182
- it { should parse('foo ').succeeding.like reference_parser }
183
- it { should parse(' ').failing.like reference_parser }
184
- end
185
- end
186
-
187
- context 'with a nested list rule' do
188
- let(:grammar) { define_grammar do
189
- rule :foo do
190
- dispatch_action(list(/\w+/, /,/, 1, nil))
191
- end
192
- end }
193
- it { should parse('a,bc,d ').succeeding.like reference_parser }
194
- it { should parse(' ').failing.like reference_parser }
195
- end
196
-
197
- context 'with a nested apply rule' do
198
- let(:grammar) { define_grammar do
199
- rule(:digit) { match /\d/ }
200
- rule(:foo) { dispatch_action :digit }
201
- end }
202
- it { should parse('451a').succeeding.twice.like reference_parser }
203
- it { should parse(' ').failing.like reference_parser }
204
- end
205
-
206
- context 'with a nested token rule' do
207
- let(:grammar) { define_grammar do
208
- rule :foo do
209
- dispatch_action(token(match(/\w+/)))
210
- end
211
- end }
212
- it { should parse('abc123').succeeding.like reference_parser }
213
- it { should parse(' ').failing.like reference_parser }
214
- end
215
-
216
- context 'with a nested skip rule' do
217
- let(:grammar) { define_grammar do
218
- rule :foo do
219
- dispatch_action(skip(/\w+/))
220
- end
221
- end }
222
- it { should parse('abc123').succeeding.like reference_parser }
223
- it { should parse(' ').failing.like reference_parser }
224
- end
225
- end
@@ -1,80 +0,0 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
-
3
- include Rattler::BackEnd::Optimizer
4
- include Rattler::Parsers
5
-
6
- describe InlineRegularRules do
7
-
8
- let(:standalone) { OptimizationContext[
9
- :type => :capturing,
10
- :rules => rule_set,
11
- :standalone => true
12
- ] }
13
-
14
- let(:modular) { OptimizationContext[
15
- :type => :capturing,
16
- :rules => rule_set
17
- ] }
18
-
19
- let(:rule_set) { RuleSet[rule_a, {:start_rule => :a}] }
20
-
21
- describe '#apply' do
22
-
23
- context 'given a reference to a regular rule' do
24
-
25
- let(:rule_a) { Rule[:a, Match[/a/]] }
26
-
27
- it 'inlines the regular rule' do
28
- subject.apply(Apply[:a], standalone).should == Match[/a/]
29
- end
30
- end
31
- end
32
-
33
- describe '#_applies_to?' do
34
-
35
- context 'with the :standalone option set' do
36
-
37
- context 'given a reference to a regular rule' do
38
-
39
- let(:rule_a) { Rule[:a, Match[/a/]] }
40
-
41
- it 'returns true' do
42
- subject.applies_to?(Apply[:a], standalone).should be_true
43
- end
44
- end
45
-
46
- context 'given a reference to a recursive rule' do
47
-
48
- let(:rule_a) { Rule[:a, Sequence[Match[/a/], Apply[:a]]] }
49
-
50
- it 'returns false' do
51
- subject.applies_to?(Apply[:a], standalone).should be_false
52
- end
53
- end
54
- end
55
-
56
- context 'without the :standalone option set' do
57
-
58
- context 'given a reference to a regular rule' do
59
-
60
- context 'tagged as :inline' do
61
-
62
- let(:rule_a) { Rule[:a, Match[/a/], {:inline => true}] }
63
-
64
- it 'returns true' do
65
- subject.applies_to?(Apply[:a], modular).should be_true
66
- end
67
- end
68
-
69
- context 'not tagged as :inline' do
70
-
71
- let(:rule_a) { Rule[:a, Match[/a/]] }
72
-
73
- it 'returns false' do
74
- subject.applies_to?(Apply[:a], modular).should be_false
75
- end
76
- end
77
- end
78
- end
79
- end
80
- end