ruby-cldr 0.0.1 → 0.0.2

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 (97) hide show
  1. data/Gemfile +7 -0
  2. data/Gemfile.lock +23 -0
  3. data/README.textile +9 -6
  4. data/VERSION +1 -1
  5. data/lib/cldr.rb +1 -1
  6. data/lib/cldr/data.rb +9 -29
  7. data/lib/cldr/download.rb +2 -2
  8. data/lib/cldr/export.rb +8 -2
  9. data/lib/cldr/export/code.rb +34 -0
  10. data/lib/cldr/export/code/numbers.rb +29 -0
  11. data/lib/cldr/export/data.rb +36 -0
  12. data/lib/cldr/export/data/base.rb +61 -0
  13. data/lib/cldr/export/data/calendars.rb +14 -0
  14. data/lib/cldr/export/data/calendars/gregorian.rb +142 -0
  15. data/lib/cldr/export/data/currencies.rb +28 -0
  16. data/lib/cldr/export/data/delimiters.rb +29 -0
  17. data/lib/cldr/export/data/languages.rb +19 -0
  18. data/lib/cldr/export/data/numbers.rb +67 -0
  19. data/lib/cldr/export/data/plurals.rb +41 -0
  20. data/lib/cldr/{data → export/data}/plurals/cldr_grammar.treetop +0 -0
  21. data/lib/cldr/export/data/plurals/grammar.rb +538 -0
  22. data/lib/cldr/export/data/plurals/rules.rb +119 -0
  23. data/lib/cldr/export/data/territories.rb +19 -0
  24. data/lib/cldr/export/data/timezones.rb +27 -0
  25. data/lib/cldr/export/data/units.rb +29 -0
  26. data/lib/cldr/export/ruby.rb +1 -1
  27. data/lib/cldr/export/yaml.rb +1 -1
  28. data/lib/cldr/format.rb +1 -97
  29. data/lib/cldr/format/currency.rb +1 -1
  30. data/lib/cldr/format/date.rb +1 -1
  31. data/lib/cldr/format/datetime.rb +14 -18
  32. data/lib/cldr/format/datetime/base.rb +1 -1
  33. data/lib/cldr/format/decimal.rb +1 -1
  34. data/lib/cldr/format/decimal/base.rb +1 -1
  35. data/lib/cldr/format/decimal/fraction.rb +1 -1
  36. data/lib/cldr/format/decimal/integer.rb +1 -1
  37. data/lib/cldr/format/decimal/number.rb +1 -1
  38. data/lib/cldr/format/percent.rb +1 -1
  39. data/lib/cldr/format/time.rb +1 -1
  40. data/lib/cldr/thor.rb +3 -3
  41. data/test/all.rb +1 -1
  42. data/test/export/code/numbers_test.rb +11 -0
  43. data/test/{data → export/data}/all.rb +1 -1
  44. data/test/{data → export/data}/calendars_test.rb +18 -18
  45. data/test/{data → export/data}/currencies_test.rb +6 -6
  46. data/test/{data → export/data}/delimiters_test.rb +6 -6
  47. data/test/{data → export/data}/languages_test.rb +6 -6
  48. data/test/{data → export/data}/numbers_test.rb +8 -8
  49. data/test/export/data/plurals_test.rb +141 -0
  50. data/test/{data → export/data}/territories_test.rb +6 -6
  51. data/test/{data → export/data}/timezones_test.rb +6 -6
  52. data/test/{data → export/data}/units_test.rb +6 -6
  53. data/test/export_test.rb +8 -8
  54. data/test/{formats → format}/all.rb +1 -1
  55. data/test/format/currency_test.rb +0 -0
  56. data/test/format/date_test.rb +265 -0
  57. data/test/format/datetime_test.rb +18 -0
  58. data/test/{formats → format}/decimal/fraction_test.rb +4 -4
  59. data/test/{formats → format}/decimal/integer_test.rb +17 -17
  60. data/test/{formats → format}/decimal/number_test.rb +19 -19
  61. data/test/{formats → format}/decimal_test.rb +5 -5
  62. data/test/format/percent_test.rb +0 -0
  63. data/test/format/time_test.rb +195 -0
  64. data/test/test_autotest.rb +36 -0
  65. data/test/test_helper.rb +16 -1
  66. metadata +124 -114
  67. data/lib/cldr/data/base.rb +0 -66
  68. data/lib/cldr/data/calendars.rb +0 -12
  69. data/lib/cldr/data/calendars/gregorian.rb +0 -124
  70. data/lib/cldr/data/currencies.rb +0 -26
  71. data/lib/cldr/data/delimiters.rb +0 -21
  72. data/lib/cldr/data/languages.rb +0 -17
  73. data/lib/cldr/data/numbers.rb +0 -60
  74. data/lib/cldr/data/plurals.rb +0 -39
  75. data/lib/cldr/data/plurals/grammar.rb +0 -536
  76. data/lib/cldr/data/plurals/rules.rb +0 -113
  77. data/lib/cldr/data/territories.rb +0 -17
  78. data/lib/cldr/data/timezones.rb +0 -25
  79. data/lib/cldr/data/units.rb +0 -25
  80. data/test/data/plurals_test.rb +0 -132
  81. data/test/formats/datetime/all.rb +0 -3
  82. data/test/formats/datetime/date_test.rb +0 -31
  83. data/test/formats/datetime/datetime_test.rb +0 -18
  84. data/test/formats/datetime/day_test.rb +0 -41
  85. data/test/formats/datetime/hour_test.rb +0 -79
  86. data/test/formats/datetime/minute_test.rb +0 -25
  87. data/test/formats/datetime/month_test.rb +0 -76
  88. data/test/formats/datetime/period_test.rb +0 -20
  89. data/test/formats/datetime/quarter_test.rb +0 -118
  90. data/test/formats/datetime/second_test.rb +0 -80
  91. data/test/formats/datetime/time_test.rb +0 -33
  92. data/test/formats/datetime/timezone_test.rb +0 -23
  93. data/test/formats/datetime/year_test.rb +0 -57
  94. data/test/formats/format_test.rb +0 -66
  95. data/test/formats/rails_compat/all.rb +0 -3
  96. data/test/formats/rails_compat/format_integer_test.rb +0 -56
  97. data/test/formats/rails_compat/format_number_test.rb +0 -134
@@ -1,66 +0,0 @@
1
- require 'core_ext/string/underscore'
2
- require 'core_ext/hash/deep_merge'
3
- require 'nokogiri'
4
-
5
- class Cldr
6
- module Data
7
- class Base < Hash
8
- attr_reader :locale
9
-
10
- def initialize(*args)
11
- hash = args.last.is_a?(Hash) ? args.pop : {}
12
- @locale = args.pop.to_sym unless args.empty?
13
- end
14
-
15
- def []=(keys, value)
16
- return if value.nil? || value.respond_to?(:empty?) && value.empty?
17
-
18
- keys = keys.to_s.split('.')
19
- last_key = keys.pop.to_sym
20
-
21
- target = keys.inject(self) { |target, key| target[key.to_sym] || target.store(key.to_sym, {}) }
22
- target.store(last_key, value)
23
- end
24
-
25
- def update(hash)
26
- hash.each { |key, value| self[key] = value }
27
- end
28
-
29
- protected
30
-
31
- def plural?(node)
32
- !!node.attribute('count')
33
- end
34
-
35
- def draft?(node)
36
- draft = node.attribute('draft')
37
- draft && draft.value == 'unconfirmed'
38
- end
39
-
40
- def name(node)
41
- node.name.underscore
42
- end
43
-
44
- def count(node)
45
- node.attribute('count').value
46
- end
47
-
48
- def select(*sources)
49
- doc.xpath(xpath(sources))
50
- end
51
-
52
- def xpath(sources)
53
- path = sources.map { |source| source.respond_to?(:path) ? source.path : source }.join('/')
54
- path =~ /^\/?\/ldml/ ? path : "//ldml/#{path}"
55
- end
56
-
57
- def doc
58
- @doc ||= Nokogiri::XML(File.read(path))
59
- end
60
-
61
- def path
62
- @path ||= "#{Cldr::Data.dir}/main/#{locale.to_s.gsub('-', '_')}.xml"
63
- end
64
- end
65
- end
66
- end
@@ -1,12 +0,0 @@
1
- class Cldr
2
- module Data
3
- class Calendars < Base
4
- autoload :Gregorian, 'cldr/data/calendars/gregorian'
5
-
6
- def initialize(locale)
7
- super
8
- self['calendars.gregorian'] = Gregorian.new(locale)
9
- end
10
- end
11
- end
12
- end
@@ -1,124 +0,0 @@
1
- class Cldr
2
- module Data
3
- class Calendars
4
- class Gregorian < Base
5
- def initialize(locale)
6
- super
7
- update(
8
- :months => contexts('month'),
9
- :days => contexts('day'),
10
- :eras => contexts('era'),
11
- :quarters => contexts('quarter'),
12
- :periods => periods,
13
- :fields => fields,
14
- :'formats.date' => formats('date'),
15
- :'formats.time' => formats('time'),
16
- :'formats.datetime' => formats('dateTime')
17
- )
18
- end
19
-
20
- def calendar
21
- @calendar ||= select('dates/calendars/calendar[@type="gregorian"]').first
22
- end
23
-
24
- def contexts(kind)
25
- select(calendar, "#{kind}s/#{kind}Context").inject({}) do |result, node|
26
- context = node.attribute('type').value.to_sym
27
- result[context] = widths(node, kind, context)
28
- result
29
- end
30
- end
31
-
32
- def widths(node, kind, context)
33
- select(node, "#{kind}Width").inject({}) do |result, node|
34
- width = node.attribute('type').value.to_sym
35
- result[width] = elements(node, kind, context, width)
36
- result
37
- end
38
- end
39
-
40
- def elements(node, kind, context, width)
41
- aliased = select(node, 'alias').first
42
- if aliased
43
- xpath_to_key(aliased.attribute('path').value, kind, context, width)
44
- else
45
- select(node, kind).inject({}) do |result, node|
46
- key = node.attribute('type').value
47
- key = key =~ /^\d*$/ ? key.to_i : key.to_sym
48
- result[key] = node.content
49
- result
50
- end
51
- end
52
- end
53
-
54
- def xpath_to_key(xpath, kind, context, width)
55
- kind = (xpath =~ %r(/([^\/]*)Width) && $1) || kind
56
- context = (xpath =~ %r(Context\[@type='([^\/]*)'\]) && $1) || context
57
- width = (xpath =~ %r(Width\[@type='([^\/]*)'\]) && $1) || width
58
- :"calendars.gregorian.#{kind}s.#{context}.#{width}"
59
- end
60
-
61
- def xpath_width
62
- end
63
-
64
- def periods
65
- am = select(calendar, "am").first
66
- pm = select(calendar, "pm").first
67
-
68
- result = {}
69
- result[:am] = am.content if am
70
- result[:pm] = pm.content if pm
71
- result
72
- end
73
-
74
- def eras
75
- base_path = calendar.path.gsub('/ldml/', '') + '/eras'
76
- keys = select("#{base_path}/*").map { |node| node.name }
77
-
78
- eras = keys.inject([]) do |result, name|
79
- path = "#{base_path}/#{name}/*"
80
- key = name.gsub('era', '').gsub(/s$/, '').downcase.to_sym
81
- result << extract(path, :key => lambda { |node| node.attribute('type').value.to_i rescue 0 },
82
- :value => lambda { |node| { key => node.content } })
83
- end
84
- eras.inject({}) { |result, data| result.deep_merge(data) }
85
- end
86
-
87
- def formats(type)
88
- formats = select(calendar, "#{type}Formats/#{type}FormatLength").inject({}) do |result, node|
89
- key = node.attribute('type').value.to_sym rescue :format
90
- result[key] = pattern(node, type)
91
- result
92
- end
93
- if default = default_format(type)
94
- formats = default.merge(formats)
95
- end
96
- formats
97
- end
98
-
99
- def default_format(type)
100
- if node = select(calendar, "#{type}Formats/default").first
101
- key = node.attribute('choice').value.to_sym
102
- { :default => :"calendars.gregorian.formats.#{type.downcase}.#{key}" }
103
- end
104
- end
105
-
106
- def pattern(node, type)
107
- select(node, "#{type}Format/pattern").inject({}) do |result, node|
108
- result[:pattern] = node.content
109
- result
110
- end
111
- end
112
-
113
- def fields
114
- select(calendar, "fields/field").inject({}) do |result, node|
115
- key = node.attribute('type').value.to_sym
116
- name = node.xpath('displayName').first
117
- result[key] = name.content if name
118
- result
119
- end
120
- end
121
- end
122
- end
123
- end
124
- end
@@ -1,26 +0,0 @@
1
- class Cldr
2
- module Data
3
- class Currencies < Base
4
- def initialize(locale)
5
- super
6
- self[:currencies] = currencies
7
- end
8
-
9
- def currencies
10
- select('numbers/currencies/*').inject({}) do |result, node|
11
- currency = self.currency(node)
12
- result[node.attribute('type').value.to_sym] = currency unless currency.empty?
13
- result
14
- end
15
- end
16
-
17
- def currency(node)
18
- select(node, 'displayName').inject({}) do |result, node|
19
- count = node.attribute('count') ? node.attribute('count').value.to_sym : :one
20
- result[count] = node.content unless draft?(node)
21
- result
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,21 +0,0 @@
1
- class Cldr
2
- module Data
3
- class Delimiters < Base
4
- def initialize(locale)
5
- super
6
- self[:'delimiters.quotes.default'] = quotes('quotation')
7
- self[:'delimiters.quotes.alternate'] = quotes('alternateQuotation')
8
- end
9
-
10
- def quotes(type)
11
- start = select("delimiters/#{type}Start").first
12
- end_ = select("delimiters/#{type}End").first
13
-
14
- result = {}
15
- result[:start] = start.content if start
16
- result[:end] = end_.content if end_
17
- result
18
- end
19
- end
20
- end
21
- end
@@ -1,17 +0,0 @@
1
- class Cldr
2
- module Data
3
- class Languages < Base
4
- def initialize(locale)
5
- super
6
- self[:languages] = languages
7
- end
8
-
9
- def languages
10
- @languages ||= select('localeDisplayNames/languages/language').inject({}) do |result, node|
11
- result[node.attribute('type').value.gsub('_', '-').to_sym] = node.content unless draft?(node)
12
- result
13
- end
14
- end
15
- end
16
- end
17
- end
@@ -1,60 +0,0 @@
1
- class Cldr
2
- module Data
3
- class Numbers < Base
4
- def initialize(locale)
5
- super
6
- self[:'numbers.symbols'] = symbols
7
- self[:'numbers.formats'] = {
8
- :decimal => {
9
- :patterns => {
10
- :default => format('decimal')
11
- }
12
- },
13
- :scientific => {
14
- :patterns => {
15
- :default => format('scientific')
16
- }
17
- },
18
- :percent => {
19
- :patterns => {
20
- :default => format('percent')
21
- }
22
- },
23
- :currency => {
24
- :patterns => {
25
- :default => format('currency')
26
- }
27
- },
28
- }
29
- self[:'numbers.formats.currency.unit'] = unit
30
- end
31
-
32
- def currency
33
- currency = format('currency')
34
- currency.update(:unit => unit) unless unit.empty?
35
- currency
36
- end
37
-
38
- def symbols
39
- select('numbers/symbols/*').inject({}) do |result, node|
40
- result[name(node).to_sym] = node.content unless draft?(node)
41
- result
42
- end
43
- end
44
-
45
- def format(type)
46
- select("numbers/#{type}Formats/#{type}FormatLength/#{type}Format/pattern").inject({}) do |result, node|
47
- node.content unless draft?(node)
48
- end
49
- end
50
-
51
- def unit
52
- @unit ||= select("numbers/currencyFormats/unitPattern").inject({}) do |result, node|
53
- count = node.attribute('count').value rescue 'one'
54
- result[count] = node.content
55
- result
56
- end
57
- end
58
- end
59
- end
60
- end
@@ -1,39 +0,0 @@
1
- require 'fileutils'
2
-
3
- class Cldr
4
- module Data
5
- class Plurals < String
6
- autoload :Grammar, 'cldr/data/plurals/grammar'
7
- autoload :Parser, 'cldr/data/plurals/grammar'
8
- autoload :Rules, 'cldr/data/plurals/rules'
9
- autoload :Rule, 'cldr/data/plurals/rules'
10
- autoload :Proposition, 'cldr/data/plurals/rules'
11
- autoload :Expression, 'cldr/data/plurals/rules'
12
-
13
- class << self
14
- def rules
15
- @@rules ||= Rules.parse(source)
16
- end
17
-
18
- def source
19
- File.read("#{Cldr::Data.dir}/supplemental/plurals.xml")
20
- end
21
- end
22
-
23
- attr_reader :locale
24
-
25
- def initialize(locale)
26
- @locale = locale
27
- super(rule ? ruby : "")
28
- end
29
-
30
- def ruby
31
- "{ :#{locale} => { :i18n => {:plural => { :keys => #{rule.keys.inspect}, :rule => #{rule.to_ruby} } } } }"
32
- end
33
-
34
- def rule
35
- @rule = Plurals.rules.rule(locale)
36
- end
37
- end
38
- end
39
- end
@@ -1,536 +0,0 @@
1
- # http://unicode.org/draft/reports/tr35/tr35.html#Language_Plural_Rules
2
- #
3
- # condition = and_condition ('or' and_condition)*
4
- # and_condition = relation ('and' relation)*
5
- # relation = is_relation | in_relation | within_relation | 'n' <EOL>
6
- # is_relation = expr 'is' ('not')? value
7
- # in_relation = expr ('not')? 'in' range
8
- # within_relation = expr ('not')? 'within' range
9
- # expr = 'n' ('mod' value)?
10
- # value = digit+
11
- # digit = 0|1|2|3|4|5|6|7|8|9
12
- # range = value'..'value
13
-
14
- class Cldr
15
- module Data
16
- class Plurals
17
- module Grammar
18
- include Treetop::Runtime
19
-
20
- def root
21
- @root || :or_condition
22
- end
23
-
24
- module OrCondition0
25
- def and_condition
26
- elements[1]
27
- end
28
- end
29
-
30
- module OrCondition1
31
- def and_condition
32
- elements[0]
33
- end
34
-
35
- end
36
-
37
- def _nt_or_condition
38
- start_index = index
39
- if node_cache[:or_condition].has_key?(index)
40
- cached = node_cache[:or_condition][index]
41
- @index = cached.interval.end if cached
42
- return cached
43
- end
44
-
45
- i0, s0 = index, []
46
- r1 = _nt_and_condition
47
- s0 << r1
48
- if r1
49
- i3, s3 = index, []
50
- if input.index(" or ", index) == index
51
- r4 = instantiate_node(SyntaxNode,input, index...(index + 4))
52
- @index += 4
53
- else
54
- terminal_parse_failure(" or ")
55
- r4 = nil
56
- end
57
- s3 << r4
58
- if r4
59
- r5 = _nt_and_condition
60
- s3 << r5
61
- end
62
- if s3.last
63
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
64
- r3.extend(OrCondition0)
65
- else
66
- self.index = i3
67
- r3 = nil
68
- end
69
- if r3
70
- r2 = r3
71
- else
72
- r2 = instantiate_node(SyntaxNode,input, index...index)
73
- end
74
- s0 << r2
75
- end
76
- if s0.last
77
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
78
- r0.extend(OrCondition1)
79
- else
80
- self.index = i0
81
- r0 = nil
82
- end
83
-
84
- node_cache[:or_condition][start_index] = r0
85
-
86
- return r0
87
- end
88
-
89
- module AndCondition0
90
- def relation
91
- elements[1]
92
- end
93
- end
94
-
95
- module AndCondition1
96
- def relation
97
- elements[0]
98
- end
99
-
100
- end
101
-
102
- def _nt_and_condition
103
- start_index = index
104
- if node_cache[:and_condition].has_key?(index)
105
- cached = node_cache[:and_condition][index]
106
- @index = cached.interval.end if cached
107
- return cached
108
- end
109
-
110
- i0, s0 = index, []
111
- r1 = _nt_relation
112
- s0 << r1
113
- if r1
114
- i3, s3 = index, []
115
- if input.index(" and ", index) == index
116
- r4 = instantiate_node(SyntaxNode,input, index...(index + 5))
117
- @index += 5
118
- else
119
- terminal_parse_failure(" and ")
120
- r4 = nil
121
- end
122
- s3 << r4
123
- if r4
124
- r5 = _nt_relation
125
- s3 << r5
126
- end
127
- if s3.last
128
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
129
- r3.extend(AndCondition0)
130
- else
131
- self.index = i3
132
- r3 = nil
133
- end
134
- if r3
135
- r2 = r3
136
- else
137
- r2 = instantiate_node(SyntaxNode,input, index...index)
138
- end
139
- s0 << r2
140
- end
141
- if s0.last
142
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
143
- r0.extend(AndCondition1)
144
- else
145
- self.index = i0
146
- r0 = nil
147
- end
148
-
149
- node_cache[:and_condition][start_index] = r0
150
-
151
- return r0
152
- end
153
-
154
- def _nt_relation
155
- start_index = index
156
- if node_cache[:relation].has_key?(index)
157
- cached = node_cache[:relation][index]
158
- @index = cached.interval.end if cached
159
- return cached
160
- end
161
-
162
- i0 = index
163
- r1 = _nt_is_relation
164
- if r1
165
- r0 = r1
166
- else
167
- r2 = _nt_in_relation
168
- if r2
169
- r0 = r2
170
- else
171
- r3 = _nt_within_relation
172
- if r3
173
- r0 = r3
174
- else
175
- if input.index("n", index) == index
176
- r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
177
- @index += 1
178
- else
179
- terminal_parse_failure("n")
180
- r4 = nil
181
- end
182
- if r4
183
- r0 = r4
184
- else
185
- self.index = i0
186
- r0 = nil
187
- end
188
- end
189
- end
190
- end
191
-
192
- node_cache[:relation][start_index] = r0
193
-
194
- return r0
195
- end
196
-
197
- module IsRelation0
198
- def expr
199
- elements[0]
200
- end
201
-
202
- def value
203
- elements[3]
204
- end
205
- end
206
-
207
- def _nt_is_relation
208
- start_index = index
209
- if node_cache[:is_relation].has_key?(index)
210
- cached = node_cache[:is_relation][index]
211
- @index = cached.interval.end if cached
212
- return cached
213
- end
214
-
215
- i0, s0 = index, []
216
- r1 = _nt_expr
217
- s0 << r1
218
- if r1
219
- if input.index(" is ", index) == index
220
- r2 = instantiate_node(SyntaxNode,input, index...(index + 4))
221
- @index += 4
222
- else
223
- terminal_parse_failure(" is ")
224
- r2 = nil
225
- end
226
- s0 << r2
227
- if r2
228
- if input.index("not ", index) == index
229
- r4 = instantiate_node(SyntaxNode,input, index...(index + 4))
230
- @index += 4
231
- else
232
- terminal_parse_failure("not ")
233
- r4 = nil
234
- end
235
- if r4
236
- r3 = r4
237
- else
238
- r3 = instantiate_node(SyntaxNode,input, index...index)
239
- end
240
- s0 << r3
241
- if r3
242
- r5 = _nt_value
243
- s0 << r5
244
- end
245
- end
246
- end
247
- if s0.last
248
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
249
- r0.extend(IsRelation0)
250
- else
251
- self.index = i0
252
- r0 = nil
253
- end
254
-
255
- node_cache[:is_relation][start_index] = r0
256
-
257
- return r0
258
- end
259
-
260
- module InRelation0
261
- def expr
262
- elements[0]
263
- end
264
-
265
- def range
266
- elements[3]
267
- end
268
- end
269
-
270
- def _nt_in_relation
271
- start_index = index
272
- if node_cache[:in_relation].has_key?(index)
273
- cached = node_cache[:in_relation][index]
274
- @index = cached.interval.end if cached
275
- return cached
276
- end
277
-
278
- i0, s0 = index, []
279
- r1 = _nt_expr
280
- s0 << r1
281
- if r1
282
- if input.index(" not", index) == index
283
- r3 = instantiate_node(SyntaxNode,input, index...(index + 4))
284
- @index += 4
285
- else
286
- terminal_parse_failure(" not")
287
- r3 = nil
288
- end
289
- if r3
290
- r2 = r3
291
- else
292
- r2 = instantiate_node(SyntaxNode,input, index...index)
293
- end
294
- s0 << r2
295
- if r2
296
- if input.index(" in ", index) == index
297
- r4 = instantiate_node(SyntaxNode,input, index...(index + 4))
298
- @index += 4
299
- else
300
- terminal_parse_failure(" in ")
301
- r4 = nil
302
- end
303
- s0 << r4
304
- if r4
305
- r5 = _nt_range
306
- s0 << r5
307
- end
308
- end
309
- end
310
- if s0.last
311
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
312
- r0.extend(InRelation0)
313
- else
314
- self.index = i0
315
- r0 = nil
316
- end
317
-
318
- node_cache[:in_relation][start_index] = r0
319
-
320
- return r0
321
- end
322
-
323
- module WithinRelation0
324
- def expr
325
- elements[0]
326
- end
327
-
328
- def range
329
- elements[3]
330
- end
331
- end
332
-
333
- def _nt_within_relation
334
- start_index = index
335
- if node_cache[:within_relation].has_key?(index)
336
- cached = node_cache[:within_relation][index]
337
- @index = cached.interval.end if cached
338
- return cached
339
- end
340
-
341
- i0, s0 = index, []
342
- r1 = _nt_expr
343
- s0 << r1
344
- if r1
345
- if input.index(" not", index) == index
346
- r3 = instantiate_node(SyntaxNode,input, index...(index + 4))
347
- @index += 4
348
- else
349
- terminal_parse_failure(" not")
350
- r3 = nil
351
- end
352
- if r3
353
- r2 = r3
354
- else
355
- r2 = instantiate_node(SyntaxNode,input, index...index)
356
- end
357
- s0 << r2
358
- if r2
359
- if input.index(" within ", index) == index
360
- r4 = instantiate_node(SyntaxNode,input, index...(index + 8))
361
- @index += 8
362
- else
363
- terminal_parse_failure(" within ")
364
- r4 = nil
365
- end
366
- s0 << r4
367
- if r4
368
- r5 = _nt_range
369
- s0 << r5
370
- end
371
- end
372
- end
373
- if s0.last
374
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
375
- r0.extend(WithinRelation0)
376
- else
377
- self.index = i0
378
- r0 = nil
379
- end
380
-
381
- node_cache[:within_relation][start_index] = r0
382
-
383
- return r0
384
- end
385
-
386
- module Expr0
387
- def value
388
- elements[1]
389
- end
390
- end
391
-
392
- module Expr1
393
- end
394
-
395
- def _nt_expr
396
- start_index = index
397
- if node_cache[:expr].has_key?(index)
398
- cached = node_cache[:expr][index]
399
- @index = cached.interval.end if cached
400
- return cached
401
- end
402
-
403
- i0, s0 = index, []
404
- if input.index("n", index) == index
405
- r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
406
- @index += 1
407
- else
408
- terminal_parse_failure("n")
409
- r1 = nil
410
- end
411
- s0 << r1
412
- if r1
413
- i3, s3 = index, []
414
- if input.index(" mod ", index) == index
415
- r4 = instantiate_node(SyntaxNode,input, index...(index + 5))
416
- @index += 5
417
- else
418
- terminal_parse_failure(" mod ")
419
- r4 = nil
420
- end
421
- s3 << r4
422
- if r4
423
- r5 = _nt_value
424
- s3 << r5
425
- end
426
- if s3.last
427
- r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
428
- r3.extend(Expr0)
429
- else
430
- self.index = i3
431
- r3 = nil
432
- end
433
- if r3
434
- r2 = r3
435
- else
436
- r2 = instantiate_node(SyntaxNode,input, index...index)
437
- end
438
- s0 << r2
439
- end
440
- if s0.last
441
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
442
- r0.extend(Expr1)
443
- else
444
- self.index = i0
445
- r0 = nil
446
- end
447
-
448
- node_cache[:expr][start_index] = r0
449
-
450
- return r0
451
- end
452
-
453
- module Range0
454
- def value
455
- elements[0]
456
- end
457
-
458
- def value
459
- elements[2]
460
- end
461
- end
462
-
463
- def _nt_range
464
- start_index = index
465
- if node_cache[:range].has_key?(index)
466
- cached = node_cache[:range][index]
467
- @index = cached.interval.end if cached
468
- return cached
469
- end
470
-
471
- i0, s0 = index, []
472
- r1 = _nt_value
473
- s0 << r1
474
- if r1
475
- if input.index("..", index) == index
476
- r2 = instantiate_node(SyntaxNode,input, index...(index + 2))
477
- @index += 2
478
- else
479
- terminal_parse_failure("..")
480
- r2 = nil
481
- end
482
- s0 << r2
483
- if r2
484
- r3 = _nt_value
485
- s0 << r3
486
- end
487
- end
488
- if s0.last
489
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
490
- r0.extend(Range0)
491
- else
492
- self.index = i0
493
- r0 = nil
494
- end
495
-
496
- node_cache[:range][start_index] = r0
497
-
498
- return r0
499
- end
500
-
501
- def _nt_value
502
- start_index = index
503
- if node_cache[:value].has_key?(index)
504
- cached = node_cache[:value][index]
505
- @index = cached.interval.end if cached
506
- return cached
507
- end
508
-
509
- s0, i0 = [], index
510
- loop do
511
- if input.index(Regexp.new('[0-9]'), index) == index
512
- r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
513
- @index += 1
514
- else
515
- r1 = nil
516
- end
517
- if r1
518
- s0 << r1
519
- else
520
- break
521
- end
522
- end
523
- r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
524
-
525
- node_cache[:value][start_index] = r0
526
-
527
- return r0
528
- end
529
- end
530
- end
531
-
532
- class Parser < Treetop::Runtime::CompiledParser
533
- include Grammar
534
- end
535
- end
536
- end