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,21 +1,11 @@
1
- #
2
- # = rattler/parsers/sequence.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
-
8
1
  require 'rattler/parsers'
9
2
 
10
3
  module Rattler::Parsers
11
- #
4
+
12
5
  # +Sequence+ combines two or more parsers and matches by trying each one in
13
6
  # sequence and failing unless they all succeed.
14
- #
15
- # @author Jason Arhart
16
- #
17
7
  class Sequence < Parser
18
- include Combining
8
+ include Sequencing
19
9
 
20
10
  # @private
21
11
  def self.parsed(results, *_) #:nodoc:
@@ -25,48 +15,43 @@ module Rattler::Parsers
25
15
  # Try each parser in sequence, and if they all succeed return an array of
26
16
  # captured results, or return +false+ if any parser fails.
27
17
  #
28
- # @param (see Parser#parse_labeled)
18
+ # @param (see Match#parse)
29
19
  #
30
20
  # @return an array of captured results of each parser in sequence, or
31
21
  # +false+
32
- def parse(scanner, rules, scope = {})
33
- parse_and_yield_scope scanner, rules, scope
34
- end
35
-
36
- def parse_and_yield_scope(scanner, rules, scope = {})
37
- pos = scanner.pos
38
- results = []
39
- for child in children
40
- if r = child.parse(scanner, rules, scope) {|_| scope = _ }
41
- results << r unless r == true
42
- else
43
- scanner.pos = pos
44
- return false
22
+ def parse(scanner, rules, scope = ParserScope.empty)
23
+ backtracking(scanner) do
24
+ if scope = parse_children(scanner, rules, scope.nest)
25
+ yield scope if block_given?
26
+ parse_result(scope)
45
27
  end
46
28
  end
47
- yield scope if block_given?
48
- case capture_count
49
- when 0 then true
50
- when 1 then results[0]
51
- else results
52
- end
53
29
  end
54
30
 
55
- # Return a new parser that tries both this parser and +other+ and fails
56
- # unless both parse in sequence.
57
- #
58
- # @param other (see Parser#&)
59
- # @return (see Parser#&)
31
+ # (see Parser#&)
60
32
  def &(other)
61
33
  Sequence[(children + [other])]
62
34
  end
63
35
 
64
- # The number of child parsers that are capturing
65
- #
66
- # @return the number of child parsers that are capturing
36
+ # (see Parser#>>)
37
+ def >>(semantic)
38
+ AttributedSequence[(children + [semantic])]
39
+ end
40
+
41
+ # @return [Fixnum] the number of child parsers that are capturing
67
42
  def capture_count
68
43
  @capture_count ||= count {|_| _.capturing? }
69
44
  end
70
45
 
46
+ private
47
+
48
+ def parse_result(scope)
49
+ case capture_count
50
+ when 0 then true
51
+ when 1 then scope.captures[0]
52
+ else scope.captures
53
+ end
54
+ end
55
+
71
56
  end
72
57
  end
@@ -0,0 +1,40 @@
1
+ require 'rattler/parsers'
2
+
3
+ module Rattler::Parsers
4
+
5
+ # +Sequencing+ describes a parser that combines two or more parsers and
6
+ # matches in sequence.
7
+ module Sequencing
8
+ include Combining
9
+
10
+ # @return +true+
11
+ def sequence?
12
+ true
13
+ end
14
+
15
+ protected
16
+
17
+ # @private
18
+ def backtracking(scanner) #:nodoc:
19
+ pos = scanner.pos
20
+ yield or begin
21
+ scanner.pos = pos
22
+ false
23
+ end
24
+ end
25
+
26
+ # @private
27
+ def parse_children(scanner, rules, scope) #:nodoc:
28
+ for child in children
29
+ if r = child.parse(scanner, rules, scope) {|_| scope = scope.merge _ }
30
+ scope = scope.capture(r) unless r == true
31
+ yield r if block_given?
32
+ else
33
+ return false
34
+ end
35
+ end
36
+ scope
37
+ end
38
+
39
+ end
40
+ end
@@ -1,14 +1,7 @@
1
- #
2
- # = rattler/parsers/skip.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
-
8
1
  require 'rattler/parsers'
9
2
 
10
3
  module Rattler::Parsers
11
- #
4
+
12
5
  # +Skip+ decorates a parser to skip over what it matches without capturing
13
6
  # the results
14
7
  #
@@ -23,20 +16,26 @@ module Rattler::Parsers
23
16
  # If the decorated parser matches return +true+, otherwise return a false
24
17
  # value.
25
18
  #
26
- # @param (see Parser#parse_labeled)
19
+ # @param (see Match#parse)
27
20
  #
28
21
  # @return [Boolean] +true+ if the decorated parser matches at the parse
29
22
  # position
30
- def parse(scanner, rules, scope = {})
31
- child.parse(scanner, rules, scope) && true
23
+ def parse(*args)
24
+ child.parse(*args) && true
32
25
  end
33
26
 
34
- # Always +false+
35
27
  # @return false
28
+ # @see Parser#capturing?
36
29
  def capturing?
37
30
  false
38
31
  end
39
32
 
33
+ # @return true
34
+ # @see Parser#capturing_decidable?
35
+ def capturing_decidable?
36
+ true
37
+ end
38
+
40
39
  # @return (see Parser#skip)
41
40
  def skip
42
41
  self
@@ -0,0 +1,33 @@
1
+ require 'rattler/parsers'
2
+
3
+ module Rattler::Parsers
4
+
5
+ # +Super+ parses by applying the rule of the same name inherited from a
6
+ # super-grammar.
7
+ class Super < Parser
8
+
9
+ # @param [Symbol] rule_name the name of the referenced rule
10
+ #
11
+ # @return [Apply] a new parser that parses by applying the rule
12
+ # referenced by +rule_name+ in a super-grammar
13
+ def self.[](rule_name)
14
+ self.new(:rule_name => rule_name.to_sym)
15
+ end
16
+
17
+ # Apply the parse rule of the same name inherited from a super-grammar.
18
+ #
19
+ # @param (see Match#parse)
20
+ #
21
+ # @return the result of applying parse rule of the same name inherited from
22
+ # a super-grammar
23
+ def parse(scanner, rules, scope = ParserScope.empty)
24
+ rules.inherited_rule(rule_name).parse(scanner, rules, scope)
25
+ end
26
+
27
+ # (see Parser#capturing_decidable?)
28
+ def capturing_decidable?
29
+ false
30
+ end
31
+
32
+ end
33
+ end
@@ -1,28 +1,18 @@
1
- #
2
- # = rattler/parsers/token.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
-
8
1
  require 'rattler/parsers'
9
2
 
10
3
  module Rattler::Parsers
11
- #
4
+
12
5
  # +Token+ decorates a parser to return the entire matched string
13
- #
14
- # @author Jason Arhart
15
- #
16
6
  class Token < Parser
17
7
  include Atomic
18
8
 
19
9
  # If the decorated parser matches return the entire matched string,
20
10
  # otherwise return a false value.
21
11
  #
22
- # @param (see Parser#parse_labeled)
12
+ # @param (see Match#parse)
23
13
  #
24
14
  # @return (see Match#parse)
25
- def parse(scanner, rules, scope = {})
15
+ def parse(scanner, rules, scope = ParserScope.empty)
26
16
  p = scanner.pos
27
17
  child.parse(scanner, rules, scope) && scanner.string[p...(scanner.pos)]
28
18
  end
@@ -0,0 +1,50 @@
1
+ require 'rattler/runner'
2
+ require 'rake'
3
+ require 'rake/tasklib'
4
+
5
+ module Rattler
6
+
7
+ # The rake task to generate parser code from a grammar
8
+ #
9
+ class RakeTask < ::Rake::TaskLib
10
+ include ::Rake::DSL if defined?(::Rake::DSL)
11
+
12
+ attr_accessor :name
13
+ attr_accessor :grammar
14
+ attr_accessor :rtlr_opts
15
+ attr_accessor :verbose
16
+
17
+ def initialize(name = :rattler)
18
+ @name = name
19
+ @grammar = nil
20
+ @rtlr_opts = []
21
+ @verbose = true
22
+
23
+ yield self if block_given?
24
+
25
+ define_task
26
+ end
27
+
28
+ private
29
+
30
+ def define_task
31
+ task name do
32
+ RakeFileUtils.send(:verbose, verbose) do
33
+ ::Rattler::Runner.run(run_args) if valid?
34
+ end
35
+ end
36
+ end
37
+
38
+ def run_args
39
+ [grammar] + rtlr_opts
40
+ end
41
+
42
+ def valid?
43
+ unless grammar
44
+ puts "No grammar specified"
45
+ return false
46
+ end
47
+ true
48
+ end
49
+ end
50
+ end
@@ -1,23 +1,26 @@
1
- #
2
- # = rattler/runner.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
1
  require 'rattler'
8
2
 
9
3
  require 'optparse'
10
4
  require 'pathname'
11
5
 
12
6
  module Rattler
13
- # <tt>Rattler::Runner</tt> defines the command-line parser generator.
7
+ # +Runner+ defines the command-line parser generator.
14
8
  class Runner
15
9
 
16
- ERRNO_USAGE = 1 # Invalid command line arguments
17
- ERRNO_READ_ERROR = 2 # Error reading grammar file
18
- ERRNO_WRITE_ERROR = 3 # Error writing parser file
19
- ERRNO_PARSE_ERROR = 4 # Error parsing grammar
20
- ERRNO_GEN_ERROR = 5 # Error generaing ruby code
10
+ # Invalid command line arguments
11
+ ERRNO_USAGE = 1
12
+
13
+ # Error reading grammar file
14
+ ERRNO_READ_ERROR = 2
15
+
16
+ # Error writing parser file
17
+ ERRNO_WRITE_ERROR = 3
18
+
19
+ # Error parsing grammar
20
+ ERRNO_PARSE_ERROR = 4
21
+
22
+ # Error generaing ruby code
23
+ ERRNO_GEN_ERROR = 5
21
24
 
22
25
  # Run the command-line parser
23
26
  #
@@ -28,9 +31,8 @@ module Rattler
28
31
 
29
32
  # Create a new command-line parser.
30
33
  #
31
- # @param [Array] args the command-line arguments
34
+ # @param [Array<String>] args the command-line arguments
32
35
  def initialize(args)
33
- @standalone = false
34
36
  @optimize = true
35
37
  options.parse!(args)
36
38
  if args.size == 1
@@ -80,11 +82,6 @@ module Rattler
80
82
  @force = f
81
83
  end
82
84
 
83
- opts.on '-s', '--standalone',
84
- 'Optimize for use as a standalone parser' do |s|
85
- @standalone = s
86
- end
87
-
88
85
  opts.on '-n', '--no-optimize',
89
86
  'Disable optimization' do |n|
90
87
  @optimize = n
@@ -99,7 +96,7 @@ module Rattler
99
96
  end
100
97
 
101
98
  def parser
102
- @parser ||= Rattler::Grammar::GrammarParser.new(@srcfname.read)
99
+ @parser ||= Rattler::Compiler::GrammarParser.new(@srcfname.read)
103
100
  end
104
101
 
105
102
  def analyze
@@ -124,11 +121,11 @@ module Rattler
124
121
  end
125
122
 
126
123
  def code_for(g)
127
- Rattler::BackEnd::ParserGenerator.code_for g, generator_options
124
+ Rattler::Compiler::ParserGenerator.code_for g, generator_options
128
125
  end
129
126
 
130
127
  def generator_options
131
- { :standalone => @standalone, :no_optimize => !@optimize }
128
+ { :no_optimize => !@optimize }
132
129
  end
133
130
 
134
131
  def open_output(g)
@@ -1,17 +1,7 @@
1
- #
2
- # = rattler/runtime.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
1
  require 'rattler'
8
2
 
9
3
  module Rattler
10
- #
11
4
  # The +Runtime+ module defines the classes used by concrete parsers.
12
- #
13
- # @author Jason Arhart
14
- #
15
5
  module Runtime
16
6
  autoload :Parser, 'rattler/runtime/parser'
17
7
  autoload :RecursiveDescentParser, 'rattler/runtime/recursive_descent_parser'
@@ -1,20 +1,10 @@
1
- #
2
- # = rattler/runtime/extended_packrat_parser.rb
3
- #
4
- # Author:: Jason Arhart
5
- # Documentation:: Author
6
- #
7
-
8
1
  require 'rattler/runtime'
9
2
 
10
3
  module Rattler::Runtime
11
- #
4
+
12
5
  # +ExtendedPackratParser+ implements the algorithm described by Alessandro
13
6
  # Warth, James R. Douglass, and Todd Millstein for extending packrat parsing
14
7
  # to support left-recursive grammars.
15
- #
16
- # @author Jason Arhart
17
- #
18
8
  class ExtendedPackratParser < PackratParser
19
9
 
20
10
  # Create a new extended packrat parser to parse +source+.
@@ -28,47 +18,52 @@ module Rattler::Runtime
28
18
  @lr_stack = []
29
19
  end
30
20
 
31
- def apply(rule_name)
21
+ # Apply a rule by dispatching to the given match method. The result of
22
+ # applying the rule is memoized so that the match method is invoked at most
23
+ # once at a given parse position.
24
+ #
25
+ # @param (see PackratParser#apply)
26
+ # @return (see PackratParser#apply)
27
+ #
28
+ def apply(match_method_name)
32
29
  start_pos = @scanner.pos
33
- if m = memo_lr(rule_name, start_pos)
34
- recall m, rule_name
30
+ if m = memo_lr(match_method_name, start_pos)
31
+ recall m, match_method_name
35
32
  else
36
- lr = LR.new(false, rule_name, nil)
33
+ lr = LR.new(false, match_method_name, nil)
37
34
  @lr_stack.push lr
38
- m = inject_memo rule_name, start_pos, lr, start_pos
39
- result = eval_rule rule_name
35
+ m = inject_memo match_method_name, start_pos, lr, start_pos
36
+ result = eval_rule match_method_name
40
37
  @lr_stack.pop
41
38
  if lr.head
42
39
  m.end_pos = @scanner.pos
43
40
  lr.seed = result
44
- lr_answer rule_name, start_pos, m
41
+ lr_answer match_method_name, start_pos, m
45
42
  else
46
43
  save m, result
47
44
  end
48
45
  end
49
46
  end
50
47
 
51
- alias_method :memoize_lr, :apply
52
-
53
48
  private
54
49
 
55
50
  # @private
56
- def memo_lr(rule_name, start_pos) #:nodoc:
57
- m = memo(rule_name, start_pos)
51
+ def memo_lr(match_method_name, start_pos) #:nodoc:
52
+ m = memo(match_method_name, start_pos)
58
53
  head = @heads[start_pos] or return m
59
- if !m && !head.involves?(rule_name)
60
- return inject_fail rule_name, start_pos
54
+ if !m && !head.involves?(match_method_name)
55
+ return inject_fail match_method_name, start_pos
61
56
  end
62
- if head.eval_set.delete(rule_name)
63
- save m, eval_rule(rule_name)
57
+ if head.eval_set.delete(match_method_name)
58
+ save m, eval_rule(match_method_name)
64
59
  end
65
60
  return m
66
61
  end
67
62
 
68
63
  # @private
69
- def recall(m, rule_name) #:nodoc:
64
+ def recall(m, match_method_name) #:nodoc:
70
65
  if (result = m.result).is_a? LR
71
- setup_lr rule_name, result
66
+ setup_lr match_method_name, result
72
67
  result.seed
73
68
  else
74
69
  super
@@ -76,34 +71,34 @@ module Rattler::Runtime
76
71
  end
77
72
 
78
73
  # @private
79
- def setup_lr(rule_name, lr) #:nodoc:
80
- lr.head ||= Head.new(rule_name)
74
+ def setup_lr(match_method_name, lr) #:nodoc:
75
+ lr.head ||= Head.new(match_method_name)
81
76
  @lr_stack.reverse_each do |_|
82
77
  return if _.head == lr.head
83
- lr.head.involved_set[_.rule_name] = _.rule_name
78
+ lr.head.involved_set[_.match_method_name] = _.match_method_name
84
79
  end
85
80
  end
86
81
 
87
82
  # @private
88
- def lr_answer(rule_name, start_pos, m) #:nodoc:
83
+ def lr_answer(match_method_name, start_pos, m) #:nodoc:
89
84
  head = m.result.head
90
- if head.rule_name == rule_name
91
- grow_lr(rule_name, start_pos, m, head) if m.result = m.result.seed
85
+ if head.match_method_name == match_method_name
86
+ grow_lr(match_method_name, start_pos, m, head) if m.result = m.result.seed
92
87
  else
93
88
  save m, m.result.seed
94
89
  end
95
90
  end
96
91
 
97
92
  # @private
98
- def grow_lr(rule_name, start_pos, m, head) #:nodoc:
93
+ def grow_lr(match_method_name, start_pos, m, head) #:nodoc:
99
94
  @heads[start_pos] = head
100
95
  loop do
101
96
  @scanner.pos = start_pos
102
97
  head.eval_set.replace(head.involved_set)
103
- result = eval_rule(rule_name)
98
+ result = eval_rule(match_method_name)
104
99
  if !result or @scanner.pos <= m.end_pos
105
100
  @heads.delete(start_pos)
106
- return recall m, rule_name
101
+ return recall m, match_method_name
107
102
  end
108
103
  save m, result
109
104
  end
@@ -111,24 +106,24 @@ module Rattler::Runtime
111
106
 
112
107
  # @private
113
108
  class LR #:nodoc:
114
- def initialize(seed, rule_name, head)
109
+ def initialize(seed, match_method_name, head)
115
110
  @seed = seed
116
- @rule_name = rule_name
111
+ @match_method_name = match_method_name
117
112
  @head = head
118
113
  end
119
- attr_accessor :seed, :rule_name, :head
114
+ attr_accessor :seed, :match_method_name, :head
120
115
  end
121
116
 
122
117
  # @private
123
118
  class Head #:nodoc:
124
- def initialize(rule_name)
125
- @rule_name = rule_name
119
+ def initialize(match_method_name)
120
+ @match_method_name = match_method_name
126
121
  @involved_set = {}
127
122
  @eval_set = {}
128
123
  end
129
- attr_accessor :rule_name, :involved_set, :eval_set
130
- def involves?(rule_name)
131
- rule_name == self.rule_name or involved_set.has_key? rule_name
124
+ attr_accessor :match_method_name, :involved_set, :eval_set
125
+ def involves?(match_method_name)
126
+ match_method_name == self.match_method_name or involved_set.has_key? match_method_name
132
127
  end
133
128
  end
134
129