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,26 +0,0 @@
1
- require 'rattler/back_end/parser_generator'
2
-
3
- module Rattler::BackEnd::ParserGenerator
4
- # @private
5
- class GroupMatch < Rattler::Parsers::Parser #:nodoc:
6
-
7
- alias_method :match, :child
8
-
9
- def re
10
- match.re
11
- end
12
-
13
- def capture_count
14
- num_groups
15
- end
16
-
17
- def parse(scanner, rules, scope={})
18
- scanner.scan(re) && if num_groups == 1
19
- scanner[1]
20
- else
21
- (1..num_groups).map {|_| scanner[_] }
22
- end
23
- end
24
-
25
- end
26
- end
@@ -1,64 +0,0 @@
1
- require 'rattler/back_end/parser_generator'
2
-
3
- module Rattler::BackEnd::ParserGenerator
4
-
5
- # @private
6
- class LabelGenerator < ExprGenerator #:nodoc:
7
- include PredicatePropogating
8
- include TokenPropogating
9
- include SkipPropogating
10
-
11
- def gen_basic(label, scope={})
12
- generate label.child, :basic, scope
13
- end
14
-
15
- def gen_dispatch_action(label, code, scope={})
16
- expr :block do
17
- scope = gen_capturing label.child, scope, label.label
18
- (@g << ' &&').newline << code.bind(scope, dispatch_action_args)
19
- end
20
- end
21
-
22
- def gen_direct_action(label, code, scope={})
23
- expr :block do
24
- scope = gen_capturing label.child, scope, label.label
25
- (@g << ' &&').newline
26
- @g.surround('(', ')') { @g << code.bind(scope, direct_action_args) }
27
- end
28
- end
29
-
30
- private
31
-
32
- def gen_capturing(child, scope, label)
33
- if child.capturing?
34
- gen_capture { gen_nested child, :basic, scope }
35
- scope.merge(label => result_name)
36
- else
37
- generate child, :intermediate, scope
38
- scope
39
- end
40
- end
41
-
42
- end
43
-
44
- # @private
45
- class NestedLabelGenerator < LabelGenerator #:nodoc:
46
- include Nested
47
- include NestedSubGenerating
48
- end
49
-
50
- def LabelGenerator.nested(*args)
51
- NestedLabelGenerator.new(*args)
52
- end
53
-
54
- # @private
55
- class TopLevelLabelGenerator < LabelGenerator #:nodoc:
56
- include TopLevel
57
- include TopLevelSubGenerating
58
- end
59
-
60
- def LabelGenerator.top_level(*args)
61
- TopLevelLabelGenerator.new(*args)
62
- end
63
-
64
- end
@@ -1,24 +0,0 @@
1
- require 'rattler/back_end/parser_generator'
2
-
3
- module Rattler::BackEnd::ParserGenerator
4
- # @private
5
- module PredicatePropogating #:nodoc:
6
-
7
- def gen_assert(parser, scope={})
8
- propogate_gen parser.child, :assert, scope
9
- end
10
-
11
- def gen_disallow(parser, scope={})
12
- propogate_gen parser.child, :disallow, scope
13
- end
14
-
15
- def gen_intermediate_assert(parser, scope={})
16
- propogate_gen parser.child, :intermediate_assert, scope
17
- end
18
-
19
- def gen_intermediate_disallow(parser, scope={})
20
- propogate_gen parser.child, :intermediate_disallow, scope
21
- end
22
-
23
- end
24
- end
@@ -1,53 +0,0 @@
1
- require 'rattler/back_end/parser_generator'
2
-
3
- module Rattler::BackEnd::ParserGenerator
4
- # @private
5
- class RuleGenerator #:nodoc:
6
-
7
- Grammar = Rattler::Grammar::Grammar
8
- include Rattler::Parsers
9
-
10
- def initialize(g)
11
- @g = g
12
- @top_level_generator = TopLevelGenerator.new(@g)
13
- end
14
-
15
- def generate(parser, opts={})
16
- case parser
17
- when Rule then gen_rule_modular parser
18
- else @top_level_generator.generate parser
19
- end
20
- self
21
- end
22
-
23
- def gen_rule_standalone(rule, rule_set)
24
- if rule_set.analysis.left_recursive? rule.name
25
- gen_rule_hook rule, 'memoize_lr'
26
- elsif rule_set.analysis.recursive? rule.name
27
- gen_rule_hook rule, 'memoize'
28
- else
29
- gen_rule_method rule, "match_#{rule.name}"
30
- end
31
- end
32
-
33
- def gen_rule_modular(rule)
34
- gen_rule_hook rule, 'apply'
35
- end
36
-
37
- private
38
-
39
- def gen_rule_hook(rule, hook_name)
40
- (@g << "# @private").newline
41
- @g.block("def match_#{rule.name} #:nodoc:") do
42
- @g << "#{hook_name} :match_#{rule.name}!"
43
- end.newline.newline
44
- gen_rule_method rule, "match_#{rule.name}!"
45
- end
46
-
47
- def gen_rule_method(rule, method_name)
48
- (@g << "# @private").newline
49
- @g.block("def #{method_name} #:nodoc:") { generate rule.child }
50
- end
51
-
52
- end
53
- end
@@ -1,190 +0,0 @@
1
- require 'rattler/back_end/parser_generator'
2
-
3
- module Rattler::BackEnd::ParserGenerator
4
-
5
- # @private
6
- class SequenceGenerator < ExprGenerator #:nodoc:
7
- include NestedSubGenerating
8
-
9
- include Rattler::Parsers
10
-
11
- def initialize(*args)
12
- super
13
- @capture_names = []
14
- end
15
-
16
- def gen_basic(sequence, scope={})
17
- with_backtracking do
18
- if sequence.capture_count == 1 and sequence.children.last.capturing?
19
- @g.intersperse_nl(sequence, ' &&') do |child|
20
- scope = gen_capturing(child, scope) { gen_nested child, :basic, scope }
21
- end
22
- else
23
- sequence.each do |child|
24
- @g.suffix(' &&') { scope = gen_capturing child, scope }.newline
25
- end
26
- @g << result_expr(sequence)
27
- end
28
- end
29
- end
30
-
31
- def gen_assert(sequence, scope={})
32
- expr :block do
33
- lookahead do
34
- @g.block("#{result_name} = begin") do
35
- sequence.each do |_|
36
- @g.suffix(' &&') { scope = gen_matching _, scope }.newline
37
- end
38
- @g << "true"
39
- end
40
- @g.newline
41
- end
42
- @g << result_name
43
- end
44
- end
45
-
46
- def gen_disallow(sequence, scope={})
47
- expr :block do
48
- lookahead do
49
- @g.block("#{result_name} = !begin") do
50
- @g.intersperse_nl(sequence, ' &&') do |_|
51
- scope = gen_matching _, scope
52
- end
53
- end
54
- @g.newline
55
- end
56
- @g << result_name
57
- end
58
- end
59
-
60
- def gen_dispatch_action(sequence, code, scope={})
61
- gen_action_code(sequence, scope) do |new_scope|
62
- code.bind new_scope, result_array_expr(sequence)
63
- end
64
- end
65
-
66
- def gen_direct_action(sequence, code, scope={})
67
- gen_action_code(sequence, scope) do |new_scope|
68
- "(#{code.bind new_scope, @capture_names})"
69
- end
70
- end
71
-
72
- def gen_token(sequence, scope={})
73
- with_backtracking do
74
- sequence.each do |_|
75
- @g.suffix(' &&') { scope = gen_matching _, scope }.newline
76
- end
77
- @g << "@scanner.string[#{saved_pos_name}...(@scanner.pos)]"
78
- end
79
- end
80
-
81
- def gen_skip(sequence, scope={})
82
- with_backtracking do
83
- sequence.each do |_|
84
- @g.suffix(' &&') { scope = gen_matching _, scope }.newline
85
- end
86
- @g << "true"
87
- end
88
- end
89
-
90
- private
91
-
92
- def gen_matching(child, scope)
93
- if child.labeled?
94
- @g.surround("(#{capture_name} = ", ')') { gen_nested child, :basic, scope }
95
- else
96
- gen_nested child, :intermediate_skip, scope
97
- end
98
- child.labeled? ? scope.merge(child.label => last_capture_name) : scope
99
- end
100
-
101
- def gen_capturing(child, scope)
102
- if child.capturing?
103
- if block_given?
104
- yield
105
- else
106
- @g.surround("(#{capture_name} = ", ')') { gen_nested child, :basic, scope }
107
- end
108
- else
109
- gen_nested child, :intermediate, scope
110
- end
111
- child.labeled? ? scope.merge(child.label => last_capture_name) : scope
112
- end
113
-
114
- def with_backtracking
115
- expr :block do
116
- (@g << "#{saved_pos_name} = @scanner.pos").newline
117
- @g.block 'begin' do
118
- yield
119
- end
120
- @g.block ' || begin' do
121
- (@g << "@scanner.pos = #{saved_pos_name}").newline << 'false'
122
- end
123
- end
124
- end
125
-
126
- def result_expr(sequence)
127
- case @capture_names.size
128
- when 0 then 'true'
129
- when 1 then @capture_names[0]
130
- else result_array_expr(sequence)
131
- end
132
- end
133
-
134
- def result_array_expr(sequence)
135
- if sequence.any? {|_| Apply === _ }
136
- "select_captures(#{capture_names_expr})"
137
- else
138
- capture_names_expr
139
- end
140
- end
141
-
142
- def gen_action_code(sequence, scope={})
143
- with_backtracking do
144
- for child in sequence
145
- @g.suffix(' &&') { scope = gen_capturing child, scope }.newline
146
- end
147
- @g << yield(scope)
148
- end
149
- end
150
-
151
- def capture_names_expr
152
- '[' + @capture_names.join(', ') + ']'
153
- end
154
-
155
- def capture_name
156
- @capture_names << "r#{sequence_level}_#{@capture_names.size}"
157
- @capture_names.last
158
- end
159
-
160
- def last_capture_name
161
- @capture_names.last
162
- end
163
-
164
- attr_reader :capture_names
165
-
166
- def saved_pos_name
167
- "p#{sequence_level}"
168
- end
169
-
170
- end
171
-
172
- # @private
173
- class NestedSequenceGenerator < SequenceGenerator #:nodoc:
174
- include Nested
175
- end
176
-
177
- def SequenceGenerator.nested(*args)
178
- NestedSequenceGenerator.new(*args)
179
- end
180
-
181
- # @private
182
- class TopLevelSequenceGenerator < SequenceGenerator #:nodoc:
183
- include TopLevel
184
- end
185
-
186
- def SequenceGenerator.top_level(*args)
187
- TopLevelSequenceGenerator.new(*args)
188
- end
189
-
190
- end
@@ -1,16 +0,0 @@
1
- require 'rattler/back_end/parser_generator'
2
-
3
- module Rattler::BackEnd::ParserGenerator
4
- # @private
5
- module SkipPropogating #:nodoc:
6
-
7
- def gen_skip(parser, scope={})
8
- propogate_gen parser.child, :skip, scope
9
- end
10
-
11
- def gen_intermediate_skip(parser, scope={})
12
- propogate_gen parser.child, :intermediate_skip, scope
13
- end
14
-
15
- end
16
- end
@@ -1,10 +0,0 @@
1
- require 'rattler/back_end/parser_generator'
2
-
3
- module Rattler::BackEnd::ParserGenerator
4
- # @private
5
- module TokenPropogating #:nodoc:
6
- def gen_token(parser, scope={})
7
- propogate_gen parser.child, :token, scope
8
- end
9
- end
10
- end
@@ -1,43 +0,0 @@
1
- #
2
- # = rattler/grammar.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
- require 'rattler'
8
-
9
- module Rattler
10
- #
11
- # The +Grammar+ module defines the grammar parser
12
- #
13
- # @author Jason Arhart
14
- #
15
- module Grammar
16
- autoload :Grammar, 'rattler/grammar/grammar'
17
- autoload :GrammarParser, 'rattler/grammar/grammar_parser'
18
- autoload :GrammarDSL, 'rattler/grammar/grammar_dsl'
19
- autoload :Metagrammar, 'rattler/grammar/metagrammar'
20
- autoload :Analysis, 'rattler/grammar/analysis'
21
-
22
- # Parse +source+ as a grammar and raise a {Rattler::Runtime::SyntaxError}
23
- # if the parse fails.
24
- #
25
- # @param (see Rattler::RecursiveDescentParser#initialize)
26
- # @raise (see Rattler::RecursiveDescentParser#parse!)
27
- #
28
- # @return [Grammar] the parsed grammar
29
- def self.parse!(source, options={})
30
- GrammarParser.parse!(source, options={})
31
- end
32
-
33
- # Parse +source+ as a grammar.
34
- #
35
- # @param (see Rattler::RecursiveDescentParser#initialize)
36
- #
37
- # @return [Grammar] the parsed grammar
38
- def self.parser(source, options={})
39
- GrammarParser.new(source, options={})
40
- end
41
-
42
- end
43
- end
@@ -1,51 +0,0 @@
1
- #
2
- # = rattler/grammar/grammar_dsl.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
- require 'rattler/grammar'
8
-
9
- module Rattler::Grammar
10
- # @private
11
- module GrammarDSL #:nodoc:
12
-
13
- def self.included(mod)
14
- mod.extend ClassMethods
15
- end
16
-
17
- # @private
18
- module ClassMethods
19
-
20
- def start_rule(name)
21
- define_method(:start_rule) { name }
22
- end
23
-
24
- def grammar(source=nil, &block)
25
- Rattler.compile(self, source, &block)
26
- end
27
-
28
- def rules(&block)
29
- Rattler.compile(self, &block)
30
- end
31
-
32
- def rule(name, &block)
33
- rules { rule(name) {|b| b.instance_exec(&block) } }
34
- end
35
-
36
- def token(name, &block)
37
- rules { token(name) {|b| b.instance_exec(&block) } }
38
- end
39
-
40
- def with_options(options, &block)
41
- rules { with_options(options, &block) }
42
- end
43
-
44
- def with_ws(ws, &block)
45
- rules { with_ws(ws, &block) }
46
- end
47
-
48
- end
49
-
50
- end
51
- end