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
@@ -2,7 +2,7 @@ require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
2
 
3
3
  include Rattler::Parsers
4
4
 
5
- describe Rattler::BackEnd::ParserGenerator::RuleSetGenerator do
5
+ describe Rattler::Compiler::ParserGenerator::RuleSetGenerator do
6
6
 
7
7
  include ParserGeneratorSpecHelper
8
8
 
@@ -31,7 +31,8 @@ end
31
31
  # @private
32
32
  def match_a! #:nodoc:
33
33
  @scanner.scan("a") ||
34
- match(:b)
34
+ match(:b) ||
35
+ fail! { :a }
35
36
  end
36
37
 
37
38
  # @private
@@ -41,7 +42,8 @@ end
41
42
 
42
43
  # @private
43
44
  def match_b! #:nodoc:
44
- @scanner.scan("b")
45
+ @scanner.scan("b") ||
46
+ fail { :b }
45
47
  end
46
48
  CODE
47
49
  end
@@ -49,17 +51,7 @@ end
49
51
 
50
52
  context 'given rules with a start rule defined' do
51
53
 
52
- let(:rules) { RuleSet[
53
-
54
- Rule[:a, Choice[
55
- Match['a'],
56
- Apply[:b]
57
- ]],
58
-
59
- Rule[:b, Match['b']],
60
-
61
- { :start_rule => :a }
62
- ] }
54
+ let(:rules) { RuleSet[Rule[:a, Match['a']], { :start_rule => :a }] }
63
55
 
64
56
  it 'generates #start_rule and #match_<rule> methods' do
65
57
  generated_code {|g| g.generate rules }.
@@ -77,21 +69,11 @@ end
77
69
  # @private
78
70
  def match_a! #:nodoc:
79
71
  @scanner.scan("a") ||
80
- match(:b)
81
- end
82
-
83
- # @private
84
- def match_b #:nodoc:
85
- apply :match_b!
86
- end
87
-
88
- # @private
89
- def match_b! #:nodoc:
90
- @scanner.scan("b")
72
+ fail { :a }
91
73
  end
92
74
  CODE
93
75
  end
94
76
  end
95
- end
96
77
 
97
- end
78
+ end
79
+ end
@@ -0,0 +1,437 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
+
3
+ include Rattler::Compiler::ParserGenerator
4
+ include Rattler::Parsers
5
+
6
+ describe SemanticActionGenerator do
7
+
8
+ include ParserGeneratorSpecHelper
9
+
10
+ let(:scope) { ParserScope.new(bindings, captures) }
11
+ let(:bindings) { {} }
12
+ let(:captures) { [] }
13
+
14
+ describe '#gen_basic' do
15
+
16
+ context 'given an action with no parameters' do
17
+
18
+ let(:action) { SemanticAction['@foo * 3'] }
19
+
20
+ context 'when nested' do
21
+ it 'generates nested semantic action code' do
22
+ nested_code {|g| g.gen_basic action }.
23
+ should == '(@foo * 3)'
24
+ end
25
+ end
26
+
27
+ context 'when top-level' do
28
+ it 'generates top level semantic action code' do
29
+ top_level_code {|g| g.gen_basic action }.
30
+ should == '@foo * 3'
31
+ end
32
+ end
33
+ end
34
+
35
+ context 'given an action with parameters' do
36
+
37
+ let(:action) { SemanticAction['|a,b| a * b'] }
38
+ let(:captures) { ['2', '5'] }
39
+
40
+ context 'when nested' do
41
+ it 'generates nested semantic action code using captures' do
42
+ nested_code {|g| g.gen_basic action, scope }.
43
+ should == '(2 * 5)'
44
+ end
45
+ end
46
+
47
+ context 'when top-level' do
48
+ it 'generates top level semantic action code using captures' do
49
+ top_level_code {|g| g.gen_basic action, scope }.
50
+ should == '2 * 5'
51
+ end
52
+ end
53
+ end
54
+
55
+ context 'given an action using "_"' do
56
+
57
+ context 'given a single capture' do
58
+
59
+ let (:action) { SemanticAction['_ * 2'] }
60
+ let (:captures) { ['3'] }
61
+
62
+ context 'when nested' do
63
+ it 'generates nested semantic action code using the capture' do
64
+ nested_code {|g| g.gen_basic action, scope }.
65
+ should == ('(3 * 2)')
66
+ end
67
+ end
68
+
69
+ context 'when top-level' do
70
+ it 'generates top level semantic action code using the capture' do
71
+ top_level_code {|g| g.gen_basic action, scope }.
72
+ should == ('3 * 2')
73
+ end
74
+ end
75
+ end
76
+
77
+ context 'given multiple captures' do
78
+
79
+ let (:action) { SemanticAction['_.join'] }
80
+ let (:captures) { ['3', '2'] }
81
+
82
+ context 'when nested' do
83
+ it 'generates nested semantic action code using the array of captures' do
84
+ nested_code {|g| g.gen_basic action, scope }.
85
+ should == ('([3, 2].join)')
86
+ end
87
+ end
88
+
89
+ context 'when top-level' do
90
+ it 'generates top level semantic action code using the array of captures' do
91
+ top_level_code {|g| g.gen_basic action, scope }.
92
+ should == ('[3, 2].join')
93
+ end
94
+ end
95
+ end
96
+ end
97
+
98
+ context 'given an action using labels' do
99
+
100
+ let(:action) { SemanticAction['left * right'] }
101
+ let(:bindings) { {:left => '3', :right => '2'} }
102
+
103
+ context 'when nested' do
104
+ it 'generates nested semantic action code using bindings' do
105
+ nested_code {|g| g.gen_basic action, scope }.
106
+ should == '(3 * 2)'
107
+ end
108
+ end
109
+
110
+ context 'when top-level' do
111
+ it 'generates top level semantic action code using bindings' do
112
+ top_level_code {|g| g.gen_basic action, scope }.
113
+ should == '3 * 2'
114
+ end
115
+ end
116
+ end
117
+ end
118
+
119
+ describe '#gen_assert' do
120
+
121
+ context 'given an action with no parameters' do
122
+
123
+ let(:action) { SemanticAction['@foo == 3'] }
124
+
125
+ context 'when nested' do
126
+ it 'generates nested semantic assert code' do
127
+ nested_code {|g| g.gen_assert action }.
128
+ should == '((@foo == 3) && true)'
129
+ end
130
+ end
131
+
132
+ context 'when top-level' do
133
+ it 'generates top level semantic assert code' do
134
+ top_level_code {|g| g.gen_assert action }.
135
+ should == '(@foo == 3) && true'
136
+ end
137
+ end
138
+ end
139
+
140
+ context 'given an action with parameters' do
141
+
142
+ let(:action) { SemanticAction['|a,b| a == b'] }
143
+ let(:captures) { ['2', '1'] }
144
+
145
+ context 'when nested' do
146
+ it 'generates nested semantic assert code using captures' do
147
+ nested_code {|g| g.gen_assert action, scope }.
148
+ should == '((2 == 1) && true)'
149
+ end
150
+ end
151
+
152
+ context 'when top-level' do
153
+ it 'generates top level semantic assert code using captures' do
154
+ top_level_code {|g| g.gen_assert action, scope }.
155
+ should == '(2 == 1) && true'
156
+ end
157
+ end
158
+ end
159
+
160
+ context 'given an action using labels' do
161
+
162
+ let(:action) { SemanticAction['left < right'] }
163
+ let(:bindings) { {:left => '2', :right => '3'} }
164
+
165
+ context 'when nested' do
166
+ it 'generates nested semantic assert code using bindings' do
167
+ nested_code {|g| g.gen_assert action, scope }.
168
+ should == '((2 < 3) && true)'
169
+ end
170
+ end
171
+
172
+ context 'when top-level' do
173
+ it 'generates top level semantic assert code using bindings' do
174
+ top_level_code {|g| g.gen_assert action, scope }.
175
+ should == '(2 < 3) && true'
176
+ end
177
+ end
178
+ end
179
+ end
180
+
181
+ describe '#gen_disallow' do
182
+
183
+ context 'given an action with no parameters' do
184
+
185
+ let(:action) { SemanticAction['@foo == 3'] }
186
+
187
+ context 'when nested' do
188
+ it 'generates semantic disallow code' do
189
+ nested_code {|g| g.gen_disallow action }.
190
+ should == '!(@foo == 3)'
191
+ end
192
+ end
193
+
194
+ context 'when top-level' do
195
+ it 'generates semantic disallow code' do
196
+ top_level_code {|g| g.gen_disallow action }.
197
+ should == '!(@foo == 3)'
198
+ end
199
+ end
200
+ end
201
+
202
+ context 'given an action with parameters' do
203
+
204
+ let(:action) { SemanticAction['|a,b| a == b'] }
205
+ let(:captures) { ['2', '1'] }
206
+
207
+ context 'when nested' do
208
+ it 'generates semantic disallow code using captures' do
209
+ nested_code {|g| g.gen_disallow action, scope }.
210
+ should == '!(2 == 1)'
211
+ end
212
+ end
213
+
214
+ context 'when top-level' do
215
+ it 'generates semantic disallow code using captures' do
216
+ top_level_code {|g| g.gen_disallow action, scope }.
217
+ should == '!(2 == 1)'
218
+ end
219
+ end
220
+ end
221
+
222
+ context 'given an action using labels' do
223
+
224
+ let(:action) { SemanticAction['left < right'] }
225
+ let(:bindings) { {:left => '2', :right => '3'} }
226
+
227
+ context 'when nested' do
228
+ it 'generates semantic disallow code using bindings' do
229
+ nested_code {|g| g.gen_disallow action, scope }.
230
+ should == '!(2 < 3)'
231
+ end
232
+ end
233
+
234
+ context 'when top-level' do
235
+ it 'generates semantic disallow code using bindings' do
236
+ top_level_code {|g| g.gen_disallow action, scope }.
237
+ should == '!(2 < 3)'
238
+ end
239
+ end
240
+ end
241
+ end
242
+
243
+ describe '#gen_token' do
244
+
245
+ context 'given an action with no parameters' do
246
+
247
+ let(:action) { SemanticAction['@foo * 2'] }
248
+
249
+ context 'when nested' do
250
+ it 'generates semantic token code' do
251
+ nested_code {|g| g.gen_token action }.
252
+ should == '(@foo * 2).to_s'
253
+ end
254
+ end
255
+
256
+ context 'when top-level' do
257
+ it 'generates semantic token code' do
258
+ top_level_code {|g| g.gen_token action }.
259
+ should == '(@foo * 2).to_s'
260
+ end
261
+ end
262
+ end
263
+
264
+ context 'given an action with parameters' do
265
+
266
+ let(:action) { SemanticAction['|a, b| a + b'] }
267
+ let(:captures) { ['1', '3'] }
268
+
269
+ context 'when nested' do
270
+ it 'generates semantic token code using captures' do
271
+ nested_code {|g| g.gen_token action, scope }.
272
+ should == '(1 + 3).to_s'
273
+ end
274
+ end
275
+
276
+ context 'when top-level' do
277
+ it 'generates semantic token code using captures' do
278
+ top_level_code {|g| g.gen_token action, scope }.
279
+ should == '(1 + 3).to_s'
280
+ end
281
+ end
282
+ end
283
+
284
+ context 'given an action using labels' do
285
+
286
+ let(:action) { SemanticAction['left * right'] }
287
+ let(:bindings) { {:left => '4', :right => '3'} }
288
+
289
+ context 'when nested' do
290
+ it 'generates semantic token code using bindings' do
291
+ nested_code {|g| g.gen_token action, scope }.
292
+ should == '(4 * 3).to_s'
293
+ end
294
+ end
295
+
296
+ context 'when top-level' do
297
+ it 'generates semantic token code using bindings' do
298
+ top_level_code {|g| g.gen_token action, scope }.
299
+ should == '(4 * 3).to_s'
300
+ end
301
+ end
302
+ end
303
+ end
304
+
305
+ describe '#gen_skip' do
306
+
307
+ context 'given an action with no parameters' do
308
+
309
+ let(:action) { SemanticAction['@foo = 2'] }
310
+
311
+ context 'when nested' do
312
+ it 'generates nested semantic side-effect code' do
313
+ nested_code {|g| g.gen_skip action }.
314
+ should == '(@foo = 2; true)'
315
+ end
316
+ end
317
+
318
+ context 'when top-level' do
319
+ it 'generates top level semantic side-effect code' do
320
+ top_level_code {|g| g.gen_skip action }.
321
+ should == '@foo = 2; true'
322
+ end
323
+ end
324
+ end
325
+
326
+ context 'given an action with parameters' do
327
+
328
+ let(:action) { SemanticAction['|a, b| @foo = a * b'] }
329
+ let(:captures) { ['2', '4'] }
330
+
331
+ context 'when nested' do
332
+ it 'generates nested semantic side-effect code using captures' do
333
+ nested_code {|g| g.gen_skip action, scope }.
334
+ should == '(@foo = 2 * 4; true)'
335
+ end
336
+ end
337
+
338
+ context 'when top-level' do
339
+ it 'generates top level semantic side-effect code using captures' do
340
+ top_level_code {|g| g.gen_skip action, scope }.
341
+ should == '@foo = 2 * 4; true'
342
+ end
343
+ end
344
+ end
345
+
346
+ context 'given an action using labels' do
347
+
348
+ let(:action) { SemanticAction['@foo = left * right'] }
349
+ let(:bindings) { {:left => '2', :right => '1'} }
350
+
351
+ context 'when nested' do
352
+ it 'generates nested semantic side-effect code using bindings' do
353
+ nested_code {|g| g.gen_skip action, scope }.
354
+ should == '(@foo = 2 * 1; true)'
355
+ end
356
+ end
357
+
358
+ context 'when top-level' do
359
+ it 'generates top level semantic side-effect code using bindings' do
360
+ top_level_code {|g| g.gen_skip action, scope }.
361
+ should == '@foo = 2 * 1; true'
362
+ end
363
+ end
364
+ end
365
+ end
366
+
367
+ describe '#gen_intermediate_assert' do
368
+
369
+ context 'given an action with no parameters' do
370
+
371
+ let(:action) { SemanticAction['@foo == 3'] }
372
+
373
+ it 'generates intermediate semantic assert code' do
374
+ nested_code {|g| g.gen_intermediate_assert action }.
375
+ should == '(@foo == 3)'
376
+ end
377
+ end
378
+
379
+ context 'given an action with parameters' do
380
+
381
+ let(:action) { SemanticAction['|a,b| a == b'] }
382
+ let(:captures) { ['2', '1'] }
383
+
384
+ it 'generates intermediate semantic assert code using captures' do
385
+ nested_code {|g| g.gen_intermediate_assert action, scope }.
386
+ should == '(2 == 1)'
387
+ end
388
+ end
389
+
390
+ context 'given an action using labels' do
391
+
392
+ let(:action) { SemanticAction['left < right'] }
393
+ let(:bindings) { {:left => '2', :right => '3'} }
394
+
395
+ it 'generates intermediate assert code using bindings' do
396
+ nested_code {|g| g.gen_intermediate_assert action, scope }.
397
+ should == '(2 < 3)'
398
+ end
399
+ end
400
+ end
401
+
402
+ describe '#gen_intermediate_skip' do
403
+
404
+ context 'given an action with no parameters' do
405
+
406
+ let(:action) { SemanticAction['@foo = 2'] }
407
+
408
+ it 'generates intermediate semantic side-effect code' do
409
+ nested_code {|g| g.gen_intermediate_skip action }.
410
+ should == '(@foo = 2)'
411
+ end
412
+ end
413
+
414
+ context 'given an action with parameters' do
415
+
416
+ let(:action) { SemanticAction['|a, b| @foo = a * b'] }
417
+ let(:captures) { ['2', '4'] }
418
+
419
+ it 'generates intermediate semantic side-effect code using captures' do
420
+ nested_code {|g| g.gen_intermediate_skip action, scope }.
421
+ should == '(@foo = 2 * 4)'
422
+ end
423
+ end
424
+
425
+ context 'given an action using labels' do
426
+
427
+ let(:action) { SemanticAction['@foo = left * right'] }
428
+ let(:bindings) { {:left => '2', :right => '1'} }
429
+
430
+ it 'generates intermediate semantic side-effect code using bindings' do
431
+ nested_code {|g| g.gen_intermediate_skip action, scope }.
432
+ should == '(@foo = 2 * 1)'
433
+ end
434
+ end
435
+ end
436
+
437
+ end