rattler 0.4.2 → 0.5.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 (347) hide show
  1. data/README.rdoc +9 -3
  2. data/features/command_line/dest_option.feature +1 -1
  3. data/features/command_line/lib_option.feature +2 -2
  4. data/features/command_line/output_option.feature +2 -2
  5. data/features/command_line/parser_generator.feature +3 -3
  6. data/features/grammar/any_character.feature +0 -4
  7. data/features/grammar/back_reference.feature +0 -4
  8. data/features/grammar/character_class.feature +0 -4
  9. data/features/grammar/comments.feature +0 -4
  10. data/features/grammar/e_symbol.feature +18 -0
  11. data/features/grammar/eof.feature +0 -4
  12. data/features/grammar/fail.feature +0 -4
  13. data/features/grammar/list_matching.feature +52 -3
  14. data/features/grammar/literal.feature +0 -4
  15. data/features/grammar/negative_lookahead.feature +0 -4
  16. data/features/grammar/negative_semantic_predicate.feature +99 -0
  17. data/features/grammar/node_action.feature +17 -4
  18. data/features/grammar/nonterminal.feature +3 -7
  19. data/features/grammar/one_or_more.feature +0 -4
  20. data/features/grammar/optional.feature +0 -4
  21. data/features/grammar/ordered_choice.feature +0 -4
  22. data/features/grammar/positive_lookahead.feature +0 -4
  23. data/features/grammar/positive_semantic_predicate.feature +99 -0
  24. data/features/grammar/posix_class.feature +3 -6
  25. data/features/grammar/repeat.feature +50 -0
  26. data/features/grammar/sequence.feature +0 -4
  27. data/features/grammar/side_effect.feature +81 -0
  28. data/features/grammar/skip_operator.feature +2 -5
  29. data/features/grammar/start_rule.feature +1 -5
  30. data/features/grammar/symantic_action.feature +9 -4
  31. data/features/grammar/token.feature +0 -4
  32. data/features/grammar/whitespace.feature +0 -4
  33. data/features/grammar/word_literal.feature +0 -4
  34. data/features/grammar/zero_or_more.feature +0 -4
  35. data/features/step_definitions/grammar_steps.rb +5 -1
  36. data/lib/rattler/back_end/optimizer.rb +1 -0
  37. data/lib/rattler/back_end/optimizer/reduce_repeat_match.rb +20 -8
  38. data/lib/rattler/back_end/optimizer/simplify_redundant_repeat.rb +10 -7
  39. data/lib/rattler/back_end/optimizer/specialize_repeat.rb +40 -0
  40. data/lib/rattler/back_end/parser_generator.rb +11 -6
  41. data/lib/rattler/back_end/parser_generator/delegating_generator.rb +20 -0
  42. data/lib/rattler/back_end/parser_generator/e_symbol_generator.rb +52 -0
  43. data/lib/rattler/back_end/parser_generator/eof_generator.rb +58 -0
  44. data/lib/rattler/back_end/parser_generator/expr_generator.rb +6 -2
  45. data/lib/rattler/back_end/parser_generator/gen_method_names.rb +15 -5
  46. data/lib/rattler/back_end/parser_generator/general_list_generator.rb +194 -0
  47. data/lib/rattler/back_end/parser_generator/general_repeat_generator.rb +177 -0
  48. data/lib/rattler/back_end/parser_generator/label_generator.rb +4 -1
  49. data/lib/rattler/back_end/parser_generator/list0_generating.rb +36 -0
  50. data/lib/rattler/back_end/parser_generator/list1_generating.rb +30 -0
  51. data/lib/rattler/back_end/parser_generator/list_generator.rb +16 -20
  52. data/lib/rattler/back_end/parser_generator/one_or_more_generating.rb +25 -0
  53. data/lib/rattler/back_end/parser_generator/{optional_generator.rb → optional_generating.rb} +66 -81
  54. data/lib/rattler/back_end/parser_generator/predicate_propogating.rb +4 -4
  55. data/lib/rattler/back_end/parser_generator/repeat_generator.rb +53 -0
  56. data/lib/rattler/back_end/parser_generator/skip_propogating.rb +2 -2
  57. data/lib/rattler/back_end/parser_generator/sub_generating.rb +16 -18
  58. data/lib/rattler/back_end/parser_generator/token_propogating.rb +1 -1
  59. data/lib/rattler/back_end/parser_generator/zero_or_more_generating.rb +31 -0
  60. data/lib/rattler/grammar/grammar_parser.rb +20 -0
  61. data/lib/rattler/grammar/metagrammar.rb +131 -13
  62. data/lib/rattler/grammar/rattler.rtlr +25 -12
  63. data/lib/rattler/parsers.rb +9 -5
  64. data/lib/rattler/parsers/assert_code.rb +31 -0
  65. data/lib/rattler/parsers/atomic.rb +19 -0
  66. data/lib/rattler/parsers/direct_action.rb +12 -4
  67. data/lib/rattler/parsers/disallow_code.rb +31 -0
  68. data/lib/rattler/parsers/dispatch_action.rb +3 -2
  69. data/lib/rattler/parsers/e_symbol.rb +47 -0
  70. data/lib/rattler/parsers/effect_code.rb +31 -0
  71. data/lib/rattler/parsers/eof.rb +6 -13
  72. data/lib/rattler/parsers/list_parser.rb +33 -14
  73. data/lib/rattler/parsers/match.rb +1 -6
  74. data/lib/rattler/parsers/parser_dsl.rb +78 -35
  75. data/lib/rattler/parsers/predicate.rb +1 -4
  76. data/lib/rattler/parsers/repeat.rb +76 -0
  77. data/lib/rattler/parsers/semantic_assert.rb +19 -0
  78. data/lib/rattler/parsers/semantic_disallow.rb +19 -0
  79. data/lib/rattler/parsers/side_effect.rb +19 -0
  80. data/lib/rattler/parsers/skip.rb +1 -9
  81. data/lib/rattler/parsers/token.rb +1 -6
  82. data/lib/rattler/util/graphviz/node_builder.rb +6 -3
  83. data/spec/rattler/back_end/assert_compiler_examples.rb +187 -0
  84. data/spec/rattler/back_end/direct_action_compiler_examples.rb +227 -0
  85. data/spec/rattler/back_end/disallow_compiler_examples.rb +187 -0
  86. data/spec/rattler/back_end/dispatch_action_compiler_examples.rb +225 -0
  87. data/spec/rattler/back_end/optimizer/reduce_repeat_match_spec.rb +45 -33
  88. data/spec/rattler/back_end/optimizer/simplify_redundant_repeat_spec.rb +32 -172
  89. data/spec/rattler/back_end/parser_generator/e_symbol_generator_spec.rb +149 -0
  90. data/spec/rattler/back_end/parser_generator/eof_generator_spec.rb +152 -0
  91. data/spec/rattler/back_end/parser_generator/label_generator_spec.rb +4 -4
  92. data/spec/rattler/back_end/parser_generator/list0_generator_examples.rb +322 -0
  93. data/spec/rattler/back_end/parser_generator/list1_generator_examples.rb +343 -0
  94. data/spec/rattler/back_end/parser_generator/list_generator_spec.rb +597 -140
  95. data/spec/rattler/back_end/parser_generator/one_or_more_generator_examples.rb +292 -0
  96. data/spec/rattler/back_end/parser_generator/optional_generator_examples.rb +233 -0
  97. data/spec/rattler/back_end/parser_generator/repeat_generator_spec.rb +281 -0
  98. data/spec/rattler/back_end/parser_generator/zero_or_more_generator_examples.rb +277 -0
  99. data/spec/rattler/back_end/semantic_assert_compiler_examples.rb +152 -0
  100. data/spec/rattler/back_end/semantic_disallow_compiler_examples.rb +152 -0
  101. data/spec/rattler/back_end/shared_compiler_examples.rb +106 -651
  102. data/spec/rattler/back_end/side_effect_compiler_examples.rb +227 -0
  103. data/spec/rattler/back_end/skip_compiler_examples.rb +161 -0
  104. data/spec/rattler/back_end/token_compiler_examples.rb +262 -0
  105. data/spec/rattler/grammar/grammar_parser_spec.rb +302 -23
  106. data/spec/rattler/parsers/apply_spec.rb +6 -0
  107. data/spec/rattler/parsers/assert_spec.rb +18 -7
  108. data/spec/rattler/parsers/back_reference_spec.rb +9 -0
  109. data/spec/rattler/parsers/choice_spec.rb +36 -21
  110. data/spec/rattler/parsers/direct_action_spec.rb +76 -36
  111. data/spec/rattler/parsers/disallow_spec.rb +18 -7
  112. data/spec/rattler/parsers/dispatch_action_spec.rb +128 -22
  113. data/spec/rattler/parsers/e_symbol_spec.rb +30 -0
  114. data/spec/rattler/parsers/eof_spec.rb +15 -6
  115. data/spec/rattler/parsers/label_spec.rb +15 -2
  116. data/spec/rattler/parsers/list_parser_spec.rb +187 -0
  117. data/spec/rattler/parsers/match_spec.rb +16 -7
  118. data/spec/rattler/parsers/parser_dsl_spec.rb +82 -23
  119. data/spec/rattler/parsers/repeat_spec.rb +233 -0
  120. data/spec/rattler/parsers/semantic_assert_spec.rb +83 -0
  121. data/spec/rattler/parsers/semantic_disallow_spec.rb +83 -0
  122. data/spec/rattler/parsers/sequence_spec.rb +34 -20
  123. data/spec/rattler/parsers/side_effect_spec.rb +214 -0
  124. data/spec/rattler/parsers/skip_spec.rb +17 -6
  125. data/spec/rattler_spec.rb +2 -0
  126. data/spec/support/compiler_spec_helper.rb +8 -0
  127. metadata +156 -447
  128. data/bin/rtlr.compiled.rbc +0 -201
  129. data/features/step_definitions/cli_steps.rbc +0 -149
  130. data/features/step_definitions/grammar_steps.rbc +0 -1211
  131. data/features/support/env.rbc +0 -389
  132. data/lib/rattler.rbc +0 -1231
  133. data/lib/rattler/back_end.rbc +0 -286
  134. data/lib/rattler/back_end/compiler.rbc +0 -1394
  135. data/lib/rattler/back_end/optimizer.rbc +0 -2000
  136. data/lib/rattler/back_end/optimizer/composite_reducing.rbc +0 -337
  137. data/lib/rattler/back_end/optimizer/flatten_choice.rbc +0 -443
  138. data/lib/rattler/back_end/optimizer/flatten_sequence.rbc +0 -827
  139. data/lib/rattler/back_end/optimizer/flattening.rbc +0 -570
  140. data/lib/rattler/back_end/optimizer/inline_regular_rules.rbc +0 -691
  141. data/lib/rattler/back_end/optimizer/join_match_capturing_sequence.rbc +0 -1299
  142. data/lib/rattler/back_end/optimizer/join_match_choice.rbc +0 -523
  143. data/lib/rattler/back_end/optimizer/join_match_matching_sequence.rbc +0 -619
  144. data/lib/rattler/back_end/optimizer/join_match_sequence.rbc +0 -174
  145. data/lib/rattler/back_end/optimizer/join_predicate_bare_match.rbc +0 -1505
  146. data/lib/rattler/back_end/optimizer/join_predicate_match.rbc +0 -174
  147. data/lib/rattler/back_end/optimizer/join_predicate_nested_match.rbc +0 -620
  148. data/lib/rattler/back_end/optimizer/join_predicate_or_bare_match.rbc +0 -1502
  149. data/lib/rattler/back_end/optimizer/join_predicate_or_match.rbc +0 -174
  150. data/lib/rattler/back_end/optimizer/join_predicate_or_nested_match.rbc +0 -616
  151. data/lib/rattler/back_end/optimizer/match_joining.rbc +0 -1454
  152. data/lib/rattler/back_end/optimizer/optimization.rbc +0 -1366
  153. data/lib/rattler/back_end/optimizer/optimization_context.rbc +0 -1386
  154. data/lib/rattler/back_end/optimizer/optimization_sequence.rbc +0 -520
  155. data/lib/rattler/back_end/optimizer/optimize_children.rbc +0 -793
  156. data/lib/rattler/back_end/optimizer/reduce_repeat_match.rbc +0 -788
  157. data/lib/rattler/back_end/optimizer/remove_meaningless_wrapper.rbc +0 -508
  158. data/lib/rattler/back_end/optimizer/simplify_redundant_repeat.rbc +0 -807
  159. data/lib/rattler/back_end/optimizer/simplify_token_match.rbc +0 -561
  160. data/lib/rattler/back_end/parser_generator.rbc +0 -1326
  161. data/lib/rattler/back_end/parser_generator/apply_generator.rbc +0 -2148
  162. data/lib/rattler/back_end/parser_generator/assert_generator.rbc +0 -1967
  163. data/lib/rattler/back_end/parser_generator/back_reference_generator.rbc +0 -1665
  164. data/lib/rattler/back_end/parser_generator/choice_generator.rbc +0 -2793
  165. data/lib/rattler/back_end/parser_generator/direct_action_generator.rbc +0 -1071
  166. data/lib/rattler/back_end/parser_generator/disallow_generator.rbc +0 -1967
  167. data/lib/rattler/back_end/parser_generator/dispatch_action_generator.rbc +0 -1071
  168. data/lib/rattler/back_end/parser_generator/expr_generator.rbc +0 -2295
  169. data/lib/rattler/back_end/parser_generator/fail_generator.rbc +0 -1216
  170. data/lib/rattler/back_end/parser_generator/gen_method_names.rbc +0 -296
  171. data/lib/rattler/back_end/parser_generator/group_match.rbc +0 -612
  172. data/lib/rattler/back_end/parser_generator/group_match_generator.rbc +0 -1647
  173. data/lib/rattler/back_end/parser_generator/label_generator.rbc +0 -1401
  174. data/lib/rattler/back_end/parser_generator/list1_generator.rb +0 -54
  175. data/lib/rattler/back_end/parser_generator/list1_generator.rbc +0 -1237
  176. data/lib/rattler/back_end/parser_generator/list_generating.rb +0 -71
  177. data/lib/rattler/back_end/parser_generator/list_generating.rbc +0 -1900
  178. data/lib/rattler/back_end/parser_generator/list_generator.rbc +0 -1068
  179. data/lib/rattler/back_end/parser_generator/match_generator.rbc +0 -1743
  180. data/lib/rattler/back_end/parser_generator/nested.rbc +0 -496
  181. data/lib/rattler/back_end/parser_generator/one_or_more_generator.rb +0 -56
  182. data/lib/rattler/back_end/parser_generator/one_or_more_generator.rbc +0 -1277
  183. data/lib/rattler/back_end/parser_generator/optional_generator.rbc +0 -2025
  184. data/lib/rattler/back_end/parser_generator/predicate_propogating.rbc +0 -648
  185. data/lib/rattler/back_end/parser_generator/repeat_generating.rb +0 -57
  186. data/lib/rattler/back_end/parser_generator/repeat_generating.rbc +0 -1549
  187. data/lib/rattler/back_end/parser_generator/rule_generator.rbc +0 -1239
  188. data/lib/rattler/back_end/parser_generator/rule_set_generator.rbc +0 -2641
  189. data/lib/rattler/back_end/parser_generator/sequence_generator.rbc +0 -4867
  190. data/lib/rattler/back_end/parser_generator/skip_generator.rbc +0 -1278
  191. data/lib/rattler/back_end/parser_generator/skip_propogating.rbc +0 -432
  192. data/lib/rattler/back_end/parser_generator/sub_generating.rbc +0 -2785
  193. data/lib/rattler/back_end/parser_generator/token_generator.rbc +0 -755
  194. data/lib/rattler/back_end/parser_generator/token_propogating.rbc +0 -324
  195. data/lib/rattler/back_end/parser_generator/top_level.rbc +0 -352
  196. data/lib/rattler/back_end/parser_generator/zero_or_more_generator.rb +0 -53
  197. data/lib/rattler/back_end/parser_generator/zero_or_more_generator.rbc +0 -1111
  198. data/lib/rattler/back_end/ruby_generator.rbc +0 -1841
  199. data/lib/rattler/grammar.rbc +0 -557
  200. data/lib/rattler/grammar/analysis.rbc +0 -1944
  201. data/lib/rattler/grammar/grammar.rbc +0 -1090
  202. data/lib/rattler/grammar/grammar_dsl.rbc +0 -1401
  203. data/lib/rattler/grammar/grammar_parser.rbc +0 -2096
  204. data/lib/rattler/grammar/metagrammar.rbc +0 -11014
  205. data/lib/rattler/parsers.rbc +0 -1006
  206. data/lib/rattler/parsers/action_code.rbc +0 -1577
  207. data/lib/rattler/parsers/apply.rbc +0 -562
  208. data/lib/rattler/parsers/assert.rbc +0 -378
  209. data/lib/rattler/parsers/back_reference.rbc +0 -871
  210. data/lib/rattler/parsers/choice.rbc +0 -607
  211. data/lib/rattler/parsers/combinator_parser.rbc +0 -612
  212. data/lib/rattler/parsers/combining.rbc +0 -570
  213. data/lib/rattler/parsers/direct_action.rbc +0 -1472
  214. data/lib/rattler/parsers/disallow.rbc +0 -379
  215. data/lib/rattler/parsers/dispatch_action.rbc +0 -2078
  216. data/lib/rattler/parsers/eof.rbc +0 -567
  217. data/lib/rattler/parsers/fail.rbc +0 -745
  218. data/lib/rattler/parsers/label.rbc +0 -749
  219. data/lib/rattler/parsers/list.rbc +0 -292
  220. data/lib/rattler/parsers/list0.rb +0 -26
  221. data/lib/rattler/parsers/list0.rbc +0 -292
  222. data/lib/rattler/parsers/list1.rb +0 -26
  223. data/lib/rattler/parsers/list1.rbc +0 -305
  224. data/lib/rattler/parsers/list_parser.rbc +0 -886
  225. data/lib/rattler/parsers/match.rbc +0 -621
  226. data/lib/rattler/parsers/node_code.rbc +0 -1064
  227. data/lib/rattler/parsers/one_or_more.rb +0 -47
  228. data/lib/rattler/parsers/one_or_more.rbc +0 -475
  229. data/lib/rattler/parsers/optional.rb +0 -42
  230. data/lib/rattler/parsers/optional.rbc +0 -450
  231. data/lib/rattler/parsers/parser.rbc +0 -994
  232. data/lib/rattler/parsers/parser_dsl.rbc +0 -4765
  233. data/lib/rattler/parsers/predicate.rbc +0 -490
  234. data/lib/rattler/parsers/rule.rbc +0 -777
  235. data/lib/rattler/parsers/rule_set.rbc +0 -1438
  236. data/lib/rattler/parsers/sequence.rbc +0 -1040
  237. data/lib/rattler/parsers/skip.rbc +0 -613
  238. data/lib/rattler/parsers/token.rbc +0 -457
  239. data/lib/rattler/parsers/zero_or_more.rb +0 -40
  240. data/lib/rattler/parsers/zero_or_more.rbc +0 -462
  241. data/lib/rattler/runner.rbc +0 -3813
  242. data/lib/rattler/runtime.rbc +0 -370
  243. data/lib/rattler/runtime/extended_packrat_parser.rbc +0 -2351
  244. data/lib/rattler/runtime/packrat_parser.rbc +0 -1390
  245. data/lib/rattler/runtime/parse_failure.rbc +0 -909
  246. data/lib/rattler/runtime/parse_node.rbc +0 -1007
  247. data/lib/rattler/runtime/parser.rbc +0 -2267
  248. data/lib/rattler/runtime/parser_helper.rbc +0 -337
  249. data/lib/rattler/runtime/recursive_descent_parser.rbc +0 -942
  250. data/lib/rattler/util.rbc +0 -286
  251. data/lib/rattler/util/graphviz.rbc +0 -327
  252. data/lib/rattler/util/graphviz/node_builder.rbc +0 -2207
  253. data/lib/rattler/util/line_counter.rbc +0 -988
  254. data/lib/rattler/util/node.rbc +0 -2393
  255. data/lib/rattler/util/parser_spec_helper.rbc +0 -2533
  256. data/spec/rattler/back_end/compiler_spec.rbc +0 -1187
  257. data/spec/rattler/back_end/optimizer/flatten_choice_spec.rbc +0 -2093
  258. data/spec/rattler/back_end/optimizer/flatten_sequence_spec.rbc +0 -4055
  259. data/spec/rattler/back_end/optimizer/inline_regular_rules_spec.rbc +0 -2345
  260. data/spec/rattler/back_end/optimizer/join_match_capturing_sequence_spec.rbc +0 -7006
  261. data/spec/rattler/back_end/optimizer/join_match_choice_spec.rbc +0 -3252
  262. data/spec/rattler/back_end/optimizer/join_match_matching_sequence_spec.rbc +0 -3681
  263. data/spec/rattler/back_end/optimizer/join_predicate_bare_match_spec.rbc +0 -5603
  264. data/spec/rattler/back_end/optimizer/join_predicate_nested_match_spec.rbc +0 -5232
  265. data/spec/rattler/back_end/optimizer/join_predicate_or_bare_match_spec.rbc +0 -4272
  266. data/spec/rattler/back_end/optimizer/join_predicate_or_nested_match_spec.rbc +0 -4342
  267. data/spec/rattler/back_end/optimizer/reduce_repeat_match_spec.rbc +0 -2960
  268. data/spec/rattler/back_end/optimizer/simplify_redundant_repeat_spec.rbc +0 -6929
  269. data/spec/rattler/back_end/optimizer/simplify_token_match_spec.rbc +0 -2327
  270. data/spec/rattler/back_end/optimizer_spec.rbc +0 -372
  271. data/spec/rattler/back_end/parser_generator/apply_generator_spec.rbc +0 -4710
  272. data/spec/rattler/back_end/parser_generator/assert_generator_spec.rbc +0 -4697
  273. data/spec/rattler/back_end/parser_generator/back_reference_generator_spec.rbc +0 -4855
  274. data/spec/rattler/back_end/parser_generator/choice_generator_spec.rbc +0 -5350
  275. data/spec/rattler/back_end/parser_generator/direct_action_generator_spec.rbc +0 -4737
  276. data/spec/rattler/back_end/parser_generator/disallow_generator_spec.rbc +0 -4697
  277. data/spec/rattler/back_end/parser_generator/dispatch_action_generator_spec.rbc +0 -4731
  278. data/spec/rattler/back_end/parser_generator/fail_generator_spec.rbc +0 -2115
  279. data/spec/rattler/back_end/parser_generator/group_match_generator_spec.rbc +0 -4195
  280. data/spec/rattler/back_end/parser_generator/group_match_spec.rbc +0 -1414
  281. data/spec/rattler/back_end/parser_generator/label_generator_spec.rbc +0 -4696
  282. data/spec/rattler/back_end/parser_generator/list1_generator_spec.rb +0 -309
  283. data/spec/rattler/back_end/parser_generator/list1_generator_spec.rbc +0 -5213
  284. data/spec/rattler/back_end/parser_generator/list_generator_spec.rbc +0 -5179
  285. data/spec/rattler/back_end/parser_generator/match_generator_spec.rbc +0 -4681
  286. data/spec/rattler/back_end/parser_generator/one_or_more_generator_spec.rb +0 -259
  287. data/spec/rattler/back_end/parser_generator/one_or_more_generator_spec.rbc +0 -4957
  288. data/spec/rattler/back_end/parser_generator/optional_generator_spec.rb +0 -190
  289. data/spec/rattler/back_end/parser_generator/optional_generator_spec.rbc +0 -4704
  290. data/spec/rattler/back_end/parser_generator/rule_generator_spec.rbc +0 -545
  291. data/spec/rattler/back_end/parser_generator/rule_set_generator_spec.rbc +0 -1110
  292. data/spec/rattler/back_end/parser_generator/sequence_generator_spec.rbc +0 -5453
  293. data/spec/rattler/back_end/parser_generator/skip_generator_spec.rbc +0 -4691
  294. data/spec/rattler/back_end/parser_generator/token_generator_spec.rbc +0 -4691
  295. data/spec/rattler/back_end/parser_generator/zero_or_more_generator_spec.rb +0 -244
  296. data/spec/rattler/back_end/parser_generator/zero_or_more_generator_spec.rbc +0 -4924
  297. data/spec/rattler/back_end/ruby_generator_spec.rbc +0 -2460
  298. data/spec/rattler/back_end/shared_compiler_examples.rbc +0 -41886
  299. data/spec/rattler/grammar/analysis_spec.rbc +0 -4365
  300. data/spec/rattler/grammar/grammar_parser_spec.rbc +0 -10344
  301. data/spec/rattler/grammar/grammar_spec.rbc +0 -1701
  302. data/spec/rattler/parsers/action_code_spec.rbc +0 -4674
  303. data/spec/rattler/parsers/apply_spec.rbc +0 -851
  304. data/spec/rattler/parsers/assert_spec.rbc +0 -752
  305. data/spec/rattler/parsers/back_reference_spec.rbc +0 -1002
  306. data/spec/rattler/parsers/choice_spec.rbc +0 -1696
  307. data/spec/rattler/parsers/combinator_parser_spec.rbc +0 -361
  308. data/spec/rattler/parsers/direct_action_spec.rbc +0 -5222
  309. data/spec/rattler/parsers/disallow_spec.rbc +0 -752
  310. data/spec/rattler/parsers/dispatch_action_spec.rbc +0 -3033
  311. data/spec/rattler/parsers/eof_spec.rbc +0 -728
  312. data/spec/rattler/parsers/fail_spec.rbc +0 -548
  313. data/spec/rattler/parsers/label_spec.rbc +0 -1091
  314. data/spec/rattler/parsers/list0_spec.rb +0 -82
  315. data/spec/rattler/parsers/list0_spec.rbc +0 -2308
  316. data/spec/rattler/parsers/list1_spec.rb +0 -82
  317. data/spec/rattler/parsers/list1_spec.rbc +0 -2287
  318. data/spec/rattler/parsers/list_spec.rbc +0 -2308
  319. data/spec/rattler/parsers/match_spec.rbc +0 -780
  320. data/spec/rattler/parsers/node_code_spec.rbc +0 -1754
  321. data/spec/rattler/parsers/one_or_more_spec.rb +0 -64
  322. data/spec/rattler/parsers/one_or_more_spec.rbc +0 -1698
  323. data/spec/rattler/parsers/optional_spec.rb +0 -64
  324. data/spec/rattler/parsers/optional_spec.rbc +0 -1717
  325. data/spec/rattler/parsers/parser_dsl_spec.rbc +0 -10150
  326. data/spec/rattler/parsers/rule_set_spec.rbc +0 -1060
  327. data/spec/rattler/parsers/sequence_spec.rbc +0 -2899
  328. data/spec/rattler/parsers/skip_spec.rbc +0 -753
  329. data/spec/rattler/parsers/token_spec.rbc +0 -1511
  330. data/spec/rattler/parsers/zero_or_more_spec.rb +0 -64
  331. data/spec/rattler/parsers/zero_or_more_spec.rbc +0 -1719
  332. data/spec/rattler/runtime/extended_packrat_parser_spec.rbc +0 -1341
  333. data/spec/rattler/runtime/packrat_parser_spec.rbc +0 -210
  334. data/spec/rattler/runtime/parse_failure_spec.rbc +0 -2244
  335. data/spec/rattler/runtime/parse_node_spec.rbc +0 -2008
  336. data/spec/rattler/runtime/parser_spec.rbc +0 -2757
  337. data/spec/rattler/runtime/recursive_descent_parser_spec.rbc +0 -210
  338. data/spec/rattler/runtime/shared_parser_examples.rbc +0 -2567
  339. data/spec/rattler/util/graphviz/node_builder_spec.rbc +0 -3439
  340. data/spec/rattler/util/line_counter_spec.rbc +0 -2272
  341. data/spec/rattler/util/node_spec.rbc +0 -15023
  342. data/spec/rattler_spec.rbc +0 -1591
  343. data/spec/spec_helper.rbc +0 -336
  344. data/spec/support/combinator_parser_spec_helper.rbc +0 -1284
  345. data/spec/support/compiler_spec_helper.rbc +0 -1941
  346. data/spec/support/parser_generator_spec_helper.rbc +0 -718
  347. data/spec/support/runtime_parser_spec_helper.rbc +0 -313
@@ -0,0 +1,177 @@
1
+ require 'rattler/back_end/parser_generator'
2
+
3
+ module Rattler::BackEnd::ParserGenerator
4
+
5
+ # @private
6
+ class GeneralRepeatGenerator < ExprGenerator #:nodoc:
7
+ include NestedSubGenerating
8
+
9
+ def gen_basic(repeat, scope={})
10
+ if repeat.capturing?
11
+ gen_capturing repeat, scope
12
+ else
13
+ gen_skip repeat, scope
14
+ end
15
+ end
16
+
17
+ def gen_assert(repeat, scope={})
18
+ gen_predicate(repeat, scope) { gen_assert_result repeat }
19
+ end
20
+
21
+ def gen_disallow(repeat, scope={})
22
+ gen_predicate(repeat, scope) { gen_disallow_result repeat }
23
+ end
24
+
25
+ def gen_dispatch_action(repeat, code, scope={})
26
+ expr :block do
27
+ gen_loop repeat, scope
28
+ gen_result repeat, code.bind(scope, "select_captures(#{accumulator_name})")
29
+ end
30
+ end
31
+
32
+ def gen_direct_action(repeat, code, scope={})
33
+ expr :block do
34
+ gen_loop repeat, scope
35
+ gen_result(repeat, '(' + code.bind(scope, ["select_captures(#{accumulator_name})"]) + ')')
36
+ end
37
+ end
38
+
39
+ def gen_token(repeat, scope={})
40
+ expr :block do
41
+ gen_loop(repeat, scope) { |child| generate child, :token, scope }
42
+ gen_result repeat, "#{accumulator_name}.join"
43
+ end
44
+ end
45
+
46
+ def gen_skip(repeat, scope={})
47
+ expr :block do
48
+ setup_skip_loop repeat
49
+ @g << 'while '
50
+ generate repeat.child, :intermediate_skip, scope
51
+ @g.block('') { gen_skip_loop_body repeat }.newline
52
+ gen_skip_result repeat
53
+ end
54
+ end
55
+
56
+ protected
57
+
58
+ def gen_capturing(repeat, scope)
59
+ expr :block do
60
+ gen_loop(repeat, scope) { |child| gen_nested child, :basic, scope }
61
+ gen_result repeat, accumulator_name
62
+ end
63
+ end
64
+
65
+ def gen_loop(repeat, scope)
66
+ setup_loop repeat
67
+ @g << "while #{result_name} = "
68
+ if block_given?
69
+ yield repeat.child
70
+ else
71
+ generate repeat.child, :basic, scope
72
+ end
73
+ @g.block('') { gen_loop_body repeat }.newline
74
+ end
75
+
76
+ def setup_loop(repeat)
77
+ (@g << "#{accumulator_name} = []").newline
78
+ if repeat.respond_to? :lower_bound and repeat.lower_bound > 1
79
+ (@g << "#{saved_pos_name} = @scanner.pos").newline
80
+ end
81
+ end
82
+
83
+ def gen_loop_body(repeat)
84
+ @g << "#{accumulator_name} << #{result_name}"
85
+ if repeat.respond_to? :upper_bound and repeat.upper_bound?
86
+ @g.newline << "break if #{accumulator_name}.size >= #{repeat.upper_bound}"
87
+ end
88
+ end
89
+
90
+ def gen_result(repeat, captures)
91
+ @g.block "if #{accumulator_name}.size >= #{repeat.lower_bound}", '' do
92
+ @g << captures
93
+ end
94
+ @g.block 'else' do
95
+ (@g << "@scanner.pos = #{saved_pos_name}").newline << 'false'
96
+ end
97
+ end
98
+
99
+ def gen_predicate(repeat, scope)
100
+ expr :block do
101
+ setup_skip_loop repeat
102
+ @g << 'while '
103
+ generate repeat.child, :intermediate_skip, scope
104
+ @g.block('') { gen_assert_loop_body repeat }.newline
105
+ yield
106
+ end
107
+ end
108
+
109
+ def setup_skip_loop(repeat)
110
+ (@g << "#{count_name} = 0").newline
111
+ (@g << "#{saved_pos_name} = @scanner.pos").newline
112
+ end
113
+
114
+ def gen_skip_loop_body(repeat)
115
+ @g << "#{count_name} += 1"
116
+ if repeat.upper_bound?
117
+ @g.newline << "break if #{count_name} >= #{repeat.upper_bound}"
118
+ end
119
+ end
120
+
121
+ def gen_skip_result(repeat)
122
+ @g.block "if #{count_name} >= #{repeat.lower_bound}", '' do
123
+ @g << 'true'
124
+ end
125
+ @g.block 'else' do
126
+ (@g << "@scanner.pos = #{saved_pos_name}").newline << 'false'
127
+ end
128
+ end
129
+
130
+ def gen_assert_loop_body(repeat)
131
+ @g << "#{count_name} += 1"
132
+ @g.newline << "break if #{count_name} >= #{repeat.lower_bound}"
133
+ end
134
+
135
+ def gen_assert_result(repeat)
136
+ @g << "@scanner.pos = #{saved_pos_name}"
137
+ @g.newline << "(#{count_name} >= #{repeat.lower_bound})"
138
+ end
139
+
140
+ def gen_disallow_result(repeat)
141
+ @g << "@scanner.pos = #{saved_pos_name}"
142
+ @g.newline << "(#{count_name} < #{repeat.lower_bound})"
143
+ end
144
+
145
+ def accumulator_name
146
+ "a#{repeat_level}"
147
+ end
148
+
149
+ def saved_pos_name
150
+ "rp#{repeat_level}"
151
+ end
152
+
153
+ def count_name
154
+ "c#{repeat_level}"
155
+ end
156
+
157
+ end
158
+
159
+ # @private
160
+ class NestedGeneralRepeatGenerator < GeneralRepeatGenerator #:nodoc:
161
+ include Nested
162
+ end
163
+
164
+ def GeneralRepeatGenerator.nested(*args)
165
+ NestedGeneralRepeatGenerator.new(*args)
166
+ end
167
+
168
+ # @private
169
+ class TopLevelGeneralRepeatGenerator < GeneralRepeatGenerator #:nodoc:
170
+ include TopLevel
171
+ end
172
+
173
+ def GeneralRepeatGenerator.top_level(*args)
174
+ TopLevelGeneralRepeatGenerator.new(*args)
175
+ end
176
+
177
+ end
@@ -13,7 +13,10 @@ module Rattler::BackEnd::ParserGenerator
13
13
  end
14
14
 
15
15
  def gen_dispatch_action(label, code, scope={})
16
- generate label.child, :dispatch_action, code, scope
16
+ expr :block do
17
+ scope = gen_capturing label.child, scope, label.label
18
+ (@g << ' &&').newline << code.bind(scope, dispatch_action_args)
19
+ end
17
20
  end
18
21
 
19
22
  def gen_direct_action(label, code, scope={})
@@ -0,0 +1,36 @@
1
+ require 'rattler/back_end/parser_generator'
2
+
3
+ module Rattler::BackEnd::ParserGenerator
4
+ # @private
5
+ module List0Generating #:nodoc:
6
+
7
+ def gen_assert(optional, scope={})
8
+ @g << 'true'
9
+ end
10
+
11
+ def gen_disallow(optional, scope={})
12
+ @g << 'false'
13
+ end
14
+
15
+ def gen_skip(list, scope={})
16
+ expr :block do
17
+ gen_skipping list, scope
18
+ @g << "@scanner.pos = #{end_pos_name} unless #{end_pos_name}.nil?"
19
+ @g.newline << 'true'
20
+ end
21
+ end
22
+
23
+ protected
24
+
25
+ def start_capturing(list)
26
+ (@g << "#{accumulator_name} = []").newline
27
+ (@g << "#{end_pos_name} = nil").newline
28
+ end
29
+
30
+ def gen_result(list, captures)
31
+ @g << "@scanner.pos = #{end_pos_name} unless #{end_pos_name}.nil?"
32
+ @g.newline << captures
33
+ end
34
+
35
+ end
36
+ end
@@ -0,0 +1,30 @@
1
+ require 'rattler/back_end/parser_generator'
2
+
3
+ module Rattler::BackEnd::ParserGenerator
4
+ # @private
5
+ module List1Generating #:nodoc:
6
+ include PredicatePropogating
7
+
8
+ def gen_skip(list, scope={})
9
+ expr :block do
10
+ (@g << "#{result_name} = false").newline
11
+ gen_skipping(list, scope) { (@g << "#{result_name} = true").newline }
12
+ @g << "@scanner.pos = #{end_pos_name} unless #{end_pos_name}.nil?"
13
+ @g.newline << result_name
14
+ end
15
+ end
16
+
17
+ protected
18
+
19
+ def start_capturing(list)
20
+ (@g << "#{accumulator_name} = []").newline
21
+ (@g << "#{end_pos_name} = nil").newline
22
+ end
23
+
24
+ def gen_result(list, captures)
25
+ @g << "@scanner.pos = #{end_pos_name} unless #{end_pos_name}.nil?"
26
+ @g.newline << captures << " unless #{accumulator_name}.empty?"
27
+ end
28
+
29
+ end
30
+ end
@@ -3,36 +3,30 @@ require 'rattler/back_end/parser_generator'
3
3
  module Rattler::BackEnd::ParserGenerator
4
4
 
5
5
  # @private
6
- class ListGenerator < ExprGenerator #:nodoc:
7
- include ListGenerating
6
+ class ListGenerator < DelegatingGenerator #:nodoc:
8
7
  include NestedSubGenerating
9
8
 
10
- def gen_assert(optional, scope={})
11
- @g << 'true'
12
- end
9
+ protected
13
10
 
14
- def gen_disallow(optional, scope={})
15
- @g << 'false'
11
+ def impl(list, init_args)
12
+ generator = default_impl(list, init_args)
13
+ specialize_for list, generator
14
+ generator
16
15
  end
17
16
 
18
- def gen_skip(list, scope={})
19
- expr :block do
20
- gen_skipping list, scope
21
- @g.newline << 'true'
17
+ def specialize_for(list, generator)
18
+ case list.lower_bound
19
+ when 0 then generator.extend List0Generating
20
+ when 1 then generator.extend List1Generating
22
21
  end
23
22
  end
24
-
25
- protected
26
-
27
- def gen_result(captures)
28
- @g << captures
29
- end
30
-
31
23
  end
32
24
 
33
25
  # @private
34
26
  class NestedListGenerator < ListGenerator #:nodoc:
35
- include Nested
27
+ def default_impl(list, init_args)
28
+ GeneralListGenerator.nested(*init_args)
29
+ end
36
30
  end
37
31
 
38
32
  def ListGenerator.nested(*args)
@@ -41,7 +35,9 @@ module Rattler::BackEnd::ParserGenerator
41
35
 
42
36
  # @private
43
37
  class TopLevelListGenerator < ListGenerator #:nodoc:
44
- include TopLevel
38
+ def default_impl(list, init_args)
39
+ GeneralListGenerator.top_level(*init_args)
40
+ end
45
41
  end
46
42
 
47
43
  def ListGenerator.top_level(*args)
@@ -0,0 +1,25 @@
1
+ require 'rattler/back_end/parser_generator'
2
+
3
+ module Rattler::BackEnd::ParserGenerator
4
+ # @private
5
+ module OneOrMoreGenerating #:nodoc:
6
+ include PredicatePropogating
7
+
8
+ def gen_skip(one_or_more, scope={})
9
+ expr :block do
10
+ (@g << "#{result_name} = false").newline
11
+ @g << 'while '
12
+ generate one_or_more.child, :intermediate_skip, scope
13
+ @g.block('') { @g << "#{result_name} = true" }.newline
14
+ @g << result_name
15
+ end
16
+ end
17
+
18
+ protected
19
+
20
+ def gen_result(one_or_more, captures)
21
+ @g << captures << " unless #{accumulator_name}.empty?"
22
+ end
23
+
24
+ end
25
+ end
@@ -1,81 +1,66 @@
1
- require 'rattler/back_end/parser_generator'
2
-
3
- module Rattler::BackEnd::ParserGenerator
4
-
5
- # @private
6
- class OptionalGenerator < ExprGenerator #:nodoc:
7
- include NestedSubGenerating
8
-
9
- def gen_basic(optional, scope={})
10
- if optional.capturing?
11
- expr do
12
- @g.surround("(#{result_name} = ", ')') do
13
- generate optional.child, :basic, scope
14
- end
15
- @g << " ? [#{result_name}] : []"
16
- end
17
- else
18
- gen_skip optional, scope
19
- end
20
- end
21
-
22
- def gen_assert(optional, scope={})
23
- @g << 'true'
24
- end
25
-
26
- def gen_disallow(optional, scope={})
27
- @g << 'false'
28
- end
29
-
30
- def gen_dispatch_action(optional, code, scope={})
31
- expr :block do
32
- @g << "#{result_name} = "
33
- generate optional.child, :basic, scope
34
- @g.newline << code.bind(scope, "#{result_name} ? [#{result_name}] : []")
35
- end
36
- end
37
-
38
- def gen_direct_action(optional, code, scope={})
39
- expr :block do
40
- @g << "#{result_name} = "
41
- generate optional.child, :basic, scope
42
- @g.newline <<
43
- '(' << code.bind(scope, ["(#{result_name} ? [#{result_name}] : [])"]) << ')'
44
- end
45
- end
46
-
47
- def gen_token(optional, scope={})
48
- expr :block do
49
- generate optional.child, :token, scope
50
- @g << " || ''"
51
- end
52
- end
53
-
54
- def gen_skip(optional, scope={})
55
- expr :block do
56
- generate optional.child, :intermediate_skip, scope
57
- @g.newline << 'true'
58
- end
59
- end
60
-
61
- end
62
-
63
- # @private
64
- class NestedOptionalGenerator < OptionalGenerator #:nodoc:
65
- include Nested
66
- end
67
-
68
- def OptionalGenerator.nested(*args)
69
- NestedOptionalGenerator.new(*args)
70
- end
71
-
72
- # @private
73
- class TopLevelOptionalGenerator < OptionalGenerator #:nodoc:
74
- include TopLevel
75
- end
76
-
77
- def OptionalGenerator.top_level(*args)
78
- TopLevelOptionalGenerator.new(*args)
79
- end
80
-
81
- end
1
+ require 'rattler/back_end/parser_generator'
2
+
3
+ module Rattler::BackEnd::ParserGenerator
4
+ # @private
5
+ module OptionalGenerating #:nodoc:
6
+
7
+ def gen_assert(optional, scope={})
8
+ @g << 'true'
9
+ end
10
+
11
+ def gen_disallow(optional, scope={})
12
+ @g << 'false'
13
+ end
14
+
15
+ def gen_dispatch_action(optional, code, scope={})
16
+ expr :block do
17
+ gen_loop optional, scope
18
+ @g.newline << code.bind(scope, "#{result_name} ? [#{result_name}] : []")
19
+ end
20
+ end
21
+
22
+ def gen_direct_action(optional, code, scope={})
23
+ expr :block do
24
+ @g << "#{result_name} = "
25
+ generate optional.child, :basic, scope
26
+ @g.newline <<
27
+ '(' << code.bind(scope, ["(#{result_name} ? [#{result_name}] : [])"]) << ')'
28
+ end
29
+ end
30
+
31
+ def gen_token(optional, scope={})
32
+ expr :block do
33
+ generate optional.child, :token, scope
34
+ @g << " || ''"
35
+ end
36
+ end
37
+
38
+ def gen_skip(optional, scope={})
39
+ expr :block do
40
+ generate optional.child, :intermediate_skip, scope
41
+ @g.newline << 'true'
42
+ end
43
+ end
44
+
45
+ protected
46
+
47
+ def gen_capturing(optional, scope)
48
+ expr do
49
+ @g.surround("(#{result_name} = ", ')') do
50
+ generate optional.child, :basic, scope
51
+ end
52
+ @g << " ? [#{result_name}] : []"
53
+ end
54
+ end
55
+
56
+ def gen_loop(optional, scope)
57
+ @g << "#{result_name} = "
58
+ generate optional.child, :basic, scope
59
+ end
60
+
61
+ def gen_result(optional, captures)
62
+ @g.newline << captures
63
+ end
64
+
65
+ end
66
+ end