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,46 +0,0 @@
1
- #
2
- # = rattler/back_end/optimizer/inline_regular_rules.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
- require 'rattler'
8
-
9
- module Rattler::BackEnd::Optimizer
10
- #
11
- # References to regular parse rules can be inlined without affecting how they
12
- # parse, assuming the referenced rule does not change. This optimization is
13
- # only applied if the referenced rule is explicitly marked for inlining or
14
- # the :standalone option is used.
15
- #
16
- # @author Jason Arhart
17
- #
18
- class InlineRegularRules < Optimization
19
-
20
- include Rattler::Parsers
21
-
22
- protected
23
-
24
- def _applies_to?(parser, context)
25
- parser.is_a? Apply and
26
- inlineable? parser.rule_name, context
27
- end
28
-
29
- def _apply(parser, context)
30
- optimize context.rules[parser.rule_name].expr, context
31
- end
32
-
33
- private
34
-
35
- def inlineable?(rule_name, context)
36
- inline_allowed? rule_name, context and
37
- context.analysis.regular? rule_name
38
- end
39
-
40
- def inline_allowed?(rule_name, context)
41
- context.standalone? or
42
- context.rules[rule_name].attrs[:inline]
43
- end
44
-
45
- end
46
- end
@@ -1,17 +0,0 @@
1
- #
2
- # = rattler/back_end/optimizer/join_match_sequence.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
- require 'rattler/back_end/optimizer'
8
-
9
- module Rattler::BackEnd::Optimizer
10
- #
11
- # Sequences of Regexp matches can be joined into a single Regexp match using
12
- # capturing groups if necessary.
13
- #
14
- # @author Jason Arhart
15
- #
16
- JoinMatchSequence = JoinMatchMatchingSequence >> JoinMatchCapturingSequence
17
- end
@@ -1,17 +0,0 @@
1
- #
2
- # = rattler/back_end/optimizer/join_predicate_match.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
- require 'rattler/back_end/optimizer'
8
-
9
- module Rattler::BackEnd::Optimizer
10
- #
11
- # A predicate and an adjacent Regexp match in a Sequence can be joined into a
12
- # single Regexp match.
13
- #
14
- # @author Jason Arhart
15
- #
16
- JoinPredicateMatch = JoinPredicateBareMatch >> JoinPredicateNestedMatch
17
- end
@@ -1,17 +0,0 @@
1
- #
2
- # = rattler/back_end/optimizer/join_predicate_or_match.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
- require 'rattler/back_end/optimizer'
8
-
9
- module Rattler::BackEnd::Optimizer
10
- #
11
- # A predicate and an adjacent Regexp match in a Choice can be joined into a
12
- # single Regexp match.
13
- #
14
- # @author Jason Arhart
15
- #
16
- JoinPredicateOrMatch = JoinPredicateOrBareMatch >> JoinPredicateOrNestedMatch
17
- end
@@ -1,72 +0,0 @@
1
- #
2
- # = rattler/back_end/optimizer/optimization_context.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
- require 'rattler/back_end/optimizer'
8
-
9
- module Rattler::BackEnd::Optimizer
10
- #
11
- # +OptimizationContext+ provides contextual information to optimzations.
12
- #
13
- # @author Jason Arhart
14
- #
15
- class OptimizationContext
16
-
17
- @@cache = Hash.new {|h, attrs| h[attrs] = self.new(attrs) }
18
-
19
- def self.[](attrs)
20
- @@cache[attrs]
21
- end
22
-
23
- def initialize(attrs)
24
- @attrs = attrs
25
- @rules = @attrs[:rules]
26
- end
27
-
28
- attr_reader :type, :rules
29
-
30
- def start_rule
31
- rules && rules.start_rule
32
- end
33
-
34
- def analysis
35
- rules && rules.analysis
36
- end
37
-
38
- def capturing?
39
- @attrs[:type] == :capturing
40
- end
41
-
42
- def matching?
43
- @attrs[:type] == :matching
44
- end
45
-
46
- def standalone?
47
- start_rule && @attrs[:standalone]
48
- end
49
-
50
- def relavent?(rule)
51
- (not standalone? and not rule.attrs[:inline]) or
52
- analysis.referenced?(rule.name)
53
- end
54
-
55
- def with(new_attrs)
56
- self.class[@attrs.merge new_attrs]
57
- end
58
-
59
- def method_missing(symbol, *args)
60
- if args.empty? and @attrs.has_key? symbol
61
- @attrs[symbol]
62
- else
63
- super
64
- end
65
- end
66
-
67
- def respond_to?(symbol)
68
- super or @attrs.has_key? symbol
69
- end
70
-
71
- end
72
- end
@@ -1,32 +0,0 @@
1
- #
2
- # = rattler/back_end/optimizer/remove_meaningless_wrapper.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
- require 'rattler'
8
-
9
- module Rattler::BackEnd::Optimizer
10
- #
11
- # Token, skip, and symantic action wrappers only have meaning in a capturing
12
- # context.
13
- #
14
- # @author Jason Arhart
15
- #
16
- class RemoveMeaninglessWrapper < Optimization
17
-
18
- include Rattler::Parsers
19
-
20
- protected
21
-
22
- def _applies_to?(parser, context)
23
- context.matching? and
24
- [Token, Skip, DispatchAction, DirectAction].any? {|_| parser.is_a? _ }
25
- end
26
-
27
- def _apply(parser, context)
28
- parser.child
29
- end
30
-
31
- end
32
- end
@@ -1,40 +0,0 @@
1
- #
2
- # = rattler/back_end/optimizer/normalize_repeat.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
- require 'rattler'
8
-
9
- module Rattler::BackEnd::Optimizer
10
- #
11
- # A Repeat with bounds equivalent to optional, zero-or-more, or one-or-more
12
- # can be replaced by an Optional, a ZeroOrMore, or a OneOrMore, respectively.
13
- #
14
- # @author Jason Arhart
15
- #
16
- class SpecializeRepeat < Optimization
17
-
18
- include Rattler::Parsers
19
-
20
- protected
21
-
22
- def _applies_to?(parser, context)
23
- parser.is_a? Repeat and
24
- ( parser.optional? or
25
- parser.zero_or_more? or
26
- parser.one_or_more? )
27
- end
28
-
29
- def _apply(parser, context)
30
- if parser.optional?
31
- Optional[parser.child]
32
- elsif parser.zero_or_more?
33
- ZeroOrMore[parser.child]
34
- elsif parser.one_or_more?
35
- OneOrMore[parser.child]
36
- end
37
- end
38
-
39
- end
40
- end
@@ -1,113 +0,0 @@
1
- #
2
- # = rattler/back_end/parser_generator.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
- require 'rattler/back_end'
8
-
9
- module Rattler::BackEnd
10
- #
11
- # A +ParserGenerator+ generates ruby parsing code from parser models.
12
- #
13
- # @author Jason Arhart
14
- #
15
- module ParserGenerator
16
-
17
- autoload :RuleSetGenerator, 'rattler/back_end/parser_generator/rule_set_generator'
18
- autoload :RuleGenerator, 'rattler/back_end/parser_generator/rule_generator'
19
- autoload :ExprGenerator, 'rattler/back_end/parser_generator/expr_generator'
20
- autoload :GeneratorHelper, 'rattler/back_end/parser_generator/generator_helper'
21
- autoload :TopLevelGenerator, 'rattler/back_end/parser_generator/expr_generator'
22
- autoload :SubGenerating, 'rattler/back_end/parser_generator/sub_generating'
23
- autoload :NestedSubGenerating, 'rattler/back_end/parser_generator/sub_generating'
24
- autoload :TopLevelSubGenerating, 'rattler/back_end/parser_generator/sub_generating'
25
- autoload :Nested, 'rattler/back_end/parser_generator/nested'
26
- autoload :TopLevel, 'rattler/back_end/parser_generator/top_level'
27
- autoload :MatchGenerator, 'rattler/back_end/parser_generator/match_generator'
28
- autoload :ChoiceGenerator, 'rattler/back_end/parser_generator/choice_generator'
29
- autoload :SequenceGenerator, 'rattler/back_end/parser_generator/sequence_generator'
30
- autoload :RepeatGenerator, 'rattler/back_end/parser_generator/repeat_generator'
31
- autoload :GeneralRepeatGenerator, 'rattler/back_end/parser_generator/general_repeat_generator'
32
- autoload :ListGenerator, 'rattler/back_end/parser_generator/list_generator'
33
- autoload :GeneralListGenerator, 'rattler/back_end/parser_generator/general_list_generator'
34
- autoload :ApplyGenerator, 'rattler/back_end/parser_generator/apply_generator'
35
- autoload :AssertGenerator, 'rattler/back_end/parser_generator/assert_generator'
36
- autoload :DisallowGenerator, 'rattler/back_end/parser_generator/disallow_generator'
37
- autoload :EofGenerator, 'rattler/back_end/parser_generator/eof_generator'
38
- autoload :ESymbolGenerator, 'rattler/back_end/parser_generator/e_symbol_generator'
39
- autoload :DispatchActionGenerator, 'rattler/back_end/parser_generator/dispatch_action_generator'
40
- autoload :DirectActionGenerator, 'rattler/back_end/parser_generator/direct_action_generator'
41
- autoload :TokenGenerator, 'rattler/back_end/parser_generator/token_generator'
42
- autoload :SkipGenerator, 'rattler/back_end/parser_generator/skip_generator'
43
- autoload :LabelGenerator, 'rattler/back_end/parser_generator/label_generator'
44
- autoload :BackReferenceGenerator, 'rattler/back_end/parser_generator/back_reference_generator'
45
- autoload :FailGenerator, 'rattler/back_end/parser_generator/fail_generator'
46
- autoload :DelegatingGenerator, 'rattler/back_end/parser_generator/delegating_generator'
47
- autoload :ZeroOrMoreGenerating, 'rattler/back_end/parser_generator/zero_or_more_generating'
48
- autoload :OptionalGenerating, 'rattler/back_end/parser_generator/optional_generating'
49
- autoload :OneOrMoreGenerating, 'rattler/back_end/parser_generator/one_or_more_generating'
50
- autoload :List0Generating, 'rattler/back_end/parser_generator/list0_generating'
51
- autoload :List1Generating, 'rattler/back_end/parser_generator/list1_generating'
52
- autoload :PredicatePropogating, 'rattler/back_end/parser_generator/predicate_propogating'
53
- autoload :TokenPropogating, 'rattler/back_end/parser_generator/token_propogating'
54
- autoload :SkipPropogating, 'rattler/back_end/parser_generator/skip_propogating'
55
- autoload :GroupMatchGenerator, 'rattler/back_end/parser_generator/group_match_generator'
56
- autoload :GroupMatch, 'rattler/back_end/parser_generator/group_match'
57
- autoload :GEN_METHOD_NAMES, 'rattler/back_end/parser_generator/gen_method_names'
58
-
59
- # Generate parsing code for a parser model using a ruby generator +g+.
60
- #
61
- # @overload generate(g, grammar)
62
- # @param [RubyGenerator] g the ruby generator to use
63
- # @param [Rattler::Grammar::Grammar] grammar the grammar model
64
- # @return g
65
- #
66
- # @overload generate(g, rules)
67
- # @param [RubyGenerator] g the ruby generator to use
68
- # @param [Rules] rules the parse rules
69
- # @return g
70
- #
71
- # @overload generate(g, rule)
72
- # @param [RubyGenerator] g the ruby generator to use
73
- # @param [Rule] rule the parse rule
74
- # @return g
75
- #
76
- # @overload generate(g, parser)
77
- # @param [RubyGenerator] g the ruby generator to use
78
- # @param [Parser] parser the parser model
79
- # @return g
80
- #
81
- def self.generate(g, parser, opts={})
82
- unless opts[:no_optimize]
83
- parser = ::Rattler::BackEnd::Optimizer.optimize(parser, opts)
84
- end
85
- RuleSetGenerator.new(g).generate(parser, opts)
86
- g
87
- end
88
-
89
- # Generate parsing code for +parser+ using a new {RubyGenerator} with the
90
- # given options and return the generated code.
91
- #
92
- # @overload code_for(grammar, opts)
93
- # @param [Rattler::Grammar::Grammar] grammar the grammar model
94
- # @return [String] the generated code
95
- #
96
- # @overload code_for(rules, opts)
97
- # @param [Rules] rules the parse rules
98
- # @return [String] the generated code
99
- #
100
- # @overload code_for(rule, opts)
101
- # @param [Rule] rule the parse rule
102
- # @return [String] the generated code
103
- #
104
- # @overload code_for(parser, opts)
105
- # @param [Parser] parser the parser model
106
- # @return [String] the generated code
107
- #
108
- def self.code_for(parser, opts={})
109
- ::Rattler::BackEnd::RubyGenerator.code(opts) {|g| generate g, parser, opts }
110
- end
111
-
112
- end
113
- end
@@ -1,45 +0,0 @@
1
- require 'rattler/back_end/parser_generator'
2
-
3
- module Rattler::BackEnd::ParserGenerator
4
-
5
- # @private
6
- class DirectActionGenerator < ExprGenerator #:nodoc:
7
- include PredicatePropogating
8
- include TokenPropogating
9
- include SkipPropogating
10
-
11
- def gen_basic(action, scope={})
12
- generate action.child, :direct_action, action.bindable_code, scope
13
- end
14
-
15
- def gen_dispatch_action(inner, code, scope={})
16
- super { gen_nested inner, :basic, scope }
17
- end
18
-
19
- def gen_direct_action(inner, code, scope={})
20
- super { gen_nested inner, :basic, scope }
21
- end
22
-
23
- end
24
-
25
- # @private
26
- class NestedDirectActionGenerator < DirectActionGenerator #:nodoc:
27
- include Nested
28
- include NestedSubGenerating
29
- end
30
-
31
- def DirectActionGenerator.nested(*args)
32
- NestedDirectActionGenerator.new(*args)
33
- end
34
-
35
- # @private
36
- class TopLevelDirectActionGenerator < DirectActionGenerator #:nodoc:
37
- include TopLevel
38
- include TopLevelSubGenerating
39
- end
40
-
41
- def DirectActionGenerator.top_level(*args)
42
- TopLevelDirectActionGenerator.new(*args)
43
- end
44
-
45
- end
@@ -1,45 +0,0 @@
1
- require 'rattler/back_end/parser_generator'
2
-
3
- module Rattler::BackEnd::ParserGenerator
4
-
5
- # @private
6
- class DispatchActionGenerator < ExprGenerator #:nodoc:
7
- include PredicatePropogating
8
- include TokenPropogating
9
- include SkipPropogating
10
-
11
- def gen_basic(action, scope={})
12
- generate action.child, :dispatch_action, action.bindable_code, scope
13
- end
14
-
15
- def gen_dispatch_action(inner, code, scope={})
16
- super { gen_nested inner, :basic, scope }
17
- end
18
-
19
- def gen_direct_action(inner, code, scope={})
20
- super { gen_nested inner, :basic, scope }
21
- end
22
-
23
- end
24
-
25
- # @private
26
- class NestedDispatchActionGenerator < DispatchActionGenerator #:nodoc:
27
- include Nested
28
- include NestedSubGenerating
29
- end
30
-
31
- def DispatchActionGenerator.nested(*args)
32
- NestedDispatchActionGenerator.new(*args)
33
- end
34
-
35
- # @private
36
- class TopLevelDispatchActionGenerator < DispatchActionGenerator #:nodoc:
37
- include TopLevel
38
- include TopLevelSubGenerating
39
- end
40
-
41
- def DispatchActionGenerator.top_level(*args)
42
- TopLevelDispatchActionGenerator.new(*args)
43
- end
44
-
45
- end