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,6 +1,6 @@
1
- require 'rattler/back_end/parser_generator'
1
+ require 'rattler/compiler/parser_generator'
2
2
 
3
- module Rattler::BackEnd::ParserGenerator
3
+ module Rattler::Compiler::ParserGenerator
4
4
 
5
5
  # @private
6
6
  class SkipGenerator < ExprGenerator #:nodoc:
@@ -8,25 +8,11 @@ module Rattler::BackEnd::ParserGenerator
8
8
  include TokenPropogating
9
9
  include SkipPropogating
10
10
 
11
- def gen_basic(skip, scope={})
11
+ def gen_basic(skip, scope = ParserScope.empty)
12
12
  generate skip.child, :skip, scope
13
13
  end
14
14
 
15
- def gen_dispatch_action(skip, code, scope={})
16
- expr :block do
17
- gen_intermediate_skip skip, scope
18
- (@g << ' &&').newline << code.bind(scope, '[]')
19
- end
20
- end
21
-
22
- def gen_direct_action(skip, code, scope={})
23
- expr :block do
24
- gen_intermediate_skip skip, scope
25
- (@g << ' &&').newline << '(' << code.bind(scope, []) << ')'
26
- end
27
- end
28
-
29
- def gen_intermediate(skip, scope={})
15
+ def gen_intermediate(skip, scope = ParserScope.empty)
30
16
  gen_intermediate_skip skip, scope
31
17
  end
32
18
 
@@ -0,0 +1,16 @@
1
+ require 'rattler/compiler/parser_generator'
2
+
3
+ module Rattler::Compiler::ParserGenerator
4
+ # @private
5
+ module SkipPropogating #:nodoc:
6
+
7
+ def gen_skip(parser, scope = ParserScope.empty)
8
+ propogate_gen parser.child, :skip, scope
9
+ end
10
+
11
+ def gen_intermediate_skip(parser, scope = ParserScope.empty)
12
+ propogate_gen parser.child, :intermediate_skip, scope
13
+ end
14
+
15
+ end
16
+ end
@@ -1,14 +1,12 @@
1
- require 'rattler/back_end/parser_generator'
1
+ require 'rattler/compiler/parser_generator'
2
2
 
3
- module Rattler::BackEnd::ParserGenerator
3
+ module Rattler::Compiler::ParserGenerator
4
4
 
5
5
  # @private
6
6
  module SubGenerating #:nodoc:
7
7
 
8
8
  include Rattler::Parsers
9
9
 
10
- protected
11
-
12
10
  def generate(parser, as=:basic, *args)
13
11
  gen_with generator(parser), parser, as, *args
14
12
  end
@@ -21,6 +19,8 @@ module Rattler::BackEnd::ParserGenerator
21
19
  gen_with generator(parser, :top_level), parser, as, *args
22
20
  end
23
21
 
22
+ protected
23
+
24
24
  def propogate_gen(parser, type, scope)
25
25
  if nested?
26
26
  gen_nested parser, type, scope
@@ -47,7 +47,7 @@ module Rattler::BackEnd::ParserGenerator
47
47
  cache_generator ChoiceGenerator, context, :new_choice_level => true
48
48
 
49
49
  when Sequence
50
- new_generator SequenceGenerator, context, :new_sequence_level => true
50
+ cache_generator SequenceGenerator, context, :new_sequence_level => true
51
51
 
52
52
  when Repeat
53
53
  cache_generator RepeatGenerator, context, :new_repeat_level => true
@@ -70,11 +70,14 @@ module Rattler::BackEnd::ParserGenerator
70
70
  when ESymbol
71
71
  cache_generator ESymbolGenerator, context
72
72
 
73
- when DispatchAction
74
- cache_generator DispatchActionGenerator, context
73
+ when SemanticAction
74
+ cache_generator SemanticActionGenerator, context
75
75
 
76
- when DirectAction
77
- cache_generator DirectActionGenerator, context
76
+ when NodeAction
77
+ cache_generator NodeActionGenerator, context
78
+
79
+ when AttributedSequence
80
+ cache_generator AttributedSequenceGenerator, context, :new_sequence_level => true
78
81
 
79
82
  when Token
80
83
  cache_generator TokenGenerator, context
@@ -82,6 +85,9 @@ module Rattler::BackEnd::ParserGenerator
82
85
  when Skip
83
86
  cache_generator SkipGenerator, context
84
87
 
88
+ when Super
89
+ cache_generator SuperGenerator, context
90
+
85
91
  when Label
86
92
  cache_generator LabelGenerator, context
87
93
 
@@ -124,7 +130,8 @@ module Rattler::BackEnd::ParserGenerator
124
130
 
125
131
  end
126
132
 
127
- module NestedSubGenerating
133
+ # @private
134
+ module NestedSubGenerating #:nodoc:
128
135
  include SubGenerating
129
136
 
130
137
  protected
@@ -136,7 +143,8 @@ module Rattler::BackEnd::ParserGenerator
136
143
  alias_method :factory_method, :default_context
137
144
  end
138
145
 
139
- module TopLevelSubGenerating
146
+ # @private
147
+ module TopLevelSubGenerating #:nodoc:
140
148
  include SubGenerating
141
149
 
142
150
  protected
@@ -0,0 +1,54 @@
1
+ require 'rattler/compiler/parser_generator'
2
+
3
+ module Rattler::Compiler::ParserGenerator
4
+
5
+ # @private
6
+ class SuperGenerator < ExprGenerator #:nodoc:
7
+
8
+ def gen_basic(*_)
9
+ @g << 'super'
10
+ end
11
+
12
+ def gen_assert(*_)
13
+ expr :block do
14
+ lookahead { (@g << "#{result_name} = (super && true)").newline }
15
+ @g << result_name
16
+ end
17
+ end
18
+
19
+ def gen_disallow(*_)
20
+ expr :block do
21
+ lookahead { (@g << "#{result_name} = !super").newline }
22
+ @g << result_name
23
+ end
24
+ end
25
+
26
+ def gen_token(*_)
27
+ @g << 'super.to_s'
28
+ end
29
+
30
+ def gen_skip(*_)
31
+ expr { @g << 'super && true' }
32
+ end
33
+
34
+ end
35
+
36
+ # @private
37
+ class NestedSuperGenerator < SuperGenerator #:nodoc:
38
+ include Nested
39
+ end
40
+
41
+ def SuperGenerator.nested(*args)
42
+ NestedSuperGenerator.new(*args)
43
+ end
44
+
45
+ # @private
46
+ class TopLevelSuperGenerator < SuperGenerator #:nodoc:
47
+ include TopLevel
48
+ end
49
+
50
+ def SuperGenerator.top_level(*args)
51
+ TopLevelSuperGenerator.new(*args)
52
+ end
53
+
54
+ end
@@ -1,6 +1,6 @@
1
- require 'rattler/back_end/parser_generator'
1
+ require 'rattler/compiler/parser_generator'
2
2
 
3
- module Rattler::BackEnd::ParserGenerator
3
+ module Rattler::Compiler::ParserGenerator
4
4
 
5
5
  # @private
6
6
  class TokenGenerator < ExprGenerator #:nodoc:
@@ -8,7 +8,7 @@ module Rattler::BackEnd::ParserGenerator
8
8
  include TokenPropogating
9
9
  include SkipPropogating
10
10
 
11
- def gen_basic(token, scope={})
11
+ def gen_basic(token, scope = ParserScope.empty)
12
12
  generate token.child, :token, scope
13
13
  end
14
14
  end
@@ -0,0 +1,10 @@
1
+ require 'rattler/compiler/parser_generator'
2
+
3
+ module Rattler::Compiler::ParserGenerator
4
+ # @private
5
+ module TokenPropogating #:nodoc:
6
+ def gen_token(parser, scope = ParserScope.empty)
7
+ propogate_gen parser.child, :token, scope
8
+ end
9
+ end
10
+ end
@@ -1,6 +1,6 @@
1
- require 'rattler/back_end/parser_generator'
1
+ require 'rattler/compiler/parser_generator'
2
2
 
3
- module Rattler::BackEnd::ParserGenerator
3
+ module Rattler::Compiler::ParserGenerator
4
4
  # @private
5
5
  module TopLevel #:nodoc:
6
6
 
@@ -1,18 +1,18 @@
1
- require 'rattler/back_end/parser_generator'
1
+ require 'rattler/compiler/parser_generator'
2
2
 
3
- module Rattler::BackEnd::ParserGenerator
3
+ module Rattler::Compiler::ParserGenerator
4
4
  # @private
5
5
  module ZeroOrMoreGenerating #:nodoc:
6
6
 
7
- def gen_assert(zero_or_more, scope={})
7
+ def gen_assert(zero_or_more, scope = ParserScope.empty)
8
8
  @g << 'true'
9
9
  end
10
10
 
11
- def gen_disallow(zero_or_more, scope={})
11
+ def gen_disallow(zero_or_more, scope = ParserScope.empty)
12
12
  @g << 'false'
13
13
  end
14
14
 
15
- def gen_skip(zero_or_more, scope={})
15
+ def gen_skip(zero_or_more, scope = ParserScope.empty)
16
16
  expr :block do
17
17
  @g << 'while '
18
18
  generate zero_or_more.child, :intermediate_skip, scope
@@ -0,0 +1,201 @@
1
+ require 'rattler/compiler'
2
+
3
+ grammar Rattler::Compiler::Metagrammar
4
+
5
+ include Rattler::Parsers
6
+
7
+ %whitespace (SPACE+ / comment)*
8
+
9
+ grammar <- heading rules EOF <Grammar>
10
+
11
+ heading <- requires module_decl? includes start_directive? { heading *_ }
12
+
13
+ requires <- require_statement* { { :requires => _ } }
14
+
15
+ require_statement <- ~`require` @(!eol .)+ ~eol
16
+ / ~`require_relative` @(!eol .)+ ~eol { expand_relative _ }
17
+
18
+ module_decl <- ~`parser` constant (~'<' constant)? ~eol { parser_decl *_ }
19
+ / ~`grammar` constant ~eol { { :grammar_name => _ } }
20
+
21
+ includes <- (~`include` constant ~eol)* { { :includes => _ } }
22
+
23
+ start_directive <- ~`%start` identifier { { :start_rule => _ } }
24
+
25
+ rules <- (directive / rule / block_close)* <RuleSet>
26
+
27
+ directive <- ws_directive / wc_directive / inline_directive / fragments
28
+
29
+ ws_directive <- ws_decl ~'{' { start_ws _ }
30
+ / ws_decl { set_ws _ }
31
+
32
+ ws_decl <- ~`%whitespace` unattributed
33
+
34
+ wc_directive <- wc_decl ~'{' { start_wc _ }
35
+ / wc_decl { set_wc _ }
36
+
37
+ wc_decl <- ~`%word_character` unattributed
38
+
39
+ inline_directive <- ~`%inline` ~'{' { start_inline }
40
+ / ~`%inline` { set_inline }
41
+
42
+ fragments <- ~`%fragments` ~'{' { start_fragments }
43
+ / ~`%fragments` { set_fragments }
44
+
45
+ block_close <- ~'}' { end_block }
46
+
47
+ rule <- identifier ~'<-' expression { rule *_ }
48
+
49
+ unattributed <- unattributed ~'/' terms <Choice>
50
+ / terms
51
+
52
+ expression <- expression ~'/' attributed <Choice>
53
+ / attributed
54
+
55
+ attributed <- attributed? (semantic_action / node_action) <AttributedSequence>
56
+ / attributed_terms
57
+
58
+ old_node_action <- @(name (~'.' var_name)?)
59
+
60
+ semantic_action <- ~'{' action_code ~'}' <SemanticAction>
61
+
62
+ action_code <- @(( '{' [^}]* '}'
63
+ / [^{}] )*)
64
+
65
+ node_action <- ~'<' (name (~'.' var_name)?)? literal? ~'>' <NodeAction>
66
+
67
+ attributed_terms <- attributed term <Sequence>
68
+ / terms
69
+
70
+ terms <- terms term <Sequence>
71
+ / term
72
+
73
+ term <- fail_expr / labeled / labelable
74
+
75
+ fail_expr <- fail_keyword fail_arg <Fail>
76
+
77
+ labeled <- var_name ~':' labelable <Label>
78
+
79
+ labelable <- semantic_term / list / list_term
80
+
81
+ semantic_term <- ~'^' semantic_action
82
+ / ~'&' semantic_action { Assert[_] }
83
+ / ~'!' semantic_action { Disallow[_] }
84
+ / ~'~' semantic_action { Skip[_] }
85
+
86
+ list <- list_term ~('*' ',') list_term { list0 *_ }
87
+ / list_term ~('+' ',') list_term { list1 *_ }
88
+ / list_term repeat_count ~',' list_term <ListParser>
89
+
90
+ list_term <- prefixed
91
+ / prefixable
92
+ / expected 'term'
93
+
94
+ prefixed <- ~'&' prefixable <Assert>
95
+ / ~'!' prefixable <Disallow>
96
+ / ~'~' prefixable <Skip>
97
+ / ~'@' prefixable <Token>
98
+
99
+ prefixable <- prefixed / suffixable
100
+ / expected 'primary'
101
+
102
+ suffixed <- suffixable ~'?' { optional _ }
103
+ / suffixable ~'*' !',' { zero_or_more _ }
104
+ / suffixable ~'+' !',' { one_or_more _ }
105
+ / suffixable repeat_count !',' <Repeat>
106
+
107
+ repeat_count <- @DIGIT+ ~'..' @DIGIT+ { _.map {|s| s.to_i } }
108
+ / @DIGIT+ ~'..' { [_.to_i, nil] }
109
+ / @DIGIT+ { [_.to_i] * 2 }
110
+
111
+ suffixable <- suffixed / primary
112
+ / expected 'primary'
113
+
114
+ primary <- ~'(' expression ~')'
115
+ / atom
116
+
117
+ atom <- ~`EOF` <Eof>
118
+ / ~`E` <ESymbol>
119
+ / ~`super` { Super[:pending] }
120
+ / posix_class { posix_class _ }
121
+ / identifier !'<-' <Apply>
122
+ / literal { literal _ }
123
+ / word_literal { word_literal _ }
124
+ / class { char_class _ }
125
+ / back_reference <BackReference>
126
+ / ~'.' { Match[/./] }
127
+
128
+ %inline
129
+
130
+ fail_keyword <- `fail` / `fail_rule` / `fail_parse` / `expected`
131
+
132
+ fail_arg <- ~'(' literal ~')'
133
+ / literal
134
+
135
+ posix_class <- `ALNUM`
136
+ / `ALPHA`
137
+ / `ASCII`
138
+ / `BLANK`
139
+ / `CNTRL`
140
+ / `DIGIT`
141
+ / `GRAPH`
142
+ / `LOWER`
143
+ / `PRINT`
144
+ / `PUNCT`
145
+ / `SPACE`
146
+ / `UPPER`
147
+ / `XDIGIT`
148
+ / `WORD`
149
+
150
+ literal <- @('"' ('\\' . / [^"])* '"')
151
+ / @("'" ('\\' . / [^'])* "'")
152
+ / @('%(' ('\\' . / [^)])* ')')
153
+ / @('%{' ('\\' . / [^}])* '}')
154
+ / @('%[' ('\\' . / [^\]])* ']')
155
+ / @('%<' ('\\' . / [^>])* '>')
156
+ / @('%' q:PUNCT ('\\' . / !$q .)* $q)
157
+
158
+ word_literal <- @("`" ('\\' . / [^`])* "`")
159
+
160
+ class <- @('[' (!']' range)+ ']')
161
+
162
+ name <- var_name
163
+ / constant
164
+
165
+ identifier <- !`EOF` @(ALPHA WORD*)
166
+
167
+ back_reference <- @('$' LOWER WORD*)
168
+
169
+ var_name <- @(LOWER WORD*)
170
+
171
+ constant <- @((UPPER WORD* '::')* UPPER WORD*)
172
+
173
+ const_name <- @(UPPER WORD*)
174
+
175
+ %fragments
176
+
177
+ range <- '[:' posix_name ':]'
178
+ / class_char ('-' class_char)?
179
+
180
+ posix_name <- `alnum`
181
+ / `alpha`
182
+ / `ascii`
183
+ / `blank`
184
+ / `cntrl`
185
+ / `digit`
186
+ / `graph`
187
+ / `lower`
188
+ / `print`
189
+ / `punct`
190
+ / `space`
191
+ / `upper`
192
+ / `xdigit`
193
+
194
+ class_char <- '\\' [0-3] [0-7] [0-7]
195
+ / '\\x' XDIGIT XDIGIT
196
+ / '\\' .
197
+ / [^\\\]]
198
+
199
+ eol <- ~(BLANK* (EOF / ';' / "\r"? "\n" / comment))
200
+
201
+ comment <- ~('#' [^\n]*)