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
@@ -22,18 +22,18 @@ module Rattler
22
22
  autoload :Match, 'rattler/parsers/match'
23
23
  autoload :Choice, 'rattler/parsers/choice'
24
24
  autoload :Sequence, 'rattler/parsers/sequence'
25
- autoload :Optional, 'rattler/parsers/optional'
26
- autoload :ZeroOrMore, 'rattler/parsers/zero_or_more'
27
- autoload :OneOrMore, 'rattler/parsers/one_or_more'
25
+ autoload :Repeat, 'rattler/parsers/repeat'
28
26
  autoload :ListParser, 'rattler/parsers/list_parser'
29
- autoload :List0, 'rattler/parsers/list0'
30
- autoload :List1, 'rattler/parsers/list1'
31
27
  autoload :Apply, 'rattler/parsers/apply'
32
28
  autoload :Assert, 'rattler/parsers/assert'
33
29
  autoload :Disallow, 'rattler/parsers/disallow'
34
30
  autoload :Eof, 'rattler/parsers/eof'
31
+ autoload :ESymbol, 'rattler/parsers/e_symbol'
35
32
  autoload :DispatchAction, 'rattler/parsers/dispatch_action'
36
33
  autoload :DirectAction, 'rattler/parsers/direct_action'
34
+ autoload :SemanticAssert, 'rattler/parsers/semantic_assert'
35
+ autoload :SemanticDisallow, 'rattler/parsers/semantic_disallow'
36
+ autoload :SideEffect, 'rattler/parsers/side_effect'
37
37
  autoload :Token, 'rattler/parsers/token'
38
38
  autoload :Skip, 'rattler/parsers/skip'
39
39
  autoload :Label, 'rattler/parsers/label'
@@ -41,9 +41,13 @@ module Rattler
41
41
  autoload :Fail, 'rattler/parsers/fail'
42
42
  autoload :ParserDSL, 'rattler/parsers/parser_dsl'
43
43
  autoload :Predicate, 'rattler/parsers/predicate'
44
+ autoload :Atomic, 'rattler/parsers/atomic'
44
45
  autoload :Combining, 'rattler/parsers/combining'
45
46
  autoload :MatchJoining, 'rattler/parsers/match_joining'
46
47
  autoload :ActionCode, 'rattler/parsers/action_code'
48
+ autoload :EffectCode, 'rattler/parsers/effect_code'
49
+ autoload :AssertCode, 'rattler/parsers/assert_code'
50
+ autoload :DisallowCode, 'rattler/parsers/disallow_code'
47
51
  autoload :NodeCode, 'rattler/parsers/node_code'
48
52
 
49
53
  class <<self
@@ -0,0 +1,31 @@
1
+ #
2
+ # = rattler/parsers/assert_code.rb
3
+ #
4
+ # Author:: Jason Arhart
5
+ # Documentation:: Author
6
+ #
7
+
8
+ require 'rattler/parsers'
9
+
10
+ module Rattler::Parsers
11
+ # @private
12
+ class AssertCode < ActionCode #:nodoc:
13
+
14
+ def bind(scope, bind_args)
15
+ "(#{super}) && #{result_code bind_args}"
16
+ end
17
+
18
+ private
19
+
20
+ def result_code(bind_args)
21
+ if bind_args.size > 1
22
+ '[' + bind_args.join(', ') + ']'
23
+ elsif bind_args.size == 1
24
+ bind_args.first
25
+ else
26
+ 'true'
27
+ end
28
+ end
29
+
30
+ end
31
+ end
@@ -0,0 +1,19 @@
1
+ #
2
+ # = rattler/parsers/atomic.rb
3
+ #
4
+ # Author:: Jason Arhart
5
+ # Documentation:: Author
6
+ #
7
+
8
+ module Rattler::Parsers
9
+ # @private
10
+ module Atomic #:nodoc:
11
+
12
+ # @param (see Parser#with_ws)
13
+ # @return (see Parser#with_ws)
14
+ def with_ws(ws)
15
+ ws.skip & self
16
+ end
17
+
18
+ end
19
+ end
@@ -18,12 +18,14 @@ module Rattler::Parsers
18
18
  include Combining
19
19
 
20
20
  def self.[](child, code)
21
- self.new(child, :code => code)
21
+ self.new(child, :code => code.strip)
22
22
  end
23
23
 
24
24
  # @private
25
25
  def self.parsed(results, *_) #:nodoc:
26
- self[*results]
26
+ optional_expr, code = results
27
+ expr = optional_expr.first || ESymbol[]
28
+ self[expr, code]
27
29
  end
28
30
 
29
31
  # If the wrapped parser matches at the parse position, return the result
@@ -35,7 +37,7 @@ module Rattler::Parsers
35
37
  # the parse failed.
36
38
  def parse(scanner, rules, scope = {})
37
39
  if result = parse_child(child, scanner, rules, scope) {|_| scope = _ }
38
- if not capturing?
40
+ if not child.capturing?
39
41
  apply([])
40
42
  elsif result.respond_to?(:to_ary)
41
43
  apply(result, scope)
@@ -46,13 +48,19 @@ module Rattler::Parsers
46
48
  end
47
49
 
48
50
  def bindable_code
49
- @bindable_code ||= ActionCode.new(code)
51
+ @bindable_code ||= create_bindable_code
50
52
  end
51
53
 
52
54
  def bind(scope, bind_args)
53
55
  bindable_code.bind(scope, bind_args)
54
56
  end
55
57
 
58
+ protected
59
+
60
+ def create_bindable_code
61
+ ActionCode.new(code)
62
+ end
63
+
56
64
  private
57
65
 
58
66
  def parse_child(child, scanner, rules, scope)
@@ -0,0 +1,31 @@
1
+ #
2
+ # = rattler/parsers/disallow_code.rb
3
+ #
4
+ # Author:: Jason Arhart
5
+ # Documentation:: Author
6
+ #
7
+
8
+ require 'rattler/parsers'
9
+
10
+ module Rattler::Parsers
11
+ # @private
12
+ class DisallowCode < ActionCode #:nodoc:
13
+
14
+ def bind(scope, bind_args)
15
+ "!(#{super}) && #{result_code bind_args}"
16
+ end
17
+
18
+ private
19
+
20
+ def result_code(bind_args)
21
+ if bind_args.size > 1
22
+ '[' + bind_args.join(', ') + ']'
23
+ elsif bind_args.size == 1
24
+ bind_args.first
25
+ else
26
+ 'true'
27
+ end
28
+ end
29
+
30
+ end
31
+ end
@@ -25,8 +25,9 @@ module Rattler::Parsers
25
25
 
26
26
  # @private
27
27
  def self.parsed(results, *_) #:nodoc:
28
- attributed, optional_attribute, optional_name = results
29
- a = self[attributed, optional_attribute.first || @@node_defaults[:target]]
28
+ optional_expr, optional_attribute, optional_name = results
29
+ expr = optional_expr.first || ESymbol[]
30
+ a = self[expr, optional_attribute.first || @@node_defaults[:target]]
30
31
  unless optional_name.empty?
31
32
  a.with_attrs(:target_attrs => {:name => eval(optional_name.first, TOPLEVEL_BINDING)})
32
33
  else
@@ -0,0 +1,47 @@
1
+ #
2
+ # = rattler/parsers/e_symbol.rb
3
+ #
4
+ # Author:: Jason Arhart
5
+ # Documentation:: Author
6
+ #
7
+
8
+ require 'rattler/parsers'
9
+ require 'singleton'
10
+
11
+ module Rattler::Parsers
12
+ #
13
+ # +ESymbol+ always succeeds without advancing.
14
+ #
15
+ # @author Jason Arhart
16
+ #
17
+ class ESymbol < Parser
18
+ include Atomic
19
+ include Singleton
20
+
21
+ # Return the singleton instance of +ESymbol+
22
+ #
23
+ # @return [ESymbol] the singleton instance
24
+ def self.[]()
25
+ self.instance
26
+ end
27
+
28
+ # @private
29
+ def self.parsed(*_) #:nodoc:
30
+ self.instance
31
+ end
32
+
33
+ # Return +true+ without advancing
34
+ #
35
+ # @param (see Parser#parse)
36
+ #
37
+ # @return true
38
+ def parse(scanner, rules, scope = {})
39
+ true
40
+ end
41
+
42
+ def capturing?
43
+ false
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,31 @@
1
+ #
2
+ # = rattler/parsers/effect_code.rb
3
+ #
4
+ # Author:: Jason Arhart
5
+ # Documentation:: Author
6
+ #
7
+
8
+ require 'rattler/parsers'
9
+
10
+ module Rattler::Parsers
11
+ # @private
12
+ class EffectCode < ActionCode #:nodoc:
13
+
14
+ def bind(scope, bind_args)
15
+ "#{super}; #{result_code bind_args}"
16
+ end
17
+
18
+ private
19
+
20
+ def result_code(bind_args)
21
+ if bind_args.size > 1
22
+ '[' + bind_args.join(', ') + ']'
23
+ elsif bind_args.size == 1
24
+ bind_args.first
25
+ else
26
+ 'true'
27
+ end
28
+ end
29
+
30
+ end
31
+ end
@@ -15,36 +15,29 @@ module Rattler::Parsers
15
15
  # @author Jason Arhart
16
16
  #
17
17
  class Eof < Predicate
18
+ include Atomic
18
19
  include Singleton
19
-
20
+
20
21
  # Return the singleton instance of +Eof+
21
22
  #
22
23
  # @return [Eof] the singleton instance
23
24
  def self.[]()
24
25
  self.instance
25
26
  end
26
-
27
+
27
28
  # @private
28
29
  def self.parsed(*_) #:nodoc:
29
30
  self.instance
30
31
  end
31
-
32
+
32
33
  # Return +true+ if there is no more input to parse
33
34
  #
34
35
  # @param (see Parser#parse_labeled)
35
36
  #
36
37
  # @return true if there is no more input to parse
37
- def parse(scanner, rules, labeled = {})
38
+ def parse(scanner, rules, scope = {})
38
39
  scanner.eos?
39
40
  end
40
-
41
- # Return a new parser that uses +ws+ to skip whitespace before matching.
42
- #
43
- # @param (see Parser#with_ws)
44
- # @return (see Parser#with_ws)
45
- def with_ws(ws)
46
- Skip[ws] & self
47
- end
48
-
41
+
49
42
  end
50
43
  end
@@ -1,5 +1,5 @@
1
1
  #
2
- # = rattler/parsers/list.rb
2
+ # = rattler/parsers/list_parser.rb
3
3
  #
4
4
  # Author:: Jason Arhart
5
5
  # Documentation:: Author
@@ -10,7 +10,9 @@ require 'rattler/parsers'
10
10
  module Rattler::Parsers
11
11
  #
12
12
  # +ListParser+ matches terms matched by a term parser in a list with
13
- # separators matched by a separator parser.
13
+ # separators matched by a separator parser. +ListParser+ fails unless at
14
+ # least <tt>#lower_bound</tt> terms are matched and stops matching at
15
+ # <tt>#upper_bound</tt>.
14
16
  #
15
17
  # @author Jason Arhart
16
18
  #
@@ -19,13 +21,13 @@ module Rattler::Parsers
19
21
 
20
22
  # @private
21
23
  def self.parsed(results, *_) #:nodoc:
22
- self[*results]
24
+ term_parser, bounds, sep_parser = results
25
+ self[term_parser, sep_parser, *bounds]
23
26
  end
24
27
 
25
- # Create a new list parser that matches terms with +term_parser+ and
26
- # separators with +sep_parser+
27
- def self.[](term_parser, sep_parser)
28
- self.new(term_parser, sep_parser.skip)
28
+ def self.[](term_parser, sep_parser, lower_bound, upper_bound)
29
+ self.new(term_parser, sep_parser.skip,
30
+ :lower_bound => lower_bound, :upper_bound => upper_bound)
29
31
  end
30
32
 
31
33
  def term_parser
@@ -38,22 +40,39 @@ module Rattler::Parsers
38
40
 
39
41
  # Parse terms matched by the term parser in a list with separators matched
40
42
  # by the separator parser. Return the terms in an array, or +true+ if the
41
- # term parser is not <tt>capturing?</tt>.
43
+ # term parser is not <tt>capturing?</tt>. Fails returning false unless at
44
+ # least <tt>#lower_bound</tt> terms are matched and stops matching at
45
+ # <tt>#upper_bound</tt>.
42
46
  #
43
47
  # @param (see Parser#parse_labeled)
44
48
  #
45
- # @return [Array, true] an array containing the term parser's parse results,
46
- # or +true+ if the term parser is not <tt>capturing?</tt>
49
+ # @return [Array, Boolean] an array containing the term parser's parse
50
+ # results, or +true+ if the term parser is not <tt>capturing?</tt> or
51
+ # +false+ if the parse fails.
47
52
  def parse(scanner, rules, scope = {})
48
53
  a = []
49
- p = scanner.pos
50
- while result = term_parser.parse(scanner, rules, scope)
54
+ p = start_pos = scanner.pos
55
+ while result = term_parser.parse(scanner, rules, scope) and
56
+ (!upper_bound or a.size < upper_bound)
51
57
  p = scanner.pos
52
58
  a << result
53
59
  break unless sep_parser.parse(scanner, rules, scope)
54
60
  end
55
- scanner.pos = p
56
- (capturing? ? a : true) if enough? a
61
+ if a.size >= lower_bound
62
+ scanner.pos = p
63
+ capturing? ? a : true
64
+ else
65
+ scanner.pos = start_pos
66
+ false
67
+ end
68
+ end
69
+
70
+ def lower_bound?
71
+ lower_bound > 0
72
+ end
73
+
74
+ def upper_bound?
75
+ not upper_bound.nil?
57
76
  end
58
77
 
59
78
  def variable_capture_count?
@@ -16,6 +16,7 @@ module Rattler::Parsers
16
16
  # @author Jason Arhart
17
17
  #
18
18
  class Match < Parser
19
+ include Atomic
19
20
 
20
21
  # Create a new parser that matches with +re+.
21
22
  #
@@ -42,11 +43,5 @@ module Rattler::Parsers
42
43
  scanner.scan re
43
44
  end
44
45
 
45
- # @param (see Parser#with_ws)
46
- # @return (see Parser#with_ws)
47
- def with_ws(ws)
48
- ws.skip & self
49
- end
50
-
51
46
  end
52
47
  end
@@ -66,7 +66,7 @@ module Rattler
66
66
  end
67
67
 
68
68
  # Create a new parser to match a pattern, literal, referenced parse rule,
69
- # posix character class, or EOF.
69
+ # posix character class, EOF, or E.
70
70
  #
71
71
  # @overload match(pattern)
72
72
  # @param [Regexp] pattern the pattern to match
@@ -88,10 +88,15 @@ module Rattler
88
88
  # @param :EOF
89
89
  # @return [Eof] the {Eof} singleton
90
90
  #
91
+ # @overload match(:E)
92
+ # @param :E
93
+ # @return [ESymbol] the {ESymbol} singleton
94
+ #
91
95
  def match(arg)
92
96
  case arg
93
97
  when Regexp then Match[arg]
94
98
  when :EOF then eof
99
+ when :E then e
95
100
  when :ALNUM then match /[[:alnum:]]/
96
101
  when :ALPHA then match /[[:alpha:]]/
97
102
  when :BLANK then match /[[:blank:]]/
@@ -113,25 +118,25 @@ module Rattler
113
118
  # Create a new optional parser.
114
119
  #
115
120
  # @overload optional(parser)
116
- # @return [Optional] a new optional parser
121
+ # @return [Repeat] a new optional parser
117
122
  # @overload optional(arg)
118
- # @return [Optional] a new optional parser using arg to define a match
123
+ # @return [Repeat] a new optional parser using arg to define a match
119
124
  # parser
120
125
  # @see #match
121
126
  def optional(arg)
122
- Optional[to_parser(arg)]
127
+ Repeat[to_parser(arg), 0, 1]
123
128
  end
124
129
 
125
130
  # Create a new zero-or-more parser.
126
131
  #
127
132
  # @overload zero_or_more(parser)
128
- # @return [ZeroOrMore] a new zero-or-more parser
133
+ # @return [Repeat] a new zero-or-more parser
129
134
  # @overload zero_or_more(arg)
130
- # @return [ZeroOrMore] a new zero-or-more parser using arg to define a
135
+ # @return [Repeat] a new zero-or-more parser using arg to define a
131
136
  # match parser
132
137
  # @see #match
133
138
  def zero_or_more(arg)
134
- ZeroOrMore[to_parser(arg)]
139
+ Repeat[to_parser(arg), 0, nil]
135
140
  end
136
141
 
137
142
  alias_method :any, :zero_or_more
@@ -139,39 +144,38 @@ module Rattler
139
144
  # Create a new one-or-more parser.
140
145
  #
141
146
  # @overload one_or_more(parser)
142
- # @return [OneOrMore] a new one-or-more parser
147
+ # @return [Repeat] a new one-or-more parser
143
148
  # @overload one_or_more(arg)
144
- # @return [OneOrMore] a new one-or-more parser using arg to define a
145
- # match parser
149
+ # @return [Repeat] a new one-or-more parser using arg to define a match
150
+ # parser
146
151
  # @see #match
147
152
  def one_or_more(arg)
148
- OneOrMore[to_parser(arg)]
153
+ Repeat[to_parser(arg), 1, nil]
149
154
  end
150
155
 
151
156
  alias_method :some, :one_or_more
152
157
 
153
- # Create a new list parser.
158
+ # Create a generalized repeat parser.
154
159
  #
155
- # @overload list(term_parser, sep_parser)
156
- # @return [List0] a new list parser
157
- # @overload list(term_arg, sep_arg)
158
- # @return [List0] a new list parser using args to define a match parsers
160
+ # @overload one_or_more(parser, min, max)
161
+ # @return [Repeat] a new repeat parser with the given bounds
162
+ # @overload one_or_more(arg, min, max)
163
+ # @return [Repeat] a new repeat parser using arg to define a match
164
+ # parser
159
165
  # @see #match
160
- def list0(term_arg, sep_arg)
161
- List0[to_parser(term_arg), to_parser(sep_arg)]
166
+ def repeat(arg, min, max)
167
+ Repeat[to_parser(arg), min, max]
162
168
  end
163
169
 
164
- alias_method :list, :list0
165
-
166
- # Create a new list1 parser.
170
+ # Create a new list parser.
167
171
  #
168
- # @overload list(term_parser, sep_parser)
169
- # @return [List1] a new list1 parser
170
- # @overload list(term_arg, sep_arg)
171
- # @return [List1] a new list1 parser using args to define match parsers
172
+ # @overload list(term_parser, sep_parser, min, max)
173
+ # @return [ListParser] a new list parser
174
+ # @overload list(term_arg, sep_arg, min, max)
175
+ # @return [ListParser] a new list parser using args to define a match parsers
172
176
  # @see #match
173
- def list1(term_arg, sep_arg)
174
- List1[to_parser(term_arg), to_parser(sep_arg)]
177
+ def list(term_arg, sep_arg, min, max)
178
+ ListParser[to_parser(term_arg), to_parser(sep_arg), min, max]
175
179
  end
176
180
 
177
181
  # Create a new assert parser.
@@ -203,32 +207,71 @@ module Rattler
203
207
  Eof[]
204
208
  end
205
209
 
206
- # Create a new symantic action that dispatches to a method.
210
+ # @return the "E" symbol parser
211
+ def e
212
+ ESymbol[]
213
+ end
214
+
215
+ # Create a new semantic action that dispatches to a method.
207
216
  #
208
217
  # @overload dispatch_action(parser)
209
- # @return [DispatchAction] a new symantic action
218
+ # @return [DispatchAction] a new semantic action
210
219
  # @overload dispatch_action(arg)
211
- # @return [DispatchAction] a new symantic action using arg to define a
220
+ # @return [DispatchAction] a new semantic action using arg to define a
212
221
  # match parser
213
222
  # @see #match
214
223
  def dispatch_action(arg, attrs={})
215
224
  DispatchAction[to_parser(arg), attrs]
216
225
  end
217
226
 
218
- # alias action dispatch_action
219
-
220
- # Create a new symantic action that evaluates ruby code.
227
+ # Create a new semantic action that evaluates ruby code.
221
228
  #
222
229
  # @overload direct_action(parser, code)
223
- # @return [DirectAction] a new symantic action
230
+ # @return [DirectAction] a new semantic action
224
231
  # @overload direct_action(arg, code)
225
- # @return [DirectAction] a new symantic action using arg to define a
232
+ # @return [DirectAction] a new semantic action using arg to define a
226
233
  # match parser
227
234
  # @see #match
228
235
  def direct_action(arg, code)
229
236
  DirectAction[to_parser(arg), code]
230
237
  end
231
238
 
239
+ # Create a new semantic action that evaluates ruby code for effect.
240
+ #
241
+ # @overload side_effect(parser, code)
242
+ # @return [SideEffect] a new semantic action
243
+ # @overload side_effect(arg, code)
244
+ # @return [SideEffect] a new semantic action using arg to define a
245
+ # match parser
246
+ # @see #match
247
+ def side_effect(arg, code)
248
+ SideEffect[to_parser(arg), code]
249
+ end
250
+
251
+ # Create a new positive semantic predicate.
252
+ #
253
+ # @overload semantic_assert(parser, code)
254
+ # @return [SemanticAssert] a new positive Semantic predicate
255
+ # @overload semantic_assert(arg, code)
256
+ # @return [SemanticAssert] a new positive Semantic predicate using arg
257
+ # to define a match parser
258
+ # @see #match
259
+ def semantic_assert(arg, code)
260
+ SemanticAssert[to_parser(arg), code]
261
+ end
262
+
263
+ # Create a new negative semantic predicate.
264
+ #
265
+ # @overload semantic_disallow(parser, code)
266
+ # @return [SemanticDisallow] a new negative Semantic predicate
267
+ # @overload semantic_disallow(arg, code)
268
+ # @return [SemanticDisallow] a new negative Semantic predicate using
269
+ # arg to define a match parser
270
+ # @see #match
271
+ def semantic_disallow(arg, code)
272
+ SemanticDisallow[to_parser(arg), code]
273
+ end
274
+
232
275
  # Create a new token parser or token rule.
233
276
  #
234
277
  # @overload token(rule_name, &block)