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,12 +1,12 @@
1
- require 'rattler/back_end/parser_generator'
1
+ require 'rattler/compiler/parser_generator'
2
2
 
3
- module Rattler::BackEnd::ParserGenerator
3
+ module Rattler::Compiler::ParserGenerator
4
4
 
5
5
  # @private
6
6
  class GeneralRepeatGenerator < ExprGenerator #:nodoc:
7
7
  include NestedSubGenerating
8
8
 
9
- def gen_basic(repeat, scope={})
9
+ def gen_basic(repeat, scope = ParserScope.empty)
10
10
  if repeat.capturing?
11
11
  gen_capturing repeat, scope
12
12
  else
@@ -14,36 +14,22 @@ module Rattler::BackEnd::ParserGenerator
14
14
  end
15
15
  end
16
16
 
17
- def gen_assert(repeat, scope={})
17
+ def gen_assert(repeat, scope = ParserScope.empty)
18
18
  gen_predicate(repeat, scope) { gen_assert_result repeat }
19
19
  end
20
20
 
21
- def gen_disallow(repeat, scope={})
21
+ def gen_disallow(repeat, scope = ParserScope.empty)
22
22
  gen_predicate(repeat, scope) { gen_disallow_result repeat }
23
23
  end
24
24
 
25
- def gen_dispatch_action(repeat, code, scope={})
26
- expr :block do
27
- gen_loop repeat, scope
28
- gen_result repeat, code.bind(scope, "select_captures(#{accumulator_name})")
29
- end
30
- end
31
-
32
- def gen_direct_action(repeat, code, scope={})
33
- expr :block do
34
- gen_loop repeat, scope
35
- gen_result(repeat, '(' + code.bind(scope, ["select_captures(#{accumulator_name})"]) + ')')
36
- end
37
- end
38
-
39
- def gen_token(repeat, scope={})
25
+ def gen_token(repeat, scope = ParserScope.empty)
40
26
  expr :block do
41
27
  gen_loop(repeat, scope) { |child| generate child, :token, scope }
42
28
  gen_result repeat, "#{accumulator_name}.join"
43
29
  end
44
30
  end
45
31
 
46
- def gen_skip(repeat, scope={})
32
+ def gen_skip(repeat, scope = ParserScope.empty)
47
33
  expr :block do
48
34
  setup_skip_loop repeat
49
35
  @g << 'while '
@@ -58,7 +44,7 @@ module Rattler::BackEnd::ParserGenerator
58
44
  def gen_capturing(repeat, scope)
59
45
  expr :block do
60
46
  gen_loop(repeat, scope) { |child| gen_nested child, :basic, scope }
61
- gen_result repeat, accumulator_name
47
+ gen_result repeat, result_expr(repeat)
62
48
  end
63
49
  end
64
50
 
@@ -142,6 +128,14 @@ module Rattler::BackEnd::ParserGenerator
142
128
  @g.newline << "(#{count_name} < #{repeat.lower_bound})"
143
129
  end
144
130
 
131
+ def result_expr(repeat)
132
+ if repeat.child.capturing_decidable?
133
+ accumulator_name
134
+ else
135
+ "select_captures(#{accumulator_name})"
136
+ end
137
+ end
138
+
145
139
  def accumulator_name
146
140
  "a#{repeat_level}"
147
141
  end
@@ -1,36 +1,33 @@
1
- require 'rattler/back_end/parser_generator'
1
+ require 'rattler/compiler/parser_generator'
2
2
 
3
- module Rattler::BackEnd::ParserGenerator
3
+ module Rattler::Compiler::ParserGenerator
4
4
  # @private
5
- class RuleSetGenerator #:nodoc:
6
-
7
- Grammar = Rattler::Grammar::Grammar
8
- include Rattler::Parsers
9
-
10
- def initialize(g)
11
- @g = g
12
- @rule_generator = RuleGenerator.new(@g)
13
- end
5
+ class GrammarGenerator < RuleSetGenerator #:nodoc:
14
6
 
15
7
  def generate(parser, opts={})
16
8
  case parser
17
- when Grammar then gen_parser parser, opts
18
- when RuleSet then gen_rules parser, opts
9
+ when Grammar then gen_parser(parser, opts)
10
+ when RuleSet then gen_rules(parser, opts)
19
11
  end
20
12
  self
21
13
  end
22
14
 
23
15
  def gen_parser(grammar, opts={})
16
+ gen_encoding
24
17
  gen_requires grammar.requires
25
18
  gen_module(grammar) do
26
19
  gen_includes grammar.includes
27
- gen_rules grammar.rules, opts
20
+ gen_rules(grammar.rules, opts)
28
21
  end
29
22
  end
30
23
 
24
+ def gen_encoding
25
+ (@g << "# encoding: utf-8").newline
26
+ end
27
+
31
28
  def gen_requires(requires)
32
- requires.each {|_| (@g << "require #{_}").newline }
33
- @g.newline
29
+ requires.each {|_| @g.newline << "require #{_}" }
30
+ @g.newline unless requires.empty?
34
31
  end
35
32
 
36
33
  def gen_module(grammar)
@@ -50,35 +47,29 @@ module Rattler::BackEnd::ParserGenerator
50
47
  end
51
48
  end
52
49
 
53
- def gen_rules(rules, opts={})
54
- gen_start_rule rules.start_rule if rules.start_rule
55
- @g.intersperse(rules, :newlines => 2) do |rule|
56
- if opts[:standalone]
57
- @rule_generator.gen_rule_standalone rule, rules
58
- else
59
- @rule_generator.gen_rule_modular rule
60
- end
61
- end
62
- end
63
-
64
- def gen_start_rule(start_rule)
65
- (@g << "# @private").newline
66
- @g.block('def start_rule #:nodoc:') { @g << ":#{start_rule}"}.newline
67
- @g.newline
68
- end
69
-
70
50
  def gen_grammar_def(grammar_name)
51
+ @g.newline
71
52
  nest_modules(grammar_name.split('::')) do |name|
72
53
  (@g << "# @private").newline
73
54
  module_block("module #{name} #:nodoc:") { yield }
74
55
  end
56
+ gen_cli(:GrammarCLI, grammar_name)
75
57
  end
76
58
 
77
59
  def gen_parser_def(parser_name, base_name)
60
+ @g.newline
78
61
  nest_modules(parser_name.split('::')) do |name|
79
62
  (@g << "# @private").newline
80
63
  module_block("class #{name} < #{base_name} #:nodoc:") { yield }
81
64
  end
65
+ gen_cli(:ParserCLI, parser_name)
66
+ end
67
+
68
+ def gen_cli(cli, module_name)
69
+ @g.newline.newline.block('if __FILE__ == $0') do
70
+ %w{rubygems rattler}.each {|_| (@g << "require '#{_}'").newline }
71
+ @g << "Rattler::Util::#{cli}.run(#{module_name})"
72
+ end
82
73
  end
83
74
 
84
75
  def nest_modules(path)
@@ -0,0 +1,33 @@
1
+ require 'rattler/compiler/parser_generator'
2
+
3
+ module Rattler::Compiler::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 = ParserScope.empty)
18
+ scanner.scan(re) && if num_groups == 1
19
+ yield scope.nest.capture(scanner[1]) if block_given?
20
+ scanner[1]
21
+ else
22
+ rs = (1..num_groups).map {|_| scanner[_] }
23
+ yield scope.nest.capture(*rs) if block_given?
24
+ rs
25
+ end
26
+ end
27
+
28
+ def sequence?
29
+ num_groups > 1
30
+ end
31
+
32
+ end
33
+ end
@@ -1,6 +1,6 @@
1
- require 'rattler/back_end/parser_generator'
1
+ require 'rattler/compiler/parser_generator'
2
2
 
3
- module Rattler::BackEnd::ParserGenerator
3
+ module Rattler::Compiler::ParserGenerator
4
4
 
5
5
  # @private
6
6
  class GroupMatchGenerator < ExprGenerator #:nodoc:
@@ -8,23 +8,10 @@ module Rattler::BackEnd::ParserGenerator
8
8
  include TokenPropogating
9
9
  include SkipPropogating
10
10
 
11
- def gen_basic(group_match, scope={})
11
+ def gen_basic(group_match, scope = ParserScope.empty)
12
12
  expr(:block) { gen_capture group_match, result_expr(group_match) }
13
13
  end
14
14
 
15
- def gen_dispatch_action(group_match, code, scope={})
16
- expr :block do
17
- gen_capture group_match,
18
- code.bind(scope, "[#{group_exprs(group_match).join ', '}]")
19
- end
20
- end
21
-
22
- def gen_direct_action(group_match, code, scope={})
23
- expr :block do
24
- gen_capture group_match, "(#{code.bind(scope, group_exprs(group_match))})"
25
- end
26
- end
27
-
28
15
  private
29
16
 
30
17
  def gen_capture(group_match, expr)
@@ -33,7 +20,7 @@ module Rattler::BackEnd::ParserGenerator
33
20
  end
34
21
 
35
22
  def result_expr(group_match)
36
- if group_match.num_groups == 1
23
+ if group_match.capture_count == 1
37
24
  group_exprs(group_match).first
38
25
  else
39
26
  "[#{group_exprs(group_match).join ', '}]"
@@ -0,0 +1,37 @@
1
+ require 'rattler/compiler/parser_generator'
2
+
3
+ module Rattler::Compiler::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 = ParserScope.empty)
12
+ generate label.child, :basic, scope
13
+ end
14
+
15
+ end
16
+
17
+ # @private
18
+ class NestedLabelGenerator < LabelGenerator #:nodoc:
19
+ include Nested
20
+ include NestedSubGenerating
21
+ end
22
+
23
+ def LabelGenerator.nested(*args)
24
+ NestedLabelGenerator.new(*args)
25
+ end
26
+
27
+ # @private
28
+ class TopLevelLabelGenerator < LabelGenerator #:nodoc:
29
+ include TopLevel
30
+ include TopLevelSubGenerating
31
+ end
32
+
33
+ def LabelGenerator.top_level(*args)
34
+ TopLevelLabelGenerator.new(*args)
35
+ end
36
+
37
+ end
@@ -1,18 +1,18 @@
1
- require 'rattler/back_end/parser_generator'
1
+ require 'rattler/compiler/parser_generator'
2
2
 
3
- module Rattler::BackEnd::ParserGenerator
3
+ module Rattler::Compiler::ParserGenerator
4
4
  # @private
5
5
  module List0Generating #:nodoc:
6
6
 
7
- def gen_assert(optional, scope={})
7
+ def gen_assert(optional, scope = ParserScope.empty)
8
8
  @g << 'true'
9
9
  end
10
10
 
11
- def gen_disallow(optional, scope={})
11
+ def gen_disallow(optional, scope = ParserScope.empty)
12
12
  @g << 'false'
13
13
  end
14
14
 
15
- def gen_skip(list, scope={})
15
+ def gen_skip(list, scope = ParserScope.empty)
16
16
  expr :block do
17
17
  gen_skipping list, scope
18
18
  @g << "@scanner.pos = #{end_pos_name} unless #{end_pos_name}.nil?"
@@ -1,11 +1,11 @@
1
- require 'rattler/back_end/parser_generator'
1
+ require 'rattler/compiler/parser_generator'
2
2
 
3
- module Rattler::BackEnd::ParserGenerator
3
+ module Rattler::Compiler::ParserGenerator
4
4
  # @private
5
5
  module List1Generating #:nodoc:
6
6
  include PredicatePropogating
7
7
 
8
- def gen_skip(list, scope={})
8
+ def gen_skip(list, scope = ParserScope.empty)
9
9
  expr :block do
10
10
  (@g << "#{result_name} = false").newline
11
11
  gen_skipping(list, scope) { (@g << "#{result_name} = true").newline }
@@ -1,6 +1,6 @@
1
- require 'rattler/back_end/parser_generator'
1
+ require 'rattler/compiler/parser_generator'
2
2
 
3
- module Rattler::BackEnd::ParserGenerator
3
+ module Rattler::Compiler::ParserGenerator
4
4
 
5
5
  # @private
6
6
  class ListGenerator < DelegatingGenerator #:nodoc:
@@ -1,48 +1,48 @@
1
- require 'rattler/back_end/parser_generator'
1
+ require 'rattler/compiler/parser_generator'
2
2
 
3
- module Rattler::BackEnd::ParserGenerator
3
+ module Rattler::Compiler::ParserGenerator
4
4
 
5
5
  # @private
6
6
  class MatchGenerator < ExprGenerator #:nodoc:
7
7
 
8
- def gen_basic(match, scope={})
8
+ def gen_basic(match, scope = ParserScope.empty)
9
9
  @g << "@scanner.scan(#{match.re.inspect})"
10
10
  end
11
11
 
12
- def gen_assert(match, scope={})
12
+ def gen_assert(match, scope = ParserScope.empty)
13
13
  expr do
14
14
  gen_intermediate_assert match, scope
15
15
  @g << ' && true'
16
16
  end
17
17
  end
18
18
 
19
- def gen_disallow(match, scope={})
19
+ def gen_disallow(match, scope = ParserScope.empty)
20
20
  expr do
21
21
  gen_intermediate_disallow match, scope
22
22
  @g << ' && true'
23
23
  end
24
24
  end
25
25
 
26
- def gen_token(match, scope={})
26
+ def gen_token(match, scope = ParserScope.empty)
27
27
  gen_basic match, scope
28
28
  end
29
29
 
30
- def gen_skip(match, scope={})
30
+ def gen_skip(match, scope = ParserScope.empty)
31
31
  expr do
32
32
  gen_intermediate_skip match, scope
33
33
  @g << ' && true'
34
34
  end
35
35
  end
36
36
 
37
- def gen_intermediate_assert(match, scope={})
37
+ def gen_intermediate_assert(match, scope = ParserScope.empty)
38
38
  @g << "@scanner.skip(#{/(?=#{match.re.source})/.inspect})"
39
39
  end
40
40
 
41
- def gen_intermediate_disallow(match, scope={})
41
+ def gen_intermediate_disallow(match, scope = ParserScope.empty)
42
42
  @g << "@scanner.skip(#{/(?!#{match.re.source})/.inspect})"
43
43
  end
44
44
 
45
- def gen_intermediate_skip(match, scope={})
45
+ def gen_intermediate_skip(match, scope = ParserScope.empty)
46
46
  @g << "@scanner.skip(#{match.re.inspect})"
47
47
  end
48
48
 
@@ -1,6 +1,6 @@
1
- require 'rattler/back_end/parser_generator'
1
+ require 'rattler/compiler/parser_generator'
2
2
 
3
- module Rattler::BackEnd::ParserGenerator
3
+ module Rattler::Compiler::ParserGenerator
4
4
  # @private
5
5
  module Nested #:nodoc:
6
6
 
@@ -0,0 +1,49 @@
1
+ require 'rattler/compiler/parser_generator'
2
+
3
+ module Rattler::Compiler::ParserGenerator
4
+
5
+ # @private
6
+ class NodeActionGenerator < ExprGenerator #:nodoc:
7
+
8
+ def gen_basic(action, scope = ParserScope.empty)
9
+ @g << action.bindable_code.bind(scope)
10
+ end
11
+
12
+ def gen_assert(action, scope = ParserScope.empty)
13
+ expr { @g.suffix(' && true') { gen_basic action, scope } }
14
+ end
15
+
16
+ def gen_disallow(action, scope = ParserScope.empty)
17
+ @g << '!'
18
+ gen_basic action, scope
19
+ end
20
+
21
+ def gen_token(action, scope = ParserScope.empty)
22
+ @g.suffix('.to_s') { gen_basic action, scope }
23
+ end
24
+
25
+ def gen_skip(action, scope = ParserScope.empty)
26
+ expr { @g.suffix('; true') { gen_basic action, scope } }
27
+ end
28
+
29
+ end
30
+
31
+ # @private
32
+ class NestedNodeActionGenerator < NodeActionGenerator #:nodoc:
33
+ include Nested
34
+ end
35
+
36
+ def NodeActionGenerator.nested(*args)
37
+ NestedNodeActionGenerator.new(*args)
38
+ end
39
+
40
+ # @private
41
+ class TopLevelNodeActionGenerator < NodeActionGenerator #:nodoc:
42
+ include TopLevel
43
+ end
44
+
45
+ def NodeActionGenerator.top_level(*args)
46
+ TopLevelNodeActionGenerator.new(*args)
47
+ end
48
+
49
+ end