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,20 +0,0 @@
1
- Feature: Character Classes
2
-
3
- Character classes are sets of characters between "[" and "]" and mean match
4
- any single character in the set. They are identical to character classes in
5
- Ruby's regular expressions.
6
-
7
- Scenario Outline: Parsing
8
- Given a grammar with:
9
- """
10
- word_char <- [A-Za-z_]
11
- """
12
- When I parse <input>
13
- Then the parse result should be <result>
14
-
15
- Examples:
16
- | input | result |
17
- | "foo" | "f" |
18
- | "BAR" | "B" |
19
- | "_ba" | "_" |
20
- | "42" | FAIL |
@@ -1,24 +0,0 @@
1
- Feature: Nonterminals
2
-
3
- A nonterminal is an identifier that refers to a parse rule and means to parse
4
- according to the rule. Nonterminals can be used to define recursive rules.
5
-
6
- Scenario: Simple example
7
- Given a grammar with:
8
- """
9
- expr <- a* "b"
10
- a <- "a"
11
- """
12
- When I parse "aaab"
13
- Then the parse result should be [["a", "a", "a"], "b"]
14
-
15
- Scenario: Recursive definition
16
- Given a grammar with:
17
- """
18
- expr <- as "b"
19
- as <- "a" as
20
- / "a"
21
- """
22
- When I parse "aaab"
23
- Then the parse result should be [["a", ["a", "a"]], "b"]
24
-
@@ -1,34 +0,0 @@
1
- Feature: One-Or-More
2
-
3
- The "+" operator following an expression means to match one or more times,
4
- i.e. match repeatedly and succeed if input was matched at least once.
5
-
6
- Scenario Outline: Capturing Expression
7
- Given a grammar with:
8
- """
9
- digits <- DIGIT+
10
- """
11
- When I parse <input>
12
- Then the parse result should be <result>
13
- And the parse position should be <pos>
14
-
15
- Examples:
16
- | input | result | pos |
17
- | "5" | ["5"] | 1 |
18
- | "234" | ["2", "3", "4"] | 3 |
19
- | "foo" | FAIL | 0 |
20
-
21
- Scenario Outline: Non-Capturing Expression
22
- Given a grammar with:
23
- """
24
- dashes <- ~"-"+
25
- """
26
- When I parse <input>
27
- Then the parse result should be <result>
28
- And the parse position should be <pos>
29
-
30
- Examples:
31
- | input | result | pos |
32
- | "-" | true | 1 |
33
- | "---" | true | 3 |
34
- | "foo" | false | 0 |
@@ -1,21 +0,0 @@
1
- Feature: Ordered Choice Expressions
2
-
3
- An ordered choice expression is a series of sub-expressions separated by "/"
4
- and it means to try each sub-expression in order until one matches, and fail
5
- if none of the sub-expressions match.
6
-
7
- Scenario Outline: Parsing
8
- Given a grammar with:
9
- """
10
- expr <- "A" / "B"
11
- """
12
- When I parse <input>
13
- Then the parse result should be <result>
14
-
15
- Examples:
16
- | input | result |
17
- | "A" | "A" |
18
- | "AB" | "A" |
19
- | "B" | "B" |
20
- | "BA" | "B" |
21
- | "C" | FAIL |
@@ -1,70 +0,0 @@
1
- Feature: POSIX Character Classes
2
-
3
- The uppercase names of POSIX character classes can be used as a shortcut to
4
- using them in character class expressions, e.g. "DIGIT" and "[[:digit:]]" are
5
- equivalent.
6
-
7
- The POSIX character classes are:
8
- ALNUM - Alphanumeric characters
9
- ALPHA - Alphabetic characters
10
- ASCII - ASCII characters
11
- BLANK - Space and tab
12
- CNTRL - Control characters
13
- DIGIT - Digits
14
- GRAPH - Visible characters
15
- LOWER - Lowercase characters
16
- PRINT - Visible characters and spaces
17
- PUNCT - Punctuation characters
18
- SPACE - Whitespace characters
19
- UPPER - Uppercase characters
20
- XDIGIT - Hexadecimal digits
21
- WORD - Alphanumeric characters plus "_"
22
-
23
- Scenario: ALNUM
24
- Given a grammar with:
25
- """
26
- expr <- ALNUM+
27
- """
28
- When I parse "abc123"
29
- Then the parse result should be ["a", "b", "c", "1", "2", "3"]
30
-
31
- Scenario: ALPHA
32
- Given a grammar with:
33
- """
34
- expr <- ALPHA+
35
- """
36
- When I parse "abc123"
37
- Then the parse result should be ["a", "b", "c"]
38
-
39
- Scenario: BLANK
40
- Given a grammar with:
41
- """
42
- expr <- BLANK+
43
- """
44
- When I parse " abc"
45
- Then the parse result should be [" ", " ", " "]
46
-
47
- Scenario: DIGIT
48
- Given a grammar with:
49
- """
50
- expr <- DIGIT+
51
- """
52
- When I parse "123abc"
53
- Then the parse result should be ["1", "2", "3"]
54
-
55
- Scenario: LOWER
56
- Given a grammar with:
57
- """
58
- expr <- LOWER+
59
- """
60
- When I parse "abcDEF"
61
- Then the parse result should be ["a", "b", "c"]
62
-
63
- Scenario: UPPER
64
- Given a grammar with:
65
- """
66
- expr <- UPPER+
67
- """
68
- When I parse "ABCdef"
69
- Then the parse result should be ["A", "B", "C"]
70
-
@@ -1,20 +0,0 @@
1
- Feature: Sequence Expressions
2
-
3
- A sequence expression is a series of sub-expressions and it means to match
4
- all of the sub-expressions in sequence, otherwise fail and consume no input.
5
-
6
- Scenario Outline: Parsing
7
- Given a grammar with:
8
- """
9
- expr <- "A" "B"
10
- """
11
- When I parse <input>
12
- Then the parse result should be <result>
13
-
14
- Examples:
15
- | input | result |
16
- | "AB" | ["A", "B"] |
17
- | "ABC" | ["A", "B"] |
18
- | "ACB" | FAIL |
19
- | "A" | FAIL |
20
- | "C" | FAIL |
@@ -1,34 +0,0 @@
1
- Feature: Zero-Or-More
2
-
3
- The "*" operator following an expression means to match zero or more times,
4
- i.e. match repeatedly and succeed even if no input was matched.
5
-
6
- Scenario Outline: Capturing Expression
7
- Given a grammar with:
8
- """
9
- letters <- ALPHA*
10
- """
11
- When I parse <input>
12
- Then the parse result should be <result>
13
- And the parse position should be <pos>
14
-
15
- Examples:
16
- | input | result | pos |
17
- | "A" | ["A"] | 1 |
18
- | "foo" | ["f", "o", "o"] | 3 |
19
- | "234" | [] | 0 |
20
-
21
- Scenario Outline: Non-Capturing Expression
22
- Given a grammar with:
23
- """
24
- dashes <- ~"-"*
25
- """
26
- When I parse <input>
27
- Then the parse result should be <result>
28
- And the parse position should be <pos>
29
-
30
- Examples:
31
- | input | result | pos |
32
- | "-" | true | 1 |
33
- | "---" | true | 3 |
34
- | "foo" | true | 0 |
@@ -1,22 +0,0 @@
1
- #
2
- # = rattler/back_end.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
- require 'rattler'
8
-
9
- module Rattler
10
- #
11
- # The +BackEnd+ module contains the classes used to turn abstract parser
12
- # models into concrete ruby code.
13
- #
14
- # @author Jason Arhart
15
- #
16
- module BackEnd
17
- autoload :Compiler, 'rattler/back_end/compiler'
18
- autoload :ParserGenerator, 'rattler/back_end/parser_generator'
19
- autoload :RubyGenerator, 'rattler/back_end/ruby_generator'
20
- autoload :Optimizer, 'rattler/back_end/optimizer'
21
- end
22
- end
@@ -1,128 +0,0 @@
1
- #
2
- # = rattler/back_end/compiler.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
- require 'rattler/back_end'
8
-
9
- module Rattler::BackEnd
10
- #
11
- # The +Compiler+ compiles parser models into parser classes and methods.
12
- #
13
- # @author Jason Arhart
14
- #
15
- class Compiler
16
-
17
- include Rattler::Grammar
18
- include Rattler::Parsers
19
-
20
- # Compile rules or grammar source into a new parser subclass of +base+.
21
- #
22
- # @overload compile_parser(base, rules)
23
- # Compile +rules+ into a new parser subclass of +base+.
24
- # @param [Class] base the base class for the new parser class
25
- # @param [Rattler::Parser::RuleSet] rules the rules to compile
26
- # @return [Class] a new parser class
27
- #
28
- # @overload compile_parser(base, rule)
29
- # Compile +rule+ into a new parser subclass of +base+.
30
- # @param [Class] base the base class for the new parser class
31
- # @param [Rattler::Parser::Rule] rule the rule to compile
32
- # @return [Class] a new parser class
33
- #
34
- # @overload compile_parser(base, grammar)
35
- # Compile +grammar+ into a new parser subclass of +base+.
36
- # @param [Class] base the base class for the new parser class
37
- # @param [String] grammar the grammar source to compile
38
- # @return [Class] a new parser class
39
- #
40
- def self.compile_parser(base, rules_or_grammar)
41
- parser_class = Class.new(base)
42
- compile(parser_class, rules_or_grammar)
43
- end
44
-
45
- # Compile rules or grammar source into match methods in the module +mod+.
46
- def self.compile(mod, rules_or_grammar)
47
- self.new(mod).compile(rules_or_grammar)
48
- end
49
-
50
- # Compile +rules+ into match methods in the module +mod+.
51
- def self.compile_rules(mod, rules)
52
- self.new(mod).compile_rules(rules)
53
- end
54
-
55
- # Compile grammar +source+ into a match method in the module +mod+.
56
- def compile_grammar(mod, source)
57
- self.new(mod).compiler_grammar(source)
58
- end
59
-
60
- # Create a new compiler that compiles rules into match methods in the
61
- # given module.
62
- def initialize(mod)
63
- @mod = mod
64
- end
65
-
66
- # Compile the rules or grammar source into match methods in the module.
67
- #
68
- # @overload compile(rules)
69
- # Compile +rules+ into match methods in the module.
70
- # @param [Rattler::Parser::RuleSet] rules the rules to compile
71
- # @return [Module] the module
72
- #
73
- # @overload compile(rule)
74
- # Compile +rule+ into match methods in the module.
75
- # @param [Rattler::Parser::Rule] rule the rule to compile
76
- # @return [Module] the module
77
- #
78
- # @overload compile(grammar)
79
- # Compile +grammar+ into match methods in the module.
80
- # @param [String] grammar the grammar source to compile
81
- # @return [Module] the module
82
- #
83
- def compile(_)
84
- case _
85
- when Grammar, RuleSet, Rule then compile_rules(_)
86
- else compile_grammar(_.to_s)
87
- end
88
- end
89
-
90
- # Compile +rules+ into match methods in the module.
91
- #
92
- # @overload compile_rules(rules)
93
- # Compile +rules+ into match methods in the module.
94
- # @param [Rattler::Parser::RuleSet] rules the rules to compile
95
- # @return [Module] the module
96
- #
97
- # @overload compile_rules(rule)
98
- # Compile +rule+ into match methods in the module.
99
- # @param [Rattler::Parser::Rule] rule the rule to compile
100
- # @return [Module] the module
101
- #
102
- def compile_rules(rules)
103
- compile_model(rules)
104
- end
105
-
106
- # Compile +grammar+ into match methods in the module.
107
- # @param [String] grammar the grammar source to compile
108
- # @return [Module] the module
109
- def compile_grammar(source)
110
- result = Rattler::Grammar.parse!(source)
111
- compile_model(result.rules)
112
- end
113
-
114
- private
115
-
116
- def assert_kind_of(kinds, model) #:nodoc:
117
- unless kinds.any? {|kind| model.kind_of?(kind) }
118
- raise TypeError, "Expected #{model.inspect} to be a kind of #{klass}", caller
119
- end
120
- end
121
-
122
- def compile_model(model) #:nodoc:
123
- @mod.module_eval ParserGenerator.code_for(model)
124
- @mod
125
- end
126
-
127
- end
128
- end
@@ -1,101 +0,0 @@
1
- #
2
- # = rattler/back_end/optimizer.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
- require 'rattler'
8
-
9
- module Rattler::BackEnd
10
- #
11
- # The +Optimizer+ transforms parser models into equivalent models that can
12
- # result in more efficient parsing code. This is primarily achieved by
13
- # converting regular expressions into equivalent Regexp patterns, thus
14
- # reducing object instantiation and method dispatch and having StringScanner
15
- # do as much of the parsing work as possible.
16
- #
17
- # @author Jason Arhart
18
- #
19
- module Optimizer
20
-
21
- class << self
22
- def optimizations
23
- @optimizations ||=
24
- OptimizeChildren >>
25
- InlineRegularRules >>
26
- SimplifyRedundantRepeat >>
27
- RemoveMeaninglessWrapper >>
28
- SimplifyTokenMatch >>
29
- FlattenSequence >>
30
- FlattenChoice >>
31
- ReduceRepeatMatch >>
32
- JoinPredicateMatch >>
33
- JoinPredicateOrMatch >>
34
- JoinMatchSequence >>
35
- JoinMatchChoice
36
- end
37
-
38
- def optimize(model, opts={})
39
- case model
40
- when ::Rattler::Grammar::Grammar then optimize_grammar model, opts
41
- when ::Rattler::Parsers::RuleSet then optimize_rule_set model, opts
42
- when ::Rattler::Parsers::Rule then optimize_rule model, default_context(opts)
43
- else optimize_expr model, default_context(opts)
44
- end
45
- end
46
-
47
- private
48
-
49
- def default_context(opts)
50
- OptimizationContext[opts.merge :type => :capturing]
51
- end
52
-
53
- def optimize_grammar(grammar, opts)
54
- grammar.with_rules optimize_rule_set(grammar.rules, opts)
55
- end
56
-
57
- def optimize_rule_set(rule_set, opts)
58
- context = default_context(opts).with(:rules => rule_set)
59
- rule_set = rule_set.map_rules {|_| optimize_rule _, context }
60
- context = context.with(:rules => rule_set)
61
- rule_set.select_rules {|_| context.relavent? _ }
62
- end
63
-
64
- def optimize_rule(rule, context)
65
- rule.with_expr optimizations.apply(rule.expr, context)
66
- end
67
-
68
- def optimize_expr(expr, context)
69
- optimizations.apply rule.expr, context
70
- end
71
-
72
- end
73
-
74
- autoload :OptimizationContext, 'rattler/back_end/optimizer/optimization_context'
75
- autoload :Optimization, 'rattler/back_end/optimizer/optimization'
76
- autoload :OptimizationSequence, 'rattler/back_end/optimizer/optimization_sequence'
77
- autoload :OptimizeChildren, 'rattler/back_end/optimizer/optimize_children'
78
- autoload :InlineRegularRules, 'rattler/back_end/optimizer/inline_regular_rules'
79
- autoload :SpecializeRepeat, 'rattler/back_end/optimizer/specialize_repeat'
80
- autoload :SimplifyRedundantRepeat, 'rattler/back_end/optimizer/simplify_redundant_repeat'
81
- autoload :RemoveMeaninglessWrapper, 'rattler/back_end/optimizer/remove_meaningless_wrapper'
82
- autoload :SimplifyTokenMatch, 'rattler/back_end/optimizer/simplify_token_match'
83
- autoload :FlattenSequence, 'rattler/back_end/optimizer/flatten_sequence'
84
- autoload :FlattenChoice, 'rattler/back_end/optimizer/flatten_choice'
85
- autoload :ReduceRepeatMatch, 'rattler/back_end/optimizer/reduce_repeat_match'
86
- autoload :JoinPredicateMatch, 'rattler/back_end/optimizer/join_predicate_match'
87
- autoload :JoinPredicateBareMatch, 'rattler/back_end/optimizer/join_predicate_bare_match'
88
- autoload :JoinPredicateNestedMatch, 'rattler/back_end/optimizer/join_predicate_nested_match'
89
- autoload :JoinPredicateOrMatch, 'rattler/back_end/optimizer/join_predicate_or_match'
90
- autoload :JoinPredicateOrBareMatch, 'rattler/back_end/optimizer/join_predicate_or_bare_match'
91
- autoload :JoinPredicateOrNestedMatch, 'rattler/back_end/optimizer/join_predicate_or_nested_match'
92
- autoload :JoinMatchSequence, 'rattler/back_end/optimizer/join_match_sequence'
93
- autoload :JoinMatchCapturingSequence, 'rattler/back_end/optimizer/join_match_capturing_sequence'
94
- autoload :JoinMatchMatchingSequence, 'rattler/back_end/optimizer/join_match_matching_sequence'
95
- autoload :JoinMatchChoice, 'rattler/back_end/optimizer/join_match_choice'
96
- autoload :MatchJoining, 'rattler/back_end/optimizer/match_joining'
97
- autoload :Flattening, 'rattler/back_end/optimizer/flattening'
98
- autoload :CompositeReducing, 'rattler/back_end/optimizer/composite_reducing'
99
-
100
- end
101
- end