rattler 0.4.2 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -150,6 +150,12 @@ describe Rattler::Grammar::GrammarParser do
150
150
  end
151
151
  end
152
152
 
153
+ context 'given the E symbol' do
154
+ it 'parses as ESymbol[]' do
155
+ matching(' E ').as(:expression).should result_in(ESymbol[]).at(2)
156
+ end
157
+ end
158
+
153
159
  context 'given an upper-case POSIX class name' do
154
160
  it 'parses as a Match of a POSIX character class' do
155
161
  for name in posix_names
@@ -167,6 +173,87 @@ describe Rattler::Grammar::GrammarParser do
167
173
  end
168
174
  end
169
175
 
176
+ context 'given an optional expression' do
177
+ it 'parses as a Repeat with optional bounds' do
178
+ matching(' expr? ').as(:expression).
179
+ should result_in(Repeat[Apply[:expr], 0, 1]).at(6)
180
+ end
181
+ end
182
+
183
+ context 'given a zero-or-more expression' do
184
+ it 'parses as a Repeat with zero-or-more bounds' do
185
+ matching(' expr* ').as(:expression).
186
+ should result_in(Repeat[Apply[:expr], 0, nil]).at(6)
187
+ end
188
+ end
189
+
190
+ context 'given a one-or-more expression' do
191
+ it 'parses as a Repeat with one-or-more bounds' do
192
+ matching(' expr+ ').as(:expression).
193
+ should result_in(Repeat[Apply[:expr], 1, nil]).at(6)
194
+ end
195
+ end
196
+
197
+ context 'given a generalized repeat expression' do
198
+ context 'with a single count' do
199
+ it 'parses as a Repeat with the count as both lower and upper bounds' do
200
+ matching(' expr 2 ').as(:expression).
201
+ should result_in(Repeat[Apply[:expr], 2, 2]).at(7)
202
+ end
203
+ end
204
+
205
+ context 'with a range' do
206
+ it 'parses as a Repeat with lower and upper bounds' do
207
+ matching(' expr 2..4 ').as(:expression).
208
+ should result_in(Repeat[Apply[:expr], 2, 4]).at(10)
209
+ end
210
+
211
+ context 'with no upper bound' do
212
+ it 'parses as a Repeat with no upper bound' do
213
+ matching(' expr 2.. ').as(:expression).
214
+ should result_in(Repeat[Apply[:expr], 2, nil]).at(9)
215
+ end
216
+ end
217
+ end
218
+ end
219
+
220
+ context 'given a zero-or-more list expression' do
221
+ it 'parses as a ListParser with zero-or-more bounds' do
222
+ matching(' expr *, ";" ').as(:expression).
223
+ should result_in(ListParser[Apply[:expr], Match[/;/], 0, nil]).at(12)
224
+ end
225
+ end
226
+
227
+ context 'given a one-or-more list expression' do
228
+ it 'parses as a ListParser with one-or-more bounds' do
229
+ matching(' expr +, ";" ').as(:expression).
230
+ should result_in(ListParser[Apply[:expr], Match[/;/], 1, nil]).at(12)
231
+ end
232
+ end
233
+
234
+ context 'given a generalized list expression' do
235
+ context 'with a single count' do
236
+ it 'parses as a ListParser with the count as both lower and upper bounds' do
237
+ matching(' expr 2, ";" ').as(:expression).
238
+ should result_in(ListParser[Apply[:expr], Match[/;/], 2, 2]).at(12)
239
+ end
240
+ end
241
+
242
+ context 'with a range' do
243
+ it 'parses as a ListParser with lower and upper bounds' do
244
+ matching(' expr 2..4, ";" ').as(:expression).
245
+ should result_in(ListParser[Apply[:expr], Match[/;/], 2, 4]).at(15)
246
+ end
247
+
248
+ context 'with no upper bound' do
249
+ it 'parses as a Repeat with no upper bound' do
250
+ matching(' expr 2.., ";" ').as(:expression).
251
+ should result_in(ListParser[Apply[:expr], Match[/;/], 2, nil]).at(14)
252
+ end
253
+ end
254
+ end
255
+ end
256
+
170
257
  context 'given a dispatch-action-attributed expression' do
171
258
 
172
259
  context 'given an action with a class name' do
@@ -216,7 +303,7 @@ describe Rattler::Grammar::GrammarParser do
216
303
  end
217
304
  end
218
305
 
219
- context 'given just a literal' do
306
+ context 'given an action with just a literal' do
220
307
  it 'parses as a default node with the literal as the name' do
221
308
  matching(' expr <"expression"> ').as(:expression).
222
309
  should result_in(DispatchAction[Apply[:expr],
@@ -228,13 +315,71 @@ describe Rattler::Grammar::GrammarParser do
228
315
  end
229
316
  end
230
317
 
231
- context 'given direct-action-attributed expression' do
318
+ context 'given a lone dispatch action' do
319
+ it 'parses as a DispatchAction on ESymbol[]' do
320
+ matching(' <Foo> ').as(:expression).
321
+ should result_in(DispatchAction[ESymbol[],
322
+ {:target => 'Foo', :method => 'parsed'}]).
323
+ at(6)
324
+ end
325
+ end
326
+
327
+ context 'given a direct-action-attributed expression' do
232
328
  it 'parses as a DirectAction' do
233
329
  matching(' digits {|_| _.to_i} ').as(:expression).
234
330
  should result_in(DirectAction[Apply[:digits], '|_| _.to_i']).at(20)
235
331
  end
236
332
  end
237
333
 
334
+ context 'given a lone direct action' do
335
+ it 'parses as a DirectAction on ESymbol[]' do
336
+ matching(' { :foo } ').as(:expression).
337
+ should result_in(DirectAction[ESymbol[], ':foo']).at(9)
338
+ end
339
+ end
340
+
341
+ context 'given a side-effect-attributed expression' do
342
+ it 'parses as a SideEffect' do
343
+ matching(' digits ~{|_| @i = _.to_i} ').as(:expression).
344
+ should result_in(SideEffect[Apply[:digits], '|_| @i = _.to_i']).at(26)
345
+ end
346
+ end
347
+
348
+ context 'given a lone side effect' do
349
+ it 'parses as a SideEffect on ESymbol[]' do
350
+ matching(' ~{ @i = :foo } ').as(:expression).
351
+ should result_in(SideEffect[ESymbol[], '@i = :foo']).at(15)
352
+ end
353
+ end
354
+
355
+ context 'given a positive semantic-predicate-attributed expression' do
356
+ it 'parses as a SemanticAssert' do
357
+ matching(' digits &{|_| _.to_i} ').as(:expression).
358
+ should result_in(SemanticAssert[Apply[:digits], '|_| _.to_i']).at(21)
359
+ end
360
+ end
361
+
362
+ context 'given a lone positive semantic predicate' do
363
+ it 'parses as a SemanticAssert on ESymbol[]' do
364
+ matching(' &{ @foo } ').as(:expression).
365
+ should result_in(SemanticAssert[ESymbol[], '@foo']).at(10)
366
+ end
367
+ end
368
+
369
+ context 'given a negative semantic-predicate-attributed expression' do
370
+ it 'parses as a SemanticDisallow' do
371
+ matching(' digits !{|_| _.to_i} ').as(:expression).
372
+ should result_in(SemanticDisallow[Apply[:digits], '|_| _.to_i']).at(21)
373
+ end
374
+ end
375
+
376
+ context 'given a lone negative semantic predicate' do
377
+ it 'parses as a SemanticDisallow on ESymbol[]' do
378
+ matching(' !{ @foo } ').as(:expression).
379
+ should result_in(SemanticDisallow[ESymbol[], '@foo']).at(10)
380
+ end
381
+ end
382
+
238
383
  context 'given a sequence expression' do
239
384
  it 'parses as a Sequence' do
240
385
  matching(' name "=" value ').as(:expression).
@@ -253,17 +398,163 @@ describe Rattler::Grammar::GrammarParser do
253
398
  end
254
399
  end
255
400
 
256
- it 'parses attributed sequence expressions' do
257
- matching(' name "=" value <Assign>').as(:expression).
258
- should result_in(DispatchAction[
259
- Sequence[Apply[:name], Match[%r{=}], Apply[:value]],
260
- {:target => 'Assign', :method => 'parsed'}]).
261
- at(24)
401
+ context 'given a dispatch-attributed sequence expression' do
402
+ it 'parses as a DispatchAction with a nested Sequence' do
403
+ matching(' name "=" value <Assign>').as(:expression).
404
+ should result_in(DispatchAction[
405
+ Sequence[Apply[:name], Match[%r{=}], Apply[:value]],
406
+ {:target => 'Assign', :method => 'parsed'}
407
+ ]).at(24)
408
+ end
409
+ end
410
+
411
+ context 'given a multiple-dispatch-attributed expression' do
412
+ it 'parses as nested DispatchActions' do
413
+ matching(' digits <Int> <Foo> ').as(:expression).
414
+ should result_in(DispatchAction[
415
+ DispatchAction[Apply[:digits], {:target => 'Int', :method => 'parsed'}],
416
+ {:target => 'Foo', :method => 'parsed'}
417
+ ]).at(19)
418
+ end
419
+ end
420
+
421
+ context 'given consecutive dispatch-attributed expressions' do
422
+ it 'parses as nested DispatchActions' do
423
+ matching(' digits <Int> foo <Foo> ').as(:expression).
424
+ should result_in(DispatchAction[
425
+ Sequence[
426
+ DispatchAction[Apply[:digits], {:target => 'Int', :method => 'parsed'}],
427
+ Apply[:foo]
428
+ ],
429
+ {:target => 'Foo', :method => 'parsed'}
430
+ ]).at(23)
431
+ end
432
+ end
433
+
434
+ context 'given a direct-attributed sequence expression' do
435
+ it 'parses as a DirectAction with a nested Sequence' do
436
+ matching(' name "=" value {|_| _.size }').as(:expression).
437
+ should result_in(DirectAction[
438
+ Sequence[Apply[:name], Match[%r{=}], Apply[:value]],
439
+ '|_| _.size'
440
+ ]).at(29)
441
+ end
442
+ end
443
+
444
+ context 'given a multiple-direct-attirbuted expression' do
445
+ it 'parses as nested DirectActions' do
446
+ matching(' digits {|_| _.to_i } {|_| _ * 2 } ').as(:expression).
447
+ should result_in(DirectAction[
448
+ DirectAction[Apply[:digits], '|_| _.to_i'],
449
+ '|_| _ * 2'
450
+ ]).at(34)
451
+ end
452
+ end
453
+
454
+ context 'given consecutive direct-attributed expressions' do
455
+ it 'parses as nested DirectActions' do
456
+ matching(' digits {|_| _.to_i } foo {|_| _ * 2 } ').as(:expression).
457
+ should result_in(DirectAction[
458
+ Sequence[
459
+ DirectAction[Apply[:digits], '|_| _.to_i'],
460
+ Apply[:foo]
461
+ ],
462
+ '|_| _ * 2'
463
+ ]).at(38)
464
+ end
465
+ end
466
+
467
+ context 'given a side-effect-attributed sequence expression' do
468
+ it 'parses as a SideEffect with a nested Sequence' do
469
+ matching(' name "=" value ~{|_| @n = _.size }').as(:expression).
470
+ should result_in(SideEffect[
471
+ Sequence[Apply[:name], Match[%r{=}], Apply[:value]],
472
+ '|_| @n = _.size'
473
+ ]).at(35)
474
+ end
475
+ end
476
+
477
+ context 'given a multiple-effect-attirbuted expression' do
478
+ it 'parses as nested SideEffects' do
479
+ matching(' digits ~{|_| @i = _.to_i } ~{|_| @j = _ * 2 } ').as(:expression).
480
+ should result_in(SideEffect[
481
+ SideEffect[Apply[:digits], '|_| @i = _.to_i'],
482
+ '|_| @j = _ * 2'
483
+ ]).at(46)
484
+ end
485
+ end
486
+
487
+ context 'given consecutive side-effect-attributed expressions' do
488
+ it 'parses as nested SideEffects' do
489
+ matching(' digits ~{|_| @i = _.to_i } foo ~{|_| @j = _ * 2 } ').as(:expression).
490
+ should result_in(SideEffect[
491
+ Sequence[
492
+ SideEffect[Apply[:digits], '|_| @i = _.to_i'],
493
+ Apply[:foo]
494
+ ],
495
+ '|_| @j = _ * 2'
496
+ ]).at(50)
497
+ end
498
+ end
499
+
500
+ context 'given a positive predicate-attributed sequence expression' do
501
+ it 'parses as a SemanticAssert with a nested Sequence' do
502
+ matching(' digits digits &{|a, b| a.to_i > b.to_i } ').as(:expression).
503
+ should result_in(SemanticAssert[
504
+ Sequence[Apply[:digits], Apply[:digits]],
505
+ '|a, b| a.to_i > b.to_i'
506
+ ]).at(41)
507
+ end
262
508
  end
263
509
 
264
- it 'parses ordered choice expressions' do
265
- matching(' string / number ').as(:expression).
266
- should result_in(Choice[Apply[:string], Apply[:number]]).at(16)
510
+ context 'given a multiple-predicate-attirbuted expression' do
511
+ it 'parses as nested SemanticAsserts' do
512
+ matching(' digits &{|_| _.to_i > 1 } &{|_| _.to_i < 7 } ').as(:expression).
513
+ should result_in(SemanticAssert[
514
+ SemanticAssert[Apply[:digits], '|_| _.to_i > 1'],
515
+ '|_| _.to_i < 7'
516
+ ]).at(45)
517
+ end
518
+ end
519
+
520
+ context 'given consecutive predicate-attributed expressions' do
521
+ it 'parses as nested SemanticAsserts' do
522
+ matching(' digits &{|_| _.to_i > 1 } foo &{|_| _.empty? } ').as(:expression).
523
+ should result_in(SemanticAssert[
524
+ Sequence[
525
+ SemanticAssert[Apply[:digits], '|_| _.to_i > 1'],
526
+ Apply[:foo]
527
+ ],
528
+ '|_| _.empty?'
529
+ ]).at(47)
530
+ end
531
+ end
532
+
533
+ context 'given a negative predicate-attributed sequence expression' do
534
+ it 'parses as a SemanticAssert with a nested Sequence' do
535
+ matching(' digits digits !{|a, b| a.to_i > b.to_i } ').as(:expression).
536
+ should result_in(SemanticDisallow[
537
+ Sequence[Apply[:digits], Apply[:digits]],
538
+ '|a, b| a.to_i > b.to_i'
539
+ ]).at(41)
540
+ end
541
+ end
542
+
543
+ context 'given an ordered choice expression' do
544
+ it 'parses as a Choice' do
545
+ matching(' string / number ').as(:expression).
546
+ should result_in(Choice[Apply[:string], Apply[:number]]).at(16)
547
+ end
548
+ end
549
+
550
+ context 'given an ordered choice with sequences' do
551
+ it 'parses as a Choice of Sequences' do
552
+ matching(' foo bar / boo far ').as(:expression).
553
+ should result_in(Choice[
554
+ Sequence[Apply[:foo], Apply[:bar]],
555
+ Sequence[Apply[:boo], Apply[:far]]
556
+ ]).at(18)
557
+ end
267
558
  end
268
559
 
269
560
  it 'skips normal whitespace' do
@@ -290,18 +581,6 @@ describe Rattler::Grammar::GrammarParser do
290
581
  end
291
582
 
292
583
  describe '#match(:term)' do
293
- it 'recognizes optional terms' do
294
- matching(' expr? ').as(:term).should result_in(Optional[Apply[:expr]]).at(6)
295
- end
296
-
297
- it 'recognizes zero-or-more terms' do
298
- matching(' expr* ').as(:term).should result_in(ZeroOrMore[Apply[:expr]]).at(6)
299
- end
300
-
301
- it 'recognizes one-or-more terms' do
302
- matching(' expr+ ').as(:term).should result_in(OneOrMore[Apply[:expr]]).at(6)
303
- end
304
-
305
584
  it 'recognizes assert terms' do
306
585
  matching(' &expr ').as(:term).should result_in(Assert[Apply[:expr]]).at(6)
307
586
  end
@@ -29,4 +29,10 @@ describe Apply do
29
29
  end
30
30
  end
31
31
 
32
+ describe '#with_ws' do
33
+ it 'returns self' do
34
+ subject.with_ws(Match[/\s*/]).should == subject
35
+ end
36
+ end
37
+
32
38
  end
@@ -3,28 +3,39 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
3
3
  describe Assert do
4
4
  include CombinatorParserSpecHelper
5
5
 
6
- subject { Assert[Match[/\w+/]] }
7
-
6
+ subject { Assert[nested] }
7
+
8
+ let(:nested) { Match[/\w+/] }
9
+
8
10
  describe '#parse' do
9
-
11
+
10
12
  context 'when the parser matches' do
11
13
  it 'returns true without advancing' do
12
14
  parsing('abc123 ').should result_in(true).at(0)
13
15
  end
14
16
  end
15
-
17
+
16
18
  context 'when the parser fails' do
17
19
  it 'fails' do
18
20
  parsing(' ').should fail
19
21
  end
20
22
  end
21
-
23
+
22
24
  end
23
-
25
+
24
26
  describe '#capturing?' do
25
27
  it 'is false' do
26
28
  subject.should_not be_capturing
27
29
  end
28
30
  end
29
-
31
+
32
+ describe '#with_ws' do
33
+
34
+ let(:ws) { Match[/\s*/] }
35
+
36
+ it 'applies #with_ws to the nested parser' do
37
+ subject.with_ws(ws).should == Assert[Sequence[Skip[ws], nested]]
38
+ end
39
+ end
40
+
30
41
  end
@@ -35,4 +35,13 @@ describe Rattler::Parsers::BackReference do
35
35
  end
36
36
  end
37
37
 
38
+ describe '#with_ws' do
39
+
40
+ let(:ws) { Match[/\s*/] }
41
+
42
+ it 'returns a parser that skips whitespace before matching' do
43
+ subject.with_ws(ws).should == Sequence[Skip[ws], subject]
44
+ end
45
+ end
46
+
38
47
  end
@@ -2,29 +2,31 @@ require File.expand_path(File.dirname(__FILE__) + '/../../spec_helper')
2
2
 
3
3
  describe Choice do
4
4
  include CombinatorParserSpecHelper
5
-
5
+
6
+ subject { Choice[*nested] }
7
+
6
8
  describe '#parse' do
7
-
8
- subject { Choice[Match[/[[:alpha:]]+/], Match[/[[:digit:]]+/]] }
9
-
9
+
10
+ let(:nested) { [Match[/[[:alpha:]]+/], Match[/[[:digit:]]+/]] }
11
+
10
12
  context 'when any of the parsers match' do
11
13
  it 'matches the same as the first parser that matches' do
12
14
  parsing('abc123').should result_in('abc').at(3)
13
15
  parsing('123abc').should result_in('123').at(3)
14
16
  end
15
17
  end
16
-
18
+
17
19
  context 'when none of the parsers match' do
18
20
  it 'fails' do
19
21
  parsing('==').should fail
20
22
  end
21
23
  end
22
-
24
+
23
25
  context 'with no capturing parsers' do
24
- subject do
25
- Choice[Skip[Match[/[[:alpha:]]+/]], Skip[Match[/[[:digit:]]+/]]]
26
+ let :nested do
27
+ [Skip[Match[/[[:alpha:]]+/]], Skip[Match[/[[:digit:]]+/]]]
26
28
  end
27
-
29
+
28
30
  context 'when any of the parsers match' do
29
31
  it 'returns true' do
30
32
  parsing('abc123').should result_in(true).at(3)
@@ -32,29 +34,42 @@ describe Choice do
32
34
  end
33
35
  end
34
36
  end
35
-
37
+
36
38
  end
37
-
39
+
38
40
  describe '#capturing?' do
39
-
41
+
40
42
  context 'with any capturing parsers' do
41
- subject do
42
- Choice[Skip[Match[/[[:space:]]*/]], Match[/[[:alpha:]]+/]]
43
- end
43
+
44
+ let(:nested) { [Skip[Match[/[[:space:]]*/]], Match[/[[:alpha:]]+/]] }
45
+
44
46
  it 'is true' do
45
47
  subject.should be_capturing
46
48
  end
47
49
  end
48
-
50
+
49
51
  context 'with no capturing parsers' do
50
- subject do
51
- Choice[Skip[Match[/[[:alpha:]]+/]], Skip[Match[/[[:digit:]]+/]]]
52
- end
52
+
53
+ let(:nested) { [Skip[Match[/[[:alpha:]]+/]], Skip[Match[/[[:digit:]]+/]]] }
54
+
53
55
  it 'is false' do
54
56
  subject.should_not be_capturing
55
57
  end
56
58
  end
57
-
59
+
60
+ end
61
+
62
+ describe '#with_ws' do
63
+
64
+ let(:ws) { Match[/\s*/] }
65
+ let(:nested) { [Match[/[[:alpha:]]+/], Match[/[[:digit:]]+/]] }
66
+
67
+ it 'applies #with_ws to the nested parsers' do
68
+ subject.with_ws(ws).should == Choice[
69
+ Sequence[Skip[ws], nested[0]],
70
+ Sequence[Skip[ws], nested[1]]
71
+ ]
72
+ end
58
73
  end
59
-
74
+
60
75
  end