surpass 0.0.9 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,26 @@
1
+ # The list of files that should be ignored by Mr Bones.
2
+ # Lines that start with '#' are comments.
3
+ #
4
+ # A .gitignore file can be used instead by setting it as the ignore
5
+ # file in your Rakefile:
6
+ #
7
+ # PROJ.ignore_file = '.gitignore'
8
+ #
9
+ # For a project with a C extension, the following would be a good set of
10
+ # exclude patterns (uncomment them if you want to use them):
11
+ # *.[oa]
12
+ # *~
13
+ announcement.txt
14
+ coverage
15
+ doc
16
+ pkg
17
+ .DS_Store
18
+ .bzr
19
+ .bzrignore
20
+ examples
21
+ debug-examples
22
+ webby
23
+ stats
24
+ spec
25
+ *.swp
26
+
data/Rakefile CHANGED
@@ -26,3 +26,12 @@ desc "run antlr compiler"
26
26
  task :antlr do
27
27
  `cd lib/surpass; antlr4ruby ExcelFormula.g`
28
28
  end
29
+
30
+ desc "run examples"
31
+ task :examples do
32
+ `rm examples/*.xls`
33
+ `cd examples; ls *.rb`.chomp.split.each do |f|
34
+ next if f =~ /big/
35
+ `jruby #{File.expand_path(f, "examples")}`
36
+ end
37
+ end
@@ -1,7 +1,7 @@
1
1
  module Surpass
2
2
 
3
3
  # :stopdoc:
4
- VERSION = '0.0.9'
4
+ VERSION = '0.1.0'
5
5
  LIBPATH = ::File.expand_path(::File.dirname(__FILE__)) + ::File::SEPARATOR
6
6
  PATH = ::File.dirname(LIBPATH) + ::File::SEPARATOR
7
7
  # :startdoc:
@@ -41,6 +41,7 @@ module Surpass
41
41
  Dir.glob(search_me).sort.each do |rb|
42
42
  next if File.basename(rb) === File.basename(__FILE__) # skip surpass.rb
43
43
  next if File.basename(rb) =~ /^ExcelFormula/ unless FORMULAS_AVAILABLE
44
+ next if File.basename(rb) =~ /^excel_magic/ # already loaded this
44
45
  require rb
45
46
  end
46
47
  end
@@ -56,6 +57,8 @@ rescue Exception => e
56
57
  FORMULAS_AVAILABLE = false
57
58
  end
58
59
 
60
+ require File.join(File.dirname(__FILE__), 'surpass', 'excel_magic')
61
+ include ExcelMagic
59
62
  Surpass.require_all_libs_relative_to(__FILE__)
60
63
  require 'date'
61
64
 
@@ -1,8 +1,8 @@
1
1
  grammar ExcelFormula;
2
2
 
3
3
  options {
4
- language = Ruby;
5
- k = 2;
4
+ language = Ruby;
5
+ k = 2;
6
6
  }
7
7
 
8
8
  @header {
@@ -75,12 +75,12 @@ prec2_expr[arg_type]
75
75
  ;
76
76
 
77
77
  prec3_expr[arg_type]
78
- : prec5_expr[arg_type]
78
+ : prec4_expr[arg_type]
79
79
  (
80
80
  (
81
81
  POWER { op = [PTGPOWER].pack('C') }
82
82
  )
83
- prec5_expr[arg_type] { @rpn += op }
83
+ prec4_expr[arg_type] { @rpn += op }
84
84
  )*
85
85
  ;
86
86
 
@@ -126,31 +126,33 @@ primary[arg_type]
126
126
  | ref2d_tok = REF2D
127
127
  {
128
128
  r, c = Utilities.cell_to_packed_rowcol(ref2d_tok.text)
129
- ptg = PTGREFR + RVA_DELTA[arg_type]
129
+ ptg = PTGREFR + RVA_DELTA_REF[arg_type]
130
130
  @rpn += [ptg, r, c].pack("Cv2")
131
131
  }
132
132
  | ref2d1_tok = REF2D COLON ref2d2_tok = REF2D
133
133
  {
134
134
  r1, c1 = Utilities.cell_to_packed_rowcol(ref2d1_tok.text)
135
135
  r2, c2 = Utilities.cell_to_packed_rowcol(ref2d2_tok.text)
136
- ptg = PTGAREAR + RVA_DELTA[arg_type]
136
+ ptg = PTGAREAR + RVA_DELTA_AREA[arg_type]
137
137
  @rpn += [ptg, r1, r2, c1, c2].pack("Cv4")
138
138
  }
139
-
139
+ | LP expr[arg_type] RP
140
+ {
141
+ @rpn += [PTGPAREN].pack('C')
142
+ }
140
143
  | sheet1 = sheet
141
144
  {
142
145
  sheet2 = sheet1
143
146
  }
144
147
  ( COLON sheet2 = sheet )? BANG ref3d_ref2d=REF2D
145
148
  {
146
- ptg = PTGREF3DR + RVA_DELTA[arg_type]
147
- rpn_ref2d = ""
149
+ ptg = PTGREF3DR + RVA_DELTA_REF[arg_type]
148
150
  r1, c1 = Utilities.cell_to_packed_rowcol(ref3d_ref2d.text)
149
151
  rpn_ref2d = [0x0000, r1, c1].pack("v3")
150
152
  }
151
153
  ( COLON ref3d_ref2d2= REF2D
152
154
  {
153
- ptg = PTGAREA3DR + RVA_DELTA[arg_type]
155
+ ptg = PTGAREA3DR + RVA_DELTA_AREA[arg_type]
154
156
  r2, c2 = Utilities.cell_to_packed_rowcol(ref3d_ref2d2.text)
155
157
  rpn_ref2d = [0x0000, r1, r2, c1, c2].pack("v5")
156
158
  }
@@ -169,19 +171,17 @@ primary[arg_type]
169
171
  expr[arg_type] (SEMICOLON | COMMA)
170
172
  {
171
173
  @rpn += [PTGATTR, 0x08, 0].pack("C2v") # tAttrSkip
172
- pos1 = @rpn.length - 2
174
+ pos1 = @rpn.size - 2
173
175
 
174
- rem = @rpn.length - (pos0 + 2)
175
- @rpn = @rpn[0..pos0] + [pos1-pos0].pack("v") + @rpn[pos0+2, rem] # TODO Check for OBO
176
+ @rpn = @rpn[0...pos0] + [pos1-pos0].pack("v") + @rpn[(pos0+2)...(@rpn.size)]
176
177
  }
177
178
  expr[arg_type] RP
178
179
  {
179
180
  @rpn += [PTGATTR, 0x08, 3].pack("C2v") # tAttrSkip
180
181
  @rpn += [PTGFUNCVARR, 3, 1].pack("C2v") # 3 = nargs, 1 = IF func
181
- pos2 = @rpn.length
182
+ pos2 = @rpn.size
182
183
 
183
- rem = @rpn.length - (pos1 + 2)
184
- @rpn = @rpn[0..pos1] + [pos2-(pos1+2)-1].pack("v") + @rpn[pos1+2, rem] # TODO Check for OBO
184
+ @rpn = @rpn[0...pos1] + [pos2-(pos1+2)-1].pack("v") + @rpn[(pos1+2)...(@rpn.size)]
185
185
  }
186
186
  | FUNC_CHOOSE
187
187
  {
@@ -190,39 +190,39 @@ primary[arg_type]
190
190
  }
191
191
  LP expr["V"]
192
192
  {
193
- rpn_start = @rpn.length
194
- ref_markers = [@sheet_references.length]
193
+ rpn_start = @rpn.size
194
+ ref_markers = [@sheet_references.size]
195
195
  }
196
196
  (
197
197
  (SEMICOLON | COMMA)
198
- { mark = @rpn.length }
198
+ { mark = @rpn.size }
199
199
  (
200
200
  expr[arg_type]
201
201
  | { @rpn += [PTGMISSARG].pack("C") }
202
202
  )
203
203
  {
204
- rem = @rpn.length - mark
204
+ rem = @rpn.size - mark
205
205
  rpn_chunks << @rpn[mark, rem]
206
206
  ref_markers << @sheet_references.size
207
207
  }
208
208
  )*
209
209
  RP
210
210
  {
211
- @rpn = @rpn[0..rpn_start]
211
+ @rpn = @rpn[0...rpn_start]
212
212
  nc = rpn_chunks.length
213
213
  chunklens = rpn_chunks.collect {|c| c.length}
214
214
  skiplens = [0] * nc
215
- skiplens[-1] = 3
215
+ skiplens[nc-1] = 3
216
216
 
217
217
  (nc-1).downto(1) do |i|
218
218
  skiplens[i-1] = skiplens[i] + chunklens[i] + 4
219
219
  end
220
- jump_pos = [2 * nc + 2]
220
+ jump_pos = [2*nc + 2]
221
221
 
222
222
  (0...nc).each do |i|
223
- jump_pos.append(jump_pos[-1] + chunklens[ic] + 4)
223
+ jump_pos << (jump_pos.last + chunklens[i] + 4)
224
224
  end
225
- chunk_shift = 2 * nc + 6 # size of tAttrChoose
225
+ chunk_shift = 2*nc + 6 # size of tAttrChoose
226
226
 
227
227
  (0...nc).each do |i|
228
228
  (ref_markers[i]...ref_markers[i+1]).each do |r|
@@ -266,7 +266,7 @@ primary[arg_type]
266
266
  LP arg_count = expr_list[arg_type_list, min_argc, max_argc] RP
267
267
  {
268
268
  if (arg_count > max_argc) || (arg_count < min_argc)
269
- raise "#{arg_count} parameters for function: #{func_tok.text}"
269
+ raise "incorrect number #{arg_count} of parameters for function: #{func_tok.text}"
270
270
  end
271
271
 
272
272
  if xcall
@@ -275,47 +275,58 @@ primary[arg_type]
275
275
  elsif (min_argc == max_argc)
276
276
  func_ptg = PTGFUNCR + RVA_DELTA[func_type]
277
277
  @rpn += [func_ptg, opcode].pack("Cv")
278
- elsif (arg_count == 1) && (func_tok.text.upcase == "SUM")
278
+ elsif (arg_count == 1) && (func_tok.text.upcase === "SUM")
279
279
  @rpn += [PTGATTR, 0x10, 0].pack("CCv") # tAttrSum
280
280
  else
281
- func_ptg = PTGFUNCVARR + RVA_DELTA[func_type]
281
+ func_ptg = PTGFUNCVARR + RVA_DELTA[func_type]
282
282
  @rpn += [func_ptg, arg_count, opcode].pack("CCv")
283
283
  end
284
284
  }
285
- | LP expr[arg_type] RP
286
- {
287
- @rpn += [PTGPAREN].pack('C')
288
- }
289
285
  ;
290
-
291
286
 
287
+ // Process arguments to a function.
292
288
  expr_list[arg_type_list, min_argc, max_argc] returns [arg_cnt]
293
- @members{
294
- arg_cnt = 0
295
- arg_type = arg_type_list[arg_cnt]
289
+ @init
290
+ {
291
+ arg_cnt = 0
292
+
293
+ # Set these for processing first argument,
294
+ # it's simpler because first argument type can't be '...'
295
+ arg_type = arg_type_list.first
296
+
297
+ # need to check for '-' for a fn with no arguments
298
+ arg_cnt += 1 unless arg_type === '-'
296
299
  }
297
- : expr[arg_type] { arg_cnt += 1 }
298
- (
299
- {
300
- if arg_cnt < arg_type_list.size
301
- arg_type = arg_type_list[arg_cnt]
302
- else
303
- arg_type = arg_type_list[-1]
304
- end
305
- if arg_type == "+"
306
- arg_type = arg_type_list[-2]
307
- end
308
- }
309
- (SEMICOLON | COMMA)
310
- (
311
- expr[arg_type]
312
- | { @rpn += [PTGMISSARG].pack("B") }
313
- )
314
- { arg_cnt += 1 }
315
- )*
316
- |
300
+ :
301
+ (expr[arg_type]
302
+ (
303
+ (SEMICOLON | COMMA) { arg_cnt += 1 }
304
+ (
305
+ // *either* we find an argument after the comma/semicolon in which case process it...
306
+ expr[arg_type]
307
+ {
308
+ if arg_cnt - 2 < arg_type_list.size
309
+ arg_type = arg_type_list[arg_cnt - 2]
310
+ else
311
+ if arg_type_list.last === "..."
312
+ # e.g. "V R ..." arbitrary number of args of type R
313
+ # this will always be last element in arg_type_list
314
+ # 2nd to last element will provide type
315
+ arg_type = arg_type_list[arg_type_list.size - 2]
316
+ else
317
+ # Just read last element normally.
318
+ arg_type = arg_type_list[arg_cnt - 2]
319
+ end
320
+ end
321
+ }
322
+ // ... *or* we have a missing argument and need to insert a placeholder
323
+ | { @rpn += [PTGMISSARG].pack("C") }
324
+ )
325
+ )*
326
+ )
327
+ | // Some functions have no arguments e.g. pi()
317
328
  ;
318
-
329
+
319
330
  sheet returns[ref]
320
331
  : sheet_ref_name = NAME
321
332
  { ref = sheet_ref_name.text }
@@ -325,7 +336,7 @@ sheet returns[ref]
325
336
  { ref = sheet_ref_quote.text[1, len(sheet_ref_quote.text) - 1].replace("''", "'") }
326
337
  ;
327
338
 
328
-
339
+
329
340
  EQ: '=';
330
341
  LT: '<';
331
342
  GT: '>';
@@ -345,7 +356,7 @@ COMMA: ',';
345
356
  LP: '(';
346
357
  RP: ')';
347
358
  CONCAT: '&';
348
- PERCENT: '%';
359
+ PERCENT: '\%';
349
360
  POWER: '^';
350
361
  BANG: '!';
351
362
 
@@ -357,8 +368,11 @@ STR_CONST: '"' (~'"')+ '"';
357
368
  REF2D: '$'? ('A'..'I')? ('A'..'Z') '$'? DIGIT+;
358
369
  TRUE_CONST: ('T'|'t') ('R'|'r') ('U'|'u') ('E'|'e') ;
359
370
  FALSE_CONST: ('F'|'f') ('A'|'a') ('L'|'l') ('S'|'s') ('E'|'e') ;
360
- NAME: '\w[\.\w]*' ;
361
371
  QUOTENAME: '\'(?:[^\']|\'\')*\'';
362
372
  FUNC_IF: 'IF';
363
373
  FUNC_CHOOSE: 'CHOOSE';
364
374
 
375
+ fragment ALPHA: 'a'..'z' | 'A'..'Z';
376
+ NAME: ALPHA+ ;
377
+
378
+ WS: (' ')+ {skip()};
@@ -4,26 +4,28 @@ NUM_CONST=21
4
4
  PERCENT=16
5
5
  REF2D=22
6
6
  CONCAT=10
7
- RP=29
8
- LP=26
7
+ RP=25
8
+ LP=24
9
9
  INT_CONST=20
10
10
  STR_CONST=19
11
11
  POWER=15
12
12
  SUB=12
13
13
  FUNC_CHOOSE=30
14
- SEMICOLON=27
15
- BANG=24
14
+ SEMICOLON=28
15
+ BANG=26
16
16
  TRUE_CONST=17
17
17
  MUL=13
18
+ ALPHA=34
18
19
  COLON=23
19
20
  NAME=31
20
21
  FALSE_CONST=18
21
- COMMA=28
22
+ WS=35
23
+ COMMA=29
22
24
  GT=6
23
25
  DIGIT=33
24
26
  EQ=4
25
27
  DIV=14
26
- FUNC_IF=25
28
+ FUNC_IF=27
27
29
  QUOTENAME=32
28
30
  LE=9
29
31
  NE=5
@@ -5,7 +5,7 @@
5
5
  # Generated using ANTLR version: 3.2.1-SNAPSHOT Dec 18, 2009 04:29:28
6
6
  # Ruby runtime library version: 1.3.1
7
7
  # Input grammar file: ExcelFormula.g
8
- # Generated at: 2010-05-03 16:34:32
8
+ # Generated at: 2010-06-13 10:19:27
9
9
  #
10
10
 
11
11
  # ~~~> start load path setup
@@ -67,13 +67,13 @@ module ExcelFormula
67
67
 
68
68
  # define the token constants
69
69
  define_tokens(:GE => 8, :LT => 7, :NUM_CONST => 21, :PERCENT => 16,
70
- :REF2D => 22, :CONCAT => 10, :RP => 29, :LP => 26, :INT_CONST => 20,
70
+ :REF2D => 22, :CONCAT => 10, :RP => 25, :LP => 24, :INT_CONST => 20,
71
71
  :STR_CONST => 19, :POWER => 15, :SUB => 12, :FUNC_CHOOSE => 30,
72
- :SEMICOLON => 27, :BANG => 24, :TRUE_CONST => 17, :EOF => -1,
73
- :MUL => 13, :COLON => 23, :FALSE_CONST => 18, :NAME => 31,
74
- :COMMA => 28, :GT => 6, :DIGIT => 33, :DIV => 14, :EQ => 4,
75
- :FUNC_IF => 25, :QUOTENAME => 32, :LE => 9, :ADD => 11,
76
- :NE => 5)
72
+ :SEMICOLON => 28, :BANG => 26, :TRUE_CONST => 17, :EOF => -1,
73
+ :MUL => 13, :ALPHA => 34, :COLON => 23, :FALSE_CONST => 18,
74
+ :NAME => 31, :WS => 35, :COMMA => 29, :GT => 6, :DIGIT => 33,
75
+ :DIV => 14, :EQ => 4, :FUNC_IF => 27, :QUOTENAME => 32,
76
+ :LE => 9, :ADD => 11, :NE => 5)
77
77
 
78
78
  end
79
79
 
@@ -91,13 +91,14 @@ module ExcelFormula
91
91
  RULE_NAMES = ["EQ", "LT", "GT", "NE", "LE", "GE", "ADD", "SUB", "MUL",
92
92
  "DIV", "COLON", "SEMICOLON", "COMMA", "LP", "RP", "CONCAT",
93
93
  "PERCENT", "POWER", "BANG", "DIGIT", "INT_CONST", "NUM_CONST",
94
- "STR_CONST", "REF2D", "TRUE_CONST", "FALSE_CONST", "NAME",
95
- "QUOTENAME", "FUNC_IF", "FUNC_CHOOSE"].freeze
94
+ "STR_CONST", "REF2D", "TRUE_CONST", "FALSE_CONST", "QUOTENAME",
95
+ "FUNC_IF", "FUNC_CHOOSE", "ALPHA", "NAME", "WS"].freeze
96
96
  RULE_METHODS = [:eq!, :lt!, :gt!, :ne!, :le!, :ge!, :add!, :sub!, :mul!,
97
97
  :div!, :colon!, :semicolon!, :comma!, :lp!, :rp!, :concat!,
98
98
  :percent!, :power!, :bang!, :digit!, :int_const!, :num_const!,
99
99
  :str_const!, :ref_2_d!, :true_const!, :false_const!,
100
- :name!, :quotename!, :func_if!, :func_choose!].freeze
100
+ :quotename!, :func_if!, :func_choose!, :alpha!, :name!,
101
+ :ws!].freeze
101
102
 
102
103
 
103
104
  def initialize(input=nil, options = {})
@@ -117,7 +118,7 @@ module ExcelFormula
117
118
 
118
119
 
119
120
  # - - - - main rule block - - - -
120
- # at line 329:5: '='
121
+ # at line 340:5: '='
121
122
  match(?=)
122
123
 
123
124
 
@@ -141,7 +142,7 @@ module ExcelFormula
141
142
 
142
143
 
143
144
  # - - - - main rule block - - - -
144
- # at line 330:5: '<'
145
+ # at line 341:5: '<'
145
146
  match(?<)
146
147
 
147
148
 
@@ -165,7 +166,7 @@ module ExcelFormula
165
166
 
166
167
 
167
168
  # - - - - main rule block - - - -
168
- # at line 331:5: '>'
169
+ # at line 342:5: '>'
169
170
  match(?>)
170
171
 
171
172
 
@@ -189,7 +190,7 @@ module ExcelFormula
189
190
 
190
191
 
191
192
  # - - - - main rule block - - - -
192
- # at line 332:5: '<>'
193
+ # at line 343:5: '<>'
193
194
  match("<>")
194
195
 
195
196
 
@@ -213,7 +214,7 @@ module ExcelFormula
213
214
 
214
215
 
215
216
  # - - - - main rule block - - - -
216
- # at line 333:5: '<='
217
+ # at line 344:5: '<='
217
218
  match("<=")
218
219
 
219
220
 
@@ -237,7 +238,7 @@ module ExcelFormula
237
238
 
238
239
 
239
240
  # - - - - main rule block - - - -
240
- # at line 334:5: '>='
241
+ # at line 345:5: '>='
241
242
  match(">=")
242
243
 
243
244
 
@@ -261,7 +262,7 @@ module ExcelFormula
261
262
 
262
263
 
263
264
  # - - - - main rule block - - - -
264
- # at line 336:6: '+'
265
+ # at line 347:6: '+'
265
266
  match(?+)
266
267
 
267
268
 
@@ -285,7 +286,7 @@ module ExcelFormula
285
286
 
286
287
 
287
288
  # - - - - main rule block - - - -
288
- # at line 337:6: '-'
289
+ # at line 348:6: '-'
289
290
  match(?-)
290
291
 
291
292
 
@@ -309,7 +310,7 @@ module ExcelFormula
309
310
 
310
311
 
311
312
  # - - - - main rule block - - - -
312
- # at line 338:6: '*'
313
+ # at line 349:6: '*'
313
314
  match(?*)
314
315
 
315
316
 
@@ -333,7 +334,7 @@ module ExcelFormula
333
334
 
334
335
 
335
336
  # - - - - main rule block - - - -
336
- # at line 339:6: '/'
337
+ # at line 350:6: '/'
337
338
  match(?/)
338
339
 
339
340
 
@@ -357,7 +358,7 @@ module ExcelFormula
357
358
 
358
359
 
359
360
  # - - - - main rule block - - - -
360
- # at line 341:8: ':'
361
+ # at line 352:8: ':'
361
362
  match(?:)
362
363
 
363
364
 
@@ -381,7 +382,7 @@ module ExcelFormula
381
382
 
382
383
 
383
384
  # - - - - main rule block - - - -
384
- # at line 342:12: ';'
385
+ # at line 353:12: ';'
385
386
  match(?;)
386
387
 
387
388
 
@@ -405,7 +406,7 @@ module ExcelFormula
405
406
 
406
407
 
407
408
  # - - - - main rule block - - - -
408
- # at line 343:8: ','
409
+ # at line 354:8: ','
409
410
  match(?,)
410
411
 
411
412
 
@@ -429,7 +430,7 @@ module ExcelFormula
429
430
 
430
431
 
431
432
  # - - - - main rule block - - - -
432
- # at line 345:5: '('
433
+ # at line 356:5: '('
433
434
  match(?()
434
435
 
435
436
 
@@ -453,7 +454,7 @@ module ExcelFormula
453
454
 
454
455
 
455
456
  # - - - - main rule block - - - -
456
- # at line 346:5: ')'
457
+ # at line 357:5: ')'
457
458
  match(?))
458
459
 
459
460
 
@@ -477,7 +478,7 @@ module ExcelFormula
477
478
 
478
479
 
479
480
  # - - - - main rule block - - - -
480
- # at line 347:9: '&'
481
+ # at line 358:9: '&'
481
482
  match(?&)
482
483
 
483
484
 
@@ -501,8 +502,8 @@ module ExcelFormula
501
502
 
502
503
 
503
504
  # - - - - main rule block - - - -
504
- # at line 348:10: '%'
505
- match(?%)
505
+ # at line 359:10: '\\%'
506
+ match(?\%)
506
507
 
507
508
 
508
509
  @state.type = type
@@ -525,7 +526,7 @@ module ExcelFormula
525
526
 
526
527
 
527
528
  # - - - - main rule block - - - -
528
- # at line 349:8: '^'
529
+ # at line 360:8: '^'
529
530
  match(?^)
530
531
 
531
532
 
@@ -549,7 +550,7 @@ module ExcelFormula
549
550
 
550
551
 
551
552
  # - - - - main rule block - - - -
552
- # at line 350:7: '!'
553
+ # at line 361:7: '!'
553
554
  match(?!)
554
555
 
555
556
 
@@ -570,7 +571,7 @@ module ExcelFormula
570
571
 
571
572
 
572
573
  # - - - - main rule block - - - -
573
- # at line 352:17: '0' .. '9'
574
+ # at line 363:17: '0' .. '9'
574
575
  match_range(?0, ?9)
575
576
 
576
577
  ensure
@@ -590,8 +591,8 @@ module ExcelFormula
590
591
 
591
592
 
592
593
  # - - - - main rule block - - - -
593
- # at line 354:12: ( DIGIT )+
594
- # at file 354:12: ( DIGIT )+
594
+ # at line 365:12: ( DIGIT )+
595
+ # at file 365:12: ( DIGIT )+
595
596
  match_count_1 = 0
596
597
  loop do
597
598
  alt_1 = 2
@@ -603,7 +604,7 @@ module ExcelFormula
603
604
  end
604
605
  case alt_1
605
606
  when 1
606
- # at line 354:12: DIGIT
607
+ # at line 365:12: DIGIT
607
608
  digit!
608
609
 
609
610
  else
@@ -638,8 +639,8 @@ module ExcelFormula
638
639
 
639
640
 
640
641
  # - - - - main rule block - - - -
641
- # at line 355:12: ( DIGIT )* '.' ( DIGIT )+ ( ( 'E' | 'e' ) ( '+' | '-' )? ( DIGIT )+ )?
642
- # at line 355:12: ( DIGIT )*
642
+ # at line 366:12: ( DIGIT )* '.' ( DIGIT )+ ( ( 'E' | 'e' ) ( '+' | '-' )? ( DIGIT )+ )?
643
+ # at line 366:12: ( DIGIT )*
643
644
  loop do # decision 2
644
645
  alt_2 = 2
645
646
  look_2_0 = @input.peek(1)
@@ -650,7 +651,7 @@ module ExcelFormula
650
651
  end
651
652
  case alt_2
652
653
  when 1
653
- # at line 355:12: DIGIT
654
+ # at line 366:12: DIGIT
654
655
  digit!
655
656
 
656
657
  else
@@ -658,7 +659,7 @@ module ExcelFormula
658
659
  end
659
660
  end # loop for decision 2
660
661
  match(?.)
661
- # at file 355:23: ( DIGIT )+
662
+ # at file 366:23: ( DIGIT )+
662
663
  match_count_3 = 0
663
664
  loop do
664
665
  alt_3 = 2
@@ -670,7 +671,7 @@ module ExcelFormula
670
671
  end
671
672
  case alt_3
672
673
  when 1
673
- # at line 355:23: DIGIT
674
+ # at line 366:23: DIGIT
674
675
  digit!
675
676
 
676
677
  else
@@ -683,7 +684,7 @@ module ExcelFormula
683
684
  match_count_3 += 1
684
685
  end
685
686
 
686
- # at line 355:30: ( ( 'E' | 'e' ) ( '+' | '-' )? ( DIGIT )+ )?
687
+ # at line 366:30: ( ( 'E' | 'e' ) ( '+' | '-' )? ( DIGIT )+ )?
687
688
  alt_6 = 2
688
689
  look_6_0 = @input.peek(1)
689
690
 
@@ -692,7 +693,7 @@ module ExcelFormula
692
693
  end
693
694
  case alt_6
694
695
  when 1
695
- # at line 355:31: ( 'E' | 'e' ) ( '+' | '-' )? ( DIGIT )+
696
+ # at line 366:31: ( 'E' | 'e' ) ( '+' | '-' )? ( DIGIT )+
696
697
  if @input.peek(1) == ?E || @input.peek(1) == ?e
697
698
  @input.consume
698
699
  else
@@ -702,7 +703,7 @@ module ExcelFormula
702
703
  end
703
704
 
704
705
 
705
- # at line 355:41: ( '+' | '-' )?
706
+ # at line 366:41: ( '+' | '-' )?
706
707
  alt_4 = 2
707
708
  look_4_0 = @input.peek(1)
708
709
 
@@ -723,7 +724,7 @@ module ExcelFormula
723
724
 
724
725
 
725
726
  end
726
- # at file 355:52: ( DIGIT )+
727
+ # at file 366:52: ( DIGIT )+
727
728
  match_count_5 = 0
728
729
  loop do
729
730
  alt_5 = 2
@@ -735,7 +736,7 @@ module ExcelFormula
735
736
  end
736
737
  case alt_5
737
738
  when 1
738
- # at line 355:52: DIGIT
739
+ # at line 366:52: DIGIT
739
740
  digit!
740
741
 
741
742
  else
@@ -772,9 +773,9 @@ module ExcelFormula
772
773
 
773
774
 
774
775
  # - - - - main rule block - - - -
775
- # at line 356:12: '\"' (~ '\"' )+ '\"'
776
+ # at line 367:12: '\"' (~ '\"' )+ '\"'
776
777
  match(?")
777
- # at file 356:16: (~ '\"' )+
778
+ # at file 367:16: (~ '\"' )+
778
779
  match_count_7 = 0
779
780
  loop do
780
781
  alt_7 = 2
@@ -786,7 +787,7 @@ module ExcelFormula
786
787
  end
787
788
  case alt_7
788
789
  when 1
789
- # at line 356:17: ~ '\"'
790
+ # at line 367:17: ~ '\"'
790
791
  if @input.peek(1).between?(0x0000, ?!) || @input.peek(1).between?(?#, 0x00FF)
791
792
  @input.consume
792
793
  else
@@ -830,8 +831,8 @@ module ExcelFormula
830
831
 
831
832
 
832
833
  # - - - - main rule block - - - -
833
- # at line 357:8: ( '$' )? ( 'A' .. 'I' )? ( 'A' .. 'Z' ) ( '$' )? ( DIGIT )+
834
- # at line 357:8: ( '$' )?
834
+ # at line 368:8: ( '$' )? ( 'A' .. 'I' )? ( 'A' .. 'Z' ) ( '$' )? ( DIGIT )+
835
+ # at line 368:8: ( '$' )?
835
836
  alt_8 = 2
836
837
  look_8_0 = @input.peek(1)
837
838
 
@@ -840,11 +841,11 @@ module ExcelFormula
840
841
  end
841
842
  case alt_8
842
843
  when 1
843
- # at line 357:8: '$'
844
+ # at line 368:8: '$'
844
845
  match(?$)
845
846
 
846
847
  end
847
- # at line 357:13: ( 'A' .. 'I' )?
848
+ # at line 368:13: ( 'A' .. 'I' )?
848
849
  alt_9 = 2
849
850
  look_9_0 = @input.peek(1)
850
851
 
@@ -857,15 +858,15 @@ module ExcelFormula
857
858
  end
858
859
  case alt_9
859
860
  when 1
860
- # at line 357:14: 'A' .. 'I'
861
+ # at line 368:14: 'A' .. 'I'
861
862
  match_range(?A, ?I)
862
863
 
863
864
  end
864
- # at line 357:25: ( 'A' .. 'Z' )
865
- # at line 357:26: 'A' .. 'Z'
865
+ # at line 368:25: ( 'A' .. 'Z' )
866
+ # at line 368:26: 'A' .. 'Z'
866
867
  match_range(?A, ?Z)
867
868
 
868
- # at line 357:36: ( '$' )?
869
+ # at line 368:36: ( '$' )?
869
870
  alt_10 = 2
870
871
  look_10_0 = @input.peek(1)
871
872
 
@@ -874,11 +875,11 @@ module ExcelFormula
874
875
  end
875
876
  case alt_10
876
877
  when 1
877
- # at line 357:36: '$'
878
+ # at line 368:36: '$'
878
879
  match(?$)
879
880
 
880
881
  end
881
- # at file 357:41: ( DIGIT )+
882
+ # at file 368:41: ( DIGIT )+
882
883
  match_count_11 = 0
883
884
  loop do
884
885
  alt_11 = 2
@@ -890,7 +891,7 @@ module ExcelFormula
890
891
  end
891
892
  case alt_11
892
893
  when 1
893
- # at line 357:41: DIGIT
894
+ # at line 368:41: DIGIT
894
895
  digit!
895
896
 
896
897
  else
@@ -925,7 +926,7 @@ module ExcelFormula
925
926
 
926
927
 
927
928
  # - - - - main rule block - - - -
928
- # at line 358:13: ( 'T' | 't' ) ( 'R' | 'r' ) ( 'U' | 'u' ) ( 'E' | 'e' )
929
+ # at line 369:13: ( 'T' | 't' ) ( 'R' | 'r' ) ( 'U' | 'u' ) ( 'E' | 'e' )
929
930
  if @input.peek(1) == ?T || @input.peek(1) == ?t
930
931
  @input.consume
931
932
  else
@@ -984,7 +985,7 @@ module ExcelFormula
984
985
 
985
986
 
986
987
  # - - - - main rule block - - - -
987
- # at line 359:14: ( 'F' | 'f' ) ( 'A' | 'a' ) ( 'L' | 'l' ) ( 'S' | 's' ) ( 'E' | 'e' )
988
+ # at line 370:14: ( 'F' | 'f' ) ( 'A' | 'a' ) ( 'L' | 'l' ) ( 'S' | 's' ) ( 'E' | 'e' )
988
989
  if @input.peek(1) == ?F || @input.peek(1) == ?f
989
990
  @input.consume
990
991
  else
@@ -1041,19 +1042,19 @@ module ExcelFormula
1041
1042
 
1042
1043
  end
1043
1044
 
1044
- # lexer rule name! (NAME)
1045
+ # lexer rule quotename! (QUOTENAME)
1045
1046
  # (in ExcelFormula.g)
1046
- def name!
1047
+ def quotename!
1047
1048
  # -> uncomment the next line to manually enable rule tracing
1048
1049
  # trace_in(__method__, 27)
1049
1050
 
1050
- type = NAME
1051
+ type = QUOTENAME
1051
1052
  channel = ANTLR3::DEFAULT_CHANNEL
1052
1053
 
1053
1054
 
1054
1055
  # - - - - main rule block - - - -
1055
- # at line 360:7: '\\w[\\.\\w]*'
1056
- match("w[.w]*")
1056
+ # at line 371:12: '\\'(?:[^\\']|\\'\\')*\\''
1057
+ match("'(?:[^']|'')*'")
1057
1058
 
1058
1059
 
1059
1060
  @state.type = type
@@ -1065,19 +1066,19 @@ module ExcelFormula
1065
1066
 
1066
1067
  end
1067
1068
 
1068
- # lexer rule quotename! (QUOTENAME)
1069
+ # lexer rule func_if! (FUNC_IF)
1069
1070
  # (in ExcelFormula.g)
1070
- def quotename!
1071
+ def func_if!
1071
1072
  # -> uncomment the next line to manually enable rule tracing
1072
1073
  # trace_in(__method__, 28)
1073
1074
 
1074
- type = QUOTENAME
1075
+ type = FUNC_IF
1075
1076
  channel = ANTLR3::DEFAULT_CHANNEL
1076
1077
 
1077
1078
 
1078
1079
  # - - - - main rule block - - - -
1079
- # at line 361:12: '\\'(?:[^\\']|\\'\\')*\\''
1080
- match("'(?:[^']|'')*'")
1080
+ # at line 372:10: 'IF'
1081
+ match("IF")
1081
1082
 
1082
1083
 
1083
1084
  @state.type = type
@@ -1089,19 +1090,19 @@ module ExcelFormula
1089
1090
 
1090
1091
  end
1091
1092
 
1092
- # lexer rule func_if! (FUNC_IF)
1093
+ # lexer rule func_choose! (FUNC_CHOOSE)
1093
1094
  # (in ExcelFormula.g)
1094
- def func_if!
1095
+ def func_choose!
1095
1096
  # -> uncomment the next line to manually enable rule tracing
1096
1097
  # trace_in(__method__, 29)
1097
1098
 
1098
- type = FUNC_IF
1099
+ type = FUNC_CHOOSE
1099
1100
  channel = ANTLR3::DEFAULT_CHANNEL
1100
1101
 
1101
1102
 
1102
1103
  # - - - - main rule block - - - -
1103
- # at line 362:10: 'IF'
1104
- match("IF")
1104
+ # at line 373:14: 'CHOOSE'
1105
+ match("CHOOSE")
1105
1106
 
1106
1107
 
1107
1108
  @state.type = type
@@ -1113,19 +1114,68 @@ module ExcelFormula
1113
1114
 
1114
1115
  end
1115
1116
 
1116
- # lexer rule func_choose! (FUNC_CHOOSE)
1117
+ # lexer rule alpha! (ALPHA)
1117
1118
  # (in ExcelFormula.g)
1118
- def func_choose!
1119
+ def alpha!
1119
1120
  # -> uncomment the next line to manually enable rule tracing
1120
1121
  # trace_in(__method__, 30)
1121
1122
 
1122
- type = FUNC_CHOOSE
1123
+
1124
+ # - - - - main rule block - - - -
1125
+ # at line
1126
+ if @input.peek(1).between?(?A, ?Z) || @input.peek(1).between?(?a, ?z)
1127
+ @input.consume
1128
+ else
1129
+ mse = MismatchedSet(nil)
1130
+ recover(mse)
1131
+ raise mse
1132
+ end
1133
+
1134
+
1135
+
1136
+ ensure
1137
+ # -> uncomment the next line to manually enable rule tracing
1138
+ # trace_out(__method__, 30)
1139
+
1140
+ end
1141
+
1142
+ # lexer rule name! (NAME)
1143
+ # (in ExcelFormula.g)
1144
+ def name!
1145
+ # -> uncomment the next line to manually enable rule tracing
1146
+ # trace_in(__method__, 31)
1147
+
1148
+ type = NAME
1123
1149
  channel = ANTLR3::DEFAULT_CHANNEL
1124
1150
 
1125
1151
 
1126
1152
  # - - - - main rule block - - - -
1127
- # at line 363:14: 'CHOOSE'
1128
- match("CHOOSE")
1153
+ # at line 376:7: ( ALPHA )+
1154
+ # at file 376:7: ( ALPHA )+
1155
+ match_count_12 = 0
1156
+ loop do
1157
+ alt_12 = 2
1158
+ look_12_0 = @input.peek(1)
1159
+
1160
+ if (look_12_0.between?(?A, ?Z) || look_12_0.between?(?a, ?z))
1161
+ alt_12 = 1
1162
+
1163
+ end
1164
+ case alt_12
1165
+ when 1
1166
+ # at line 376:7: ALPHA
1167
+ alpha!
1168
+
1169
+ else
1170
+ match_count_12 > 0 and break
1171
+ eee = EarlyExit(12)
1172
+
1173
+
1174
+ raise eee
1175
+ end
1176
+ match_count_12 += 1
1177
+ end
1178
+
1129
1179
 
1130
1180
 
1131
1181
  @state.type = type
@@ -1133,7 +1183,58 @@ module ExcelFormula
1133
1183
 
1134
1184
  ensure
1135
1185
  # -> uncomment the next line to manually enable rule tracing
1136
- # trace_out(__method__, 30)
1186
+ # trace_out(__method__, 31)
1187
+
1188
+ end
1189
+
1190
+ # lexer rule ws! (WS)
1191
+ # (in ExcelFormula.g)
1192
+ def ws!
1193
+ # -> uncomment the next line to manually enable rule tracing
1194
+ # trace_in(__method__, 32)
1195
+
1196
+ type = WS
1197
+ channel = ANTLR3::DEFAULT_CHANNEL
1198
+
1199
+
1200
+ # - - - - main rule block - - - -
1201
+ # at line 378:5: ( ' ' )+
1202
+ # at file 378:5: ( ' ' )+
1203
+ match_count_13 = 0
1204
+ loop do
1205
+ alt_13 = 2
1206
+ look_13_0 = @input.peek(1)
1207
+
1208
+ if (look_13_0 == ?\s)
1209
+ alt_13 = 1
1210
+
1211
+ end
1212
+ case alt_13
1213
+ when 1
1214
+ # at line 378:6: ' '
1215
+ match(?\s)
1216
+
1217
+ else
1218
+ match_count_13 > 0 and break
1219
+ eee = EarlyExit(13)
1220
+
1221
+
1222
+ raise eee
1223
+ end
1224
+ match_count_13 += 1
1225
+ end
1226
+
1227
+ # --> action
1228
+ skip()
1229
+ # <-- action
1230
+
1231
+
1232
+ @state.type = type
1233
+ @state.channel = channel
1234
+
1235
+ ensure
1236
+ # -> uncomment the next line to manually enable rule tracing
1237
+ # trace_out(__method__, 32)
1137
1238
 
1138
1239
  end
1139
1240
 
@@ -1145,10 +1246,10 @@ module ExcelFormula
1145
1246
  # but instead use the next_token method, which will
1146
1247
  # build and emit the actual next token
1147
1248
  def token!
1148
- # at line 1:8: ( EQ | LT | GT | NE | LE | GE | ADD | SUB | MUL | DIV | COLON | SEMICOLON | COMMA | LP | RP | CONCAT | PERCENT | POWER | BANG | INT_CONST | NUM_CONST | STR_CONST | REF2D | TRUE_CONST | FALSE_CONST | NAME | QUOTENAME | FUNC_IF | FUNC_CHOOSE )
1149
- alt_12 = 29
1150
- alt_12 = @dfa12.predict(@input)
1151
- case alt_12
1249
+ # at line 1:8: ( EQ | LT | GT | NE | LE | GE | ADD | SUB | MUL | DIV | COLON | SEMICOLON | COMMA | LP | RP | CONCAT | PERCENT | POWER | BANG | INT_CONST | NUM_CONST | STR_CONST | REF2D | TRUE_CONST | FALSE_CONST | QUOTENAME | FUNC_IF | FUNC_CHOOSE | NAME | WS )
1250
+ alt_14 = 30
1251
+ alt_14 = @dfa14.predict(@input)
1252
+ case alt_14
1152
1253
  when 1
1153
1254
  # at line 1:10: EQ
1154
1255
  eq!
@@ -1250,50 +1351,60 @@ module ExcelFormula
1250
1351
  false_const!
1251
1352
 
1252
1353
  when 26
1253
- # at line 1:157: NAME
1254
- name!
1354
+ # at line 1:157: QUOTENAME
1355
+ quotename!
1255
1356
 
1256
1357
  when 27
1257
- # at line 1:162: QUOTENAME
1258
- quotename!
1358
+ # at line 1:167: FUNC_IF
1359
+ func_if!
1259
1360
 
1260
1361
  when 28
1261
- # at line 1:172: FUNC_IF
1262
- func_if!
1362
+ # at line 1:175: FUNC_CHOOSE
1363
+ func_choose!
1263
1364
 
1264
1365
  when 29
1265
- # at line 1:180: FUNC_CHOOSE
1266
- func_choose!
1366
+ # at line 1:187: NAME
1367
+ name!
1368
+
1369
+ when 30
1370
+ # at line 1:192: WS
1371
+ ws!
1267
1372
 
1268
1373
  end
1269
1374
  end
1270
1375
 
1271
1376
 
1272
1377
  # - - - - - - - - - - DFA definitions - - - - - - - - - - -
1273
- class DFA12 < ANTLR3::DFA
1274
- EOT = unpack(2, -1, 1, 31, 1, 33, 13, -1, 1, 34, 18, -1, 1, 38, 3,
1275
- -1)
1276
- EOF = unpack(40, -1)
1277
- MIN = unpack(1, 0, 1, -1, 2, 61, 13, -1, 1, 46, 3, -1, 2, 36, 1, -1,
1278
- 1, 36, 3, -1, 1, 36, 6, -1, 3, 36, 2, -1)
1279
- MAX = unpack(1, 116, 1, -1, 1, 62, 1, 61, 13, -1, 1, 57, 3, -1, 1,
1280
- 97, 1, 114, 1, -1, 1, 90, 3, -1, 1, 90, 6, -1, 1, 108,
1281
- 1, 57, 1, 79, 2, -1)
1378
+ class DFA14 < ANTLR3::DFA
1379
+ EOT = unpack(2, -1, 1, 34, 1, 36, 13, -1, 1, 37, 3, -1, 6, 30, 1,
1380
+ -1, 2, 30, 8, -1, 3, 30, 1, 45, 3, 30, 1, -1, 2, 30,
1381
+ 1, 51, 1, 30, 1, 53, 1, -1, 1, 30, 1, -1, 1, 55, 1, -1)
1382
+ EOF = unpack(56, -1)
1383
+ MIN = unpack(1, 32, 1, -1, 2, 61, 13, -1, 1, 46, 3, -1, 3, 36, 1,
1384
+ 82, 1, 36, 1, 65, 1, -1, 2, 36, 8, -1, 1, 36, 1, 76,
1385
+ 1, 85, 2, 36, 1, 83, 1, 69, 1, -1, 1, 79, 1, 69, 1, 65,
1386
+ 1, 83, 1, 65, 1, -1, 1, 69, 1, -1, 1, 65, 1, -1)
1387
+ MAX = unpack(1, 122, 1, -1, 1, 62, 1, 61, 13, -1, 1, 57, 3, -1, 1,
1388
+ 97, 1, 114, 1, 57, 1, 114, 1, 90, 1, 97, 1, -1, 2, 90,
1389
+ 8, -1, 2, 108, 1, 117, 1, 122, 1, 79, 1, 115, 1, 101,
1390
+ 1, -1, 1, 79, 1, 101, 1, 122, 1, 83, 1, 122, 1, -1, 1,
1391
+ 69, 1, -1, 1, 122, 1, -1)
1282
1392
  ACCEPT = unpack(1, -1, 1, 1, 2, -1, 1, 7, 1, 8, 1, 9, 1, 10, 1, 11,
1283
1393
  1, 12, 1, 13, 1, 14, 1, 15, 1, 16, 1, 17, 1, 18, 1,
1284
- 19, 1, -1, 1, 21, 1, 22, 1, 23, 2, -1, 1, 24, 1, -1,
1285
- 1, 25, 1, 26, 1, 27, 1, -1, 1, 4, 1, 5, 1, 2, 1, 6,
1286
- 1, 3, 1, 20, 3, -1, 1, 28, 1, 29)
1287
- SPECIAL = unpack(40, -1)
1394
+ 19, 1, -1, 1, 21, 1, 22, 1, 23, 6, -1, 1, 26, 2, -1,
1395
+ 1, 29, 1, 30, 1, 4, 1, 5, 1, 2, 1, 6, 1, 3, 1, 20,
1396
+ 7, -1, 1, 27, 5, -1, 1, 24, 1, -1, 1, 25, 1, -1, 1,
1397
+ 28)
1398
+ SPECIAL = unpack(56, -1)
1288
1399
  TRANSITION = [
1289
- unpack(1, 26, 32, -1, 1, 16, 1, 19, 1, -1, 1, 20, 1, 14, 1, 13,
1290
- 1, 27, 1, 11, 1, 12, 1, 6, 1, 4, 1, 10, 1, 5, 1, 18, 1, 7,
1291
- 10, 17, 1, 8, 1, 9, 1, 2, 1, 1, 1, 3, 2, -1, 2, 20, 1, 28,
1292
- 2, 20, 1, 21, 2, 20, 1, 24, 10, 20, 1, 22, 6, 20, 3, -1,
1293
- 1, 15, 7, -1, 1, 25, 13, -1, 1, 23),
1400
+ unpack(1, 31, 1, 16, 1, 19, 1, -1, 1, 20, 1, 14, 1, 13, 1, 27, 1,
1401
+ 11, 1, 12, 1, 6, 1, 4, 1, 10, 1, 5, 1, 18, 1, 7, 10, 17,
1402
+ 1, 8, 1, 9, 1, 2, 1, 1, 1, 3, 2, -1, 2, 29, 1, 28, 2, 29,
1403
+ 1, 21, 2, 29, 1, 25, 10, 23, 1, 22, 6, 23, 3, -1, 1, 15,
1404
+ 2, -1, 5, 30, 1, 26, 13, 30, 1, 24, 6, 30),
1294
1405
  unpack(),
1295
- unpack(1, 30, 1, 29),
1296
- unpack(1, 32),
1406
+ unpack(1, 33, 1, 32),
1407
+ unpack(1, 35),
1297
1408
  unpack(),
1298
1409
  unpack(),
1299
1410
  unpack(),
@@ -1311,24 +1422,40 @@ module ExcelFormula
1311
1422
  unpack(),
1312
1423
  unpack(),
1313
1424
  unpack(),
1314
- unpack(1, 20, 11, -1, 10, 20, 7, -1, 1, 35, 25, 20, 6, -1, 1, 25),
1315
- unpack(1, 20, 11, -1, 10, 20, 24, -1, 1, 23, 31, -1, 1, 23),
1425
+ unpack(1, 20, 11, -1, 10, 20, 7, -1, 1, 38, 25, 23, 6, -1, 1, 39),
1426
+ unpack(1, 20, 11, -1, 10, 20, 24, -1, 1, 40, 31, -1, 1, 40),
1427
+ unpack(1, 20, 11, -1, 10, 20),
1428
+ unpack(1, 40, 31, -1, 1, 40),
1429
+ unpack(1, 20, 11, -1, 10, 20, 7, -1, 5, 23, 1, 41, 20, 23),
1430
+ unpack(1, 39, 31, -1, 1, 39),
1316
1431
  unpack(),
1317
- unpack(1, 20, 11, -1, 10, 20, 7, -1, 5, 20, 1, 36, 20, 20),
1432
+ unpack(1, 20, 11, -1, 10, 20, 7, -1, 7, 23, 1, 42, 18, 23),
1433
+ unpack(1, 20, 11, -1, 10, 20, 7, -1, 26, 23),
1318
1434
  unpack(),
1319
1435
  unpack(),
1320
1436
  unpack(),
1321
- unpack(1, 20, 11, -1, 10, 20, 7, -1, 7, 20, 1, 37, 18, 20),
1322
1437
  unpack(),
1323
1438
  unpack(),
1324
1439
  unpack(),
1325
1440
  unpack(),
1326
1441
  unpack(),
1442
+ unpack(1, 20, 11, -1, 10, 20, 18, -1, 1, 43, 31, -1, 1, 43),
1443
+ unpack(1, 43, 31, -1, 1, 43),
1444
+ unpack(1, 44, 31, -1, 1, 44),
1445
+ unpack(1, 20, 11, -1, 10, 20, 7, -1, 26, 30, 6, -1, 26, 30),
1446
+ unpack(1, 20, 11, -1, 10, 20, 21, -1, 1, 46),
1447
+ unpack(1, 47, 31, -1, 1, 47),
1448
+ unpack(1, 48, 31, -1, 1, 48),
1327
1449
  unpack(),
1328
- unpack(1, 20, 11, -1, 10, 20, 18, -1, 1, 25, 31, -1, 1, 25),
1329
- unpack(1, 20, 11, -1, 10, 20),
1330
- unpack(1, 20, 11, -1, 10, 20, 21, -1, 1, 39),
1450
+ unpack(1, 49),
1451
+ unpack(1, 50, 31, -1, 1, 50),
1452
+ unpack(26, 30, 6, -1, 26, 30),
1453
+ unpack(1, 52),
1454
+ unpack(26, 30, 6, -1, 26, 30),
1455
+ unpack(),
1456
+ unpack(1, 54),
1331
1457
  unpack(),
1458
+ unpack(26, 30, 6, -1, 26, 30),
1332
1459
  unpack()
1333
1460
  ].freeze
1334
1461
 
@@ -1338,12 +1465,12 @@ module ExcelFormula
1338
1465
  end
1339
1466
  end
1340
1467
 
1341
- @decision = 12
1468
+ @decision = 14
1342
1469
 
1343
1470
 
1344
1471
  def description
1345
1472
  <<-'__dfa_description__'.strip!
1346
- 1:1: Tokens : ( EQ | LT | GT | NE | LE | GE | ADD | SUB | MUL | DIV | COLON | SEMICOLON | COMMA | LP | RP | CONCAT | PERCENT | POWER | BANG | INT_CONST | NUM_CONST | STR_CONST | REF2D | TRUE_CONST | FALSE_CONST | NAME | QUOTENAME | FUNC_IF | FUNC_CHOOSE );
1473
+ 1:1: Tokens : ( EQ | LT | GT | NE | LE | GE | ADD | SUB | MUL | DIV | COLON | SEMICOLON | COMMA | LP | RP | CONCAT | PERCENT | POWER | BANG | INT_CONST | NUM_CONST | STR_CONST | REF2D | TRUE_CONST | FALSE_CONST | QUOTENAME | FUNC_IF | FUNC_CHOOSE | NAME | WS );
1347
1474
  __dfa_description__
1348
1475
  end
1349
1476
  end
@@ -1353,7 +1480,7 @@ module ExcelFormula
1353
1480
 
1354
1481
  def initialize_dfas
1355
1482
  super rescue nil
1356
- @dfa12 = DFA12.new(self, 12)
1483
+ @dfa14 = DFA14.new(self, 14)
1357
1484
 
1358
1485
  end
1359
1486
  end # class Lexer < ANTLR3::Lexer