rattler 0.4.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (347) hide show
  1. data/README.rdoc +9 -3
  2. data/features/command_line/dest_option.feature +1 -1
  3. data/features/command_line/lib_option.feature +2 -2
  4. data/features/command_line/output_option.feature +2 -2
  5. data/features/command_line/parser_generator.feature +3 -3
  6. data/features/grammar/any_character.feature +0 -4
  7. data/features/grammar/back_reference.feature +0 -4
  8. data/features/grammar/character_class.feature +0 -4
  9. data/features/grammar/comments.feature +0 -4
  10. data/features/grammar/e_symbol.feature +18 -0
  11. data/features/grammar/eof.feature +0 -4
  12. data/features/grammar/fail.feature +0 -4
  13. data/features/grammar/list_matching.feature +52 -3
  14. data/features/grammar/literal.feature +0 -4
  15. data/features/grammar/negative_lookahead.feature +0 -4
  16. data/features/grammar/negative_semantic_predicate.feature +99 -0
  17. data/features/grammar/node_action.feature +17 -4
  18. data/features/grammar/nonterminal.feature +3 -7
  19. data/features/grammar/one_or_more.feature +0 -4
  20. data/features/grammar/optional.feature +0 -4
  21. data/features/grammar/ordered_choice.feature +0 -4
  22. data/features/grammar/positive_lookahead.feature +0 -4
  23. data/features/grammar/positive_semantic_predicate.feature +99 -0
  24. data/features/grammar/posix_class.feature +3 -6
  25. data/features/grammar/repeat.feature +50 -0
  26. data/features/grammar/sequence.feature +0 -4
  27. data/features/grammar/side_effect.feature +81 -0
  28. data/features/grammar/skip_operator.feature +2 -5
  29. data/features/grammar/start_rule.feature +1 -5
  30. data/features/grammar/symantic_action.feature +9 -4
  31. data/features/grammar/token.feature +0 -4
  32. data/features/grammar/whitespace.feature +0 -4
  33. data/features/grammar/word_literal.feature +0 -4
  34. data/features/grammar/zero_or_more.feature +0 -4
  35. data/features/step_definitions/grammar_steps.rb +5 -1
  36. data/lib/rattler/back_end/optimizer.rb +1 -0
  37. data/lib/rattler/back_end/optimizer/reduce_repeat_match.rb +20 -8
  38. data/lib/rattler/back_end/optimizer/simplify_redundant_repeat.rb +10 -7
  39. data/lib/rattler/back_end/optimizer/specialize_repeat.rb +40 -0
  40. data/lib/rattler/back_end/parser_generator.rb +11 -6
  41. data/lib/rattler/back_end/parser_generator/delegating_generator.rb +20 -0
  42. data/lib/rattler/back_end/parser_generator/e_symbol_generator.rb +52 -0
  43. data/lib/rattler/back_end/parser_generator/eof_generator.rb +58 -0
  44. data/lib/rattler/back_end/parser_generator/expr_generator.rb +6 -2
  45. data/lib/rattler/back_end/parser_generator/gen_method_names.rb +15 -5
  46. data/lib/rattler/back_end/parser_generator/general_list_generator.rb +194 -0
  47. data/lib/rattler/back_end/parser_generator/general_repeat_generator.rb +177 -0
  48. data/lib/rattler/back_end/parser_generator/label_generator.rb +4 -1
  49. data/lib/rattler/back_end/parser_generator/list0_generating.rb +36 -0
  50. data/lib/rattler/back_end/parser_generator/list1_generating.rb +30 -0
  51. data/lib/rattler/back_end/parser_generator/list_generator.rb +16 -20
  52. data/lib/rattler/back_end/parser_generator/one_or_more_generating.rb +25 -0
  53. data/lib/rattler/back_end/parser_generator/{optional_generator.rb → optional_generating.rb} +66 -81
  54. data/lib/rattler/back_end/parser_generator/predicate_propogating.rb +4 -4
  55. data/lib/rattler/back_end/parser_generator/repeat_generator.rb +53 -0
  56. data/lib/rattler/back_end/parser_generator/skip_propogating.rb +2 -2
  57. data/lib/rattler/back_end/parser_generator/sub_generating.rb +16 -18
  58. data/lib/rattler/back_end/parser_generator/token_propogating.rb +1 -1
  59. data/lib/rattler/back_end/parser_generator/zero_or_more_generating.rb +31 -0
  60. data/lib/rattler/grammar/grammar_parser.rb +20 -0
  61. data/lib/rattler/grammar/metagrammar.rb +131 -13
  62. data/lib/rattler/grammar/rattler.rtlr +25 -12
  63. data/lib/rattler/parsers.rb +9 -5
  64. data/lib/rattler/parsers/assert_code.rb +31 -0
  65. data/lib/rattler/parsers/atomic.rb +19 -0
  66. data/lib/rattler/parsers/direct_action.rb +12 -4
  67. data/lib/rattler/parsers/disallow_code.rb +31 -0
  68. data/lib/rattler/parsers/dispatch_action.rb +3 -2
  69. data/lib/rattler/parsers/e_symbol.rb +47 -0
  70. data/lib/rattler/parsers/effect_code.rb +31 -0
  71. data/lib/rattler/parsers/eof.rb +6 -13
  72. data/lib/rattler/parsers/list_parser.rb +33 -14
  73. data/lib/rattler/parsers/match.rb +1 -6
  74. data/lib/rattler/parsers/parser_dsl.rb +78 -35
  75. data/lib/rattler/parsers/predicate.rb +1 -4
  76. data/lib/rattler/parsers/repeat.rb +76 -0
  77. data/lib/rattler/parsers/semantic_assert.rb +19 -0
  78. data/lib/rattler/parsers/semantic_disallow.rb +19 -0
  79. data/lib/rattler/parsers/side_effect.rb +19 -0
  80. data/lib/rattler/parsers/skip.rb +1 -9
  81. data/lib/rattler/parsers/token.rb +1 -6
  82. data/lib/rattler/util/graphviz/node_builder.rb +6 -3
  83. data/spec/rattler/back_end/assert_compiler_examples.rb +187 -0
  84. data/spec/rattler/back_end/direct_action_compiler_examples.rb +227 -0
  85. data/spec/rattler/back_end/disallow_compiler_examples.rb +187 -0
  86. data/spec/rattler/back_end/dispatch_action_compiler_examples.rb +225 -0
  87. data/spec/rattler/back_end/optimizer/reduce_repeat_match_spec.rb +45 -33
  88. data/spec/rattler/back_end/optimizer/simplify_redundant_repeat_spec.rb +32 -172
  89. data/spec/rattler/back_end/parser_generator/e_symbol_generator_spec.rb +149 -0
  90. data/spec/rattler/back_end/parser_generator/eof_generator_spec.rb +152 -0
  91. data/spec/rattler/back_end/parser_generator/label_generator_spec.rb +4 -4
  92. data/spec/rattler/back_end/parser_generator/list0_generator_examples.rb +322 -0
  93. data/spec/rattler/back_end/parser_generator/list1_generator_examples.rb +343 -0
  94. data/spec/rattler/back_end/parser_generator/list_generator_spec.rb +597 -140
  95. data/spec/rattler/back_end/parser_generator/one_or_more_generator_examples.rb +292 -0
  96. data/spec/rattler/back_end/parser_generator/optional_generator_examples.rb +233 -0
  97. data/spec/rattler/back_end/parser_generator/repeat_generator_spec.rb +281 -0
  98. data/spec/rattler/back_end/parser_generator/zero_or_more_generator_examples.rb +277 -0
  99. data/spec/rattler/back_end/semantic_assert_compiler_examples.rb +152 -0
  100. data/spec/rattler/back_end/semantic_disallow_compiler_examples.rb +152 -0
  101. data/spec/rattler/back_end/shared_compiler_examples.rb +106 -651
  102. data/spec/rattler/back_end/side_effect_compiler_examples.rb +227 -0
  103. data/spec/rattler/back_end/skip_compiler_examples.rb +161 -0
  104. data/spec/rattler/back_end/token_compiler_examples.rb +262 -0
  105. data/spec/rattler/grammar/grammar_parser_spec.rb +302 -23
  106. data/spec/rattler/parsers/apply_spec.rb +6 -0
  107. data/spec/rattler/parsers/assert_spec.rb +18 -7
  108. data/spec/rattler/parsers/back_reference_spec.rb +9 -0
  109. data/spec/rattler/parsers/choice_spec.rb +36 -21
  110. data/spec/rattler/parsers/direct_action_spec.rb +76 -36
  111. data/spec/rattler/parsers/disallow_spec.rb +18 -7
  112. data/spec/rattler/parsers/dispatch_action_spec.rb +128 -22
  113. data/spec/rattler/parsers/e_symbol_spec.rb +30 -0
  114. data/spec/rattler/parsers/eof_spec.rb +15 -6
  115. data/spec/rattler/parsers/label_spec.rb +15 -2
  116. data/spec/rattler/parsers/list_parser_spec.rb +187 -0
  117. data/spec/rattler/parsers/match_spec.rb +16 -7
  118. data/spec/rattler/parsers/parser_dsl_spec.rb +82 -23
  119. data/spec/rattler/parsers/repeat_spec.rb +233 -0
  120. data/spec/rattler/parsers/semantic_assert_spec.rb +83 -0
  121. data/spec/rattler/parsers/semantic_disallow_spec.rb +83 -0
  122. data/spec/rattler/parsers/sequence_spec.rb +34 -20
  123. data/spec/rattler/parsers/side_effect_spec.rb +214 -0
  124. data/spec/rattler/parsers/skip_spec.rb +17 -6
  125. data/spec/rattler_spec.rb +2 -0
  126. data/spec/support/compiler_spec_helper.rb +8 -0
  127. metadata +156 -447
  128. data/bin/rtlr.compiled.rbc +0 -201
  129. data/features/step_definitions/cli_steps.rbc +0 -149
  130. data/features/step_definitions/grammar_steps.rbc +0 -1211
  131. data/features/support/env.rbc +0 -389
  132. data/lib/rattler.rbc +0 -1231
  133. data/lib/rattler/back_end.rbc +0 -286
  134. data/lib/rattler/back_end/compiler.rbc +0 -1394
  135. data/lib/rattler/back_end/optimizer.rbc +0 -2000
  136. data/lib/rattler/back_end/optimizer/composite_reducing.rbc +0 -337
  137. data/lib/rattler/back_end/optimizer/flatten_choice.rbc +0 -443
  138. data/lib/rattler/back_end/optimizer/flatten_sequence.rbc +0 -827
  139. data/lib/rattler/back_end/optimizer/flattening.rbc +0 -570
  140. data/lib/rattler/back_end/optimizer/inline_regular_rules.rbc +0 -691
  141. data/lib/rattler/back_end/optimizer/join_match_capturing_sequence.rbc +0 -1299
  142. data/lib/rattler/back_end/optimizer/join_match_choice.rbc +0 -523
  143. data/lib/rattler/back_end/optimizer/join_match_matching_sequence.rbc +0 -619
  144. data/lib/rattler/back_end/optimizer/join_match_sequence.rbc +0 -174
  145. data/lib/rattler/back_end/optimizer/join_predicate_bare_match.rbc +0 -1505
  146. data/lib/rattler/back_end/optimizer/join_predicate_match.rbc +0 -174
  147. data/lib/rattler/back_end/optimizer/join_predicate_nested_match.rbc +0 -620
  148. data/lib/rattler/back_end/optimizer/join_predicate_or_bare_match.rbc +0 -1502
  149. data/lib/rattler/back_end/optimizer/join_predicate_or_match.rbc +0 -174
  150. data/lib/rattler/back_end/optimizer/join_predicate_or_nested_match.rbc +0 -616
  151. data/lib/rattler/back_end/optimizer/match_joining.rbc +0 -1454
  152. data/lib/rattler/back_end/optimizer/optimization.rbc +0 -1366
  153. data/lib/rattler/back_end/optimizer/optimization_context.rbc +0 -1386
  154. data/lib/rattler/back_end/optimizer/optimization_sequence.rbc +0 -520
  155. data/lib/rattler/back_end/optimizer/optimize_children.rbc +0 -793
  156. data/lib/rattler/back_end/optimizer/reduce_repeat_match.rbc +0 -788
  157. data/lib/rattler/back_end/optimizer/remove_meaningless_wrapper.rbc +0 -508
  158. data/lib/rattler/back_end/optimizer/simplify_redundant_repeat.rbc +0 -807
  159. data/lib/rattler/back_end/optimizer/simplify_token_match.rbc +0 -561
  160. data/lib/rattler/back_end/parser_generator.rbc +0 -1326
  161. data/lib/rattler/back_end/parser_generator/apply_generator.rbc +0 -2148
  162. data/lib/rattler/back_end/parser_generator/assert_generator.rbc +0 -1967
  163. data/lib/rattler/back_end/parser_generator/back_reference_generator.rbc +0 -1665
  164. data/lib/rattler/back_end/parser_generator/choice_generator.rbc +0 -2793
  165. data/lib/rattler/back_end/parser_generator/direct_action_generator.rbc +0 -1071
  166. data/lib/rattler/back_end/parser_generator/disallow_generator.rbc +0 -1967
  167. data/lib/rattler/back_end/parser_generator/dispatch_action_generator.rbc +0 -1071
  168. data/lib/rattler/back_end/parser_generator/expr_generator.rbc +0 -2295
  169. data/lib/rattler/back_end/parser_generator/fail_generator.rbc +0 -1216
  170. data/lib/rattler/back_end/parser_generator/gen_method_names.rbc +0 -296
  171. data/lib/rattler/back_end/parser_generator/group_match.rbc +0 -612
  172. data/lib/rattler/back_end/parser_generator/group_match_generator.rbc +0 -1647
  173. data/lib/rattler/back_end/parser_generator/label_generator.rbc +0 -1401
  174. data/lib/rattler/back_end/parser_generator/list1_generator.rb +0 -54
  175. data/lib/rattler/back_end/parser_generator/list1_generator.rbc +0 -1237
  176. data/lib/rattler/back_end/parser_generator/list_generating.rb +0 -71
  177. data/lib/rattler/back_end/parser_generator/list_generating.rbc +0 -1900
  178. data/lib/rattler/back_end/parser_generator/list_generator.rbc +0 -1068
  179. data/lib/rattler/back_end/parser_generator/match_generator.rbc +0 -1743
  180. data/lib/rattler/back_end/parser_generator/nested.rbc +0 -496
  181. data/lib/rattler/back_end/parser_generator/one_or_more_generator.rb +0 -56
  182. data/lib/rattler/back_end/parser_generator/one_or_more_generator.rbc +0 -1277
  183. data/lib/rattler/back_end/parser_generator/optional_generator.rbc +0 -2025
  184. data/lib/rattler/back_end/parser_generator/predicate_propogating.rbc +0 -648
  185. data/lib/rattler/back_end/parser_generator/repeat_generating.rb +0 -57
  186. data/lib/rattler/back_end/parser_generator/repeat_generating.rbc +0 -1549
  187. data/lib/rattler/back_end/parser_generator/rule_generator.rbc +0 -1239
  188. data/lib/rattler/back_end/parser_generator/rule_set_generator.rbc +0 -2641
  189. data/lib/rattler/back_end/parser_generator/sequence_generator.rbc +0 -4867
  190. data/lib/rattler/back_end/parser_generator/skip_generator.rbc +0 -1278
  191. data/lib/rattler/back_end/parser_generator/skip_propogating.rbc +0 -432
  192. data/lib/rattler/back_end/parser_generator/sub_generating.rbc +0 -2785
  193. data/lib/rattler/back_end/parser_generator/token_generator.rbc +0 -755
  194. data/lib/rattler/back_end/parser_generator/token_propogating.rbc +0 -324
  195. data/lib/rattler/back_end/parser_generator/top_level.rbc +0 -352
  196. data/lib/rattler/back_end/parser_generator/zero_or_more_generator.rb +0 -53
  197. data/lib/rattler/back_end/parser_generator/zero_or_more_generator.rbc +0 -1111
  198. data/lib/rattler/back_end/ruby_generator.rbc +0 -1841
  199. data/lib/rattler/grammar.rbc +0 -557
  200. data/lib/rattler/grammar/analysis.rbc +0 -1944
  201. data/lib/rattler/grammar/grammar.rbc +0 -1090
  202. data/lib/rattler/grammar/grammar_dsl.rbc +0 -1401
  203. data/lib/rattler/grammar/grammar_parser.rbc +0 -2096
  204. data/lib/rattler/grammar/metagrammar.rbc +0 -11014
  205. data/lib/rattler/parsers.rbc +0 -1006
  206. data/lib/rattler/parsers/action_code.rbc +0 -1577
  207. data/lib/rattler/parsers/apply.rbc +0 -562
  208. data/lib/rattler/parsers/assert.rbc +0 -378
  209. data/lib/rattler/parsers/back_reference.rbc +0 -871
  210. data/lib/rattler/parsers/choice.rbc +0 -607
  211. data/lib/rattler/parsers/combinator_parser.rbc +0 -612
  212. data/lib/rattler/parsers/combining.rbc +0 -570
  213. data/lib/rattler/parsers/direct_action.rbc +0 -1472
  214. data/lib/rattler/parsers/disallow.rbc +0 -379
  215. data/lib/rattler/parsers/dispatch_action.rbc +0 -2078
  216. data/lib/rattler/parsers/eof.rbc +0 -567
  217. data/lib/rattler/parsers/fail.rbc +0 -745
  218. data/lib/rattler/parsers/label.rbc +0 -749
  219. data/lib/rattler/parsers/list.rbc +0 -292
  220. data/lib/rattler/parsers/list0.rb +0 -26
  221. data/lib/rattler/parsers/list0.rbc +0 -292
  222. data/lib/rattler/parsers/list1.rb +0 -26
  223. data/lib/rattler/parsers/list1.rbc +0 -305
  224. data/lib/rattler/parsers/list_parser.rbc +0 -886
  225. data/lib/rattler/parsers/match.rbc +0 -621
  226. data/lib/rattler/parsers/node_code.rbc +0 -1064
  227. data/lib/rattler/parsers/one_or_more.rb +0 -47
  228. data/lib/rattler/parsers/one_or_more.rbc +0 -475
  229. data/lib/rattler/parsers/optional.rb +0 -42
  230. data/lib/rattler/parsers/optional.rbc +0 -450
  231. data/lib/rattler/parsers/parser.rbc +0 -994
  232. data/lib/rattler/parsers/parser_dsl.rbc +0 -4765
  233. data/lib/rattler/parsers/predicate.rbc +0 -490
  234. data/lib/rattler/parsers/rule.rbc +0 -777
  235. data/lib/rattler/parsers/rule_set.rbc +0 -1438
  236. data/lib/rattler/parsers/sequence.rbc +0 -1040
  237. data/lib/rattler/parsers/skip.rbc +0 -613
  238. data/lib/rattler/parsers/token.rbc +0 -457
  239. data/lib/rattler/parsers/zero_or_more.rb +0 -40
  240. data/lib/rattler/parsers/zero_or_more.rbc +0 -462
  241. data/lib/rattler/runner.rbc +0 -3813
  242. data/lib/rattler/runtime.rbc +0 -370
  243. data/lib/rattler/runtime/extended_packrat_parser.rbc +0 -2351
  244. data/lib/rattler/runtime/packrat_parser.rbc +0 -1390
  245. data/lib/rattler/runtime/parse_failure.rbc +0 -909
  246. data/lib/rattler/runtime/parse_node.rbc +0 -1007
  247. data/lib/rattler/runtime/parser.rbc +0 -2267
  248. data/lib/rattler/runtime/parser_helper.rbc +0 -337
  249. data/lib/rattler/runtime/recursive_descent_parser.rbc +0 -942
  250. data/lib/rattler/util.rbc +0 -286
  251. data/lib/rattler/util/graphviz.rbc +0 -327
  252. data/lib/rattler/util/graphviz/node_builder.rbc +0 -2207
  253. data/lib/rattler/util/line_counter.rbc +0 -988
  254. data/lib/rattler/util/node.rbc +0 -2393
  255. data/lib/rattler/util/parser_spec_helper.rbc +0 -2533
  256. data/spec/rattler/back_end/compiler_spec.rbc +0 -1187
  257. data/spec/rattler/back_end/optimizer/flatten_choice_spec.rbc +0 -2093
  258. data/spec/rattler/back_end/optimizer/flatten_sequence_spec.rbc +0 -4055
  259. data/spec/rattler/back_end/optimizer/inline_regular_rules_spec.rbc +0 -2345
  260. data/spec/rattler/back_end/optimizer/join_match_capturing_sequence_spec.rbc +0 -7006
  261. data/spec/rattler/back_end/optimizer/join_match_choice_spec.rbc +0 -3252
  262. data/spec/rattler/back_end/optimizer/join_match_matching_sequence_spec.rbc +0 -3681
  263. data/spec/rattler/back_end/optimizer/join_predicate_bare_match_spec.rbc +0 -5603
  264. data/spec/rattler/back_end/optimizer/join_predicate_nested_match_spec.rbc +0 -5232
  265. data/spec/rattler/back_end/optimizer/join_predicate_or_bare_match_spec.rbc +0 -4272
  266. data/spec/rattler/back_end/optimizer/join_predicate_or_nested_match_spec.rbc +0 -4342
  267. data/spec/rattler/back_end/optimizer/reduce_repeat_match_spec.rbc +0 -2960
  268. data/spec/rattler/back_end/optimizer/simplify_redundant_repeat_spec.rbc +0 -6929
  269. data/spec/rattler/back_end/optimizer/simplify_token_match_spec.rbc +0 -2327
  270. data/spec/rattler/back_end/optimizer_spec.rbc +0 -372
  271. data/spec/rattler/back_end/parser_generator/apply_generator_spec.rbc +0 -4710
  272. data/spec/rattler/back_end/parser_generator/assert_generator_spec.rbc +0 -4697
  273. data/spec/rattler/back_end/parser_generator/back_reference_generator_spec.rbc +0 -4855
  274. data/spec/rattler/back_end/parser_generator/choice_generator_spec.rbc +0 -5350
  275. data/spec/rattler/back_end/parser_generator/direct_action_generator_spec.rbc +0 -4737
  276. data/spec/rattler/back_end/parser_generator/disallow_generator_spec.rbc +0 -4697
  277. data/spec/rattler/back_end/parser_generator/dispatch_action_generator_spec.rbc +0 -4731
  278. data/spec/rattler/back_end/parser_generator/fail_generator_spec.rbc +0 -2115
  279. data/spec/rattler/back_end/parser_generator/group_match_generator_spec.rbc +0 -4195
  280. data/spec/rattler/back_end/parser_generator/group_match_spec.rbc +0 -1414
  281. data/spec/rattler/back_end/parser_generator/label_generator_spec.rbc +0 -4696
  282. data/spec/rattler/back_end/parser_generator/list1_generator_spec.rb +0 -309
  283. data/spec/rattler/back_end/parser_generator/list1_generator_spec.rbc +0 -5213
  284. data/spec/rattler/back_end/parser_generator/list_generator_spec.rbc +0 -5179
  285. data/spec/rattler/back_end/parser_generator/match_generator_spec.rbc +0 -4681
  286. data/spec/rattler/back_end/parser_generator/one_or_more_generator_spec.rb +0 -259
  287. data/spec/rattler/back_end/parser_generator/one_or_more_generator_spec.rbc +0 -4957
  288. data/spec/rattler/back_end/parser_generator/optional_generator_spec.rb +0 -190
  289. data/spec/rattler/back_end/parser_generator/optional_generator_spec.rbc +0 -4704
  290. data/spec/rattler/back_end/parser_generator/rule_generator_spec.rbc +0 -545
  291. data/spec/rattler/back_end/parser_generator/rule_set_generator_spec.rbc +0 -1110
  292. data/spec/rattler/back_end/parser_generator/sequence_generator_spec.rbc +0 -5453
  293. data/spec/rattler/back_end/parser_generator/skip_generator_spec.rbc +0 -4691
  294. data/spec/rattler/back_end/parser_generator/token_generator_spec.rbc +0 -4691
  295. data/spec/rattler/back_end/parser_generator/zero_or_more_generator_spec.rb +0 -244
  296. data/spec/rattler/back_end/parser_generator/zero_or_more_generator_spec.rbc +0 -4924
  297. data/spec/rattler/back_end/ruby_generator_spec.rbc +0 -2460
  298. data/spec/rattler/back_end/shared_compiler_examples.rbc +0 -41886
  299. data/spec/rattler/grammar/analysis_spec.rbc +0 -4365
  300. data/spec/rattler/grammar/grammar_parser_spec.rbc +0 -10344
  301. data/spec/rattler/grammar/grammar_spec.rbc +0 -1701
  302. data/spec/rattler/parsers/action_code_spec.rbc +0 -4674
  303. data/spec/rattler/parsers/apply_spec.rbc +0 -851
  304. data/spec/rattler/parsers/assert_spec.rbc +0 -752
  305. data/spec/rattler/parsers/back_reference_spec.rbc +0 -1002
  306. data/spec/rattler/parsers/choice_spec.rbc +0 -1696
  307. data/spec/rattler/parsers/combinator_parser_spec.rbc +0 -361
  308. data/spec/rattler/parsers/direct_action_spec.rbc +0 -5222
  309. data/spec/rattler/parsers/disallow_spec.rbc +0 -752
  310. data/spec/rattler/parsers/dispatch_action_spec.rbc +0 -3033
  311. data/spec/rattler/parsers/eof_spec.rbc +0 -728
  312. data/spec/rattler/parsers/fail_spec.rbc +0 -548
  313. data/spec/rattler/parsers/label_spec.rbc +0 -1091
  314. data/spec/rattler/parsers/list0_spec.rb +0 -82
  315. data/spec/rattler/parsers/list0_spec.rbc +0 -2308
  316. data/spec/rattler/parsers/list1_spec.rb +0 -82
  317. data/spec/rattler/parsers/list1_spec.rbc +0 -2287
  318. data/spec/rattler/parsers/list_spec.rbc +0 -2308
  319. data/spec/rattler/parsers/match_spec.rbc +0 -780
  320. data/spec/rattler/parsers/node_code_spec.rbc +0 -1754
  321. data/spec/rattler/parsers/one_or_more_spec.rb +0 -64
  322. data/spec/rattler/parsers/one_or_more_spec.rbc +0 -1698
  323. data/spec/rattler/parsers/optional_spec.rb +0 -64
  324. data/spec/rattler/parsers/optional_spec.rbc +0 -1717
  325. data/spec/rattler/parsers/parser_dsl_spec.rbc +0 -10150
  326. data/spec/rattler/parsers/rule_set_spec.rbc +0 -1060
  327. data/spec/rattler/parsers/sequence_spec.rbc +0 -2899
  328. data/spec/rattler/parsers/skip_spec.rbc +0 -753
  329. data/spec/rattler/parsers/token_spec.rbc +0 -1511
  330. data/spec/rattler/parsers/zero_or_more_spec.rb +0 -64
  331. data/spec/rattler/parsers/zero_or_more_spec.rbc +0 -1719
  332. data/spec/rattler/runtime/extended_packrat_parser_spec.rbc +0 -1341
  333. data/spec/rattler/runtime/packrat_parser_spec.rbc +0 -210
  334. data/spec/rattler/runtime/parse_failure_spec.rbc +0 -2244
  335. data/spec/rattler/runtime/parse_node_spec.rbc +0 -2008
  336. data/spec/rattler/runtime/parser_spec.rbc +0 -2757
  337. data/spec/rattler/runtime/recursive_descent_parser_spec.rbc +0 -210
  338. data/spec/rattler/runtime/shared_parser_examples.rbc +0 -2567
  339. data/spec/rattler/util/graphviz/node_builder_spec.rbc +0 -3439
  340. data/spec/rattler/util/line_counter_spec.rbc +0 -2272
  341. data/spec/rattler/util/node_spec.rbc +0 -15023
  342. data/spec/rattler_spec.rbc +0 -1591
  343. data/spec/spec_helper.rbc +0 -336
  344. data/spec/support/combinator_parser_spec_helper.rbc +0 -1284
  345. data/spec/support/compiler_spec_helper.rbc +0 -1941
  346. data/spec/support/parser_generator_spec_helper.rbc +0 -718
  347. data/spec/support/runtime_parser_spec_helper.rbc +0 -313
@@ -0,0 +1,152 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ shared_examples_for 'a compiled parser with a positive semantic predicate' do
4
+ include CompilerSpecHelper
5
+
6
+ subject { compiled_parser }
7
+
8
+ let(:reference_parser) { combinator_parser grammar }
9
+
10
+ context 'with a nested match rule' do
11
+ let(:grammar) { define_grammar do
12
+ rule(:num) { semantic_assert(/\d+/, '_.to_i > 200') }
13
+ end }
14
+ it { should parse('451a').succeeding.like reference_parser }
15
+ it { should parse(' ').failing.like reference_parser }
16
+ it { should parse('123a').failing.like reference_parser }
17
+
18
+ context 'with a label' do
19
+ let(:grammar) { define_grammar do
20
+ rule(:digits) { semantic_assert(label(:num, /\d+/), 'num.to_i > 200') }
21
+ end }
22
+ it { should parse('451a').succeeding.like reference_parser }
23
+ it { should parse(' ').failing.like reference_parser }
24
+ it { should parse('123a').failing.like reference_parser }
25
+ end
26
+ end
27
+
28
+ context 'with a nested apply rule' do
29
+ let(:grammar) { define_grammar do
30
+ rule(:foo) { semantic_assert :digit, '_.to_i > 200' }
31
+ rule(:digit) { match(/\d+/) }
32
+ end }
33
+ it { should parse('451a').succeeding.like reference_parser }
34
+ it { should parse(' ').failing.like reference_parser }
35
+ it { should parse('123a').failing.like reference_parser }
36
+
37
+ context 'with a label' do
38
+ let(:grammar) { define_grammar do
39
+ rule(:num) { semantic_assert(label(:num, :digits), 'num.to_i > 200') }
40
+ rule(:digits) { match(/\d+/) }
41
+ end }
42
+ it { should parse('451a').succeeding.like reference_parser }
43
+ it { should parse(' ').failing.like reference_parser }
44
+ it { should parse('123a').failing.like reference_parser }
45
+ end
46
+ end
47
+
48
+ context 'with a nested choice rule' do
49
+ let(:grammar) { define_grammar do
50
+ rule :foo do
51
+ semantic_assert(
52
+ match(/[[:alpha:]]+/) | match(/[[:digit:]]+/),
53
+ '_.size > 2'
54
+ )
55
+ end
56
+ end }
57
+
58
+ it { should parse('abc123').succeeding.like reference_parser }
59
+ it { should parse('12abc').failing.like reference_parser }
60
+ it { should parse(' ').failing.like reference_parser }
61
+ end
62
+
63
+ context 'with a nested sequence rule' do
64
+ let(:grammar) { define_grammar do
65
+ rule :assignment do
66
+ semantic_assert(
67
+ match(/\w+/) & match('=') & match(/\w+/),
68
+ '|l,_,r| l == r'
69
+ )
70
+ end
71
+ end }
72
+ it { should parse('451a=451a ').succeeding.like reference_parser }
73
+ it { should parse('451a=123a ').failing.like reference_parser }
74
+
75
+ context 'with labels' do
76
+ let(:grammar) { define_grammar do
77
+ rule :assignment do
78
+ semantic_assert(
79
+ label(:lt, /\w+/) & match('=') & label(:rt, /\w+/),
80
+ 'lt == rt'
81
+ )
82
+ end
83
+ end }
84
+ it { should parse('451a=451a ').succeeding.like reference_parser }
85
+ it { should parse('451a=123a ').failing.like reference_parser }
86
+ end
87
+ end
88
+
89
+ context 'with a nested optional rule' do
90
+ let(:grammar) { define_grammar do
91
+ rule :foo do
92
+ semantic_assert(optional(/\w+/), '|_| _.empty?')
93
+ end
94
+ end }
95
+ it { should parse('foo ').failing.like reference_parser }
96
+ it { should parse(' ').succeeding.like reference_parser }
97
+ end
98
+
99
+ context 'with a nested zero-or-more rule' do
100
+ let(:grammar) { define_grammar do
101
+ rule :foo do
102
+ semantic_assert(zero_or_more(/\w/), '|_| _.size < 4')
103
+ end
104
+ end }
105
+ it { should parse('foo ').succeeding.like reference_parser }
106
+ it { should parse('food').failing.like reference_parser }
107
+ it { should parse(' ').succeeding.like reference_parser }
108
+ end
109
+
110
+ context 'with a nested one-or-more rule' do
111
+ let(:grammar) { define_grammar do
112
+ rule :foo do
113
+ semantic_assert(one_or_more(/\w/), '|_| _.size < 4')
114
+ end
115
+ end }
116
+ it { should parse('foo ').succeeding.like reference_parser }
117
+ it { should parse('food').failing.like reference_parser }
118
+ it { should parse(' ').failing.like reference_parser }
119
+ end
120
+
121
+ context 'with a nested list rule' do
122
+ let(:grammar) { define_grammar do
123
+ rule :foo do
124
+ semantic_assert(list(/\w+/, /,/, 1, nil), '|_| _.size < 4')
125
+ end
126
+ end }
127
+ it { should parse('a,bc,d ').succeeding.like reference_parser }
128
+ it { should parse('a,b,c,d').failing.like reference_parser }
129
+ it { should parse(' ').failing.like reference_parser }
130
+ end
131
+
132
+ context 'with a nested apply rule' do
133
+ let(:grammar) { define_grammar do
134
+ rule(:foo) { semantic_assert :digit, '_.to_i > 200' }
135
+ rule(:digit) { match /\d+/ }
136
+ end }
137
+ it { should parse('451a').succeeding.like reference_parser }
138
+ it { should parse(' ').failing.like reference_parser }
139
+ it { should parse('123a').failing.like reference_parser }
140
+ end
141
+
142
+ context 'with a nested token rule' do
143
+ let(:grammar) { define_grammar do
144
+ rule :foo do
145
+ semantic_assert(token(/\w+/), '_.size > 5')
146
+ end
147
+ end }
148
+ it { should parse('abc123').succeeding.like reference_parser }
149
+ it { should parse(' ').failing.like reference_parser }
150
+ it { should parse('abc12 ').failing.like reference_parser }
151
+ end
152
+ end
@@ -0,0 +1,152 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ shared_examples_for 'a compiled parser with a negative semantic predicate' do
4
+ include CompilerSpecHelper
5
+
6
+ subject { compiled_parser }
7
+
8
+ let(:reference_parser) { combinator_parser grammar }
9
+
10
+ context 'with a nested match rule' do
11
+ let(:grammar) { define_grammar do
12
+ rule(:num) { semantic_disallow(/\d+/, '_.to_i > 200') }
13
+ end }
14
+ it { should parse('123a').succeeding.like reference_parser }
15
+ it { should parse(' ').failing.like reference_parser }
16
+ it { should parse('451a').failing.like reference_parser }
17
+
18
+ context 'with a label' do
19
+ let(:grammar) { define_grammar do
20
+ rule(:digits) { semantic_disallow(label(:num, /\d+/), 'num.to_i > 200') }
21
+ end }
22
+ it { should parse('123a').succeeding.like reference_parser }
23
+ it { should parse(' ').failing.like reference_parser }
24
+ it { should parse('451a').failing.like reference_parser }
25
+ end
26
+ end
27
+
28
+ context 'with a nested apply rule' do
29
+ let(:grammar) { define_grammar do
30
+ rule(:foo) { semantic_disallow :digit, '_.to_i > 200' }
31
+ rule(:digit) { match(/\d+/) }
32
+ end }
33
+ it { should parse('123a').succeeding.like reference_parser }
34
+ it { should parse(' ').failing.like reference_parser }
35
+ it { should parse('451a').failing.like reference_parser }
36
+
37
+ context 'with a label' do
38
+ let(:grammar) { define_grammar do
39
+ rule(:num) { semantic_disallow(label(:num, :digits), 'num.to_i > 200') }
40
+ rule(:digits) { match(/\d+/) }
41
+ end }
42
+ it { should parse('123a').succeeding.like reference_parser }
43
+ it { should parse(' ').failing.like reference_parser }
44
+ it { should parse('451a').failing.like reference_parser }
45
+ end
46
+ end
47
+
48
+ context 'with a nested choice rule' do
49
+ let(:grammar) { define_grammar do
50
+ rule :foo do
51
+ semantic_disallow(
52
+ match(/[[:alpha:]]+/) | match(/[[:digit:]]+/),
53
+ '_.size > 2'
54
+ )
55
+ end
56
+ end }
57
+
58
+ it { should parse('12abc').succeeding.like reference_parser }
59
+ it { should parse('abc123').failing.like reference_parser }
60
+ it { should parse(' ').failing.like reference_parser }
61
+ end
62
+
63
+ context 'with a nested sequence rule' do
64
+ let(:grammar) { define_grammar do
65
+ rule :assignment do
66
+ semantic_disallow(
67
+ match(/\w+/) & match('=') & match(/\w+/),
68
+ '|l,_,r| l == r'
69
+ )
70
+ end
71
+ end }
72
+ it { should parse('451a=123a ').succeeding.like reference_parser }
73
+ it { should parse('451a=451a ').failing.like reference_parser }
74
+
75
+ context 'with labels' do
76
+ let(:grammar) { define_grammar do
77
+ rule :assignment do
78
+ semantic_disallow(
79
+ label(:lt, /\w+/) & match('=') & label(:rt, /\w+/),
80
+ 'lt == rt'
81
+ )
82
+ end
83
+ end }
84
+ it { should parse('451a=123a ').succeeding.like reference_parser }
85
+ it { should parse('451a=451a ').failing.like reference_parser }
86
+ end
87
+ end
88
+
89
+ context 'with a nested optional rule' do
90
+ let(:grammar) { define_grammar do
91
+ rule :foo do
92
+ semantic_disallow(optional(/\w+/), '|_| _.empty?')
93
+ end
94
+ end }
95
+ it { should parse(' ').failing.like reference_parser }
96
+ it { should parse('foo ').succeeding.like reference_parser }
97
+ end
98
+
99
+ context 'with a nested zero-or-more rule' do
100
+ let(:grammar) { define_grammar do
101
+ rule :foo do
102
+ semantic_disallow(zero_or_more(/\w/), '|_| _.size > 3')
103
+ end
104
+ end }
105
+ it { should parse('foo ').succeeding.like reference_parser }
106
+ it { should parse('food').failing.like reference_parser }
107
+ it { should parse(' ').succeeding.like reference_parser }
108
+ end
109
+
110
+ context 'with a nested one-or-more rule' do
111
+ let(:grammar) { define_grammar do
112
+ rule :foo do
113
+ semantic_disallow(one_or_more(/\w/), '|_| _.size > 3')
114
+ end
115
+ end }
116
+ it { should parse('foo ').succeeding.like reference_parser }
117
+ it { should parse('food').failing.like reference_parser }
118
+ it { should parse(' ').failing.like reference_parser }
119
+ end
120
+
121
+ context 'with a nested list rule' do
122
+ let(:grammar) { define_grammar do
123
+ rule :foo do
124
+ semantic_disallow(list(/\w+/, /,/, 1, nil), '|_| _.size > 3')
125
+ end
126
+ end }
127
+ it { should parse('a,bc,d ').succeeding.like reference_parser }
128
+ it { should parse('a,b,c,d').failing.like reference_parser }
129
+ it { should parse(' ').failing.like reference_parser }
130
+ end
131
+
132
+ context 'with a nested apply rule' do
133
+ let(:grammar) { define_grammar do
134
+ rule(:foo) { semantic_disallow :digit, '_.to_i > 200' }
135
+ rule(:digit) { match /\d+/ }
136
+ end }
137
+ it { should parse('123a').succeeding.like reference_parser }
138
+ it { should parse(' ').failing.like reference_parser }
139
+ it { should parse('451a').failing.like reference_parser }
140
+ end
141
+
142
+ context 'with a nested token rule' do
143
+ let(:grammar) { define_grammar do
144
+ rule :foo do
145
+ semantic_disallow(token(/\w+/), '_.size > 5')
146
+ end
147
+ end }
148
+ it { should parse('abc12 ').succeeding.like reference_parser }
149
+ it { should parse(' ').failing.like reference_parser }
150
+ it { should parse('abc123').failing.like reference_parser }
151
+ end
152
+ end
@@ -1,6 +1,27 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+ require File.expand_path('assert_compiler_examples', File.dirname(__FILE__))
3
+ require File.expand_path('disallow_compiler_examples', File.dirname(__FILE__))
4
+ require File.expand_path('dispatch_action_compiler_examples', File.dirname(__FILE__))
5
+ require File.expand_path('direct_action_compiler_examples', File.dirname(__FILE__))
6
+ require File.expand_path('side_effect_compiler_examples', File.dirname(__FILE__))
7
+ require File.expand_path('semantic_assert_compiler_examples', File.dirname(__FILE__))
8
+ require File.expand_path('semantic_disallow_compiler_examples', File.dirname(__FILE__))
9
+ require File.expand_path('token_compiler_examples', File.dirname(__FILE__))
10
+ require File.expand_path('skip_compiler_examples', File.dirname(__FILE__))
11
+
1
12
  shared_examples_for 'a compiled parser' do
2
13
  include CompilerSpecHelper
3
14
 
15
+ it_behaves_like 'a compiled parser with an assert'
16
+ it_behaves_like 'a compiled parser with a disallow'
17
+ it_behaves_like 'a compiled parser with a dispatch action'
18
+ it_behaves_like 'a compiled parser with a direct action'
19
+ it_behaves_like 'a compiled parser with a side effect'
20
+ it_behaves_like 'a compiled parser with a positive semantic predicate'
21
+ it_behaves_like 'a compiled parser with a negative semantic predicate'
22
+ it_behaves_like 'a compiled parser with a token'
23
+ it_behaves_like 'a compiled parser with a skip'
24
+
4
25
  subject { compiled_parser }
5
26
 
6
27
  let(:reference_parser) { combinator_parser grammar }
@@ -23,6 +44,16 @@ shared_examples_for 'a compiled parser' do
23
44
  it { should parse('abc123').succeeding.twice.like reference_parser }
24
45
  it { should parse('==').failing.like reference_parser }
25
46
 
47
+ context 'with non-capturing parsers' do
48
+ let(:grammar) { define_grammar do
49
+ rule :foo do
50
+ skip(/\s+/) | skip(/\{[^\}]*\}/)
51
+ end
52
+ end }
53
+ it { should parse(' foo').succeeding.like reference_parser }
54
+ it { should parse('{foo}').succeeding.like reference_parser }
55
+ end
56
+
26
57
  context 'with nested choices' do
27
58
  let(:grammar) { define_grammar do
28
59
  rule(:foo) do
@@ -169,711 +200,135 @@ shared_examples_for 'a compiled parser' do
169
200
  end
170
201
  end
171
202
 
172
- ########## list ##########
173
- context 'given a list rule' do
203
+ ########## repeat ##########
204
+ context 'with a repeat rule' do
174
205
  let(:grammar) { define_grammar do
175
206
  rule :foo do
176
- list(/\w+/, /[,;]/)
207
+ repeat(/\w/, 2, 4)
177
208
  end
178
209
  end }
179
- it { should parse(' ').succeeding.like reference_parser }
180
- it { should parse('foo ').succeeding.like reference_parser }
181
- it { should parse('foo,bar;baz ').succeeding.like reference_parser }
182
- it { should parse('foo,bar, ').succeeding.like reference_parser }
183
-
184
- context 'with a non-capturing parser' do
185
- let(:grammar) { define_grammar do
186
- rule :foo do
187
- list(skip(/\w+/), /[,;]/)
188
- end
189
- end }
190
- it { should parse(' ').succeeding.like reference_parser }
191
- it { should parse('foo ').succeeding.like reference_parser }
192
- it { should parse('foo,bar;baz ').succeeding.like reference_parser }
193
- it { should parse('foo,bar, ').succeeding.like reference_parser }
194
- end
195
- end
196
-
197
- ########## list1 ##########
198
- context 'given a list1 rule' do
199
- let(:grammar) { define_grammar do
200
- rule :foo do
201
- list1(/\w+/, /[,;]/)
202
- end
203
- end }
204
- it { should parse(' ').failing.like reference_parser }
205
- it { should parse('foo ').succeeding.like reference_parser }
206
- it { should parse('foo,bar;baz ').succeeding.like reference_parser }
207
- it { should parse('foo,bar, ').succeeding.like reference_parser }
208
-
209
- context 'with a non-capturing parser' do
210
- let(:grammar) { define_grammar do
211
- rule :foo do
212
- list1(skip(/\w+/), /[,;]/)
213
- end
214
- end }
215
- it { should parse(' ').failing.like reference_parser }
216
- it { should parse('foo ').succeeding.like reference_parser }
217
- it { should parse('foo,bar;baz ').succeeding.like reference_parser }
218
- it { should parse('foo,bar, ').succeeding.like reference_parser }
219
- end
220
- end
221
-
222
- ########## apply ##########
223
- context 'given an apply rule' do
224
- let(:grammar) { define_grammar do
225
- rule(:digit) { match /\d/ }
226
- rule(:foo) { match :digit }
227
- end }
228
- it { should parse('451 ').twice.succeeding.like reference_parser }
229
- it { should parse('hi').failing.like reference_parser }
230
- end
231
-
232
- ########## assert ##########
233
- context 'given an assert rule' do
234
-
235
- context 'with a nested match rule' do
236
- let(:grammar) { define_grammar do
237
- rule(:word) { assert /\w+/ }
238
- end }
239
- it { should parse('abc123 ').succeeding.like reference_parser }
240
- it { should parse(' ').failing.like reference_parser }
241
- end
242
-
243
- context 'with a nested choice rule' do
244
- let(:grammar) { define_grammar do
245
- rule(:word) { assert(match(/[[:alpha:]]+/) | match(/[[:digit:]]+/)) }
246
- end }
247
- it { should parse('abc123 ').succeeding.like reference_parser }
248
- it { should parse(' ').failing.like reference_parser }
249
- end
250
-
251
- context 'with a nested sequence rule' do
252
- let(:grammar) { define_grammar do
253
- rule(:word) { assert(match(/[[:alpha:]]+/) & match(/[[:digit:]]+/)) }
254
- end }
255
- it { should parse('abc123 ').succeeding.like reference_parser }
256
- it { should parse(' ').failing.like reference_parser }
257
- end
258
-
259
- context 'with a nested optional rule' do
260
- let(:grammar) { define_grammar do
261
- rule(:word) { assert(optional(/\w+/)) }
262
- end }
263
- it { should parse('abc123 ').succeeding.like reference_parser }
264
- it { should parse(' ').succeeding.like reference_parser }
265
- end
266
-
267
- context 'with a nested zero_or_more rule' do
268
- let(:grammar) { define_grammar do
269
- rule(:word) { assert(zero_or_more(/\w/)) }
270
- end }
271
- it { should parse('abc123 ').succeeding.like reference_parser }
272
- it { should parse(' ').succeeding.like reference_parser }
273
- end
274
-
275
- context 'with a nested one_or_more rule' do
276
- let(:grammar) { define_grammar do
277
- rule(:word) { assert(one_or_more(/\w/)) }
278
- end }
279
- it { should parse('abc123 ').succeeding.like reference_parser }
280
- it { should parse(' ').failing.like reference_parser }
281
- end
282
-
283
- context 'with a nested list rule' do
284
- let(:grammar) { define_grammar do
285
- rule(:word) { assert(list(/\w+/, /,/)) }
286
- end }
287
- it { should parse('abc,123 ').succeeding.like reference_parser }
288
- it { should parse(' ').succeeding.like reference_parser }
289
- end
290
-
291
- context 'with a nested list1 rule' do
292
- let(:grammar) { define_grammar do
293
- rule(:word) { assert(list1(/\w+/, /,/)) }
294
- end }
295
- it { should parse('abc,123 ').succeeding.like reference_parser }
296
- it { should parse(' ').failing.like reference_parser }
297
- end
298
-
299
- context 'with a nested apply rule' do
300
- let(:grammar) { define_grammar do
301
- rule(:foo) { match :word }
302
- rule(:word) { assert /\w+/ }
303
- end }
304
- it { should parse('abc123 ').succeeding.like reference_parser }
305
- it { should parse(' ').failing.like reference_parser }
306
- end
307
-
308
- context 'with a nested dispatch-action rule' do
309
- let(:grammar) { define_grammar do
310
- rule(:word) { assert(dispatch_action(/\w+/)) }
311
- end }
312
- it { should parse('abc123 ').succeeding.like reference_parser }
313
- it { should parse(' ').failing.like reference_parser }
314
- end
315
-
316
- context 'with a nested token rule' do
317
- let(:grammar) { define_grammar do
318
- rule(:word) { assert(token(match(/\w+/))) }
319
- end }
320
- it { should parse('abc123 ').succeeding.like reference_parser }
321
- it { should parse(' ').failing.like reference_parser }
322
- end
323
-
324
- context 'with a nested skip rule' do
325
- let(:grammar) { define_grammar do
326
- rule(:word) { assert(skip(/\w+/)) }
327
- end }
328
- it { should parse('abc123 ').succeeding.like reference_parser }
329
- it { should parse(' ').failing.like reference_parser }
330
- end
331
- end
332
-
333
- ########## disallow ##########
334
- context 'given a disallow rule' do
335
-
336
- context 'with a nested match rule' do
337
- let(:grammar) { define_grammar do
338
- rule(:word) { disallow /\w+/ }
339
- end }
340
- it { should parse(' ').succeeding.like reference_parser }
341
- it { should parse('abc123 ').failing.like reference_parser }
342
- end
343
-
344
- context 'with a nested choice rule' do
345
- let(:grammar) { define_grammar do
346
- rule(:word) { disallow(match(/[[:alpha:]]/) | match(/[[:digit:]]/)) }
347
- end }
348
- it { should parse(' ').succeeding.like reference_parser }
349
- it { should parse('abc123 ').failing.like reference_parser }
350
- end
351
-
352
- context 'with a nested sequence rule' do
353
- let(:grammar) { define_grammar do
354
- rule(:word) { disallow(match(/[[:alpha:]]+/) & match(/[[:digit:]]+/)) }
355
- end }
356
- it { should parse(' ').succeeding.like reference_parser }
357
- it { should parse('abc123 ').failing.like reference_parser }
358
- end
359
-
360
- context 'with a nested optional rule' do
361
- let(:grammar) { define_grammar do
362
- rule(:word) { disallow(optional(/\w+/)) }
363
- end }
364
- it { should parse(' ').failing.like reference_parser }
365
- it { should parse('abc123 ').failing.like reference_parser }
366
- end
367
-
368
- context 'with a nested zero_or_more rule' do
369
- let(:grammar) { define_grammar do
370
- rule(:word) { disallow(zero_or_more(/\w/)) }
371
- end }
372
- it { should parse(' ').failing.like reference_parser }
373
- it { should parse('abc123 ').failing.like reference_parser }
374
- end
375
-
376
- context 'with a nested one_or_more rule' do
377
- let(:grammar) { define_grammar do
378
- rule(:word) { disallow(one_or_more(/\w/)) }
379
- end }
380
- it { should parse(' ').succeeding.like reference_parser }
381
- it { should parse('abc123 ').failing.like reference_parser }
382
- end
383
-
384
- context 'with a nested list rule' do
385
- let(:grammar) { define_grammar do
386
- rule(:word) { disallow(list(/\w+/, /,/)) }
387
- end }
388
- it { should parse(' ').failing.like reference_parser }
389
- it { should parse('abc,123 ').failing.like reference_parser }
390
- end
391
-
392
- context 'with a nested list1 rule' do
393
- let(:grammar) { define_grammar do
394
- rule(:word) { disallow(list1(/\w+/, /,/)) }
395
- end }
396
- it { should parse(' ').succeeding.like reference_parser }
397
- it { should parse('abc,123 ').failing.like reference_parser }
398
- end
399
-
400
- context 'with a nested apply rule' do
401
- let(:grammar) { define_grammar do
402
- rule(:foo) { match :word }
403
- rule(:word) { disallow /\w+/ }
404
- end }
405
- it { should parse(' ').succeeding.like reference_parser }
406
- it { should parse('abc123 ').failing.like reference_parser }
407
- end
408
-
409
- context 'with a nested dispatch-action rule' do
410
- let(:grammar) { define_grammar do
411
- rule(:word) { disallow(dispatch_action(/\w+/)) }
412
- end }
413
- it { should parse(' ').succeeding.like reference_parser }
414
- it { should parse('abc123 ').failing.like reference_parser }
415
- end
416
-
417
- context 'with a nested token rule' do
418
- let(:grammar) { define_grammar do
419
- rule(:word) { disallow(token(match(/\w+/))) }
420
- end }
421
- it { should parse(' ').succeeding.like reference_parser }
422
- it { should parse('abc123 ').failing.like reference_parser }
423
- end
424
-
425
- context 'with a nested skip rule' do
426
- let(:grammar) { define_grammar do
427
- rule(:word) { disallow(skip(/\w+/)) }
428
- end }
429
- it { should parse(' ').succeeding.like reference_parser }
430
- it { should parse('abc123 ').failing.like reference_parser }
431
- end
432
- end
433
-
434
- ########## dispatch_action ##########
435
- context 'given a dispatch-action rule' do
436
-
437
- context 'with a nested match rule' do
438
- let(:grammar) { define_grammar do
439
- rule(:digits) { dispatch_action(/\d+/) }
440
- end }
441
- it { should parse('451a').succeeding.like reference_parser }
442
- it { should parse(' ').failing.like reference_parser }
443
- end
444
-
445
- context 'with a nested choice rule' do
446
- let(:grammar) { define_grammar do
447
- rule :atom do
448
- dispatch_action(match(/[[:alpha:]]+/) | match(/[[:digit:]]+/))
449
- end
450
- end }
451
-
452
- it { should parse('451a').succeeding.like reference_parser }
453
- it { should parse(' ').failing.like reference_parser }
454
- end
455
-
456
- context 'with a nested sequence rule' do
457
- let(:grammar) { define_grammar do
458
- rule :assignment do
459
- dispatch_action(
460
- match(/[[:alpha:]]+/) &
461
- match('=') &
462
- match(/[[:digit:]]+/)
463
- )
464
- end
465
- end }
466
-
467
- it { should parse('val=42 ').succeeding.like reference_parser }
468
- it { should parse('val=x').failing.like reference_parser }
469
-
470
- context 'with labels' do
471
- let(:grammar) { define_grammar do
472
- rule :assignment do
473
- dispatch_action(
474
- label(:name, /[[:alpha:]]+/) &
475
- match('=') &
476
- label(:value, /[[:digit:]]+/)
477
- )
478
- end
479
- end }
480
- it { should parse('val=42 ').succeeding.like reference_parser }
481
- end
482
- end
483
-
484
- context 'with a nested optional rule' do
485
- let(:grammar) { define_grammar do
486
- rule :foo do
487
- dispatch_action(optional(/\w+/))
488
- end
489
- end }
490
- it { should parse('foo ').succeeding.like reference_parser }
491
- it { should parse(' ').succeeding.like reference_parser }
492
- end
210
+ it { should parse('foo ').succeeding.like reference_parser }
211
+ it { should parse('abcde ').succeeding.like reference_parser }
212
+ it { should parse('a ').failing.like reference_parser }
493
213
 
494
- context 'with a nested zero-or-more rule' do
214
+ context 'with no upper bound' do
495
215
  let(:grammar) { define_grammar do
496
216
  rule :foo do
497
- dispatch_action(zero_or_more(/\w/))
217
+ repeat(/\w/, 2, nil)
498
218
  end
499
219
  end }
500
220
  it { should parse('foo ').succeeding.like reference_parser }
501
- it { should parse(' ').succeeding.like reference_parser }
221
+ it { should parse('abcde ').succeeding.like reference_parser }
222
+ it { should parse('a ').failing.like reference_parser }
502
223
  end
503
224
 
504
- context 'with a nested one-or-more rule' do
225
+ context 'with a non-capturing parser' do
505
226
  let(:grammar) { define_grammar do
506
227
  rule :foo do
507
- dispatch_action(one_or_more(/\w/))
228
+ repeat(skip(/\w/), 2, 4)
508
229
  end
509
230
  end }
510
231
  it { should parse('foo ').succeeding.like reference_parser }
511
- it { should parse(' ').failing.like reference_parser }
512
- end
513
-
514
- context 'with a nested apply rule' do
515
- let(:grammar) { define_grammar do
516
- rule(:digit) { match /\d/ }
517
- rule(:foo) { dispatch_action :digit }
518
- end }
519
- it { should parse('451a').succeeding.twice.like reference_parser }
520
- it { should parse(' ').failing.like reference_parser }
521
- end
522
-
523
- context 'with a nested token rule' do
524
- let(:grammar) { define_grammar do
525
- rule :foo do
526
- dispatch_action(token(match(/\w+/)))
527
- end
528
- end }
529
- it { should parse('abc123').succeeding.like reference_parser }
530
- it { should parse(' ').failing.like reference_parser }
531
- end
532
-
533
- context 'with a nested skip rule' do
534
- let(:grammar) { define_grammar do
535
- rule :foo do
536
- dispatch_action(skip(/\w+/))
537
- end
538
- end }
539
- it { should parse('abc123').succeeding.like reference_parser }
540
- it { should parse(' ').failing.like reference_parser }
232
+ it { should parse('abcde ').succeeding.like reference_parser }
233
+ it { should parse('a ').failing.like reference_parser }
541
234
  end
542
235
  end
543
236
 
544
- ########## direct_action ##########
545
- context 'given a direct-action rule' do
546
-
547
- context 'with a nested match rule' do
548
- let(:grammar) { define_grammar do
549
- rule(:num) { direct_action(/\d+/, '|_| _.to_i') }
550
- end }
551
- it { should parse('451a').succeeding.like reference_parser }
552
- it { should parse(' ').failing.like reference_parser }
553
- end
554
-
555
- context 'with a nested choice rule' do
556
- let(:grammar) { define_grammar do
557
- rule :foo do
558
- direct_action(
559
- match(/[[:alpha:]]+/) | match(/[[:digit:]]+/),
560
- '|_| _.size'
561
- )
562
- end
563
- end }
564
-
565
- it { should parse('abc123').succeeding.like reference_parser }
566
- it { should parse('451a').succeeding.like reference_parser }
567
- it { should parse(' ').failing.like reference_parser }
568
- end
569
-
570
- context 'with a nested sequence rule' do
571
- let(:grammar) { define_grammar do
572
- rule :assignment do
573
- direct_action(
574
- match(/[[:alpha:]]+/) & match('=') & match(/[[:digit:]]+/),
575
- '|l,_,r| "#{r} -> #{l}"'
576
- )
577
- end
578
- end }
579
-
580
- it { should parse('val=42 ').succeeding.like reference_parser }
581
- it { should parse('val=x').failing.like reference_parser }
582
-
583
- context 'with labels' do
584
- let(:grammar) { define_grammar do
585
- rule :assignment do
586
- direct_action(
587
- label(:name, /[[:alpha:]]+/) & match('=') & label(:value, /[[:digit:]]+/),
588
- '"#{value} -> #{name}"'
589
- )
590
- end
591
- end }
592
- it { should parse('val=42 ').succeeding.like reference_parser }
237
+ ########## list ##########
238
+ context 'given a list rule' do
239
+ let(:grammar) { define_grammar do
240
+ rule :foo do
241
+ list(/\w+/, /[,;]/, 2, nil)
593
242
  end
594
- end
595
-
596
- context 'with a nested optional rule' do
597
- let(:grammar) { define_grammar do
598
- rule :foo do
599
- direct_action(optional(/\w+/), '|_| _.size')
600
- end
601
- end }
602
- it { should parse('foo ').succeeding.like reference_parser }
603
- it { should parse(' ').succeeding.like reference_parser }
604
- end
605
-
606
- context 'with a nested zero-or-more rule' do
607
- let(:grammar) { define_grammar do
608
- rule :foo do
609
- direct_action(zero_or_more(/\w/), '|_| _.size')
610
- end
611
- end }
612
- it { should parse('foo ').succeeding.like reference_parser }
613
- it { should parse(' ').succeeding.like reference_parser }
614
- end
615
-
616
- context 'with a nested one-or-more rule' do
617
- let(:grammar) { define_grammar do
618
- rule :foo do
619
- direct_action(one_or_more(/\w/), '|_| _.size')
620
- end
621
- end }
622
- it { should parse('foo ').succeeding.like reference_parser }
623
- it { should parse(' ').failing.like reference_parser }
624
- end
625
-
626
- context 'with a nested apply rule' do
627
- let(:grammar) { define_grammar do
628
- rule(:digit) { match /\d/ }
629
- rule(:foo) { direct_action :digit, '|_| _.to_i' }
630
- end }
631
- it { should parse('451a').succeeding.twice.like reference_parser }
632
- it { should parse(' ').failing.like reference_parser }
633
- end
634
-
635
- context 'with a nested token rule' do
636
- let(:grammar) { define_grammar do
637
- rule :foo do
638
- direct_action(token(/\w+/), '|_| _.size')
639
- end
640
- end }
641
- it { should parse('abc123').succeeding.like reference_parser }
642
- it { should parse(' ').failing.like reference_parser }
643
- end
243
+ end }
244
+ it { should parse('foo ').failing.like reference_parser }
245
+ it { should parse('foo,bar;baz ').succeeding.like reference_parser }
246
+ it { should parse('foo,bar, ').succeeding.like reference_parser }
644
247
 
645
- context 'with a nested skip rule' do
248
+ context 'with an upper bound' do
646
249
  let(:grammar) { define_grammar do
647
250
  rule :foo do
648
- direct_action(skip(/\w+/), '42' )
649
- end
650
- end }
651
- it { should parse('abc123').succeeding.like reference_parser }
652
- it { should parse(' ').failing.like reference_parser }
653
- end
654
- end
655
-
656
- ########## token ##########
657
- context 'given a token rule' do
658
-
659
- context 'with a nested match rule' do
660
- let(:grammar) { define_grammar do
661
- rule(:digits) { token(match(/\d+/)) }
662
- end }
663
- it { should parse('451a').succeeding.like reference_parser }
664
- it { should parse('hi').failing.like reference_parser }
665
- end
666
-
667
- context 'with a nested choice rule' do
668
- let(:grammar) { define_grammar do
669
- rule(:atom) do
670
- token(match(/[[:alpha:]]+/) | match(/[[:digit:]]+/))
251
+ list(/\w+/, /[,;]/, 2, 4)
671
252
  end
672
253
  end }
673
-
674
- it { should parse('abc123 ').succeeding.like reference_parser }
675
- it { should parse('==').failing.like reference_parser }
676
-
677
- context 'with non-capturing choices' do
678
- let(:grammar) { define_grammar do
679
- rule(:atom) do
680
- token(skip(/[[:alpha:]]+/) | match(/[[:digit:]]+/))
681
- end
682
- end }
683
- it { should parse('abc123 ').succeeding.like reference_parser }
684
- it { should parse('==').failing.like reference_parser }
685
- end
686
- end
687
-
688
- context 'with a nested sequence rule' do
689
- let(:grammar) { define_grammar do
690
- rule(:atom) do
691
- token(match(/[[:alpha:]]+/) & match(/[[:digit:]]+/))
692
- end
693
- end }
694
-
695
- it { should parse('foo42!').succeeding.like reference_parser }
696
- it { should parse('val=x').failing.like reference_parser }
697
-
698
- context 'with non-capturing parsers' do
699
- let(:grammar) { define_grammar do
700
- rule :foo do
701
- token(match(/[[:alpha:]]+/) & skip(/\s+/) & match(/[[:digit:]]+/))
702
- end
703
- end }
704
- it { should parse('foo 42').succeeding.like reference_parser }
705
- it { should parse('foo bar').failing.like reference_parser }
706
- end
254
+ it { should parse('foo ').failing.like reference_parser }
255
+ it { should parse('foo,bar;baz ').succeeding.like reference_parser }
256
+ it { should parse('a,b,c,d,e ').succeeding.like reference_parser }
257
+ it { should parse('foo,bar, ').succeeding.like reference_parser }
707
258
  end
708
259
 
709
- context 'with a nested optional rule' do
260
+ context 'with a non-capturing parser' do
710
261
  let(:grammar) { define_grammar do
711
262
  rule :foo do
712
- token(optional(/\w+/))
263
+ list(skip(/\w+/), /[,;]/, 2, nil)
713
264
  end
714
265
  end }
266
+ it { should parse('foo ').failing.like reference_parser }
267
+ it { should parse('foo,bar;baz ').succeeding.like reference_parser }
268
+ it { should parse('foo,bar, ').succeeding.like reference_parser }
715
269
 
716
- it { should parse('foo ').succeeding.like reference_parser }
717
- it { should parse(' ').succeeding.like reference_parser }
718
-
719
- context 'with a non-capturing rule' do
270
+ context 'with an upper bound' do
720
271
  let(:grammar) { define_grammar do
721
272
  rule :foo do
722
- token(optional(skip(/\w+/)))
273
+ list(skip(/\w+/), /[,;]/, 2, 4)
723
274
  end
724
275
  end }
725
- it { should parse('foo ').succeeding.like reference_parser }
726
- it { should parse(' ').succeeding.like reference_parser }
276
+ it { should parse('foo ').failing.like reference_parser }
277
+ it { should parse('foo,bar;baz ').succeeding.like reference_parser }
278
+ it { should parse('a,b,c,d,e ').succeeding.like reference_parser }
279
+ it { should parse('foo,bar, ').succeeding.like reference_parser }
727
280
  end
728
- end
729
-
730
- context 'with a nested zero-or-more rule' do
731
- let(:grammar) { define_grammar do
732
- rule :foo do
733
- token(zero_or_more(/\w/))
734
- end
735
- end }
736
281
 
737
- it { should parse('foo ').succeeding.like reference_parser }
738
- it { should parse(' ').succeeding.like reference_parser }
739
-
740
- context 'with a non-capturing rule' do
282
+ context 'with "zero-or-more" bounds' do
741
283
  let(:grammar) { define_grammar do
742
284
  rule :foo do
743
- token(zero_or_more(skip(/\w/)))
285
+ list(skip(/\w+/), /[,;]/, 0, nil)
744
286
  end
745
287
  end }
746
- it { should parse('foo ').succeeding.like reference_parser }
747
- it { should parse(' ').succeeding.like reference_parser }
288
+ it { should parse(' ').succeeding.like reference_parser }
289
+ it { should parse('foo ').succeeding.like reference_parser }
290
+ it { should parse('foo,bar;baz ').succeeding.like reference_parser }
748
291
  end
749
- end
750
-
751
- context 'with a nested one-or-more rule' do
752
- let(:grammar) { define_grammar do
753
- rule :foo do
754
- token(one_or_more(/\w/))
755
- end
756
- end }
757
-
758
- it { should parse('foo ').succeeding.like reference_parser }
759
- it { should parse(' ').failing.like reference_parser }
760
292
 
761
- context 'with a non-capturing rule' do
293
+ context 'with "one-or-more" bounds' do
762
294
  let(:grammar) { define_grammar do
763
295
  rule :foo do
764
- token(one_or_more(skip(/\w/)))
296
+ list(skip(/\w+/), /[,;]/, 1, nil)
765
297
  end
766
298
  end }
767
- it { should parse('foo ').succeeding.like reference_parser }
768
- it { should parse(' ').failing.like reference_parser }
299
+ it { should parse(' ').failing.like reference_parser }
300
+ it { should parse('foo ').succeeding.like reference_parser }
301
+ it { should parse('foo,bar;baz ').succeeding.like reference_parser }
769
302
  end
770
303
  end
771
-
772
- context 'with a nested apply rule' do
773
- let(:grammar) { define_grammar do
774
- rule(:foo) { token(match(:digits)) }
775
- rule(:digits) { match(/\d+/) }
776
- end }
777
-
778
- it { should parse('451a').succeeding.like reference_parser }
779
- it { should parse('hi').failing.like reference_parser }
780
-
781
- context 'applying a non-capturing rule' do
782
- let(:grammar) { define_grammar do
783
- rule(:foo) { token(match(:digits)) }
784
- rule(:digits) { skip(/\d+/) }
785
- end }
786
- it { should parse('451a').succeeding.like reference_parser }
787
- it { should parse('hi').failing.like reference_parser }
788
- end
789
- end
790
-
791
- context 'with a nested dispatch-action rule' do
792
- let(:grammar) { define_grammar do
793
- rule(:foo) { token(dispatch_action(/\w+/)) }
794
- end }
795
- it { should parse('abc123').succeeding.like reference_parser }
796
- it { should parse(' ').failing.like reference_parser }
797
- end
798
-
799
- context 'with a nested skip rule' do
800
- let(:grammar) { define_grammar do
801
- rule(:foo) { token(skip(/\w+/)) }
802
- end }
803
- it { should parse('abc123').succeeding.like reference_parser }
804
- it { should parse(' ').failing.like reference_parser }
805
- end
806
304
  end
807
305
 
808
- ########## skip ##########
809
- context 'given a skip rule' do
810
-
811
- context 'with a nested match rule' do
812
- let(:grammar) { define_grammar do
813
- rule(:ws) { skip(/\s+/) }
814
- end }
815
- it { should parse(' foo').succeeding.like reference_parser }
816
- it { should parse('hi').failing.like reference_parser }
817
- end
818
-
819
- context 'with a nested choice rule' do
820
- let(:grammar) { define_grammar do
821
- rule(:ws) do
822
- skip(match(/\s+/) | match(/\#[^\n]*/))
823
- end
824
- end }
825
- it { should parse(' # hi there ').succeeding.twice.like reference_parser }
826
- it { should parse('hi').failing.like reference_parser }
827
- end
828
-
829
- context 'with a nested sequence rule' do
830
- let(:grammar) { define_grammar do
831
- rule :foo do
832
- skip(match(/[[:alpha:]]+/) & match(/[[:digit:]]+/))
833
- end
834
- end }
835
- it { should parse('foo42!').succeeding.like reference_parser }
836
- it { should parse('val=x').failing.like reference_parser }
837
- end
838
-
839
- context 'with a nested optional rule' do
840
- let(:grammar) { define_grammar do
841
- rule :foo do
842
- skip(optional(/\w+/))
843
- end
844
- end }
845
- it { should parse('foo ').succeeding.like reference_parser }
846
- it { should parse(' ').succeeding.like reference_parser }
847
- end
848
-
849
- context 'with a nested zero-or-more rule' do
850
- let(:grammar) { define_grammar do
851
- rule :foo do
852
- skip(zero_or_more(/\w/))
853
- end
854
- end }
855
- it { should parse('foo ').succeeding.like reference_parser }
856
- it { should parse(' ').succeeding.like reference_parser }
857
- end
858
-
859
- context 'with a nested one-or-more rule' do
860
- let(:grammar) { define_grammar do
861
- rule :foo do
862
- skip(one_or_more(/\w/))
863
- end
864
- end }
865
- it { should parse('foo ').succeeding.like reference_parser }
866
- it { should parse(' ').failing.like reference_parser }
867
- end
306
+ ########## apply ##########
307
+ context 'given an apply rule' do
308
+ let(:grammar) { define_grammar do
309
+ rule(:digit) { match /\d/ }
310
+ rule(:foo) { match :digit }
311
+ end }
312
+ it { should parse('451 ').twice.succeeding.like reference_parser }
313
+ it { should parse('hi').failing.like reference_parser }
314
+ end
868
315
 
869
- context 'with a nested apply rule' do
870
- let(:grammar) { define_grammar do
871
- rule(:digits) { match(/\d+/) }
872
- rule(:foo) { skip(:digits) }
873
- end }
874
- it { should parse('451a').succeeding.like reference_parser }
875
- it { should parse('hi').failing.like reference_parser }
876
- end
316
+ ########## eof ##########
317
+ context 'given eof' do
318
+ let(:grammar) { define_grammar do
319
+ rule(:foo) { eof }
320
+ end }
321
+ it { should parse('').succeeding.like reference_parser }
322
+ it { should parse('foo').from(3).succeeding.like reference_parser }
323
+ it { should parse('foo').failing.like reference_parser }
877
324
  end
878
325
 
326
+ ########## E ##########
327
+ context 'given "E" symbol' do
328
+ let(:grammar) { define_grammar do
329
+ rule(:foo) { e }
330
+ end }
331
+ it { should parse('').succeeding.like reference_parser }
332
+ it { should parse('foo').succeeding.like reference_parser }
333
+ end
879
334
  end