commit
message
[Parser, tests] work-in-progress on allowing errors to be parsed as literals (e.g. =#N/A)
author
Ben Vogt <[email protected]>
date
2017-09-23 17:16:09
stats
6 file(s) changed,
1668 insertions(+),
1528 deletions(-)
files
src/Errors.ts
src/Parser/Parser.ts
src/Parser/ParserConstants.ts
tests/SheetFormulaTest.ts
tests/SheetParsingTest.ts
tests/Utils/Asserts.ts
1diff --git a/src/Errors.ts b/src/Errors.ts
2index 891b7c4..23141ca 100644
3--- a/src/Errors.ts
4+++ b/src/Errors.ts
5@@ -63,6 +63,35 @@ class ParseError extends Error {
6 }
7 }
8
9+/**
10+ * Constructs an error by error name.
11+ * @param {string} name - Name of error. If not one of DIV_ZERO_ERROR, NULL_ERROR, VALUE_ERROR, REF_ERROR, NAME_ERROR,
12+ * NUM_ERROR,NA_ERROR, or PARSE_ERROR, will default to ParseError.
13+ * @param {string} msg - Message for error, will default to empty string.
14+ * @returns {Error}
15+ */
16+function constructErrorByName(name : string, msg? : string) : Error {
17+ msg = msg || "";
18+ switch (name) {
19+ case DIV_ZERO_ERROR:
20+ return new DivZeroError(msg);
21+ case NULL_ERROR:
22+ return new NullError(msg);
23+ case VALUE_ERROR:
24+ return new ValueError(msg);
25+ case REF_ERROR:
26+ return new RefError(msg);
27+ case NAME_ERROR:
28+ return new NameError(msg);
29+ case NA_ERROR:
30+ return new NAError(msg);
31+ case NUM_ERROR:
32+ return new NumError(msg);
33+ default:
34+ return new ParseError(msg);
35+ }
36+}
37+
38 export {
39 DIV_ZERO_ERROR,
40 NULL_ERROR,
41@@ -79,5 +108,6 @@ export {
42 NameError,
43 NumError,
44 NAError,
45- ParseError
46+ ParseError,
47+ constructErrorByName
48 }
49\ No newline at end of file
50diff --git a/src/Parser/Parser.ts b/src/Parser/Parser.ts
51index b209de7..2bebfb9 100644
52--- a/src/Parser/Parser.ts
53+++ b/src/Parser/Parser.ts
54@@ -1,1486 +1,22 @@
55 import {
56+ constructErrorByName,
57 ParseError
58 } from "../Errors";
59 import {
60 Formulas
61 } from "../Formulas";
62-
63-// Rules represent the Regular Expressions that will be used in sequence to match a given input to the Parser.
64-const WHITE_SPACE_RULE = /^(?:\s+)/; // rule 0
65-const DOUBLE_QUOTES_RULE = /^(?:"(\\["]|[^"])*")/; // rule 1
66-const SINGLE_QUOTES_RULE = /^(?:'(\\[']|[^'])*')/; // rule 2
67-const FORMULA_NAME_RULE = /^(?:[A-Za-z.]{1,}[A-Za-z_0-9]+(?=[(]))/; // Changed from /^(?:[A-Za-z]{1,}[A-Za-z_0-9]+(?=[(]))/ // rule 3
68-const DATE_RULE = /^(?:([0]?[1-9]|1[0-2])[:][0-5][0-9]([:][0-5][0-9])?[ ]?(AM|am|aM|Am|PM|pm|pM|Pm))/; // rule 4
69-const TIME_RULE = /^(?:([0]?[0-9]|1[0-9]|2[0-3])[:][0-5][0-9]([:][0-5][0-9])?)/; // rule 5
70-const $_A1_CELL_RULE = /^(?:\$[A-Za-z]+\$[0-9]+)/; // rule 6
71-const A1_CELL_RULE = /^(?:[A-Za-z]+[0-9]+)/; // rules 7
72-const FORMULA_NAME_SIMPLE_RULE = /^(?:[A-Za-z.]+(?=[(]))/; // rule 8
73-const VARIABLE_RULE = /^(?:[A-Za-z]{1,}[A-Za-z_0-9]+)/; // rule 9
74-const SIMPLE_VARIABLE_RILE = /^(?:[A-Za-z_]+)/; //rule 10
75-const INTEGER_RULE = /^(?:[0-9]+(?:(?:[eE])(?:[\+-])?[0-9]+)?)/; // Changed from /^(?:[0-9]+)/ // rule 11
76-const OPEN_AND_CLOSE_OF_ARRAY_RULE = /^(?:\[(.*)?\])/; // rule 12
77-const DOLLAR_SIGN_RULE = /^(?:\$)/; // rule 13
78-const AMPERSAND_SIGN_RULE = /^(?:&)/; //rule 14
79-const SINGLE_WHITESPACE_RULE = /^(?: )/; // rule 15
80-const PERIOD_RULE = /^(?:[.])/; // rule 16
81-const COLON_RULE = /^(?::)/; //rule 17
82-const SEMI_COLON_RULE = /^(?:;)/; // rule 18
83-const COMMA_RULE = /^(?:,)/; // rule 19
84-const ASTERISK_RULE = /^(?:\*)/; //rule 20
85-const FORWARD_SLASH_RULE = /^(?:\/)/; // rule 21
86-const MINUS_SIGN_RULE = /^(?:-)/; // rule 22
87-const PLUS_SIGN_RULE = /^(?:\+)/; // rule 23
88-const CARET_SIGN_RULE = /^(?:\^)/; //rule 24
89-const OPEN_PAREN_RULE = /^(?:\()/; // rule 25
90-const CLOSE_PAREN_RULE = /^(?:\))/; // rule 26
91-const GREATER_THAN_SIGN_RULE = /^(?:>)/; // rule 27
92-const LESS_THAN_SIGN_RULE = /^(?:<)/; // rule 28
93-const NOT_RULE = /^(?:NOT\b)/; // rule 29
94-const OPEN_DOUBLE_QUOTE = /^(?:")/; // rule 30
95-const OPEN_SINGLE_QUITE = /^(?:')/; // rule 31
96-const EXCLAMATION_POINT_RULE = /^(?:!)/; // rule 32
97-const EQUALS_SIGN_RULE = /^(?:=)/; // rule 33
98-const PERCENT_SIGN_RULE = /^(?:%)/; // rule 34
99-const HASH_SIGN_RULE = /^(?:[#])/; // rule 35
100-const END_OF_STRING_RULE = /^(?:$)/; // rule 36
101-
102-// Sequential rules to use when parsing a given input.
103-const RULES = [
104- WHITE_SPACE_RULE,
105- DOUBLE_QUOTES_RULE,
106- SINGLE_QUOTES_RULE,
107- FORMULA_NAME_RULE,
108- DATE_RULE,
109- TIME_RULE,
110- $_A1_CELL_RULE,
111- A1_CELL_RULE,
112- FORMULA_NAME_SIMPLE_RULE,
113- VARIABLE_RULE,
114- SIMPLE_VARIABLE_RILE,
115- INTEGER_RULE,
116- OPEN_AND_CLOSE_OF_ARRAY_RULE,
117- DOLLAR_SIGN_RULE,
118- AMPERSAND_SIGN_RULE,
119- SINGLE_WHITESPACE_RULE,
120- PERIOD_RULE,
121- COLON_RULE,
122- SEMI_COLON_RULE,
123- COMMA_RULE,
124- ASTERISK_RULE,
125- FORWARD_SLASH_RULE,
126- MINUS_SIGN_RULE,
127- PLUS_SIGN_RULE,
128- CARET_SIGN_RULE,
129- OPEN_PAREN_RULE,
130- CLOSE_PAREN_RULE,
131- GREATER_THAN_SIGN_RULE,
132- LESS_THAN_SIGN_RULE,
133- NOT_RULE,
134- OPEN_DOUBLE_QUOTE,
135- OPEN_SINGLE_QUITE,
136- EXCLAMATION_POINT_RULE,
137- EQUALS_SIGN_RULE,
138- PERCENT_SIGN_RULE,
139- HASH_SIGN_RULE,
140- END_OF_STRING_RULE
141-];
142-
143-/**
144- * Actions to take when processing tokens one by one. We're always either taking the next token, reducing our current
145- * tokens, or accepting and returning.
146- */
147-const SHIFT = 1;
148-const REDUCE = 2;
149-const ACCEPT = 3;
150-
151-const enum ReduceActions {
152- NO_ACTION = 0,
153- RETURN_LAST = 1,
154- CALL_VARIABLE = 2,
155- TIME_CALL_TRUE = 3,
156- TIME_CALL = 4,
157- AS_NUMBER = 5,
158- AS_STRING = 6,
159- AMPERSAND = 7,
160- EQUALS = 8,
161- PLUS = 9,
162- LAST_NUMBER = 10,
163- LTE = 11,
164- GTE = 12,
165- NOT_EQ = 13,
166- NOT = 14,
167- GT = 15,
168- LT = 16,
169- MINUS = 17,
170- MULTIPLY = 18,
171- DIVIDE = 19,
172- TO_POWER = 20,
173- INVERT_NUM = 21,
174- TO_NUMBER_NAN_AS_ZERO = 22,
175- CALL_FUNCTION_LAST_BLANK = 23,
176- CALL_FUNCTION_LAST_TWO_IN_STACK = 24,
177- I25 = 25,
178- I26 = 26,
179- I27 = 27,
180- FIXED_CELL_VAL = 28,
181- FIXED_CELL_RANGE_VAL = 29,
182- CELL_VALUE = 30,
183- CELL_RANGE_VALUE = 31,
184- ENSURE_IS_ARRAY = 32,
185- ENSURE_YYTEXT_ARRAY = 33,
186- REDUCE_INT = 34,
187- REDUCE_PERCENT = 35,
188- WRAP_CURRENT_INDEX_TOKEN_AS_ARRAY = 36,
189- ENSURE_LAST_TWO_IN_ARRAY_AND_PUSH = 37,
190- REFLEXIVE_REDUCE = 38,
191- REDUCE_FLOAT = 39,
192- REDUCE_PREV_AS_PERCENT = 40,
193- REDUCE_LAST_THREE_A = 41,
194- REDUCE_LAST_THREE_B = 42
195-}
196-
197-/**
198- * Represents the length to reduce the stack by, and the token index value that will replace those tokens in the stack.
199- */
200-class ReductionPair {
201- private lengthToReduceStackBy : number;
202- private replacementTokenIndex : number;
203- constructor(replacementTokenIndex : number, length : number) {
204- this.lengthToReduceStackBy = length;
205- this.replacementTokenIndex = replacementTokenIndex;
206- }
207-
208- /**
209- * Get the number representing the length to reduce the stack by.
210- * @returns {number}
211- */
212- getLengthToReduceStackBy() : number {
213- return this.lengthToReduceStackBy;
214- }
215-
216- /**
217- * Get the replacement token index.
218- * @returns {number}
219- */
220- getReplacementTokenIndex() : number {
221- return this.replacementTokenIndex;
222- }
223-}
224-
225-/**
226- * Productions is used to look up both the number to use when reducing the stack (productions[x][1]) and the semantic
227- * value that will replace the tokens in the stack (productions[x][0]).
228- * @type {Array<ReductionPair>}
229- *
230- * Maps a ProductionRule to the appropriate number of previous tokens to use in a reduction action.
231- */
232-let productions : Array<ReductionPair> = [];
233-productions[ReduceActions.NO_ACTION] = null;
234-productions[ReduceActions.RETURN_LAST] = new ReductionPair(3, 2);
235-productions[ReduceActions.CALL_VARIABLE] = new ReductionPair(4, 1);
236-productions[ReduceActions.TIME_CALL_TRUE] = new ReductionPair(4, 1);
237-productions[ReduceActions.TIME_CALL] = new ReductionPair(4, 1);
238-productions[ReduceActions.AS_NUMBER] = new ReductionPair(4, 1);
239-productions[ReduceActions.AS_STRING] = new ReductionPair(4, 1);
240-productions[ReduceActions.AMPERSAND] = new ReductionPair(4, 3);
241-productions[ReduceActions.EQUALS] = new ReductionPair(4, 3);
242-productions[ReduceActions.PLUS] = new ReductionPair(4, 3);
243-productions[ReduceActions.LAST_NUMBER] = new ReductionPair(4, 3);
244-productions[ReduceActions.LTE] = new ReductionPair(4, 4);
245-productions[ReduceActions.GTE] = new ReductionPair(4, 4);
246-productions[ReduceActions.NOT_EQ] = new ReductionPair(4, 4);
247-productions[ReduceActions.NOT] = new ReductionPair(4, 3);
248-productions[ReduceActions.GT] = new ReductionPair(4, 3);
249-productions[ReduceActions.LT] = new ReductionPair(4, 3);
250-productions[ReduceActions.MINUS] = new ReductionPair(4, 3);
251-productions[ReduceActions.MULTIPLY] = new ReductionPair(4, 3);
252-productions[ReduceActions.DIVIDE] = new ReductionPair(4, 3);
253-productions[ReduceActions.TO_POWER] = new ReductionPair(4, 3);
254-productions[ReduceActions.INVERT_NUM] = new ReductionPair(4, 2);
255-productions[ReduceActions.TO_NUMBER_NAN_AS_ZERO] = new ReductionPair(4, 2);
256-productions[ReduceActions.CALL_FUNCTION_LAST_BLANK] = new ReductionPair(4, 3);
257-productions[ReduceActions.CALL_FUNCTION_LAST_TWO_IN_STACK] = new ReductionPair(4, 4);
258-productions[ReduceActions.I25] = new ReductionPair(4, 1);
259-productions[ReduceActions.I26] = new ReductionPair(4, 1);
260-productions[ReduceActions.I27] = new ReductionPair(4, 2);
261-productions[ReduceActions.FIXED_CELL_VAL] = new ReductionPair(25, 1);
262-productions[ReduceActions.FIXED_CELL_RANGE_VAL] = new ReductionPair(25, 3);
263-productions[ReduceActions.CELL_VALUE] = new ReductionPair(25, 1);
264-productions[ReduceActions.CELL_RANGE_VALUE] = new ReductionPair(25, 3);
265-productions[ReduceActions.ENSURE_IS_ARRAY] = new ReductionPair(24, 1);
266-productions[ReduceActions.ENSURE_YYTEXT_ARRAY] = new ReductionPair(24, 1);
267-productions[ReduceActions.REDUCE_INT] = new ReductionPair(24, 3);
268-productions[ReduceActions.REDUCE_PERCENT] = new ReductionPair(24, 3);
269-productions[ReduceActions.WRAP_CURRENT_INDEX_TOKEN_AS_ARRAY] = new ReductionPair(6, 1);
270-productions[ReduceActions.ENSURE_LAST_TWO_IN_ARRAY_AND_PUSH] = new ReductionPair(6, 3);
271-productions[ReduceActions.REFLEXIVE_REDUCE] = new ReductionPair(9, 1);
272-productions[ReduceActions.REDUCE_FLOAT] = new ReductionPair(9, 3);
273-productions[ReduceActions.REDUCE_PREV_AS_PERCENT] = new ReductionPair(9, 2);
274-productions[ReduceActions.REDUCE_LAST_THREE_A] = new ReductionPair(2, 3);
275-productions[ReduceActions.REDUCE_LAST_THREE_B] = new ReductionPair(2, 4);
276-const PRODUCTIONS = productions;
277-
278-enum Symbol {
279- ACCEPT = 0,
280- END = 1,
281- ERROR = 2,
282- EXPRESSIONS = 3,
283- EXPRESSION = 4,
284- EOF = 5,
285- VARIABLE_SEQUENCE = 6,
286- TIME_AMPM = 7,
287- TIME_24 = 8,
288- NUMBER = 9,
289- STRING = 10,
290- AMPERSAND = 11,
291- EQUALS = 12,
292- PLUS = 13,
293- LEFT_PAREN = 14,
294- RIGHT_PAREN = 15,
295- LESS_THAN = 16,
296- GREATER_THAN = 17,
297- NOT = 18,
298- MINUS = 19,
299- ASTERISK = 20,
300- DIVIDE = 21,
301- CARROT = 22,
302- FUNCTION = 23,
303- EXP_SEQ = 24,
304- CELL = 25,
305- FIXEDCELL = 26,
306- COLON = 27,
307- CELL_UPPER = 28,
308- ARRAY = 29,
309- SEMI_COLON = 30,
310- COMMA = 31,
311- VARIABLE = 32,
312- DECIMAL = 33,
313- NUMBER_UPPER = 34,
314- PERCENT = 35,
315- POUND = 36,
316- EXCLAMATION_POINT = 37
317-}
318-
319-const SYMBOL_NAME_TO_INDEX = {
320- "$accept": Symbol.ACCEPT,
321- "$end": Symbol.END,
322- "error": Symbol.ERROR,
323- "expressions": Symbol.EXPRESSIONS,
324- "expression": Symbol.EXPRESSION,
325- "EOF": Symbol.EOF,
326- "variableSequence": Symbol.VARIABLE_SEQUENCE,
327- "TIME_AMPM": Symbol.TIME_AMPM,
328- "TIME_24": Symbol.TIME_24,
329- "number": Symbol.NUMBER,
330- "STRING": Symbol.STRING,
331- "&": Symbol.AMPERSAND,
332- "=": Symbol.EQUALS,
333- "+": Symbol.PLUS,
334- "(": Symbol.LEFT_PAREN,
335- ")": Symbol.RIGHT_PAREN,
336- "<": Symbol.LESS_THAN,
337- ">": Symbol.GREATER_THAN,
338- "NOT": Symbol.NOT,
339- "-": Symbol.MINUS,
340- "*": Symbol.ASTERISK,
341- "/": Symbol.DIVIDE,
342- "^": Symbol.CARROT,
343- "FUNCTION": Symbol.FUNCTION,
344- "expseq": Symbol.EXP_SEQ,
345- "cell": Symbol.CELL,
346- "FIXEDCELL": Symbol.FIXEDCELL,
347- ":": Symbol.COLON,
348- "CELL": Symbol.CELL_UPPER,
349- "ARRAY": Symbol.ARRAY,
350- ";": Symbol.SEMI_COLON,
351- ",": Symbol.COMMA,
352- "VARIABLE": Symbol.VARIABLE,
353- "DECIMAL": Symbol.DECIMAL,
354- "NUMBER": Symbol.NUMBER_UPPER,
355- "%": Symbol.PERCENT,
356- "#": Symbol.POUND,
357- "!": Symbol.EXCLAMATION_POINT
358-};
359-let symbolIndexToName = {};
360-symbolIndexToName[Symbol.EOF] = "EOF";
361-symbolIndexToName[Symbol.TIME_AMPM] = "TIME_AMPM";
362-symbolIndexToName[Symbol.TIME_24] = "TIME_24";
363-symbolIndexToName[Symbol.STRING] = "STRING";
364-symbolIndexToName[Symbol.AMPERSAND] = "&";
365-symbolIndexToName[Symbol.EQUALS] = "=";
366-symbolIndexToName[Symbol.PLUS] = "+";
367-symbolIndexToName[Symbol.LEFT_PAREN] = "(";
368-symbolIndexToName[Symbol.RIGHT_PAREN] = ")";
369-symbolIndexToName[Symbol.LESS_THAN] = "<";
370-symbolIndexToName[Symbol.GREATER_THAN] = ">";
371-symbolIndexToName[Symbol.NOT] = "NOTE";
372-symbolIndexToName[Symbol.MINUS] = "-";
373-symbolIndexToName[Symbol.ASTERISK] = "*";
374-symbolIndexToName[Symbol.DIVIDE] = "/";
375-symbolIndexToName[Symbol.CARROT] = "^";
376-symbolIndexToName[Symbol.FUNCTION] = "FUNCTION";
377-symbolIndexToName[Symbol.FIXEDCELL] = "FIXEDCELL";
378-symbolIndexToName[Symbol.COLON] = ";";
379-symbolIndexToName[Symbol.COMMA] = ",";
380-symbolIndexToName[Symbol.VARIABLE] = "VARIABLE";
381-symbolIndexToName[Symbol.DECIMAL] = "DECIMAL";
382-symbolIndexToName[Symbol.NUMBER_UPPER] = "NUMBER";
383-symbolIndexToName[Symbol.PERCENT] = "%";
384-symbolIndexToName[Symbol.POUND] = "#";
385-symbolIndexToName[Symbol.EXCLAMATION_POINT] = "!";
386-const SYMBOL_INDEX_TO_NAME = symbolIndexToName;
387-
388-
389-
390-class ObjectBuilder {
391- public o : Object = {};
392-
393- public static add(k, v) : ObjectBuilder {
394- let m = new ObjectBuilder();
395- m.o[k.toString()] = v;
396- return m;
397- }
398- public add(k, v) : ObjectBuilder {
399- this.o[k.toString()] = v;
400- return this;
401- }
402- public build() : Object {
403- return this.o;
404- }
405-}
406-
407-/**
408- * Array of to map rules to to LexActions and other rules. A single index in the object (e.g. `{2: 13}`) indicates the
409- * rule object to follow for the next token, while an array (e.g. `{23: [1, 11]}`) indicates the action to be taken,
410- * and the rule object to follow after the action.
411- */
412-let table = [];
413-// All functions in the spreadsheet start with a 0-token.
414-table[0] = ObjectBuilder
415- .add(Symbol.ERROR, 13)
416- .add(Symbol.EXPRESSIONS, 1)
417- .add(Symbol.EXPRESSION, 2)
418- .add(Symbol.VARIABLE_SEQUENCE, 3)
419- .add(Symbol.TIME_AMPM, [SHIFT, 4])
420- .add(Symbol.TIME_24, [SHIFT, 5])
421- .add(Symbol.NUMBER, 6)
422- .add(Symbol.STRING, [SHIFT, 7])
423- .add(Symbol.PLUS, [SHIFT, 10])
424- .add(Symbol.LEFT_PAREN, [SHIFT, 8])
425- .add(Symbol.MINUS, [SHIFT, 9])
426- .add(Symbol.FUNCTION, [SHIFT, 11])
427- .add(Symbol.CELL, 12)
428- .add(Symbol.FIXEDCELL, [SHIFT, 16])
429- .add(Symbol.CELL_UPPER, [SHIFT, 17])
430- .add(Symbol.VARIABLE, [SHIFT, 14])
431- .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
432- .add(Symbol.POUND, [SHIFT, 18])
433- .build();
434-table[1] = ObjectBuilder
435- .add(Symbol.END, [3])
436- .build();
437-table[2] = ObjectBuilder
438- .add(Symbol.EOF, [SHIFT, 19])
439- .add(Symbol.AMPERSAND, [SHIFT, 20])
440- .add(Symbol.EQUALS, [SHIFT, 21])
441- .add(Symbol.PLUS, [SHIFT, 22])
442- .add(Symbol.LESS_THAN, [SHIFT, 23])
443- .add(Symbol.GREATER_THAN, [SHIFT, 24])
444- .add(Symbol.NOT, [SHIFT, 25])
445- .add(Symbol.MINUS, [SHIFT, 26])
446- .add(Symbol.ASTERISK, [SHIFT, 27])
447- .add(Symbol.DIVIDE, [SHIFT, 28])
448- .add(Symbol.CARROT, [SHIFT, 29])
449- .build();
450-table[3] = ObjectBuilder
451- .add(Symbol.EOF, [REDUCE, 2])
452- .add(Symbol.AMPERSAND, [REDUCE, 2])
453- .add(Symbol.EQUALS, [REDUCE, 2])
454- .add(Symbol.PLUS, [REDUCE, 2])
455- .add(Symbol.RIGHT_PAREN, [REDUCE, 2])
456- .add(Symbol.LESS_THAN, [REDUCE, 2])
457- .add(Symbol.GREATER_THAN, [REDUCE, 2])
458- .add(Symbol.NOT, [REDUCE, 2])
459- .add(Symbol.MINUS, [REDUCE, 2])
460- .add(Symbol.ASTERISK, [REDUCE, 2])
461- .add(Symbol.DIVIDE, [REDUCE, 2])
462- .add(Symbol.CARROT, [REDUCE, 2])
463- .add(Symbol.SEMI_COLON, [REDUCE, 2])
464- .add(Symbol.COMMA, [REDUCE, 2])
465- .add(33, [SHIFT, 30])
466- .build();
467-table[3] = ObjectBuilder
468- .add(Symbol.EOF, [REDUCE, 2])
469- .add(Symbol.AMPERSAND, [REDUCE, 2])
470- .add(Symbol.EQUALS, [REDUCE, 2])
471- .add(Symbol.PLUS, [REDUCE, 2])
472- .add(Symbol.RIGHT_PAREN, [REDUCE, 2])
473- .add(Symbol.LESS_THAN, [REDUCE, 2])
474- .add(Symbol.GREATER_THAN, [REDUCE, 2])
475- .add(Symbol.NOT, [REDUCE, 2])
476- .add(Symbol.MINUS, [REDUCE, 2])
477- .add(Symbol.ASTERISK, [REDUCE, 2])
478- .add(Symbol.DIVIDE, [REDUCE, 2])
479- .add(Symbol.CARROT, [REDUCE, 2])
480- .add(Symbol.SEMI_COLON, [REDUCE, 2])
481- .add(Symbol.COMMA, [REDUCE, 2])
482- .add(33, [SHIFT, 30])
483- .build();
484-table[4] = ObjectBuilder
485- .add(Symbol.EOF, [REDUCE, 3])
486- .add(Symbol.AMPERSAND, [REDUCE, 3])
487- .add(Symbol.EQUALS, [REDUCE, 3])
488- .add(Symbol.PLUS, [REDUCE, 3])
489- .add(Symbol.RIGHT_PAREN, [REDUCE, 3])
490- .add(Symbol.LESS_THAN, [REDUCE, 3])
491- .add(Symbol.GREATER_THAN, [REDUCE, 3])
492- .add(Symbol.NOT, [REDUCE, 3])
493- .add(Symbol.MINUS, [REDUCE, 3])
494- .add(Symbol.ASTERISK, [REDUCE, 3])
495- .add(Symbol.DIVIDE, [REDUCE, 3])
496- .add(Symbol.CARROT, [REDUCE, 3])
497- .add(Symbol.SEMI_COLON, [REDUCE, 3])
498- .add(Symbol.COMMA, [REDUCE, 3])
499- .build();
500-table[5] = ObjectBuilder
501- .add(Symbol.EOF, [REDUCE, 4])
502- .add(Symbol.AMPERSAND, [REDUCE, 4])
503- .add(Symbol.EQUALS, [REDUCE, 4])
504- .add(Symbol.PLUS, [REDUCE, 4])
505- .add(Symbol.RIGHT_PAREN, [REDUCE, 4])
506- .add(Symbol.LESS_THAN, [REDUCE, 4])
507- .add(Symbol.GREATER_THAN, [REDUCE, 4])
508- .add(Symbol.NOT, [REDUCE, 4])
509- .add(Symbol.MINUS, [REDUCE, 4])
510- .add(Symbol.ASTERISK, [REDUCE, 4])
511- .add(Symbol.DIVIDE, [REDUCE, 4])
512- .add(Symbol.CARROT, [REDUCE, 4])
513- .add(Symbol.SEMI_COLON, [REDUCE, 4])
514- .add(Symbol.COMMA, [REDUCE, 4])
515- .build();
516-table[6] = ObjectBuilder
517- .add(Symbol.EOF, [REDUCE, 5])
518- .add(Symbol.AMPERSAND, [REDUCE, 5])
519- .add(Symbol.EQUALS, [REDUCE, 5])
520- .add(Symbol.PLUS, [REDUCE, 5])
521- .add(Symbol.RIGHT_PAREN, [REDUCE, 5])
522- .add(Symbol.LESS_THAN, [REDUCE, 5])
523- .add(Symbol.GREATER_THAN, [REDUCE, 5])
524- .add(Symbol.NOT, [REDUCE, 5])
525- .add(Symbol.MINUS, [REDUCE, 5])
526- .add(Symbol.ASTERISK, [REDUCE, 5])
527- .add(Symbol.DIVIDE, [REDUCE, 5])
528- .add(Symbol.CARROT, [REDUCE, 5])
529- .add(Symbol.SEMI_COLON, [REDUCE, 5])
530- .add(Symbol.COMMA, [REDUCE, 5])
531- .add(Symbol.PERCENT, [SHIFT, 31])
532- .build();
533-table[7] = ObjectBuilder
534- .add(Symbol.EOF, [REDUCE, 6])
535- .add(Symbol.AMPERSAND, [REDUCE, 6])
536- .add(Symbol.EQUALS, [REDUCE, 6])
537- .add(Symbol.PLUS, [REDUCE, 6])
538- .add(Symbol.RIGHT_PAREN, [REDUCE, 6])
539- .add(Symbol.LESS_THAN, [REDUCE, 6])
540- .add(Symbol.GREATER_THAN, [REDUCE, 6])
541- .add(Symbol.NOT, [REDUCE, 6])
542- .add(Symbol.MINUS, [REDUCE, 6])
543- .add(Symbol.ASTERISK, [REDUCE, 6])
544- .add(Symbol.DIVIDE, [REDUCE, 6])
545- .add(Symbol.CARROT, [REDUCE, 6])
546- .add(Symbol.SEMI_COLON, [REDUCE, 6])
547- .add(Symbol.COMMA, [REDUCE, 6])
548- .build();
549-table[8] = ObjectBuilder
550- .add(Symbol.ERROR, 13)
551- .add(Symbol.EXPRESSION, 32)
552- .add(Symbol.VARIABLE_SEQUENCE, 3)
553- .add(Symbol.TIME_AMPM, [SHIFT, 4])
554- .add(Symbol.TIME_24, [SHIFT, 5])
555- .add(Symbol.NUMBER, 6)
556- .add(Symbol.STRING, [SHIFT, 7])
557- .add(Symbol.PLUS, [SHIFT, 10])
558- .add(Symbol.LEFT_PAREN, [SHIFT, 8])
559- .add(Symbol.MINUS, [SHIFT, 9])
560- .add(Symbol.FUNCTION, [SHIFT, 11])
561- .add(Symbol.CELL, 12)
562- .add(Symbol.FIXEDCELL, [SHIFT, 16])
563- .add(Symbol.CELL_UPPER, [SHIFT, 17])
564- .add(Symbol.VARIABLE, [SHIFT, 14])
565- .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
566- .add(Symbol.POUND, [SHIFT, 18])
567- .build();
568-table[9] = ObjectBuilder
569- .add(Symbol.ERROR, 13)
570- .add(Symbol.EXPRESSION, 33)
571- .add(Symbol.VARIABLE_SEQUENCE, 3)
572- .add(Symbol.TIME_AMPM, [SHIFT, 4])
573- .add(Symbol.TIME_24, [SHIFT, 5])
574- .add(Symbol.NUMBER, 6)
575- .add(Symbol.STRING, [SHIFT, 7])
576- .add(Symbol.PLUS, [SHIFT, 10])
577- .add(Symbol.LEFT_PAREN, [SHIFT, 8])
578- .add(Symbol.MINUS, [SHIFT, 9])
579- .add(Symbol.FUNCTION, [SHIFT, 11])
580- .add(Symbol.CELL, 12)
581- .add(Symbol.FIXEDCELL, [SHIFT, 16])
582- .add(Symbol.CELL_UPPER, [SHIFT, 17])
583- .add(Symbol.VARIABLE, [SHIFT, 14])
584- .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
585- .add(Symbol.POUND, [SHIFT, 18])
586- .build();
587-table[10] = ObjectBuilder
588- .add(Symbol.ERROR, 13)
589- .add(Symbol.EXPRESSION, 34)
590- .add(Symbol.VARIABLE_SEQUENCE, 3)
591- .add(Symbol.TIME_AMPM, [SHIFT, 4])
592- .add(Symbol.TIME_24, [SHIFT, 5])
593- .add(Symbol.NUMBER, 6)
594- .add(Symbol.STRING, [SHIFT, 7])
595- .add(Symbol.PLUS, [SHIFT, 10])
596- .add(Symbol.LEFT_PAREN, [SHIFT, 8])
597- .add(Symbol.MINUS, [SHIFT, 9])
598- .add(Symbol.FUNCTION, [SHIFT, 11])
599- .add(Symbol.CELL, 12)
600- .add(Symbol.FIXEDCELL, [SHIFT, 16])
601- .add(Symbol.CELL_UPPER, [SHIFT, 17])
602- .add(Symbol.VARIABLE, [SHIFT, 14])
603- .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
604- .add(Symbol.POUND, [SHIFT, 18])
605- .build();
606-table[11] = ObjectBuilder
607- .add(Symbol.LEFT_PAREN, [SHIFT, 35])
608- .build();
609-table[12] = ObjectBuilder
610- .add(Symbol.EOF, [REDUCE, 25])
611- .add(Symbol.AMPERSAND, [REDUCE, 25])
612- .add(Symbol.EQUALS, [REDUCE, 25])
613- .add(Symbol.PLUS, [REDUCE, 25])
614- .add(Symbol.RIGHT_PAREN, [REDUCE, 25])
615- .add(Symbol.LESS_THAN, [REDUCE, 25])
616- .add(Symbol.GREATER_THAN, [REDUCE, 25])
617- .add(Symbol.NOT, [REDUCE, 25])
618- .add(Symbol.MINUS, [REDUCE, 25])
619- .add(Symbol.ASTERISK, [REDUCE, 25])
620- .add(Symbol.DIVIDE, [REDUCE, 25])
621- .add(Symbol.CARROT, [REDUCE, 25])
622- .add(Symbol.SEMI_COLON, [REDUCE, 25])
623- .add(Symbol.COMMA, [REDUCE, 25])
624- .build();
625-table[13] = ObjectBuilder
626- .add(Symbol.ERROR, 36)
627- .add(Symbol.EOF, [REDUCE, 26])
628- .add(Symbol.AMPERSAND, [REDUCE, 26])
629- .add(Symbol.EQUALS, [REDUCE, 26])
630- .add(Symbol.PLUS, [REDUCE, 26])
631- .add(Symbol.RIGHT_PAREN, [REDUCE, 26])
632- .add(Symbol.LESS_THAN, [REDUCE, 26])
633- .add(Symbol.GREATER_THAN, [REDUCE, 26])
634- .add(Symbol.NOT, [REDUCE, 26])
635- .add(Symbol.MINUS, [REDUCE, 26])
636- .add(Symbol.ASTERISK, [REDUCE, 26])
637- .add(Symbol.DIVIDE, [REDUCE, 26])
638- .add(Symbol.CARROT, [REDUCE, 26])
639- .add(Symbol.SEMI_COLON, [REDUCE, 26])
640- .add(Symbol.COMMA, [REDUCE, 26])
641- .add(Symbol.VARIABLE, [SHIFT, 37])
642- .add(Symbol.POUND, [SHIFT, 18])
643- .build();
644-table[14] = ObjectBuilder
645- .add(Symbol.EOF, [REDUCE, 36])
646- .add(Symbol.AMPERSAND, [REDUCE, 36])
647- .add(Symbol.EQUALS, [REDUCE, 36])
648- .add(Symbol.PLUS, [REDUCE, 36])
649- .add(Symbol.RIGHT_PAREN, [REDUCE, 36])
650- .add(Symbol.LESS_THAN, [REDUCE, 36])
651- .add(Symbol.GREATER_THAN, [REDUCE, 36])
652- .add(Symbol.NOT, [REDUCE, 36])
653- .add(Symbol.MINUS, [REDUCE, 36])
654- .add(Symbol.ASTERISK, [REDUCE, 36])
655- .add(Symbol.DIVIDE, [REDUCE, 36])
656- .add(Symbol.CARROT, [REDUCE, 36])
657- .add(Symbol.SEMI_COLON, [REDUCE, 36])
658- .add(Symbol.COMMA, [REDUCE, 36])
659- .add(33, [REDUCE, 36])
660- .add(Symbol.POUND, [SHIFT, 38])
661- .build();
662-table[15] = ObjectBuilder
663- .add(Symbol.EOF, [REDUCE, 38])
664- .add(Symbol.AMPERSAND, [REDUCE, 38])
665- .add(Symbol.EQUALS, [REDUCE, 38])
666- .add(Symbol.PLUS, [REDUCE, 38])
667- .add(Symbol.RIGHT_PAREN, [REDUCE, 38])
668- .add(Symbol.LESS_THAN, [REDUCE, 38])
669- .add(Symbol.GREATER_THAN, [REDUCE, 38])
670- .add(Symbol.NOT, [REDUCE, 38])
671- .add(Symbol.MINUS, [REDUCE, 38])
672- .add(Symbol.ASTERISK, [REDUCE, 38])
673- .add(Symbol.DIVIDE, [REDUCE, 38])
674- .add(Symbol.CARROT, [REDUCE, 38])
675- .add(Symbol.SEMI_COLON, [REDUCE, 38])
676- .add(Symbol.COMMA, [REDUCE, 38])
677- .add(33, [SHIFT, 39])
678- .add(Symbol.PERCENT, [REDUCE, 38])
679- .add(38, [REDUCE, 38])
680- .build();
681-table[16] = ObjectBuilder
682- .add(Symbol.EOF, [REDUCE, 28])
683- .add(Symbol.AMPERSAND, [REDUCE, 28])
684- .add(Symbol.EQUALS, [REDUCE, 28])
685- .add(Symbol.PLUS, [REDUCE, 28])
686- .add(Symbol.RIGHT_PAREN, [REDUCE, 28])
687- .add(Symbol.LESS_THAN, [REDUCE, 28])
688- .add(Symbol.GREATER_THAN, [REDUCE, 28])
689- .add(Symbol.NOT, [REDUCE, 28])
690- .add(Symbol.MINUS, [REDUCE, 28])
691- .add(Symbol.ASTERISK, [REDUCE, 28])
692- .add(Symbol.DIVIDE, [REDUCE, 28])
693- .add(Symbol.CARROT, [REDUCE, 28])
694- .add(Symbol.COLON, [SHIFT, 40])
695- .add(Symbol.SEMI_COLON, [REDUCE, 28])
696- .add(Symbol.COMMA, [REDUCE, 28])
697- .build();
698-table[17] = ObjectBuilder
699- .add(Symbol.EOF, [REDUCE, 30])
700- .add(Symbol.AMPERSAND, [REDUCE, 30])
701- .add(Symbol.EQUALS, [REDUCE, 30])
702- .add(Symbol.PLUS, [REDUCE, 30])
703- .add(Symbol.RIGHT_PAREN, [REDUCE, 30])
704- .add(Symbol.LESS_THAN, [REDUCE, 30])
705- .add(Symbol.GREATER_THAN, [REDUCE, 30])
706- .add(Symbol.NOT, [REDUCE, 30])
707- .add(Symbol.MINUS, [REDUCE, 30])
708- .add(Symbol.ASTERISK, [REDUCE, 30])
709- .add(Symbol.DIVIDE, [REDUCE, 30])
710- .add(Symbol.CARROT, [REDUCE, 30])
711- .add(Symbol.COLON, [SHIFT, 41])
712- .add(Symbol.SEMI_COLON, [REDUCE, 30])
713- .add(Symbol.COMMA, [REDUCE, 30])
714- .build();
715-table[18] = ObjectBuilder
716- .add(Symbol.VARIABLE, [SHIFT, 42])
717- .build();
718-table[19] = ObjectBuilder
719- .add(Symbol.END, [ACCEPT, 1])
720- .build();
721-table[20] = ObjectBuilder
722- .add(Symbol.ERROR, 13)
723- .add(Symbol.EXPRESSION, 43)
724- .add(Symbol.VARIABLE_SEQUENCE, 3)
725- .add(Symbol.TIME_AMPM, [SHIFT, 4])
726- .add(Symbol.TIME_24, [SHIFT, 5])
727- .add(Symbol.NUMBER, 6)
728- .add(Symbol.STRING, [SHIFT, 7])
729- .add(Symbol.PLUS, [SHIFT, 10])
730- .add(Symbol.LEFT_PAREN, [SHIFT, 8])
731- .add(Symbol.MINUS, [SHIFT, 9])
732- .add(Symbol.FUNCTION, [SHIFT, 11])
733- .add(Symbol.CELL, 12)
734- .add(Symbol.FIXEDCELL, [SHIFT, 16])
735- .add(Symbol.CELL_UPPER, [SHIFT, 17])
736- .add(Symbol.VARIABLE, [SHIFT, 14])
737- .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
738- .add(Symbol.POUND, [SHIFT, 18])
739- .build();
740-table[21] = ObjectBuilder
741- .add(Symbol.ERROR, 13)
742- .add(Symbol.EXPRESSION, 44)
743- .add(Symbol.VARIABLE_SEQUENCE, 3)
744- .add(Symbol.TIME_AMPM, [SHIFT, 4])
745- .add(Symbol.TIME_24, [SHIFT, 5])
746- .add(Symbol.NUMBER, 6)
747- .add(Symbol.STRING, [SHIFT, 7])
748- .add(Symbol.PLUS, [SHIFT, 10])
749- .add(Symbol.LEFT_PAREN, [SHIFT, 8])
750- .add(Symbol.MINUS, [SHIFT, 9])
751- .add(Symbol.FUNCTION, [SHIFT, 11])
752- .add(Symbol.CELL, 12)
753- .add(Symbol.FIXEDCELL, [SHIFT, 16])
754- .add(Symbol.CELL_UPPER, [SHIFT, 17])
755- .add(Symbol.VARIABLE, [SHIFT, 14])
756- .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
757- .add(Symbol.POUND, [SHIFT, 18])
758- .build();
759-table[22] = ObjectBuilder
760- .add(Symbol.ERROR, 13)
761- .add(Symbol.EXPRESSION, 45)
762- .add(Symbol.VARIABLE_SEQUENCE, 3)
763- .add(Symbol.TIME_AMPM, [SHIFT, 4])
764- .add(Symbol.TIME_24, [SHIFT, 5])
765- .add(Symbol.NUMBER, 6)
766- .add(Symbol.STRING, [SHIFT, 7])
767- .add(Symbol.PLUS, [SHIFT, 10])
768- .add(Symbol.LEFT_PAREN, [SHIFT, 8])
769- .add(Symbol.MINUS, [SHIFT, 9])
770- .add(Symbol.FUNCTION, [SHIFT, 11])
771- .add(Symbol.CELL, 12)
772- .add(Symbol.FIXEDCELL, [SHIFT, 16])
773- .add(Symbol.CELL_UPPER, [SHIFT, 17])
774- .add(Symbol.VARIABLE, [SHIFT, 14])
775- .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
776- .add(Symbol.POUND, [SHIFT, 18])
777- .build();
778-table[23] = ObjectBuilder
779- .add(Symbol.ERROR, 13)
780- .add(Symbol.EXPRESSION, 48)
781- .add(Symbol.VARIABLE_SEQUENCE, 3)
782- .add(Symbol.TIME_AMPM, [SHIFT, 4])
783- .add(Symbol.TIME_24, [SHIFT, 5])
784- .add(Symbol.NUMBER, 6)
785- .add(Symbol.STRING, [SHIFT, 7])
786- .add(Symbol.EQUALS, [SHIFT, 46])
787- .add(Symbol.PLUS, [SHIFT, 10])
788- .add(Symbol.LEFT_PAREN, [SHIFT, 8])
789- .add(Symbol.GREATER_THAN, [SHIFT, 47])
790- .add(Symbol.MINUS, [SHIFT, 9])
791- .add(Symbol.FUNCTION, [SHIFT, 11])
792- .add(Symbol.CELL, 12)
793- .add(Symbol.FIXEDCELL, [SHIFT, 16])
794- .add(Symbol.CELL_UPPER, [SHIFT, 17])
795- .add(Symbol.VARIABLE, [SHIFT, 14])
796- .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
797- .add(Symbol.POUND, [SHIFT, 18])
798- .build();
799-table[24] = ObjectBuilder
800- .add(Symbol.ERROR, 13)
801- .add(Symbol.EXPRESSION, 50)
802- .add(Symbol.VARIABLE_SEQUENCE, 3)
803- .add(Symbol.TIME_AMPM, [SHIFT, 4])
804- .add(Symbol.TIME_24, [SHIFT, 5])
805- .add(Symbol.NUMBER, 6)
806- .add(Symbol.STRING, [SHIFT, 7])
807- .add(Symbol.EQUALS, [SHIFT, 49])
808- .add(Symbol.PLUS, [SHIFT, 10])
809- .add(Symbol.LEFT_PAREN, [SHIFT, 8])
810- .add(Symbol.MINUS, [SHIFT, 9])
811- .add(Symbol.FUNCTION, [SHIFT, 11])
812- .add(Symbol.CELL, 12)
813- .add(Symbol.FIXEDCELL, [SHIFT, 16])
814- .add(Symbol.CELL_UPPER, [SHIFT, 17])
815- .add(Symbol.VARIABLE, [SHIFT, 14])
816- .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
817- .add(Symbol.POUND, [SHIFT, 18])
818- .build();
819-table[25] = ObjectBuilder
820- .add(Symbol.ERROR, 13)
821- .add(Symbol.EXPRESSION, 51)
822- .add(Symbol.VARIABLE_SEQUENCE, 3)
823- .add(Symbol.TIME_AMPM, [SHIFT, 4])
824- .add(Symbol.TIME_24, [SHIFT, 5])
825- .add(Symbol.NUMBER, 6)
826- .add(Symbol.STRING, [SHIFT, 7])
827- .add(Symbol.PLUS, [SHIFT, 10])
828- .add(Symbol.LEFT_PAREN, [SHIFT, 8])
829- .add(Symbol.MINUS, [SHIFT, 9])
830- .add(Symbol.FUNCTION, [SHIFT, 11])
831- .add(Symbol.CELL, 12)
832- .add(Symbol.FIXEDCELL, [SHIFT, 16])
833- .add(Symbol.CELL_UPPER, [SHIFT, 17])
834- .add(Symbol.VARIABLE, [SHIFT, 14])
835- .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
836- .add(Symbol.POUND, [SHIFT, 18])
837- .build();
838-table[26] = ObjectBuilder
839- .add(Symbol.ERROR, 13)
840- .add(Symbol.EXPRESSION, 52)
841- .add(Symbol.VARIABLE_SEQUENCE, 3)
842- .add(Symbol.TIME_AMPM, [SHIFT, 4])
843- .add(Symbol.TIME_24, [SHIFT, 5])
844- .add(Symbol.NUMBER, 6)
845- .add(Symbol.STRING, [SHIFT, 7])
846- .add(Symbol.PLUS, [SHIFT, 10])
847- .add(Symbol.LEFT_PAREN, [SHIFT, 8])
848- .add(Symbol.MINUS, [SHIFT, 9])
849- .add(Symbol.FUNCTION, [SHIFT, 11])
850- .add(Symbol.CELL, 12)
851- .add(Symbol.FIXEDCELL, [SHIFT, 16])
852- .add(Symbol.CELL_UPPER, [SHIFT, 17])
853- .add(Symbol.VARIABLE, [SHIFT, 14])
854- .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
855- .add(Symbol.POUND, [SHIFT, 18])
856- .build();
857-table[27] = ObjectBuilder
858- .add(Symbol.ERROR, 13)
859- .add(Symbol.EXPRESSION, 53)
860- .add(Symbol.VARIABLE_SEQUENCE, 3)
861- .add(Symbol.TIME_AMPM, [SHIFT, 4])
862- .add(Symbol.TIME_24, [SHIFT, 5])
863- .add(Symbol.NUMBER, 6)
864- .add(Symbol.STRING, [SHIFT, 7])
865- .add(Symbol.PLUS, [SHIFT, 10])
866- .add(Symbol.LEFT_PAREN, [SHIFT, 8])
867- .add(Symbol.MINUS, [SHIFT, 9])
868- .add(Symbol.FUNCTION, [SHIFT, 11])
869- .add(Symbol.CELL, 12)
870- .add(Symbol.FIXEDCELL, [SHIFT, 16])
871- .add(Symbol.CELL_UPPER, [SHIFT, 17])
872- .add(Symbol.VARIABLE, [SHIFT, 14])
873- .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
874- .add(Symbol.POUND, [SHIFT, 18])
875- .build();
876-table[28] = ObjectBuilder
877- .add(Symbol.ERROR, 13)
878- .add(Symbol.EXPRESSION, 54)
879- .add(Symbol.VARIABLE_SEQUENCE, 3)
880- .add(Symbol.TIME_AMPM, [SHIFT, 4])
881- .add(Symbol.TIME_24, [SHIFT, 5])
882- .add(Symbol.NUMBER, 6)
883- .add(Symbol.STRING, [SHIFT, 7])
884- .add(Symbol.PLUS, [SHIFT, 10])
885- .add(Symbol.LEFT_PAREN, [SHIFT, 8])
886- .add(Symbol.MINUS, [SHIFT, 9])
887- .add(Symbol.FUNCTION, [SHIFT, 11])
888- .add(Symbol.CELL, 12)
889- .add(Symbol.FIXEDCELL, [SHIFT, 16])
890- .add(Symbol.CELL_UPPER, [SHIFT, 17])
891- .add(Symbol.VARIABLE, [SHIFT, 14])
892- .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
893- .add(Symbol.POUND, [SHIFT, 18])
894- .build();
895-table[29] = ObjectBuilder
896- .add(Symbol.ERROR, 13)
897- .add(Symbol.EXPRESSION, 55)
898- .add(Symbol.VARIABLE_SEQUENCE, 3)
899- .add(Symbol.TIME_AMPM, [SHIFT, 4])
900- .add(Symbol.TIME_24, [SHIFT, 5])
901- .add(Symbol.NUMBER, 6)
902- .add(Symbol.STRING, [SHIFT, 7])
903- .add(Symbol.PLUS, [SHIFT, 10])
904- .add(Symbol.LEFT_PAREN, [SHIFT, 8])
905- .add(Symbol.MINUS, [SHIFT, 9])
906- .add(Symbol.FUNCTION, [SHIFT, 11])
907- .add(Symbol.CELL, 12)
908- .add(Symbol.FIXEDCELL, [SHIFT, 16])
909- .add(Symbol.CELL_UPPER, [SHIFT, 17])
910- .add(Symbol.VARIABLE, [SHIFT, 14])
911- .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
912- .add(Symbol.POUND, [SHIFT, 18])
913- .build();
914-table[30] = ObjectBuilder
915- .add(Symbol.VARIABLE, [SHIFT, 56])
916- .build();
917-table[31] = ObjectBuilder
918- .add(Symbol.EOF, [REDUCE, 40])
919- .add(Symbol.AMPERSAND, [REDUCE, 40])
920- .add(Symbol.EQUALS, [REDUCE, 40])
921- .add(Symbol.PLUS, [REDUCE, 40])
922- .add(Symbol.RIGHT_PAREN, [REDUCE, 40])
923- .add(Symbol.LESS_THAN, [REDUCE, 40])
924- .add(Symbol.GREATER_THAN, [REDUCE, 40])
925- .add(Symbol.NOT, [REDUCE, 40])
926- .add(Symbol.MINUS, [REDUCE, 40])
927- .add(Symbol.ASTERISK, [REDUCE, 40])
928- .add(Symbol.DIVIDE, [REDUCE, 40])
929- .add(Symbol.CARROT, [REDUCE, 40])
930- .add(Symbol.SEMI_COLON, [REDUCE, 40])
931- .add(Symbol.COMMA, [REDUCE, 40])
932- .add(Symbol.PERCENT, [REDUCE, 40])
933- .add(38, [REDUCE, 40])
934- .build();
935-table[32] = ObjectBuilder
936- .add(Symbol.AMPERSAND, [SHIFT, 20])
937- .add(Symbol.EQUALS, [SHIFT, 21])
938- .add(Symbol.PLUS, [SHIFT, 22])
939- .add(Symbol.RIGHT_PAREN, [SHIFT, 57])
940- .add(Symbol.LESS_THAN, [SHIFT, 23])
941- .add(Symbol.GREATER_THAN, [SHIFT, 24])
942- .add(Symbol.NOT, [SHIFT, 25])
943- .add(Symbol.MINUS, [SHIFT, 26])
944- .add(Symbol.ASTERISK, [SHIFT, 27])
945- .add(Symbol.DIVIDE, [SHIFT, 28])
946- .add(Symbol.CARROT, [SHIFT, 29])
947- .build();
948-table[33] = ObjectBuilder
949- .add(Symbol.EOF, [REDUCE, 21])
950- .add(Symbol.AMPERSAND, [SHIFT, 20])
951- .add(Symbol.EQUALS, [REDUCE, 21])
952- .add(Symbol.PLUS, [REDUCE, 21])
953- .add(Symbol.RIGHT_PAREN, [REDUCE, 21])
954- .add(Symbol.LESS_THAN, [REDUCE, 21])
955- .add(Symbol.GREATER_THAN, [REDUCE, 21])
956- .add(Symbol.NOT, [REDUCE, 21])
957- .add(Symbol.MINUS, [REDUCE, 21])
958- .add(Symbol.ASTERISK, [SHIFT, 27])
959- .add(Symbol.DIVIDE, [SHIFT, 28])
960- .add(Symbol.CARROT, [SHIFT, 29])
961- .add(Symbol.SEMI_COLON, [REDUCE, 21])
962- .add(Symbol.COMMA, [REDUCE, 21])
963- .build();
964-table[34] = ObjectBuilder
965- .add(Symbol.EOF, [REDUCE, 22])
966- .add(Symbol.AMPERSAND, [SHIFT, 20])
967- .add(Symbol.EQUALS, [REDUCE, 22])
968- .add(Symbol.PLUS, [REDUCE, 22])
969- .add(Symbol.RIGHT_PAREN, [REDUCE, 22])
970- .add(Symbol.LESS_THAN, [REDUCE, 22])
971- .add(Symbol.GREATER_THAN, [REDUCE, 22])
972- .add(Symbol.NOT, [REDUCE, 22])
973- .add(Symbol.MINUS, [REDUCE, 22])
974- .add(Symbol.ASTERISK, [SHIFT, 27])
975- .add(Symbol.DIVIDE, [SHIFT, 28])
976- .add(Symbol.CARROT, [SHIFT, 29])
977- .add(Symbol.SEMI_COLON, [REDUCE, 22])
978- .add(Symbol.COMMA, [REDUCE, 22])
979- .build();
980-table[35] = ObjectBuilder
981- .add(Symbol.ERROR, 13)
982- .add(Symbol.EXPRESSION, 60)
983- .add(Symbol.VARIABLE_SEQUENCE, 3)
984- .add(Symbol.TIME_AMPM, [SHIFT, 4])
985- .add(Symbol.TIME_24, [SHIFT, 5])
986- .add(Symbol.NUMBER, 6)
987- .add(Symbol.STRING, [SHIFT, 7])
988- .add(Symbol.PLUS, [SHIFT, 10])
989- .add(Symbol.LEFT_PAREN, [SHIFT, 8])
990- .add(Symbol.RIGHT_PAREN, [SHIFT, 58])
991- .add(Symbol.MINUS, [SHIFT, 9])
992- .add(Symbol.FUNCTION, [SHIFT, 11])
993- .add(Symbol.EXP_SEQ, 59)
994- .add(Symbol.CELL, 12)
995- .add(Symbol.FIXEDCELL, [SHIFT, 16])
996- .add(Symbol.CELL_UPPER, [SHIFT, 17])
997- .add(Symbol.ARRAY, [SHIFT, 61])
998- .add(Symbol.VARIABLE, [SHIFT, 14])
999- .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
1000- .add(Symbol.POUND, [SHIFT, 18])
1001- .build();
1002-table[36] = ObjectBuilder
1003- .add(Symbol.EOF, [REDUCE, 27])
1004- .add(Symbol.AMPERSAND, [REDUCE, 27])
1005- .add(Symbol.EQUALS, [REDUCE, 27])
1006- .add(Symbol.PLUS, [REDUCE, 27])
1007- .add(Symbol.RIGHT_PAREN, [REDUCE, 27])
1008- .add(Symbol.LESS_THAN, [REDUCE, 27])
1009- .add(Symbol.GREATER_THAN, [REDUCE, 27])
1010- .add(Symbol.NOT, [REDUCE, 27])
1011- .add(Symbol.MINUS, [REDUCE, 27])
1012- .add(Symbol.ASTERISK, [REDUCE, 27])
1013- .add(Symbol.DIVIDE, [REDUCE, 27])
1014- .add(Symbol.CARROT, [REDUCE, 27])
1015- .add(Symbol.SEMI_COLON, [REDUCE, 27])
1016- .add(Symbol.COMMA, [REDUCE, 27])
1017- .build();
1018-table[37] = ObjectBuilder
1019- .add(Symbol.POUND, [SHIFT, 38])
1020- .build();
1021-table[38] = ObjectBuilder
1022- .add(Symbol.VARIABLE, [SHIFT, 62])
1023- .build();
1024-table[39] = ObjectBuilder
1025- .add(Symbol.NUMBER_UPPER, [SHIFT, 63])
1026- .build();
1027-table[40] = ObjectBuilder
1028- .add(Symbol.FIXEDCELL, [SHIFT, 64])
1029- .build();
1030-table[41] = ObjectBuilder
1031- .add(Symbol.CELL_UPPER, [SHIFT, 65])
1032- .build();
1033-table[42] = ObjectBuilder
1034- .add(Symbol.EXCLAMATION_POINT, [SHIFT, 66])
1035- .build();
1036-table[43] = ObjectBuilder
1037- .add(Symbol.EOF, [REDUCE, 7])
1038- .add(Symbol.AMPERSAND, [REDUCE, 7])
1039- .add(Symbol.EQUALS, [REDUCE, 7])
1040- .add(Symbol.PLUS, [REDUCE, 7])
1041- .add(Symbol.RIGHT_PAREN, [REDUCE, 7])
1042- .add(Symbol.LESS_THAN, [REDUCE, 7])
1043- .add(Symbol.GREATER_THAN, [REDUCE, 7])
1044- .add(Symbol.NOT, [REDUCE, 7])
1045- .add(Symbol.MINUS, [REDUCE, 7])
1046- .add(Symbol.ASTERISK, [REDUCE, 7])
1047- .add(Symbol.DIVIDE, [REDUCE, 7])
1048- .add(Symbol.CARROT, [REDUCE, 7])
1049- .add(Symbol.SEMI_COLON, [REDUCE, 7])
1050- .add(Symbol.COMMA, [REDUCE, 7])
1051- .build();
1052-table[44] = ObjectBuilder
1053- .add(Symbol.EOF, [REDUCE, 8])
1054- .add(Symbol.AMPERSAND, [SHIFT, 20])
1055- .add(Symbol.EQUALS, [REDUCE, 8])
1056- .add(Symbol.PLUS, [SHIFT, 22])
1057- .add(Symbol.RIGHT_PAREN, [REDUCE, 8])
1058- .add(Symbol.LESS_THAN, [SHIFT, 23])
1059- .add(Symbol.GREATER_THAN, [SHIFT, 24])
1060- .add(Symbol.NOT, [SHIFT, 25])
1061- .add(Symbol.MINUS, [SHIFT, 26])
1062- .add(Symbol.ASTERISK, [SHIFT, 27])
1063- .add(Symbol.DIVIDE, [SHIFT, 28])
1064- .add(Symbol.CARROT, [SHIFT, 29])
1065- .add(Symbol.SEMI_COLON, [REDUCE, 8])
1066- .add(Symbol.COMMA, [REDUCE, 8])
1067- .build();
1068-table[45] = ObjectBuilder
1069- .add(Symbol.EOF, [REDUCE, 9])
1070- .add(Symbol.AMPERSAND, [SHIFT, 20])
1071- .add(Symbol.EQUALS, [REDUCE, 9])
1072- .add(Symbol.PLUS, [REDUCE, 9])
1073- .add(Symbol.RIGHT_PAREN, [REDUCE, 9])
1074- .add(Symbol.LESS_THAN, [REDUCE, 9])
1075- .add(Symbol.GREATER_THAN, [REDUCE, 9])
1076- .add(Symbol.NOT, [REDUCE, 9])
1077- .add(Symbol.MINUS, [REDUCE, 9])
1078- .add(Symbol.ASTERISK, [SHIFT, 27])
1079- .add(Symbol.DIVIDE, [SHIFT, 28])
1080- .add(Symbol.CARROT, [SHIFT, 29])
1081- .add(Symbol.SEMI_COLON, [REDUCE, 9])
1082- .add(Symbol.COMMA, [REDUCE, 9])
1083- .build();
1084-table[46] = ObjectBuilder
1085- .add(Symbol.ERROR, 13)
1086- .add(Symbol.EXPRESSION, 67)
1087- .add(Symbol.VARIABLE_SEQUENCE, 3)
1088- .add(Symbol.TIME_AMPM, [SHIFT, 4])
1089- .add(Symbol.TIME_24, [SHIFT, 5])
1090- .add(Symbol.NUMBER, 6)
1091- .add(Symbol.STRING, [SHIFT, 7])
1092- .add(Symbol.PLUS, [SHIFT, 10])
1093- .add(Symbol.LEFT_PAREN, [SHIFT, 8])
1094- .add(Symbol.MINUS, [SHIFT, 9])
1095- .add(Symbol.FUNCTION, [SHIFT, 11])
1096- .add(Symbol.CELL, 12)
1097- .add(Symbol.FIXEDCELL, [SHIFT, 16])
1098- .add(Symbol.CELL_UPPER, [SHIFT, 17])
1099- .add(Symbol.VARIABLE, [SHIFT, 14])
1100- .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
1101- .add(Symbol.POUND, [SHIFT, 18])
1102- .build();
1103-table[47] = ObjectBuilder
1104- .add(Symbol.ERROR, 13)
1105- .add(Symbol.EXPRESSION, 68)
1106- .add(Symbol.VARIABLE_SEQUENCE, 3)
1107- .add(Symbol.TIME_AMPM, [SHIFT, 4])
1108- .add(Symbol.TIME_24, [SHIFT, 5])
1109- .add(Symbol.NUMBER, 6)
1110- .add(Symbol.STRING, [SHIFT, 7])
1111- .add(Symbol.PLUS, [SHIFT, 10])
1112- .add(Symbol.LEFT_PAREN, [SHIFT, 8])
1113- .add(Symbol.MINUS, [SHIFT, 9])
1114- .add(Symbol.FUNCTION, [SHIFT, 11])
1115- .add(Symbol.CELL, 12)
1116- .add(Symbol.FIXEDCELL, [SHIFT, 16])
1117- .add(Symbol.CELL_UPPER, [SHIFT, 17])
1118- .add(Symbol.VARIABLE, [SHIFT, 14])
1119- .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
1120- .add(Symbol.POUND, [SHIFT, 18])
1121- .build();
1122-table[48] = ObjectBuilder
1123- .add(Symbol.EOF, [REDUCE, 16])
1124- .add(Symbol.AMPERSAND, [SHIFT, 20])
1125- .add(Symbol.EQUALS, [REDUCE, 16])
1126- .add(Symbol.PLUS, [SHIFT, 22])
1127- .add(Symbol.RIGHT_PAREN, [REDUCE, 16])
1128- .add(Symbol.LESS_THAN, [REDUCE, 16])
1129- .add(Symbol.GREATER_THAN, [REDUCE, 16])
1130- .add(Symbol.NOT, [REDUCE, 16])
1131- .add(Symbol.MINUS, [SHIFT, 26])
1132- .add(Symbol.ASTERISK, [SHIFT, 27])
1133- .add(Symbol.DIVIDE, [SHIFT, 28])
1134- .add(Symbol.CARROT, [SHIFT, 29])
1135- .add(Symbol.SEMI_COLON, [REDUCE, 16])
1136- .add(Symbol.COMMA, [REDUCE, 16])
1137- .build();
1138-table[49] = ObjectBuilder
1139- .add(Symbol.ERROR, 13)
1140- .add(Symbol.EXPRESSION, 69)
1141- .add(Symbol.VARIABLE_SEQUENCE, 3)
1142- .add(Symbol.TIME_AMPM, [SHIFT, 4])
1143- .add(Symbol.TIME_24, [SHIFT, 5])
1144- .add(Symbol.NUMBER, 6)
1145- .add(Symbol.STRING, [SHIFT, 7])
1146- .add(Symbol.PLUS, [SHIFT, 10])
1147- .add(Symbol.LEFT_PAREN, [SHIFT, 8])
1148- .add(Symbol.MINUS, [SHIFT, 9])
1149- .add(Symbol.FUNCTION, [SHIFT, 11])
1150- .add(Symbol.CELL, 12)
1151- .add(Symbol.FIXEDCELL, [SHIFT, 16])
1152- .add(Symbol.CELL_UPPER, [SHIFT, 17])
1153- .add(Symbol.VARIABLE, [SHIFT, 14])
1154- .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
1155- .add(Symbol.POUND, [SHIFT, 18])
1156- .build();
1157-table[50] = ObjectBuilder
1158- .add(Symbol.EOF, [REDUCE, 15])
1159- .add(Symbol.AMPERSAND, [SHIFT, 20])
1160- .add(Symbol.EQUALS, [REDUCE, 15])
1161- .add(Symbol.PLUS, [SHIFT, 22])
1162- .add(Symbol.RIGHT_PAREN, [REDUCE, 15])
1163- .add(Symbol.LESS_THAN, [REDUCE, 15])
1164- .add(Symbol.GREATER_THAN, [REDUCE, 15])
1165- .add(Symbol.NOT, [REDUCE, 15])
1166- .add(Symbol.MINUS, [SHIFT, 26])
1167- .add(Symbol.ASTERISK, [SHIFT, 27])
1168- .add(Symbol.DIVIDE, [SHIFT, 28])
1169- .add(Symbol.CARROT, [SHIFT, 29])
1170- .add(Symbol.SEMI_COLON, [REDUCE, 15])
1171- .add(Symbol.COMMA, [REDUCE, 15])
1172- .build();
1173-table[51] = ObjectBuilder
1174- .add(Symbol.EOF, [REDUCE, 14])
1175- .add(Symbol.AMPERSAND, [SHIFT, 20])
1176- .add(Symbol.EQUALS, [REDUCE, 14])
1177- .add(Symbol.PLUS, [SHIFT, 22])
1178- .add(Symbol.RIGHT_PAREN, [REDUCE, 14])
1179- .add(Symbol.LESS_THAN, [SHIFT, 23])
1180- .add(Symbol.GREATER_THAN, [SHIFT, 24])
1181- .add(Symbol.NOT, [REDUCE, 14])
1182- .add(Symbol.MINUS, [SHIFT, 26])
1183- .add(Symbol.ASTERISK, [SHIFT, 27])
1184- .add(Symbol.DIVIDE, [SHIFT, 28])
1185- .add(Symbol.CARROT, [SHIFT, 29])
1186- .add(Symbol.SEMI_COLON, [REDUCE, 14])
1187- .add(Symbol.COMMA, [REDUCE, 14])
1188- .build();
1189-table[52] = ObjectBuilder
1190- .add(Symbol.EOF, [REDUCE, 17])
1191- .add(Symbol.AMPERSAND, [SHIFT, 20])
1192- .add(Symbol.EQUALS, [REDUCE, 17])
1193- .add(Symbol.PLUS, [REDUCE, 17])
1194- .add(Symbol.RIGHT_PAREN, [REDUCE, 17])
1195- .add(Symbol.LESS_THAN, [REDUCE, 17])
1196- .add(Symbol.GREATER_THAN, [REDUCE, 17])
1197- .add(Symbol.NOT, [REDUCE, 17])
1198- .add(Symbol.MINUS, [REDUCE, 17])
1199- .add(Symbol.ASTERISK, [SHIFT, 27])
1200- .add(Symbol.DIVIDE, [SHIFT, 28])
1201- .add(Symbol.CARROT, [SHIFT, 29])
1202- .add(Symbol.SEMI_COLON, [REDUCE, 17])
1203- .add(Symbol.COMMA, [REDUCE, 17])
1204- .build();
1205-table[53] = ObjectBuilder
1206- .add(Symbol.EOF, [REDUCE, 18])
1207- .add(Symbol.AMPERSAND, [SHIFT, 20])
1208- .add(Symbol.EQUALS, [REDUCE, 18])
1209- .add(Symbol.PLUS, [REDUCE, 18])
1210- .add(Symbol.RIGHT_PAREN, [REDUCE, 18])
1211- .add(Symbol.LESS_THAN, [REDUCE, 18])
1212- .add(Symbol.GREATER_THAN, [REDUCE, 18])
1213- .add(Symbol.NOT, [REDUCE, 18])
1214- .add(Symbol.MINUS, [REDUCE, 18])
1215- .add(Symbol.ASTERISK, [REDUCE, 18])
1216- .add(Symbol.DIVIDE, [REDUCE, 18])
1217- .add(Symbol.CARROT, [SHIFT, 29])
1218- .add(Symbol.SEMI_COLON, [REDUCE, 18])
1219- .add(Symbol.COMMA, [REDUCE, 18])
1220- .build();
1221-table[54] = ObjectBuilder
1222- .add(Symbol.EOF, [REDUCE, 19])
1223- .add(Symbol.AMPERSAND, [SHIFT, 20])
1224- .add(Symbol.EQUALS, [REDUCE, 19])
1225- .add(Symbol.PLUS, [REDUCE, 19])
1226- .add(Symbol.RIGHT_PAREN, [REDUCE, 19])
1227- .add(Symbol.LESS_THAN, [REDUCE, 19])
1228- .add(Symbol.GREATER_THAN, [REDUCE, 19])
1229- .add(Symbol.NOT, [REDUCE, 19])
1230- .add(Symbol.MINUS, [REDUCE, 19])
1231- .add(Symbol.ASTERISK, [REDUCE, 19])
1232- .add(Symbol.DIVIDE, [REDUCE, 19])
1233- .add(Symbol.CARROT, [SHIFT, 29])
1234- .add(Symbol.SEMI_COLON, [REDUCE, 19])
1235- .add(Symbol.COMMA, [REDUCE, 19])
1236- .build();
1237-table[55] = ObjectBuilder
1238- .add(Symbol.EOF, [REDUCE, 20])
1239- .add(Symbol.AMPERSAND, [SHIFT, 20])
1240- .add(Symbol.EQUALS, [REDUCE, 20])
1241- .add(Symbol.PLUS, [REDUCE, 20])
1242- .add(Symbol.RIGHT_PAREN, [REDUCE, 20])
1243- .add(Symbol.LESS_THAN, [REDUCE, 20])
1244- .add(Symbol.GREATER_THAN, [REDUCE, 20])
1245- .add(Symbol.NOT, [REDUCE, 20])
1246- .add(Symbol.MINUS, [REDUCE, 20])
1247- .add(Symbol.ASTERISK, [REDUCE, 20])
1248- .add(Symbol.DIVIDE, [REDUCE, 20])
1249- .add(Symbol.CARROT, [REDUCE, 20])
1250- .add(Symbol.SEMI_COLON, [REDUCE, 20])
1251- .add(Symbol.COMMA, [REDUCE, 20])
1252- .build();
1253-table[56] = ObjectBuilder
1254- .add(Symbol.EOF, [REDUCE, 37])
1255- .add(Symbol.AMPERSAND, [REDUCE, 37])
1256- .add(Symbol.EQUALS, [REDUCE, 37])
1257- .add(Symbol.PLUS, [REDUCE, 37])
1258- .add(Symbol.RIGHT_PAREN, [REDUCE, 37])
1259- .add(Symbol.LESS_THAN, [REDUCE, 37])
1260- .add(Symbol.GREATER_THAN, [REDUCE, 37])
1261- .add(Symbol.NOT, [REDUCE, 37])
1262- .add(Symbol.MINUS, [REDUCE, 37])
1263- .add(Symbol.ASTERISK, [REDUCE, 37])
1264- .add(Symbol.DIVIDE, [REDUCE, 37])
1265- .add(Symbol.CARROT, [REDUCE, 37])
1266- .add(Symbol.SEMI_COLON, [REDUCE, 37])
1267- .add(Symbol.COMMA, [REDUCE, 37])
1268- .add(33, [REDUCE, 37])
1269- .build();
1270-table[57] = ObjectBuilder
1271- .add(Symbol.EOF, [REDUCE, 10])
1272- .add(Symbol.AMPERSAND, [REDUCE, 10])
1273- .add(Symbol.EQUALS, [REDUCE, 10])
1274- .add(Symbol.PLUS, [REDUCE, 10])
1275- .add(Symbol.RIGHT_PAREN, [REDUCE, 10])
1276- .add(Symbol.LESS_THAN, [REDUCE, 10])
1277- .add(Symbol.GREATER_THAN, [REDUCE, 10])
1278- .add(Symbol.NOT, [REDUCE, 10])
1279- .add(Symbol.MINUS, [REDUCE, 10])
1280- .add(Symbol.ASTERISK, [REDUCE, 10])
1281- .add(Symbol.DIVIDE, [REDUCE, 10])
1282- .add(Symbol.CARROT, [REDUCE, 10])
1283- .add(Symbol.SEMI_COLON, [REDUCE, 10])
1284- .add(Symbol.COMMA, [REDUCE, 10])
1285- .build();
1286-table[58] = ObjectBuilder
1287- .add(Symbol.EOF, [REDUCE, 23])
1288- .add(Symbol.AMPERSAND, [REDUCE, 23])
1289- .add(Symbol.EQUALS, [REDUCE, 23])
1290- .add(Symbol.PLUS, [REDUCE, 23])
1291- .add(Symbol.RIGHT_PAREN, [REDUCE, 23])
1292- .add(Symbol.LESS_THAN, [REDUCE, 23])
1293- .add(Symbol.GREATER_THAN, [REDUCE, 23])
1294- .add(Symbol.NOT, [REDUCE, 23])
1295- .add(Symbol.MINUS, [REDUCE, 23])
1296- .add(Symbol.ASTERISK, [REDUCE, 23])
1297- .add(Symbol.DIVIDE, [REDUCE, 23])
1298- .add(Symbol.CARROT, [REDUCE, 23])
1299- .add(Symbol.SEMI_COLON, [REDUCE, 23])
1300- .add(Symbol.COMMA, [REDUCE, 23])
1301- .build();
1302-table[59] = ObjectBuilder
1303- .add(Symbol.RIGHT_PAREN, [SHIFT, 70])
1304- .add(Symbol.SEMI_COLON, [SHIFT, 71])
1305- .add(Symbol.COMMA, [SHIFT, 72])
1306- .build();
1307-table[60] = ObjectBuilder
1308- .add(Symbol.AMPERSAND, [SHIFT, 20])
1309- .add(Symbol.EQUALS, [SHIFT, 21])
1310- .add(Symbol.PLUS, [SHIFT, 22])
1311- .add(Symbol.RIGHT_PAREN, [REDUCE, 32])
1312- .add(Symbol.LESS_THAN, [SHIFT, 23])
1313- .add(Symbol.GREATER_THAN, [SHIFT, 24])
1314- .add(Symbol.NOT, [SHIFT, 25])
1315- .add(Symbol.MINUS, [SHIFT, 26])
1316- .add(Symbol.ASTERISK, [SHIFT, 27])
1317- .add(Symbol.DIVIDE, [SHIFT, 28])
1318- .add(Symbol.CARROT, [SHIFT, 29])
1319- .add(Symbol.SEMI_COLON, [REDUCE, 32])
1320- .add(Symbol.COMMA, [REDUCE, 32])
1321- .build();
1322-table[61] = ObjectBuilder
1323- .add(Symbol.RIGHT_PAREN, [REDUCE, 33])
1324- .add(Symbol.SEMI_COLON, [REDUCE, 33])
1325- .add(Symbol.COMMA, [REDUCE, 33])
1326- .build();
1327-table[62] = ObjectBuilder
1328- .add(Symbol.EXCLAMATION_POINT, [SHIFT, 73])
1329- .build();
1330-table[63] = ObjectBuilder
1331- .add(Symbol.EOF, [REDUCE, 39])
1332- .add(Symbol.AMPERSAND, [REDUCE, 39])
1333- .add(Symbol.EQUALS, [REDUCE, 39])
1334- .add(Symbol.PLUS, [REDUCE, 39])
1335- .add(Symbol.RIGHT_PAREN, [REDUCE, 39])
1336- .add(Symbol.LESS_THAN, [REDUCE, 39])
1337- .add(Symbol.GREATER_THAN, [REDUCE, 39])
1338- .add(Symbol.NOT, [REDUCE, 39])
1339- .add(Symbol.MINUS, [REDUCE, 39])
1340- .add(Symbol.ASTERISK, [REDUCE, 39])
1341- .add(Symbol.DIVIDE, [REDUCE, 39])
1342- .add(Symbol.CARROT, [REDUCE, 39])
1343- .add(Symbol.SEMI_COLON, [REDUCE, 39])
1344- .add(Symbol.COMMA, [REDUCE, 39])
1345- .add(Symbol.PERCENT, [REDUCE, 39])
1346- .add(38, [REDUCE, 39]).build();
1347-table[64] = ObjectBuilder
1348- .add(Symbol.EOF, [REDUCE, 29])
1349- .add(Symbol.AMPERSAND, [REDUCE, 29])
1350- .add(Symbol.EQUALS, [REDUCE, 29])
1351- .add(Symbol.PLUS, [REDUCE, 29])
1352- .add(Symbol.RIGHT_PAREN, [REDUCE, 29])
1353- .add(Symbol.LESS_THAN, [REDUCE, 29])
1354- .add(Symbol.GREATER_THAN, [REDUCE, 29])
1355- .add(Symbol.NOT, [REDUCE, 29])
1356- .add(Symbol.MINUS, [REDUCE, 29])
1357- .add(Symbol.ASTERISK, [REDUCE, 29])
1358- .add(Symbol.DIVIDE, [REDUCE, 29])
1359- .add(Symbol.CARROT, [REDUCE, 29])
1360- .add(Symbol.SEMI_COLON, [REDUCE, 29])
1361- .add(Symbol.COMMA, [REDUCE, 29]).build();
1362-table[65] = ObjectBuilder
1363- .add(Symbol.EOF, [REDUCE, 31])
1364- .add(Symbol.AMPERSAND, [REDUCE, 31])
1365- .add(Symbol.EQUALS, [REDUCE, 31])
1366- .add(Symbol.PLUS, [REDUCE, 31])
1367- .add(Symbol.RIGHT_PAREN, [REDUCE, 31])
1368- .add(Symbol.LESS_THAN, [REDUCE, 31])
1369- .add(Symbol.GREATER_THAN, [REDUCE, 31])
1370- .add(Symbol.NOT, [REDUCE, 31])
1371- .add(Symbol.MINUS, [REDUCE, 31])
1372- .add(Symbol.ASTERISK, [REDUCE, 31])
1373- .add(Symbol.DIVIDE, [REDUCE, 31])
1374- .add(Symbol.CARROT, [REDUCE, 31])
1375- .add(Symbol.SEMI_COLON, [REDUCE, 31])
1376- .add(Symbol.COMMA, [REDUCE, 31]).build();
1377-table[66] = ObjectBuilder
1378- .add(Symbol.EOF, [REDUCE, 41])
1379- .add(Symbol.AMPERSAND, [REDUCE, 41])
1380- .add(Symbol.EQUALS, [REDUCE, 41])
1381- .add(Symbol.PLUS, [REDUCE, 41])
1382- .add(Symbol.RIGHT_PAREN, [REDUCE, 41])
1383- .add(Symbol.LESS_THAN, [REDUCE, 41])
1384- .add(Symbol.GREATER_THAN, [REDUCE, 41])
1385- .add(Symbol.NOT, [REDUCE, 41])
1386- .add(Symbol.MINUS, [REDUCE, 41])
1387- .add(Symbol.ASTERISK, [REDUCE, 41])
1388- .add(Symbol.DIVIDE, [REDUCE, 41])
1389- .add(Symbol.CARROT, [REDUCE, 41])
1390- .add(Symbol.SEMI_COLON, [REDUCE, 41])
1391- .add(Symbol.COMMA, [REDUCE, 41])
1392- .add(Symbol.VARIABLE, [REDUCE, 41])
1393- .add(Symbol.POUND, [REDUCE, 41]).build();
1394-table[67] = ObjectBuilder
1395- .add(Symbol.EOF, [REDUCE, 11])
1396- .add(Symbol.AMPERSAND, [SHIFT, 20])
1397- .add(Symbol.EQUALS, [REDUCE, 11])
1398- .add(Symbol.PLUS, [SHIFT, 22])
1399- .add(Symbol.RIGHT_PAREN, [REDUCE, 11])
1400- .add(Symbol.LESS_THAN, [REDUCE, 11])
1401- .add(Symbol.GREATER_THAN, [REDUCE, 11])
1402- .add(Symbol.NOT, [REDUCE, 11])
1403- .add(Symbol.MINUS, [SHIFT, 26])
1404- .add(Symbol.ASTERISK, [SHIFT, 27])
1405- .add(Symbol.DIVIDE, [SHIFT, 28])
1406- .add(Symbol.CARROT, [SHIFT, 29])
1407- .add(Symbol.SEMI_COLON, [REDUCE, 11])
1408- .add(Symbol.COMMA, [REDUCE, 11]).build();
1409-table[68] = ObjectBuilder
1410- .add(Symbol.EOF, [REDUCE, 13])
1411- .add(Symbol.AMPERSAND, [SHIFT, 20])
1412- .add(Symbol.EQUALS, [REDUCE, 13])
1413- .add(Symbol.PLUS, [SHIFT, 22])
1414- .add(Symbol.RIGHT_PAREN, [REDUCE, 13])
1415- .add(Symbol.LESS_THAN, [REDUCE, 13])
1416- .add(Symbol.GREATER_THAN, [REDUCE, 13])
1417- .add(Symbol.NOT, [REDUCE, 13])
1418- .add(Symbol.MINUS, [SHIFT, 26])
1419- .add(Symbol.ASTERISK, [SHIFT, 27])
1420- .add(Symbol.DIVIDE, [SHIFT, 28])
1421- .add(Symbol.CARROT, [SHIFT, 29])
1422- .add(Symbol.SEMI_COLON, [REDUCE, 13])
1423- .add(Symbol.COMMA, [REDUCE, 13]).build();
1424-table[69] = ObjectBuilder
1425- .add(Symbol.EOF, [REDUCE, 12])
1426- .add(Symbol.AMPERSAND, [SHIFT, 20])
1427- .add(Symbol.EQUALS, [REDUCE, 12])
1428- .add(Symbol.PLUS, [SHIFT, 22])
1429- .add(Symbol.RIGHT_PAREN, [REDUCE, 12])
1430- .add(Symbol.LESS_THAN, [REDUCE, 12])
1431- .add(Symbol.GREATER_THAN, [REDUCE, 12])
1432- .add(Symbol.NOT, [REDUCE, 12])
1433- .add(Symbol.MINUS, [SHIFT, 26])
1434- .add(Symbol.ASTERISK, [SHIFT, 27])
1435- .add(Symbol.DIVIDE, [SHIFT, 28])
1436- .add(Symbol.CARROT, [SHIFT, 29])
1437- .add(Symbol.SEMI_COLON, [REDUCE, 12])
1438- .add(Symbol.COMMA, [REDUCE, 12]).build();
1439-table[70] = ObjectBuilder
1440- .add(Symbol.EOF, [REDUCE, 24])
1441- .add(Symbol.AMPERSAND, [REDUCE, 24])
1442- .add(Symbol.EQUALS, [REDUCE, 24])
1443- .add(Symbol.PLUS, [REDUCE, 24])
1444- .add(Symbol.RIGHT_PAREN, [REDUCE, 24])
1445- .add(Symbol.LESS_THAN, [REDUCE, 24])
1446- .add(Symbol.GREATER_THAN, [REDUCE, 24])
1447- .add(Symbol.NOT, [REDUCE, 24])
1448- .add(Symbol.MINUS, [REDUCE, 24])
1449- .add(Symbol.ASTERISK, [REDUCE, 24])
1450- .add(Symbol.DIVIDE, [REDUCE, 24])
1451- .add(Symbol.CARROT, [REDUCE, 24])
1452- .add(Symbol.SEMI_COLON, [REDUCE, 24])
1453- .add(Symbol.COMMA, [REDUCE, 24]).build();
1454-table[71] = ObjectBuilder
1455- .add(Symbol.ERROR, 13)
1456- .add(Symbol.EXPRESSION, 74)
1457- .add(Symbol.VARIABLE_SEQUENCE, 3)
1458- .add(Symbol.TIME_AMPM, [SHIFT, 4])
1459- .add(Symbol.TIME_24, [SHIFT, 5])
1460- .add(Symbol.NUMBER, 6)
1461- .add(Symbol.STRING, [SHIFT, 7])
1462- .add(Symbol.EQUALS, [SHIFT, 21])
1463- .add(Symbol.PLUS, [SHIFT, 10])
1464- .add(Symbol.LEFT_PAREN, [SHIFT, 8])
1465- .add(Symbol.MINUS, [SHIFT, 9])
1466- .add(Symbol.FUNCTION, [SHIFT, 11])
1467- .add(Symbol.CELL, 12)
1468- .add(Symbol.FIXEDCELL, [SHIFT, 16])
1469- .add(Symbol.CELL_UPPER, [SHIFT, 17])
1470- .add(Symbol.VARIABLE, [SHIFT, 14])
1471- .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
1472- .add(Symbol.POUND, [SHIFT, 18]).build();
1473-table[72] = ObjectBuilder
1474- .add(Symbol.ERROR, 13)
1475- .add(Symbol.EXPRESSION, 75)
1476- .add(Symbol.VARIABLE_SEQUENCE, 3)
1477- .add(Symbol.TIME_AMPM, [SHIFT, 4])
1478- .add(Symbol.TIME_24, [SHIFT, 5])
1479- .add(Symbol.NUMBER, 6)
1480- .add(Symbol.STRING, [SHIFT, 7])
1481- .add(Symbol.EQUALS, [SHIFT, 21])
1482- .add(Symbol.PLUS, [SHIFT, 10])
1483- .add(Symbol.LEFT_PAREN, [SHIFT, 8])
1484- .add(Symbol.MINUS, [SHIFT, 9])
1485- .add(Symbol.FUNCTION, [SHIFT, 11])
1486- .add(Symbol.CELL, 12)
1487- .add(Symbol.FIXEDCELL, [SHIFT, 16])
1488- .add(Symbol.CELL_UPPER, [SHIFT, 17])
1489- .add(Symbol.VARIABLE, [SHIFT, 14])
1490- .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
1491- .add(Symbol.POUND, [SHIFT, 18]).build();
1492-table[73] = ObjectBuilder
1493- .add(Symbol.EOF, [REDUCE, 42])
1494- .add(Symbol.AMPERSAND, [REDUCE, 42])
1495- .add(Symbol.EQUALS, [REDUCE, 42])
1496- .add(Symbol.PLUS, [REDUCE, 42])
1497- .add(Symbol.RIGHT_PAREN, [REDUCE, 42])
1498- .add(Symbol.LESS_THAN, [REDUCE, 42])
1499- .add(Symbol.GREATER_THAN, [REDUCE, 42])
1500- .add(Symbol.NOT, [REDUCE, 42])
1501- .add(Symbol.MINUS, [REDUCE, 42])
1502- .add(Symbol.ASTERISK, [REDUCE, 42])
1503- .add(Symbol.DIVIDE, [REDUCE, 42])
1504- .add(Symbol.CARROT, [REDUCE, 42])
1505- .add(Symbol.SEMI_COLON, [REDUCE, 42])
1506- .add(Symbol.COMMA, [REDUCE, 42])
1507- .add(Symbol.VARIABLE, [REDUCE, 42])
1508- .add(Symbol.POUND, [REDUCE, 42]).build();
1509-table[74] = ObjectBuilder
1510- .add(Symbol.AMPERSAND, [SHIFT, 20])
1511- .add(Symbol.EQUALS, [SHIFT, 21])
1512- .add(Symbol.PLUS, [SHIFT, 22])
1513- .add(Symbol.RIGHT_PAREN, [REDUCE, 34])
1514- .add(Symbol.LESS_THAN, [SHIFT, 23])
1515- .add(Symbol.GREATER_THAN, [SHIFT, 24])
1516- .add(Symbol.NOT, [SHIFT, 25])
1517- .add(Symbol.MINUS, [SHIFT, 26])
1518- .add(Symbol.ASTERISK, [SHIFT, 27])
1519- .add(Symbol.DIVIDE, [SHIFT, 28])
1520- .add(Symbol.CARROT, [SHIFT, 29])
1521- .add(Symbol.SEMI_COLON, [REDUCE, 34])
1522- .add(Symbol.COMMA, [REDUCE, 34]).build();
1523-table[75] = ObjectBuilder
1524- .add(Symbol.AMPERSAND, [SHIFT, 20])
1525- .add(Symbol.EQUALS, [SHIFT, 21])
1526- .add(Symbol.PLUS, [SHIFT, 22])
1527- .add(Symbol.RIGHT_PAREN, [REDUCE, 35])
1528- .add(Symbol.LESS_THAN, [SHIFT, 23])
1529- .add(Symbol.GREATER_THAN, [SHIFT, 24])
1530- .add(Symbol.NOT, [SHIFT, 25])
1531- .add(Symbol.MINUS, [SHIFT, 26])
1532- .add(Symbol.ASTERISK, [SHIFT, 27])
1533- .add(Symbol.DIVIDE, [SHIFT, 28])
1534- .add(Symbol.CARROT, [SHIFT, 29])
1535- .add(Symbol.SEMI_COLON, [REDUCE, 35])
1536- .add(Symbol.COMMA, [REDUCE, 35]).build();
1537-const ACTION_TABLE = table;
1538-
1539+import {
1540+ ACTION_TABLE,
1541+ RULES,
1542+ ReduceActions,
1543+ ReductionPair,
1544+ REDUCE,
1545+ ACCEPT,
1546+ SHIFT,
1547+ SYMBOL_INDEX_TO_NAME,
1548+ SYMBOL_NAME_TO_INDEX,
1549+ PRODUCTIONS
1550+} from "./ParserConstants"
1551
1552 let Parser = (function () {
1553 let parser = {
1554@@ -1635,6 +171,9 @@ let Parser = (function () {
1555 case ReduceActions.REDUCE_LAST_THREE_B:
1556 this.$ = virtualStack[vsl - 2] + virtualStack[vsl - 1] + virtualStack[vsl];
1557 break;
1558+ case ReduceActions.AS_ERROR:
1559+ this.$ = constructErrorByName(virtualStack[vsl]);
1560+ break;
1561 }
1562 } catch (e) {
1563 if (catchOnFailure) {
1564@@ -1867,7 +406,7 @@ let Parser = (function () {
1565 }
1566 }
1567 if (lexer.showPosition) {
1568- errStr = 'Parse error on line ' + (yylineno + 1) + ":\n" + lexer.showPosition() + "\nExpecting " + expected.join(', ') + ", got '" + (SYMBOL_INDEX_TO_NAME[symbol] || symbol) + "'";
1569+ errStr = 'Parse error on line ' + (yylineno + 1) + ": " + lexer.showPosition() + " Expecting " + expected.join(', ') + ", got '" + (SYMBOL_INDEX_TO_NAME[symbol] || symbol) + "'";
1570 } else {
1571 errStr = 'Parse error on line ' + (yylineno + 1) + ": Unexpected " +
1572 (symbol == EOF ? "end of input" :
1573@@ -1876,12 +415,15 @@ let Parser = (function () {
1574 this.parseError(errStr, {
1575 text: lexer.match,
1576 token: SYMBOL_INDEX_TO_NAME[symbol] || symbol,
1577+ tokenIndex: symbol,
1578 line: lexer.yylineno,
1579 loc: yyloc,
1580 expected: expected,
1581 expectedIndexes: expectedIndexes,
1582 state: state,
1583 tableState: tableState,
1584+ stack: stack,
1585+ semanticValueStack: semanticValueStack,
1586 recoverable: (error_rule_depth !== false)
1587 });
1588 } else if (preErrorSymbol !== EOF) {
1589diff --git a/src/Parser/ParserConstants.ts b/src/Parser/ParserConstants.ts
1590new file mode 100644
1591index 0000000..4f59e2d
1592--- /dev/null
1593+++ b/src/Parser/ParserConstants.ts
1594@@ -0,0 +1,1497 @@
1595+
1596+// Rules represent the Regular Expressions that will be used in sequence to match a given input to the Parser.
1597+const WHITE_SPACE_RULE = /^(?:\s+)/; // rule 0
1598+const DOUBLE_QUOTES_RULE = /^(?:"(\\["]|[^"])*")/; // rule 1
1599+const SINGLE_QUOTES_RULE = /^(?:'(\\[']|[^'])*')/; // rule 2
1600+const FORMULA_NAME_RULE = /^(?:[A-Za-z.]{1,}[A-Za-z_0-9]+(?=[(]))/; // Changed from /^(?:[A-Za-z]{1,}[A-Za-z_0-9]+(?=[(]))/ // rule 3
1601+const DATE_RULE = /^(?:([0]?[1-9]|1[0-2])[:][0-5][0-9]([:][0-5][0-9])?[ ]?(AM|am|aM|Am|PM|pm|pM|Pm))/; // rule 4
1602+const TIME_RULE = /^(?:([0]?[0-9]|1[0-9]|2[0-3])[:][0-5][0-9]([:][0-5][0-9])?)/; // rule 5
1603+const $_A1_CELL_RULE = /^(?:\$[A-Za-z]+\$[0-9]+)/; // rule 6
1604+const A1_CELL_RULE = /^(?:[A-Za-z]+[0-9]+)/; // rules 7
1605+const FORMULA_NAME_SIMPLE_RULE = /^(?:[A-Za-z.]+(?=[(]))/; // rule 8
1606+const VARIABLE_RULE = /^(?:[A-Za-z]{1,}[A-Za-z_0-9]+)/; // rule 9
1607+const SIMPLE_VARIABLE_RILE = /^(?:[A-Za-z_]+)/; //rule 10
1608+const INTEGER_RULE = /^(?:[0-9]+(?:(?:[eE])(?:[\+-])?[0-9]+)?)/; // Changed from /^(?:[0-9]+)/ // rule 11
1609+const OPEN_AND_CLOSE_OF_ARRAY_RULE = /^(?:\[(.*)?\])/; // rule 12
1610+const DOLLAR_SIGN_RULE = /^(?:\$)/; // rule 13
1611+const AMPERSAND_SIGN_RULE = /^(?:&)/; //rule 14
1612+const SINGLE_WHITESPACE_RULE = /^(?: )/; // rule 15
1613+const PERIOD_RULE = /^(?:[.])/; // rule 16
1614+const COLON_RULE = /^(?::)/; //rule 17
1615+const SEMI_COLON_RULE = /^(?:;)/; // rule 18
1616+const COMMA_RULE = /^(?:,)/; // rule 19
1617+const ASTERISK_RULE = /^(?:\*)/; //rule 20
1618+const FORWARD_SLASH_RULE = /^(?:\/)/; // rule 21
1619+const MINUS_SIGN_RULE = /^(?:-)/; // rule 22
1620+const PLUS_SIGN_RULE = /^(?:\+)/; // rule 23
1621+const CARET_SIGN_RULE = /^(?:\^)/; //rule 24
1622+const OPEN_PAREN_RULE = /^(?:\()/; // rule 25
1623+const CLOSE_PAREN_RULE = /^(?:\))/; // rule 26
1624+const GREATER_THAN_SIGN_RULE = /^(?:>)/; // rule 27
1625+const LESS_THAN_SIGN_RULE = /^(?:<)/; // rule 28
1626+const NOT_RULE = /^(?:NOT\b)/; // rule 29
1627+const OPEN_DOUBLE_QUOTE = /^(?:")/; // rule 30
1628+const OPEN_SINGLE_QUITE = /^(?:')/; // rule 31
1629+const EXCLAMATION_POINT_RULE = /^(?:!)/; // rule 32
1630+const EQUALS_SIGN_RULE = /^(?:=)/; // rule 33
1631+const PERCENT_SIGN_RULE = /^(?:%)/; // rule 34
1632+// TODO: POUND_SIGN_RULE Modified from /^(?:[#])/, which matches pound sign exclusively. Now specific to errors.
1633+// TODO: Should be renamed.
1634+const POUND_SIGN_RULE = /^(?:#N\/A|#NUM\!|#NULL\!|#DIV\/0\!|#VALUE\!|#REF\!|#ERROR)/; // rule 35
1635+const END_OF_STRING_RULE = /^(?:$)/; // rule 36
1636+
1637+// Sequential rules to use when parsing a given input.
1638+const RULES = [
1639+ WHITE_SPACE_RULE,
1640+ DOUBLE_QUOTES_RULE,
1641+ SINGLE_QUOTES_RULE,
1642+ FORMULA_NAME_RULE,
1643+ DATE_RULE,
1644+ TIME_RULE,
1645+ $_A1_CELL_RULE,
1646+ A1_CELL_RULE,
1647+ FORMULA_NAME_SIMPLE_RULE,
1648+ VARIABLE_RULE,
1649+ SIMPLE_VARIABLE_RILE,
1650+ INTEGER_RULE,
1651+ OPEN_AND_CLOSE_OF_ARRAY_RULE,
1652+ DOLLAR_SIGN_RULE,
1653+ AMPERSAND_SIGN_RULE,
1654+ SINGLE_WHITESPACE_RULE,
1655+ PERIOD_RULE,
1656+ COLON_RULE,
1657+ SEMI_COLON_RULE,
1658+ COMMA_RULE,
1659+ ASTERISK_RULE,
1660+ FORWARD_SLASH_RULE,
1661+ MINUS_SIGN_RULE,
1662+ PLUS_SIGN_RULE,
1663+ CARET_SIGN_RULE,
1664+ OPEN_PAREN_RULE,
1665+ CLOSE_PAREN_RULE,
1666+ GREATER_THAN_SIGN_RULE,
1667+ LESS_THAN_SIGN_RULE,
1668+ NOT_RULE,
1669+ OPEN_DOUBLE_QUOTE,
1670+ OPEN_SINGLE_QUITE,
1671+ EXCLAMATION_POINT_RULE,
1672+ EQUALS_SIGN_RULE,
1673+ PERCENT_SIGN_RULE,
1674+ POUND_SIGN_RULE,
1675+ END_OF_STRING_RULE
1676+];
1677+
1678+/**
1679+ * Actions to take when processing tokens one by one. We're always either taking the next token, reducing our current
1680+ * tokens, or accepting and returning.
1681+ */
1682+const SHIFT = 1;
1683+const REDUCE = 2;
1684+const ACCEPT = 3;
1685+
1686+const enum ReduceActions {
1687+ NO_ACTION = 0,
1688+ RETURN_LAST = 1,
1689+ CALL_VARIABLE = 2,
1690+ TIME_CALL_TRUE = 3,
1691+ TIME_CALL = 4,
1692+ AS_NUMBER = 5,
1693+ AS_STRING = 6,
1694+ AMPERSAND = 7,
1695+ EQUALS = 8,
1696+ PLUS = 9,
1697+ LAST_NUMBER = 10,
1698+ LTE = 11,
1699+ GTE = 12,
1700+ NOT_EQ = 13,
1701+ NOT = 14,
1702+ GT = 15,
1703+ LT = 16,
1704+ MINUS = 17,
1705+ MULTIPLY = 18,
1706+ DIVIDE = 19,
1707+ TO_POWER = 20,
1708+ INVERT_NUM = 21,
1709+ TO_NUMBER_NAN_AS_ZERO = 22,
1710+ CALL_FUNCTION_LAST_BLANK = 23,
1711+ CALL_FUNCTION_LAST_TWO_IN_STACK = 24,
1712+ I25 = 25,
1713+ I26 = 26,
1714+ I27 = 27,
1715+ FIXED_CELL_VAL = 28,
1716+ FIXED_CELL_RANGE_VAL = 29,
1717+ CELL_VALUE = 30,
1718+ CELL_RANGE_VALUE = 31,
1719+ ENSURE_IS_ARRAY = 32,
1720+ ENSURE_YYTEXT_ARRAY = 33,
1721+ REDUCE_INT = 34,
1722+ REDUCE_PERCENT = 35,
1723+ WRAP_CURRENT_INDEX_TOKEN_AS_ARRAY = 36,
1724+ ENSURE_LAST_TWO_IN_ARRAY_AND_PUSH = 37,
1725+ REFLEXIVE_REDUCE = 38,
1726+ REDUCE_FLOAT = 39,
1727+ REDUCE_PREV_AS_PERCENT = 40,
1728+ REDUCE_LAST_THREE_A = 41,
1729+ REDUCE_LAST_THREE_B = 42,
1730+ AS_ERROR = 43
1731+}
1732+
1733+/**
1734+ * Represents the length to reduce the stack by, and the token index value that will replace those tokens in the stack.
1735+ */
1736+class ReductionPair {
1737+ private lengthToReduceStackBy : number;
1738+ private replacementTokenIndex : number;
1739+ constructor(replacementTokenIndex : number, length : number) {
1740+ this.lengthToReduceStackBy = length;
1741+ this.replacementTokenIndex = replacementTokenIndex;
1742+ }
1743+
1744+ /**
1745+ * Get the number representing the length to reduce the stack by.
1746+ * @returns {number}
1747+ */
1748+ getLengthToReduceStackBy() : number {
1749+ return this.lengthToReduceStackBy;
1750+ }
1751+
1752+ /**
1753+ * Get the replacement token index.
1754+ * @returns {number}
1755+ */
1756+ getReplacementTokenIndex() : number {
1757+ return this.replacementTokenIndex;
1758+ }
1759+}
1760+
1761+/**
1762+ * Productions is used to look up both the number to use when reducing the stack (productions[x][1]) and the semantic
1763+ * value that will replace the tokens in the stack (productions[x][0]).
1764+ * @type {Array<ReductionPair>}
1765+ *
1766+ * Maps a ProductionRule to the appropriate number of previous tokens to use in a reduction action.
1767+ */
1768+let productions : Array<ReductionPair> = [];
1769+productions[ReduceActions.NO_ACTION] = null;
1770+productions[ReduceActions.RETURN_LAST] = new ReductionPair(3, 2);
1771+productions[ReduceActions.CALL_VARIABLE] = new ReductionPair(4, 1);
1772+productions[ReduceActions.TIME_CALL_TRUE] = new ReductionPair(4, 1);
1773+productions[ReduceActions.TIME_CALL] = new ReductionPair(4, 1);
1774+productions[ReduceActions.AS_NUMBER] = new ReductionPair(4, 1);
1775+productions[ReduceActions.AS_STRING] = new ReductionPair(4, 1);
1776+productions[ReduceActions.AMPERSAND] = new ReductionPair(4, 3);
1777+productions[ReduceActions.EQUALS] = new ReductionPair(4, 3);
1778+productions[ReduceActions.PLUS] = new ReductionPair(4, 3);
1779+productions[ReduceActions.LAST_NUMBER] = new ReductionPair(4, 3);
1780+productions[ReduceActions.LTE] = new ReductionPair(4, 4);
1781+productions[ReduceActions.GTE] = new ReductionPair(4, 4);
1782+productions[ReduceActions.NOT_EQ] = new ReductionPair(4, 4);
1783+productions[ReduceActions.NOT] = new ReductionPair(4, 3);
1784+productions[ReduceActions.GT] = new ReductionPair(4, 3);
1785+productions[ReduceActions.LT] = new ReductionPair(4, 3);
1786+productions[ReduceActions.MINUS] = new ReductionPair(4, 3);
1787+productions[ReduceActions.MULTIPLY] = new ReductionPair(4, 3);
1788+productions[ReduceActions.DIVIDE] = new ReductionPair(4, 3);
1789+productions[ReduceActions.TO_POWER] = new ReductionPair(4, 3);
1790+productions[ReduceActions.INVERT_NUM] = new ReductionPair(4, 2);
1791+productions[ReduceActions.TO_NUMBER_NAN_AS_ZERO] = new ReductionPair(4, 2);
1792+productions[ReduceActions.CALL_FUNCTION_LAST_BLANK] = new ReductionPair(4, 3);
1793+productions[ReduceActions.CALL_FUNCTION_LAST_TWO_IN_STACK] = new ReductionPair(4, 4);
1794+productions[ReduceActions.I25] = new ReductionPair(4, 1);
1795+productions[ReduceActions.I26] = new ReductionPair(4, 1);
1796+productions[ReduceActions.I27] = new ReductionPair(4, 2);
1797+productions[ReduceActions.FIXED_CELL_VAL] = new ReductionPair(25, 1);
1798+productions[ReduceActions.FIXED_CELL_RANGE_VAL] = new ReductionPair(25, 3);
1799+productions[ReduceActions.CELL_VALUE] = new ReductionPair(25, 1);
1800+productions[ReduceActions.CELL_RANGE_VALUE] = new ReductionPair(25, 3);
1801+productions[ReduceActions.ENSURE_IS_ARRAY] = new ReductionPair(24, 1);
1802+productions[ReduceActions.ENSURE_YYTEXT_ARRAY] = new ReductionPair(24, 1);
1803+productions[ReduceActions.REDUCE_INT] = new ReductionPair(24, 3);
1804+productions[ReduceActions.REDUCE_PERCENT] = new ReductionPair(24, 3);
1805+productions[ReduceActions.WRAP_CURRENT_INDEX_TOKEN_AS_ARRAY] = new ReductionPair(6, 1);
1806+productions[ReduceActions.ENSURE_LAST_TWO_IN_ARRAY_AND_PUSH] = new ReductionPair(6, 3);
1807+productions[ReduceActions.REFLEXIVE_REDUCE] = new ReductionPair(9, 1);
1808+productions[ReduceActions.REDUCE_FLOAT] = new ReductionPair(9, 3);
1809+productions[ReduceActions.REDUCE_PREV_AS_PERCENT] = new ReductionPair(9, 2);
1810+productions[ReduceActions.REDUCE_LAST_THREE_A] = new ReductionPair(2, 3);
1811+productions[ReduceActions.REDUCE_LAST_THREE_B] = new ReductionPair(2, 4);
1812+productions[ReduceActions.AS_ERROR] = new ReductionPair(4, 1);
1813+
1814+const PRODUCTIONS = productions;
1815+
1816+enum Symbol {
1817+ ACCEPT = 0,
1818+ END = 1,
1819+ ERROR = 2,
1820+ EXPRESSIONS = 3,
1821+ EXPRESSION = 4,
1822+ EOF = 5,
1823+ VARIABLE_SEQUENCE = 6,
1824+ TIME_AMPM = 7,
1825+ TIME_24 = 8,
1826+ NUMBER = 9,
1827+ STRING = 10,
1828+ AMPERSAND = 11,
1829+ EQUALS = 12,
1830+ PLUS = 13,
1831+ LEFT_PAREN = 14,
1832+ RIGHT_PAREN = 15,
1833+ LESS_THAN = 16,
1834+ GREATER_THAN = 17,
1835+ NOT = 18,
1836+ MINUS = 19,
1837+ ASTERISK = 20,
1838+ DIVIDE = 21,
1839+ CARROT = 22,
1840+ FUNCTION = 23,
1841+ EXP_SEQ = 24,
1842+ CELL = 25,
1843+ FIXEDCELL = 26,
1844+ COLON = 27,
1845+ CELL_UPPER = 28,
1846+ ARRAY = 29,
1847+ SEMI_COLON = 30,
1848+ COMMA = 31,
1849+ VARIABLE = 32,
1850+ DECIMAL = 33,
1851+ NUMBER_UPPER = 34,
1852+ PERCENT = 35,
1853+ POUND = 36,
1854+ EXCLAMATION_POINT = 37
1855+}
1856+
1857+const SYMBOL_NAME_TO_INDEX = {
1858+ "$accept": Symbol.ACCEPT,
1859+ "$end": Symbol.END,
1860+ "error": Symbol.ERROR,
1861+ "expressions": Symbol.EXPRESSIONS,
1862+ "expression": Symbol.EXPRESSION,
1863+ "EOF": Symbol.EOF,
1864+ "variableSequence": Symbol.VARIABLE_SEQUENCE,
1865+ "TIME_AMPM": Symbol.TIME_AMPM,
1866+ "TIME_24": Symbol.TIME_24,
1867+ "number": Symbol.NUMBER,
1868+ "STRING": Symbol.STRING,
1869+ "&": Symbol.AMPERSAND,
1870+ "=": Symbol.EQUALS,
1871+ "+": Symbol.PLUS,
1872+ "(": Symbol.LEFT_PAREN,
1873+ ")": Symbol.RIGHT_PAREN,
1874+ "<": Symbol.LESS_THAN,
1875+ ">": Symbol.GREATER_THAN,
1876+ "NOT": Symbol.NOT,
1877+ "-": Symbol.MINUS,
1878+ "*": Symbol.ASTERISK,
1879+ "/": Symbol.DIVIDE,
1880+ "^": Symbol.CARROT,
1881+ "FUNCTION": Symbol.FUNCTION,
1882+ "expseq": Symbol.EXP_SEQ,
1883+ "cell": Symbol.CELL,
1884+ "FIXEDCELL": Symbol.FIXEDCELL,
1885+ ":": Symbol.COLON,
1886+ "CELL": Symbol.CELL_UPPER,
1887+ "ARRAY": Symbol.ARRAY,
1888+ ";": Symbol.SEMI_COLON,
1889+ ",": Symbol.COMMA,
1890+ "VARIABLE": Symbol.VARIABLE,
1891+ "DECIMAL": Symbol.DECIMAL,
1892+ "NUMBER": Symbol.NUMBER_UPPER,
1893+ "%": Symbol.PERCENT,
1894+ "#": Symbol.POUND,
1895+ "!": Symbol.EXCLAMATION_POINT
1896+};
1897+let symbolIndexToName = {};
1898+symbolIndexToName[Symbol.EOF] = "EOF";
1899+symbolIndexToName[Symbol.TIME_AMPM] = "TIME_AMPM";
1900+symbolIndexToName[Symbol.TIME_24] = "TIME_24";
1901+symbolIndexToName[Symbol.STRING] = "STRING";
1902+symbolIndexToName[Symbol.AMPERSAND] = "&";
1903+symbolIndexToName[Symbol.EQUALS] = "=";
1904+symbolIndexToName[Symbol.PLUS] = "+";
1905+symbolIndexToName[Symbol.LEFT_PAREN] = "(";
1906+symbolIndexToName[Symbol.RIGHT_PAREN] = ")";
1907+symbolIndexToName[Symbol.LESS_THAN] = "<";
1908+symbolIndexToName[Symbol.GREATER_THAN] = ">";
1909+symbolIndexToName[Symbol.NOT] = "NOTE";
1910+symbolIndexToName[Symbol.MINUS] = "-";
1911+symbolIndexToName[Symbol.ASTERISK] = "*";
1912+symbolIndexToName[Symbol.DIVIDE] = "/";
1913+symbolIndexToName[Symbol.CARROT] = "^";
1914+symbolIndexToName[Symbol.FUNCTION] = "FUNCTION";
1915+symbolIndexToName[Symbol.FIXEDCELL] = "FIXEDCELL";
1916+symbolIndexToName[Symbol.COLON] = ";";
1917+symbolIndexToName[Symbol.COMMA] = ",";
1918+symbolIndexToName[Symbol.VARIABLE] = "VARIABLE";
1919+symbolIndexToName[Symbol.DECIMAL] = "DECIMAL";
1920+symbolIndexToName[Symbol.NUMBER_UPPER] = "NUMBER";
1921+symbolIndexToName[Symbol.PERCENT] = "%";
1922+symbolIndexToName[Symbol.POUND] = "#";
1923+symbolIndexToName[Symbol.EXCLAMATION_POINT] = "!";
1924+const SYMBOL_INDEX_TO_NAME = symbolIndexToName;
1925+
1926+
1927+
1928+class ObjectBuilder {
1929+ public o : Object = {};
1930+
1931+ public static add(k, v) : ObjectBuilder {
1932+ let m = new ObjectBuilder();
1933+ m.o[k.toString()] = v;
1934+ return m;
1935+ }
1936+ public add(k, v) : ObjectBuilder {
1937+ this.o[k.toString()] = v;
1938+ return this;
1939+ }
1940+ public build() : Object {
1941+ return this.o;
1942+ }
1943+}
1944+
1945+/**
1946+ * Array of to map rules to to LexActions and other rules. A single index in the object (e.g. `{2: 13}`) indicates the
1947+ * rule object to follow for the next token, while an array (e.g. `{23: [1, 11]}`) indicates the action to be taken,
1948+ * and the rule object to follow after the action.
1949+ */
1950+let table = [];
1951+// All functions in the spreadsheet start with a 0-token.
1952+table[0] = ObjectBuilder
1953+ .add(Symbol.ERROR, 13)
1954+ .add(Symbol.EXPRESSIONS, 1)
1955+ .add(Symbol.EXPRESSION, 2)
1956+ .add(Symbol.VARIABLE_SEQUENCE, 3)
1957+ .add(Symbol.TIME_AMPM, [SHIFT, 4])
1958+ .add(Symbol.TIME_24, [SHIFT, 5])
1959+ .add(Symbol.NUMBER, 6)
1960+ .add(Symbol.STRING, [SHIFT, 7])
1961+ .add(Symbol.PLUS, [SHIFT, 10])
1962+ .add(Symbol.LEFT_PAREN, [SHIFT, 8])
1963+ .add(Symbol.MINUS, [SHIFT, 9])
1964+ .add(Symbol.FUNCTION, [SHIFT, 11])
1965+ .add(Symbol.CELL, 12)
1966+ .add(Symbol.FIXEDCELL, [SHIFT, 16])
1967+ .add(Symbol.CELL_UPPER, [SHIFT, 17])
1968+ .add(Symbol.VARIABLE, [SHIFT, 14])
1969+ .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
1970+ .add(Symbol.POUND, [SHIFT, 18])
1971+ .build();
1972+table[1] = ObjectBuilder
1973+ .add(Symbol.END, [3])
1974+ .build();
1975+table[2] = ObjectBuilder
1976+ .add(Symbol.EOF, [SHIFT, 19])
1977+ .add(Symbol.AMPERSAND, [SHIFT, 20])
1978+ .add(Symbol.EQUALS, [SHIFT, 21])
1979+ .add(Symbol.PLUS, [SHIFT, 22])
1980+ .add(Symbol.LESS_THAN, [SHIFT, 23])
1981+ .add(Symbol.GREATER_THAN, [SHIFT, 24])
1982+ .add(Symbol.NOT, [SHIFT, 25])
1983+ .add(Symbol.MINUS, [SHIFT, 26])
1984+ .add(Symbol.ASTERISK, [SHIFT, 27])
1985+ .add(Symbol.DIVIDE, [SHIFT, 28])
1986+ .add(Symbol.CARROT, [SHIFT, 29])
1987+ .build();
1988+table[3] = ObjectBuilder
1989+ .add(Symbol.EOF, [REDUCE, 2])
1990+ .add(Symbol.AMPERSAND, [REDUCE, 2])
1991+ .add(Symbol.EQUALS, [REDUCE, 2])
1992+ .add(Symbol.PLUS, [REDUCE, 2])
1993+ .add(Symbol.RIGHT_PAREN, [REDUCE, 2])
1994+ .add(Symbol.LESS_THAN, [REDUCE, 2])
1995+ .add(Symbol.GREATER_THAN, [REDUCE, 2])
1996+ .add(Symbol.NOT, [REDUCE, 2])
1997+ .add(Symbol.MINUS, [REDUCE, 2])
1998+ .add(Symbol.ASTERISK, [REDUCE, 2])
1999+ .add(Symbol.DIVIDE, [REDUCE, 2])
2000+ .add(Symbol.CARROT, [REDUCE, 2])
2001+ .add(Symbol.SEMI_COLON, [REDUCE, 2])
2002+ .add(Symbol.COMMA, [REDUCE, 2])
2003+ .add(33, [SHIFT, 30])
2004+ .build();
2005+table[3] = ObjectBuilder
2006+ .add(Symbol.EOF, [REDUCE, 2])
2007+ .add(Symbol.AMPERSAND, [REDUCE, 2])
2008+ .add(Symbol.EQUALS, [REDUCE, 2])
2009+ .add(Symbol.PLUS, [REDUCE, 2])
2010+ .add(Symbol.RIGHT_PAREN, [REDUCE, 2])
2011+ .add(Symbol.LESS_THAN, [REDUCE, 2])
2012+ .add(Symbol.GREATER_THAN, [REDUCE, 2])
2013+ .add(Symbol.NOT, [REDUCE, 2])
2014+ .add(Symbol.MINUS, [REDUCE, 2])
2015+ .add(Symbol.ASTERISK, [REDUCE, 2])
2016+ .add(Symbol.DIVIDE, [REDUCE, 2])
2017+ .add(Symbol.CARROT, [REDUCE, 2])
2018+ .add(Symbol.SEMI_COLON, [REDUCE, 2])
2019+ .add(Symbol.COMMA, [REDUCE, 2])
2020+ .add(33, [SHIFT, 30])
2021+ .build();
2022+table[4] = ObjectBuilder
2023+ .add(Symbol.EOF, [REDUCE, 3])
2024+ .add(Symbol.AMPERSAND, [REDUCE, 3])
2025+ .add(Symbol.EQUALS, [REDUCE, 3])
2026+ .add(Symbol.PLUS, [REDUCE, 3])
2027+ .add(Symbol.RIGHT_PAREN, [REDUCE, 3])
2028+ .add(Symbol.LESS_THAN, [REDUCE, 3])
2029+ .add(Symbol.GREATER_THAN, [REDUCE, 3])
2030+ .add(Symbol.NOT, [REDUCE, 3])
2031+ .add(Symbol.MINUS, [REDUCE, 3])
2032+ .add(Symbol.ASTERISK, [REDUCE, 3])
2033+ .add(Symbol.DIVIDE, [REDUCE, 3])
2034+ .add(Symbol.CARROT, [REDUCE, 3])
2035+ .add(Symbol.SEMI_COLON, [REDUCE, 3])
2036+ .add(Symbol.COMMA, [REDUCE, 3])
2037+ .build();
2038+table[5] = ObjectBuilder
2039+ .add(Symbol.EOF, [REDUCE, 4])
2040+ .add(Symbol.AMPERSAND, [REDUCE, 4])
2041+ .add(Symbol.EQUALS, [REDUCE, 4])
2042+ .add(Symbol.PLUS, [REDUCE, 4])
2043+ .add(Symbol.RIGHT_PAREN, [REDUCE, 4])
2044+ .add(Symbol.LESS_THAN, [REDUCE, 4])
2045+ .add(Symbol.GREATER_THAN, [REDUCE, 4])
2046+ .add(Symbol.NOT, [REDUCE, 4])
2047+ .add(Symbol.MINUS, [REDUCE, 4])
2048+ .add(Symbol.ASTERISK, [REDUCE, 4])
2049+ .add(Symbol.DIVIDE, [REDUCE, 4])
2050+ .add(Symbol.CARROT, [REDUCE, 4])
2051+ .add(Symbol.SEMI_COLON, [REDUCE, 4])
2052+ .add(Symbol.COMMA, [REDUCE, 4])
2053+ .build();
2054+table[6] = ObjectBuilder
2055+ .add(Symbol.EOF, [REDUCE, 5])
2056+ .add(Symbol.AMPERSAND, [REDUCE, 5])
2057+ .add(Symbol.EQUALS, [REDUCE, 5])
2058+ .add(Symbol.PLUS, [REDUCE, 5])
2059+ .add(Symbol.RIGHT_PAREN, [REDUCE, 5])
2060+ .add(Symbol.LESS_THAN, [REDUCE, 5])
2061+ .add(Symbol.GREATER_THAN, [REDUCE, 5])
2062+ .add(Symbol.NOT, [REDUCE, 5])
2063+ .add(Symbol.MINUS, [REDUCE, 5])
2064+ .add(Symbol.ASTERISK, [REDUCE, 5])
2065+ .add(Symbol.DIVIDE, [REDUCE, 5])
2066+ .add(Symbol.CARROT, [REDUCE, 5])
2067+ .add(Symbol.SEMI_COLON, [REDUCE, 5])
2068+ .add(Symbol.COMMA, [REDUCE, 5])
2069+ .add(Symbol.PERCENT, [SHIFT, 31])
2070+ .build();
2071+table[7] = ObjectBuilder
2072+ .add(Symbol.EOF, [REDUCE, 6])
2073+ .add(Symbol.AMPERSAND, [REDUCE, 6])
2074+ .add(Symbol.EQUALS, [REDUCE, 6])
2075+ .add(Symbol.PLUS, [REDUCE, 6])
2076+ .add(Symbol.RIGHT_PAREN, [REDUCE, 6])
2077+ .add(Symbol.LESS_THAN, [REDUCE, 6])
2078+ .add(Symbol.GREATER_THAN, [REDUCE, 6])
2079+ .add(Symbol.NOT, [REDUCE, 6])
2080+ .add(Symbol.MINUS, [REDUCE, 6])
2081+ .add(Symbol.ASTERISK, [REDUCE, 6])
2082+ .add(Symbol.DIVIDE, [REDUCE, 6])
2083+ .add(Symbol.CARROT, [REDUCE, 6])
2084+ .add(Symbol.SEMI_COLON, [REDUCE, 6])
2085+ .add(Symbol.COMMA, [REDUCE, 6])
2086+ .build();
2087+table[8] = ObjectBuilder
2088+ .add(Symbol.ERROR, 13)
2089+ .add(Symbol.EXPRESSION, 32)
2090+ .add(Symbol.VARIABLE_SEQUENCE, 3)
2091+ .add(Symbol.TIME_AMPM, [SHIFT, 4])
2092+ .add(Symbol.TIME_24, [SHIFT, 5])
2093+ .add(Symbol.NUMBER, 6)
2094+ .add(Symbol.STRING, [SHIFT, 7])
2095+ .add(Symbol.PLUS, [SHIFT, 10])
2096+ .add(Symbol.LEFT_PAREN, [SHIFT, 8])
2097+ .add(Symbol.MINUS, [SHIFT, 9])
2098+ .add(Symbol.FUNCTION, [SHIFT, 11])
2099+ .add(Symbol.CELL, 12)
2100+ .add(Symbol.FIXEDCELL, [SHIFT, 16])
2101+ .add(Symbol.CELL_UPPER, [SHIFT, 17])
2102+ .add(Symbol.VARIABLE, [SHIFT, 14])
2103+ .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
2104+ .add(Symbol.POUND, [SHIFT, 18])
2105+ .build();
2106+table[9] = ObjectBuilder
2107+ .add(Symbol.ERROR, 13)
2108+ .add(Symbol.EXPRESSION, 33)
2109+ .add(Symbol.VARIABLE_SEQUENCE, 3)
2110+ .add(Symbol.TIME_AMPM, [SHIFT, 4])
2111+ .add(Symbol.TIME_24, [SHIFT, 5])
2112+ .add(Symbol.NUMBER, 6)
2113+ .add(Symbol.STRING, [SHIFT, 7])
2114+ .add(Symbol.PLUS, [SHIFT, 10])
2115+ .add(Symbol.LEFT_PAREN, [SHIFT, 8])
2116+ .add(Symbol.MINUS, [SHIFT, 9])
2117+ .add(Symbol.FUNCTION, [SHIFT, 11])
2118+ .add(Symbol.CELL, 12)
2119+ .add(Symbol.FIXEDCELL, [SHIFT, 16])
2120+ .add(Symbol.CELL_UPPER, [SHIFT, 17])
2121+ .add(Symbol.VARIABLE, [SHIFT, 14])
2122+ .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
2123+ .add(Symbol.POUND, [SHIFT, 18])
2124+ .build();
2125+table[10] = ObjectBuilder
2126+ .add(Symbol.ERROR, 13)
2127+ .add(Symbol.EXPRESSION, 34)
2128+ .add(Symbol.VARIABLE_SEQUENCE, 3)
2129+ .add(Symbol.TIME_AMPM, [SHIFT, 4])
2130+ .add(Symbol.TIME_24, [SHIFT, 5])
2131+ .add(Symbol.NUMBER, 6)
2132+ .add(Symbol.STRING, [SHIFT, 7])
2133+ .add(Symbol.PLUS, [SHIFT, 10])
2134+ .add(Symbol.LEFT_PAREN, [SHIFT, 8])
2135+ .add(Symbol.MINUS, [SHIFT, 9])
2136+ .add(Symbol.FUNCTION, [SHIFT, 11])
2137+ .add(Symbol.CELL, 12)
2138+ .add(Symbol.FIXEDCELL, [SHIFT, 16])
2139+ .add(Symbol.CELL_UPPER, [SHIFT, 17])
2140+ .add(Symbol.VARIABLE, [SHIFT, 14])
2141+ .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
2142+ .add(Symbol.POUND, [SHIFT, 18])
2143+ .build();
2144+table[11] = ObjectBuilder
2145+ .add(Symbol.LEFT_PAREN, [SHIFT, 35])
2146+ .build();
2147+table[12] = ObjectBuilder
2148+ .add(Symbol.EOF, [REDUCE, 25])
2149+ .add(Symbol.AMPERSAND, [REDUCE, 25])
2150+ .add(Symbol.EQUALS, [REDUCE, 25])
2151+ .add(Symbol.PLUS, [REDUCE, 25])
2152+ .add(Symbol.RIGHT_PAREN, [REDUCE, 25])
2153+ .add(Symbol.LESS_THAN, [REDUCE, 25])
2154+ .add(Symbol.GREATER_THAN, [REDUCE, 25])
2155+ .add(Symbol.NOT, [REDUCE, 25])
2156+ .add(Symbol.MINUS, [REDUCE, 25])
2157+ .add(Symbol.ASTERISK, [REDUCE, 25])
2158+ .add(Symbol.DIVIDE, [REDUCE, 25])
2159+ .add(Symbol.CARROT, [REDUCE, 25])
2160+ .add(Symbol.SEMI_COLON, [REDUCE, 25])
2161+ .add(Symbol.COMMA, [REDUCE, 25])
2162+ .build();
2163+table[13] = ObjectBuilder
2164+ .add(Symbol.ERROR, 36)
2165+ .add(Symbol.EOF, [REDUCE, 26])
2166+ .add(Symbol.AMPERSAND, [REDUCE, 26])
2167+ .add(Symbol.EQUALS, [REDUCE, 26])
2168+ .add(Symbol.PLUS, [REDUCE, 26])
2169+ .add(Symbol.RIGHT_PAREN, [REDUCE, 26])
2170+ .add(Symbol.LESS_THAN, [REDUCE, 26])
2171+ .add(Symbol.GREATER_THAN, [REDUCE, 26])
2172+ .add(Symbol.NOT, [REDUCE, 26])
2173+ .add(Symbol.MINUS, [REDUCE, 26])
2174+ .add(Symbol.ASTERISK, [REDUCE, 26])
2175+ .add(Symbol.DIVIDE, [REDUCE, 26])
2176+ .add(Symbol.CARROT, [REDUCE, 26])
2177+ .add(Symbol.SEMI_COLON, [REDUCE, 26])
2178+ .add(Symbol.COMMA, [REDUCE, 26])
2179+ .add(Symbol.VARIABLE, [SHIFT, 37])
2180+ .add(Symbol.POUND, [SHIFT, 18])
2181+ .build();
2182+table[14] = ObjectBuilder
2183+ .add(Symbol.EOF, [REDUCE, 36])
2184+ .add(Symbol.AMPERSAND, [REDUCE, 36])
2185+ .add(Symbol.EQUALS, [REDUCE, 36])
2186+ .add(Symbol.PLUS, [REDUCE, 36])
2187+ .add(Symbol.RIGHT_PAREN, [REDUCE, 36])
2188+ .add(Symbol.LESS_THAN, [REDUCE, 36])
2189+ .add(Symbol.GREATER_THAN, [REDUCE, 36])
2190+ .add(Symbol.NOT, [REDUCE, 36])
2191+ .add(Symbol.MINUS, [REDUCE, 36])
2192+ .add(Symbol.ASTERISK, [REDUCE, 36])
2193+ .add(Symbol.DIVIDE, [REDUCE, 36])
2194+ .add(Symbol.CARROT, [REDUCE, 36])
2195+ .add(Symbol.SEMI_COLON, [REDUCE, 36])
2196+ .add(Symbol.COMMA, [REDUCE, 36])
2197+ .add(33, [REDUCE, 36])
2198+ .add(Symbol.POUND, [SHIFT, 38])
2199+ .build();
2200+table[15] = ObjectBuilder
2201+ .add(Symbol.EOF, [REDUCE, 38])
2202+ .add(Symbol.AMPERSAND, [REDUCE, 38])
2203+ .add(Symbol.EQUALS, [REDUCE, 38])
2204+ .add(Symbol.PLUS, [REDUCE, 38])
2205+ .add(Symbol.RIGHT_PAREN, [REDUCE, 38])
2206+ .add(Symbol.LESS_THAN, [REDUCE, 38])
2207+ .add(Symbol.GREATER_THAN, [REDUCE, 38])
2208+ .add(Symbol.NOT, [REDUCE, 38])
2209+ .add(Symbol.MINUS, [REDUCE, 38])
2210+ .add(Symbol.ASTERISK, [REDUCE, 38])
2211+ .add(Symbol.DIVIDE, [REDUCE, 38])
2212+ .add(Symbol.CARROT, [REDUCE, 38])
2213+ .add(Symbol.SEMI_COLON, [REDUCE, 38])
2214+ .add(Symbol.COMMA, [REDUCE, 38])
2215+ .add(33, [SHIFT, 39])
2216+ .add(Symbol.PERCENT, [REDUCE, 38])
2217+ .add(38, [REDUCE, 38])
2218+ .build();
2219+table[16] = ObjectBuilder
2220+ .add(Symbol.EOF, [REDUCE, 28])
2221+ .add(Symbol.AMPERSAND, [REDUCE, 28])
2222+ .add(Symbol.EQUALS, [REDUCE, 28])
2223+ .add(Symbol.PLUS, [REDUCE, 28])
2224+ .add(Symbol.RIGHT_PAREN, [REDUCE, 28])
2225+ .add(Symbol.LESS_THAN, [REDUCE, 28])
2226+ .add(Symbol.GREATER_THAN, [REDUCE, 28])
2227+ .add(Symbol.NOT, [REDUCE, 28])
2228+ .add(Symbol.MINUS, [REDUCE, 28])
2229+ .add(Symbol.ASTERISK, [REDUCE, 28])
2230+ .add(Symbol.DIVIDE, [REDUCE, 28])
2231+ .add(Symbol.CARROT, [REDUCE, 28])
2232+ .add(Symbol.COLON, [SHIFT, 40])
2233+ .add(Symbol.SEMI_COLON, [REDUCE, 28])
2234+ .add(Symbol.COMMA, [REDUCE, 28])
2235+ .build();
2236+table[17] = ObjectBuilder
2237+ .add(Symbol.EOF, [REDUCE, 30])
2238+ .add(Symbol.AMPERSAND, [REDUCE, 30])
2239+ .add(Symbol.EQUALS, [REDUCE, 30])
2240+ .add(Symbol.PLUS, [REDUCE, 30])
2241+ .add(Symbol.RIGHT_PAREN, [REDUCE, 30])
2242+ .add(Symbol.LESS_THAN, [REDUCE, 30])
2243+ .add(Symbol.GREATER_THAN, [REDUCE, 30])
2244+ .add(Symbol.NOT, [REDUCE, 30])
2245+ .add(Symbol.MINUS, [REDUCE, 30])
2246+ .add(Symbol.ASTERISK, [REDUCE, 30])
2247+ .add(Symbol.DIVIDE, [REDUCE, 30])
2248+ .add(Symbol.CARROT, [REDUCE, 30])
2249+ .add(Symbol.COLON, [SHIFT, 41])
2250+ .add(Symbol.SEMI_COLON, [REDUCE, 30])
2251+ .add(Symbol.COMMA, [REDUCE, 30])
2252+ .build();
2253+table[18] = ObjectBuilder
2254+ .add(Symbol.VARIABLE, [SHIFT, 42])
2255+ .add(Symbol.EOF, [REDUCE, ReduceActions.AS_ERROR])
2256+ .build();
2257+table[19] = ObjectBuilder
2258+ .add(Symbol.END, [ACCEPT, 1])
2259+ .build();
2260+table[20] = ObjectBuilder
2261+ .add(Symbol.ERROR, 13)
2262+ .add(Symbol.EXPRESSION, 43)
2263+ .add(Symbol.VARIABLE_SEQUENCE, 3)
2264+ .add(Symbol.TIME_AMPM, [SHIFT, 4])
2265+ .add(Symbol.TIME_24, [SHIFT, 5])
2266+ .add(Symbol.NUMBER, 6)
2267+ .add(Symbol.STRING, [SHIFT, 7])
2268+ .add(Symbol.PLUS, [SHIFT, 10])
2269+ .add(Symbol.LEFT_PAREN, [SHIFT, 8])
2270+ .add(Symbol.MINUS, [SHIFT, 9])
2271+ .add(Symbol.FUNCTION, [SHIFT, 11])
2272+ .add(Symbol.CELL, 12)
2273+ .add(Symbol.FIXEDCELL, [SHIFT, 16])
2274+ .add(Symbol.CELL_UPPER, [SHIFT, 17])
2275+ .add(Symbol.VARIABLE, [SHIFT, 14])
2276+ .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
2277+ .add(Symbol.POUND, [SHIFT, 18])
2278+ .build();
2279+table[21] = ObjectBuilder
2280+ .add(Symbol.ERROR, 13)
2281+ .add(Symbol.EXPRESSION, 44)
2282+ .add(Symbol.VARIABLE_SEQUENCE, 3)
2283+ .add(Symbol.TIME_AMPM, [SHIFT, 4])
2284+ .add(Symbol.TIME_24, [SHIFT, 5])
2285+ .add(Symbol.NUMBER, 6)
2286+ .add(Symbol.STRING, [SHIFT, 7])
2287+ .add(Symbol.PLUS, [SHIFT, 10])
2288+ .add(Symbol.LEFT_PAREN, [SHIFT, 8])
2289+ .add(Symbol.MINUS, [SHIFT, 9])
2290+ .add(Symbol.FUNCTION, [SHIFT, 11])
2291+ .add(Symbol.CELL, 12)
2292+ .add(Symbol.FIXEDCELL, [SHIFT, 16])
2293+ .add(Symbol.CELL_UPPER, [SHIFT, 17])
2294+ .add(Symbol.VARIABLE, [SHIFT, 14])
2295+ .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
2296+ .add(Symbol.POUND, [SHIFT, 18])
2297+ .build();
2298+table[22] = ObjectBuilder
2299+ .add(Symbol.ERROR, 13)
2300+ .add(Symbol.EXPRESSION, 45)
2301+ .add(Symbol.VARIABLE_SEQUENCE, 3)
2302+ .add(Symbol.TIME_AMPM, [SHIFT, 4])
2303+ .add(Symbol.TIME_24, [SHIFT, 5])
2304+ .add(Symbol.NUMBER, 6)
2305+ .add(Symbol.STRING, [SHIFT, 7])
2306+ .add(Symbol.PLUS, [SHIFT, 10])
2307+ .add(Symbol.LEFT_PAREN, [SHIFT, 8])
2308+ .add(Symbol.MINUS, [SHIFT, 9])
2309+ .add(Symbol.FUNCTION, [SHIFT, 11])
2310+ .add(Symbol.CELL, 12)
2311+ .add(Symbol.FIXEDCELL, [SHIFT, 16])
2312+ .add(Symbol.CELL_UPPER, [SHIFT, 17])
2313+ .add(Symbol.VARIABLE, [SHIFT, 14])
2314+ .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
2315+ .add(Symbol.POUND, [SHIFT, 18])
2316+ .build();
2317+table[23] = ObjectBuilder
2318+ .add(Symbol.ERROR, 13)
2319+ .add(Symbol.EXPRESSION, 48)
2320+ .add(Symbol.VARIABLE_SEQUENCE, 3)
2321+ .add(Symbol.TIME_AMPM, [SHIFT, 4])
2322+ .add(Symbol.TIME_24, [SHIFT, 5])
2323+ .add(Symbol.NUMBER, 6)
2324+ .add(Symbol.STRING, [SHIFT, 7])
2325+ .add(Symbol.EQUALS, [SHIFT, 46])
2326+ .add(Symbol.PLUS, [SHIFT, 10])
2327+ .add(Symbol.LEFT_PAREN, [SHIFT, 8])
2328+ .add(Symbol.GREATER_THAN, [SHIFT, 47])
2329+ .add(Symbol.MINUS, [SHIFT, 9])
2330+ .add(Symbol.FUNCTION, [SHIFT, 11])
2331+ .add(Symbol.CELL, 12)
2332+ .add(Symbol.FIXEDCELL, [SHIFT, 16])
2333+ .add(Symbol.CELL_UPPER, [SHIFT, 17])
2334+ .add(Symbol.VARIABLE, [SHIFT, 14])
2335+ .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
2336+ .add(Symbol.POUND, [SHIFT, 18])
2337+ .build();
2338+table[24] = ObjectBuilder
2339+ .add(Symbol.ERROR, 13)
2340+ .add(Symbol.EXPRESSION, 50)
2341+ .add(Symbol.VARIABLE_SEQUENCE, 3)
2342+ .add(Symbol.TIME_AMPM, [SHIFT, 4])
2343+ .add(Symbol.TIME_24, [SHIFT, 5])
2344+ .add(Symbol.NUMBER, 6)
2345+ .add(Symbol.STRING, [SHIFT, 7])
2346+ .add(Symbol.EQUALS, [SHIFT, 49])
2347+ .add(Symbol.PLUS, [SHIFT, 10])
2348+ .add(Symbol.LEFT_PAREN, [SHIFT, 8])
2349+ .add(Symbol.MINUS, [SHIFT, 9])
2350+ .add(Symbol.FUNCTION, [SHIFT, 11])
2351+ .add(Symbol.CELL, 12)
2352+ .add(Symbol.FIXEDCELL, [SHIFT, 16])
2353+ .add(Symbol.CELL_UPPER, [SHIFT, 17])
2354+ .add(Symbol.VARIABLE, [SHIFT, 14])
2355+ .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
2356+ .add(Symbol.POUND, [SHIFT, 18])
2357+ .build();
2358+table[25] = ObjectBuilder
2359+ .add(Symbol.ERROR, 13)
2360+ .add(Symbol.EXPRESSION, 51)
2361+ .add(Symbol.VARIABLE_SEQUENCE, 3)
2362+ .add(Symbol.TIME_AMPM, [SHIFT, 4])
2363+ .add(Symbol.TIME_24, [SHIFT, 5])
2364+ .add(Symbol.NUMBER, 6)
2365+ .add(Symbol.STRING, [SHIFT, 7])
2366+ .add(Symbol.PLUS, [SHIFT, 10])
2367+ .add(Symbol.LEFT_PAREN, [SHIFT, 8])
2368+ .add(Symbol.MINUS, [SHIFT, 9])
2369+ .add(Symbol.FUNCTION, [SHIFT, 11])
2370+ .add(Symbol.CELL, 12)
2371+ .add(Symbol.FIXEDCELL, [SHIFT, 16])
2372+ .add(Symbol.CELL_UPPER, [SHIFT, 17])
2373+ .add(Symbol.VARIABLE, [SHIFT, 14])
2374+ .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
2375+ .add(Symbol.POUND, [SHIFT, 18])
2376+ .build();
2377+table[26] = ObjectBuilder
2378+ .add(Symbol.ERROR, 13)
2379+ .add(Symbol.EXPRESSION, 52)
2380+ .add(Symbol.VARIABLE_SEQUENCE, 3)
2381+ .add(Symbol.TIME_AMPM, [SHIFT, 4])
2382+ .add(Symbol.TIME_24, [SHIFT, 5])
2383+ .add(Symbol.NUMBER, 6)
2384+ .add(Symbol.STRING, [SHIFT, 7])
2385+ .add(Symbol.PLUS, [SHIFT, 10])
2386+ .add(Symbol.LEFT_PAREN, [SHIFT, 8])
2387+ .add(Symbol.MINUS, [SHIFT, 9])
2388+ .add(Symbol.FUNCTION, [SHIFT, 11])
2389+ .add(Symbol.CELL, 12)
2390+ .add(Symbol.FIXEDCELL, [SHIFT, 16])
2391+ .add(Symbol.CELL_UPPER, [SHIFT, 17])
2392+ .add(Symbol.VARIABLE, [SHIFT, 14])
2393+ .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
2394+ .add(Symbol.POUND, [SHIFT, 18])
2395+ .build();
2396+table[27] = ObjectBuilder
2397+ .add(Symbol.ERROR, 13)
2398+ .add(Symbol.EXPRESSION, 53)
2399+ .add(Symbol.VARIABLE_SEQUENCE, 3)
2400+ .add(Symbol.TIME_AMPM, [SHIFT, 4])
2401+ .add(Symbol.TIME_24, [SHIFT, 5])
2402+ .add(Symbol.NUMBER, 6)
2403+ .add(Symbol.STRING, [SHIFT, 7])
2404+ .add(Symbol.PLUS, [SHIFT, 10])
2405+ .add(Symbol.LEFT_PAREN, [SHIFT, 8])
2406+ .add(Symbol.MINUS, [SHIFT, 9])
2407+ .add(Symbol.FUNCTION, [SHIFT, 11])
2408+ .add(Symbol.CELL, 12)
2409+ .add(Symbol.FIXEDCELL, [SHIFT, 16])
2410+ .add(Symbol.CELL_UPPER, [SHIFT, 17])
2411+ .add(Symbol.VARIABLE, [SHIFT, 14])
2412+ .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
2413+ .add(Symbol.POUND, [SHIFT, 18])
2414+ .build();
2415+table[28] = ObjectBuilder
2416+ .add(Symbol.ERROR, 13)
2417+ .add(Symbol.EXPRESSION, 54)
2418+ .add(Symbol.VARIABLE_SEQUENCE, 3)
2419+ .add(Symbol.TIME_AMPM, [SHIFT, 4])
2420+ .add(Symbol.TIME_24, [SHIFT, 5])
2421+ .add(Symbol.NUMBER, 6)
2422+ .add(Symbol.STRING, [SHIFT, 7])
2423+ .add(Symbol.PLUS, [SHIFT, 10])
2424+ .add(Symbol.LEFT_PAREN, [SHIFT, 8])
2425+ .add(Symbol.MINUS, [SHIFT, 9])
2426+ .add(Symbol.FUNCTION, [SHIFT, 11])
2427+ .add(Symbol.CELL, 12)
2428+ .add(Symbol.FIXEDCELL, [SHIFT, 16])
2429+ .add(Symbol.CELL_UPPER, [SHIFT, 17])
2430+ .add(Symbol.VARIABLE, [SHIFT, 14])
2431+ .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
2432+ .add(Symbol.POUND, [SHIFT, 18])
2433+ .build();
2434+table[29] = ObjectBuilder
2435+ .add(Symbol.ERROR, 13)
2436+ .add(Symbol.EXPRESSION, 55)
2437+ .add(Symbol.VARIABLE_SEQUENCE, 3)
2438+ .add(Symbol.TIME_AMPM, [SHIFT, 4])
2439+ .add(Symbol.TIME_24, [SHIFT, 5])
2440+ .add(Symbol.NUMBER, 6)
2441+ .add(Symbol.STRING, [SHIFT, 7])
2442+ .add(Symbol.PLUS, [SHIFT, 10])
2443+ .add(Symbol.LEFT_PAREN, [SHIFT, 8])
2444+ .add(Symbol.MINUS, [SHIFT, 9])
2445+ .add(Symbol.FUNCTION, [SHIFT, 11])
2446+ .add(Symbol.CELL, 12)
2447+ .add(Symbol.FIXEDCELL, [SHIFT, 16])
2448+ .add(Symbol.CELL_UPPER, [SHIFT, 17])
2449+ .add(Symbol.VARIABLE, [SHIFT, 14])
2450+ .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
2451+ .add(Symbol.POUND, [SHIFT, 18])
2452+ .build();
2453+table[30] = ObjectBuilder
2454+ .add(Symbol.VARIABLE, [SHIFT, 56])
2455+ .build();
2456+table[31] = ObjectBuilder
2457+ .add(Symbol.EOF, [REDUCE, 40])
2458+ .add(Symbol.AMPERSAND, [REDUCE, 40])
2459+ .add(Symbol.EQUALS, [REDUCE, 40])
2460+ .add(Symbol.PLUS, [REDUCE, 40])
2461+ .add(Symbol.RIGHT_PAREN, [REDUCE, 40])
2462+ .add(Symbol.LESS_THAN, [REDUCE, 40])
2463+ .add(Symbol.GREATER_THAN, [REDUCE, 40])
2464+ .add(Symbol.NOT, [REDUCE, 40])
2465+ .add(Symbol.MINUS, [REDUCE, 40])
2466+ .add(Symbol.ASTERISK, [REDUCE, 40])
2467+ .add(Symbol.DIVIDE, [REDUCE, 40])
2468+ .add(Symbol.CARROT, [REDUCE, 40])
2469+ .add(Symbol.SEMI_COLON, [REDUCE, 40])
2470+ .add(Symbol.COMMA, [REDUCE, 40])
2471+ .add(Symbol.PERCENT, [REDUCE, 40])
2472+ .add(38, [REDUCE, 40])
2473+ .build();
2474+table[32] = ObjectBuilder
2475+ .add(Symbol.AMPERSAND, [SHIFT, 20])
2476+ .add(Symbol.EQUALS, [SHIFT, 21])
2477+ .add(Symbol.PLUS, [SHIFT, 22])
2478+ .add(Symbol.RIGHT_PAREN, [SHIFT, 57])
2479+ .add(Symbol.LESS_THAN, [SHIFT, 23])
2480+ .add(Symbol.GREATER_THAN, [SHIFT, 24])
2481+ .add(Symbol.NOT, [SHIFT, 25])
2482+ .add(Symbol.MINUS, [SHIFT, 26])
2483+ .add(Symbol.ASTERISK, [SHIFT, 27])
2484+ .add(Symbol.DIVIDE, [SHIFT, 28])
2485+ .add(Symbol.CARROT, [SHIFT, 29])
2486+ .build();
2487+table[33] = ObjectBuilder
2488+ .add(Symbol.EOF, [REDUCE, 21])
2489+ .add(Symbol.AMPERSAND, [SHIFT, 20])
2490+ .add(Symbol.EQUALS, [REDUCE, 21])
2491+ .add(Symbol.PLUS, [REDUCE, 21])
2492+ .add(Symbol.RIGHT_PAREN, [REDUCE, 21])
2493+ .add(Symbol.LESS_THAN, [REDUCE, 21])
2494+ .add(Symbol.GREATER_THAN, [REDUCE, 21])
2495+ .add(Symbol.NOT, [REDUCE, 21])
2496+ .add(Symbol.MINUS, [REDUCE, 21])
2497+ .add(Symbol.ASTERISK, [SHIFT, 27])
2498+ .add(Symbol.DIVIDE, [SHIFT, 28])
2499+ .add(Symbol.CARROT, [SHIFT, 29])
2500+ .add(Symbol.SEMI_COLON, [REDUCE, 21])
2501+ .add(Symbol.COMMA, [REDUCE, 21])
2502+ .build();
2503+table[34] = ObjectBuilder
2504+ .add(Symbol.EOF, [REDUCE, 22])
2505+ .add(Symbol.AMPERSAND, [SHIFT, 20])
2506+ .add(Symbol.EQUALS, [REDUCE, 22])
2507+ .add(Symbol.PLUS, [REDUCE, 22])
2508+ .add(Symbol.RIGHT_PAREN, [REDUCE, 22])
2509+ .add(Symbol.LESS_THAN, [REDUCE, 22])
2510+ .add(Symbol.GREATER_THAN, [REDUCE, 22])
2511+ .add(Symbol.NOT, [REDUCE, 22])
2512+ .add(Symbol.MINUS, [REDUCE, 22])
2513+ .add(Symbol.ASTERISK, [SHIFT, 27])
2514+ .add(Symbol.DIVIDE, [SHIFT, 28])
2515+ .add(Symbol.CARROT, [SHIFT, 29])
2516+ .add(Symbol.SEMI_COLON, [REDUCE, 22])
2517+ .add(Symbol.COMMA, [REDUCE, 22])
2518+ .build();
2519+table[35] = ObjectBuilder
2520+ .add(Symbol.ERROR, 13)
2521+ .add(Symbol.EXPRESSION, 60)
2522+ .add(Symbol.VARIABLE_SEQUENCE, 3)
2523+ .add(Symbol.TIME_AMPM, [SHIFT, 4])
2524+ .add(Symbol.TIME_24, [SHIFT, 5])
2525+ .add(Symbol.NUMBER, 6)
2526+ .add(Symbol.STRING, [SHIFT, 7])
2527+ .add(Symbol.PLUS, [SHIFT, 10])
2528+ .add(Symbol.LEFT_PAREN, [SHIFT, 8])
2529+ .add(Symbol.RIGHT_PAREN, [SHIFT, 58])
2530+ .add(Symbol.MINUS, [SHIFT, 9])
2531+ .add(Symbol.FUNCTION, [SHIFT, 11])
2532+ .add(Symbol.EXP_SEQ, 59)
2533+ .add(Symbol.CELL, 12)
2534+ .add(Symbol.FIXEDCELL, [SHIFT, 16])
2535+ .add(Symbol.CELL_UPPER, [SHIFT, 17])
2536+ .add(Symbol.ARRAY, [SHIFT, 61])
2537+ .add(Symbol.VARIABLE, [SHIFT, 14])
2538+ .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
2539+ .add(Symbol.POUND, [SHIFT, 18])
2540+ .build();
2541+table[36] = ObjectBuilder
2542+ .add(Symbol.EOF, [REDUCE, 27])
2543+ .add(Symbol.AMPERSAND, [REDUCE, 27])
2544+ .add(Symbol.EQUALS, [REDUCE, 27])
2545+ .add(Symbol.PLUS, [REDUCE, 27])
2546+ .add(Symbol.RIGHT_PAREN, [REDUCE, 27])
2547+ .add(Symbol.LESS_THAN, [REDUCE, 27])
2548+ .add(Symbol.GREATER_THAN, [REDUCE, 27])
2549+ .add(Symbol.NOT, [REDUCE, 27])
2550+ .add(Symbol.MINUS, [REDUCE, 27])
2551+ .add(Symbol.ASTERISK, [REDUCE, 27])
2552+ .add(Symbol.DIVIDE, [REDUCE, 27])
2553+ .add(Symbol.CARROT, [REDUCE, 27])
2554+ .add(Symbol.SEMI_COLON, [REDUCE, 27])
2555+ .add(Symbol.COMMA, [REDUCE, 27])
2556+ .build();
2557+table[37] = ObjectBuilder
2558+ .add(Symbol.POUND, [REDUCE, 43])
2559+ .build();
2560+table[38] = ObjectBuilder
2561+ .add(Symbol.VARIABLE, [SHIFT, 62])
2562+ .build();
2563+table[39] = ObjectBuilder
2564+ .add(Symbol.NUMBER_UPPER, [SHIFT, 63])
2565+ .build();
2566+table[40] = ObjectBuilder
2567+ .add(Symbol.FIXEDCELL, [SHIFT, 64])
2568+ .build();
2569+table[41] = ObjectBuilder
2570+ .add(Symbol.CELL_UPPER, [SHIFT, 65])
2571+ .build();
2572+table[42] = ObjectBuilder
2573+ .add(Symbol.EXCLAMATION_POINT, [SHIFT, 66])
2574+ .build();
2575+table[43] = ObjectBuilder
2576+ .add(Symbol.EOF, [REDUCE, 7])
2577+ .add(Symbol.AMPERSAND, [REDUCE, 7])
2578+ .add(Symbol.EQUALS, [REDUCE, 7])
2579+ .add(Symbol.PLUS, [REDUCE, 7])
2580+ .add(Symbol.RIGHT_PAREN, [REDUCE, 7])
2581+ .add(Symbol.LESS_THAN, [REDUCE, 7])
2582+ .add(Symbol.GREATER_THAN, [REDUCE, 7])
2583+ .add(Symbol.NOT, [REDUCE, 7])
2584+ .add(Symbol.MINUS, [REDUCE, 7])
2585+ .add(Symbol.ASTERISK, [REDUCE, 7])
2586+ .add(Symbol.DIVIDE, [REDUCE, 7])
2587+ .add(Symbol.CARROT, [REDUCE, 7])
2588+ .add(Symbol.SEMI_COLON, [REDUCE, 7])
2589+ .add(Symbol.COMMA, [REDUCE, 7])
2590+ .build();
2591+table[44] = ObjectBuilder
2592+ .add(Symbol.EOF, [REDUCE, 8])
2593+ .add(Symbol.AMPERSAND, [SHIFT, 20])
2594+ .add(Symbol.EQUALS, [REDUCE, 8])
2595+ .add(Symbol.PLUS, [SHIFT, 22])
2596+ .add(Symbol.RIGHT_PAREN, [REDUCE, 8])
2597+ .add(Symbol.LESS_THAN, [SHIFT, 23])
2598+ .add(Symbol.GREATER_THAN, [SHIFT, 24])
2599+ .add(Symbol.NOT, [SHIFT, 25])
2600+ .add(Symbol.MINUS, [SHIFT, 26])
2601+ .add(Symbol.ASTERISK, [SHIFT, 27])
2602+ .add(Symbol.DIVIDE, [SHIFT, 28])
2603+ .add(Symbol.CARROT, [SHIFT, 29])
2604+ .add(Symbol.SEMI_COLON, [REDUCE, 8])
2605+ .add(Symbol.COMMA, [REDUCE, 8])
2606+ .build();
2607+table[45] = ObjectBuilder
2608+ .add(Symbol.EOF, [REDUCE, 9])
2609+ .add(Symbol.AMPERSAND, [SHIFT, 20])
2610+ .add(Symbol.EQUALS, [REDUCE, 9])
2611+ .add(Symbol.PLUS, [REDUCE, 9])
2612+ .add(Symbol.RIGHT_PAREN, [REDUCE, 9])
2613+ .add(Symbol.LESS_THAN, [REDUCE, 9])
2614+ .add(Symbol.GREATER_THAN, [REDUCE, 9])
2615+ .add(Symbol.NOT, [REDUCE, 9])
2616+ .add(Symbol.MINUS, [REDUCE, 9])
2617+ .add(Symbol.ASTERISK, [SHIFT, 27])
2618+ .add(Symbol.DIVIDE, [SHIFT, 28])
2619+ .add(Symbol.CARROT, [SHIFT, 29])
2620+ .add(Symbol.SEMI_COLON, [REDUCE, 9])
2621+ .add(Symbol.COMMA, [REDUCE, 9])
2622+ .build();
2623+table[46] = ObjectBuilder
2624+ .add(Symbol.ERROR, 13)
2625+ .add(Symbol.EXPRESSION, 67)
2626+ .add(Symbol.VARIABLE_SEQUENCE, 3)
2627+ .add(Symbol.TIME_AMPM, [SHIFT, 4])
2628+ .add(Symbol.TIME_24, [SHIFT, 5])
2629+ .add(Symbol.NUMBER, 6)
2630+ .add(Symbol.STRING, [SHIFT, 7])
2631+ .add(Symbol.PLUS, [SHIFT, 10])
2632+ .add(Symbol.LEFT_PAREN, [SHIFT, 8])
2633+ .add(Symbol.MINUS, [SHIFT, 9])
2634+ .add(Symbol.FUNCTION, [SHIFT, 11])
2635+ .add(Symbol.CELL, 12)
2636+ .add(Symbol.FIXEDCELL, [SHIFT, 16])
2637+ .add(Symbol.CELL_UPPER, [SHIFT, 17])
2638+ .add(Symbol.VARIABLE, [SHIFT, 14])
2639+ .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
2640+ .add(Symbol.POUND, [SHIFT, 18])
2641+ .build();
2642+table[47] = ObjectBuilder
2643+ .add(Symbol.ERROR, 13)
2644+ .add(Symbol.EXPRESSION, 68)
2645+ .add(Symbol.VARIABLE_SEQUENCE, 3)
2646+ .add(Symbol.TIME_AMPM, [SHIFT, 4])
2647+ .add(Symbol.TIME_24, [SHIFT, 5])
2648+ .add(Symbol.NUMBER, 6)
2649+ .add(Symbol.STRING, [SHIFT, 7])
2650+ .add(Symbol.PLUS, [SHIFT, 10])
2651+ .add(Symbol.LEFT_PAREN, [SHIFT, 8])
2652+ .add(Symbol.MINUS, [SHIFT, 9])
2653+ .add(Symbol.FUNCTION, [SHIFT, 11])
2654+ .add(Symbol.CELL, 12)
2655+ .add(Symbol.FIXEDCELL, [SHIFT, 16])
2656+ .add(Symbol.CELL_UPPER, [SHIFT, 17])
2657+ .add(Symbol.VARIABLE, [SHIFT, 14])
2658+ .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
2659+ .add(Symbol.POUND, [SHIFT, 18])
2660+ .build();
2661+table[48] = ObjectBuilder
2662+ .add(Symbol.EOF, [REDUCE, 16])
2663+ .add(Symbol.AMPERSAND, [SHIFT, 20])
2664+ .add(Symbol.EQUALS, [REDUCE, 16])
2665+ .add(Symbol.PLUS, [SHIFT, 22])
2666+ .add(Symbol.RIGHT_PAREN, [REDUCE, 16])
2667+ .add(Symbol.LESS_THAN, [REDUCE, 16])
2668+ .add(Symbol.GREATER_THAN, [REDUCE, 16])
2669+ .add(Symbol.NOT, [REDUCE, 16])
2670+ .add(Symbol.MINUS, [SHIFT, 26])
2671+ .add(Symbol.ASTERISK, [SHIFT, 27])
2672+ .add(Symbol.DIVIDE, [SHIFT, 28])
2673+ .add(Symbol.CARROT, [SHIFT, 29])
2674+ .add(Symbol.SEMI_COLON, [REDUCE, 16])
2675+ .add(Symbol.COMMA, [REDUCE, 16])
2676+ .build();
2677+table[49] = ObjectBuilder
2678+ .add(Symbol.ERROR, 13)
2679+ .add(Symbol.EXPRESSION, 69)
2680+ .add(Symbol.VARIABLE_SEQUENCE, 3)
2681+ .add(Symbol.TIME_AMPM, [SHIFT, 4])
2682+ .add(Symbol.TIME_24, [SHIFT, 5])
2683+ .add(Symbol.NUMBER, 6)
2684+ .add(Symbol.STRING, [SHIFT, 7])
2685+ .add(Symbol.PLUS, [SHIFT, 10])
2686+ .add(Symbol.LEFT_PAREN, [SHIFT, 8])
2687+ .add(Symbol.MINUS, [SHIFT, 9])
2688+ .add(Symbol.FUNCTION, [SHIFT, 11])
2689+ .add(Symbol.CELL, 12)
2690+ .add(Symbol.FIXEDCELL, [SHIFT, 16])
2691+ .add(Symbol.CELL_UPPER, [SHIFT, 17])
2692+ .add(Symbol.VARIABLE, [SHIFT, 14])
2693+ .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
2694+ .add(Symbol.POUND, [SHIFT, 18])
2695+ .build();
2696+table[50] = ObjectBuilder
2697+ .add(Symbol.EOF, [REDUCE, 15])
2698+ .add(Symbol.AMPERSAND, [SHIFT, 20])
2699+ .add(Symbol.EQUALS, [REDUCE, 15])
2700+ .add(Symbol.PLUS, [SHIFT, 22])
2701+ .add(Symbol.RIGHT_PAREN, [REDUCE, 15])
2702+ .add(Symbol.LESS_THAN, [REDUCE, 15])
2703+ .add(Symbol.GREATER_THAN, [REDUCE, 15])
2704+ .add(Symbol.NOT, [REDUCE, 15])
2705+ .add(Symbol.MINUS, [SHIFT, 26])
2706+ .add(Symbol.ASTERISK, [SHIFT, 27])
2707+ .add(Symbol.DIVIDE, [SHIFT, 28])
2708+ .add(Symbol.CARROT, [SHIFT, 29])
2709+ .add(Symbol.SEMI_COLON, [REDUCE, 15])
2710+ .add(Symbol.COMMA, [REDUCE, 15])
2711+ .build();
2712+table[51] = ObjectBuilder
2713+ .add(Symbol.EOF, [REDUCE, 14])
2714+ .add(Symbol.AMPERSAND, [SHIFT, 20])
2715+ .add(Symbol.EQUALS, [REDUCE, 14])
2716+ .add(Symbol.PLUS, [SHIFT, 22])
2717+ .add(Symbol.RIGHT_PAREN, [REDUCE, 14])
2718+ .add(Symbol.LESS_THAN, [SHIFT, 23])
2719+ .add(Symbol.GREATER_THAN, [SHIFT, 24])
2720+ .add(Symbol.NOT, [REDUCE, 14])
2721+ .add(Symbol.MINUS, [SHIFT, 26])
2722+ .add(Symbol.ASTERISK, [SHIFT, 27])
2723+ .add(Symbol.DIVIDE, [SHIFT, 28])
2724+ .add(Symbol.CARROT, [SHIFT, 29])
2725+ .add(Symbol.SEMI_COLON, [REDUCE, 14])
2726+ .add(Symbol.COMMA, [REDUCE, 14])
2727+ .build();
2728+table[52] = ObjectBuilder
2729+ .add(Symbol.EOF, [REDUCE, 17])
2730+ .add(Symbol.AMPERSAND, [SHIFT, 20])
2731+ .add(Symbol.EQUALS, [REDUCE, 17])
2732+ .add(Symbol.PLUS, [REDUCE, 17])
2733+ .add(Symbol.RIGHT_PAREN, [REDUCE, 17])
2734+ .add(Symbol.LESS_THAN, [REDUCE, 17])
2735+ .add(Symbol.GREATER_THAN, [REDUCE, 17])
2736+ .add(Symbol.NOT, [REDUCE, 17])
2737+ .add(Symbol.MINUS, [REDUCE, 17])
2738+ .add(Symbol.ASTERISK, [SHIFT, 27])
2739+ .add(Symbol.DIVIDE, [SHIFT, 28])
2740+ .add(Symbol.CARROT, [SHIFT, 29])
2741+ .add(Symbol.SEMI_COLON, [REDUCE, 17])
2742+ .add(Symbol.COMMA, [REDUCE, 17])
2743+ .build();
2744+table[53] = ObjectBuilder
2745+ .add(Symbol.EOF, [REDUCE, 18])
2746+ .add(Symbol.AMPERSAND, [SHIFT, 20])
2747+ .add(Symbol.EQUALS, [REDUCE, 18])
2748+ .add(Symbol.PLUS, [REDUCE, 18])
2749+ .add(Symbol.RIGHT_PAREN, [REDUCE, 18])
2750+ .add(Symbol.LESS_THAN, [REDUCE, 18])
2751+ .add(Symbol.GREATER_THAN, [REDUCE, 18])
2752+ .add(Symbol.NOT, [REDUCE, 18])
2753+ .add(Symbol.MINUS, [REDUCE, 18])
2754+ .add(Symbol.ASTERISK, [REDUCE, 18])
2755+ .add(Symbol.DIVIDE, [REDUCE, 18])
2756+ .add(Symbol.CARROT, [SHIFT, 29])
2757+ .add(Symbol.SEMI_COLON, [REDUCE, 18])
2758+ .add(Symbol.COMMA, [REDUCE, 18])
2759+ .build();
2760+table[54] = ObjectBuilder
2761+ .add(Symbol.EOF, [REDUCE, 19])
2762+ .add(Symbol.AMPERSAND, [SHIFT, 20])
2763+ .add(Symbol.EQUALS, [REDUCE, 19])
2764+ .add(Symbol.PLUS, [REDUCE, 19])
2765+ .add(Symbol.RIGHT_PAREN, [REDUCE, 19])
2766+ .add(Symbol.LESS_THAN, [REDUCE, 19])
2767+ .add(Symbol.GREATER_THAN, [REDUCE, 19])
2768+ .add(Symbol.NOT, [REDUCE, 19])
2769+ .add(Symbol.MINUS, [REDUCE, 19])
2770+ .add(Symbol.ASTERISK, [REDUCE, 19])
2771+ .add(Symbol.DIVIDE, [REDUCE, 19])
2772+ .add(Symbol.CARROT, [SHIFT, 29])
2773+ .add(Symbol.SEMI_COLON, [REDUCE, 19])
2774+ .add(Symbol.COMMA, [REDUCE, 19])
2775+ .build();
2776+table[55] = ObjectBuilder
2777+ .add(Symbol.EOF, [REDUCE, 20])
2778+ .add(Symbol.AMPERSAND, [SHIFT, 20])
2779+ .add(Symbol.EQUALS, [REDUCE, 20])
2780+ .add(Symbol.PLUS, [REDUCE, 20])
2781+ .add(Symbol.RIGHT_PAREN, [REDUCE, 20])
2782+ .add(Symbol.LESS_THAN, [REDUCE, 20])
2783+ .add(Symbol.GREATER_THAN, [REDUCE, 20])
2784+ .add(Symbol.NOT, [REDUCE, 20])
2785+ .add(Symbol.MINUS, [REDUCE, 20])
2786+ .add(Symbol.ASTERISK, [REDUCE, 20])
2787+ .add(Symbol.DIVIDE, [REDUCE, 20])
2788+ .add(Symbol.CARROT, [REDUCE, 20])
2789+ .add(Symbol.SEMI_COLON, [REDUCE, 20])
2790+ .add(Symbol.COMMA, [REDUCE, 20])
2791+ .build();
2792+table[56] = ObjectBuilder
2793+ .add(Symbol.EOF, [REDUCE, 37])
2794+ .add(Symbol.AMPERSAND, [REDUCE, 37])
2795+ .add(Symbol.EQUALS, [REDUCE, 37])
2796+ .add(Symbol.PLUS, [REDUCE, 37])
2797+ .add(Symbol.RIGHT_PAREN, [REDUCE, 37])
2798+ .add(Symbol.LESS_THAN, [REDUCE, 37])
2799+ .add(Symbol.GREATER_THAN, [REDUCE, 37])
2800+ .add(Symbol.NOT, [REDUCE, 37])
2801+ .add(Symbol.MINUS, [REDUCE, 37])
2802+ .add(Symbol.ASTERISK, [REDUCE, 37])
2803+ .add(Symbol.DIVIDE, [REDUCE, 37])
2804+ .add(Symbol.CARROT, [REDUCE, 37])
2805+ .add(Symbol.SEMI_COLON, [REDUCE, 37])
2806+ .add(Symbol.COMMA, [REDUCE, 37])
2807+ .add(33, [REDUCE, 37])
2808+ .build();
2809+table[57] = ObjectBuilder
2810+ .add(Symbol.EOF, [REDUCE, 10])
2811+ .add(Symbol.AMPERSAND, [REDUCE, 10])
2812+ .add(Symbol.EQUALS, [REDUCE, 10])
2813+ .add(Symbol.PLUS, [REDUCE, 10])
2814+ .add(Symbol.RIGHT_PAREN, [REDUCE, 10])
2815+ .add(Symbol.LESS_THAN, [REDUCE, 10])
2816+ .add(Symbol.GREATER_THAN, [REDUCE, 10])
2817+ .add(Symbol.NOT, [REDUCE, 10])
2818+ .add(Symbol.MINUS, [REDUCE, 10])
2819+ .add(Symbol.ASTERISK, [REDUCE, 10])
2820+ .add(Symbol.DIVIDE, [REDUCE, 10])
2821+ .add(Symbol.CARROT, [REDUCE, 10])
2822+ .add(Symbol.SEMI_COLON, [REDUCE, 10])
2823+ .add(Symbol.COMMA, [REDUCE, 10])
2824+ .build();
2825+table[58] = ObjectBuilder
2826+ .add(Symbol.EOF, [REDUCE, 23])
2827+ .add(Symbol.AMPERSAND, [REDUCE, 23])
2828+ .add(Symbol.EQUALS, [REDUCE, 23])
2829+ .add(Symbol.PLUS, [REDUCE, 23])
2830+ .add(Symbol.RIGHT_PAREN, [REDUCE, 23])
2831+ .add(Symbol.LESS_THAN, [REDUCE, 23])
2832+ .add(Symbol.GREATER_THAN, [REDUCE, 23])
2833+ .add(Symbol.NOT, [REDUCE, 23])
2834+ .add(Symbol.MINUS, [REDUCE, 23])
2835+ .add(Symbol.ASTERISK, [REDUCE, 23])
2836+ .add(Symbol.DIVIDE, [REDUCE, 23])
2837+ .add(Symbol.CARROT, [REDUCE, 23])
2838+ .add(Symbol.SEMI_COLON, [REDUCE, 23])
2839+ .add(Symbol.COMMA, [REDUCE, 23])
2840+ .build();
2841+table[59] = ObjectBuilder
2842+ .add(Symbol.RIGHT_PAREN, [SHIFT, 70])
2843+ .add(Symbol.SEMI_COLON, [SHIFT, 71])
2844+ .add(Symbol.COMMA, [SHIFT, 72])
2845+ .build();
2846+table[60] = ObjectBuilder
2847+ .add(Symbol.AMPERSAND, [SHIFT, 20])
2848+ .add(Symbol.EQUALS, [SHIFT, 21])
2849+ .add(Symbol.PLUS, [SHIFT, 22])
2850+ .add(Symbol.RIGHT_PAREN, [REDUCE, 32])
2851+ .add(Symbol.LESS_THAN, [SHIFT, 23])
2852+ .add(Symbol.GREATER_THAN, [SHIFT, 24])
2853+ .add(Symbol.NOT, [SHIFT, 25])
2854+ .add(Symbol.MINUS, [SHIFT, 26])
2855+ .add(Symbol.ASTERISK, [SHIFT, 27])
2856+ .add(Symbol.DIVIDE, [SHIFT, 28])
2857+ .add(Symbol.CARROT, [SHIFT, 29])
2858+ .add(Symbol.SEMI_COLON, [REDUCE, 32])
2859+ .add(Symbol.COMMA, [REDUCE, 32])
2860+ .build();
2861+table[61] = ObjectBuilder
2862+ .add(Symbol.RIGHT_PAREN, [REDUCE, 33])
2863+ .add(Symbol.SEMI_COLON, [REDUCE, 33])
2864+ .add(Symbol.COMMA, [REDUCE, 33])
2865+ .build();
2866+table[62] = ObjectBuilder
2867+ .add(Symbol.EXCLAMATION_POINT, [SHIFT, 73])
2868+ .build();
2869+table[63] = ObjectBuilder
2870+ .add(Symbol.EOF, [REDUCE, 39])
2871+ .add(Symbol.AMPERSAND, [REDUCE, 39])
2872+ .add(Symbol.EQUALS, [REDUCE, 39])
2873+ .add(Symbol.PLUS, [REDUCE, 39])
2874+ .add(Symbol.RIGHT_PAREN, [REDUCE, 39])
2875+ .add(Symbol.LESS_THAN, [REDUCE, 39])
2876+ .add(Symbol.GREATER_THAN, [REDUCE, 39])
2877+ .add(Symbol.NOT, [REDUCE, 39])
2878+ .add(Symbol.MINUS, [REDUCE, 39])
2879+ .add(Symbol.ASTERISK, [REDUCE, 39])
2880+ .add(Symbol.DIVIDE, [REDUCE, 39])
2881+ .add(Symbol.CARROT, [REDUCE, 39])
2882+ .add(Symbol.SEMI_COLON, [REDUCE, 39])
2883+ .add(Symbol.COMMA, [REDUCE, 39])
2884+ .add(Symbol.PERCENT, [REDUCE, 39])
2885+ .add(38, [REDUCE, 39]).build();
2886+table[64] = ObjectBuilder
2887+ .add(Symbol.EOF, [REDUCE, 29])
2888+ .add(Symbol.AMPERSAND, [REDUCE, 29])
2889+ .add(Symbol.EQUALS, [REDUCE, 29])
2890+ .add(Symbol.PLUS, [REDUCE, 29])
2891+ .add(Symbol.RIGHT_PAREN, [REDUCE, 29])
2892+ .add(Symbol.LESS_THAN, [REDUCE, 29])
2893+ .add(Symbol.GREATER_THAN, [REDUCE, 29])
2894+ .add(Symbol.NOT, [REDUCE, 29])
2895+ .add(Symbol.MINUS, [REDUCE, 29])
2896+ .add(Symbol.ASTERISK, [REDUCE, 29])
2897+ .add(Symbol.DIVIDE, [REDUCE, 29])
2898+ .add(Symbol.CARROT, [REDUCE, 29])
2899+ .add(Symbol.SEMI_COLON, [REDUCE, 29])
2900+ .add(Symbol.COMMA, [REDUCE, 29]).build();
2901+table[65] = ObjectBuilder
2902+ .add(Symbol.EOF, [REDUCE, 31])
2903+ .add(Symbol.AMPERSAND, [REDUCE, 31])
2904+ .add(Symbol.EQUALS, [REDUCE, 31])
2905+ .add(Symbol.PLUS, [REDUCE, 31])
2906+ .add(Symbol.RIGHT_PAREN, [REDUCE, 31])
2907+ .add(Symbol.LESS_THAN, [REDUCE, 31])
2908+ .add(Symbol.GREATER_THAN, [REDUCE, 31])
2909+ .add(Symbol.NOT, [REDUCE, 31])
2910+ .add(Symbol.MINUS, [REDUCE, 31])
2911+ .add(Symbol.ASTERISK, [REDUCE, 31])
2912+ .add(Symbol.DIVIDE, [REDUCE, 31])
2913+ .add(Symbol.CARROT, [REDUCE, 31])
2914+ .add(Symbol.SEMI_COLON, [REDUCE, 31])
2915+ .add(Symbol.COMMA, [REDUCE, 31]).build();
2916+table[66] = ObjectBuilder
2917+ .add(Symbol.EOF, [REDUCE, 41])
2918+ .add(Symbol.AMPERSAND, [REDUCE, 41])
2919+ .add(Symbol.EQUALS, [REDUCE, 41])
2920+ .add(Symbol.PLUS, [REDUCE, 41])
2921+ .add(Symbol.RIGHT_PAREN, [REDUCE, 41])
2922+ .add(Symbol.LESS_THAN, [REDUCE, 41])
2923+ .add(Symbol.GREATER_THAN, [REDUCE, 41])
2924+ .add(Symbol.NOT, [REDUCE, 41])
2925+ .add(Symbol.MINUS, [REDUCE, 41])
2926+ .add(Symbol.ASTERISK, [REDUCE, 41])
2927+ .add(Symbol.DIVIDE, [REDUCE, 41])
2928+ .add(Symbol.CARROT, [REDUCE, 41])
2929+ .add(Symbol.SEMI_COLON, [REDUCE, 41])
2930+ .add(Symbol.COMMA, [REDUCE, 41])
2931+ .add(Symbol.VARIABLE, [REDUCE, 41])
2932+ .add(Symbol.POUND, [REDUCE, 41]).build();
2933+table[67] = ObjectBuilder
2934+ .add(Symbol.EOF, [REDUCE, 11])
2935+ .add(Symbol.AMPERSAND, [SHIFT, 20])
2936+ .add(Symbol.EQUALS, [REDUCE, 11])
2937+ .add(Symbol.PLUS, [SHIFT, 22])
2938+ .add(Symbol.RIGHT_PAREN, [REDUCE, 11])
2939+ .add(Symbol.LESS_THAN, [REDUCE, 11])
2940+ .add(Symbol.GREATER_THAN, [REDUCE, 11])
2941+ .add(Symbol.NOT, [REDUCE, 11])
2942+ .add(Symbol.MINUS, [SHIFT, 26])
2943+ .add(Symbol.ASTERISK, [SHIFT, 27])
2944+ .add(Symbol.DIVIDE, [SHIFT, 28])
2945+ .add(Symbol.CARROT, [SHIFT, 29])
2946+ .add(Symbol.SEMI_COLON, [REDUCE, 11])
2947+ .add(Symbol.COMMA, [REDUCE, 11]).build();
2948+table[68] = ObjectBuilder
2949+ .add(Symbol.EOF, [REDUCE, 13])
2950+ .add(Symbol.AMPERSAND, [SHIFT, 20])
2951+ .add(Symbol.EQUALS, [REDUCE, 13])
2952+ .add(Symbol.PLUS, [SHIFT, 22])
2953+ .add(Symbol.RIGHT_PAREN, [REDUCE, 13])
2954+ .add(Symbol.LESS_THAN, [REDUCE, 13])
2955+ .add(Symbol.GREATER_THAN, [REDUCE, 13])
2956+ .add(Symbol.NOT, [REDUCE, 13])
2957+ .add(Symbol.MINUS, [SHIFT, 26])
2958+ .add(Symbol.ASTERISK, [SHIFT, 27])
2959+ .add(Symbol.DIVIDE, [SHIFT, 28])
2960+ .add(Symbol.CARROT, [SHIFT, 29])
2961+ .add(Symbol.SEMI_COLON, [REDUCE, 13])
2962+ .add(Symbol.COMMA, [REDUCE, 13]).build();
2963+table[69] = ObjectBuilder
2964+ .add(Symbol.EOF, [REDUCE, 12])
2965+ .add(Symbol.AMPERSAND, [SHIFT, 20])
2966+ .add(Symbol.EQUALS, [REDUCE, 12])
2967+ .add(Symbol.PLUS, [SHIFT, 22])
2968+ .add(Symbol.RIGHT_PAREN, [REDUCE, 12])
2969+ .add(Symbol.LESS_THAN, [REDUCE, 12])
2970+ .add(Symbol.GREATER_THAN, [REDUCE, 12])
2971+ .add(Symbol.NOT, [REDUCE, 12])
2972+ .add(Symbol.MINUS, [SHIFT, 26])
2973+ .add(Symbol.ASTERISK, [SHIFT, 27])
2974+ .add(Symbol.DIVIDE, [SHIFT, 28])
2975+ .add(Symbol.CARROT, [SHIFT, 29])
2976+ .add(Symbol.SEMI_COLON, [REDUCE, 12])
2977+ .add(Symbol.COMMA, [REDUCE, 12]).build();
2978+table[70] = ObjectBuilder
2979+ .add(Symbol.EOF, [REDUCE, 24])
2980+ .add(Symbol.AMPERSAND, [REDUCE, 24])
2981+ .add(Symbol.EQUALS, [REDUCE, 24])
2982+ .add(Symbol.PLUS, [REDUCE, 24])
2983+ .add(Symbol.RIGHT_PAREN, [REDUCE, 24])
2984+ .add(Symbol.LESS_THAN, [REDUCE, 24])
2985+ .add(Symbol.GREATER_THAN, [REDUCE, 24])
2986+ .add(Symbol.NOT, [REDUCE, 24])
2987+ .add(Symbol.MINUS, [REDUCE, 24])
2988+ .add(Symbol.ASTERISK, [REDUCE, 24])
2989+ .add(Symbol.DIVIDE, [REDUCE, 24])
2990+ .add(Symbol.CARROT, [REDUCE, 24])
2991+ .add(Symbol.SEMI_COLON, [REDUCE, 24])
2992+ .add(Symbol.COMMA, [REDUCE, 24]).build();
2993+table[71] = ObjectBuilder
2994+ .add(Symbol.ERROR, 13)
2995+ .add(Symbol.EXPRESSION, 74)
2996+ .add(Symbol.VARIABLE_SEQUENCE, 3)
2997+ .add(Symbol.TIME_AMPM, [SHIFT, 4])
2998+ .add(Symbol.TIME_24, [SHIFT, 5])
2999+ .add(Symbol.NUMBER, 6)
3000+ .add(Symbol.STRING, [SHIFT, 7])
3001+ .add(Symbol.EQUALS, [SHIFT, 21])
3002+ .add(Symbol.PLUS, [SHIFT, 10])
3003+ .add(Symbol.LEFT_PAREN, [SHIFT, 8])
3004+ .add(Symbol.MINUS, [SHIFT, 9])
3005+ .add(Symbol.FUNCTION, [SHIFT, 11])
3006+ .add(Symbol.CELL, 12)
3007+ .add(Symbol.FIXEDCELL, [SHIFT, 16])
3008+ .add(Symbol.CELL_UPPER, [SHIFT, 17])
3009+ .add(Symbol.VARIABLE, [SHIFT, 14])
3010+ .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
3011+ .add(Symbol.POUND, [SHIFT, 18]).build();
3012+table[72] = ObjectBuilder
3013+ .add(Symbol.ERROR, 13)
3014+ .add(Symbol.EXPRESSION, 75)
3015+ .add(Symbol.VARIABLE_SEQUENCE, 3)
3016+ .add(Symbol.TIME_AMPM, [SHIFT, 4])
3017+ .add(Symbol.TIME_24, [SHIFT, 5])
3018+ .add(Symbol.NUMBER, 6)
3019+ .add(Symbol.STRING, [SHIFT, 7])
3020+ .add(Symbol.EQUALS, [SHIFT, 21])
3021+ .add(Symbol.PLUS, [SHIFT, 10])
3022+ .add(Symbol.LEFT_PAREN, [SHIFT, 8])
3023+ .add(Symbol.MINUS, [SHIFT, 9])
3024+ .add(Symbol.FUNCTION, [SHIFT, 11])
3025+ .add(Symbol.CELL, 12)
3026+ .add(Symbol.FIXEDCELL, [SHIFT, 16])
3027+ .add(Symbol.CELL_UPPER, [SHIFT, 17])
3028+ .add(Symbol.VARIABLE, [SHIFT, 14])
3029+ .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
3030+ .add(Symbol.POUND, [SHIFT, 18]).build();
3031+table[73] = ObjectBuilder
3032+ .add(Symbol.EOF, [REDUCE, 42])
3033+ .add(Symbol.AMPERSAND, [REDUCE, 42])
3034+ .add(Symbol.EQUALS, [REDUCE, 42])
3035+ .add(Symbol.PLUS, [REDUCE, 42])
3036+ .add(Symbol.RIGHT_PAREN, [REDUCE, 42])
3037+ .add(Symbol.LESS_THAN, [REDUCE, 42])
3038+ .add(Symbol.GREATER_THAN, [REDUCE, 42])
3039+ .add(Symbol.NOT, [REDUCE, 42])
3040+ .add(Symbol.MINUS, [REDUCE, 42])
3041+ .add(Symbol.ASTERISK, [REDUCE, 42])
3042+ .add(Symbol.DIVIDE, [REDUCE, 42])
3043+ .add(Symbol.CARROT, [REDUCE, 42])
3044+ .add(Symbol.SEMI_COLON, [REDUCE, 42])
3045+ .add(Symbol.COMMA, [REDUCE, 42])
3046+ .add(Symbol.VARIABLE, [REDUCE, 42])
3047+ .add(Symbol.POUND, [REDUCE, 42]).build();
3048+table[74] = ObjectBuilder
3049+ .add(Symbol.AMPERSAND, [SHIFT, 20])
3050+ .add(Symbol.EQUALS, [SHIFT, 21])
3051+ .add(Symbol.PLUS, [SHIFT, 22])
3052+ .add(Symbol.RIGHT_PAREN, [REDUCE, 34])
3053+ .add(Symbol.LESS_THAN, [SHIFT, 23])
3054+ .add(Symbol.GREATER_THAN, [SHIFT, 24])
3055+ .add(Symbol.NOT, [SHIFT, 25])
3056+ .add(Symbol.MINUS, [SHIFT, 26])
3057+ .add(Symbol.ASTERISK, [SHIFT, 27])
3058+ .add(Symbol.DIVIDE, [SHIFT, 28])
3059+ .add(Symbol.CARROT, [SHIFT, 29])
3060+ .add(Symbol.SEMI_COLON, [REDUCE, 34])
3061+ .add(Symbol.COMMA, [REDUCE, 34]).build();
3062+table[75] = ObjectBuilder
3063+ .add(Symbol.AMPERSAND, [SHIFT, 20])
3064+ .add(Symbol.EQUALS, [SHIFT, 21])
3065+ .add(Symbol.PLUS, [SHIFT, 22])
3066+ .add(Symbol.RIGHT_PAREN, [REDUCE, 35])
3067+ .add(Symbol.LESS_THAN, [SHIFT, 23])
3068+ .add(Symbol.GREATER_THAN, [SHIFT, 24])
3069+ .add(Symbol.NOT, [SHIFT, 25])
3070+ .add(Symbol.MINUS, [SHIFT, 26])
3071+ .add(Symbol.ASTERISK, [SHIFT, 27])
3072+ .add(Symbol.DIVIDE, [SHIFT, 28])
3073+ .add(Symbol.CARROT, [SHIFT, 29])
3074+ .add(Symbol.SEMI_COLON, [REDUCE, 35])
3075+ .add(Symbol.COMMA, [REDUCE, 35]).build();
3076+const ACTION_TABLE = table;
3077+
3078+
3079+export {
3080+ ACTION_TABLE,
3081+ RULES,
3082+ Symbol,
3083+ ReduceActions,
3084+ ReductionPair,
3085+ REDUCE,
3086+ ACCEPT,
3087+ SHIFT,
3088+ SYMBOL_INDEX_TO_NAME,
3089+ SYMBOL_NAME_TO_INDEX,
3090+ PRODUCTIONS
3091+}
3092\ No newline at end of file
3093diff --git a/tests/SheetFormulaTest.ts b/tests/SheetFormulaTest.ts
3094index 4373c60..263ad75 100644
3095--- a/tests/SheetFormulaTest.ts
3096+++ b/tests/SheetFormulaTest.ts
3097@@ -3,61 +3,24 @@ import {
3098 } from "../src/Sheet";
3099 import {
3100 assertEquals,
3101+ assertFormulaEquals,
3102+ assertFormulaResultsInType,
3103+ assertFormulaEqualsArray,
3104+ assertFormulaEqualsError,
3105+ assertFormulaEqualsDependsOnReference,
3106 test
3107 } from "./Utils/Asserts";
3108 import {
3109 DIV_ZERO_ERROR,
3110 VALUE_ERROR,
3111- NA_ERROR, PARSE_ERROR, REF_ERROR
3112+ NA_ERROR,
3113+ PARSE_ERROR,
3114+ REF_ERROR
3115 } from "../src/Errors";
3116 import {
3117 Cell
3118 } from "../src/Cell";
3119
3120-function assertFormulaEqualsError(formula: string, errorString: string) {
3121- let sheet = new Sheet();
3122- sheet.setCell("A1", formula);
3123- let cell = sheet.getCell("A1");
3124- assertEquals(cell.getError().name, errorString);
3125- assertEquals(cell.getValue(), null);
3126-}
3127-
3128-function assertFormulaEquals(formula: string, expectation: any) {
3129- let sheet = new Sheet();
3130- sheet.setCell("A1", formula);
3131- let cell = sheet.getCell("A1");
3132- assertEquals(cell.getError(), null);
3133- assertEquals(cell.getValue(), expectation);
3134-}
3135-
3136-function assertFormulaEqualsDependsOnReference(refId: string, value: any, formula: string, expectation: any) {
3137- let sheet = new Sheet();
3138- sheet.setCell(refId, value);
3139- sheet.setCell("A1", formula);
3140- let cell = sheet.getCell("A1");
3141- assertEquals(cell.getError(), null);
3142- assertEquals(cell.getValue(), expectation);
3143-}
3144-
3145-function assertFormulaResultsInType(formula: string, type: string) {
3146- let sheet = new Sheet();
3147- sheet.setCell("A1", formula);
3148- let cell = sheet.getCell("A1");
3149- assertEquals(cell.getError(), null);
3150- assertEquals(typeof cell.getValue(), type);
3151-}
3152-
3153-function assertFormulaEqualsArray(formula: string, expectation: any) {
3154- let sheet = new Sheet();
3155- sheet.setCell("A1", formula);
3156- let cell = sheet.getCell("A1");
3157- assertEquals(null, cell.getError());
3158- let values = cell.getValue();
3159- for (let index in values) {
3160- assertEquals(values[index], expectation[index]);
3161- }
3162-}
3163-
3164 test("Sheet ABS", function(){
3165 assertFormulaEquals("=ABS(-10)", 10);
3166 assertFormulaEquals("=ABS(0)", 0);
3167diff --git a/tests/SheetParsingTest.ts b/tests/SheetParsingTest.ts
3168new file mode 100644
3169index 0000000..ad8eaff
3170--- /dev/null
3171+++ b/tests/SheetParsingTest.ts
3172@@ -0,0 +1,71 @@
3173+import {
3174+ assertFormulaEquals,
3175+ assertFormulaEqualsError,
3176+ test
3177+} from "./Utils/Asserts";
3178+import {
3179+ DIV_ZERO_ERROR,
3180+ VALUE_ERROR,
3181+ PARSE_ERROR, NA_ERROR, NUM_ERROR, NULL_ERROR, REF_ERROR
3182+} from "../src/Errors";
3183+
3184+test("Sheet parsing error", function(){
3185+ assertFormulaEqualsError('= 10e', PARSE_ERROR);
3186+ assertFormulaEqualsError('= SUM(', PARSE_ERROR);
3187+});
3188+
3189+test("Sheet *", function(){
3190+ assertFormulaEquals('= 10 * 10', 100);
3191+ assertFormulaEquals('= 10 * 0', 0);
3192+ assertFormulaEquals('= 1 * 1', 1);
3193+});
3194+
3195+test("Sheet /", function(){
3196+ assertFormulaEquals('= 10 / 2', 5);
3197+ assertFormulaEquals('= 10 / 1', 10);
3198+ assertFormulaEquals('= 1 / 1', 1);
3199+ assertFormulaEquals('= 0 / 1', 0);
3200+ assertFormulaEquals('="1" / 1', 1);
3201+ assertFormulaEquals('="500" / 1', 500);
3202+ assertFormulaEqualsError('= 10 / 0', DIV_ZERO_ERROR);
3203+ assertFormulaEqualsError('= 0 / 0', DIV_ZERO_ERROR);
3204+ assertFormulaEquals('= P9 / 1', 0);
3205+});
3206+
3207+test("Sheet ^", function(){
3208+ assertFormulaEquals('= 10 ^ 10', 10000000000);
3209+ assertFormulaEquals('= 10 ^ 0', 1);
3210+ assertFormulaEquals('= 1 ^ 1', 1);
3211+ assertFormulaEquals('= 2 ^ 10', 1024);
3212+});
3213+
3214+test("Sheet throw error literal", function () {
3215+ assertFormulaEqualsError('=#N/A', NA_ERROR);
3216+ // assertFormulaEqualsError('=ISNA(#N/A)', NA_ERROR);
3217+ assertFormulaEqualsError('=#NUM!', NUM_ERROR);
3218+ assertFormulaEqualsError('=#REF!', REF_ERROR);
3219+ assertFormulaEqualsError('=#NULL!', NULL_ERROR);
3220+ assertFormulaEqualsError('=#ERROR', PARSE_ERROR);
3221+ assertFormulaEqualsError('=#DIV/0!', DIV_ZERO_ERROR);
3222+ assertFormulaEqualsError('=#VALUE!', VALUE_ERROR);
3223+});
3224+
3225+test("Sheet numbers/math", function(){
3226+ assertFormulaEquals('= "10" + 10', 20);
3227+ assertFormulaEquals('= "10.111111" + 0', 10.111111);
3228+ assertFormulaEquals('= 10%', 0.1);
3229+ assertFormulaEquals('= 10% + 1', 1.1);
3230+ assertFormulaEquals('= "10e1" + 0', 100);
3231+ assertFormulaEquals('= 10e1', 100);
3232+ assertFormulaEquals('= 10e-1', 1);
3233+ assertFormulaEquals('= 10e+1', 100);
3234+ assertFormulaEquals('= 10E1', 100);
3235+ assertFormulaEquals('= 10E-1', 1);
3236+ assertFormulaEquals('= 10E+1', 100);
3237+ assertFormulaEquals('= "1,000,000" + 0', 1000000);
3238+ assertFormulaEqualsError('= "10e" + 10', VALUE_ERROR);
3239+ assertFormulaEquals('= "+$10.00" + 0', 10);
3240+ assertFormulaEquals('= "-$10.00" + 0', -10);
3241+ assertFormulaEquals('= "$+10.00" + 0', 10);
3242+ assertFormulaEquals('= "$-10.00" + 0', -10);
3243+});
3244diff --git a/tests/Utils/Asserts.ts b/tests/Utils/Asserts.ts
3245index a0fc5d3..efd274f 100644
3246--- a/tests/Utils/Asserts.ts
3247+++ b/tests/Utils/Asserts.ts
3248@@ -1,4 +1,10 @@
3249-import {Cell} from "../../src/Cell";
3250+import {
3251+ Cell
3252+} from "../../src/Cell";
3253+
3254+import {
3255+ Sheet
3256+} from "../../src/Sheet";
3257 /**
3258 * Assert two params are equal using strict equality testing.
3259 * @param actual value
3260@@ -82,10 +88,60 @@ function test(description: string, toRun: Function) {
3261 }
3262
3263
3264+function assertFormulaEqualsError(formula: string, errorString: string) {
3265+ let sheet = new Sheet();
3266+ sheet.setCell("A1", formula);
3267+ let cell = sheet.getCell("A1");
3268+ assertEquals(cell.getError().name, errorString);
3269+ assertEquals(cell.getValue(), null);
3270+}
3271+
3272+function assertFormulaEquals(formula: string, expectation: any) {
3273+ let sheet = new Sheet();
3274+ sheet.setCell("A1", formula);
3275+ let cell = sheet.getCell("A1");
3276+ assertEquals(cell.getError(), null);
3277+ assertEquals(cell.getValue(), expectation);
3278+}
3279+
3280+function assertFormulaEqualsDependsOnReference(refId: string, value: any, formula: string, expectation: any) {
3281+ let sheet = new Sheet();
3282+ sheet.setCell(refId, value);
3283+ sheet.setCell("A1", formula);
3284+ let cell = sheet.getCell("A1");
3285+ assertEquals(cell.getError(), null);
3286+ assertEquals(cell.getValue(), expectation);
3287+}
3288+
3289+function assertFormulaResultsInType(formula: string, type: string) {
3290+ let sheet = new Sheet();
3291+ sheet.setCell("A1", formula);
3292+ let cell = sheet.getCell("A1");
3293+ assertEquals(cell.getError(), null);
3294+ assertEquals(typeof cell.getValue(), type);
3295+}
3296+
3297+function assertFormulaEqualsArray(formula: string, expectation: any) {
3298+ let sheet = new Sheet();
3299+ sheet.setCell("A1", formula);
3300+ let cell = sheet.getCell("A1");
3301+ assertEquals(null, cell.getError());
3302+ let values = cell.getValue();
3303+ for (let index in values) {
3304+ assertEquals(values[index], expectation[index]);
3305+ }
3306+}
3307+
3308+
3309 export {
3310 assertIsNull,
3311 assertEquals,
3312 assertArrayEquals,
3313+ assertFormulaEquals,
3314+ assertFormulaResultsInType,
3315+ assertFormulaEqualsArray,
3316+ assertFormulaEqualsError,
3317+ assertFormulaEqualsDependsOnReference,
3318 catchAndAssertEquals,
3319 test
3320 }
3321\ No newline at end of file