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,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 OneOrMoreGenerating #:nodoc:
6
6
  include PredicatePropogating
7
7
 
8
- def gen_skip(one_or_more, scope={})
8
+ def gen_skip(one_or_more, scope = ParserScope.empty)
9
9
  expr :block do
10
10
  (@g << "#{result_name} = false").newline
11
11
  @g << 'while '
@@ -1,41 +1,25 @@
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 OptionalGenerating #: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_dispatch_action(optional, code, scope={})
16
- expr :block do
17
- gen_loop optional, scope
18
- @g.newline << code.bind(scope, "#{result_name} ? [#{result_name}] : []")
19
- end
20
- end
21
-
22
- def gen_direct_action(optional, code, scope={})
23
- expr :block do
24
- @g << "#{result_name} = "
25
- generate optional.child, :basic, scope
26
- @g.newline <<
27
- '(' << code.bind(scope, ["(#{result_name} ? [#{result_name}] : [])"]) << ')'
28
- end
29
- end
30
-
31
- def gen_token(optional, scope={})
15
+ def gen_token(optional, scope = ParserScope.empty)
32
16
  expr :block do
33
17
  generate optional.child, :token, scope
34
18
  @g << " || ''"
35
19
  end
36
20
  end
37
21
 
38
- def gen_skip(optional, scope={})
22
+ def gen_skip(optional, scope = ParserScope.empty)
39
23
  expr :block do
40
24
  generate optional.child, :intermediate_skip, scope
41
25
  @g.newline << 'true'
@@ -0,0 +1,24 @@
1
+ require 'rattler/compiler/parser_generator'
2
+
3
+ module Rattler::Compiler::ParserGenerator
4
+ # @private
5
+ module PredicatePropogating #:nodoc:
6
+
7
+ def gen_assert(parser, scope = ParserScope.empty)
8
+ propogate_gen parser.child, :assert, scope
9
+ end
10
+
11
+ def gen_disallow(parser, scope = ParserScope.empty)
12
+ propogate_gen parser.child, :disallow, scope
13
+ end
14
+
15
+ def gen_intermediate_assert(parser, scope = ParserScope.empty)
16
+ propogate_gen parser.child, :intermediate_assert, scope
17
+ end
18
+
19
+ def gen_intermediate_disallow(parser, scope = ParserScope.empty)
20
+ propogate_gen parser.child, :intermediate_disallow, scope
21
+ end
22
+
23
+ end
24
+ 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 RepeatGenerator < DelegatingGenerator #:nodoc:
@@ -0,0 +1,66 @@
1
+ require 'rattler/compiler/parser_generator'
2
+
3
+ module Rattler::Compiler::ParserGenerator
4
+ # @private
5
+ class RuleGenerator #:nodoc:
6
+
7
+ include Rattler::Parsers
8
+
9
+ def initialize(g)
10
+ @g = g
11
+ @expr_generator = NestedExprGenerator.new(@g)
12
+ end
13
+
14
+ def generate(rule, opts={})
15
+ (@g << "# @private").newline
16
+ @g.block "def match_#{rule.name} #:nodoc:" do
17
+ @g << "apply :match_#{rule.name}!"
18
+ end.newline.newline
19
+ gen_match_method rule
20
+ end
21
+
22
+ private
23
+
24
+ def gen_match_method(rule)
25
+ (@g << "# @private").newline
26
+ @g.block "def match_#{rule.name}! #:nodoc:" do
27
+ gen_child rule.child
28
+ gen_fail rule if add_implicit_fail? rule
29
+ end
30
+ end
31
+
32
+ def add_implicit_fail?(rule)
33
+ not (rule.attrs[:inline] or has_explicit_fail?(rule.child))
34
+ end
35
+
36
+ def gen_child(child)
37
+ if child.is_a? Choice
38
+ @expr_generator.gen_top_level child
39
+ else
40
+ @expr_generator.generate child
41
+ end
42
+ end
43
+
44
+ def gen_fail(rule)
45
+ (@g << " ||").newline
46
+ if force_fail_message? rule.child
47
+ @g << "fail! { :#{rule.name} }"
48
+ else
49
+ @g << "fail { :#{rule.name} }"
50
+ end
51
+ end
52
+
53
+ def force_fail_message?(expr)
54
+ expr.is_a? Choice and
55
+ expr.any? {|_| _.is_a? Apply or force_fail_message? _ }
56
+ end
57
+
58
+ def has_explicit_fail?(expr)
59
+ case expr
60
+ when Fail then true
61
+ when Choice then expr.any? {|_| has_explicit_fail? _ }
62
+ end
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,33 @@
1
+ require 'rattler/compiler/parser_generator'
2
+
3
+ module Rattler::Compiler::ParserGenerator
4
+ # @private
5
+ class RuleSetGenerator #:nodoc:
6
+
7
+ include Rattler::Parsers
8
+
9
+ def initialize(g)
10
+ @g = g
11
+ @rule_generator = RuleGenerator.new(@g)
12
+ end
13
+
14
+ def generate(parser, opts={})
15
+ gen_rules parser, opts
16
+ self
17
+ end
18
+
19
+ def gen_rules(rules, opts={})
20
+ gen_start_rule rules.start_rule if rules.start_rule
21
+ @g.intersperse(rules, :newlines => 2) do |rule|
22
+ @rule_generator.generate rule
23
+ end
24
+ end
25
+
26
+ def gen_start_rule(start_rule)
27
+ (@g << "# @private").newline
28
+ @g.block('def start_rule #:nodoc:') { @g << ":#{start_rule}"}.newline
29
+ @g.newline
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,58 @@
1
+ require 'rattler/compiler/parser_generator'
2
+
3
+ module Rattler::Compiler::ParserGenerator
4
+
5
+ # @private
6
+ class SemanticActionGenerator < ExprGenerator #:nodoc:
7
+ include NestedSubGenerating
8
+
9
+ def gen_basic(action, scope = ParserScope.empty)
10
+ expr { @g << action.bindable_code.bind(scope) }
11
+ end
12
+
13
+ def gen_assert(action, scope = ParserScope.empty)
14
+ expr { @g.suffix(' && true') { gen_intermediate_assert action, scope } }
15
+ end
16
+
17
+ def gen_disallow(action, scope = ParserScope.empty)
18
+ @g << '!'
19
+ gen_nested action, :basic, scope
20
+ end
21
+
22
+ def gen_token(action, scope = ParserScope.empty)
23
+ @g.suffix('.to_s') { gen_nested action, :basic, scope }
24
+ end
25
+
26
+ def gen_skip(action, scope = ParserScope.empty)
27
+ expr { @g.suffix('; true') { gen_top_level action, :basic, scope } }
28
+ end
29
+
30
+ def gen_intermediate_assert(action, scope = ParserScope.empty)
31
+ gen_nested action, :basic, scope
32
+ end
33
+
34
+ def gen_intermediate_skip(action, scope = ParserScope.empty)
35
+ gen_nested action, :basic, scope
36
+ end
37
+
38
+ end
39
+
40
+ # @private
41
+ class NestedSemanticActionGenerator < SemanticActionGenerator #:nodoc:
42
+ include Nested
43
+ end
44
+
45
+ def SemanticActionGenerator.nested(*args)
46
+ NestedSemanticActionGenerator.new(*args)
47
+ end
48
+
49
+ # @private
50
+ class TopLevelSemanticActionGenerator < SemanticActionGenerator #:nodoc:
51
+ include TopLevel
52
+ end
53
+
54
+ def SemanticActionGenerator.top_level(*args)
55
+ TopLevelSemanticActionGenerator.new(*args)
56
+ end
57
+
58
+ end
@@ -0,0 +1,138 @@
1
+ require 'rattler/compiler/parser_generator'
2
+
3
+ module Rattler::Compiler::ParserGenerator
4
+ # @private
5
+ module SequenceGenerating #:nodoc:
6
+ include NestedSubGenerating
7
+
8
+ def gen_assert(sequence, scope = ParserScope.empty)
9
+ expr :block do
10
+ lookahead do
11
+ @g.block("#{result_name} = begin") do
12
+ gen_children_matching(sequence, scope.nest) do |last_child, scope|
13
+ @g.suffix(' &&') { gen_nested last_child, :intermediate_skip, scope }
14
+ @g.newline << 'true'
15
+ end
16
+ end
17
+ @g.newline
18
+ end
19
+ @g << result_name
20
+ end
21
+ end
22
+
23
+ def gen_disallow(sequence, scope = ParserScope.empty)
24
+ expr :block do
25
+ lookahead do
26
+ @g.block("#{result_name} = !begin") do
27
+ gen_children_matching(sequence, scope.nest) do |last_child, scope|
28
+ gen_nested last_child, :intermediate_skip, scope
29
+ end
30
+ end
31
+ @g.newline
32
+ end
33
+ @g << result_name
34
+ end
35
+ end
36
+
37
+ def gen_token(sequence, scope = ParserScope.empty)
38
+ with_backtracking do
39
+ gen_children_matching(sequence, scope.nest) do |last_child, scope|
40
+ @g.suffix(' &&') { gen_nested last_child, :intermediate_skip, scope }
41
+ @g.newline << "@scanner.string[#{saved_pos_name}...(@scanner.pos)]"
42
+ end
43
+ end
44
+ end
45
+
46
+ def gen_skip(sequence, scope = ParserScope.empty)
47
+ with_backtracking do
48
+ gen_children_matching(sequence, scope.nest) do |last_child, scope|
49
+ @g.suffix(' &&') { gen_matching last_child, scope }
50
+ @g.newline << 'true'
51
+ end
52
+ end
53
+ end
54
+
55
+ protected
56
+
57
+ def gen_children_capturing(sequence, scope)
58
+ @g.intersperse_nl(sequence, ' &&') do |child|
59
+ if child.equal? sequence.children.last
60
+ yield child, scope
61
+ else
62
+ scope = gen_capturing(child, scope)
63
+ end
64
+ end
65
+ end
66
+
67
+ def gen_children_matching(sequence, scope)
68
+ @g.intersperse_nl(sequence, ' &&') do |child|
69
+ if child.equal? sequence.children.last
70
+ yield child, scope
71
+ elsif sequence.semantic?
72
+ scope = gen_capturing(child, scope)
73
+ else
74
+ scope = gen_matching(child, scope)
75
+ end
76
+ end
77
+ end
78
+
79
+ def gen_capturing(child, scope)
80
+ if child.capturing?
81
+ scope = capture_child(child, scope)
82
+ else
83
+ gen_nested child, :intermediate, scope
84
+ end
85
+ scope
86
+ end
87
+
88
+ def gen_matching(child, scope)
89
+ if child.labeled? and child.capturing?
90
+ scope = capture_child(child, scope)
91
+ else
92
+ gen_nested child, :intermediate_skip, scope
93
+ end
94
+ scope
95
+ end
96
+
97
+ def capture_child(child, scope)
98
+ scope = new_capture(child, scope) do |name|
99
+ @g.surround("(#{name} = ", ')') { gen_nested child, :basic, scope }
100
+ end
101
+ if child.labeled?
102
+ scope.bind(child.label => last_capture_name(scope))
103
+ else
104
+ scope
105
+ end
106
+ end
107
+
108
+ def with_backtracking
109
+ expr :block do
110
+ (@g << "#{saved_pos_name} = @scanner.pos").newline
111
+ @g.block 'begin' do
112
+ yield
113
+ end
114
+ @g.block ' || begin' do
115
+ (@g << "@scanner.pos = #{saved_pos_name}").newline << 'false'
116
+ end
117
+ end
118
+ end
119
+
120
+ def new_capture(child, scope)
121
+ new_scope = scope.capture("r#{sequence_level}_#{scope.captures.size}")
122
+ unless child.capturing_decidable?
123
+ new_scope = new_scope.with_undecidable_captures
124
+ end
125
+ yield last_capture_name(new_scope)
126
+ new_scope
127
+ end
128
+
129
+ def last_capture_name(scope)
130
+ scope.captures.last
131
+ end
132
+
133
+ def saved_pos_name
134
+ "p#{sequence_level}"
135
+ end
136
+
137
+ end
138
+ end
@@ -0,0 +1,57 @@
1
+ require 'rattler/compiler/parser_generator'
2
+
3
+ module Rattler::Compiler::ParserGenerator
4
+
5
+ # @private
6
+ class SequenceGenerator < ExprGenerator #:nodoc:
7
+ include SequenceGenerating
8
+
9
+ def gen_basic(sequence, scope = ParserScope.empty)
10
+ with_backtracking do
11
+ gen_children_capturing(sequence, scope.nest) do |last_child, scope|
12
+ if sequence.capture_count == 1 and last_child.capturing?
13
+ gen_nested last_child, :basic, scope
14
+ else
15
+ @g.suffix(' &&') { scope = gen_capturing last_child, scope }
16
+ @g.newline << result_expr(scope)
17
+ end
18
+ end
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def result_expr(scope)
25
+ case scope.captures.size
26
+ when 0 then 'true'
27
+ when 1 then scope.captures[0]
28
+ else result_array_expr(scope)
29
+ end
30
+ end
31
+
32
+ def result_array_expr(scope)
33
+ expr = '[' + scope.captures.join(', ') + ']'
34
+ scope.captures_decidable? ? expr : "select_captures(#{expr})"
35
+ end
36
+
37
+ end
38
+
39
+ # @private
40
+ class NestedSequenceGenerator < SequenceGenerator #:nodoc:
41
+ include Nested
42
+ end
43
+
44
+ def SequenceGenerator.nested(*args)
45
+ NestedSequenceGenerator.new(*args)
46
+ end
47
+
48
+ # @private
49
+ class TopLevelSequenceGenerator < SequenceGenerator #:nodoc:
50
+ include TopLevel
51
+ end
52
+
53
+ def SequenceGenerator.top_level(*args)
54
+ TopLevelSequenceGenerator.new(*args)
55
+ end
56
+
57
+ end