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,28 +1,17 @@
1
- #
2
- # = rattler/util/graphviz.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
1
  require 'rattler/util'
8
2
 
9
3
  module Rattler::Util
10
- #
11
- # The +GraphViz+ provides utilities to build GraphViz objects representing
12
- # trees of nodes.
13
- #
14
- # @author Jason Arhart
15
- #
4
+
5
+ # +GraphViz+ provides utilities to build GraphViz objects representing trees
6
+ # of nodes.
16
7
  module GraphViz
17
8
 
18
9
  autoload :DigraphBuilder, 'rattler/util/graphviz/digraph_builder'
19
10
  autoload :NodeBuilder, 'rattler/util/graphviz/node_builder'
20
11
 
21
- # Return a new +GraphViz+ digraph object representing +root+.
22
- #
23
- # @return a new +GraphViz+ digraph object representing +root+
24
- def self.digraph(root)
25
- DigraphBuilder.digraph(root)
12
+ # (see DigraphBuilder.digraph)
13
+ def self.digraph(root, name='G')
14
+ DigraphBuilder.digraph(root, name)
26
15
  end
27
16
 
28
17
  end
@@ -1,10 +1,3 @@
1
- #
2
- # = rattler/util/graphviz/digraph_builder.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
-
8
1
  begin
9
2
  require 'graphviz'
10
3
  rescue LoadError => e
@@ -14,28 +7,27 @@ end
14
7
  require 'rattler/util/graphviz'
15
8
 
16
9
  module Rattler::Util::GraphViz
17
- #
10
+
18
11
  # +DigraphBuilder+ is used to build GraphViz objects representing trees of
19
12
  # nodes.
20
- #
21
- # @author Jason Arhart
22
- #
23
13
  class DigraphBuilder
14
+ include NodeBuilder
24
15
 
25
- # Return a new +GraphViz+ digraph object representing +root+.
26
- #
16
+ # @param (see #initialize)
27
17
  # @return a new +GraphViz+ digraph object representing +root+
28
18
  def self.digraph(root, name='G')
29
19
  self.new(root, name).digraph
30
20
  end
31
21
 
32
22
  # Create a new digraph builder for +root+.
23
+ #
24
+ # @param root the root node
25
+ # @param [String] name the name of the graph
33
26
  def initialize(root, name='G')
34
27
  @root = root
35
28
  @g = ::GraphViz.digraph(name)
36
29
  @nodes = {}
37
30
  @node_serial = 0
38
- @node_builder = NodeBuilder.new
39
31
  end
40
32
 
41
33
  # @return a new +GraphViz+ digraph object representing the root object
@@ -49,12 +41,13 @@ module Rattler::Util::GraphViz
49
41
  # Return a <tt>GraphViz::Node</tt> object for +o+. Multiple requests with
50
42
  # the same object return the same node object.
51
43
  #
52
- # @return a <tt>GraphViz::Node</tt> object for +o+
44
+ # @param o an object
45
+ # @return [GraphViz::Node] a node object for +o+
53
46
  def node(o)
54
47
  @nodes.fetch(o.object_id) do
55
- new_node = @g.add_node new_node_name, @node_builder.node_options(o)
48
+ new_node = @g.add_nodes new_node_name, node_options(o)
56
49
  @nodes[o.object_id] = new_node
57
- @node_builder.each_child_of(o) {|_| new_node << node(_) }
50
+ each_child_node_of(o) {|_| new_node << node(_) }
58
51
  new_node
59
52
  end
60
53
  end
@@ -1,23 +1,18 @@
1
- #
2
- # = rattler/util/graphviz/node_builder.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
1
  require 'rattler/util/graphviz'
8
2
 
9
3
  module Rattler::Util::GraphViz
10
- #
11
- # +NodeBuilder+ is used by +DigraphBuilder+ to build nodes for a GraphViz
4
+
5
+ # +NodeBuilder+ is used by {DigraphBuilder} to build nodes for a GraphViz
12
6
  # digraph object representing a tree of nodes.
13
- #
14
- # @author Jason Arhart
15
- #
16
- class NodeBuilder
17
-
18
- # Yield any children of +o+ that should be represented as separate nodes in
19
- # the graph.
20
- def each_child_of(o)
7
+ module NodeBuilder
8
+
9
+ # Run the block with any children of +o+ that should be represented as
10
+ # separate nodes in the graph.
11
+ #
12
+ # @param o an object
13
+ # @yield [child] each child of +o+ that should be represented as a separate
14
+ # node in the graph
15
+ def each_child_node_of(o)
21
16
  if array_like? o and not record_like? o
22
17
  if o.respond_to? :to_hash
23
18
  o.each {|k, v| yield Mapping.new(k, v) }
@@ -27,13 +22,13 @@ module Rattler::Util::GraphViz
27
22
  end
28
23
  end
29
24
 
30
- # Return the options for a node representing +o+.
25
+ # @param o an object
31
26
  # @return the options for a node representing +o+.
32
27
  def node_options(o)
33
28
  { :shape => node_shape(o), :label => node_label(o) }
34
29
  end
35
30
 
36
- # Return the shape option for a node representing +o+.
31
+ # @param o an object
37
32
  # @return the shape option for a node representing +o+.
38
33
  def node_shape(o)
39
34
  case o
@@ -46,7 +41,7 @@ module Rattler::Util::GraphViz
46
41
  end
47
42
  end
48
43
 
49
- # Return the label option for a node representing +o+.
44
+ # @param o an object
50
45
  # @return the label option for a node representing +o+.
51
46
  def node_label(o)
52
47
  if o.is_a? ::Rattler::Util::Node
@@ -56,29 +51,30 @@ module Rattler::Util::GraphViz
56
51
  elsif array_like? o
57
52
  type_label(o)
58
53
  elsif o.respond_to? :to_str
59
- "\"#{o}\""
54
+ string_label(o)
60
55
  else
61
56
  o.inspect
62
57
  end
63
58
  end
64
59
 
65
- def type_label(o)
66
- case o
67
- when Hash then '\\{\\}'
68
- when Array then '\\[\\]'
69
- when Mapping then '-&gt;'
70
- else o.respond_to?(:name) ? o.name : o.class.name
71
- end
60
+ # @param o an object
61
+ # @return whether +o+ should be represented as a record
62
+ def record_like?(o)
63
+ o.respond_to? :each_pair and
64
+ o.none? {|k, v| array_like? v or record_like? v }
72
65
  end
73
66
 
67
+ # @param o an object
68
+ # @return whether +o+ should be represented as an array
74
69
  def array_like?(o)
75
70
  o.respond_to? :each and
76
71
  not o.respond_to? :to_str
77
72
  end
78
73
 
79
- def record_like?(o)
80
- o.respond_to? :each_pair and
81
- o.none? {|k, v| array_like? v or record_like? v }
74
+ private
75
+
76
+ def string_label(s)
77
+ "\"#{s}\""
82
78
  end
83
79
 
84
80
  def record_label(o, fields)
@@ -86,7 +82,24 @@ module Rattler::Util::GraphViz
86
82
  end
87
83
 
88
84
  def hash_content_labels(h)
89
- h.map {|pair| '{' + pair.map {|_| _.inspect }.join('|') + '}' }
85
+ h.map {|k, v| "{#{k.inspect}|#{record_value v}}" }
86
+ end
87
+
88
+ def record_value(v)
89
+ if v.respond_to? :to_str
90
+ string_label(v)
91
+ else
92
+ v.inspect
93
+ end.gsub(/([|<>\\])/) { "\\#{$1}" }
94
+ end
95
+
96
+ def type_label(o)
97
+ case o
98
+ when Hash then '\\{\\}'
99
+ when Array then '\\[\\]'
100
+ when Mapping then '-&gt;'
101
+ else o.respond_to?(:name) ? o.name : o.class.name
102
+ end
90
103
  end
91
104
 
92
105
  def parse_node_fields(attrs)
@@ -106,5 +119,6 @@ module Rattler::Util::GraphViz
106
119
  end
107
120
  end
108
121
 
122
+ extend self
109
123
  end
110
124
  end
@@ -1,27 +1,18 @@
1
- #
2
- # = rattler/util/line_counter.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
1
  require 'rattler/util'
8
2
 
9
3
  module Rattler::Util
10
- #
4
+
11
5
  # A +LineCounter+ takes a linear index into text and calculates line and
12
6
  # column numbers.
13
- #
14
- # @author Jason Arhart
15
- #
16
7
  class LineCounter
17
-
8
+
18
9
  # @private
19
10
  @@newline = "\n" #:nodoc:
20
-
11
+
21
12
  # @private
22
13
  @@tab = "\t" #:nodoc:
23
-
24
- # Create a <tt>Rattler::Util::LineCounter</tt> object for +source+.
14
+
15
+ # Create a +LineCounter+ object for +source+.
25
16
  #
26
17
  # @param [String] source the text in which to count lines
27
18
  # @param [Hash] options any optional options for the line counter
@@ -31,7 +22,7 @@ module Rattler::Util
31
22
  @source = source
32
23
  @tab_size = options[:tab_size] || 8
33
24
  end
34
-
25
+
35
26
  # Return the line number of the character at +index+.
36
27
  #
37
28
  # @param [Integer] index the (0-based) index into the text
@@ -40,7 +31,7 @@ module Rattler::Util
40
31
  count(index)
41
32
  return @line
42
33
  end
43
-
34
+
44
35
  # Return the column number of the character at +index+. When a _tab_
45
36
  # character is encountered the next tab stop is used for the column
46
37
  # number of the character following the _tab_ character.
@@ -51,9 +42,9 @@ module Rattler::Util
51
42
  count(index)
52
43
  return @column
53
44
  end
54
-
45
+
55
46
  private
56
-
47
+
57
48
  def count(index)
58
49
  unless @index == index
59
50
  @index = index
@@ -69,10 +60,10 @@ module Rattler::Util
69
60
  end
70
61
  end
71
62
  end
72
-
63
+
73
64
  def next_tab_stop
74
65
  ((@column - 1) / @tab_size + 1) * @tab_size + 1
75
66
  end
76
-
67
+
77
68
  end
78
69
  end
@@ -1,48 +1,33 @@
1
- #
2
- # = rattler/util/node.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
1
  require 'rattler/util'
8
2
 
9
3
  module Rattler::Util
10
- #
4
+
11
5
  # A +Node+ is a node that can be used as-is to compose tree structures or
12
- # as a base class for nodes. It is the base class used for all tree
13
- # structures in the +Rattler+ framework.
14
- #
15
- # @author Jason Arhart
16
- #
6
+ # as a base class for user-defined node types. It is the base class used for
7
+ # all tree structures in the +Rattler+ framework.
17
8
  class Node
18
9
  include Enumerable
19
10
 
20
- # Create a +Node+ object.
21
- #
22
- # @return [Node]
23
- #
24
11
  # @overload Node.[]()
25
- # @return [Node]
12
+ # @return [Node] a +Node+ object with no children or attributes
26
13
  # @overload Node.[](child...)
27
- # @return [Node]
14
+ # @return [Node] a +Node+ object with children and no attributes
28
15
  # @overload Node.[](attribute...)
29
- # @return [Node]
16
+ # @return [Node] a +Node+ object with attributes and no children
30
17
  # @overload Node.[](child..., attribute...)
31
- # @return [Node]
18
+ # @return [Node] a +Node+ object with children and attributes
32
19
  def self.[](*args)
33
20
  self.new(*args)
34
21
  end
35
22
 
36
- # Create a +Node+ object.
37
- #
38
23
  # @overload initialize()
39
- # @return [Node]
24
+ # Create a +Node+ object with no children or attributes.
40
25
  # @overload initialize(child...)
41
- # @return [Node]
26
+ # Create a +Node+ object with children and no attributes.
42
27
  # @overload initialize(attribute...)
43
- # @return [Node]
28
+ # Create a +Node+ object with attributes and no children.
44
29
  # @overload initialize(child..., attribute...)
45
- # @return [Node]
30
+ # Create a +Node+ object with children and attributes.
46
31
  def initialize(*args)
47
32
  @attrs = args.last.respond_to?(:to_hash) ? args.pop : {}
48
33
  @__children__ = args
@@ -95,16 +80,25 @@ module Rattler::Util
95
80
  block_given? ? children.each { |_| yield _ } : children.each
96
81
  end
97
82
 
83
+ # @param [Array] new_children a new array of children
84
+ # @return [Node] a new code with the new children replacing the node's
85
+ # children
98
86
  def with_children(new_children)
99
87
  self.class.new(new_children, attrs)
100
88
  end
101
89
 
102
90
  alias_method :with_child, :with_children
103
91
 
92
+ # @param (see #new_attrs!)
93
+ # @return [Node] a new node with the new attributes added to the node's
94
+ # attributes
104
95
  def with_attrs(new_attrs)
105
96
  self.with_attrs!(attrs.merge new_attrs)
106
97
  end
107
98
 
99
+ # @param [Hash] new_attrs a new set of attributes
100
+ # @return [Node] a new node with the new attributes replacing the node's
101
+ # attributes
108
102
  def with_attrs!(new_attrs)
109
103
  self.class.new(children, new_attrs)
110
104
  end
@@ -119,18 +113,14 @@ module Rattler::Util
119
113
  # Access the node's children as if the node were an array of its children.
120
114
  #
121
115
  # @overload [](index)
122
- # Return the node's child at +index+.
123
116
  # @param [Integer] index index of the child
124
117
  # @return the child at +index+
125
118
  # @overload [](start, length)
126
- # Return an array of the node's children starting at +start+ and
127
- # continuing for +length+ children.
128
119
  # @param [Integer] start the index of the first child
129
120
  # @param [Integer] length the number of children to return
130
121
  # @return [Array] the node's children starting at +start+ and
131
122
  # continuing for +length+ children
132
123
  # @overload [](range)
133
- # Return an array of the node's children specified by +range+.
134
124
  # @param [Range] range the range of children
135
125
  # @return [Array] the node's children specified by +range+
136
126
  def [](*args)
@@ -186,9 +176,41 @@ module Rattler::Util
186
176
  ']'
187
177
  end
188
178
 
179
+ # @private
180
+ def pretty_print(q) #:nodoc:
181
+ pretty_print_name(q)
182
+ q.group(1, '[', ']') do
183
+ q.breakable('')
184
+ q.seplist(children) {|_| q.pp _ }
185
+ q.comma_breakable unless children.empty? or pretty_keys.empty?
186
+ q.seplist(pretty_keys) do |k|
187
+ q.pp k
188
+ q.text '=>'
189
+ q.pp attrs[k]
190
+ end
191
+ end
192
+ end
193
+
194
+ # @private
195
+ def pretty_print_cycle(q) #:nodoc:
196
+ pretty_print_name(q)
197
+ end
198
+
199
+ # @return a new +GraphViz+ digraph object representing the node
189
200
  def to_graphviz
190
201
  Rattler::Util::GraphViz.digraph(self)
191
202
  end
192
203
 
204
+ private
205
+
206
+ def pretty_print_name(q)
207
+ q.text(self.class.name)
208
+ q.text("<#{self.name.inspect}>") if attrs.has_key?(:name)
209
+ end
210
+
211
+ def pretty_keys
212
+ @pretty_keys ||= attrs.keys.reject {|_| _ == :name }.sort_by {|_| _.to_s }
213
+ end
214
+
193
215
  end
194
216
  end