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
@@ -3,11 +3,14 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
3
3
  describe DirectAction do
4
4
  include CombinatorParserSpecHelper
5
5
 
6
+ subject { DirectAction[nested, code] }
7
+
6
8
  describe '#parse' do
7
9
 
8
10
  context 'with a capturing parser' do
9
11
 
10
- subject { DirectAction[Match[/[[:digit:]]+/], '|s| s * 2'] }
12
+ let(:nested) { Match[/[[:digit:]]+/] }
13
+ let(:code) { '|s| s * 2' }
11
14
 
12
15
  context 'when the parser matches' do
13
16
  it 'applies the action binding the captured results as arguments' do
@@ -23,7 +26,7 @@ describe DirectAction do
23
26
 
24
27
  context 'using the "_" character' do
25
28
 
26
- subject { DirectAction[Match[/[[:digit:]]+/], '_ * 2'] }
29
+ let(:code) { '_ * 2' }
27
30
 
28
31
  it 'applies the action binding the captured result as "_"' do
29
32
  parsing('451a').should result_in('451451').at(3)
@@ -32,13 +35,13 @@ describe DirectAction do
32
35
  end
33
36
 
34
37
  context 'with a sequence parser' do
35
- subject do
36
- DirectAction[
37
- Sequence[Match[/[[:alpha:]]+/], Skip[Match[/\=/]], Match[/[[:digit:]]+/]],
38
- '|l, r| "#{r} -> #{l}"'
39
- ]
38
+
39
+ let :nested do
40
+ Sequence[Match[/[[:alpha:]]+/], Skip[Match[/\=/]], Match[/[[:digit:]]+/]]
40
41
  end
41
42
 
43
+ let(:code) { '|l, r| "#{r} -> #{l}"' }
44
+
42
45
  context 'when the parser matches' do
43
46
  it 'applies the action binding the captured results as arguments' do
44
47
  parsing('val=42 ').should result_in('42 -> val').at(6)
@@ -46,12 +49,8 @@ describe DirectAction do
46
49
  end
47
50
 
48
51
  context 'using the "_" character' do
49
- subject do
50
- DirectAction[
51
- Sequence[Match[/[[:alpha:]]+/], Skip[Match[/\=/]], Match[/[[:digit:]]+/]],
52
- '_.join " <- "'
53
- ]
54
- end
52
+
53
+ let(:code) { '_.join " <- "' }
55
54
 
56
55
  it 'applies the action binding the captured result array as "_"' do
57
56
  parsing('val=42 ').should result_in('val <- 42').at(6)
@@ -61,11 +60,12 @@ describe DirectAction do
61
60
 
62
61
  context 'with an optional parser' do
63
62
 
64
- subject { DirectAction[Optional[Match[/\d+/]], '|s| s'] }
63
+ let(:nested) { Repeat[Match[/\d/], 0, 1] }
64
+ let(:code) { '|s| s' }
65
65
 
66
66
  context 'when the nested parser matches' do
67
67
  it 'applies the action to an array containing the match' do
68
- parsing('451a').should result_in(['451']).at(3)
68
+ parsing('451a').should result_in(['4']).at(1)
69
69
  end
70
70
  end
71
71
 
@@ -78,11 +78,12 @@ describe DirectAction do
78
78
 
79
79
  context 'with a zero-or-more parser' do
80
80
 
81
- subject { DirectAction[ZeroOrMore[Match[/\d/]], '|s| s'] }
81
+ let(:nested) { Repeat[Match[/\d/], 0, nil] }
82
+ let(:code) { '|s| s * 2' }
82
83
 
83
84
  context 'when the nested parser matches' do
84
85
  it 'applies the action to an array containing the matches' do
85
- parsing('451a').should result_in(['4', '5', '1']).at(3)
86
+ parsing('451a').should result_in(%w{4 5 1 4 5 1}).at(3)
86
87
  end
87
88
  end
88
89
 
@@ -95,7 +96,8 @@ describe DirectAction do
95
96
 
96
97
  context 'with a one-or-more parser' do
97
98
 
98
- subject { DirectAction[OneOrMore[Match[/\d/]], '|s| s * 2'] }
99
+ let(:nested) { Repeat[Match[/\d/], 1, nil] }
100
+ let(:code) { '|s| s * 2' }
99
101
 
100
102
  context 'when the nested parser matches' do
101
103
  it 'applies the action to an array containing the matches' do
@@ -110,8 +112,28 @@ describe DirectAction do
110
112
  end
111
113
  end
112
114
 
115
+ context 'with a list parser' do
116
+
117
+ let(:nested) { ListParser[Match[/[[:digit:]]+/], Match[/,/], 2, 4] }
118
+ let(:code) { '_.map {|s| s.to_i }' }
119
+
120
+ context 'when the nested parser matches' do
121
+ it 'applies the action to an array containing the matches' do
122
+ parsing('1,2,42').should result_in([1, 2, 42]).at(6)
123
+ end
124
+ end
125
+
126
+ context 'when the nested parser fails' do
127
+ it 'fails' do
128
+ parsing('foo').should fail
129
+ end
130
+ end
131
+ end
132
+
113
133
  context 'with a token parser' do
114
- subject { DirectAction[Token[Match[/[[:digit:]]+/]], '|s| s.to_i'] }
134
+
135
+ let(:nested) { Token[Match[/[[:digit:]]+/]] }
136
+ let(:code) { '|s| s.to_i' }
115
137
 
116
138
  context 'when the parser matches' do
117
139
  it 'applies the action to the matched string' do
@@ -122,7 +144,8 @@ describe DirectAction do
122
144
 
123
145
  context 'with a non-capturing parser' do
124
146
 
125
- subject { DirectAction[Skip[Match[/\w+/]], '42'] }
147
+ let(:nested) { Skip[Match[/\w+/]] }
148
+ let(:code) { '42' }
126
149
 
127
150
  context 'when the parser matches' do
128
151
  it 'applies the action with no arguments' do
@@ -132,12 +155,10 @@ describe DirectAction do
132
155
  end
133
156
 
134
157
  context 'with a labeled parser' do
135
- subject do
136
- DirectAction[
137
- Label[:word, Match[/[[:alpha:]]+/]],
138
- "word * 2"
139
- ]
140
- end
158
+
159
+ let(:nested) { Label[:word, Match[/[[:alpha:]]+/]] }
160
+ let(:code) { 'word * 2' }
161
+
141
162
  context 'when the parser matches' do
142
163
  it 'applies the action binding the label to the result' do
143
164
  parsing('foo ').should result_in('foofoo').at(3)
@@ -146,16 +167,17 @@ describe DirectAction do
146
167
  end
147
168
 
148
169
  context 'with a sequence of labeled parsers' do
149
- subject do
150
- DirectAction[
151
- Sequence[
152
- Label[:left, Match[/[[:alpha:]]+/]],
153
- Match[/\=/],
154
- Label[:right, Match[/[[:digit:]]+/]]
155
- ],
156
- '"#{right} -> #{left}"'
170
+
171
+ let :nested do
172
+ Sequence[
173
+ Label[:left, Match[/[[:alpha:]]+/]],
174
+ Match[/\=/],
175
+ Label[:right, Match[/[[:digit:]]+/]]
157
176
  ]
158
177
  end
178
+
179
+ let(:code) { '"#{right} -> #{left}"' }
180
+
159
181
  context 'when the parser matches' do
160
182
  it 'applies the action binding the labels to the results' do
161
183
  parsing('val=42 ').should result_in('42 -> val').at(6)
@@ -166,19 +188,37 @@ describe DirectAction do
166
188
 
167
189
  describe '#capturing?' do
168
190
 
191
+ let(:code) { '' }
192
+
169
193
  context 'with a capturing parser' do
170
- subject { DirectAction[Match[/\w+/], ''] }
194
+
195
+ let(:nested) { Match[/\w+/] }
196
+
171
197
  it 'is true' do
172
198
  subject.should be_capturing
173
199
  end
174
200
  end
175
201
 
176
202
  context 'with a non-capturing parser' do
177
- subject { DirectAction[Skip[Match[/\s*/]], ''] }
203
+
204
+ let(:nested) { Skip[Match[/\s*/]] }
205
+
178
206
  it 'is false' do
179
207
  subject.should_not be_capturing
180
208
  end
181
209
  end
182
210
  end
183
211
 
212
+ describe '#with_ws' do
213
+
214
+ let(:ws) { Match[/\s*/] }
215
+ let(:nested) { Match[/\w+/] }
216
+ let(:code) { '' }
217
+
218
+ it 'applies #with_ws to the nested parser' do
219
+ subject.with_ws(ws).
220
+ should == DirectAction[Sequence[Skip[ws], nested], code]
221
+ end
222
+ end
223
+
184
224
  end
@@ -3,28 +3,39 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
3
3
  describe Disallow do
4
4
  include CombinatorParserSpecHelper
5
5
 
6
- subject { Disallow[Match[/\w+/]] }
7
-
6
+ subject { Disallow[nested] }
7
+
8
+ let(:nested) { Match[/\w+/] }
9
+
8
10
  describe '#parse' do
9
-
11
+
10
12
  context 'when the parser matches' do
11
13
  it 'fails' do
12
14
  parsing('abc123').should fail
13
15
  end
14
16
  end
15
-
17
+
16
18
  context 'when the parser fails' do
17
19
  it 'returns true without advancing' do
18
20
  parsing(' ').should result_in(true).at(0)
19
21
  end
20
22
  end
21
-
23
+
22
24
  end
23
-
25
+
24
26
  describe '#capturing?' do
25
27
  it 'is false' do
26
28
  subject.should_not be_capturing
27
29
  end
28
30
  end
29
-
31
+
32
+ describe '#with_ws' do
33
+
34
+ let(:ws) { Match[/\s*/] }
35
+
36
+ it 'applies #with_ws to the nested parser' do
37
+ subject.with_ws(ws).should == Disallow[Sequence[Skip[ws], nested]]
38
+ end
39
+ end
40
+
30
41
  end
@@ -3,13 +3,31 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
3
3
  describe DispatchAction do
4
4
  include CombinatorParserSpecHelper
5
5
 
6
- subject { DispatchAction[nested_parser] }
6
+ subject { DispatchAction[nested] }
7
7
 
8
8
  describe '#parse' do
9
9
 
10
10
  context 'with a capturing parser' do
11
11
 
12
- let (:nested_parser) { Sequence[
12
+ let(:nested) { Match[/[[:digit:]]+/] }
13
+
14
+ context 'when the parser matches' do
15
+ it 'applies the action to the result' do
16
+ parsing('451a').
17
+ should result_in(Rattler::Runtime::ParseNode.parsed(['451'])).at(3)
18
+ end
19
+ end
20
+
21
+ context 'when the parser fails' do
22
+ it 'fails' do
23
+ parsing('foo').should fail
24
+ end
25
+ end
26
+ end
27
+
28
+ context 'with a sequence parser' do
29
+
30
+ let(:nested) { Sequence[
13
31
  Match[/[[:alpha:]]+/], Match[/\=/], Match[/[[:digit:]]+/]
14
32
  ] }
15
33
 
@@ -27,21 +45,83 @@ describe DispatchAction do
27
45
  end
28
46
  end
29
47
 
30
- context 'with a non-capturing parser' do
48
+ context 'with an optional parser' do
31
49
 
32
- let (:nested_parser) { Skip[Match[/,/]] }
50
+ let(:nested) { Repeat[Match[/\d/], 0, 1] }
33
51
 
34
- context 'when the parser matches' do
52
+ context 'when the nested parser matches' do
53
+ it 'applies the action to an array containing the match' do
54
+ parsing('451a').
55
+ should result_in(Rattler::Runtime::ParseNode.parsed(['4'])).at(1)
56
+ end
57
+ end
58
+
59
+ context 'when the nested parser fails' do
35
60
  it 'applies the action to an empty array' do
36
- parsing(', ').
37
- should result_in(Rattler::Runtime::ParseNode.parsed([])).at(1)
61
+ parsing('foo').
62
+ should result_in(Rattler::Runtime::ParseNode.parsed([])).at(0)
63
+ end
64
+ end
65
+ end
66
+
67
+ context 'with a zero-or-more parser' do
68
+
69
+ let(:nested) { Repeat[Match[/\d/], 0, nil] }
70
+
71
+ context 'when the nested parser matches' do
72
+ it 'applies the action to an array containing the matches' do
73
+ parsing('451a').
74
+ should result_in(Rattler::Runtime::ParseNode.parsed(['4', '5', '1'])).at(3)
75
+ end
76
+ end
77
+
78
+ context 'when the nested parser fails' do
79
+ it 'applies the action to an empty array' do
80
+ parsing('foo').
81
+ should result_in(Rattler::Runtime::ParseNode.parsed([])).at(0)
82
+ end
83
+ end
84
+ end
85
+
86
+ context 'with a one-or-more parser' do
87
+
88
+ let(:nested) { Repeat[Match[/\d/], 1, nil] }
89
+
90
+ context 'when the nested parser matches' do
91
+ it 'applies the action to an array containing the matches' do
92
+ parsing('451a').
93
+ should result_in(Rattler::Runtime::ParseNode.parsed(['4', '5', '1'])).at(3)
94
+ end
95
+ end
96
+
97
+ context 'when the nested parser fails' do
98
+ it 'fails' do
99
+ parsing('foo').should fail
100
+ end
101
+ end
102
+ end
103
+
104
+ context 'with a list parser' do
105
+
106
+ let(:nested) { ListParser[Match[/[[:digit:]]+/], Match[/,/], 2, 4] }
107
+
108
+ context 'when the nested parser matches' do
109
+ it 'applies the action to an array containing the matches' do
110
+ parsing('1,2,42').
111
+ should result_in(Rattler::Runtime::ParseNode.parsed(['1', '2', '42'])).at(6)
112
+ end
113
+ end
114
+
115
+ context 'when the nested parser fails' do
116
+ it 'fails' do
117
+ parsing('foo').should fail
38
118
  end
39
119
  end
40
120
  end
41
121
 
42
122
  context 'with a token parser' do
43
123
 
44
- subject { DispatchAction[Token[Match[/\w+/]]] }
124
+ let(:nested) { Token[Match[/\w+/]] }
45
125
 
46
126
  context 'when the parser matches' do
47
127
  it 'applies the action to the matched string' do
@@ -53,26 +133,37 @@ describe DispatchAction do
53
133
 
54
134
  context 'with a non-capturing parser' do
55
135
 
56
- subject { DispatchAction[Skip[Match[/\w+/]]] }
136
+ let(:nested) { Skip[Match[/,/]] }
57
137
 
58
138
  context 'when the parser matches' do
59
139
  it 'applies the action to an empty array' do
60
- parsing('abc123 ').
61
- should result_in(Rattler::Runtime::ParseNode.parsed([])).at(6)
140
+ parsing(', ').
141
+ should result_in(Rattler::Runtime::ParseNode.parsed([])).at(1)
62
142
  end
63
143
  end
64
144
  end
65
145
 
66
- context 'with a sequence of labeled parsers' do
67
- subject do
68
- DispatchAction[
69
- Sequence[
70
- Label[:name, Match[/[[:alpha:]]+/]],
71
- Match[/\=/],
72
- Label[:value, Match[/[[:digit:]]+/]]
73
- ]
74
- ]
146
+ context 'with a labeled parser' do
147
+
148
+ let(:nested) { Label[:word, Match[/[[:alpha:]]+/]] }
149
+
150
+ context 'when the parser matches' do
151
+ it 'applies the action binding the label to the result' do
152
+ parsing('foo ').
153
+ should result_in(Rattler::Runtime::ParseNode.parsed(['foo'],
154
+ :labeled => {:word => 'foo'}))
155
+ end
75
156
  end
157
+ end
158
+
159
+ context 'with a sequence of labeled parsers' do
160
+
161
+ let(:nested) { Sequence[
162
+ Label[:name, Match[/[[:alpha:]]+/]],
163
+ Match[/\=/],
164
+ Label[:value, Match[/[[:digit:]]+/]]
165
+ ] }
166
+
76
167
  context 'when the parser matches' do
77
168
  it 'applies the action binding the labels to the results' do
78
169
  parsing('val=42 ').
@@ -86,18 +177,33 @@ describe DispatchAction do
86
177
  describe '#capturing?' do
87
178
 
88
179
  context 'with a capturing parser' do
89
- subject { DispatchAction[Match[/\w+/]] }
180
+
181
+ let(:nested) { Match[/\w+/] }
182
+
90
183
  it 'is true' do
91
184
  subject.should be_capturing
92
185
  end
93
186
  end
94
187
 
95
188
  context 'with a non-capturing parser' do
96
- subject { DispatchAction[Skip[Match[/\s*/]]] }
189
+
190
+ let(:nested) { Skip[Match[/\s*/]] }
191
+
97
192
  it 'is false' do
98
193
  subject.should_not be_capturing
99
194
  end
100
195
  end
101
196
  end
102
197
 
198
+ describe '#with_ws' do
199
+
200
+ let(:ws) { Match[/\s*/] }
201
+ let(:nested) { Match[/\w+/] }
202
+
203
+ it 'applies #with_ws to the nested parser' do
204
+ subject.with_ws(ws).
205
+ should == DispatchAction[Sequence[Skip[ws], nested]]
206
+ end
207
+ end
208
+
103
209
  end