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
@@ -70,7 +70,7 @@ describe LabelGenerator do
70
70
  should == (<<-CODE).strip
71
71
  begin
72
72
  (r = @scanner.scan(/\\w+/)) &&
73
- Word.parsed([r])
73
+ Word.parsed([r], :labeled => {:word => r})
74
74
  end
75
75
  CODE
76
76
  end
@@ -81,7 +81,7 @@ end
81
81
  top_level_code {|g| g.gen_dispatch_action label, code }.
82
82
  should == (<<-CODE).strip
83
83
  (r = @scanner.scan(/\\w+/)) &&
84
- Word.parsed([r])
84
+ Word.parsed([r], :labeled => {:word => r})
85
85
  CODE
86
86
  end
87
87
  end
@@ -89,10 +89,10 @@ Word.parsed([r])
89
89
 
90
90
  describe '#gen_direct_action' do
91
91
 
92
- let(:code) { ActionCode.new('|_| _.to_sym') }
92
+ let(:code) { ActionCode.new('word.to_sym') }
93
93
 
94
94
  context 'when nested' do
95
- it 'generates nested matching code with a direct action' do
95
+ it 'generates nested matching code with a direct action using the label' do
96
96
  nested_code {|g| g.gen_direct_action label, code }.
97
97
  should == (<<-CODE).strip
98
98
  begin
@@ -0,0 +1,322 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
+
3
+ shared_examples_for 'a list0 generator' do
4
+
5
+ let(:term_parser) { Match[/w+/] }
6
+ let(:sep_parser) { Match[/[,;]/] }
7
+ let(:bounds) { [0, nil] }
8
+
9
+ describe '#gen_basic' do
10
+
11
+ let(:term_parser) { Choice[Match[/[[:alpha:]]/], Match[/[[:digit:]]/]] }
12
+
13
+ context 'given a list with zero-or-more bounds' do
14
+
15
+ context 'when nested' do
16
+ it 'generates nested list matching code' do
17
+ nested_code {|g| g.gen_basic list }.
18
+ should == (<<-CODE).strip
19
+ begin
20
+ a = []
21
+ ep = nil
22
+ while r = begin
23
+ @scanner.scan(/[[:alpha:]]/) ||
24
+ @scanner.scan(/[[:digit:]]/)
25
+ end
26
+ ep = @scanner.pos
27
+ a << r
28
+ break unless @scanner.skip(/[,;]/)
29
+ end
30
+ @scanner.pos = ep unless ep.nil?
31
+ a
32
+ end
33
+ CODE
34
+ end
35
+ end
36
+
37
+ context 'when top-level' do
38
+ it 'generates top-level list matching code' do
39
+ top_level_code {|g| g.gen_basic list }.
40
+ should == (<<-CODE).strip
41
+ a = []
42
+ ep = nil
43
+ while r = begin
44
+ @scanner.scan(/[[:alpha:]]/) ||
45
+ @scanner.scan(/[[:digit:]]/)
46
+ end
47
+ ep = @scanner.pos
48
+ a << r
49
+ break unless @scanner.skip(/[,;]/)
50
+ end
51
+ @scanner.pos = ep unless ep.nil?
52
+ a
53
+ CODE
54
+ end
55
+ end
56
+ end
57
+
58
+ context 'given a non-capturing list' do
59
+
60
+ let(:term_parser) { Skip[Match[/w+/]] }
61
+
62
+ context 'with zero-or-more bounds' do
63
+
64
+ context 'when nested' do
65
+ it 'generates nested list skipping code' do
66
+ nested_code {|g| g.gen_basic list }.
67
+ should == (<<-CODE).strip
68
+ begin
69
+ ep = nil
70
+ while @scanner.skip(/w+/)
71
+ ep = @scanner.pos
72
+ break unless @scanner.skip(/[,;]/)
73
+ end
74
+ @scanner.pos = ep unless ep.nil?
75
+ true
76
+ end
77
+ CODE
78
+ end
79
+ end
80
+
81
+ context 'when top-level' do
82
+ it 'generates nested list skipping code' do
83
+ top_level_code {|g| g.gen_basic list }.
84
+ should == (<<-CODE).strip
85
+ ep = nil
86
+ while @scanner.skip(/w+/)
87
+ ep = @scanner.pos
88
+ break unless @scanner.skip(/[,;]/)
89
+ end
90
+ @scanner.pos = ep unless ep.nil?
91
+ true
92
+ CODE
93
+ end
94
+ end
95
+ end
96
+ end
97
+
98
+ end
99
+
100
+ describe '#gen_assert' do
101
+
102
+ context 'given a list with zero-or-more bounds' do
103
+
104
+ context 'when nested' do
105
+ it 'generates "true"' do
106
+ nested_code {|g| g.gen_assert list }.should == 'true'
107
+ end
108
+ end
109
+
110
+ context 'when top-level' do
111
+ it 'generates "true"' do
112
+ top_level_code {|g| g.gen_assert list }.should == 'true'
113
+ end
114
+ end
115
+ end
116
+ end
117
+
118
+ describe '#gen_disallow' do
119
+
120
+ context 'given a list with zero-or-more bounds' do
121
+
122
+ context 'when nested' do
123
+ it 'generates "false"' do
124
+ nested_code {|g| g.gen_disallow list }.should == 'false'
125
+ end
126
+ end
127
+
128
+ context 'when top-level' do
129
+ it 'generates "false"' do
130
+ top_level_code {|g| g.gen_disallow list }.should == 'false'
131
+ end
132
+ end
133
+ end
134
+ end
135
+
136
+ describe '#gen_dispatch_action' do
137
+
138
+ let(:code) { NodeCode.new('Word', 'parsed') }
139
+
140
+ context 'given a list with zero-or-more bounds' do
141
+
142
+ context 'when nested' do
143
+ it 'generates nested list matching code with a dispatch action' do
144
+ nested_code {|g| g.gen_dispatch_action list, code }.
145
+ should == (<<-CODE).strip
146
+ begin
147
+ a = []
148
+ ep = nil
149
+ while r = @scanner.scan(/w+/)
150
+ ep = @scanner.pos
151
+ a << r
152
+ break unless @scanner.skip(/[,;]/)
153
+ end
154
+ @scanner.pos = ep unless ep.nil?
155
+ Word.parsed(select_captures(a))
156
+ end
157
+ CODE
158
+ end
159
+ end
160
+
161
+ context 'when top-level' do
162
+ it 'generates top level list matching code with a dispatch action' do
163
+ top_level_code {|g| g.gen_dispatch_action list, code }.
164
+ should == (<<-CODE).strip
165
+ a = []
166
+ ep = nil
167
+ while r = @scanner.scan(/w+/)
168
+ ep = @scanner.pos
169
+ a << r
170
+ break unless @scanner.skip(/[,;]/)
171
+ end
172
+ @scanner.pos = ep unless ep.nil?
173
+ Word.parsed(select_captures(a))
174
+ CODE
175
+ end
176
+ end
177
+ end
178
+ end
179
+
180
+ describe '#gen_direct_action' do
181
+
182
+ let(:code) { ActionCode.new('|_| _.size') }
183
+
184
+ context 'given a list with zero-or-more bounds' do
185
+
186
+ context 'when nested' do
187
+ it 'generates nested list matching code with a dispatch action' do
188
+ nested_code {|g| g.gen_direct_action list, code }.
189
+ should == (<<-CODE).strip
190
+ begin
191
+ a = []
192
+ ep = nil
193
+ while r = @scanner.scan(/w+/)
194
+ ep = @scanner.pos
195
+ a << r
196
+ break unless @scanner.skip(/[,;]/)
197
+ end
198
+ @scanner.pos = ep unless ep.nil?
199
+ (select_captures(a).size)
200
+ end
201
+ CODE
202
+ end
203
+ end
204
+
205
+ context 'when top-level' do
206
+ it 'generates top level list matching code with a dispatch action' do
207
+ top_level_code {|g| g.gen_direct_action list, code }.
208
+ should == (<<-CODE).strip
209
+ a = []
210
+ ep = nil
211
+ while r = @scanner.scan(/w+/)
212
+ ep = @scanner.pos
213
+ a << r
214
+ break unless @scanner.skip(/[,;]/)
215
+ end
216
+ @scanner.pos = ep unless ep.nil?
217
+ (select_captures(a).size)
218
+ CODE
219
+ end
220
+ end
221
+ end
222
+ end
223
+
224
+ describe '#gen_skip' do
225
+
226
+ context 'given a list with zero-or-more bounds' do
227
+
228
+ context 'when nested' do
229
+ it 'generates nested list skipping code' do
230
+ nested_code {|g| g.gen_skip list }.
231
+ should == (<<-CODE).strip
232
+ begin
233
+ ep = nil
234
+ while @scanner.skip(/w+/)
235
+ ep = @scanner.pos
236
+ break unless @scanner.skip(/[,;]/)
237
+ end
238
+ @scanner.pos = ep unless ep.nil?
239
+ true
240
+ end
241
+ CODE
242
+ end
243
+ end
244
+
245
+ context 'when top-level' do
246
+ it 'generates top-level list skipping code' do
247
+ top_level_code {|g| g.gen_skip list }.
248
+ should == (<<-CODE).strip
249
+ ep = nil
250
+ while @scanner.skip(/w+/)
251
+ ep = @scanner.pos
252
+ break unless @scanner.skip(/[,;]/)
253
+ end
254
+ @scanner.pos = ep unless ep.nil?
255
+ true
256
+ CODE
257
+ end
258
+ end
259
+ end
260
+ end
261
+
262
+ describe '#gen_intermediate' do
263
+
264
+ context 'given a list with zero-or-more bounds' do
265
+ it 'generates nested list matching code' do
266
+ nested_code {|g| g.gen_intermediate list }.
267
+ should == (<<-CODE).strip
268
+ begin
269
+ a = []
270
+ ep = nil
271
+ while r = @scanner.scan(/w+/)
272
+ ep = @scanner.pos
273
+ a << r
274
+ break unless @scanner.skip(/[,;]/)
275
+ end
276
+ @scanner.pos = ep unless ep.nil?
277
+ a
278
+ end
279
+ CODE
280
+ end
281
+ end
282
+ end
283
+
284
+ describe '#gen_intermediate_assert' do
285
+
286
+ context 'given a list with zero-or-more bounds' do
287
+ it 'generates "true"' do
288
+ nested_code {|g| g.gen_intermediate_assert list }.should == 'true'
289
+ end
290
+ end
291
+ end
292
+
293
+ describe '#gen_intermediate_disallow' do
294
+
295
+ context 'given a list with zero-or-more bounds' do
296
+ it 'generates "false"' do
297
+ nested_code {|g| g.gen_intermediate_disallow list }.should == 'false'
298
+ end
299
+ end
300
+ end
301
+
302
+ describe '#gen_intermediate_skip' do
303
+
304
+ context 'given a list with zero-or-more bounds' do
305
+ it 'generates nested list skipping code' do
306
+ nested_code {|g| g.gen_intermediate_skip list }.
307
+ should == (<<-CODE).strip
308
+ begin
309
+ ep = nil
310
+ while @scanner.skip(/w+/)
311
+ ep = @scanner.pos
312
+ break unless @scanner.skip(/[,;]/)
313
+ end
314
+ @scanner.pos = ep unless ep.nil?
315
+ true
316
+ end
317
+ CODE
318
+ end
319
+ end
320
+ end
321
+
322
+ end
@@ -0,0 +1,343 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../../spec_helper')
2
+
3
+ shared_examples_for 'a list1 generator' do
4
+
5
+ let(:term_parser) { Match[/w+/] }
6
+ let(:sep_parser) { Match[/[,;]/] }
7
+ let(:bounds) { [1, nil] }
8
+
9
+ describe '#gen_basic' do
10
+
11
+ let(:term_parser) { Choice[Match[/[[:alpha:]]/], Match[/[[:digit:]]/]] }
12
+
13
+ context 'given a list with one-or-more bounds' do
14
+
15
+ context 'when nested' do
16
+ it 'generates nested list matching code' do
17
+ nested_code {|g| g.gen_basic list }.
18
+ should == (<<-CODE).strip
19
+ begin
20
+ a = []
21
+ ep = nil
22
+ while r = begin
23
+ @scanner.scan(/[[:alpha:]]/) ||
24
+ @scanner.scan(/[[:digit:]]/)
25
+ end
26
+ ep = @scanner.pos
27
+ a << r
28
+ break unless @scanner.skip(/[,;]/)
29
+ end
30
+ @scanner.pos = ep unless ep.nil?
31
+ a unless a.empty?
32
+ end
33
+ CODE
34
+ end
35
+ end
36
+
37
+ context 'when top-level' do
38
+ it 'generates top-level list matching code' do
39
+ top_level_code {|g| g.gen_basic list }.
40
+ should == (<<-CODE).strip
41
+ a = []
42
+ ep = nil
43
+ while r = begin
44
+ @scanner.scan(/[[:alpha:]]/) ||
45
+ @scanner.scan(/[[:digit:]]/)
46
+ end
47
+ ep = @scanner.pos
48
+ a << r
49
+ break unless @scanner.skip(/[,;]/)
50
+ end
51
+ @scanner.pos = ep unless ep.nil?
52
+ a unless a.empty?
53
+ CODE
54
+ end
55
+ end
56
+ end
57
+
58
+ context 'given a non-capturing list' do
59
+
60
+ let(:term_parser) { Skip[Match[/w+/]] }
61
+
62
+ context 'with one-or-more bounds' do
63
+
64
+ let(:bounds) { [1, nil] }
65
+
66
+ context 'when nested' do
67
+ it 'generates nested list skipping code' do
68
+ nested_code {|g| g.gen_basic list }.
69
+ should == (<<-CODE).strip
70
+ begin
71
+ r = false
72
+ ep = nil
73
+ while @scanner.skip(/w+/)
74
+ r = true
75
+ ep = @scanner.pos
76
+ break unless @scanner.skip(/[,;]/)
77
+ end
78
+ @scanner.pos = ep unless ep.nil?
79
+ r
80
+ end
81
+ CODE
82
+ end
83
+ end
84
+
85
+ context 'when top-level' do
86
+ it 'generates nested list skipping code' do
87
+ top_level_code {|g| g.gen_basic list }.
88
+ should == (<<-CODE).strip
89
+ r = false
90
+ ep = nil
91
+ while @scanner.skip(/w+/)
92
+ r = true
93
+ ep = @scanner.pos
94
+ break unless @scanner.skip(/[,;]/)
95
+ end
96
+ @scanner.pos = ep unless ep.nil?
97
+ r
98
+ CODE
99
+ end
100
+ end
101
+ end
102
+ end
103
+ end
104
+
105
+ describe '#gen_assert' do
106
+
107
+ context 'given a list with one-or-more bounds' do
108
+
109
+ context 'when nested' do
110
+ it 'generates nested positive lookahead code' do
111
+ nested_code {|g| g.gen_assert list }.
112
+ should == '(@scanner.skip(/(?=w+)/) && true)'
113
+ end
114
+ end
115
+
116
+ context 'when top-level' do
117
+ it 'generates top-level positive lookahead code' do
118
+ top_level_code {|g| g.gen_assert list }.
119
+ should == '@scanner.skip(/(?=w+)/) && true'
120
+ end
121
+ end
122
+ end
123
+ end
124
+
125
+ describe '#gen_disallow' do
126
+
127
+ context 'given a list with one-or-more bounds' do
128
+
129
+ context 'when nested' do
130
+ it 'generates nested one-or-more negative lookahead code' do
131
+ nested_code {|g| g.gen_disallow list }.
132
+ should == '(@scanner.skip(/(?!w+)/) && true)'
133
+ end
134
+ end
135
+
136
+ context 'when top-level' do
137
+ it 'generates top-level one-or-more negative lookahead code' do
138
+ top_level_code {|g| g.gen_disallow list }.
139
+ should == '@scanner.skip(/(?!w+)/) && true'
140
+ end
141
+ end
142
+ end
143
+ end
144
+
145
+ describe '#gen_dispatch_action' do
146
+
147
+ let(:code) { NodeCode.new('Word', 'parsed') }
148
+
149
+ context 'given a list with one-or-more bounds' do
150
+
151
+ context 'when nested' do
152
+ it 'generates nested list matching code with a dispatch action' do
153
+ nested_code {|g| g.gen_dispatch_action list, code }.
154
+ should == (<<-CODE).strip
155
+ begin
156
+ a = []
157
+ ep = nil
158
+ while r = @scanner.scan(/w+/)
159
+ ep = @scanner.pos
160
+ a << r
161
+ break unless @scanner.skip(/[,;]/)
162
+ end
163
+ @scanner.pos = ep unless ep.nil?
164
+ Word.parsed(select_captures(a)) unless a.empty?
165
+ end
166
+ CODE
167
+ end
168
+ end
169
+
170
+ context 'when top-level' do
171
+ it 'generates top level list matching code with a dispatch action' do
172
+ top_level_code {|g| g.gen_dispatch_action list, code }.
173
+ should == (<<-CODE).strip
174
+ a = []
175
+ ep = nil
176
+ while r = @scanner.scan(/w+/)
177
+ ep = @scanner.pos
178
+ a << r
179
+ break unless @scanner.skip(/[,;]/)
180
+ end
181
+ @scanner.pos = ep unless ep.nil?
182
+ Word.parsed(select_captures(a)) unless a.empty?
183
+ CODE
184
+ end
185
+ end
186
+ end
187
+ end
188
+
189
+ describe '#gen_direct_action' do
190
+
191
+ let(:code) { ActionCode.new('|_| _.size') }
192
+
193
+ context 'given a list with one-or-more bounds' do
194
+
195
+ context 'when nested' do
196
+ it 'generates nested list matching code with a dispatch action' do
197
+ nested_code {|g| g.gen_direct_action list, code }.
198
+ should == (<<-CODE).strip
199
+ begin
200
+ a = []
201
+ ep = nil
202
+ while r = @scanner.scan(/w+/)
203
+ ep = @scanner.pos
204
+ a << r
205
+ break unless @scanner.skip(/[,;]/)
206
+ end
207
+ @scanner.pos = ep unless ep.nil?
208
+ (select_captures(a).size) unless a.empty?
209
+ end
210
+ CODE
211
+ end
212
+ end
213
+
214
+ context 'when top-level' do
215
+ it 'generates top level list matching code with a dispatch action' do
216
+ top_level_code {|g| g.gen_direct_action list, code }.
217
+ should == (<<-CODE).strip
218
+ a = []
219
+ ep = nil
220
+ while r = @scanner.scan(/w+/)
221
+ ep = @scanner.pos
222
+ a << r
223
+ break unless @scanner.skip(/[,;]/)
224
+ end
225
+ @scanner.pos = ep unless ep.nil?
226
+ (select_captures(a).size) unless a.empty?
227
+ CODE
228
+ end
229
+ end
230
+ end
231
+ end
232
+
233
+ describe '#gen_skip' do
234
+
235
+ context 'given a list with one-or-more bounds' do
236
+
237
+ context 'when nested' do
238
+ it 'generates nested list skipping code' do
239
+ nested_code {|g| g.gen_skip list }.
240
+ should == (<<-CODE).strip
241
+ begin
242
+ r = false
243
+ ep = nil
244
+ while @scanner.skip(/w+/)
245
+ r = true
246
+ ep = @scanner.pos
247
+ break unless @scanner.skip(/[,;]/)
248
+ end
249
+ @scanner.pos = ep unless ep.nil?
250
+ r
251
+ end
252
+ CODE
253
+ end
254
+ end
255
+
256
+ context 'when top-level' do
257
+ it 'generates top-level list skipping code' do
258
+ top_level_code {|g| g.gen_skip list }.
259
+ should == (<<-CODE).strip
260
+ r = false
261
+ ep = nil
262
+ while @scanner.skip(/w+/)
263
+ r = true
264
+ ep = @scanner.pos
265
+ break unless @scanner.skip(/[,;]/)
266
+ end
267
+ @scanner.pos = ep unless ep.nil?
268
+ r
269
+ CODE
270
+ end
271
+ end
272
+ end
273
+ end
274
+
275
+ describe '#gen_intermediate' do
276
+
277
+ context 'given a list with one-or-more bounds' do
278
+
279
+ let(:bounds) { [1, nil] }
280
+
281
+ it 'generates nested list matching code' do
282
+ nested_code {|g| g.gen_intermediate list }.
283
+ should == (<<-CODE).strip
284
+ begin
285
+ a = []
286
+ ep = nil
287
+ while r = @scanner.scan(/w+/)
288
+ ep = @scanner.pos
289
+ a << r
290
+ break unless @scanner.skip(/[,;]/)
291
+ end
292
+ @scanner.pos = ep unless ep.nil?
293
+ a unless a.empty?
294
+ end
295
+ CODE
296
+ end
297
+ end
298
+ end
299
+
300
+ describe '#gen_intermediate_assert' do
301
+
302
+ context 'given a list with one-or-more bounds' do
303
+ it 'generates nested positive lookahead code' do
304
+ nested_code {|g| g.gen_assert list }.
305
+ should == '(@scanner.skip(/(?=w+)/) && true)'
306
+ end
307
+ end
308
+
309
+ end
310
+
311
+ describe '#gen_intermediate_disallow' do
312
+
313
+ context 'given a list with one-or-more bounds' do
314
+ it 'generates nested one-or-more negative lookahead code' do
315
+ nested_code {|g| g.gen_disallow list }.
316
+ should == '(@scanner.skip(/(?!w+)/) && true)'
317
+ end
318
+ end
319
+ end
320
+
321
+ describe '#gen_intermediate_skip' do
322
+
323
+ context 'given a list with one-or-more bounds' do
324
+ it 'generates nested list skipping code' do
325
+ nested_code {|g| g.gen_intermediate_skip list }.
326
+ should == (<<-CODE).strip
327
+ begin
328
+ r = false
329
+ ep = nil
330
+ while @scanner.skip(/w+/)
331
+ r = true
332
+ ep = @scanner.pos
333
+ break unless @scanner.skip(/[,;]/)
334
+ end
335
+ @scanner.pos = ep unless ep.nil?
336
+ r
337
+ end
338
+ CODE
339
+ end
340
+ end
341
+ end
342
+
343
+ end