rattler 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (182) hide show
  1. data/README.rdoc +57 -37
  2. data/features/command_line/dest_option.feature +8 -21
  3. data/features/command_line/lib_option.feature +37 -0
  4. data/features/command_line/parser_generator.feature +7 -4
  5. data/features/grammar/back_reference.feature +37 -0
  6. data/features/grammar/fail.feature +3 -3
  7. data/features/grammar/labels.feature +11 -3
  8. data/features/grammar/list_matching.feature +14 -5
  9. data/features/grammar/literal.feature +30 -4
  10. data/features/grammar/nonterminal.feature +1 -1
  11. data/features/grammar/ordered_choice.feature +2 -2
  12. data/features/grammar/skip_operator.feature +1 -1
  13. data/features/grammar/symantic_action.feature +7 -7
  14. data/features/grammar/whitespace.feature +2 -2
  15. data/features/step_definitions/grammar_steps.rb +2 -2
  16. data/lib/rattler/back_end.rb +1 -0
  17. data/lib/rattler/back_end/compiler.rb +19 -20
  18. data/lib/rattler/back_end/optimizer.rb +100 -0
  19. data/lib/rattler/back_end/optimizer/composite_reducing.rb +18 -0
  20. data/lib/rattler/back_end/optimizer/flatten_choice.rb +31 -0
  21. data/lib/rattler/back_end/optimizer/flatten_sequence.rb +59 -0
  22. data/lib/rattler/back_end/optimizer/flattening.rb +17 -0
  23. data/lib/rattler/back_end/optimizer/inline_regular_rules.rb +46 -0
  24. data/lib/rattler/back_end/optimizer/join_match_capturing_sequence.rb +71 -0
  25. data/lib/rattler/back_end/optimizer/join_match_choice.rb +37 -0
  26. data/lib/rattler/back_end/optimizer/join_match_matching_sequence.rb +38 -0
  27. data/lib/rattler/back_end/optimizer/join_match_sequence.rb +17 -0
  28. data/lib/rattler/back_end/optimizer/join_predicate_bare_match.rb +68 -0
  29. data/lib/rattler/back_end/optimizer/join_predicate_match.rb +17 -0
  30. data/lib/rattler/back_end/optimizer/join_predicate_nested_match.rb +37 -0
  31. data/lib/rattler/back_end/optimizer/join_predicate_or_bare_match.rb +68 -0
  32. data/lib/rattler/back_end/optimizer/join_predicate_or_match.rb +17 -0
  33. data/lib/rattler/back_end/optimizer/join_predicate_or_nested_match.rb +36 -0
  34. data/lib/rattler/back_end/optimizer/match_joining.rb +60 -0
  35. data/lib/rattler/back_end/optimizer/optimization.rb +94 -0
  36. data/lib/rattler/back_end/optimizer/optimization_context.rb +72 -0
  37. data/lib/rattler/back_end/optimizer/optimization_sequence.rb +37 -0
  38. data/lib/rattler/back_end/optimizer/optimize_children.rb +46 -0
  39. data/lib/rattler/back_end/optimizer/reduce_repeat_match.rb +44 -0
  40. data/lib/rattler/back_end/optimizer/remove_meaningless_wrapper.rb +32 -0
  41. data/lib/rattler/back_end/optimizer/simplify_redundant_repeat.rb +43 -0
  42. data/lib/rattler/back_end/optimizer/simplify_token_match.rb +38 -0
  43. data/lib/rattler/back_end/parser_generator.rb +21 -14
  44. data/lib/rattler/back_end/parser_generator/apply_generator.rb +35 -35
  45. data/lib/rattler/back_end/parser_generator/assert_generator.rb +29 -30
  46. data/lib/rattler/back_end/parser_generator/back_reference_generator.rb +93 -0
  47. data/lib/rattler/back_end/parser_generator/choice_generator.rb +33 -49
  48. data/lib/rattler/back_end/parser_generator/direct_action_generator.rb +14 -14
  49. data/lib/rattler/back_end/parser_generator/disallow_generator.rb +29 -30
  50. data/lib/rattler/back_end/parser_generator/dispatch_action_generator.rb +11 -13
  51. data/lib/rattler/back_end/parser_generator/expr_generator.rb +36 -56
  52. data/lib/rattler/back_end/parser_generator/fail_generator.rb +18 -18
  53. data/lib/rattler/back_end/parser_generator/group_match.rb +18 -0
  54. data/lib/rattler/back_end/parser_generator/group_match_generator.rb +76 -0
  55. data/lib/rattler/back_end/parser_generator/label_generator.rb +25 -6
  56. data/lib/rattler/back_end/parser_generator/list1_generator.rb +7 -7
  57. data/lib/rattler/back_end/parser_generator/list_generating.rb +19 -20
  58. data/lib/rattler/back_end/parser_generator/list_generator.rb +5 -5
  59. data/lib/rattler/back_end/parser_generator/match_generator.rb +52 -52
  60. data/lib/rattler/back_end/parser_generator/one_or_more_generator.rb +6 -6
  61. data/lib/rattler/back_end/parser_generator/optional_generator.rb +30 -29
  62. data/lib/rattler/back_end/parser_generator/predicate_propogating.rb +8 -8
  63. data/lib/rattler/back_end/parser_generator/repeat_generating.rb +23 -25
  64. data/lib/rattler/back_end/parser_generator/rule_generator.rb +27 -79
  65. data/lib/rattler/back_end/parser_generator/rule_set_generator.rb +102 -0
  66. data/lib/rattler/back_end/parser_generator/sequence_generator.rb +49 -41
  67. data/lib/rattler/back_end/parser_generator/skip_generator.rb +14 -20
  68. data/lib/rattler/back_end/parser_generator/skip_propogating.rb +4 -4
  69. data/lib/rattler/back_end/parser_generator/sub_generating.rb +6 -0
  70. data/lib/rattler/back_end/parser_generator/token_generator.rb +12 -12
  71. data/lib/rattler/back_end/parser_generator/token_propogating.rb +2 -2
  72. data/lib/rattler/back_end/parser_generator/zero_or_more_generator.rb +4 -4
  73. data/lib/rattler/grammar.rb +4 -3
  74. data/lib/rattler/grammar/analysis.rb +91 -0
  75. data/lib/rattler/grammar/grammar.rb +37 -25
  76. data/lib/rattler/grammar/grammar_parser.rb +19 -11
  77. data/lib/rattler/grammar/metagrammar.rb +569 -800
  78. data/lib/rattler/grammar/rattler.rtlr +162 -144
  79. data/lib/rattler/parsers.rb +5 -1
  80. data/lib/rattler/parsers/action_code.rb +29 -15
  81. data/lib/rattler/parsers/apply.rb +5 -5
  82. data/lib/rattler/parsers/assert.rb +4 -18
  83. data/lib/rattler/parsers/back_reference.rb +46 -0
  84. data/lib/rattler/parsers/choice.rb +6 -39
  85. data/lib/rattler/parsers/combinator_parser.rb +32 -0
  86. data/lib/rattler/parsers/combining.rb +3 -29
  87. data/lib/rattler/parsers/direct_action.rb +27 -30
  88. data/lib/rattler/parsers/disallow.rb +4 -18
  89. data/lib/rattler/parsers/dispatch_action.rb +30 -25
  90. data/lib/rattler/parsers/label.rb +9 -18
  91. data/lib/rattler/parsers/list.rb +3 -34
  92. data/lib/rattler/parsers/list1.rb +4 -36
  93. data/lib/rattler/parsers/list_parser.rb +64 -0
  94. data/lib/rattler/parsers/match.rb +7 -42
  95. data/lib/rattler/parsers/node_code.rb +44 -0
  96. data/lib/rattler/parsers/one_or_more.rb +7 -27
  97. data/lib/rattler/parsers/optional.rb +5 -25
  98. data/lib/rattler/parsers/parser.rb +16 -44
  99. data/lib/rattler/parsers/parser_dsl.rb +13 -3
  100. data/lib/rattler/parsers/predicate.rb +4 -12
  101. data/lib/rattler/parsers/rule.rb +18 -19
  102. data/lib/rattler/parsers/rule_set.rb +63 -0
  103. data/lib/rattler/parsers/sequence.rb +12 -46
  104. data/lib/rattler/parsers/skip.rb +12 -26
  105. data/lib/rattler/parsers/token.rb +6 -21
  106. data/lib/rattler/parsers/zero_or_more.rb +6 -26
  107. data/lib/rattler/runner.rb +66 -28
  108. data/lib/rattler/runtime/extended_packrat_parser.rb +26 -20
  109. data/lib/rattler/runtime/packrat_parser.rb +17 -21
  110. data/lib/rattler/runtime/parser.rb +12 -2
  111. data/lib/rattler/runtime/recursive_descent_parser.rb +3 -11
  112. data/lib/rattler/util.rb +2 -1
  113. data/lib/rattler/util/graphviz.rb +29 -0
  114. data/lib/rattler/util/graphviz/digraph_builder.rb +71 -0
  115. data/lib/rattler/util/graphviz/node_builder.rb +84 -0
  116. data/lib/rattler/util/node.rb +37 -19
  117. data/lib/rattler/util/parser_spec_helper.rb +61 -35
  118. data/spec/rattler/back_end/compiler_spec.rb +6 -860
  119. data/spec/rattler/back_end/optimizer/flatten_choice_spec.rb +70 -0
  120. data/spec/rattler/back_end/optimizer/flatten_sequence_spec.rb +130 -0
  121. data/spec/rattler/back_end/optimizer/inline_regular_rules_spec.rb +80 -0
  122. data/spec/rattler/back_end/optimizer/join_match_capturing_sequence_spec.rb +241 -0
  123. data/spec/rattler/back_end/optimizer/join_match_choice_spec.rb +100 -0
  124. data/spec/rattler/back_end/optimizer/join_match_matching_sequence_spec.rb +112 -0
  125. data/spec/rattler/back_end/optimizer/join_predicate_bare_match_spec.rb +194 -0
  126. data/spec/rattler/back_end/optimizer/join_predicate_nested_match_spec.rb +180 -0
  127. data/spec/rattler/back_end/optimizer/join_predicate_or_bare_match_spec.rb +153 -0
  128. data/spec/rattler/back_end/optimizer/join_predicate_or_nested_match_spec.rb +153 -0
  129. data/spec/rattler/back_end/optimizer/reduce_repeat_match_spec.rb +98 -0
  130. data/spec/rattler/back_end/optimizer/simplify_redundant_repeat_spec.rb +226 -0
  131. data/spec/rattler/back_end/optimizer/simplify_token_match_spec.rb +85 -0
  132. data/spec/rattler/back_end/parser_generator/apply_generator_spec.rb +38 -33
  133. data/spec/rattler/back_end/parser_generator/assert_generator_spec.rb +38 -33
  134. data/spec/rattler/back_end/parser_generator/back_reference_generator_spec.rb +181 -0
  135. data/spec/rattler/back_end/parser_generator/choice_generator_spec.rb +38 -33
  136. data/spec/rattler/back_end/parser_generator/direct_action_generator_spec.rb +38 -33
  137. data/spec/rattler/back_end/parser_generator/disallow_generator_spec.rb +38 -33
  138. data/spec/rattler/back_end/parser_generator/dispatch_action_generator_spec.rb +38 -33
  139. data/spec/rattler/back_end/parser_generator/group_match_generator_spec.rb +185 -0
  140. data/spec/rattler/back_end/parser_generator/label_generator_spec.rb +38 -33
  141. data/spec/rattler/back_end/parser_generator/list1_generator_spec.rb +10 -5
  142. data/spec/rattler/back_end/parser_generator/list_generator_spec.rb +10 -5
  143. data/spec/rattler/back_end/parser_generator/match_generator_spec.rb +38 -33
  144. data/spec/rattler/back_end/parser_generator/one_or_more_generator_spec.rb +38 -33
  145. data/spec/rattler/back_end/parser_generator/optional_generator_spec.rb +38 -33
  146. data/spec/rattler/back_end/parser_generator/rule_generator_spec.rb +13 -46
  147. data/spec/rattler/back_end/parser_generator/rule_set_generator_spec.rb +97 -0
  148. data/spec/rattler/back_end/parser_generator/sequence_generator_spec.rb +38 -33
  149. data/spec/rattler/back_end/parser_generator/skip_generator_spec.rb +38 -33
  150. data/spec/rattler/back_end/parser_generator/token_generator_spec.rb +38 -33
  151. data/spec/rattler/back_end/parser_generator/zero_or_more_generator_spec.rb +39 -34
  152. data/spec/rattler/back_end/shared_compiler_examples.rb +885 -0
  153. data/spec/rattler/grammar/analysis_spec.rb +167 -0
  154. data/spec/rattler/grammar/grammar_parser_spec.rb +169 -179
  155. data/spec/rattler/grammar/grammar_spec.rb +24 -21
  156. data/spec/rattler/parsers/action_code_spec.rb +64 -19
  157. data/spec/rattler/parsers/apply_spec.rb +9 -9
  158. data/spec/rattler/parsers/back_reference_spec.rb +38 -0
  159. data/spec/rattler/parsers/combinator_parser_spec.rb +14 -0
  160. data/spec/rattler/parsers/direct_action_spec.rb +16 -2
  161. data/spec/rattler/parsers/dispatch_action_spec.rb +15 -32
  162. data/spec/rattler/parsers/fail_spec.rb +6 -4
  163. data/spec/rattler/parsers/label_spec.rb +10 -28
  164. data/spec/rattler/parsers/node_code_spec.rb +48 -0
  165. data/spec/rattler/parsers/parser_dsl_spec.rb +1 -1
  166. data/spec/rattler/parsers/rule_set_spec.rb +35 -0
  167. data/spec/rattler/parsers/sequence_spec.rb +15 -24
  168. data/spec/rattler/runtime/extended_packrat_parser_spec.rb +22 -17
  169. data/spec/rattler/runtime/packrat_parser_spec.rb +1 -1
  170. data/spec/rattler/runtime/parse_node_spec.rb +15 -19
  171. data/spec/rattler/runtime/recursive_descent_parser_spec.rb +1 -1
  172. data/spec/rattler/runtime/shared_parser_examples.rb +61 -28
  173. data/spec/rattler/util/graphviz/node_builder_spec.rb +84 -0
  174. data/spec/rattler/util/node_spec.rb +92 -65
  175. data/spec/rattler_spec.rb +16 -16
  176. data/spec/support/combinator_parser_spec_helper.rb +19 -18
  177. data/spec/support/compiler_spec_helper.rb +56 -87
  178. data/spec/support/runtime_parser_spec_helper.rb +6 -14
  179. metadata +117 -22
  180. data/features/grammar/regex.feature +0 -24
  181. data/lib/rattler/parsers/match_joining.rb +0 -67
  182. data/lib/rattler/parsers/rules.rb +0 -43
@@ -8,36 +8,30 @@ module Rattler::BackEnd::ParserGenerator
8
8
  include TokenPropogating
9
9
  include SkipPropogating
10
10
 
11
- def gen_basic(skip)
12
- generate skip.child, :skip
11
+ def gen_basic(skip, scope={})
12
+ generate skip.child, :skip, scope
13
13
  end
14
14
 
15
- def gen_dispatch_action_nested(skip, target, method_name)
16
- atomic_block { gen_dispatch_action_top_level skip, target, method_name }
15
+ def gen_dispatch_action_nested(skip, code, scope={})
16
+ atomic_block { gen_dispatch_action_top_level skip, code, scope }
17
17
  end
18
18
 
19
- def gen_dispatch_action_top_level(skip, target, method_name)
20
- gen_intermediate_skip skip
21
- (@g << ' &&').newline
22
- @g << dispatch_action_result(target, method_name, :array_expr => '[]')
19
+ def gen_dispatch_action_top_level(skip, code, scope={})
20
+ gen_intermediate_skip skip, scope
21
+ (@g << ' &&').newline << code.bind(scope, '[]')
23
22
  end
24
23
 
25
- def gen_direct_action_nested(skip, action)
26
- atomic_block { gen_direct_action_top_level skip, action }
24
+ def gen_direct_action_nested(skip, code, scope={})
25
+ atomic_block { gen_direct_action_top_level skip, code, scope }
27
26
  end
28
27
 
29
- def gen_direct_action_top_level(skip, action)
30
- gen_intermediate_skip skip
31
- (@g << ' &&').newline
32
- @g << direct_action_result(action, :bind_args => [])
28
+ def gen_direct_action_top_level(skip, code, scope={})
29
+ gen_intermediate_skip skip, scope
30
+ (@g << ' &&').newline << '(' << code.bind(scope, []) << ')'
33
31
  end
34
32
 
35
- def gen_intermediate(skip)
36
- generate skip.child, :intermediate_skip
37
- end
38
-
39
- def gen_intermediate_skip(skip)
40
- gen_intermediate skip
33
+ def gen_intermediate(skip, scope={})
34
+ gen_intermediate_skip skip, scope
41
35
  end
42
36
 
43
37
  end
@@ -4,12 +4,12 @@ module Rattler::BackEnd::ParserGenerator
4
4
  # @private
5
5
  module SkipPropogating #:nodoc:
6
6
 
7
- def gen_skip(parser)
8
- generate parser.child, :skip
7
+ def gen_skip(parser, scope={})
8
+ generate parser.child, :skip, scope
9
9
  end
10
10
 
11
- def gen_intermediate_skip(parser)
12
- generate parser.child, :intermediate_skip
11
+ def gen_intermediate_skip(parser, scope={})
12
+ generate parser.child, :intermediate_skip, scope
13
13
  end
14
14
 
15
15
  end
@@ -74,9 +74,15 @@ module Rattler::BackEnd::ParserGenerator
74
74
  when Label
75
75
  cache_generator LabelGenerator
76
76
 
77
+ when BackReference
78
+ cache_generator BackReferenceGenerator
79
+
77
80
  when Fail
78
81
  cache_generator FailGenerator
79
82
 
83
+ when GroupMatch
84
+ cache_generator GroupMatchGenerator
85
+
80
86
  end
81
87
  end
82
88
 
@@ -8,26 +8,26 @@ module Rattler::BackEnd::ParserGenerator
8
8
  include TokenPropogating
9
9
  include SkipPropogating
10
10
 
11
- def gen_basic(token)
12
- generate token.child, :token
11
+ def gen_basic(token, scope={})
12
+ generate token.child, :token, scope
13
13
  end
14
14
 
15
- def gen_dispatch_action_nested(token, target, method_name)
16
- atomic_block { gen_dispatch_action_top_level token, target, method_name }
15
+ def gen_dispatch_action_nested(token, code, scope={})
16
+ atomic_block { gen_dispatch_action_top_level token, code, scope }
17
17
  end
18
18
 
19
- def gen_dispatch_action_top_level(token, target, method_name)
20
- @g.surround("(#{result_name} = ", ')') { gen_basic token }
21
- (@g << ' &&').newline << dispatch_action_result(target, method_name)
19
+ def gen_dispatch_action_top_level(token, code, scope={})
20
+ @g.surround("(#{result_name} = ", ')') { gen_basic token, scope }
21
+ (@g << ' &&').newline << code.bind(scope, "[#{result_name}]")
22
22
  end
23
23
 
24
- def gen_direct_action_nested(token, action)
25
- atomic_block { gen_direct_action_top_level token, action }
24
+ def gen_direct_action_nested(token, code, scope={})
25
+ atomic_block { gen_direct_action_top_level token, code, scope }
26
26
  end
27
27
 
28
- def gen_direct_action_top_level(token, action)
29
- @g.surround("(#{result_name} = ", ')') { gen_basic token }
30
- (@g << ' &&').newline << direct_action_result(action)
28
+ def gen_direct_action_top_level(token, code, scope={})
29
+ @g.surround("(#{result_name} = ", ')') { gen_basic token, scope }
30
+ (@g << ' &&').newline << '(' << code.bind(scope, [result_name]) << ')'
31
31
  end
32
32
 
33
33
  end
@@ -3,8 +3,8 @@ require 'rattler/back_end/parser_generator'
3
3
  module Rattler::BackEnd::ParserGenerator
4
4
  # @private
5
5
  module TokenPropogating #:nodoc:
6
- def gen_token(parser)
7
- generate parser.child, :token
6
+ def gen_token(parser, scope={})
7
+ generate parser.child, :token, scope
8
8
  end
9
9
  end
10
10
  end
@@ -7,17 +7,17 @@ module Rattler::BackEnd::ParserGenerator
7
7
  include RepeatGenerating
8
8
  include NestedSubGenerating
9
9
 
10
- def gen_assert(optional)
10
+ def gen_assert(optional, scope={})
11
11
  @g << 'true'
12
12
  end
13
13
 
14
- def gen_disallow(optional)
14
+ def gen_disallow(optional, scope={})
15
15
  @g << 'false'
16
16
  end
17
17
 
18
- def gen_skip_top_level(repeat)
18
+ def gen_skip_top_level(repeat, scope={})
19
19
  @g << 'while '
20
- generate repeat.child, :intermediate_skip
20
+ generate repeat.child, :intermediate_skip, scope
21
21
  (@g << '; end').newline
22
22
  @g << 'true'
23
23
  end
@@ -17,7 +17,8 @@ module Rattler
17
17
  autoload :GrammarParser, 'rattler/grammar/grammar_parser'
18
18
  autoload :GrammarDSL, 'rattler/grammar/grammar_dsl'
19
19
  autoload :Metagrammar, 'rattler/grammar/metagrammar'
20
-
20
+ autoload :Analysis, 'rattler/grammar/analysis'
21
+
21
22
  # Parse +source+ as a grammar and raise a {Rattler::Runtime::SyntaxError}
22
23
  # if the parse fails.
23
24
  #
@@ -28,7 +29,7 @@ module Rattler
28
29
  def self.parse!(source, options={})
29
30
  GrammarParser.parse!(source, options={})
30
31
  end
31
-
32
+
32
33
  # Parse +source+ as a grammar.
33
34
  #
34
35
  # @param (see Rattler::RecursiveDescentParser#initialize)
@@ -37,6 +38,6 @@ module Rattler
37
38
  def self.parser(source, options={})
38
39
  GrammarParser.new(source, options={})
39
40
  end
40
-
41
+
41
42
  end
42
43
  end
@@ -0,0 +1,91 @@
1
+ #
2
+ # = rattler/grammar/grammar.rb
3
+ #
4
+ # Author:: Jason Arhart
5
+ # Documentation:: Author
6
+ #
7
+ require 'rattler/grammar'
8
+ require 'set'
9
+
10
+ module Rattler::Grammar
11
+ class Analysis
12
+
13
+ include Rattler::Parsers
14
+
15
+ def initialize(rules)
16
+ @rules = rules
17
+ @references = {}
18
+ @left_references = {}
19
+ @direct_references = {}
20
+ @direct_left_references = {}
21
+ end
22
+
23
+ def regular?(rule_name)
24
+ not recursive?(rule_name)
25
+ end
26
+
27
+ def recursive?(rule_name)
28
+ referenced_from? rule_name, rule_name
29
+ end
30
+
31
+ def left_recursive?(rule_name)
32
+ left_referenced_from? rule_name, rule_name
33
+ end
34
+
35
+ def referenced?(rule_name)
36
+ rule_name == @rules.start_rule or
37
+ referenced_from? @rules.start_rule, rule_name
38
+ end
39
+
40
+ def referenced_from?(referencer, referencee)
41
+ references_from(referencer).include? referencee
42
+ end
43
+
44
+ def left_referenced_from?(referencer, referencee)
45
+ left_references_from(referencer).include? referencee
46
+ end
47
+
48
+ private
49
+
50
+ def references_from(rule_name)
51
+ @references[rule_name] ||= trace_references rule_name, :direct_references
52
+ end
53
+
54
+ def left_references_from(rule_name)
55
+ @left_references[rule_name] ||= trace_references rule_name, :direct_left_references
56
+ end
57
+
58
+ def trace_references(rule_name, enum, references=nil)
59
+ references ||= Set[]
60
+ for r in send(enum, @rules[rule_name].expr)
61
+ trace_references(r, enum, references << r) unless references.include? r
62
+ end
63
+ references
64
+ end
65
+
66
+ def direct_references(expr)
67
+ @direct_references[expr] ||= case expr
68
+ when Apply
69
+ Set[expr.rule_name]
70
+ when Rattler::Parsers::Parser
71
+ expr.map {|_| direct_references _ }.to_set.flatten
72
+ else
73
+ Set[]
74
+ end
75
+ end
76
+
77
+ def direct_left_references(expr)
78
+ @direct_left_references[expr] ||= case expr
79
+ when Apply
80
+ Set[expr.rule_name]
81
+ when Choice
82
+ expr.map {|_| direct_left_references _ }.to_set.flatten
83
+ when Rattler::Parsers::Parser
84
+ direct_left_references expr.child
85
+ else
86
+ Set[]
87
+ end
88
+ end
89
+
90
+ end
91
+ end
@@ -11,18 +11,26 @@ module Rattler::Grammar
11
11
  # +Grammar+ represents a parsed grammar
12
12
  #
13
13
  # @author Jason Arhart
14
- class Grammar
15
-
14
+ class Grammar < Rattler::Util::Node
15
+
16
16
  # The name of the default parser base class
17
17
  DEFAULT_PARSER_BASE = 'Rattler::Runtime::PackratParser'
18
-
18
+
19
+ @@default_opts = {
20
+ :grammar_name => nil,
21
+ :parser_name => nil,
22
+ :base_name => DEFAULT_PARSER_BASE,
23
+ :requires => [],
24
+ :includes => []
25
+ }
26
+
19
27
  # @private
20
28
  def self.parsed(results, *_) #:nodoc:
21
29
  options, rules = results
22
30
  self.new(rules, options)
23
31
  end
24
-
25
- # @param rules [Rules] the parse rules that define the parser
32
+
33
+ # @param rules [RuleSet] the parse rules that define the parser
26
34
  #
27
35
  # @option opts [String] start_rule (rules.first)
28
36
  # @option opts [String] grammar_name (nil)
@@ -31,27 +39,31 @@ module Rattler::Grammar
31
39
  # @option opts [Array<String>] requires ([])
32
40
  # @option opts [Array<String>] includes ([])
33
41
  def initialize(rules, opts={})
34
- @__rules__ = rules
35
- @start_rule = opts[:start_rule] || rules.first.name
36
- @grammar_name = opts[:grammar_name]
37
- @parser_name = opts[:parser_name]
38
- @base_name = opts[:base_name] || DEFAULT_PARSER_BASE
39
- @requires = opts[:requires] || []
40
- @includes = opts[:includes] || []
41
- @name = @grammar_name || @parser_name
42
- end
43
-
44
- attr_reader :start_rule, :grammar_name, :parser_name, :base_name, :name
45
- attr_reader :requires, :includes
46
-
47
- # @return the parse rules
48
- def rules
49
- @rules ||= begin
50
- r = @__rules__.optimized
51
- r.start_rule = start_rule
52
- r
42
+ super @@default_opts.merge(opts)
43
+
44
+ case attrs[:start_rule]
45
+ when Symbol then attrs[:start_rule] = rules[start_rule]
46
+ when nil then attrs[:start_rule] = rules.first
53
47
  end
48
+
49
+ @rules = rules.with_attrs(:start_rule => start_rule.name)
50
+
51
+ attrs[:name] ||= grammar_name || parser_name
54
52
  end
55
-
53
+
54
+ attr_reader :rules
55
+
56
+ def rule(name)
57
+ rules[name]
58
+ end
59
+
60
+ def analysis
61
+ rules.analysis
62
+ end
63
+
64
+ def with_rules(new_rules)
65
+ self.class.new new_rules, attrs
66
+ end
67
+
56
68
  end
57
69
  end
@@ -17,14 +17,15 @@ module Rattler::Grammar
17
17
  super
18
18
  @ws = nil
19
19
  @wc = Match[/[[:alnum:]_]/]
20
+ @inline = false
20
21
  @directive_stack = []
21
22
  end
22
23
 
23
24
  private
24
25
 
25
26
  def start_ws(e)
26
- @directive_stack.push(:type => :ws, :value => @ws)
27
- set_ws(e)
27
+ @directive_stack.push :type => :ws, :value => @ws
28
+ set_ws e
28
29
  end
29
30
 
30
31
  def set_ws(e)
@@ -33,8 +34,8 @@ module Rattler::Grammar
33
34
  end
34
35
 
35
36
  def start_wc(e)
36
- @directive_stack.push(:type => :wc, :value => @wc)
37
- set_wc(e)
37
+ @directive_stack.push :type => :wc, :value => @wc
38
+ set_wc e
38
39
  end
39
40
 
40
41
  def set_wc(e)
@@ -42,11 +43,21 @@ module Rattler::Grammar
42
43
  true
43
44
  end
44
45
 
46
+ def start_inline
47
+ @directive_stack.push :type => :inline, :value => @inline
48
+ set_inline
49
+ end
50
+
51
+ def set_inline
52
+ @inline = true
53
+ end
54
+
45
55
  def end_block
46
56
  if d = @directive_stack.pop
47
57
  case d[:type]
48
- when :wc then @wc = d[:value]
49
- when :ws then @ws = d[:value]
58
+ when :wc then @wc = d[:value]
59
+ when :ws then @ws = d[:value]
60
+ when :inline then @inline = d[:value]
50
61
  end
51
62
  true
52
63
  end
@@ -61,7 +72,7 @@ module Rattler::Grammar
61
72
  end
62
73
 
63
74
  def rule(name, parser)
64
- Rule[name, (@ws ? parser.with_ws(@ws) : parser)]
75
+ Rule[name, (@ws ? parser.with_ws(@ws) : parser), {:inline => @inline}]
65
76
  end
66
77
 
67
78
  def literal(e)
@@ -69,10 +80,7 @@ module Rattler::Grammar
69
80
  end
70
81
 
71
82
  def word_literal(e)
72
- Token[Sequence[
73
- Match[Regexp.compile(Regexp.escape(eval("%q#{e}", TOPLEVEL_BINDING)))],
74
- Disallow[@wc]
75
- ]]
83
+ Token[Sequence[literal("%q#{e}"), Disallow[@wc]]]
76
84
  end
77
85
 
78
86
  def char_class(e)
@@ -16,20 +16,142 @@ module Rattler
16
16
  def match_grammar #:nodoc:
17
17
  p0 = @scanner.pos
18
18
  begin
19
- (r0_0 = match(:heading)) &&
20
- (r0_1 = match(:rules)) &&
21
- begin
19
+ (r0_0 = begin
22
20
  p1 = @scanner.pos
23
21
  begin
24
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
25
- @scanner.eos? &&
26
- true
22
+ (r1_0 = begin
23
+ a0 = []
24
+ while r = begin
25
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>require)(?![[:alnum:]_])))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?!(?>(?>[[:blank:]])*)(?>\z|;|(?>(?>\r)?)(?>\n)|(?>\#)(?>(?>[^\n])*)))(?>.))+))(?>(?>(?>[[:blank:]])*)(?>\z|;|(?>(?>\r)?)(?>\n)|(?>\#)(?>(?>[^\n])*)))/) &&
26
+ @scanner[1]
27
+ end
28
+ a0 << r
29
+ end
30
+ ({ :requires => select_captures(a0) })
31
+ end) &&
32
+ (r1_1 = ((r = begin
33
+ begin
34
+ p2 = @scanner.pos
35
+ begin
36
+ (r2_0 = begin
37
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>parser)(?![[:alnum:]_])))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?>(?>[[:upper:]])(?>(?>[[:alnum:]_])*)(?>::))*)(?>[[:upper:]])(?>(?>[[:alnum:]_])*)))/) &&
38
+ @scanner[1]
39
+ end) &&
40
+ (r2_1 = ((r = begin
41
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?>(?>[[:upper:]])(?>(?>[[:alnum:]_])*)(?>::))*)(?>[[:upper:]])(?>(?>[[:alnum:]_])*)))/) &&
42
+ @scanner[1]
43
+ end) ? [r] : [])) &&
44
+ @scanner.skip(/(?>(?>(?>[[:blank:]])*)(?>\z|;|(?>(?>\r)?)(?>\n)|(?>\#)(?>(?>[^\n])*)))/) &&
45
+ (parser_decl r2_0, r2_1)
46
+ end || begin
47
+ @scanner.pos = p2
48
+ false
49
+ end
50
+ end ||
51
+ begin
52
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>grammar)(?![[:alnum:]_])))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?>(?>[[:upper:]])(?>(?>[[:alnum:]_])*)(?>::))*)(?>[[:upper:]])(?>(?>[[:alnum:]_])*)))(?>(?>(?>[[:blank:]])*)(?>\z|;|(?>(?>\r)?)(?>\n)|(?>\#)(?>(?>[^\n])*)))/) &&
53
+ ({ :grammar_name => @scanner[1] })
54
+ end
55
+ end) ? [r] : [])) &&
56
+ (r1_2 = begin
57
+ a0 = []
58
+ while r = begin
59
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>include)(?![[:alnum:]_])))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?>(?>[[:upper:]])(?>(?>[[:alnum:]_])*)(?>::))*)(?>[[:upper:]])(?>(?>[[:alnum:]_])*)))(?>(?>(?>[[:blank:]])*)(?>\z|;|(?>(?>\r)?)(?>\n)|(?>\#)(?>(?>[^\n])*)))/) &&
60
+ @scanner[1]
61
+ end
62
+ a0 << r
63
+ end
64
+ ({ :includes => select_captures(a0) })
65
+ end) &&
66
+ (heading r1_0, r1_1, r1_2)
27
67
  end || begin
28
68
  @scanner.pos = p1
29
69
  false
30
70
  end
31
- end &&
32
- Grammar.parsed(select_captures([r0_0, r0_1]))
71
+ end) &&
72
+ (r0_1 = begin
73
+ a0 = []
74
+ while r = begin
75
+ begin
76
+ p1 = @scanner.pos
77
+ begin
78
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>%whitespace)(?![[:alnum:]_]))/) &&
79
+ (r1_0 = match(:unattributed)) &&
80
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{)/) &&
81
+ (start_ws r1_0)
82
+ end || begin
83
+ @scanner.pos = p1
84
+ false
85
+ end
86
+ end ||
87
+ begin
88
+ p1 = @scanner.pos
89
+ begin
90
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>%whitespace)(?![[:alnum:]_]))/) &&
91
+ (r1_0 = match(:unattributed)) &&
92
+ (set_ws r1_0)
93
+ end || begin
94
+ @scanner.pos = p1
95
+ false
96
+ end
97
+ end ||
98
+ begin
99
+ p1 = @scanner.pos
100
+ begin
101
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>%word_character)(?![[:alnum:]_]))/) &&
102
+ (r1_0 = match(:unattributed)) &&
103
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{)/) &&
104
+ (start_wc r1_0)
105
+ end || begin
106
+ @scanner.pos = p1
107
+ false
108
+ end
109
+ end ||
110
+ begin
111
+ p1 = @scanner.pos
112
+ begin
113
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>%word_character)(?![[:alnum:]_]))/) &&
114
+ (r1_0 = match(:unattributed)) &&
115
+ (set_wc r1_0)
116
+ end || begin
117
+ @scanner.pos = p1
118
+ false
119
+ end
120
+ end ||
121
+ begin
122
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>%inline)(?![[:alnum:]_])))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{))/) &&
123
+ (start_inline)
124
+ end ||
125
+ begin
126
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>%inline)(?![[:alnum:]_]))/) &&
127
+ (set_inline)
128
+ end ||
129
+ begin
130
+ p1 = @scanner.pos
131
+ begin
132
+ @scanner.skip(/(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>EOF)(?![[:alnum:]_])))/) &&
133
+ (r1_0 = begin
134
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:alnum:]_])+))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><\-))/) &&
135
+ @scanner[1]
136
+ end) &&
137
+ (r1_1 = match(:expression)) &&
138
+ (rule r1_0, r1_1)
139
+ end || begin
140
+ @scanner.pos = p1
141
+ false
142
+ end
143
+ end ||
144
+ begin
145
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\})/) &&
146
+ (end_block)
147
+ end
148
+ end
149
+ a0 << r
150
+ end
151
+ RuleSet.parsed(select_captures(a0)) unless a0.empty?
152
+ end) &&
153
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)\z/) &&
154
+ Grammar.parsed([r0_0, r0_1])
33
155
  end || begin
34
156
  @scanner.pos = p0
35
157
  false
@@ -37,58 +159,67 @@ module Rattler
37
159
  end
38
160
 
39
161
  # @private
40
- def match_heading #:nodoc:
41
- p0 = @scanner.pos
162
+ def match_unattributed #:nodoc:
163
+ memoize_lr :match_unattributed!
164
+ end
165
+
166
+ # @private
167
+ def match_unattributed! #:nodoc:
42
168
  begin
43
- (r0_0 = match(:requires)) &&
44
- (r0_1 = ((r = match(:module_decl)) ? [r] : [])) &&
45
- (r0_2 = match(:includes)) &&
46
- (heading *[r0_0, r0_1, r0_2])
47
- end || begin
48
- @scanner.pos = p0
49
- false
50
- end
169
+ p0 = @scanner.pos
170
+ begin
171
+ (r0_0 = match(:unattributed)) &&
172
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\/)/) &&
173
+ (r0_1 = match(:terms)) &&
174
+ Choice.parsed(select_captures([r0_0, r0_1]))
175
+ end || begin
176
+ @scanner.pos = p0
177
+ false
178
+ end
179
+ end ||
180
+ match(:terms)
181
+ end
182
+
183
+ # @private
184
+ def match_expression #:nodoc:
185
+ memoize_lr :match_expression!
51
186
  end
52
187
 
53
188
  # @private
54
- def match_requires #:nodoc:
55
- a0 = []
56
- while r = begin
189
+ def match_expression! #:nodoc:
190
+ begin
57
191
  p0 = @scanner.pos
58
192
  begin
59
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>require)(?>(?![[:alnum:]_])))/) &&
60
- (r0_0 = match(:literal)) &&
61
- match(:eol) &&
62
- r0_0
193
+ (r0_0 = match(:expression)) &&
194
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\/)/) &&
195
+ (r0_1 = match(:attributed)) &&
196
+ Choice.parsed(select_captures([r0_0, r0_1]))
63
197
  end || begin
64
198
  @scanner.pos = p0
65
199
  false
66
200
  end
67
- end
68
- a0 << r
69
- end
70
- ({ :requires => select_captures(a0) })
201
+ end ||
202
+ match(:attributed)
203
+ end
204
+
205
+ # @private
206
+ def match_attributed #:nodoc:
207
+ memoize_lr :match_attributed!
71
208
  end
72
209
 
73
210
  # @private
74
- def match_module_decl #:nodoc:
211
+ def match_attributed! #:nodoc:
75
212
  begin
76
213
  p0 = @scanner.pos
77
214
  begin
78
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>parser)(?>(?![[:alnum:]_])))/) &&
79
- (r0_0 = match(:constant)) &&
215
+ (r0_0 = match(:attributed)) &&
216
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><)/) &&
80
217
  (r0_1 = ((r = begin
81
- p1 = @scanner.pos
82
- begin
83
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><)/) &&
84
- match(:constant)
85
- end || begin
86
- @scanner.pos = p1
87
- false
88
- end
218
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>[[:lower:]])(?>(?>[[:alnum:]_])*))|(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>(?>(?>[[:upper:]])(?>(?>[[:alnum:]_])*)(?>::))*)(?>[[:upper:]])(?>(?>[[:alnum:]_])*)))(?>(?>(?>\.)(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>[[:lower:]])(?>(?>[[:alnum:]_])*))))?))/) &&
219
+ @scanner[1]
89
220
  end) ? [r] : [])) &&
90
- match(:eol) &&
91
- (parser_decl *[r0_0, r0_1])
221
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>>)/) &&
222
+ DispatchAction.parsed(select_captures([r0_0, r0_1]))
92
223
  end || begin
93
224
  @scanner.pos = p0
94
225
  false
@@ -97,78 +228,229 @@ module Rattler
97
228
  begin
98
229
  p0 = @scanner.pos
99
230
  begin
100
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>grammar)(?>(?![[:alnum:]_])))/) &&
101
- (r0_0 = match(:constant)) &&
102
- match(:eol) &&
103
- ({ :grammar_name => r0_0 })
231
+ (r0_0 = match(:attributed)) &&
232
+ (r0_1 = begin
233
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>(?>\{)(?>(?>[^}])*)(?>\})|[^{}])*))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\}))/) &&
234
+ @scanner[1]
235
+ end) &&
236
+ DirectAction.parsed(select_captures([r0_0, r0_1]))
104
237
  end || begin
105
238
  @scanner.pos = p0
106
239
  false
107
240
  end
108
- end
241
+ end ||
242
+ match(:terms)
243
+ end
244
+
245
+ # @private
246
+ def match_terms #:nodoc:
247
+ memoize_lr :match_terms!
109
248
  end
110
249
 
111
250
  # @private
112
- def match_includes #:nodoc:
113
- a0 = []
114
- while r = begin
251
+ def match_terms! #:nodoc:
252
+ begin
115
253
  p0 = @scanner.pos
116
254
  begin
117
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>include)(?>(?![[:alnum:]_])))/) &&
118
- (r0_0 = match(:constant)) &&
119
- match(:eol) &&
120
- r0_0
255
+ (r0_0 = match(:terms)) &&
256
+ (r0_1 = match(:term)) &&
257
+ Sequence.parsed(select_captures([r0_0, r0_1]))
121
258
  end || begin
122
259
  @scanner.pos = p0
123
260
  false
124
261
  end
125
- end
126
- a0 << r
127
- end
128
- ({ :includes => select_captures(a0) })
129
- end
130
-
131
- # @private
132
- def match_rules #:nodoc:
133
- a0 = []
134
- while r = begin
135
- match(:directive) ||
136
- match(:rule) ||
137
- match(:block_close)
138
- end
139
- a0 << r
140
- end
141
- Rules.parsed(select_captures(a0)) unless a0.empty?
262
+ end ||
263
+ match(:term)
142
264
  end
143
265
 
144
266
  # @private
145
- def match_directive #:nodoc:
146
- match(:ws_directive) ||
147
- match(:wc_directive)
267
+ def match_term #:nodoc:
268
+ memoize :match_term!
148
269
  end
149
270
 
150
271
  # @private
151
- def match_ws_directive #:nodoc:
272
+ def match_term! #:nodoc:
152
273
  begin
153
274
  p0 = @scanner.pos
154
275
  begin
155
- (r0_0 = match(:ws_decl)) &&
156
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{)/) &&
157
- (start_ws r0_0)
276
+ (r0_0 = begin
277
+ begin
278
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>fail)(?![[:alnum:]_]))/) &&
279
+ @scanner[1]
280
+ end ||
281
+ begin
282
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>fail_rule)(?![[:alnum:]_]))/) &&
283
+ @scanner[1]
284
+ end ||
285
+ begin
286
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>fail_parse)(?![[:alnum:]_]))/) &&
287
+ @scanner[1]
288
+ end
289
+ end) &&
290
+ (r0_1 = begin
291
+ begin
292
+ p1 = @scanner.pos
293
+ begin
294
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\()/) &&
295
+ (r1_0 = begin
296
+ begin
297
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>")(?>(?>(?>\\)(?>.)|[^"])*)(?>"))/) &&
298
+ @scanner[1]
299
+ end ||
300
+ begin
301
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>')(?>(?>(?>\\)(?>.)|[^'])*)(?>'))/) &&
302
+ @scanner[1]
303
+ end ||
304
+ begin
305
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%\()(?>(?>(?>\\)(?>.)|[^)])*)(?>\)))/) &&
306
+ @scanner[1]
307
+ end ||
308
+ begin
309
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%\{)(?>(?>(?>\\)(?>.)|[^}])*)(?>\}))/) &&
310
+ @scanner[1]
311
+ end ||
312
+ begin
313
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%\[)(?>(?>(?>\\)(?>.)|[^\]])*)(?>\]))/) &&
314
+ @scanner[1]
315
+ end ||
316
+ begin
317
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%<)(?>(?>(?>\\)(?>.)|[^>])*)(?>>))/) &&
318
+ @scanner[1]
319
+ end ||
320
+ begin
321
+ p2 = @scanner.pos
322
+ begin
323
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
324
+ begin
325
+ p3 = @scanner.pos
326
+ begin
327
+ @scanner.skip(/%/) &&
328
+ (r3_0 = @scanner.scan(/[[:punct:]]/)) &&
329
+ begin
330
+ while begin
331
+ @scanner.skip(/(?>\\)(?>.)/) ||
332
+ begin
333
+ p4 = @scanner.pos
334
+ begin
335
+ @scanner.skip(/(?!#{r3_0})/) &&
336
+ @scanner.skip(/./) &&
337
+ true
338
+ end || begin
339
+ @scanner.pos = p4
340
+ false
341
+ end
342
+ end
343
+ end; end
344
+ true
345
+ end &&
346
+ @scanner.skip(/#{r3_0}/) &&
347
+ @scanner.string[p3...(@scanner.pos)]
348
+ end || begin
349
+ @scanner.pos = p3
350
+ false
351
+ end
352
+ end
353
+ end || begin
354
+ @scanner.pos = p2
355
+ false
356
+ end
357
+ end
358
+ end) &&
359
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\))/) &&
360
+ r1_0
361
+ end || begin
362
+ @scanner.pos = p1
363
+ false
364
+ end
365
+ end ||
366
+ begin
367
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>")(?>(?>(?>\\)(?>.)|[^"])*)(?>"))/) &&
368
+ @scanner[1]
369
+ end ||
370
+ begin
371
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>')(?>(?>(?>\\)(?>.)|[^'])*)(?>'))/) &&
372
+ @scanner[1]
373
+ end ||
374
+ begin
375
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%\()(?>(?>(?>\\)(?>.)|[^)])*)(?>\)))/) &&
376
+ @scanner[1]
377
+ end ||
378
+ begin
379
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%\{)(?>(?>(?>\\)(?>.)|[^}])*)(?>\}))/) &&
380
+ @scanner[1]
381
+ end ||
382
+ begin
383
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%\[)(?>(?>(?>\\)(?>.)|[^\]])*)(?>\]))/) &&
384
+ @scanner[1]
385
+ end ||
386
+ begin
387
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%<)(?>(?>(?>\\)(?>.)|[^>])*)(?>>))/) &&
388
+ @scanner[1]
389
+ end ||
390
+ begin
391
+ p1 = @scanner.pos
392
+ begin
393
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
394
+ begin
395
+ p2 = @scanner.pos
396
+ begin
397
+ @scanner.skip(/%/) &&
398
+ (r2_0 = @scanner.scan(/[[:punct:]]/)) &&
399
+ begin
400
+ while begin
401
+ @scanner.skip(/(?>\\)(?>.)/) ||
402
+ begin
403
+ p3 = @scanner.pos
404
+ begin
405
+ @scanner.skip(/(?!#{r2_0})/) &&
406
+ @scanner.skip(/./) &&
407
+ true
408
+ end || begin
409
+ @scanner.pos = p3
410
+ false
411
+ end
412
+ end
413
+ end; end
414
+ true
415
+ end &&
416
+ @scanner.skip(/#{r2_0}/) &&
417
+ @scanner.string[p2...(@scanner.pos)]
418
+ end || begin
419
+ @scanner.pos = p2
420
+ false
421
+ end
422
+ end
423
+ end || begin
424
+ @scanner.pos = p1
425
+ false
426
+ end
427
+ end
428
+ end) &&
429
+ Fail.parsed([r0_0, r0_1])
158
430
  end || begin
159
431
  @scanner.pos = p0
160
432
  false
161
433
  end
162
434
  end ||
163
- ((r = match(:ws_decl)) && (set_ws r))
435
+ match(:labeled) ||
436
+ match(:labelable)
437
+ end
438
+
439
+ # @private
440
+ def match_labeled #:nodoc:
441
+ memoize :match_labeled!
164
442
  end
165
443
 
166
444
  # @private
167
- def match_ws_decl #:nodoc:
445
+ def match_labeled! #:nodoc:
168
446
  p0 = @scanner.pos
169
447
  begin
170
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>%whitespace)(?>(?![[:alnum:]_])))/) &&
171
- match(:unattributed)
448
+ (r0_0 = begin
449
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:lower:]])(?>(?>[[:alnum:]_])*)))(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>:))/) &&
450
+ @scanner[1]
451
+ end) &&
452
+ (r0_1 = match(:labelable)) &&
453
+ Label.parsed(select_captures([r0_0, r0_1]))
172
454
  end || begin
173
455
  @scanner.pos = p0
174
456
  false
@@ -176,97 +458,96 @@ module Rattler
176
458
  end
177
459
 
178
460
  # @private
179
- def match_wc_directive #:nodoc:
461
+ def match_labelable #:nodoc:
462
+ memoize :match_labelable!
463
+ end
464
+
465
+ # @private
466
+ def match_labelable! #:nodoc:
467
+ match(:list) ||
468
+ match(:list_term)
469
+ end
470
+
471
+ # @private
472
+ def match_list #:nodoc:
473
+ memoize :match_list!
474
+ end
475
+
476
+ # @private
477
+ def match_list! #:nodoc:
180
478
  begin
181
479
  p0 = @scanner.pos
182
480
  begin
183
- (r0_0 = match(:wc_decl)) &&
184
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{)/) &&
185
- (start_wc r0_0)
481
+ (r0_0 = match(:list_term)) &&
482
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\*,)/) &&
483
+ (r0_1 = match(:list_term)) &&
484
+ List.parsed(select_captures([r0_0, r0_1]))
186
485
  end || begin
187
486
  @scanner.pos = p0
188
487
  false
189
488
  end
190
489
  end ||
191
- ((r = match(:wc_decl)) && (set_wc r))
490
+ begin
491
+ p0 = @scanner.pos
492
+ begin
493
+ (r0_0 = match(:list_term)) &&
494
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\+,)/) &&
495
+ (r0_1 = match(:list_term)) &&
496
+ List1.parsed(select_captures([r0_0, r0_1]))
497
+ end || begin
498
+ @scanner.pos = p0
499
+ false
500
+ end
501
+ end
192
502
  end
193
503
 
194
504
  # @private
195
- def match_wc_decl #:nodoc:
196
- p0 = @scanner.pos
197
- begin
198
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>%word_character)(?>(?![[:alnum:]_])))/) &&
199
- match(:unattributed)
200
- end || begin
201
- @scanner.pos = p0
202
- false
203
- end
505
+ def match_list_term #:nodoc:
506
+ memoize :match_list_term!
204
507
  end
205
508
 
206
509
  # @private
207
- def match_block_close #:nodoc:
208
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\})/) &&
209
- (end_block)
510
+ def match_list_term! #:nodoc:
511
+ match(:prefixed) ||
512
+ match(:prefixable) ||
513
+ (fail! { "term expected" })
210
514
  end
211
515
 
212
516
  # @private
213
- def match_rule #:nodoc:
214
- p0 = @scanner.pos
215
- begin
216
- (r0_0 = match(:identifier)) &&
217
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><\-)/) &&
218
- (r0_1 = match(:expression)) &&
219
- (rule *[r0_0, r0_1])
220
- end || begin
221
- @scanner.pos = p0
222
- false
223
- end
517
+ def match_prefixed #:nodoc:
518
+ memoize :match_prefixed!
224
519
  end
225
520
 
226
521
  # @private
227
- def match_unattributed #:nodoc:
522
+ def match_prefixed! #:nodoc:
228
523
  begin
229
524
  p0 = @scanner.pos
230
525
  begin
231
- (r0_0 = match(:unattributed)) &&
232
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\|)/) &&
233
- (r0_1 = match(:terms)) &&
234
- Choice.parsed(select_captures([r0_0, r0_1]))
526
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>&)/) &&
527
+ (r0_0 = match(:prefixable)) &&
528
+ Assert.parsed(select_captures([r0_0]))
235
529
  end || begin
236
530
  @scanner.pos = p0
237
531
  false
238
532
  end
239
533
  end ||
240
- match(:terms)
241
- end
242
-
243
- # @private
244
- def match_expression #:nodoc:
245
534
  begin
246
535
  p0 = @scanner.pos
247
536
  begin
248
- (r0_0 = match(:expression)) &&
249
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\|)/) &&
250
- (r0_1 = match(:attributed)) &&
251
- Choice.parsed(select_captures([r0_0, r0_1]))
537
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>!)/) &&
538
+ (r0_0 = match(:prefixable)) &&
539
+ Disallow.parsed(select_captures([r0_0]))
252
540
  end || begin
253
541
  @scanner.pos = p0
254
542
  false
255
543
  end
256
544
  end ||
257
- match(:attributed)
258
- end
259
-
260
- # @private
261
- def match_attributed #:nodoc:
262
545
  begin
263
546
  p0 = @scanner.pos
264
547
  begin
265
- (r0_0 = match(:attributed)) &&
266
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><)/) &&
267
- (r0_1 = ((r = match(:dispatch)) ? [r] : [])) &&
268
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>>)/) &&
269
- DispatchAction.parsed(select_captures([r0_0, r0_1]))
548
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>~)/) &&
549
+ (r0_0 = match(:prefixable)) &&
550
+ Skip.parsed(select_captures([r0_0]))
270
551
  end || begin
271
552
  @scanner.pos = p0
272
553
  false
@@ -275,260 +556,34 @@ module Rattler
275
556
  begin
276
557
  p0 = @scanner.pos
277
558
  begin
278
- (r0_0 = match(:attributed)) &&
279
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\{)/) &&
280
- (r0_1 = match(:action)) &&
281
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\})/) &&
282
- DirectAction.parsed(select_captures([r0_0, r0_1]))
559
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>@)/) &&
560
+ (r0_0 = match(:prefixable)) &&
561
+ Token.parsed(select_captures([r0_0]))
283
562
  end || begin
284
563
  @scanner.pos = p0
285
564
  false
286
565
  end
287
- end ||
288
- match(:terms)
566
+ end
289
567
  end
290
568
 
291
569
  # @private
292
- def match_dispatch #:nodoc:
293
- p0 = @scanner.pos
294
- begin
295
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
296
- begin
297
- p1 = @scanner.pos
298
- begin
299
- match(:name) &&
300
- begin
301
- begin
302
- p2 = @scanner.pos
303
- begin
304
- @scanner.skip(/\./) &&
305
- match(:var_name) &&
306
- true
307
- end || begin
308
- @scanner.pos = p2
309
- false
310
- end
311
- end
312
- true
313
- end &&
314
- @scanner.string[p1...(@scanner.pos)]
315
- end || begin
316
- @scanner.pos = p1
317
- false
318
- end
319
- end
320
- end || begin
321
- @scanner.pos = p0
322
- false
323
- end
324
- end
325
-
326
- # @private
327
- def match_action #:nodoc:
328
- p0 = @scanner.pos
329
- begin
330
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
331
- @scanner.scan(/(?>(?>\{)(?>(?>[^}])*)(?>\})|[^{}])*/)
332
- end || begin
333
- @scanner.pos = p0
334
- false
335
- end
336
- end
337
-
338
- # @private
339
- def match_terms #:nodoc:
340
- begin
341
- p0 = @scanner.pos
342
- begin
343
- (r0_0 = match(:terms)) &&
344
- (r0_1 = match(:term)) &&
345
- Sequence.parsed(select_captures([r0_0, r0_1]))
346
- end || begin
347
- @scanner.pos = p0
348
- false
349
- end
350
- end ||
351
- match(:term)
352
- end
353
-
354
- # @private
355
- def match_term #:nodoc:
356
- match(:fail_expr) ||
357
- match(:labeled) ||
358
- match(:labelable)
359
- end
360
-
361
- # @private
362
- def match_fail_expr #:nodoc:
363
- p0 = @scanner.pos
364
- begin
365
- (r0_0 = begin
366
- begin
367
- p1 = @scanner.pos
368
- begin
369
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
370
- @scanner.scan(/(?>fail)(?>(?![[:alnum:]_]))/)
371
- end || begin
372
- @scanner.pos = p1
373
- false
374
- end
375
- end ||
376
- begin
377
- p1 = @scanner.pos
378
- begin
379
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
380
- @scanner.scan(/(?>fail_rule)(?>(?![[:alnum:]_]))/)
381
- end || begin
382
- @scanner.pos = p1
383
- false
384
- end
385
- end ||
386
- begin
387
- p1 = @scanner.pos
388
- begin
389
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
390
- @scanner.scan(/(?>fail_parse)(?>(?![[:alnum:]_]))/)
391
- end || begin
392
- @scanner.pos = p1
393
- false
394
- end
395
- end
396
- end) &&
397
- (r0_1 = match(:fail_arg)) &&
398
- Fail.parsed(select_captures([r0_0, r0_1]))
399
- end || begin
400
- @scanner.pos = p0
401
- false
402
- end
403
- end
404
-
405
- # @private
406
- def match_fail_arg #:nodoc:
407
- begin
408
- p0 = @scanner.pos
409
- begin
410
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\()/) &&
411
- (r0_0 = match(:literal)) &&
412
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\))/) &&
413
- r0_0
414
- end || begin
415
- @scanner.pos = p0
416
- false
417
- end
418
- end ||
419
- match(:literal)
420
- end
421
-
422
- # @private
423
- def match_labeled #:nodoc:
424
- p0 = @scanner.pos
425
- begin
426
- (r0_0 = match(:var_name)) &&
427
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>:)/) &&
428
- (r0_1 = match(:labelable)) &&
429
- Label.parsed(select_captures([r0_0, r0_1]))
430
- end || begin
431
- @scanner.pos = p0
432
- false
433
- end
434
- end
435
-
436
- # @private
437
- def match_labelable #:nodoc:
438
- match(:list) ||
439
- match(:list_term)
440
- end
441
-
442
- # @private
443
- def match_list #:nodoc:
444
- begin
445
- p0 = @scanner.pos
446
- begin
447
- (r0_0 = match(:list_term)) &&
448
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\*\^)/) &&
449
- (r0_1 = match(:list_term)) &&
450
- List.parsed(select_captures([r0_0, r0_1]))
451
- end || begin
452
- @scanner.pos = p0
453
- false
454
- end
455
- end ||
456
- begin
457
- p0 = @scanner.pos
458
- begin
459
- (r0_0 = match(:list_term)) &&
460
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\+\^)/) &&
461
- (r0_1 = match(:list_term)) &&
462
- List1.parsed(select_captures([r0_0, r0_1]))
463
- end || begin
464
- @scanner.pos = p0
465
- false
466
- end
467
- end
468
- end
469
-
470
- # @private
471
- def match_list_term #:nodoc:
472
- match(:prefixed) ||
473
- match(:prefixable)
474
- end
475
-
476
- # @private
477
- def match_prefixed #:nodoc:
478
- begin
479
- p0 = @scanner.pos
480
- begin
481
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>&)/) &&
482
- (r0_0 = match(:prefixable)) &&
483
- Assert.parsed(select_captures([r0_0]))
484
- end || begin
485
- @scanner.pos = p0
486
- false
487
- end
488
- end ||
489
- begin
490
- p0 = @scanner.pos
491
- begin
492
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>!)/) &&
493
- (r0_0 = match(:prefixable)) &&
494
- Disallow.parsed(select_captures([r0_0]))
495
- end || begin
496
- @scanner.pos = p0
497
- false
498
- end
499
- end ||
500
- begin
501
- p0 = @scanner.pos
502
- begin
503
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>~)/) &&
504
- (r0_0 = match(:prefixable)) &&
505
- Skip.parsed(select_captures([r0_0]))
506
- end || begin
507
- @scanner.pos = p0
508
- false
509
- end
510
- end ||
511
- begin
512
- p0 = @scanner.pos
513
- begin
514
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>@)/) &&
515
- (r0_0 = match(:prefixable)) &&
516
- Token.parsed(select_captures([r0_0]))
517
- end || begin
518
- @scanner.pos = p0
519
- false
520
- end
521
- end
570
+ def match_prefixable #:nodoc:
571
+ memoize :match_prefixable!
522
572
  end
523
573
 
524
574
  # @private
525
- def match_prefixable #:nodoc:
575
+ def match_prefixable! #:nodoc:
526
576
  match(:suffixed) ||
527
577
  match(:primary)
528
578
  end
529
579
 
530
580
  # @private
531
581
  def match_suffixed #:nodoc:
582
+ memoize :match_suffixed!
583
+ end
584
+
585
+ # @private
586
+ def match_suffixed! #:nodoc:
532
587
  begin
533
588
  p0 = @scanner.pos
534
589
  begin
@@ -544,16 +599,7 @@ module Rattler
544
599
  p0 = @scanner.pos
545
600
  begin
546
601
  (r0_0 = match(:primary)) &&
547
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\*)/) &&
548
- begin
549
- p1 = @scanner.pos
550
- r = !begin
551
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
552
- @scanner.skip(/\^/)
553
- end
554
- @scanner.pos = p1
555
- r
556
- end &&
602
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\*))(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>,))/) &&
557
603
  ZeroOrMore.parsed(select_captures([r0_0]))
558
604
  end || begin
559
605
  @scanner.pos = p0
@@ -564,16 +610,7 @@ module Rattler
564
610
  p0 = @scanner.pos
565
611
  begin
566
612
  (r0_0 = match(:primary)) &&
567
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\+)/) &&
568
- begin
569
- p1 = @scanner.pos
570
- r = !begin
571
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
572
- @scanner.skip(/\^/)
573
- end
574
- @scanner.pos = p1
575
- r
576
- end &&
613
+ @scanner.skip(/(?>(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\+))(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>,))/) &&
577
614
  OneOrMore.parsed(select_captures([r0_0]))
578
615
  end || begin
579
616
  @scanner.pos = p0
@@ -584,6 +621,11 @@ module Rattler
584
621
 
585
622
  # @private
586
623
  def match_primary #:nodoc:
624
+ memoize :match_primary!
625
+ end
626
+
627
+ # @private
628
+ def match_primary! #:nodoc:
587
629
  begin
588
630
  p0 = @scanner.pos
589
631
  begin
@@ -596,442 +638,169 @@ module Rattler
596
638
  false
597
639
  end
598
640
  end ||
599
- match(:atom)
600
- end
601
-
602
- # @private
603
- def match_atom #:nodoc:
604
641
  begin
605
- p0 = @scanner.pos
606
- begin
607
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
608
- (r0_0 = @scanner.scan(/(?>EOF)(?>(?![[:alnum:]_]))/)) &&
609
- Eof.parsed([r0_0])
610
- end || begin
611
- @scanner.pos = p0
612
- false
613
- end
642
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>EOF)(?![[:alnum:]_]))/) &&
643
+ Eof.parsed([])
614
644
  end ||
615
- ((r = match(:posix_class)) && (posix_class r)) ||
616
645
  begin
617
- p0 = @scanner.pos
618
- begin
619
- (r0_0 = match(:identifier)) &&
646
+ (r = begin
620
647
  begin
621
- p1 = @scanner.pos
622
- r = !begin
623
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
624
- @scanner.skip(/<\-/)
625
- end
626
- @scanner.pos = p1
627
- r
628
- end &&
629
- Apply.parsed(select_captures([r0_0]))
630
- end || begin
631
- @scanner.pos = p0
632
- false
633
- end
648
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>ALNUM)(?![[:alnum:]_]))/) &&
649
+ @scanner[1]
650
+ end ||
651
+ begin
652
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>ALPHA)(?![[:alnum:]_]))/) &&
653
+ @scanner[1]
654
+ end ||
655
+ begin
656
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>ASCII)(?![[:alnum:]_]))/) &&
657
+ @scanner[1]
658
+ end ||
659
+ begin
660
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>BLANK)(?![[:alnum:]_]))/) &&
661
+ @scanner[1]
662
+ end ||
663
+ begin
664
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>CNTRL)(?![[:alnum:]_]))/) &&
665
+ @scanner[1]
666
+ end ||
667
+ begin
668
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>DIGIT)(?![[:alnum:]_]))/) &&
669
+ @scanner[1]
670
+ end ||
671
+ begin
672
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>GRAPH)(?![[:alnum:]_]))/) &&
673
+ @scanner[1]
674
+ end ||
675
+ begin
676
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>LOWER)(?![[:alnum:]_]))/) &&
677
+ @scanner[1]
678
+ end ||
679
+ begin
680
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>PRINT)(?![[:alnum:]_]))/) &&
681
+ @scanner[1]
682
+ end ||
683
+ begin
684
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>PUNCT)(?![[:alnum:]_]))/) &&
685
+ @scanner[1]
686
+ end ||
687
+ begin
688
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>SPACE)(?![[:alnum:]_]))/) &&
689
+ @scanner[1]
690
+ end ||
691
+ begin
692
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>UPPER)(?![[:alnum:]_]))/) &&
693
+ @scanner[1]
694
+ end ||
695
+ begin
696
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>XDIGIT)(?![[:alnum:]_]))/) &&
697
+ @scanner[1]
698
+ end ||
699
+ begin
700
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>WORD)(?![[:alnum:]_]))/) &&
701
+ @scanner[1]
702
+ end ||
703
+ (fail! { "posix_class expected" })
704
+ end) && (posix_class r)
634
705
  end ||
635
- ((r = match(:literal)) && (literal r)) ||
636
- ((r = match(:word_literal)) && (word_literal r)) ||
637
- ((r = match(:class)) && (char_class r)) ||
638
- ((r = match(:regexp)) && Match.parsed([r])) ||
639
- begin
640
- @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\.)/) &&
641
- (Match[/./])
642
- end
643
- end
644
-
645
- # @private
646
- def match_posix_class #:nodoc:
647
706
  begin
648
707
  p0 = @scanner.pos
649
708
  begin
650
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
651
- @scanner.scan(/(?>ALNUM)(?>(?![[:alnum:]_]))/)
709
+ @scanner.skip(/(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>(?>EOF)(?![[:alnum:]_])))/) &&
710
+ (r0_0 = begin
711
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>[[:alnum:]_])+)/) &&
712
+ @scanner[1]
713
+ end) &&
714
+ @scanner.skip(/(?!(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?><\-))/) &&
715
+ Apply.parsed([r0_0])
652
716
  end || begin
653
717
  @scanner.pos = p0
654
718
  false
655
719
  end
656
720
  end ||
657
721
  begin
658
- p0 = @scanner.pos
659
- begin
660
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
661
- @scanner.scan(/(?>ALPHA)(?>(?![[:alnum:]_]))/)
662
- end || begin
663
- @scanner.pos = p0
664
- false
665
- end
666
- end ||
667
- begin
668
- p0 = @scanner.pos
669
- begin
670
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
671
- @scanner.scan(/(?>ASCII)(?>(?![[:alnum:]_]))/)
672
- end || begin
673
- @scanner.pos = p0
674
- false
675
- end
676
- end ||
677
- begin
678
- p0 = @scanner.pos
679
- begin
680
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
681
- @scanner.scan(/(?>BLANK)(?>(?![[:alnum:]_]))/)
682
- end || begin
683
- @scanner.pos = p0
684
- false
685
- end
686
- end ||
687
- begin
688
- p0 = @scanner.pos
689
- begin
690
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
691
- @scanner.scan(/(?>CNTRL)(?>(?![[:alnum:]_]))/)
692
- end || begin
693
- @scanner.pos = p0
694
- false
695
- end
696
- end ||
697
- begin
698
- p0 = @scanner.pos
699
- begin
700
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
701
- @scanner.scan(/(?>DIGIT)(?>(?![[:alnum:]_]))/)
702
- end || begin
703
- @scanner.pos = p0
704
- false
705
- end
706
- end ||
707
- begin
708
- p0 = @scanner.pos
709
- begin
710
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
711
- @scanner.scan(/(?>GRAPH)(?>(?![[:alnum:]_]))/)
712
- end || begin
713
- @scanner.pos = p0
714
- false
715
- end
716
- end ||
717
- begin
718
- p0 = @scanner.pos
719
- begin
720
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
721
- @scanner.scan(/(?>LOWER)(?>(?![[:alnum:]_]))/)
722
- end || begin
723
- @scanner.pos = p0
724
- false
725
- end
726
- end ||
727
- begin
728
- p0 = @scanner.pos
729
- begin
730
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
731
- @scanner.scan(/(?>PRINT)(?>(?![[:alnum:]_]))/)
732
- end || begin
733
- @scanner.pos = p0
734
- false
735
- end
736
- end ||
737
- begin
738
- p0 = @scanner.pos
739
- begin
740
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
741
- @scanner.scan(/(?>PUNCT)(?>(?![[:alnum:]_]))/)
742
- end || begin
743
- @scanner.pos = p0
744
- false
745
- end
746
- end ||
747
- begin
748
- p0 = @scanner.pos
749
- begin
750
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
751
- @scanner.scan(/(?>SPACE)(?>(?![[:alnum:]_]))/)
752
- end || begin
753
- @scanner.pos = p0
754
- false
755
- end
756
- end ||
757
- begin
758
- p0 = @scanner.pos
759
- begin
760
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
761
- @scanner.scan(/(?>UPPER)(?>(?![[:alnum:]_]))/)
762
- end || begin
763
- @scanner.pos = p0
764
- false
765
- end
766
- end ||
767
- begin
768
- p0 = @scanner.pos
769
- begin
770
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
771
- @scanner.scan(/(?>XDIGIT)(?>(?![[:alnum:]_]))/)
772
- end || begin
773
- @scanner.pos = p0
774
- false
775
- end
776
- end ||
777
- begin
778
- p0 = @scanner.pos
779
- begin
780
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
781
- @scanner.scan(/(?>WORD)(?>(?![[:alnum:]_]))/)
782
- end || begin
783
- @scanner.pos = p0
784
- false
785
- end
786
- end
787
- end
788
-
789
- # @private
790
- def match_literal #:nodoc:
791
- p0 = @scanner.pos
792
- begin
793
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
794
- @scanner.scan(/(["'])(?:\\.|(?:(?!\1).))*\1/)
795
- end || begin
796
- @scanner.pos = p0
797
- false
798
- end
799
- end
800
-
801
- # @private
802
- def match_word_literal #:nodoc:
803
- p0 = @scanner.pos
804
- begin
805
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
806
- @scanner.scan(/(?>`)(?>(?>(?>\\)(?>.)|[^`])*)(?>`)/)
807
- end || begin
808
- @scanner.pos = p0
809
- false
810
- end
811
- end
812
-
813
- # @private
814
- def match_class #:nodoc:
815
- p0 = @scanner.pos
816
- begin
817
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
818
- begin
819
- p1 = @scanner.pos
722
+ (r = begin
820
723
  begin
821
- @scanner.skip(/\[/) &&
822
- begin
823
- r = false
824
- while begin
825
- p2 = @scanner.pos
826
- begin
827
- @scanner.skip(/(?!\])/) &&
828
- match(:range) &&
829
- true
830
- end || begin
831
- @scanner.pos = p2
832
- false
833
- end
834
- end
835
- r = true
836
- end
837
- r
838
- end &&
839
- @scanner.skip(/\]/) &&
840
- @scanner.string[p1...(@scanner.pos)]
841
- end || begin
842
- @scanner.pos = p1
843
- false
844
- end
845
- end
846
- end || begin
847
- @scanner.pos = p0
848
- false
849
- end
850
- end
851
-
852
- # @private
853
- def match_regexp #:nodoc:
854
- p0 = @scanner.pos
855
- begin
856
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
857
- @scanner.scan(/\/(?:\\.|[^\/])+\/(?:[iomx]+(?!\w))?/)
858
- end || begin
859
- @scanner.pos = p0
860
- false
861
- end
862
- end
863
-
864
- # @private
865
- def match_name #:nodoc:
866
- match(:var_name) ||
867
- match(:constant)
868
- end
869
-
870
- # @private
871
- def match_identifier #:nodoc:
872
- p0 = @scanner.pos
873
- begin
874
- begin
875
- p1 = @scanner.pos
876
- r = !begin
877
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
878
- @scanner.skip(/(?>EOF)(?>(?![[:alnum:]_]))/)
879
- end
880
- @scanner.pos = p1
881
- r
882
- end &&
883
- begin
884
- p1 = @scanner.pos
724
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>")(?>(?>(?>\\)(?>.)|[^"])*)(?>"))/) &&
725
+ @scanner[1]
726
+ end ||
885
727
  begin
886
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
887
- @scanner.scan(/(?>[[:alnum:]_])+/)
888
- end || begin
889
- @scanner.pos = p1
890
- false
891
- end
892
- end
893
- end || begin
894
- @scanner.pos = p0
895
- false
896
- end
897
- end
898
-
899
- # @private
900
- def match_var_name #:nodoc:
901
- p0 = @scanner.pos
902
- begin
903
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
904
- @scanner.scan(/(?>[[:lower:]])(?>(?>[[:alnum:]_])*)/)
905
- end || begin
906
- @scanner.pos = p0
907
- false
908
- end
909
- end
910
-
911
- # @private
912
- def match_constant #:nodoc:
913
- p0 = @scanner.pos
914
- begin
915
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
916
- begin
917
- p1 = @scanner.pos
728
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>')(?>(?>(?>\\)(?>.)|[^'])*)(?>'))/) &&
729
+ @scanner[1]
730
+ end ||
731
+ begin
732
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%\()(?>(?>(?>\\)(?>.)|[^)])*)(?>\)))/) &&
733
+ @scanner[1]
734
+ end ||
918
735
  begin
736
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%\{)(?>(?>(?>\\)(?>.)|[^}])*)(?>\}))/) &&
737
+ @scanner[1]
738
+ end ||
739
+ begin
740
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%\[)(?>(?>(?>\\)(?>.)|[^\]])*)(?>\]))/) &&
741
+ @scanner[1]
742
+ end ||
743
+ begin
744
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>%<)(?>(?>(?>\\)(?>.)|[^>])*)(?>>))/) &&
745
+ @scanner[1]
746
+ end ||
747
+ begin
748
+ p0 = @scanner.pos
919
749
  begin
920
- while begin
921
- p2 = @scanner.pos
750
+ @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
751
+ begin
752
+ p1 = @scanner.pos
922
753
  begin
923
- match(:const_name) &&
924
- @scanner.skip(/::/) &&
925
- true
754
+ @scanner.skip(/%/) &&
755
+ (r1_0 = @scanner.scan(/[[:punct:]]/)) &&
756
+ begin
757
+ while begin
758
+ @scanner.skip(/(?>\\)(?>.)/) ||
759
+ begin
760
+ p2 = @scanner.pos
761
+ begin
762
+ @scanner.skip(/(?!#{r1_0})/) &&
763
+ @scanner.skip(/./) &&
764
+ true
765
+ end || begin
766
+ @scanner.pos = p2
767
+ false
768
+ end
769
+ end
770
+ end; end
771
+ true
772
+ end &&
773
+ @scanner.skip(/#{r1_0}/) &&
774
+ @scanner.string[p1...(@scanner.pos)]
926
775
  end || begin
927
- @scanner.pos = p2
776
+ @scanner.pos = p1
928
777
  false
929
778
  end
930
- end; end
931
- true
932
- end &&
933
- match(:const_name) &&
934
- @scanner.string[p1...(@scanner.pos)]
935
- end || begin
936
- @scanner.pos = p1
937
- false
779
+ end
780
+ end || begin
781
+ @scanner.pos = p0
782
+ false
783
+ end
938
784
  end
939
- end
940
- end || begin
941
- @scanner.pos = p0
942
- false
943
- end
944
- end
945
-
946
- # @private
947
- def match_const_name #:nodoc:
948
- p0 = @scanner.pos
785
+ end) && (literal r)
786
+ end ||
949
787
  begin
950
- @scanner.skip(/(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*/) &&
951
- @scanner.scan(/(?>[[:upper:]])(?>(?>[[:alnum:]_])*)/)
952
- end || begin
953
- @scanner.pos = p0
954
- false
955
- end
956
- end
957
-
958
- # @private
959
- def match_range #:nodoc:
788
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>`)(?>(?>(?>\\)(?>.)|[^`])*)(?>`))/) &&
789
+ (word_literal @scanner[1])
790
+ end ||
960
791
  begin
961
- p0 = @scanner.pos
962
- begin
963
- @scanner.skip(/\[:/) &&
964
- match(:posix_name) &&
965
- @scanner.skip(/:\]/) &&
966
- @scanner.string[p0...(@scanner.pos)]
967
- end || begin
968
- @scanner.pos = p0
969
- false
970
- end
792
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>\[)(?>(?>(?!\])(?>(?>\[:)(?>(?>alnum)(?![[:alnum:]_])|(?>alpha)(?![[:alnum:]_])|(?>ascii)(?![[:alnum:]_])|(?>blank)(?![[:alnum:]_])|(?>cntrl)(?![[:alnum:]_])|(?>digit)(?![[:alnum:]_])|(?>graph)(?![[:alnum:]_])|(?>lower)(?![[:alnum:]_])|(?>print)(?![[:alnum:]_])|(?>punct)(?![[:alnum:]_])|(?>space)(?![[:alnum:]_])|(?>upper)(?![[:alnum:]_])|(?>xdigit)(?![[:alnum:]_]))(?>:\])|(?>(?>\\)(?>[0-3])(?>[0-7])(?>[0-7])|(?>\\x)(?>[[:xdigit:]])(?>[[:xdigit:]])|(?>\\)(?>.)|[^\\\]])(?>(?>(?>\-)(?>(?>\\)(?>[0-3])(?>[0-7])(?>[0-7])|(?>\\x)(?>[[:xdigit:]])(?>[[:xdigit:]])|(?>\\)(?>.)|[^\\\]]))?)))+)(?>\]))/) &&
793
+ (char_class @scanner[1])
971
794
  end ||
972
795
  begin
973
- p0 = @scanner.pos
974
- begin
975
- match(:class_char) &&
976
- begin
977
- begin
978
- p1 = @scanner.pos
979
- begin
980
- @scanner.skip(/\-/) &&
981
- match(:class_char) &&
982
- true
983
- end || begin
984
- @scanner.pos = p1
985
- false
986
- end
987
- end
988
- true
989
- end &&
990
- @scanner.string[p0...(@scanner.pos)]
991
- end || begin
992
- @scanner.pos = p0
993
- false
994
- end
995
- end
996
- end
997
-
998
- # @private
999
- def match_posix_name #:nodoc:
1000
- @scanner.scan(/(?>alnum)(?>(?![[:alnum:]_]))/) ||
1001
- @scanner.scan(/(?>alpha)(?>(?![[:alnum:]_]))/) ||
1002
- @scanner.scan(/(?>ascii)(?>(?![[:alnum:]_]))/) ||
1003
- @scanner.scan(/(?>blank)(?>(?![[:alnum:]_]))/) ||
1004
- @scanner.scan(/(?>cntrl)(?>(?![[:alnum:]_]))/) ||
1005
- @scanner.scan(/(?>digit)(?>(?![[:alnum:]_]))/) ||
1006
- @scanner.scan(/(?>graph)(?>(?![[:alnum:]_]))/) ||
1007
- @scanner.scan(/(?>lower)(?>(?![[:alnum:]_]))/) ||
1008
- @scanner.scan(/(?>print)(?>(?![[:alnum:]_]))/) ||
1009
- @scanner.scan(/(?>punct)(?>(?![[:alnum:]_]))/) ||
1010
- @scanner.scan(/(?>space)(?>(?![[:alnum:]_]))/) ||
1011
- @scanner.scan(/(?>upper)(?>(?![[:alnum:]_]))/) ||
1012
- @scanner.scan(/(?>xdigit)(?>(?![[:alnum:]_]))/) ||
1013
- @scanner.scan(/(?>word)(?>(?![[:alnum:]_]))/)
1014
- end
1015
-
1016
- # @private
1017
- def match_class_char #:nodoc:
1018
- @scanner.scan(/(?>\\)(?>[0-3])(?>[0-7])(?>[0-7])|(?>\\x)(?>[[:xdigit:]])(?>[[:xdigit:]])|(?>\\)(?>.)|[^\\\]]/)
1019
- end
1020
-
1021
- # @private
1022
- def match_eol #:nodoc:
1023
- p0 = @scanner.pos
796
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)((?>\$)(?>[[:lower:]])(?>(?>[[:alnum:]_])*))/) &&
797
+ BackReference.parsed([@scanner[1]])
798
+ end ||
1024
799
  begin
1025
- @scanner.skip(/(?>[[:blank:]])*/) &&
1026
- begin
1027
- @scanner.eos? ||
1028
- @scanner.skip(/;|(?>(?>\r)?)(?>\n)|(?>\#)(?>(?>[^\n])*)/)
1029
- end &&
1030
- true
1031
- end || begin
1032
- @scanner.pos = p0
1033
- false
1034
- end
800
+ @scanner.skip(/(?>(?>(?>[[:space:]])+|(?>\#)(?>(?>[^\n])*))*)(?>\.)/) &&
801
+ (Match[/./])
802
+ end ||
803
+ (fail! { "atom expected" })
1035
804
  end
1036
805
 
1037
806
  end