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
@@ -5,19 +5,19 @@ module Rattler::BackEnd::ParserGenerator
5
5
  module PredicatePropogating #:nodoc:
6
6
 
7
7
  def gen_assert(parser, scope={})
8
- generate parser.child, :assert, scope
8
+ propogate_gen parser.child, :assert, scope
9
9
  end
10
10
 
11
11
  def gen_disallow(parser, scope={})
12
- generate parser.child, :disallow, scope
12
+ propogate_gen parser.child, :disallow, scope
13
13
  end
14
14
 
15
15
  def gen_intermediate_assert(parser, scope={})
16
- generate parser.child, :intermediate_assert, scope
16
+ propogate_gen parser.child, :intermediate_assert, scope
17
17
  end
18
18
 
19
19
  def gen_intermediate_disallow(parser, scope={})
20
- generate parser.child, :intermediate_disallow, scope
20
+ propogate_gen parser.child, :intermediate_disallow, scope
21
21
  end
22
22
 
23
23
  end
@@ -0,0 +1,53 @@
1
+ require 'rattler/back_end/parser_generator'
2
+
3
+ module Rattler::BackEnd::ParserGenerator
4
+
5
+ # @private
6
+ class RepeatGenerator < DelegatingGenerator #:nodoc:
7
+ include NestedSubGenerating
8
+
9
+ protected
10
+
11
+ def impl(repeat, init_args)
12
+ generator = default_impl(repeat, init_args)
13
+ specialize_for repeat, generator
14
+ generator
15
+ end
16
+
17
+ def specialize_for(repeat, generator)
18
+ return unless repeat.respond_to? :lower_bound
19
+ if repeat.lower_bound == 0
20
+ if repeat.upper_bound == 1
21
+ generator.extend OptionalGenerating
22
+ else
23
+ generator.extend ZeroOrMoreGenerating
24
+ end
25
+ elsif repeat.lower_bound == 1
26
+ generator.extend OneOrMoreGenerating
27
+ end
28
+ end
29
+ end
30
+
31
+ # @private
32
+ class NestedRepeatGenerator < RepeatGenerator #:nodoc:
33
+ def default_impl(list, init_args)
34
+ GeneralRepeatGenerator.nested(*init_args)
35
+ end
36
+ end
37
+
38
+ def RepeatGenerator.nested(*args)
39
+ NestedRepeatGenerator.new(*args)
40
+ end
41
+
42
+ # @private
43
+ class TopLevelRepeatGenerator < RepeatGenerator #:nodoc:
44
+ def default_impl(list, init_args)
45
+ GeneralRepeatGenerator.top_level(*init_args)
46
+ end
47
+ end
48
+
49
+ def RepeatGenerator.top_level(*args)
50
+ TopLevelRepeatGenerator.new(*args)
51
+ end
52
+
53
+ end
@@ -5,11 +5,11 @@ module Rattler::BackEnd::ParserGenerator
5
5
  module SkipPropogating #:nodoc:
6
6
 
7
7
  def gen_skip(parser, scope={})
8
- generate parser.child, :skip, scope
8
+ propogate_gen parser.child, :skip, scope
9
9
  end
10
10
 
11
11
  def gen_intermediate_skip(parser, scope={})
12
- generate parser.child, :intermediate_skip, scope
12
+ propogate_gen parser.child, :intermediate_skip, scope
13
13
  end
14
14
 
15
15
  end
@@ -21,17 +21,18 @@ module Rattler::BackEnd::ParserGenerator
21
21
  gen_with generator(parser, :top_level), parser, as, *args
22
22
  end
23
23
 
24
- def gen_eof
25
- @g << '@scanner.eos?'
24
+ def propogate_gen(parser, type, scope)
25
+ if nested?
26
+ gen_nested parser, type, scope
27
+ else
28
+ gen_top_level parser, type, scope
29
+ end
26
30
  end
27
31
 
28
32
  private
29
33
 
30
34
  def gen_with(g, parser, as=:basic, *args)
31
- case parser
32
- when Eof then gen_eof
33
- else g.send(:"gen_#{as}", parser, *args)
34
- end
35
+ g.send(:"gen_#{as}", parser, *args)
35
36
  end
36
37
 
37
38
  def generator(parser, context=nil)
@@ -48,21 +49,12 @@ module Rattler::BackEnd::ParserGenerator
48
49
  when Sequence
49
50
  new_generator SequenceGenerator, context, :new_sequence_level => true
50
51
 
51
- when Optional
52
- cache_generator OptionalGenerator, context
53
-
54
- when ZeroOrMore
55
- cache_generator ZeroOrMoreGenerator, context, :new_repeat_level => true
52
+ when Repeat
53
+ cache_generator RepeatGenerator, context, :new_repeat_level => true
56
54
 
57
- when OneOrMore
58
- cache_generator OneOrMoreGenerator, context, :new_repeat_level => true
59
-
60
- when List0
55
+ when ListParser
61
56
  cache_generator ListGenerator, context, :new_repeat_level => true
62
57
 
63
- when List1
64
- cache_generator List1Generator, context, :new_repeat_level => true
65
-
66
58
  when Apply
67
59
  cache_generator ApplyGenerator, context
68
60
 
@@ -72,6 +64,12 @@ module Rattler::BackEnd::ParserGenerator
72
64
  when Disallow
73
65
  cache_generator DisallowGenerator, context
74
66
 
67
+ when Eof
68
+ cache_generator EofGenerator, context
69
+
70
+ when ESymbol
71
+ cache_generator ESymbolGenerator, context
72
+
75
73
  when DispatchAction
76
74
  cache_generator DispatchActionGenerator, context
77
75
 
@@ -4,7 +4,7 @@ module Rattler::BackEnd::ParserGenerator
4
4
  # @private
5
5
  module TokenPropogating #:nodoc:
6
6
  def gen_token(parser, scope={})
7
- generate parser.child, :token, scope
7
+ propogate_gen parser.child, :token, scope
8
8
  end
9
9
  end
10
10
  end
@@ -0,0 +1,31 @@
1
+ require 'rattler/back_end/parser_generator'
2
+
3
+ module Rattler::BackEnd::ParserGenerator
4
+ # @private
5
+ module ZeroOrMoreGenerating #:nodoc:
6
+
7
+ def gen_assert(zero_or_more, scope={})
8
+ @g << 'true'
9
+ end
10
+
11
+ def gen_disallow(zero_or_more, scope={})
12
+ @g << 'false'
13
+ end
14
+
15
+ def gen_skip(zero_or_more, scope={})
16
+ expr :block do
17
+ @g << 'while '
18
+ generate zero_or_more.child, :intermediate_skip, scope
19
+ (@g << '; end').newline
20
+ @g << 'true'
21
+ end
22
+ end
23
+
24
+ protected
25
+
26
+ def gen_result(zero_or_more, captures)
27
+ @g << captures
28
+ end
29
+
30
+ end
31
+ end
@@ -71,6 +71,26 @@ module Rattler::Grammar
71
71
  {:parser_name => name, :base_name => base.first}
72
72
  end
73
73
 
74
+ def list0(term_parser, sep_parser)
75
+ ListParser[term_parser, sep_parser, 0, nil]
76
+ end
77
+
78
+ def list1(term_parser, sep_parser)
79
+ ListParser[term_parser, sep_parser, 1, nil]
80
+ end
81
+
82
+ def optional(parser)
83
+ Repeat[parser, 0, 1]
84
+ end
85
+
86
+ def zero_or_more(parser)
87
+ Repeat[parser, 0, nil]
88
+ end
89
+
90
+ def one_or_more(parser)
91
+ Repeat[parser, 1, nil]
92
+ end
93
+
74
94
  def rule(name, parser)
75
95
  Rule[name, (@ws ? parser.with_ws(@ws) : parser), {:inline => @inline}]
76
96
  end
@@ -131,7 +131,7 @@ module Rattler
131
131
  begin
132
132
  @scanner.skip(/(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>EOF)(?![[:alnum:]_])))/) &&
133
133
  (r1_0 = begin
134
- @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:alnum:]_])+))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><\-))/) &&
134
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:alpha:]])(?>(?>[[:alnum:]_])*)))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><\-))/) &&
135
135
  @scanner[1]
136
136
  end) &&
137
137
  (r1_1 = match(:expression)) &&
@@ -212,7 +212,7 @@ module Rattler
212
212
  begin
213
213
  p0 = @scanner.pos
214
214
  begin
215
- (r0_0 = match(:attributed)) &&
215
+ (r0_0 = ((r = match(:attributed)) ? [r] : [])) &&
216
216
  @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><)/) &&
217
217
  (r0_1 = ((r = begin
218
218
  @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>[[:lower:]])(?>(?>[[:alnum:]_])*))|(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>(?>(?>[[:upper:]])(?>(?>[[:alnum:]_])*)(?>::))*)(?>[[:upper:]])(?>(?>[[:alnum:]_])*)))(?>(?>(?>\.)(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>[[:lower:]])(?>(?>[[:alnum:]_])*))))?))/) &&
@@ -283,7 +283,7 @@ module Rattler
283
283
  end
284
284
  end) ? [r] : [])) &&
285
285
  @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>>)/) &&
286
- DispatchAction.parsed(select_captures([r0_0, r0_1, r0_2]))
286
+ DispatchAction.parsed([r0_0, r0_1, r0_2])
287
287
  end || begin
288
288
  @scanner.pos = p0
289
289
  false
@@ -292,12 +292,75 @@ module Rattler
292
292
  begin
293
293
  p0 = @scanner.pos
294
294
  begin
295
- (r0_0 = match(:attributed)) &&
295
+ (r0_0 = ((r = match(:attributed)) ? [r] : [])) &&
296
296
  (r0_1 = begin
297
297
  @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?>\{)(?>(?>[^}])*)(?>\})|[^{}])*))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\}))/) &&
298
298
  @scanner[1]
299
299
  end) &&
300
- DirectAction.parsed(select_captures([r0_0, r0_1]))
300
+ DirectAction.parsed([r0_0, r0_1])
301
+ end || begin
302
+ @scanner.pos = p0
303
+ false
304
+ end
305
+ end ||
306
+ begin
307
+ p0 = @scanner.pos
308
+ begin
309
+ (r0_0 = ((r = match(:attributed)) ? [r] : [])) &&
310
+ (r0_1 = begin
311
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>~))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?>\{)(?>(?>[^}])*)(?>\})|[^{}])*))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\}))/) &&
312
+ @scanner[1]
313
+ end) &&
314
+ SideEffect.parsed([r0_0, r0_1])
315
+ end || begin
316
+ @scanner.pos = p0
317
+ false
318
+ end
319
+ end ||
320
+ begin
321
+ p0 = @scanner.pos
322
+ begin
323
+ (r0_0 = ((r = match(:attributed)) ? [r] : [])) &&
324
+ (r0_1 = begin
325
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>&))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?>\{)(?>(?>[^}])*)(?>\})|[^{}])*))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\}))/) &&
326
+ @scanner[1]
327
+ end) &&
328
+ SemanticAssert.parsed([r0_0, r0_1])
329
+ end || begin
330
+ @scanner.pos = p0
331
+ false
332
+ end
333
+ end ||
334
+ begin
335
+ p0 = @scanner.pos
336
+ begin
337
+ (r0_0 = ((r = match(:attributed)) ? [r] : [])) &&
338
+ (r0_1 = begin
339
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>!))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?>\{)(?>(?>[^}])*)(?>\})|[^{}])*))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\}))/) &&
340
+ @scanner[1]
341
+ end) &&
342
+ SemanticDisallow.parsed([r0_0, r0_1])
343
+ end || begin
344
+ @scanner.pos = p0
345
+ false
346
+ end
347
+ end ||
348
+ match(:attributed_terms)
349
+ end
350
+
351
+ # @private
352
+ def match_attributed_terms #:nodoc:
353
+ memoize_lr :match_attributed_terms!
354
+ end
355
+
356
+ # @private
357
+ def match_attributed_terms! #:nodoc:
358
+ begin
359
+ p0 = @scanner.pos
360
+ begin
361
+ (r0_0 = match(:attributed)) &&
362
+ (r0_1 = match(:term)) &&
363
+ Sequence.parsed(select_captures([r0_0, r0_1]))
301
364
  end || begin
302
365
  @scanner.pos = p0
303
366
  false
@@ -543,9 +606,9 @@ module Rattler
543
606
  p0 = @scanner.pos
544
607
  begin
545
608
  (r0_0 = match(:list_term)) &&
546
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\*,)/) &&
609
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\*))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>,))/) &&
547
610
  (r0_1 = match(:list_term)) &&
548
- List0.parsed(select_captures([r0_0, r0_1]))
611
+ (list0 r0_0, r0_1)
549
612
  end || begin
550
613
  @scanner.pos = p0
551
614
  false
@@ -555,9 +618,35 @@ module Rattler
555
618
  p0 = @scanner.pos
556
619
  begin
557
620
  (r0_0 = match(:list_term)) &&
558
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\+,)/) &&
621
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\+))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>,))/) &&
559
622
  (r0_1 = match(:list_term)) &&
560
- List1.parsed(select_captures([r0_0, r0_1]))
623
+ (list1 r0_0, r0_1)
624
+ end || begin
625
+ @scanner.pos = p0
626
+ false
627
+ end
628
+ end ||
629
+ begin
630
+ p0 = @scanner.pos
631
+ begin
632
+ (r0_0 = match(:list_term)) &&
633
+ (r0_1 = begin
634
+ begin
635
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:digit:]])+))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\.\.))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:digit:]])+))/) &&
636
+ ([@scanner[1], @scanner[2]].map {|s| s.to_i })
637
+ end ||
638
+ begin
639
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:digit:]])+))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\.\.))/) &&
640
+ ([@scanner[1].to_i, nil])
641
+ end ||
642
+ begin
643
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:digit:]])+)/) &&
644
+ ([@scanner[1].to_i] * 2)
645
+ end
646
+ end) &&
647
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>,)/) &&
648
+ (r0_2 = match(:list_term)) &&
649
+ ListParser.parsed(select_captures([r0_0, r0_1, r0_2]))
561
650
  end || begin
562
651
  @scanner.pos = p0
563
652
  false
@@ -653,7 +742,7 @@ module Rattler
653
742
  begin
654
743
  (r0_0 = match(:primary)) &&
655
744
  @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\?)/) &&
656
- Optional.parsed(select_captures([r0_0]))
745
+ (optional r0_0)
657
746
  end || begin
658
747
  @scanner.pos = p0
659
748
  false
@@ -664,7 +753,7 @@ module Rattler
664
753
  begin
665
754
  (r0_0 = match(:primary)) &&
666
755
  @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\*))(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>,))/) &&
667
- ZeroOrMore.parsed(select_captures([r0_0]))
756
+ (zero_or_more r0_0)
668
757
  end || begin
669
758
  @scanner.pos = p0
670
759
  false
@@ -675,7 +764,32 @@ module Rattler
675
764
  begin
676
765
  (r0_0 = match(:primary)) &&
677
766
  @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\+))(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>,))/) &&
678
- OneOrMore.parsed(select_captures([r0_0]))
767
+ (one_or_more r0_0)
768
+ end || begin
769
+ @scanner.pos = p0
770
+ false
771
+ end
772
+ end ||
773
+ begin
774
+ p0 = @scanner.pos
775
+ begin
776
+ (r0_0 = match(:primary)) &&
777
+ (r0_1 = begin
778
+ begin
779
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:digit:]])+))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\.\.))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:digit:]])+))/) &&
780
+ ([@scanner[1], @scanner[2]].map {|s| s.to_i })
781
+ end ||
782
+ begin
783
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:digit:]])+))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\.\.))/) &&
784
+ ([@scanner[1].to_i, nil])
785
+ end ||
786
+ begin
787
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:digit:]])+)/) &&
788
+ ([@scanner[1].to_i] * 2)
789
+ end
790
+ end) &&
791
+ @scanner.skip(/(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>,))/) &&
792
+ Repeat.parsed(select_captures([r0_0, r0_1]))
679
793
  end || begin
680
794
  @scanner.pos = p0
681
795
  false
@@ -706,6 +820,10 @@ module Rattler
706
820
  @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>EOF)(?![[:alnum:]_]))/) &&
707
821
  Eof.parsed([])
708
822
  end ||
823
+ begin
824
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>E)(?![[:alnum:]_]))/) &&
825
+ ESymbol.parsed([])
826
+ end ||
709
827
  begin
710
828
  (r = begin
711
829
  begin
@@ -772,7 +890,7 @@ module Rattler
772
890
  begin
773
891
  @scanner.skip(/(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>EOF)(?![[:alnum:]_])))/) &&
774
892
  (r0_0 = begin
775
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:alnum:]_])+)/) &&
893
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:alpha:]])(?>(?>[[:alnum:]_])*))/) &&
776
894
  @scanner[1]
777
895
  end) &&
778
896
  @scanner.skip(/(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><\-))/) &&
@@ -44,14 +44,20 @@ include Rattler::Parsers
44
44
  expression <- expression ~'/' attributed <Choice>
45
45
  / attributed
46
46
 
47
- attributed <- attributed ~'<' node_action? literal? ~'>' <DispatchAction>
48
- / attributed ~'{' action ~'}' <DirectAction>
49
- / terms
47
+ attributed <- attributed? ~'<' node_action? literal? ~'>' <DispatchAction>
48
+ / attributed? ~'{' action ~'}' <DirectAction>
49
+ / attributed? ~'~' ~'{' action ~'}' <SideEffect>
50
+ / attributed? ~'&' ~'{' action ~'}' <SemanticAssert>
51
+ / attributed? ~'!' ~'{' action ~'}' <SemanticDisallow>
52
+ / attributed_terms
50
53
 
51
54
  node_action <- @(name (~'.' var_name)?)
52
55
 
53
- action <- @( ('{' [^}]* '}'
54
- / [^{}])* )
56
+ action <- @(( '{' [^}]* '}'
57
+ / [^{}] )*)
58
+
59
+ attributed_terms <- attributed term <Sequence>
60
+ / terms
55
61
 
56
62
  terms <- terms term <Sequence>
57
63
  / term
@@ -68,8 +74,9 @@ include Rattler::Parsers
68
74
  labelable <- list
69
75
  / list_term
70
76
 
71
- list <- list_term ~'*,' list_term <List0>
72
- / list_term ~'+,' list_term <List1>
77
+ list <- list_term ~('*' ',') list_term { list0 *_ }
78
+ / list_term ~('+' ',') list_term { list1 *_ }
79
+ / list_term repeat_count ~',' list_term <ListParser>
73
80
 
74
81
  list_term <- prefixed
75
82
  / prefixable
@@ -82,14 +89,20 @@ include Rattler::Parsers
82
89
 
83
90
  prefixable <- suffixed / primary
84
91
 
85
- suffixed <- primary ~'?' <Optional>
86
- / primary ~'*' !',' <ZeroOrMore>
87
- / primary ~'+' !',' <OneOrMore>
92
+ suffixed <- primary ~'?' { optional _ }
93
+ / primary ~'*' !',' { zero_or_more _ }
94
+ / primary ~'+' !',' { one_or_more _ }
95
+ / primary repeat_count !',' <Repeat>
96
+
97
+ repeat_count <- @DIGIT+ ~'..' @DIGIT+ { _.map {|s| s.to_i } }
98
+ / @DIGIT+ ~'..' { [_.to_i, nil] }
99
+ / @DIGIT+ { [_.to_i] * 2 }
88
100
 
89
101
  primary <- ~'(' expression ~')'
90
102
  / atom
91
103
 
92
104
  atom <- ~`EOF` <Eof>
105
+ / ~`E` <ESymbol>
93
106
  / posix_class { posix_class _ }
94
107
  / identifier !'<-' <Apply>
95
108
  / literal { literal _ }
@@ -132,7 +145,7 @@ include Rattler::Parsers
132
145
  name <- var_name
133
146
  / constant
134
147
 
135
- identifier <- !`EOF` @WORD+
148
+ identifier <- !`EOF` @(ALPHA WORD*)
136
149
 
137
150
  back_reference <- @('$' LOWER WORD*)
138
151
 
@@ -165,6 +178,6 @@ include Rattler::Parsers
165
178
  / '\\' .
166
179
  / [^\\\]] )
167
180
 
168
- eol <- ~(BLANK* (EOF / ';' / ("\r"? "\n") / ('#' [^\n]*)))
181
+ eol <- ~(BLANK* (EOF / ';' / ("\r"? "\n") / comment))
169
182
 
170
183
  comment <- ~('#' [^\n]*)