spreadsheet
typeScript/javascript spreadsheet parser, with formulas.
git clone https://git.vogt.world/spreadsheet.git
Log | Files | README.md
← Commit log
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