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
@@ -16,27 +16,30 @@ module Rattler::BackEnd::Optimizer
16
16
 
17
17
  include Rattler::Parsers
18
18
 
19
- @@repeat_types = [ZeroOrMore, OneOrMore, Optional]
20
-
21
19
  protected
22
20
 
23
21
  def _applies_to?(parser, context)
24
22
  context.matching? and
25
- [parser, parser.child].all? {|_| repeat? _ }
23
+ [parser, parser.child].all? {|_| simple_repeat? _ }
26
24
  end
27
25
 
28
26
  def _apply(parser, context)
29
- if @@repeat_types.any? {|_| parser.is_a?(_) and parser.child.is_a?(_) }
27
+ if (parser.zero_or_more? and parser.child.zero_or_more?) or
28
+ (parser.one_or_more? and parser.child.one_or_more?) or
29
+ (parser.optional? and parser.child.optional?)
30
30
  parser.child
31
31
  else
32
- ZeroOrMore[parser.child.child]
32
+ Repeat[parser.child.child, 0, nil]
33
33
  end
34
34
  end
35
35
 
36
36
  private
37
37
 
38
- def repeat?(parser)
39
- @@repeat_types.any? {|_| parser.is_a? _ }
38
+ def simple_repeat?(parser)
39
+ parser.is_a? Repeat and
40
+ ( parser.zero_or_more? or
41
+ parser.one_or_more? or
42
+ parser.optional? )
40
43
  end
41
44
 
42
45
  end
@@ -0,0 +1,40 @@
1
+ #
2
+ # = rattler/back_end/optimizer/normalize_repeat.rb
3
+ #
4
+ # Author:: Jason Arhart
5
+ # Documentation:: Author
6
+ #
7
+ require 'rattler'
8
+
9
+ module Rattler::BackEnd::Optimizer
10
+ #
11
+ # A Repeat with bounds equivalent to optional, zero-or-more, or one-or-more
12
+ # can be replaced by an Optional, a ZeroOrMore, or a OneOrMore, respectively.
13
+ #
14
+ # @author Jason Arhart
15
+ #
16
+ class SpecializeRepeat < Optimization
17
+
18
+ include Rattler::Parsers
19
+
20
+ protected
21
+
22
+ def _applies_to?(parser, context)
23
+ parser.is_a? Repeat and
24
+ ( parser.optional? or
25
+ parser.zero_or_more? or
26
+ parser.one_or_more? )
27
+ end
28
+
29
+ def _apply(parser, context)
30
+ if parser.optional?
31
+ Optional[parser.child]
32
+ elsif parser.zero_or_more?
33
+ ZeroOrMore[parser.child]
34
+ elsif parser.one_or_more?
35
+ OneOrMore[parser.child]
36
+ end
37
+ end
38
+
39
+ end
40
+ end
@@ -27,14 +27,15 @@ module Rattler::BackEnd
27
27
  autoload :MatchGenerator, 'rattler/back_end/parser_generator/match_generator'
28
28
  autoload :ChoiceGenerator, 'rattler/back_end/parser_generator/choice_generator'
29
29
  autoload :SequenceGenerator, 'rattler/back_end/parser_generator/sequence_generator'
30
- autoload :OptionalGenerator, 'rattler/back_end/parser_generator/optional_generator'
31
- autoload :ZeroOrMoreGenerator, 'rattler/back_end/parser_generator/zero_or_more_generator'
32
- autoload :OneOrMoreGenerator, 'rattler/back_end/parser_generator/one_or_more_generator'
30
+ autoload :RepeatGenerator, 'rattler/back_end/parser_generator/repeat_generator'
31
+ autoload :GeneralRepeatGenerator, 'rattler/back_end/parser_generator/general_repeat_generator'
33
32
  autoload :ListGenerator, 'rattler/back_end/parser_generator/list_generator'
34
- autoload :List1Generator, 'rattler/back_end/parser_generator/list1_generator'
33
+ autoload :GeneralListGenerator, 'rattler/back_end/parser_generator/general_list_generator'
35
34
  autoload :ApplyGenerator, 'rattler/back_end/parser_generator/apply_generator'
36
35
  autoload :AssertGenerator, 'rattler/back_end/parser_generator/assert_generator'
37
36
  autoload :DisallowGenerator, 'rattler/back_end/parser_generator/disallow_generator'
37
+ autoload :EofGenerator, 'rattler/back_end/parser_generator/eof_generator'
38
+ autoload :ESymbolGenerator, 'rattler/back_end/parser_generator/e_symbol_generator'
38
39
  autoload :DispatchActionGenerator, 'rattler/back_end/parser_generator/dispatch_action_generator'
39
40
  autoload :DirectActionGenerator, 'rattler/back_end/parser_generator/direct_action_generator'
40
41
  autoload :TokenGenerator, 'rattler/back_end/parser_generator/token_generator'
@@ -42,8 +43,12 @@ module Rattler::BackEnd
42
43
  autoload :LabelGenerator, 'rattler/back_end/parser_generator/label_generator'
43
44
  autoload :BackReferenceGenerator, 'rattler/back_end/parser_generator/back_reference_generator'
44
45
  autoload :FailGenerator, 'rattler/back_end/parser_generator/fail_generator'
45
- autoload :RepeatGenerating, 'rattler/back_end/parser_generator/repeat_generating'
46
- autoload :ListGenerating, 'rattler/back_end/parser_generator/list_generating'
46
+ autoload :DelegatingGenerator, 'rattler/back_end/parser_generator/delegating_generator'
47
+ autoload :ZeroOrMoreGenerating, 'rattler/back_end/parser_generator/zero_or_more_generating'
48
+ autoload :OptionalGenerating, 'rattler/back_end/parser_generator/optional_generating'
49
+ autoload :OneOrMoreGenerating, 'rattler/back_end/parser_generator/one_or_more_generating'
50
+ autoload :List0Generating, 'rattler/back_end/parser_generator/list0_generating'
51
+ autoload :List1Generating, 'rattler/back_end/parser_generator/list1_generating'
47
52
  autoload :PredicatePropogating, 'rattler/back_end/parser_generator/predicate_propogating'
48
53
  autoload :TokenPropogating, 'rattler/back_end/parser_generator/token_propogating'
49
54
  autoload :SkipPropogating, 'rattler/back_end/parser_generator/skip_propogating'
@@ -0,0 +1,20 @@
1
+ require 'rattler/back_end/parser_generator'
2
+
3
+ module Rattler::BackEnd::ParserGenerator
4
+
5
+ # @private
6
+ class DelegatingGenerator < ExprGenerator #:nodoc:
7
+
8
+ def initialize(*args)
9
+ @init_args = args
10
+ super
11
+ end
12
+
13
+ GEN_METHOD_NAMES.each do |symbol|
14
+ define_method(symbol) do |parser, *args|
15
+ impl(parser, @init_args).send symbol, parser, *args
16
+ end
17
+ end
18
+
19
+ end
20
+ end
@@ -0,0 +1,52 @@
1
+ require 'rattler/back_end/parser_generator'
2
+
3
+ module Rattler::BackEnd::ParserGenerator
4
+
5
+ # @private
6
+ class ESymbolGenerator < ExprGenerator #:nodoc:
7
+
8
+ def gen_basic(*_)
9
+ @g << 'true'
10
+ end
11
+
12
+ alias_method :gen_assert, :gen_basic
13
+
14
+ def gen_disallow(*_)
15
+ @g << 'false'
16
+ end
17
+
18
+ def gen_dispatch_action(eof, code, scope={})
19
+ @g << code.bind(scope, '[]')
20
+ end
21
+
22
+ def gen_direct_action(eof, code, scope={})
23
+ expr { @g << code.bind(scope, []) }
24
+ end
25
+
26
+ def gen_token(*_)
27
+ @g << "''"
28
+ end
29
+
30
+ alias_method :gen_skip, :gen_basic
31
+
32
+ end
33
+
34
+ # @private
35
+ class NestedESymbolGenerator < ESymbolGenerator #:nodoc:
36
+ include Nested
37
+ end
38
+
39
+ def ESymbolGenerator.nested(*args)
40
+ NestedESymbolGenerator.new(*args)
41
+ end
42
+
43
+ # @private
44
+ class TopLevelESymbolGenerator < ESymbolGenerator #:nodoc:
45
+ include TopLevel
46
+ end
47
+
48
+ def ESymbolGenerator.top_level(*args)
49
+ TopLevelESymbolGenerator.new(*args)
50
+ end
51
+
52
+ end
@@ -0,0 +1,58 @@
1
+ require 'rattler/back_end/parser_generator'
2
+
3
+ module Rattler::BackEnd::ParserGenerator
4
+
5
+ # @private
6
+ class EofGenerator < ExprGenerator #:nodoc:
7
+
8
+ def gen_basic(*_)
9
+ @g << '@scanner.eos?'
10
+ end
11
+
12
+ alias_method :gen_assert, :gen_basic
13
+
14
+ def gen_disallow(*_)
15
+ expr { @g << '!@scanner.eos?' }
16
+ end
17
+
18
+ def gen_dispatch_action(eof, code, scope={})
19
+ gen_symantic code.bind(scope, '[]')
20
+ end
21
+
22
+ def gen_direct_action(eof, code, scope={})
23
+ gen_symantic '(' + code.bind(scope, []) + ')'
24
+ end
25
+
26
+ def gen_token(*_)
27
+ gen_symantic "''"
28
+ end
29
+
30
+ alias_method :gen_skip, :gen_basic
31
+
32
+ private
33
+
34
+ def gen_symantic(result)
35
+ expr { @g << "#{result} if @scanner.eos?" }
36
+ end
37
+
38
+ end
39
+
40
+ # @private
41
+ class NestedEofGenerator < EofGenerator #:nodoc:
42
+ include Nested
43
+ end
44
+
45
+ def EofGenerator.nested(*args)
46
+ NestedEofGenerator.new(*args)
47
+ end
48
+
49
+ # @private
50
+ class TopLevelEofGenerator < EofGenerator #:nodoc:
51
+ include TopLevel
52
+ end
53
+
54
+ def EofGenerator.top_level(*args)
55
+ TopLevelEofGenerator.new(*args)
56
+ end
57
+
58
+ end
@@ -30,10 +30,10 @@ module Rattler::BackEnd::ParserGenerator
30
30
 
31
31
  def gen_token(parser, scope={})
32
32
  expr :block do
33
- (@g << "tp = @scanner.pos").newline
33
+ (@g << "#{token_pos_name} = @scanner.pos").newline
34
34
  gen_intermediate_skip parser, scope
35
35
  (@g << ' &&').newline
36
- @g << "@scanner.string[tp...(@scanner.pos)]"
36
+ @g << "@scanner.string[#{token_pos_name}...(@scanner.pos)]"
37
37
  end
38
38
  end
39
39
 
@@ -65,6 +65,10 @@ module Rattler::BackEnd::ParserGenerator
65
65
  "p#{sequence_level}"
66
66
  end
67
67
 
68
+ def token_pos_name
69
+ "tp#{sequence_level}"
70
+ end
71
+
68
72
  def lookahead
69
73
  (@g << "#{saved_pos_name} = @scanner.pos").newline
70
74
  yield
@@ -1,13 +1,23 @@
1
1
  require 'rattler/back_end/parser_generator'
2
2
 
3
3
  module Rattler::BackEnd::ParserGenerator
4
-
4
+
5
5
  # @private
6
6
  GEN_METHOD_TYPES = %w{
7
- basic assert disallow dispatch_action direct_action token skip
7
+ basic
8
+ assert
9
+ disallow
10
+ dispatch_action
11
+ direct_action
12
+ token
13
+ skip
14
+ intermediate
15
+ intermediate_assert
16
+ intermediate_disallow
17
+ intermediate_skip
8
18
  }
9
-
10
- # @private
19
+
20
+ @private
11
21
  GEN_METHOD_NAMES = GEN_METHOD_TYPES.map {|_| :"gen_#{_}" }
12
-
22
+
13
23
  end
@@ -0,0 +1,194 @@
1
+ require 'rattler/back_end/parser_generator'
2
+
3
+ module Rattler::BackEnd::ParserGenerator
4
+
5
+ # @private
6
+ class GeneralListGenerator < ExprGenerator #:nodoc:
7
+ include NestedSubGenerating
8
+
9
+ def initialize(*args)
10
+ @init_args = args
11
+ super
12
+ end
13
+
14
+ def gen_basic(list, scope={})
15
+ if list.capturing?
16
+ gen_capturing list, scope
17
+ else
18
+ gen_skip list, scope
19
+ end
20
+ end
21
+
22
+ def gen_dispatch_action(list, code, scope={})
23
+ gen_capturing list, scope do |a|
24
+ code.bind scope, "select_captures(#{a})"
25
+ end
26
+ end
27
+
28
+ def gen_direct_action(list, code, scope={})
29
+ gen_capturing list, scope do |a|
30
+ '(' + code.bind(scope, ["select_captures(#{a})"]) + ')'
31
+ end
32
+ end
33
+
34
+ def gen_assert(list, scope={})
35
+ gen_predicate(list, scope) do
36
+ @g.newline << "#{count_name} >= #{list.lower_bound}"
37
+ end
38
+ end
39
+
40
+ def gen_disallow(list, scope={})
41
+ gen_predicate(list, scope) do
42
+ @g.newline << "#{count_name} < #{list.lower_bound}"
43
+ end
44
+ end
45
+
46
+ def gen_skip(list, scope={})
47
+ expr :block do
48
+ (@g << "#{count_name} = 0").newline
49
+ (@g << "#{start_pos_name} = @scanner.pos").newline
50
+ gen_skipping(list, scope) { (@g << "#{count_name} += 1").newline }
51
+ gen_skipping_result list
52
+ end
53
+ end
54
+
55
+ protected
56
+
57
+ def gen_capturing(list, scope)
58
+ expr :block do
59
+ start_capturing list
60
+ gen_capturing_loop list, scope
61
+ gen_result(list, block_given? ? yield(accumulator_name) : accumulator_name)
62
+ end
63
+ end
64
+
65
+ def start_capturing(list)
66
+ (@g << "#{accumulator_name} = []").newline
67
+ (@g << "#{start_pos_name} = @scanner.pos").newline
68
+ (@g << "#{end_pos_name} = nil").newline
69
+ end
70
+
71
+ def gen_capturing_loop(list, scope)
72
+ @g << "while #{result_name} = "
73
+ generate list.child, :basic, scope
74
+ @g.block '' do
75
+ @g << "#{end_pos_name} = @scanner.pos"
76
+ gen_capturing_loop_body list
77
+ gen_skip_separator list.sep_parser, scope
78
+ end.newline
79
+ end
80
+
81
+ def gen_capturing_loop_body(list)
82
+ @g.newline << "#{accumulator_name} << #{result_name}"
83
+ gen_upper_bound_check list, "#{accumulator_name}.size"
84
+ end
85
+
86
+ def gen_result(list, captures)
87
+ @g.block "if #{accumulator_name}.size >= #{list.lower_bound}", '' do
88
+ @g << "@scanner.pos = #{end_pos_name} unless #{end_pos_name}.nil?"
89
+ @g.newline << captures
90
+ end
91
+ @g.block 'else' do
92
+ (@g << "@scanner.pos = #{start_pos_name}").newline << 'false'
93
+ end
94
+ end
95
+
96
+ def gen_predicate(list, scope)
97
+ expr :block do
98
+ @g << "#{count_name} = 0"
99
+ @g.newline << "#{start_pos_name} = @scanner.pos"
100
+ gen_loop list, :intermediate_skip, scope do
101
+ gen_predicate_loop_body list
102
+ end
103
+ @g.newline << "@scanner.pos = #{start_pos_name}"
104
+ yield
105
+ end
106
+ end
107
+
108
+ def gen_predicate_loop_body(list)
109
+ @g << "#{count_name} += 1"
110
+ gen_upper_bound_check list, count_name
111
+ end
112
+
113
+ def gen_skipping(list, scope)
114
+ @g << "#{end_pos_name} = nil"
115
+ gen_loop list, :intermediate_skip, scope do
116
+ yield if block_given?
117
+ gen_skipping_loop_body list
118
+ end
119
+ @g.newline
120
+ end
121
+
122
+ def gen_skipping_loop_body(list)
123
+ @g << "#{end_pos_name} = @scanner.pos"
124
+ gen_upper_bound_check list, count_name
125
+ end
126
+
127
+ def gen_skipping_result(list)
128
+ @g.block "if #{count_name} >= #{list.lower_bound}", '' do
129
+ @g << "@scanner.pos = #{end_pos_name} unless #{end_pos_name}.nil?"
130
+ @g.newline << 'true'
131
+ end
132
+ @g.block 'else' do
133
+ @g << "@scanner.pos = #{start_pos_name}"
134
+ @g.newline << 'false'
135
+ end
136
+ end
137
+
138
+ def gen_loop(list, term_as, scope)
139
+ @g.newline << 'while '
140
+ generate list.term_parser, term_as, scope
141
+ @g.block '' do
142
+ yield if block_given?
143
+ gen_skip_separator list.sep_parser, scope
144
+ end
145
+ end
146
+
147
+ def gen_upper_bound_check(list, count_expr)
148
+ if list.upper_bound?
149
+ @g.newline << "break unless #{count_expr} < #{list.upper_bound}"
150
+ end
151
+ end
152
+
153
+ def gen_skip_separator(sep_parser, scope)
154
+ @g.newline << 'break unless '
155
+ generate sep_parser, :intermediate_skip, scope
156
+ end
157
+
158
+ def accumulator_name
159
+ "a#{repeat_level}"
160
+ end
161
+
162
+ def start_pos_name
163
+ "sp#{repeat_level}"
164
+ end
165
+
166
+ def end_pos_name
167
+ "ep#{repeat_level}"
168
+ end
169
+
170
+ def count_name
171
+ "c#{repeat_level}"
172
+ end
173
+
174
+ end
175
+
176
+ # @private
177
+ class NestedGeneralListGenerator < GeneralListGenerator #:nodoc:
178
+ include Nested
179
+ end
180
+
181
+ def GeneralListGenerator.nested(*args)
182
+ NestedGeneralListGenerator.new(*args)
183
+ end
184
+
185
+ # @private
186
+ class TopLevelGeneralListGenerator < GeneralListGenerator #:nodoc:
187
+ include TopLevel
188
+ end
189
+
190
+ def GeneralListGenerator.top_level(*args)
191
+ TopLevelGeneralListGenerator.new(*args)
192
+ end
193
+
194
+ end