citrus 2.2.0 → 2.2.1

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.
@@ -8,7 +8,7 @@ require 'strscan'
8
8
  module Citrus
9
9
  autoload :File, 'citrus/file'
10
10
 
11
- VERSION = [2, 2, 0]
11
+ VERSION = [2, 2, 1]
12
12
 
13
13
  # Returns the current version of Citrus as a string.
14
14
  def self.version
@@ -551,7 +551,6 @@ module Citrus
551
551
  input.memoize! if opts[:memoize]
552
552
  input.pos = opts[:offset] if opts[:offset] > 0
553
553
 
554
- start = input.pos
555
554
  events = input.exec(self)
556
555
  length = events[-1]
557
556
 
@@ -559,7 +558,7 @@ module Citrus
559
558
  raise ParseError.new(input)
560
559
  end
561
560
 
562
- Match.new(string.slice(start, length), events)
561
+ Match.new(string.slice(opts[:offset], length), events)
563
562
  end
564
563
 
565
564
  # The default set of options to use when parsing.
@@ -720,7 +719,18 @@ module Citrus
720
719
 
721
720
  # Returns an array of events for this rule on the given +input+.
722
721
  def exec(input, events=[])
723
- input.exec(rule, events)
722
+ events << id
723
+
724
+ index = events.size
725
+ start = index - 1
726
+ if input.exec(rule, events).size > index
727
+ events << CLOSE
728
+ events << events[-2]
729
+ else
730
+ events.slice!(start, events.size)
731
+ end
732
+
733
+ events
724
734
  end
725
735
  end
726
736
 
@@ -916,7 +926,18 @@ module Citrus
916
926
 
917
927
  # Returns an array of events for this rule on the given +input+.
918
928
  def exec(input, events=[])
919
- input.exec(rule, events)
929
+ events << id
930
+
931
+ index = events.size
932
+ start = index - 1
933
+ if input.exec(rule, events).size > index
934
+ events << CLOSE
935
+ events << events[-2]
936
+ else
937
+ events.slice!(start, events.size)
938
+ end
939
+
940
+ events
920
941
  end
921
942
 
922
943
  # Returns the Citrus notation of this rule as a string.
@@ -1135,11 +1156,6 @@ module Citrus
1135
1156
  end
1136
1157
  end
1137
1158
 
1138
- # Returns a reference to the Rule object that first created this match.
1139
- def creator
1140
- extenders.first
1141
- end
1142
-
1143
1159
  # Returns an array of Match objects that are submatches of this match in the
1144
1160
  # order they appeared in the input.
1145
1161
  def matches
@@ -1187,6 +1203,11 @@ module Citrus
1187
1203
  name ? find(name, false).first : matches.first
1188
1204
  end
1189
1205
 
1206
+ # The default value for a match is its string value. This method is
1207
+ # overridden in most cases to be more meaningful according to the desired
1208
+ # interpretation.
1209
+ alias value to_s
1210
+
1190
1211
  # Allows sub-matches of this match to be retrieved by name as instance
1191
1212
  # methods.
1192
1213
  def method_missing(sym, *args)
@@ -11,10 +11,10 @@ class AliasTest < Test::Unit::TestCase
11
11
  rule :a, :b
12
12
  rule :b, 'abc'
13
13
  }
14
- rule = grammar.rule(:a)
14
+ rule_a = grammar.rule(:a)
15
15
  rule_b = grammar.rule(:b)
16
- events = rule.exec(Input.new('abc'))
17
- assert_equal([rule_b.id, CLOSE, 3], events)
16
+ events = rule_a.exec(Input.new('abc'))
17
+ assert_equal([rule_a.id, rule_b.id, CLOSE, 3, CLOSE, 3], events)
18
18
  end
19
19
 
20
20
  def test_exec_miss
@@ -35,10 +35,10 @@ class AliasTest < Test::Unit::TestCase
35
35
  include grammar1
36
36
  rule :b, :a
37
37
  }
38
- rule = grammar2.rule(:b)
39
- rule_a = grammar1.rule(:a)
40
- events = rule.exec(Input.new('abc'))
41
- assert_equal([rule_a.id, CLOSE, 3], events)
38
+ rule_b2 = grammar2.rule(:b)
39
+ rule_a1 = grammar1.rule(:a)
40
+ events = rule_b2.exec(Input.new('abc'))
41
+ assert_equal([rule_b2.id, rule_a1.id, CLOSE, 3, CLOSE, 3], events)
42
42
  end
43
43
 
44
44
  def test_to_s
@@ -16,10 +16,17 @@ class SuperTest < Test::Unit::TestCase
16
16
  rule :a, any(ghi, sup)
17
17
  }
18
18
  rule_2a = grammar2.rule(:a)
19
+ rule_2a_sup = rule_2a.rules[1]
19
20
  rule_1a = grammar1.rule(:a)
20
21
 
21
22
  events = rule_2a.exec(Input.new('abc'))
22
- assert_equal([rule_2a.id, rule_1a.id, CLOSE, 3, CLOSE, 3], events)
23
+ assert_equal([
24
+ rule_2a.id,
25
+ rule_2a_sup.id,
26
+ rule_1a.id, CLOSE, 3,
27
+ CLOSE, 3,
28
+ CLOSE, 3
29
+ ], events)
23
30
 
24
31
  events = rule_2a.exec(Input.new('ghi'))
25
32
  assert_equal([rule_2a.id, ghi.id, CLOSE, 3, CLOSE, 3], events)
@@ -48,15 +55,32 @@ class SuperTest < Test::Unit::TestCase
48
55
  rule :a, any(sup, :b)
49
56
  rule :b, sup
50
57
  }
51
- rule_2a = grammar2.rule(:a)
52
58
  rule_1a = grammar1.rule(:a)
53
59
  rule_1b = grammar1.rule(:b)
60
+ rule_2a = grammar2.rule(:a)
61
+ rule_2a_sup = rule_2a.rules[0]
62
+ rule_2a_als = rule_2a.rules[1]
63
+ rule_2b = grammar2.rule(:b)
54
64
 
55
65
  events = rule_2a.exec(Input.new('abc'))
56
- assert_equal([rule_2a.id, rule_1a.id, CLOSE, 3, CLOSE, 3], events)
66
+ assert_equal([
67
+ rule_2a.id,
68
+ rule_2a_sup.id,
69
+ rule_1a.id, CLOSE, 3,
70
+ CLOSE, 3,
71
+ CLOSE, 3
72
+ ], events)
57
73
 
58
74
  events = rule_2a.exec(Input.new('def'))
59
- assert_equal([rule_2a.id, rule_1b.id, CLOSE, 3, CLOSE, 3], events)
75
+ assert_equal([
76
+ rule_2a.id,
77
+ rule_2a_als.id,
78
+ rule_2b.id,
79
+ rule_1b.id, CLOSE, 3,
80
+ CLOSE, 3,
81
+ CLOSE, 3,
82
+ CLOSE, 3
83
+ ], events)
60
84
  end
61
85
 
62
86
  def test_to_s
metadata CHANGED
@@ -1,12 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: citrus
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 2
7
- - 2
8
- - 0
9
- version: 2.2.0
4
+ version: 2.2.1
10
5
  platform: ruby
11
6
  authors:
12
7
  - Michael Jackson
@@ -14,22 +9,19 @@ autorequire:
14
9
  bindir: bin
15
10
  cert_chain: []
16
11
 
17
- date: 2010-11-11 00:00:00 -06:00
12
+ date: 2010-11-15 00:00:00 -08:00
18
13
  default_executable:
19
14
  dependencies:
20
15
  - !ruby/object:Gem::Dependency
21
16
  name: rake
22
- prerelease: false
23
- requirement: &id001 !ruby/object:Gem::Requirement
24
- none: false
17
+ type: :development
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
25
20
  requirements:
26
21
  - - ">="
27
22
  - !ruby/object:Gem::Version
28
- segments:
29
- - 0
30
23
  version: "0"
31
- type: :development
32
- version_requirements: *id001
24
+ version:
33
25
  description: Parsing Expressions for Ruby
34
26
  email: mjijackson@gmail.com
35
27
  executables: []
@@ -106,25 +98,21 @@ rdoc_options:
106
98
  require_paths:
107
99
  - lib
108
100
  required_ruby_version: !ruby/object:Gem::Requirement
109
- none: false
110
101
  requirements:
111
102
  - - ">="
112
103
  - !ruby/object:Gem::Version
113
- segments:
114
- - 0
115
104
  version: "0"
105
+ version:
116
106
  required_rubygems_version: !ruby/object:Gem::Requirement
117
- none: false
118
107
  requirements:
119
108
  - - ">="
120
109
  - !ruby/object:Gem::Version
121
- segments:
122
- - 0
123
110
  version: "0"
111
+ version:
124
112
  requirements: []
125
113
 
126
114
  rubyforge_project:
127
- rubygems_version: 1.3.7
115
+ rubygems_version: 1.3.5
128
116
  signing_key:
129
117
  specification_version: 3
130
118
  summary: Parsing Expressions for Ruby