rattler 0.3.0 → 0.4.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 (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