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,30 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe ESymbol do
4
+ include CombinatorParserSpecHelper
5
+
6
+ subject { ESymbol[] }
7
+
8
+ describe '#parse' do
9
+ it 'returns true without advancing' do
10
+ parsing('anything').at(4).should result_in(true).at(4)
11
+ parsing(' ').at(7).should result_in(true).at(7)
12
+ end
13
+ end
14
+
15
+ describe '#capturing?' do
16
+ it 'is false' do
17
+ subject.should_not be_capturing
18
+ end
19
+ end
20
+
21
+ describe '#with_ws' do
22
+
23
+ let(:ws) { Match[/\s*/] }
24
+
25
+ it 'returns a parser that skips whitespace before matching' do
26
+ subject.with_ws(ws).should == Sequence[Skip[ws], subject]
27
+ end
28
+ end
29
+
30
+ end
@@ -4,27 +4,36 @@ describe Eof do
4
4
  include CombinatorParserSpecHelper
5
5
 
6
6
  subject { Eof[] }
7
-
7
+
8
8
  describe '#parse' do
9
-
9
+
10
10
  context 'at the end of the source' do
11
11
  it 'returns true' do
12
12
  parsing('abc123').at(6).should result_in(true).at(6)
13
13
  end
14
14
  end
15
-
15
+
16
16
  context 'before the end of the source' do
17
17
  it 'fails' do
18
18
  parsing('abc123').at(5).should fail
19
19
  end
20
20
  end
21
-
21
+
22
22
  end
23
-
23
+
24
24
  describe '#capturing?' do
25
25
  it 'is false' do
26
26
  subject.should_not be_capturing
27
27
  end
28
28
  end
29
-
29
+
30
+ describe '#with_ws' do
31
+
32
+ let(:ws) { Match[/\s*/] }
33
+
34
+ it 'returns a parser that skips whitespace before matching' do
35
+ subject.with_ws(ws).should == Sequence[Skip[ws], subject]
36
+ end
37
+ end
38
+
30
39
  end
@@ -3,7 +3,9 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
3
3
  describe Label do
4
4
  include CombinatorParserSpecHelper
5
5
 
6
- subject { Label[:name, [Match[/\w+/]]] }
6
+ subject { Label[:name, nested] }
7
+
8
+ let(:nested) { Match[/\w+/] }
7
9
 
8
10
  describe '#parse' do
9
11
 
@@ -28,7 +30,9 @@ describe Label do
28
30
  end
29
31
 
30
32
  context 'with a non-capturing parser' do
31
- subject { Label[:name, [Skip[Match[/\s+/]]]] }
33
+
34
+ let(:nested) { Skip[Match[/\s+/]] }
35
+
32
36
  it 'is false' do
33
37
  subject.should_not be_capturing
34
38
  end
@@ -36,4 +40,13 @@ describe Label do
36
40
 
37
41
  end
38
42
 
43
+ describe '#with_ws' do
44
+
45
+ let(:ws) { Match[/\s*/] }
46
+
47
+ it 'applies #with_ws to the nested parser' do
48
+ subject.with_ws(ws).should == Label[:name, Sequence[Skip[ws], nested]]
49
+ end
50
+ end
51
+
39
52
  end
@@ -0,0 +1,187 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
+
3
+ describe ListParser do
4
+ include CombinatorParserSpecHelper
5
+
6
+ subject { ListParser[term_parser, sep_parser, *bounds] }
7
+
8
+ let(:sep_parser) { Match[/[,;]/] }
9
+
10
+ describe '#parse' do
11
+
12
+ context 'with a capturing term parser' do
13
+
14
+ let(:term_parser) { Match[/\w+/] }
15
+
16
+ context 'with no upper bound' do
17
+
18
+ let(:bounds) { [2, nil] }
19
+
20
+ context 'when the parser matches enough terms' do
21
+ it 'returns an array with the results of matching the terms' do
22
+ parsing('foo,bar;baz ').should result_in(['foo', 'bar', 'baz']).at(11)
23
+ end
24
+ end
25
+
26
+ context 'when the parser matches too few terms' do
27
+ it 'fails' do
28
+ parsing('foo ').should fail
29
+ end
30
+ end
31
+
32
+ context 'with a separator not followed by a term' do
33
+ it 'matches without consuming the extra separator' do
34
+ parsing('foo,bar,').should result_in(['foo', 'bar']).at(7)
35
+ end
36
+ end
37
+ end
38
+
39
+ context 'with an upper bound' do
40
+
41
+ let(:bounds) { [2, 4] }
42
+
43
+ context 'when the parser would match too many terms' do
44
+ it 'stops matching at the upper bound' do
45
+ parsing('a,b,c,d,e').should result_in(['a', 'b', 'c', 'd']).at(7)
46
+ end
47
+ end
48
+ end
49
+
50
+ context 'with zero-or-more bounds' do
51
+
52
+ let(:bounds) { [0, nil] }
53
+
54
+ context 'when no terms match' do
55
+ it 'returns an empty array without advancing' do
56
+ parsing(' ').should result_in([]).at(0)
57
+ end
58
+ end
59
+
60
+ context 'when a single term matches' do
61
+ it 'returns an array with the result of matching the term' do
62
+ parsing('foo').should result_in(['foo']).at(3)
63
+ end
64
+ end
65
+ end
66
+
67
+ context 'with one-or-more bounds' do
68
+
69
+ let(:bounds) { [1, nil] }
70
+
71
+ context 'when no terms match' do
72
+ it 'fails' do
73
+ parsing(' ').should fail
74
+ end
75
+ end
76
+
77
+ context 'when a single term matches' do
78
+ it 'returns an array with the result of matching the term' do
79
+ parsing('foo').should result_in(['foo']).at(3)
80
+ end
81
+ end
82
+ end
83
+ end
84
+
85
+ context 'with a non-capturing term parser' do
86
+
87
+ let(:term_parser) { Skip[Match[/\w+/]] }
88
+ let(:bounds) { [2, nil] }
89
+
90
+ context 'when the parser matches enough terms' do
91
+ it 'returns true consuming the terms' do
92
+ parsing('foo,bar;baz ').should result_in(true).at(11)
93
+ end
94
+ end
95
+
96
+ context 'when the parser matches too few terms' do
97
+ it 'fails' do
98
+ parsing('foo ').should fail
99
+ end
100
+ end
101
+
102
+ context 'with zero-or-more bounds' do
103
+
104
+ let(:bounds) { [0, nil] }
105
+
106
+ context 'when no terms match' do
107
+ it 'returns true without advancing' do
108
+ parsing(' ').should result_in(true).at(0)
109
+ end
110
+ end
111
+
112
+ context 'when a single term matches' do
113
+ it 'returns true consuming the term' do
114
+ parsing('foo ').should result_in(true).at(3)
115
+ end
116
+ end
117
+
118
+ context 'when multiple terms match' do
119
+ it 'returns true consuming the list' do
120
+ parsing('foo,bar;baz ').should result_in(true).at(11)
121
+ end
122
+ end
123
+ end
124
+
125
+ context 'with one-or-more bounds' do
126
+
127
+ let(:bounds) { [1, nil] }
128
+
129
+ context 'when no terms match' do
130
+ it 'fails' do
131
+ parsing(' ').should fail
132
+ end
133
+ end
134
+
135
+ context 'when a single term matches' do
136
+ it 'returns true consuming the term' do
137
+ parsing('foo ').should result_in(true).at(3)
138
+ end
139
+ end
140
+
141
+ context 'when multiple terms match' do
142
+ it 'returns true consuming the list' do
143
+ parsing('foo,bar;baz ').should result_in(true).at(11)
144
+ end
145
+ end
146
+ end
147
+ end
148
+ end
149
+
150
+ describe '#capturing?' do
151
+
152
+ let(:bounds) { [2, 4] }
153
+
154
+ context 'with a capturing term parser' do
155
+
156
+ let(:term_parser) { Match[/\w+/] }
157
+
158
+ it 'is true' do
159
+ subject.should be_capturing
160
+ end
161
+ end
162
+
163
+ context 'with a non-capturing term parser' do
164
+
165
+ let(:term_parser) { Skip[Match[/\w+/]] }
166
+
167
+ it 'is false' do
168
+ subject.should_not be_capturing
169
+ end
170
+ end
171
+ end
172
+
173
+ describe '#with_ws' do
174
+
175
+ let(:ws) { Match[/\s*/] }
176
+ let(:term_parser) { Match[/\w+/] }
177
+ let(:bounds) { [2, 4] }
178
+
179
+ it 'applies #with_ws to the term and separator parsers' do
180
+ subject.with_ws(ws).should == ListParser[
181
+ Sequence[Skip[ws], term_parser],
182
+ Sequence[Skip[ws], sep_parser],
183
+ *bounds]
184
+ end
185
+ end
186
+
187
+ end
@@ -2,30 +2,39 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Rattler::Parsers::Match do
4
4
  include CombinatorParserSpecHelper
5
-
5
+
6
6
  subject { Match[/\w+/] }
7
-
7
+
8
8
  describe '#parse' do
9
-
9
+
10
10
  context 'when the regexp matches' do
11
11
  it 'succeeds returning the matched string' do
12
12
  parsing('abc123 ').should result_in('abc123').at(6)
13
13
  end
14
14
  end
15
-
15
+
16
16
  context 'when the regexp does not match' do
17
17
  it 'fails' do
18
18
  parsing(' abc').should fail
19
19
  parsing('==').should fail
20
20
  end
21
21
  end
22
-
22
+
23
23
  end
24
-
24
+
25
25
  describe '#capturing?' do
26
26
  it 'is true' do
27
27
  subject.should be_capturing
28
28
  end
29
29
  end
30
-
30
+
31
+ describe '#with_ws' do
32
+
33
+ let(:ws) { Match[/\s*/] }
34
+
35
+ it 'returns a parser that skips whitespace before matching' do
36
+ subject.with_ws(ws).should == Sequence[Skip[ws], subject]
37
+ end
38
+ end
39
+
31
40
  end
@@ -33,72 +33,80 @@ describe ParserDSL do
33
33
  subject.match(:EOF).should == Eof[]
34
34
  end
35
35
  end
36
+ context 'given :E' do
37
+ it 'creates the "E" symbol parser' do
38
+ subject.match(:E).should == ESymbol[]
39
+ end
40
+ end
36
41
  end
37
42
 
38
43
  describe '#optional' do
39
44
  context 'given a parser' do
40
- it 'creates an optional parser' do
41
- subject.optional(subject.match(/\w+/)).should == Optional[Match[/\w+/]]
45
+ it 'creates a repeat parser with optional bounds' do
46
+ subject.optional(subject.match(/\w+/)).
47
+ should == Repeat[Match[/\w+/], 0, 1]
42
48
  end
43
49
  end
44
50
  context 'given a match argument' do
45
- it 'creates an optional match parser' do
46
- subject.optional(/\w+/).should == Optional[Match[/\w+/]]
51
+ it 'creates a repeat parser with optional bounds' do
52
+ subject.optional(/\w+/).should == Repeat[Match[/\w+/], 0, 1]
47
53
  end
48
54
  end
49
55
  end
50
56
 
51
57
  describe '#zero_or_more' do
52
58
  context 'given a parser' do
53
- it 'creates a zero-or-more parser' do
54
- subject.zero_or_more(subject.match(/\w+/)).should == ZeroOrMore[Match[/\w+/]]
59
+ it 'creates a repeat parser with zero-or-more bounds' do
60
+ subject.zero_or_more(subject.match(/\w+/)).
61
+ should == Repeat[Match[/\w+/], 0, nil]
55
62
  end
56
63
  end
57
64
  context 'given a match argument' do
58
- it 'creates a zero-or-more match parser' do
59
- subject.zero_or_more(/\w+/).should == ZeroOrMore[Match[/\w+/]]
65
+ it 'creates a repeat parser with zero-or-more bounds' do
66
+ subject.zero_or_more(/\w+/).should == Repeat[Match[/\w+/], 0, nil]
60
67
  end
61
68
  end
62
69
  end
63
70
 
64
71
  describe '#one_or_more' do
65
72
  context 'given a parser' do
66
- it 'creates a one-or-more parser' do
67
- subject.one_or_more(subject.match(/\w+/)).should == OneOrMore[Match[/\w+/]]
73
+ it 'creates a repeat parser with one-or-more bounds' do
74
+ subject.one_or_more(subject.match(/\w+/)).
75
+ should == Repeat[Match[/\w+/], 1, nil]
68
76
  end
69
77
  end
70
78
  context 'given a match argument' do
71
- it 'creates a one-or-more match parser' do
72
- subject.one_or_more(/\w+/).should == OneOrMore[Match[/\w+/]]
79
+ it 'creates a repeat parser with one-or-more bounds' do
80
+ subject.one_or_more(/\w+/).should == Repeat[Match[/\w+/], 1, nil]
73
81
  end
74
82
  end
75
83
  end
76
84
 
77
- describe '#list' do
85
+ describe '#repeat' do
78
86
  context 'given parsers' do
79
- it 'creates a list parser' do
80
- subject.list(subject.match(/\w+/), subject.match(/,/)).
81
- should == List0[Match[/\w+/], Match[/,/]]
87
+ it 'creates a repeat parser' do
88
+ subject.repeat(subject.match(/\w+/), 2, 4).
89
+ should == Repeat[Match[/\w+/], 2, 4]
82
90
  end
83
91
  end
84
92
  context 'given match arguments' do
85
- it 'creates a list parser' do
86
- subject.list(/\w+/, ',').should == List0[Match[/\w+/], Match[/,/]]
93
+ it 'creates a repeat parser' do
94
+ subject.repeat(/\w+/, 2, 4).should == Repeat[Match[/\w+/], 2, 4]
87
95
  end
88
96
  end
89
97
  end
90
98
 
91
- describe '#list1' do
99
+ describe '#list' do
92
100
  context 'given parsers' do
93
101
  it 'creates a list parser' do
94
- subject.list1(subject.match(/\w+/), subject.match(/,/)).
95
- should == List1[Match[/\w+/], Match[/,/]]
102
+ subject.list(subject.match(/\w+/), subject.match(/,/), 2, 4).
103
+ should == ListParser[Match[/\w+/], Match[/,/], 2, 4]
96
104
  end
97
105
  end
98
106
  context 'given match arguments' do
99
107
  it 'creates a list parser' do
100
- subject.list1(/\w+/, ',').
101
- should == List1[Match[/\w+/], Match[/,/]]
108
+ subject.list(/\w+/, ',', 2, 4).
109
+ should == ListParser[Match[/\w+/], Match[/,/], 2, 4]
102
110
  end
103
111
  end
104
112
  end
@@ -135,6 +143,12 @@ describe ParserDSL do
135
143
  end
136
144
  end
137
145
 
146
+ describe '#e' do
147
+ it 'creates the "E" symbol parser' do
148
+ subject.e.should == ESymbol[]
149
+ end
150
+ end
151
+
138
152
  describe '#dispatch_action' do
139
153
  context 'given a parser' do
140
154
  context 'given options' do
@@ -179,6 +193,51 @@ describe ParserDSL do
179
193
  end
180
194
  end
181
195
 
196
+ describe '#side_effect' do
197
+ context 'given a parser' do
198
+ it 'creates a side-effect parser' do
199
+ subject.side_effect(subject.match(/\d+/), '@i = _.to_i').
200
+ should == SideEffect[Match[/\d+/], '@i = _.to_i']
201
+ end
202
+ end
203
+ context 'given a match argument' do
204
+ it 'creates a side-effect match parser' do
205
+ subject.side_effect(/\d+/, '@i = _.to_i').
206
+ should == SideEffect[Match[/\d+/], '@i = _.to_i']
207
+ end
208
+ end
209
+ end
210
+
211
+ describe '#semantic_assert' do
212
+ context 'given a parser' do
213
+ it 'creates a positive Semantic predicate parser' do
214
+ subject.semantic_assert(subject.match(/\d+/), '_.to_i < 7').
215
+ should == SemanticAssert[Match[/\d+/], '_.to_i < 7']
216
+ end
217
+ end
218
+ context 'given a match argument' do
219
+ it 'creates a positive Semantic predicate match parser' do
220
+ subject.semantic_assert(/\d+/, '_.to_i < 7').
221
+ should == SemanticAssert[Match[/\d+/], '_.to_i < 7']
222
+ end
223
+ end
224
+ end
225
+
226
+ describe '#semantic_disallow' do
227
+ context 'given a parser' do
228
+ it 'creates a negative Semantic predicate parser' do
229
+ subject.semantic_disallow(subject.match(/\d+/), '_.to_i < 7').
230
+ should == SemanticDisallow[Match[/\d+/], '_.to_i < 7']
231
+ end
232
+ end
233
+ context 'given a match argument' do
234
+ it 'creates a negative Semantic match parser' do
235
+ subject.semantic_disallow(/\d+/, '_.to_i < 7').
236
+ should == SemanticDisallow[Match[/\d+/], '_.to_i < 7']
237
+ end
238
+ end
239
+ end
240
+
182
241
  describe '#token' do
183
242
  context 'given a parser' do
184
243
  it 'creates a token parser' do