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
@@ -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)