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
@@ -29,6 +29,12 @@ describe Rattler::Parsers::BackReference do
29
29
  end
30
30
  end
31
31
 
32
+ describe '#capturing_decidable?' do
33
+ it 'is true' do
34
+ subject.should be_capturing_decidable
35
+ end
36
+ end
37
+
32
38
  describe '#re_source' do
33
39
  it 'returns the source for a Regexp that will match the referenced result' do
34
40
  subject.re_source(:a => 'r0').should == '#{r0}'
@@ -34,7 +34,6 @@ describe Choice do
34
34
  end
35
35
  end
36
36
  end
37
-
38
37
  end
39
38
 
40
39
  describe '#capturing?' do
@@ -56,7 +55,45 @@ describe Choice do
56
55
  subject.should_not be_capturing
57
56
  end
58
57
  end
58
+ end
59
+
60
+ describe '#capturing_decidable?' do
61
+
62
+ context 'with all decidably capturing parsers' do
63
+
64
+ let(:nested) { [Match[/a/], Match[/b/]] }
65
+
66
+ it 'is true' do
67
+ subject.should be_capturing_decidable
68
+ end
69
+ end
70
+
71
+ context 'with all decidably non-capturing parsers' do
72
+
73
+ let(:nested) { [Skip[Match[/a/]], Skip[Match[/b/]]] }
74
+
75
+ it 'is true' do
76
+ subject.should be_capturing_decidable
77
+ end
78
+ end
79
+
80
+ context 'with any non-capturing_decidable parsers' do
81
+
82
+ let(:nested) { [Match[/a/], Apply[:a]] }
59
83
 
84
+ it 'is false' do
85
+ subject.should_not be_capturing_decidable
86
+ end
87
+ end
88
+
89
+ context 'with both decidably capturing and decidably non-capturing parsers' do
90
+
91
+ let(:nested) { [Match[/a/], Skip[Match[/b/]]] }
92
+
93
+ it 'is false' do
94
+ subject.should_not be_capturing_decidable
95
+ end
96
+ end
60
97
  end
61
98
 
62
99
  describe '#with_ws' do
@@ -8,7 +8,8 @@ describe Rattler::Parsers::CombinatorParser do
8
8
  it_behaves_like 'a recursive descent parser'
9
9
 
10
10
  let :parser_class do
11
- Rattler::Parsers::CombinatorParser.as_class(grammar.start_rule, grammar.rules)
11
+ Rattler::Parsers::CombinatorParser.as_class(
12
+ grammar.rules[grammar.start_rule], grammar.rules)
12
13
  end
13
14
 
14
15
  end
@@ -24,8 +24,44 @@ describe Disallow do
24
24
  end
25
25
 
26
26
  describe '#capturing?' do
27
- it 'is false' do
28
- subject.should_not be_capturing
27
+
28
+ context 'with a capturing parser' do
29
+
30
+ let(:nested) { Match[/\w+/] }
31
+
32
+ it 'is false' do
33
+ subject.should_not be_capturing
34
+ end
35
+ end
36
+
37
+ context 'with a non-capturing parser' do
38
+
39
+ let(:nested) { Skip[Match[/\w+/]] }
40
+
41
+ it 'is false' do
42
+ subject.should_not be_capturing
43
+ end
44
+ end
45
+ end
46
+
47
+ describe '#capturing_decidable?' do
48
+
49
+ context 'with a decidably capturing parser' do
50
+
51
+ let(:nested) { Match[/\w+/] }
52
+
53
+ it 'is true' do
54
+ subject.should be_capturing_decidable
55
+ end
56
+ end
57
+
58
+ context 'with a non capturing_decidable parser' do
59
+
60
+ let(:nested) { Apply[:foo] }
61
+
62
+ it 'is true' do
63
+ subject.should be_capturing_decidable
64
+ end
29
65
  end
30
66
  end
31
67
 
@@ -18,6 +18,12 @@ describe ESymbol do
18
18
  end
19
19
  end
20
20
 
21
+ describe '#capturing_decidable?' do
22
+ it 'is true' do
23
+ subject.should be_capturing_decidable
24
+ end
25
+ end
26
+
21
27
  describe '#with_ws' do
22
28
 
23
29
  let(:ws) { Match[/\s*/] }
@@ -27,6 +27,12 @@ describe Eof do
27
27
  end
28
28
  end
29
29
 
30
+ describe '#capturing_decidable?' do
31
+ it 'is true' do
32
+ subject.should be_capturing_decidable
33
+ end
34
+ end
35
+
30
36
  describe '#with_ws' do
31
37
 
32
38
  let(:ws) { Match[/\s*/] }
@@ -19,4 +19,10 @@ describe Rattler::Parsers::Fail do
19
19
  end
20
20
  end
21
21
 
22
+ describe '#capturing_decidable?' do
23
+ it 'is true' do
24
+ subject.should be_capturing_decidable
25
+ end
26
+ end
27
+
22
28
  end
@@ -2,35 +2,30 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  include Rattler::Parsers
4
4
 
5
- describe Rattler::Grammar::Grammar do
5
+ describe Grammar do
6
6
 
7
7
  let(:rules) { RuleSet[rule_a, rule_b] }
8
8
 
9
- let :rule_a do
10
- Rule[:a, Choice[
11
- Match['a'],
12
- Apply[:b]
13
- ]]
14
- end
9
+ let(:rule_a) { Rule[:a, Match['a'] | Apply[:b]] }
15
10
 
16
11
  let(:rule_b) { Rule[:b, Match['b']] }
17
12
 
18
13
  describe '#start_rule' do
19
14
  context 'when no start_rule option was specified' do
20
15
 
21
- subject { Rattler::Grammar::Grammar.new(rules) }
16
+ subject { Grammar.new(rules) }
22
17
 
23
- it 'returns the first rule' do
24
- subject.start_rule.should == rule_a
18
+ it 'returns the name of the first rule' do
19
+ subject.start_rule.should == :a
25
20
  end
26
21
  end
27
22
 
28
23
  context 'when an explicit start_rule option was specified' do
29
24
 
30
- subject { Rattler::Grammar::Grammar.new(rules, :start_rule => :b) }
25
+ subject { Grammar.new(rules, :start_rule => :b) }
31
26
 
32
- it 'uses the specified start_rule option' do
33
- subject.start_rule.should == rule_b
27
+ it 'returns the specified start_rule option' do
28
+ subject.start_rule.should == :b
34
29
  end
35
30
  end
36
31
  end
@@ -38,7 +33,7 @@ describe Rattler::Grammar::Grammar do
38
33
  describe '#rules' do
39
34
  context 'when no start_rule option was specified' do
40
35
 
41
- subject { Rattler::Grammar::Grammar.new(rules) }
36
+ subject { Grammar.new(rules) }
42
37
 
43
38
  it 'returns rules with the default start_rule' do
44
39
  subject.rules.start_rule.should == :a
@@ -47,7 +42,7 @@ describe Rattler::Grammar::Grammar do
47
42
 
48
43
  context 'when an explicit start_rule option was specified' do
49
44
 
50
- subject { Rattler::Grammar::Grammar.new(rules, :start_rule => :b) }
45
+ subject { Grammar.new(rules, :start_rule => :b) }
51
46
 
52
47
  it 'returns rules with the specified start_rule option' do
53
48
  subject.rules.start_rule.should == :b
@@ -40,6 +40,36 @@ describe Label do
40
40
 
41
41
  end
42
42
 
43
+ describe '#capturing_decidable?' do
44
+
45
+ context 'with a decidably capturing parser' do
46
+
47
+ let(:nested) { Match[/\w+/] }
48
+
49
+ it 'is true' do
50
+ subject.should be_capturing_decidable
51
+ end
52
+ end
53
+
54
+ context 'with a decidably non-capturing parser' do
55
+
56
+ let(:nested) { Skip[Match[/\w+/]] }
57
+
58
+ it 'is true' do
59
+ subject.should be_capturing_decidable
60
+ end
61
+ end
62
+
63
+ context 'with a non capturing_decidable parser' do
64
+
65
+ let(:nested) { Apply[:foo] }
66
+
67
+ it 'is false' do
68
+ subject.should_not be_capturing_decidable
69
+ end
70
+ end
71
+ end
72
+
43
73
  describe '#with_ws' do
44
74
 
45
75
  let(:ws) { Match[/\s*/] }
@@ -6,6 +6,7 @@ describe ListParser do
6
6
  subject { ListParser[term_parser, sep_parser, *bounds] }
7
7
 
8
8
  let(:sep_parser) { Match[/[,;]/] }
9
+ let(:bounds) { [0, nil] }
9
10
 
10
11
  describe '#parse' do
11
12
 
@@ -149,8 +150,6 @@ describe ListParser do
149
150
 
150
151
  describe '#capturing?' do
151
152
 
152
- let(:bounds) { [2, 4] }
153
-
154
153
  context 'with a capturing term parser' do
155
154
 
156
155
  let(:term_parser) { Match[/\w+/] }
@@ -170,6 +169,36 @@ describe ListParser do
170
169
  end
171
170
  end
172
171
 
172
+ describe '#capturing_decidable?' do
173
+
174
+ context 'with a decidably capturing parser' do
175
+
176
+ let(:term_parser) { Match[/\w+/] }
177
+
178
+ it 'is true' do
179
+ subject.should be_capturing_decidable
180
+ end
181
+ end
182
+
183
+ context 'with a decidably non-capturing parser' do
184
+
185
+ let(:term_parser) { Skip[Match[/\w+/]] }
186
+
187
+ it 'is true' do
188
+ subject.should be_capturing_decidable
189
+ end
190
+ end
191
+
192
+ context 'with a non-capturing_decidable parser' do
193
+
194
+ let(:term_parser) { Apply[:foo] }
195
+
196
+ it 'is false' do
197
+ subject.should_not be_capturing_decidable
198
+ end
199
+ end
200
+ end
201
+
173
202
  describe '#with_ws' do
174
203
 
175
204
  let(:ws) { Match[/\s*/] }
@@ -28,6 +28,12 @@ describe Rattler::Parsers::Match do
28
28
  end
29
29
  end
30
30
 
31
+ describe '#capturing_decidable?' do
32
+ it 'is true' do
33
+ subject.should be_capturing_decidable
34
+ end
35
+ end
36
+
31
37
  describe '#with_ws' do
32
38
 
33
39
  let(:ws) { Match[/\s*/] }
@@ -0,0 +1,121 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ include Rattler::Runtime
4
+
5
+ describe NodeAction do
6
+ include CombinatorParserSpecHelper
7
+
8
+ describe '#parse' do
9
+
10
+ subject { NodeAction['Rattler::Runtime::ParseNode'] }
11
+
12
+ let(:scope) { ParserScope.new(bindings, captures) }
13
+
14
+ let(:bindings) { {} }
15
+ let(:captures) { [] }
16
+
17
+ context 'with no bindings or captures' do
18
+ it 'returns an empty node without advancing' do
19
+ parsing('anything').at(4).should result_in(ParseNode.parsed([])).at(4)
20
+ end
21
+ end
22
+
23
+ context 'with a single capture' do
24
+
25
+ let(:captures) { ['foo'] }
26
+
27
+ it 'returns a node with the capture' do
28
+ parsing('anything').should result_in ParseNode.parsed(['foo'])
29
+ end
30
+ end
31
+
32
+ context 'with multiple captures' do
33
+
34
+ let(:captures) { ['foo', 'bar'] }
35
+
36
+ it 'returns a node with the captures' do
37
+ parsing('anything').should result_in ParseNode.parsed(['foo', 'bar'])
38
+ end
39
+ end
40
+
41
+ context 'with bindings' do
42
+
43
+ let(:bindings) { {:a => 'foo', :b => 'bar'} }
44
+
45
+ it 'returns a node with the bindings as the :labeled attribute' do
46
+ parsing('anything').should result_in(
47
+ ParseNode.parsed([], :labeled => {:a => 'foo', :b => 'bar'})
48
+ )
49
+ end
50
+ end
51
+
52
+ context 'when the action has node attributes' do
53
+
54
+ subject { NodeAction['Rattler::Runtime::ParseNode',
55
+ {:node_attrs => {:name => "FOO"}}] }
56
+
57
+ it 'returns a node with the attributes' do
58
+ parsing('anything').should result_in(
59
+ ParseNode.parsed([], :name => "FOO")
60
+ )
61
+ end
62
+ end
63
+ end
64
+
65
+ describe '#capturing?' do
66
+ it 'is true' do
67
+ NodeAction['Expr'].should be_capturing
68
+ end
69
+ end
70
+
71
+ describe '#capturing_decidable?' do
72
+ it 'is true' do
73
+ NodeAction['Expr'].should be_capturing_decidable
74
+ end
75
+ end
76
+
77
+ describe '#with_ws' do
78
+
79
+ subject { NodeAction['Expr'] }
80
+
81
+ let(:ws) { Match[/\s*/] }
82
+
83
+ it 'returns the action unchanged' do
84
+ subject.with_ws(ws).should == subject
85
+ end
86
+ end
87
+
88
+ describe '.parsed' do
89
+
90
+ subject { NodeAction.parsed(results, {}) }
91
+
92
+ context 'given all empty parse results' do
93
+
94
+ let(:results) { [[], []] }
95
+
96
+ it 'creates a NodeAction with the default node_type of ParseNode' do
97
+ subject.should == NodeAction['Rattler::Runtime::ParseNode']
98
+ end
99
+ end
100
+
101
+ context 'given a node_type result' do
102
+
103
+ let(:results) { [[['Expr', []]], []]}
104
+
105
+ it 'creates a NodeAction with the node_type' do
106
+ subject.should == NodeAction['Expr']
107
+ end
108
+ end
109
+
110
+ context 'given a name result' do
111
+
112
+ let(:results) { [[], ['"FOO"']] }
113
+
114
+ it 'creates a NodeAction with node_attrs for the name' do
115
+ subject.should == NodeAction['Rattler::Runtime::ParseNode',
116
+ {:node_attrs => {:name => 'FOO'}}]
117
+ end
118
+ end
119
+ end
120
+
121
+ end