spreadsheet
typeScript/javascript spreadsheet parser, with formulas.
git clone https://git.vogt.world/spreadsheet.git
Log | Files | README.md
← Commit log
commit
message
[Parser, ParserConstants, Info.IFERROR] error literals working, fixed IFERROR function
author
Ben Vogt <[email protected]>
date
2017-09-23 23:52:03
stats
5 file(s) changed, 1019 insertions(+), 924 deletions(-)
files
TODO.md
src/Formulas/Info.ts
src/Parser/ParserConstants.ts
tests/Formulas/InfoTest.ts
tests/SheetParsingTest.ts
   1diff --git a/TODO.md b/TODO.md
   2index a45b253..53c5ab5 100644
   3--- a/TODO.md
   4+++ b/TODO.md
   5@@ -9,15 +9,11 @@ Instead of having non-primitives, (i.e. Date, DateTime, Time, Dollar), cells sho
   6 For example 64 tbs to a qt.
   7 
   8 
   9-### Raw input of errors should be allowed.
  10-For example `=#N/A` should force an error to be thrown inside the cell.
  11-
  12-
  13 ### Parser/Sheet should be able to be initialized with js range notation (`[]`) or regular range notation (`{}`)
  14 
  15 
  16 ### Parser should be able to parse arrays without `eval`
  17-Right now, arrays and reference literals in a formula are parsed using JS `eval`. This means, if we have references inside, or non-JS parsing values like TRUE or FALSE, they will cause ReferenceErrors. For example, `=SUM([M1, 10])` would throw `[ReferenceError: M1 is not defined]` because M1 is not a variables. Instead of using `eval`, we should parse the opening of an array, and the closeing of an array, and use recursion to see how deep we are, evaluating the tokens inside in the sam way we parse formulas and functions.
  18+Right now, arrays and reference literals in a formula are parsed using JS `eval`. This means, if we have references inside, or non-JS parsing values like TRUE or FALSE, they will cause ReferenceErrors. For example, `=SUM([M1, 10])` would throw `[ReferenceError: M1 is not defined]` because M1 is not a variable. Instead of using `eval`, we should parse the opening of an array, and the closeing of an array, and use recursion to see how deep we are, evaluating the tokens inside in the sam way we parse formulas and functions.
  19 
  20 
  21 ### Meta-Formulas to write
  22diff --git a/src/Formulas/Info.ts b/src/Formulas/Info.ts
  23index 2416c42..1a4f879 100644
  24--- a/src/Formulas/Info.ts
  25+++ b/src/Formulas/Info.ts
  26@@ -296,17 +296,18 @@ let ISNA = function (value) {
  27  * @constructor
  28  */
  29 let IFERROR = function (value, valueIfError?) {
  30+  valueIfError = valueIfError || null;
  31   ArgsChecker.checkLengthWithin(arguments, 1, 2, "IFERROR");
  32   if (value instanceof Cell) {
  33     if (value.hasError()) {
  34-      return null;
  35+      return valueIfError;
  36     }
  37     return value;
  38   }
  39-  if (!ISERROR(value)) {
  40-    return value;
  41+  if (ISERROR(value)) {
  42+    return valueIfError;
  43   }
  44-  return null;
  45+  return value;
  46 };
  47 
  48 
  49diff --git a/src/Parser/ParserConstants.ts b/src/Parser/ParserConstants.ts
  50index 4f59e2d..7ca040d 100644
  51--- a/src/Parser/ParserConstants.ts
  52+++ b/src/Parser/ParserConstants.ts
  53@@ -350,7 +350,7 @@ class ObjectBuilder {
  54 
  55 /**
  56  * Array of to map rules to to LexActions and other rules. A single index in the object (e.g. `{2: 13}`) indicates the
  57- * rule object to follow for the next token, while an array (e.g. `{23: [1, 11]}`) indicates the action to be taken,
  58+ * rule object to follow for the next token, while an array (e.g. `{23: [1, ReduceActions.LTE]}`) indicates the action to be taken,
  59  * and the rule object to follow after the action.
  60  */
  61 let table = [];
  62@@ -360,608 +360,610 @@ table[0] = ObjectBuilder
  63   .add(Symbol.EXPRESSIONS, 1)
  64   .add(Symbol.EXPRESSION, 2)
  65   .add(Symbol.VARIABLE_SEQUENCE, 3)
  66-  .add(Symbol.TIME_AMPM, [SHIFT, 4])
  67-  .add(Symbol.TIME_24, [SHIFT, 5])
  68+  .add(Symbol.TIME_AMPM, [SHIFT, ReduceActions.TIME_CALL])
  69+  .add(Symbol.TIME_24, [SHIFT, ReduceActions.AS_NUMBER])
  70   .add(Symbol.NUMBER, 6)
  71-  .add(Symbol.STRING, [SHIFT, 7])
  72-  .add(Symbol.PLUS, [SHIFT, 10])
  73-  .add(Symbol.LEFT_PAREN, [SHIFT, 8])
  74-  .add(Symbol.MINUS, [SHIFT, 9])
  75-  .add(Symbol.FUNCTION, [SHIFT, 11])
  76+  .add(Symbol.STRING, [SHIFT, ReduceActions.AMPERSAND])
  77+  .add(Symbol.PLUS, [SHIFT, ReduceActions.LAST_NUMBER])
  78+  .add(Symbol.LEFT_PAREN, [SHIFT, ReduceActions.EQUALS])
  79+  .add(Symbol.MINUS, [SHIFT, ReduceActions.PLUS])
  80+  .add(Symbol.FUNCTION, [SHIFT, ReduceActions.LTE])
  81   .add(Symbol.CELL, 12)
  82-  .add(Symbol.FIXEDCELL, [SHIFT, 16])
  83-  .add(Symbol.CELL_UPPER, [SHIFT, 17])
  84-  .add(Symbol.VARIABLE, [SHIFT, 14])
  85-  .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
  86-  .add(Symbol.POUND, [SHIFT, 18])
  87+  .add(Symbol.FIXEDCELL, [SHIFT, ReduceActions.LT])
  88+  .add(Symbol.CELL_UPPER, [SHIFT, ReduceActions.MINUS])
  89+  .add(Symbol.VARIABLE, [SHIFT, ReduceActions.NOT])
  90+  .add(Symbol.NUMBER_UPPER, [SHIFT, ReduceActions.GT])
  91+  .add(Symbol.POUND, [SHIFT, ReduceActions.MULTIPLY])
  92   .build();
  93 table[1] = ObjectBuilder
  94   .add(Symbol.END, [3])
  95   .build();
  96 table[2] = ObjectBuilder
  97-  .add(Symbol.EOF, [SHIFT, 19])
  98-  .add(Symbol.AMPERSAND, [SHIFT, 20])
  99-  .add(Symbol.EQUALS, [SHIFT, 21])
 100-  .add(Symbol.PLUS, [SHIFT, 22])
 101-  .add(Symbol.LESS_THAN, [SHIFT, 23])
 102-  .add(Symbol.GREATER_THAN, [SHIFT, 24])
 103-  .add(Symbol.NOT, [SHIFT, 25])
 104-  .add(Symbol.MINUS, [SHIFT, 26])
 105-  .add(Symbol.ASTERISK, [SHIFT, 27])
 106-  .add(Symbol.DIVIDE, [SHIFT, 28])
 107-  .add(Symbol.CARROT, [SHIFT, 29])
 108+  .add(Symbol.EOF, [SHIFT, ReduceActions.DIVIDE])
 109+  .add(Symbol.AMPERSAND, [SHIFT, ReduceActions.TO_POWER])
 110+  .add(Symbol.EQUALS, [SHIFT, ReduceActions.INVERT_NUM])
 111+  .add(Symbol.PLUS, [SHIFT, ReduceActions.TO_NUMBER_NAN_AS_ZERO])
 112+  .add(Symbol.LESS_THAN, [SHIFT, ReduceActions.CALL_FUNCTION_LAST_BLANK])
 113+  .add(Symbol.GREATER_THAN, [SHIFT, ReduceActions.CALL_FUNCTION_LAST_TWO_IN_STACK])
 114+  .add(Symbol.NOT, [SHIFT, ReduceActions.I25])
 115+  .add(Symbol.MINUS, [SHIFT, ReduceActions.I26])
 116+  .add(Symbol.ASTERISK, [SHIFT, ReduceActions.I27])
 117+  .add(Symbol.DIVIDE, [SHIFT, ReduceActions.FIXED_CELL_VAL])
 118+  .add(Symbol.CARROT, [SHIFT, ReduceActions.FIXED_CELL_RANGE_VAL])
 119   .build();
 120 table[3] = ObjectBuilder
 121-  .add(Symbol.EOF, [REDUCE, 2])
 122-  .add(Symbol.AMPERSAND, [REDUCE, 2])
 123-  .add(Symbol.EQUALS, [REDUCE, 2])
 124-  .add(Symbol.PLUS, [REDUCE, 2])
 125-  .add(Symbol.RIGHT_PAREN, [REDUCE, 2])
 126-  .add(Symbol.LESS_THAN, [REDUCE, 2])
 127-  .add(Symbol.GREATER_THAN, [REDUCE, 2])
 128-  .add(Symbol.NOT, [REDUCE, 2])
 129-  .add(Symbol.MINUS, [REDUCE, 2])
 130-  .add(Symbol.ASTERISK, [REDUCE, 2])
 131-  .add(Symbol.DIVIDE, [REDUCE, 2])
 132-  .add(Symbol.CARROT, [REDUCE, 2])
 133-  .add(Symbol.SEMI_COLON, [REDUCE, 2])
 134-  .add(Symbol.COMMA, [REDUCE, 2])
 135-  .add(33, [SHIFT, 30])
 136+  .add(Symbol.EOF, [REDUCE, ReduceActions.CALL_VARIABLE])
 137+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.CALL_VARIABLE])
 138+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.CALL_VARIABLE])
 139+  .add(Symbol.PLUS, [REDUCE, ReduceActions.CALL_VARIABLE])
 140+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.CALL_VARIABLE])
 141+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.CALL_VARIABLE])
 142+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.CALL_VARIABLE])
 143+  .add(Symbol.NOT, [REDUCE, ReduceActions.CALL_VARIABLE])
 144+  .add(Symbol.MINUS, [REDUCE, ReduceActions.CALL_VARIABLE])
 145+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.CALL_VARIABLE])
 146+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.CALL_VARIABLE])
 147+  .add(Symbol.CARROT, [REDUCE, ReduceActions.CALL_VARIABLE])
 148+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.CALL_VARIABLE])
 149+  .add(Symbol.COMMA, [REDUCE, ReduceActions.CALL_VARIABLE])
 150+  .add(33, [SHIFT, ReduceActions.CELL_VALUE])
 151   .build();
 152 table[3] = ObjectBuilder
 153-  .add(Symbol.EOF, [REDUCE, 2])
 154-  .add(Symbol.AMPERSAND, [REDUCE, 2])
 155-  .add(Symbol.EQUALS, [REDUCE, 2])
 156-  .add(Symbol.PLUS, [REDUCE, 2])
 157-  .add(Symbol.RIGHT_PAREN, [REDUCE, 2])
 158-  .add(Symbol.LESS_THAN, [REDUCE, 2])
 159-  .add(Symbol.GREATER_THAN, [REDUCE, 2])
 160-  .add(Symbol.NOT, [REDUCE, 2])
 161-  .add(Symbol.MINUS, [REDUCE, 2])
 162-  .add(Symbol.ASTERISK, [REDUCE, 2])
 163-  .add(Symbol.DIVIDE, [REDUCE, 2])
 164-  .add(Symbol.CARROT, [REDUCE, 2])
 165-  .add(Symbol.SEMI_COLON, [REDUCE, 2])
 166-  .add(Symbol.COMMA, [REDUCE, 2])
 167-  .add(33, [SHIFT, 30])
 168+  .add(Symbol.EOF, [REDUCE, ReduceActions.CALL_VARIABLE])
 169+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.CALL_VARIABLE])
 170+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.CALL_VARIABLE])
 171+  .add(Symbol.PLUS, [REDUCE, ReduceActions.CALL_VARIABLE])
 172+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.CALL_VARIABLE])
 173+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.CALL_VARIABLE])
 174+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.CALL_VARIABLE])
 175+  .add(Symbol.NOT, [REDUCE, ReduceActions.CALL_VARIABLE])
 176+  .add(Symbol.MINUS, [REDUCE, ReduceActions.CALL_VARIABLE])
 177+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.CALL_VARIABLE])
 178+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.CALL_VARIABLE])
 179+  .add(Symbol.CARROT, [REDUCE, ReduceActions.CALL_VARIABLE])
 180+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.CALL_VARIABLE])
 181+  .add(Symbol.COMMA, [REDUCE, ReduceActions.CALL_VARIABLE])
 182+  .add(33, [SHIFT, ReduceActions.CELL_VALUE])
 183   .build();
 184 table[4] = ObjectBuilder
 185-  .add(Symbol.EOF, [REDUCE, 3])
 186-  .add(Symbol.AMPERSAND, [REDUCE, 3])
 187-  .add(Symbol.EQUALS, [REDUCE, 3])
 188-  .add(Symbol.PLUS, [REDUCE, 3])
 189-  .add(Symbol.RIGHT_PAREN, [REDUCE, 3])
 190-  .add(Symbol.LESS_THAN, [REDUCE, 3])
 191-  .add(Symbol.GREATER_THAN, [REDUCE, 3])
 192-  .add(Symbol.NOT, [REDUCE, 3])
 193-  .add(Symbol.MINUS, [REDUCE, 3])
 194-  .add(Symbol.ASTERISK, [REDUCE, 3])
 195-  .add(Symbol.DIVIDE, [REDUCE, 3])
 196-  .add(Symbol.CARROT, [REDUCE, 3])
 197-  .add(Symbol.SEMI_COLON, [REDUCE, 3])
 198-  .add(Symbol.COMMA, [REDUCE, 3])
 199+  .add(Symbol.EOF, [REDUCE, ReduceActions.TIME_CALL_TRUE])
 200+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.TIME_CALL_TRUE])
 201+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.TIME_CALL_TRUE])
 202+  .add(Symbol.PLUS, [REDUCE, ReduceActions.TIME_CALL_TRUE])
 203+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.TIME_CALL_TRUE])
 204+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.TIME_CALL_TRUE])
 205+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.TIME_CALL_TRUE])
 206+  .add(Symbol.NOT, [REDUCE, ReduceActions.TIME_CALL_TRUE])
 207+  .add(Symbol.MINUS, [REDUCE, ReduceActions.TIME_CALL_TRUE])
 208+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.TIME_CALL_TRUE])
 209+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.TIME_CALL_TRUE])
 210+  .add(Symbol.CARROT, [REDUCE, ReduceActions.TIME_CALL_TRUE])
 211+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.TIME_CALL_TRUE])
 212+  .add(Symbol.COMMA, [REDUCE, ReduceActions.TIME_CALL_TRUE])
 213   .build();
 214 table[5] = ObjectBuilder
 215-  .add(Symbol.EOF, [REDUCE, 4])
 216-  .add(Symbol.AMPERSAND, [REDUCE, 4])
 217-  .add(Symbol.EQUALS, [REDUCE, 4])
 218-  .add(Symbol.PLUS, [REDUCE, 4])
 219-  .add(Symbol.RIGHT_PAREN, [REDUCE, 4])
 220-  .add(Symbol.LESS_THAN, [REDUCE, 4])
 221-  .add(Symbol.GREATER_THAN, [REDUCE, 4])
 222-  .add(Symbol.NOT, [REDUCE, 4])
 223-  .add(Symbol.MINUS, [REDUCE, 4])
 224-  .add(Symbol.ASTERISK, [REDUCE, 4])
 225-  .add(Symbol.DIVIDE, [REDUCE, 4])
 226-  .add(Symbol.CARROT, [REDUCE, 4])
 227-  .add(Symbol.SEMI_COLON, [REDUCE, 4])
 228-  .add(Symbol.COMMA, [REDUCE, 4])
 229+  .add(Symbol.EOF, [REDUCE, ReduceActions.TIME_CALL])
 230+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.TIME_CALL])
 231+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.TIME_CALL])
 232+  .add(Symbol.PLUS, [REDUCE, ReduceActions.TIME_CALL])
 233+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.TIME_CALL])
 234+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.TIME_CALL])
 235+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.TIME_CALL])
 236+  .add(Symbol.NOT, [REDUCE, ReduceActions.TIME_CALL])
 237+  .add(Symbol.MINUS, [REDUCE, ReduceActions.TIME_CALL])
 238+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.TIME_CALL])
 239+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.TIME_CALL])
 240+  .add(Symbol.CARROT, [REDUCE, ReduceActions.TIME_CALL])
 241+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.TIME_CALL])
 242+  .add(Symbol.COMMA, [REDUCE, ReduceActions.TIME_CALL])
 243   .build();
 244 table[6] = ObjectBuilder
 245-  .add(Symbol.EOF, [REDUCE, 5])
 246-  .add(Symbol.AMPERSAND, [REDUCE, 5])
 247-  .add(Symbol.EQUALS, [REDUCE, 5])
 248-  .add(Symbol.PLUS, [REDUCE, 5])
 249-  .add(Symbol.RIGHT_PAREN, [REDUCE, 5])
 250-  .add(Symbol.LESS_THAN, [REDUCE, 5])
 251-  .add(Symbol.GREATER_THAN, [REDUCE, 5])
 252-  .add(Symbol.NOT, [REDUCE, 5])
 253-  .add(Symbol.MINUS, [REDUCE, 5])
 254-  .add(Symbol.ASTERISK, [REDUCE, 5])
 255-  .add(Symbol.DIVIDE, [REDUCE, 5])
 256-  .add(Symbol.CARROT, [REDUCE, 5])
 257-  .add(Symbol.SEMI_COLON, [REDUCE, 5])
 258-  .add(Symbol.COMMA, [REDUCE, 5])
 259-  .add(Symbol.PERCENT, [SHIFT, 31])
 260+  .add(Symbol.EOF, [REDUCE, ReduceActions.AS_NUMBER])
 261+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.AS_NUMBER])
 262+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.AS_NUMBER])
 263+  .add(Symbol.PLUS, [REDUCE, ReduceActions.AS_NUMBER])
 264+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.AS_NUMBER])
 265+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.AS_NUMBER])
 266+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.AS_NUMBER])
 267+  .add(Symbol.NOT, [REDUCE, ReduceActions.AS_NUMBER])
 268+  .add(Symbol.MINUS, [REDUCE, ReduceActions.AS_NUMBER])
 269+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.AS_NUMBER])
 270+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.AS_NUMBER])
 271+  .add(Symbol.CARROT, [REDUCE, ReduceActions.AS_NUMBER])
 272+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.AS_NUMBER])
 273+  .add(Symbol.COMMA, [REDUCE, ReduceActions.AS_NUMBER])
 274+  .add(Symbol.PERCENT, [SHIFT, ReduceActions.CELL_RANGE_VALUE])
 275   .build();
 276 table[7] = ObjectBuilder
 277-  .add(Symbol.EOF, [REDUCE, 6])
 278-  .add(Symbol.AMPERSAND, [REDUCE, 6])
 279-  .add(Symbol.EQUALS, [REDUCE, 6])
 280-  .add(Symbol.PLUS, [REDUCE, 6])
 281-  .add(Symbol.RIGHT_PAREN, [REDUCE, 6])
 282-  .add(Symbol.LESS_THAN, [REDUCE, 6])
 283-  .add(Symbol.GREATER_THAN, [REDUCE, 6])
 284-  .add(Symbol.NOT, [REDUCE, 6])
 285-  .add(Symbol.MINUS, [REDUCE, 6])
 286-  .add(Symbol.ASTERISK, [REDUCE, 6])
 287-  .add(Symbol.DIVIDE, [REDUCE, 6])
 288-  .add(Symbol.CARROT, [REDUCE, 6])
 289-  .add(Symbol.SEMI_COLON, [REDUCE, 6])
 290-  .add(Symbol.COMMA, [REDUCE, 6])
 291+  .add(Symbol.EOF, [REDUCE, ReduceActions.AS_STRING])
 292+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.AS_STRING])
 293+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.AS_STRING])
 294+  .add(Symbol.PLUS, [REDUCE, ReduceActions.AS_STRING])
 295+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.AS_STRING])
 296+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.AS_STRING])
 297+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.AS_STRING])
 298+  .add(Symbol.NOT, [REDUCE, ReduceActions.AS_STRING])
 299+  .add(Symbol.MINUS, [REDUCE, ReduceActions.AS_STRING])
 300+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.AS_STRING])
 301+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.AS_STRING])
 302+  .add(Symbol.CARROT, [REDUCE, ReduceActions.AS_STRING])
 303+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.AS_STRING])
 304+  .add(Symbol.COMMA, [REDUCE, ReduceActions.AS_STRING])
 305   .build();
 306 table[8] = ObjectBuilder
 307   .add(Symbol.ERROR, 13)
 308   .add(Symbol.EXPRESSION, 32)
 309   .add(Symbol.VARIABLE_SEQUENCE, 3)
 310-  .add(Symbol.TIME_AMPM, [SHIFT, 4])
 311-  .add(Symbol.TIME_24, [SHIFT, 5])
 312+  .add(Symbol.TIME_AMPM, [SHIFT, ReduceActions.TIME_CALL])
 313+  .add(Symbol.TIME_24, [SHIFT, ReduceActions.AS_NUMBER])
 314   .add(Symbol.NUMBER, 6)
 315-  .add(Symbol.STRING, [SHIFT, 7])
 316-  .add(Symbol.PLUS, [SHIFT, 10])
 317-  .add(Symbol.LEFT_PAREN, [SHIFT, 8])
 318-  .add(Symbol.MINUS, [SHIFT, 9])
 319-  .add(Symbol.FUNCTION, [SHIFT, 11])
 320+  .add(Symbol.STRING, [SHIFT, ReduceActions.AMPERSAND])
 321+  .add(Symbol.PLUS, [SHIFT, ReduceActions.LAST_NUMBER])
 322+  .add(Symbol.LEFT_PAREN, [SHIFT, ReduceActions.EQUALS])
 323+  .add(Symbol.MINUS, [SHIFT, ReduceActions.PLUS])
 324+  .add(Symbol.FUNCTION, [SHIFT, ReduceActions.LTE])
 325   .add(Symbol.CELL, 12)
 326-  .add(Symbol.FIXEDCELL, [SHIFT, 16])
 327-  .add(Symbol.CELL_UPPER, [SHIFT, 17])
 328-  .add(Symbol.VARIABLE, [SHIFT, 14])
 329-  .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
 330-  .add(Symbol.POUND, [SHIFT, 18])
 331+  .add(Symbol.FIXEDCELL, [SHIFT, ReduceActions.LT])
 332+  .add(Symbol.CELL_UPPER, [SHIFT, ReduceActions.MINUS])
 333+  .add(Symbol.VARIABLE, [SHIFT, ReduceActions.NOT])
 334+  .add(Symbol.NUMBER_UPPER, [SHIFT, ReduceActions.GT])
 335+  .add(Symbol.POUND, [SHIFT, ReduceActions.MULTIPLY])
 336   .build();
 337 table[9] = ObjectBuilder
 338   .add(Symbol.ERROR, 13)
 339   .add(Symbol.EXPRESSION, 33)
 340   .add(Symbol.VARIABLE_SEQUENCE, 3)
 341-  .add(Symbol.TIME_AMPM, [SHIFT, 4])
 342-  .add(Symbol.TIME_24, [SHIFT, 5])
 343+  .add(Symbol.TIME_AMPM, [SHIFT, ReduceActions.TIME_CALL])
 344+  .add(Symbol.TIME_24, [SHIFT, ReduceActions.AS_NUMBER])
 345   .add(Symbol.NUMBER, 6)
 346-  .add(Symbol.STRING, [SHIFT, 7])
 347-  .add(Symbol.PLUS, [SHIFT, 10])
 348-  .add(Symbol.LEFT_PAREN, [SHIFT, 8])
 349-  .add(Symbol.MINUS, [SHIFT, 9])
 350-  .add(Symbol.FUNCTION, [SHIFT, 11])
 351+  .add(Symbol.STRING, [SHIFT, ReduceActions.AMPERSAND])
 352+  .add(Symbol.PLUS, [SHIFT, ReduceActions.LAST_NUMBER])
 353+  .add(Symbol.LEFT_PAREN, [SHIFT, ReduceActions.EQUALS])
 354+  .add(Symbol.MINUS, [SHIFT, ReduceActions.PLUS])
 355+  .add(Symbol.FUNCTION, [SHIFT, ReduceActions.LTE])
 356   .add(Symbol.CELL, 12)
 357-  .add(Symbol.FIXEDCELL, [SHIFT, 16])
 358-  .add(Symbol.CELL_UPPER, [SHIFT, 17])
 359-  .add(Symbol.VARIABLE, [SHIFT, 14])
 360-  .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
 361-  .add(Symbol.POUND, [SHIFT, 18])
 362+  .add(Symbol.FIXEDCELL, [SHIFT, ReduceActions.LT])
 363+  .add(Symbol.CELL_UPPER, [SHIFT, ReduceActions.MINUS])
 364+  .add(Symbol.VARIABLE, [SHIFT, ReduceActions.NOT])
 365+  .add(Symbol.NUMBER_UPPER, [SHIFT, ReduceActions.GT])
 366+  .add(Symbol.POUND, [SHIFT, ReduceActions.MULTIPLY])
 367   .build();
 368 table[10] = ObjectBuilder
 369   .add(Symbol.ERROR, 13)
 370   .add(Symbol.EXPRESSION, 34)
 371   .add(Symbol.VARIABLE_SEQUENCE, 3)
 372-  .add(Symbol.TIME_AMPM, [SHIFT, 4])
 373-  .add(Symbol.TIME_24, [SHIFT, 5])
 374+  .add(Symbol.TIME_AMPM, [SHIFT, ReduceActions.TIME_CALL])
 375+  .add(Symbol.TIME_24, [SHIFT, ReduceActions.AS_NUMBER])
 376   .add(Symbol.NUMBER, 6)
 377-  .add(Symbol.STRING, [SHIFT, 7])
 378-  .add(Symbol.PLUS, [SHIFT, 10])
 379-  .add(Symbol.LEFT_PAREN, [SHIFT, 8])
 380-  .add(Symbol.MINUS, [SHIFT, 9])
 381-  .add(Symbol.FUNCTION, [SHIFT, 11])
 382+  .add(Symbol.STRING, [SHIFT, ReduceActions.AMPERSAND])
 383+  .add(Symbol.PLUS, [SHIFT, ReduceActions.LAST_NUMBER])
 384+  .add(Symbol.LEFT_PAREN, [SHIFT, ReduceActions.EQUALS])
 385+  .add(Symbol.MINUS, [SHIFT, ReduceActions.PLUS])
 386+  .add(Symbol.FUNCTION, [SHIFT, ReduceActions.LTE])
 387   .add(Symbol.CELL, 12)
 388-  .add(Symbol.FIXEDCELL, [SHIFT, 16])
 389-  .add(Symbol.CELL_UPPER, [SHIFT, 17])
 390-  .add(Symbol.VARIABLE, [SHIFT, 14])
 391-  .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
 392-  .add(Symbol.POUND, [SHIFT, 18])
 393+  .add(Symbol.FIXEDCELL, [SHIFT, ReduceActions.LT])
 394+  .add(Symbol.CELL_UPPER, [SHIFT, ReduceActions.MINUS])
 395+  .add(Symbol.VARIABLE, [SHIFT, ReduceActions.NOT])
 396+  .add(Symbol.NUMBER_UPPER, [SHIFT, ReduceActions.GT])
 397+  .add(Symbol.POUND, [SHIFT, ReduceActions.MULTIPLY])
 398   .build();
 399 table[11] = ObjectBuilder
 400-  .add(Symbol.LEFT_PAREN, [SHIFT, 35])
 401+  .add(Symbol.LEFT_PAREN, [SHIFT, ReduceActions.REDUCE_PERCENT])
 402   .build();
 403 table[12] = ObjectBuilder
 404-  .add(Symbol.EOF, [REDUCE, 25])
 405-  .add(Symbol.AMPERSAND, [REDUCE, 25])
 406-  .add(Symbol.EQUALS, [REDUCE, 25])
 407-  .add(Symbol.PLUS, [REDUCE, 25])
 408-  .add(Symbol.RIGHT_PAREN, [REDUCE, 25])
 409-  .add(Symbol.LESS_THAN, [REDUCE, 25])
 410-  .add(Symbol.GREATER_THAN, [REDUCE, 25])
 411-  .add(Symbol.NOT, [REDUCE, 25])
 412-  .add(Symbol.MINUS, [REDUCE, 25])
 413-  .add(Symbol.ASTERISK, [REDUCE, 25])
 414-  .add(Symbol.DIVIDE, [REDUCE, 25])
 415-  .add(Symbol.CARROT, [REDUCE, 25])
 416-  .add(Symbol.SEMI_COLON, [REDUCE, 25])
 417-  .add(Symbol.COMMA, [REDUCE, 25])
 418+  .add(Symbol.EOF, [REDUCE, ReduceActions.I25])
 419+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.I25])
 420+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.I25])
 421+  .add(Symbol.PLUS, [REDUCE, ReduceActions.I25])
 422+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.I25])
 423+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.I25])
 424+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.I25])
 425+  .add(Symbol.NOT, [REDUCE, ReduceActions.I25])
 426+  .add(Symbol.MINUS, [REDUCE, ReduceActions.I25])
 427+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.I25])
 428+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.I25])
 429+  .add(Symbol.CARROT, [REDUCE, ReduceActions.I25])
 430+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.I25])
 431+  .add(Symbol.COMMA, [REDUCE, ReduceActions.I25])
 432   .build();
 433 table[13] = ObjectBuilder
 434   .add(Symbol.ERROR, 36)
 435-  .add(Symbol.EOF, [REDUCE, 26])
 436-  .add(Symbol.AMPERSAND, [REDUCE, 26])
 437-  .add(Symbol.EQUALS, [REDUCE, 26])
 438-  .add(Symbol.PLUS, [REDUCE, 26])
 439-  .add(Symbol.RIGHT_PAREN, [REDUCE, 26])
 440-  .add(Symbol.LESS_THAN, [REDUCE, 26])
 441-  .add(Symbol.GREATER_THAN, [REDUCE, 26])
 442-  .add(Symbol.NOT, [REDUCE, 26])
 443-  .add(Symbol.MINUS, [REDUCE, 26])
 444-  .add(Symbol.ASTERISK, [REDUCE, 26])
 445-  .add(Symbol.DIVIDE, [REDUCE, 26])
 446-  .add(Symbol.CARROT, [REDUCE, 26])
 447-  .add(Symbol.SEMI_COLON, [REDUCE, 26])
 448-  .add(Symbol.COMMA, [REDUCE, 26])
 449-  .add(Symbol.VARIABLE, [SHIFT, 37])
 450-  .add(Symbol.POUND, [SHIFT, 18])
 451+  .add(Symbol.EOF, [REDUCE, ReduceActions.I26])
 452+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.I26])
 453+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.I26])
 454+  .add(Symbol.PLUS, [REDUCE, ReduceActions.I26])
 455+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.I26])
 456+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.I26])
 457+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.I26])
 458+  .add(Symbol.NOT, [REDUCE, ReduceActions.I26])
 459+  .add(Symbol.MINUS, [REDUCE, ReduceActions.I26])
 460+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.I26])
 461+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.I26])
 462+  .add(Symbol.CARROT, [REDUCE, ReduceActions.I26])
 463+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.I26])
 464+  .add(Symbol.COMMA, [REDUCE, ReduceActions.I26])
 465+  .add(Symbol.VARIABLE, [SHIFT, ReduceActions.ENSURE_LAST_TWO_IN_ARRAY_AND_PUSH])
 466+  .add(Symbol.POUND, [SHIFT, ReduceActions.MULTIPLY])
 467   .build();
 468 table[14] = ObjectBuilder
 469-  .add(Symbol.EOF, [REDUCE, 36])
 470-  .add(Symbol.AMPERSAND, [REDUCE, 36])
 471-  .add(Symbol.EQUALS, [REDUCE, 36])
 472-  .add(Symbol.PLUS, [REDUCE, 36])
 473-  .add(Symbol.RIGHT_PAREN, [REDUCE, 36])
 474-  .add(Symbol.LESS_THAN, [REDUCE, 36])
 475-  .add(Symbol.GREATER_THAN, [REDUCE, 36])
 476-  .add(Symbol.NOT, [REDUCE, 36])
 477-  .add(Symbol.MINUS, [REDUCE, 36])
 478-  .add(Symbol.ASTERISK, [REDUCE, 36])
 479-  .add(Symbol.DIVIDE, [REDUCE, 36])
 480-  .add(Symbol.CARROT, [REDUCE, 36])
 481-  .add(Symbol.SEMI_COLON, [REDUCE, 36])
 482-  .add(Symbol.COMMA, [REDUCE, 36])
 483-  .add(33, [REDUCE, 36])
 484-  .add(Symbol.POUND, [SHIFT, 38])
 485+  .add(Symbol.EOF, [REDUCE, ReduceActions.WRAP_CURRENT_INDEX_TOKEN_AS_ARRAY])
 486+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.WRAP_CURRENT_INDEX_TOKEN_AS_ARRAY])
 487+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.WRAP_CURRENT_INDEX_TOKEN_AS_ARRAY])
 488+  .add(Symbol.PLUS, [REDUCE, ReduceActions.WRAP_CURRENT_INDEX_TOKEN_AS_ARRAY])
 489+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.WRAP_CURRENT_INDEX_TOKEN_AS_ARRAY])
 490+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.WRAP_CURRENT_INDEX_TOKEN_AS_ARRAY])
 491+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.WRAP_CURRENT_INDEX_TOKEN_AS_ARRAY])
 492+  .add(Symbol.NOT, [REDUCE, ReduceActions.WRAP_CURRENT_INDEX_TOKEN_AS_ARRAY])
 493+  .add(Symbol.MINUS, [REDUCE, ReduceActions.WRAP_CURRENT_INDEX_TOKEN_AS_ARRAY])
 494+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.WRAP_CURRENT_INDEX_TOKEN_AS_ARRAY])
 495+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.WRAP_CURRENT_INDEX_TOKEN_AS_ARRAY])
 496+  .add(Symbol.CARROT, [REDUCE, ReduceActions.WRAP_CURRENT_INDEX_TOKEN_AS_ARRAY])
 497+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.WRAP_CURRENT_INDEX_TOKEN_AS_ARRAY])
 498+  .add(Symbol.COMMA, [REDUCE, ReduceActions.WRAP_CURRENT_INDEX_TOKEN_AS_ARRAY])
 499+  .add(33, [REDUCE, ReduceActions.WRAP_CURRENT_INDEX_TOKEN_AS_ARRAY])
 500+  .add(Symbol.POUND, [SHIFT, ReduceActions.REFLEXIVE_REDUCE])
 501   .build();
 502 table[15] = ObjectBuilder
 503-  .add(Symbol.EOF, [REDUCE, 38])
 504-  .add(Symbol.AMPERSAND, [REDUCE, 38])
 505-  .add(Symbol.EQUALS, [REDUCE, 38])
 506-  .add(Symbol.PLUS, [REDUCE, 38])
 507-  .add(Symbol.RIGHT_PAREN, [REDUCE, 38])
 508-  .add(Symbol.LESS_THAN, [REDUCE, 38])
 509-  .add(Symbol.GREATER_THAN, [REDUCE, 38])
 510-  .add(Symbol.NOT, [REDUCE, 38])
 511-  .add(Symbol.MINUS, [REDUCE, 38])
 512-  .add(Symbol.ASTERISK, [REDUCE, 38])
 513-  .add(Symbol.DIVIDE, [REDUCE, 38])
 514-  .add(Symbol.CARROT, [REDUCE, 38])
 515-  .add(Symbol.SEMI_COLON, [REDUCE, 38])
 516-  .add(Symbol.COMMA, [REDUCE, 38])
 517-  .add(33, [SHIFT, 39])
 518-  .add(Symbol.PERCENT, [REDUCE, 38])
 519-  .add(38, [REDUCE, 38])
 520+  .add(Symbol.EOF, [REDUCE, ReduceActions.REFLEXIVE_REDUCE])
 521+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.REFLEXIVE_REDUCE])
 522+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.REFLEXIVE_REDUCE])
 523+  .add(Symbol.PLUS, [REDUCE, ReduceActions.REFLEXIVE_REDUCE])
 524+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.REFLEXIVE_REDUCE])
 525+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.REFLEXIVE_REDUCE])
 526+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.REFLEXIVE_REDUCE])
 527+  .add(Symbol.NOT, [REDUCE, ReduceActions.REFLEXIVE_REDUCE])
 528+  .add(Symbol.MINUS, [REDUCE, ReduceActions.REFLEXIVE_REDUCE])
 529+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.REFLEXIVE_REDUCE])
 530+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.REFLEXIVE_REDUCE])
 531+  .add(Symbol.CARROT, [REDUCE, ReduceActions.REFLEXIVE_REDUCE])
 532+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.REFLEXIVE_REDUCE])
 533+  .add(Symbol.COMMA, [REDUCE, ReduceActions.REFLEXIVE_REDUCE])
 534+  .add(33, [SHIFT, ReduceActions.REDUCE_FLOAT])
 535+  .add(Symbol.PERCENT, [REDUCE, ReduceActions.REFLEXIVE_REDUCE])
 536+  .add(38, [REDUCE, ReduceActions.REFLEXIVE_REDUCE])
 537   .build();
 538 table[16] = ObjectBuilder
 539-  .add(Symbol.EOF, [REDUCE, 28])
 540-  .add(Symbol.AMPERSAND, [REDUCE, 28])
 541-  .add(Symbol.EQUALS, [REDUCE, 28])
 542-  .add(Symbol.PLUS, [REDUCE, 28])
 543-  .add(Symbol.RIGHT_PAREN, [REDUCE, 28])
 544-  .add(Symbol.LESS_THAN, [REDUCE, 28])
 545-  .add(Symbol.GREATER_THAN, [REDUCE, 28])
 546-  .add(Symbol.NOT, [REDUCE, 28])
 547-  .add(Symbol.MINUS, [REDUCE, 28])
 548-  .add(Symbol.ASTERISK, [REDUCE, 28])
 549-  .add(Symbol.DIVIDE, [REDUCE, 28])
 550-  .add(Symbol.CARROT, [REDUCE, 28])
 551-  .add(Symbol.COLON, [SHIFT, 40])
 552-  .add(Symbol.SEMI_COLON, [REDUCE, 28])
 553-  .add(Symbol.COMMA, [REDUCE, 28])
 554+  .add(Symbol.EOF, [REDUCE, ReduceActions.FIXED_CELL_VAL])
 555+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.FIXED_CELL_VAL])
 556+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.FIXED_CELL_VAL])
 557+  .add(Symbol.PLUS, [REDUCE, ReduceActions.FIXED_CELL_VAL])
 558+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.FIXED_CELL_VAL])
 559+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.FIXED_CELL_VAL])
 560+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.FIXED_CELL_VAL])
 561+  .add(Symbol.NOT, [REDUCE, ReduceActions.FIXED_CELL_VAL])
 562+  .add(Symbol.MINUS, [REDUCE, ReduceActions.FIXED_CELL_VAL])
 563+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.FIXED_CELL_VAL])
 564+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.FIXED_CELL_VAL])
 565+  .add(Symbol.CARROT, [REDUCE, ReduceActions.FIXED_CELL_VAL])
 566+  .add(Symbol.COLON, [SHIFT, ReduceActions.REDUCE_PREV_AS_PERCENT])
 567+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.FIXED_CELL_VAL])
 568+  .add(Symbol.COMMA, [REDUCE, ReduceActions.FIXED_CELL_VAL])
 569   .build();
 570 table[17] = ObjectBuilder
 571-  .add(Symbol.EOF, [REDUCE, 30])
 572-  .add(Symbol.AMPERSAND, [REDUCE, 30])
 573-  .add(Symbol.EQUALS, [REDUCE, 30])
 574-  .add(Symbol.PLUS, [REDUCE, 30])
 575-  .add(Symbol.RIGHT_PAREN, [REDUCE, 30])
 576-  .add(Symbol.LESS_THAN, [REDUCE, 30])
 577-  .add(Symbol.GREATER_THAN, [REDUCE, 30])
 578-  .add(Symbol.NOT, [REDUCE, 30])
 579-  .add(Symbol.MINUS, [REDUCE, 30])
 580-  .add(Symbol.ASTERISK, [REDUCE, 30])
 581-  .add(Symbol.DIVIDE, [REDUCE, 30])
 582-  .add(Symbol.CARROT, [REDUCE, 30])
 583-  .add(Symbol.COLON, [SHIFT, 41])
 584-  .add(Symbol.SEMI_COLON, [REDUCE, 30])
 585-  .add(Symbol.COMMA, [REDUCE, 30])
 586+  .add(Symbol.EOF, [REDUCE, ReduceActions.CELL_VALUE])
 587+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.CELL_VALUE])
 588+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.CELL_VALUE])
 589+  .add(Symbol.PLUS, [REDUCE, ReduceActions.CELL_VALUE])
 590+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.CELL_VALUE])
 591+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.CELL_VALUE])
 592+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.CELL_VALUE])
 593+  .add(Symbol.NOT, [REDUCE, ReduceActions.CELL_VALUE])
 594+  .add(Symbol.MINUS, [REDUCE, ReduceActions.CELL_VALUE])
 595+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.CELL_VALUE])
 596+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.CELL_VALUE])
 597+  .add(Symbol.CARROT, [REDUCE, ReduceActions.CELL_VALUE])
 598+  .add(Symbol.COLON, [SHIFT, ReduceActions.REDUCE_LAST_THREE_A])
 599+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.CELL_VALUE])
 600+  .add(Symbol.COMMA, [REDUCE, ReduceActions.CELL_VALUE])
 601   .build();
 602 table[18] = ObjectBuilder
 603-  .add(Symbol.VARIABLE, [SHIFT, 42])
 604+  .add(Symbol.VARIABLE, [SHIFT, ReduceActions.REDUCE_LAST_THREE_B])
 605   .add(Symbol.EOF, [REDUCE, ReduceActions.AS_ERROR])
 606+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.AS_ERROR])
 607+  .add(Symbol.COMMA, [REDUCE, ReduceActions.AS_ERROR])
 608   .build();
 609 table[19] = ObjectBuilder
 610-  .add(Symbol.END, [ACCEPT, 1])
 611+  .add(Symbol.END, [ACCEPT, ReduceActions.RETURN_LAST])
 612   .build();
 613 table[20] = ObjectBuilder
 614   .add(Symbol.ERROR, 13)
 615   .add(Symbol.EXPRESSION, 43)
 616   .add(Symbol.VARIABLE_SEQUENCE, 3)
 617-  .add(Symbol.TIME_AMPM, [SHIFT, 4])
 618-  .add(Symbol.TIME_24, [SHIFT, 5])
 619+  .add(Symbol.TIME_AMPM, [SHIFT, ReduceActions.TIME_CALL])
 620+  .add(Symbol.TIME_24, [SHIFT, ReduceActions.AS_NUMBER])
 621   .add(Symbol.NUMBER, 6)
 622-  .add(Symbol.STRING, [SHIFT, 7])
 623-  .add(Symbol.PLUS, [SHIFT, 10])
 624-  .add(Symbol.LEFT_PAREN, [SHIFT, 8])
 625-  .add(Symbol.MINUS, [SHIFT, 9])
 626-  .add(Symbol.FUNCTION, [SHIFT, 11])
 627+  .add(Symbol.STRING, [SHIFT, ReduceActions.AMPERSAND])
 628+  .add(Symbol.PLUS, [SHIFT, ReduceActions.LAST_NUMBER])
 629+  .add(Symbol.LEFT_PAREN, [SHIFT, ReduceActions.EQUALS])
 630+  .add(Symbol.MINUS, [SHIFT, ReduceActions.PLUS])
 631+  .add(Symbol.FUNCTION, [SHIFT, ReduceActions.LTE])
 632   .add(Symbol.CELL, 12)
 633-  .add(Symbol.FIXEDCELL, [SHIFT, 16])
 634-  .add(Symbol.CELL_UPPER, [SHIFT, 17])
 635-  .add(Symbol.VARIABLE, [SHIFT, 14])
 636-  .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
 637-  .add(Symbol.POUND, [SHIFT, 18])
 638+  .add(Symbol.FIXEDCELL, [SHIFT, ReduceActions.LT])
 639+  .add(Symbol.CELL_UPPER, [SHIFT, ReduceActions.MINUS])
 640+  .add(Symbol.VARIABLE, [SHIFT, ReduceActions.NOT])
 641+  .add(Symbol.NUMBER_UPPER, [SHIFT, ReduceActions.GT])
 642+  .add(Symbol.POUND, [SHIFT, ReduceActions.MULTIPLY])
 643   .build();
 644 table[21] = ObjectBuilder
 645   .add(Symbol.ERROR, 13)
 646   .add(Symbol.EXPRESSION, 44)
 647   .add(Symbol.VARIABLE_SEQUENCE, 3)
 648-  .add(Symbol.TIME_AMPM, [SHIFT, 4])
 649-  .add(Symbol.TIME_24, [SHIFT, 5])
 650+  .add(Symbol.TIME_AMPM, [SHIFT, ReduceActions.TIME_CALL])
 651+  .add(Symbol.TIME_24, [SHIFT, ReduceActions.AS_NUMBER])
 652   .add(Symbol.NUMBER, 6)
 653-  .add(Symbol.STRING, [SHIFT, 7])
 654-  .add(Symbol.PLUS, [SHIFT, 10])
 655-  .add(Symbol.LEFT_PAREN, [SHIFT, 8])
 656-  .add(Symbol.MINUS, [SHIFT, 9])
 657-  .add(Symbol.FUNCTION, [SHIFT, 11])
 658+  .add(Symbol.STRING, [SHIFT, ReduceActions.AMPERSAND])
 659+  .add(Symbol.PLUS, [SHIFT, ReduceActions.LAST_NUMBER])
 660+  .add(Symbol.LEFT_PAREN, [SHIFT, ReduceActions.EQUALS])
 661+  .add(Symbol.MINUS, [SHIFT, ReduceActions.PLUS])
 662+  .add(Symbol.FUNCTION, [SHIFT, ReduceActions.LTE])
 663   .add(Symbol.CELL, 12)
 664-  .add(Symbol.FIXEDCELL, [SHIFT, 16])
 665-  .add(Symbol.CELL_UPPER, [SHIFT, 17])
 666-  .add(Symbol.VARIABLE, [SHIFT, 14])
 667-  .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
 668-  .add(Symbol.POUND, [SHIFT, 18])
 669+  .add(Symbol.FIXEDCELL, [SHIFT, ReduceActions.LT])
 670+  .add(Symbol.CELL_UPPER, [SHIFT, ReduceActions.MINUS])
 671+  .add(Symbol.VARIABLE, [SHIFT, ReduceActions.NOT])
 672+  .add(Symbol.NUMBER_UPPER, [SHIFT, ReduceActions.GT])
 673+  .add(Symbol.POUND, [SHIFT, ReduceActions.MULTIPLY])
 674   .build();
 675 table[22] = ObjectBuilder
 676   .add(Symbol.ERROR, 13)
 677   .add(Symbol.EXPRESSION, 45)
 678   .add(Symbol.VARIABLE_SEQUENCE, 3)
 679-  .add(Symbol.TIME_AMPM, [SHIFT, 4])
 680-  .add(Symbol.TIME_24, [SHIFT, 5])
 681+  .add(Symbol.TIME_AMPM, [SHIFT, ReduceActions.TIME_CALL])
 682+  .add(Symbol.TIME_24, [SHIFT, ReduceActions.AS_NUMBER])
 683   .add(Symbol.NUMBER, 6)
 684-  .add(Symbol.STRING, [SHIFT, 7])
 685-  .add(Symbol.PLUS, [SHIFT, 10])
 686-  .add(Symbol.LEFT_PAREN, [SHIFT, 8])
 687-  .add(Symbol.MINUS, [SHIFT, 9])
 688-  .add(Symbol.FUNCTION, [SHIFT, 11])
 689+  .add(Symbol.STRING, [SHIFT, ReduceActions.AMPERSAND])
 690+  .add(Symbol.PLUS, [SHIFT, ReduceActions.LAST_NUMBER])
 691+  .add(Symbol.LEFT_PAREN, [SHIFT, ReduceActions.EQUALS])
 692+  .add(Symbol.MINUS, [SHIFT, ReduceActions.PLUS])
 693+  .add(Symbol.FUNCTION, [SHIFT, ReduceActions.LTE])
 694   .add(Symbol.CELL, 12)
 695-  .add(Symbol.FIXEDCELL, [SHIFT, 16])
 696-  .add(Symbol.CELL_UPPER, [SHIFT, 17])
 697-  .add(Symbol.VARIABLE, [SHIFT, 14])
 698-  .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
 699-  .add(Symbol.POUND, [SHIFT, 18])
 700+  .add(Symbol.FIXEDCELL, [SHIFT, ReduceActions.LT])
 701+  .add(Symbol.CELL_UPPER, [SHIFT, ReduceActions.MINUS])
 702+  .add(Symbol.VARIABLE, [SHIFT, ReduceActions.NOT])
 703+  .add(Symbol.NUMBER_UPPER, [SHIFT, ReduceActions.GT])
 704+  .add(Symbol.POUND, [SHIFT, ReduceActions.MULTIPLY])
 705   .build();
 706 table[23] = ObjectBuilder
 707   .add(Symbol.ERROR, 13)
 708   .add(Symbol.EXPRESSION, 48)
 709   .add(Symbol.VARIABLE_SEQUENCE, 3)
 710-  .add(Symbol.TIME_AMPM, [SHIFT, 4])
 711-  .add(Symbol.TIME_24, [SHIFT, 5])
 712+  .add(Symbol.TIME_AMPM, [SHIFT, ReduceActions.TIME_CALL])
 713+  .add(Symbol.TIME_24, [SHIFT, ReduceActions.AS_NUMBER])
 714   .add(Symbol.NUMBER, 6)
 715-  .add(Symbol.STRING, [SHIFT, 7])
 716+  .add(Symbol.STRING, [SHIFT, ReduceActions.AMPERSAND])
 717   .add(Symbol.EQUALS, [SHIFT, 46])
 718-  .add(Symbol.PLUS, [SHIFT, 10])
 719-  .add(Symbol.LEFT_PAREN, [SHIFT, 8])
 720+  .add(Symbol.PLUS, [SHIFT, ReduceActions.LAST_NUMBER])
 721+  .add(Symbol.LEFT_PAREN, [SHIFT, ReduceActions.EQUALS])
 722   .add(Symbol.GREATER_THAN, [SHIFT, 47])
 723-  .add(Symbol.MINUS, [SHIFT, 9])
 724-  .add(Symbol.FUNCTION, [SHIFT, 11])
 725+  .add(Symbol.MINUS, [SHIFT, ReduceActions.PLUS])
 726+  .add(Symbol.FUNCTION, [SHIFT, ReduceActions.LTE])
 727   .add(Symbol.CELL, 12)
 728-  .add(Symbol.FIXEDCELL, [SHIFT, 16])
 729-  .add(Symbol.CELL_UPPER, [SHIFT, 17])
 730-  .add(Symbol.VARIABLE, [SHIFT, 14])
 731-  .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
 732-  .add(Symbol.POUND, [SHIFT, 18])
 733+  .add(Symbol.FIXEDCELL, [SHIFT, ReduceActions.LT])
 734+  .add(Symbol.CELL_UPPER, [SHIFT, ReduceActions.MINUS])
 735+  .add(Symbol.VARIABLE, [SHIFT, ReduceActions.NOT])
 736+  .add(Symbol.NUMBER_UPPER, [SHIFT, ReduceActions.GT])
 737+  .add(Symbol.POUND, [SHIFT, ReduceActions.MULTIPLY])
 738   .build();
 739 table[24] = ObjectBuilder
 740   .add(Symbol.ERROR, 13)
 741   .add(Symbol.EXPRESSION, 50)
 742   .add(Symbol.VARIABLE_SEQUENCE, 3)
 743-  .add(Symbol.TIME_AMPM, [SHIFT, 4])
 744-  .add(Symbol.TIME_24, [SHIFT, 5])
 745+  .add(Symbol.TIME_AMPM, [SHIFT, ReduceActions.TIME_CALL])
 746+  .add(Symbol.TIME_24, [SHIFT, ReduceActions.AS_NUMBER])
 747   .add(Symbol.NUMBER, 6)
 748-  .add(Symbol.STRING, [SHIFT, 7])
 749+  .add(Symbol.STRING, [SHIFT, ReduceActions.AMPERSAND])
 750   .add(Symbol.EQUALS, [SHIFT, 49])
 751-  .add(Symbol.PLUS, [SHIFT, 10])
 752-  .add(Symbol.LEFT_PAREN, [SHIFT, 8])
 753-  .add(Symbol.MINUS, [SHIFT, 9])
 754-  .add(Symbol.FUNCTION, [SHIFT, 11])
 755+  .add(Symbol.PLUS, [SHIFT, ReduceActions.LAST_NUMBER])
 756+  .add(Symbol.LEFT_PAREN, [SHIFT, ReduceActions.EQUALS])
 757+  .add(Symbol.MINUS, [SHIFT, ReduceActions.PLUS])
 758+  .add(Symbol.FUNCTION, [SHIFT, ReduceActions.LTE])
 759   .add(Symbol.CELL, 12)
 760-  .add(Symbol.FIXEDCELL, [SHIFT, 16])
 761-  .add(Symbol.CELL_UPPER, [SHIFT, 17])
 762-  .add(Symbol.VARIABLE, [SHIFT, 14])
 763-  .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
 764-  .add(Symbol.POUND, [SHIFT, 18])
 765+  .add(Symbol.FIXEDCELL, [SHIFT, ReduceActions.LT])
 766+  .add(Symbol.CELL_UPPER, [SHIFT, ReduceActions.MINUS])
 767+  .add(Symbol.VARIABLE, [SHIFT, ReduceActions.NOT])
 768+  .add(Symbol.NUMBER_UPPER, [SHIFT, ReduceActions.GT])
 769+  .add(Symbol.POUND, [SHIFT, ReduceActions.MULTIPLY])
 770   .build();
 771 table[25] = ObjectBuilder
 772   .add(Symbol.ERROR, 13)
 773   .add(Symbol.EXPRESSION, 51)
 774   .add(Symbol.VARIABLE_SEQUENCE, 3)
 775-  .add(Symbol.TIME_AMPM, [SHIFT, 4])
 776-  .add(Symbol.TIME_24, [SHIFT, 5])
 777+  .add(Symbol.TIME_AMPM, [SHIFT, ReduceActions.TIME_CALL])
 778+  .add(Symbol.TIME_24, [SHIFT, ReduceActions.AS_NUMBER])
 779   .add(Symbol.NUMBER, 6)
 780-  .add(Symbol.STRING, [SHIFT, 7])
 781-  .add(Symbol.PLUS, [SHIFT, 10])
 782-  .add(Symbol.LEFT_PAREN, [SHIFT, 8])
 783-  .add(Symbol.MINUS, [SHIFT, 9])
 784-  .add(Symbol.FUNCTION, [SHIFT, 11])
 785+  .add(Symbol.STRING, [SHIFT, ReduceActions.AMPERSAND])
 786+  .add(Symbol.PLUS, [SHIFT, ReduceActions.LAST_NUMBER])
 787+  .add(Symbol.LEFT_PAREN, [SHIFT, ReduceActions.EQUALS])
 788+  .add(Symbol.MINUS, [SHIFT, ReduceActions.PLUS])
 789+  .add(Symbol.FUNCTION, [SHIFT, ReduceActions.LTE])
 790   .add(Symbol.CELL, 12)
 791-  .add(Symbol.FIXEDCELL, [SHIFT, 16])
 792-  .add(Symbol.CELL_UPPER, [SHIFT, 17])
 793-  .add(Symbol.VARIABLE, [SHIFT, 14])
 794-  .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
 795-  .add(Symbol.POUND, [SHIFT, 18])
 796+  .add(Symbol.FIXEDCELL, [SHIFT, ReduceActions.LT])
 797+  .add(Symbol.CELL_UPPER, [SHIFT, ReduceActions.MINUS])
 798+  .add(Symbol.VARIABLE, [SHIFT, ReduceActions.NOT])
 799+  .add(Symbol.NUMBER_UPPER, [SHIFT, ReduceActions.GT])
 800+  .add(Symbol.POUND, [SHIFT, ReduceActions.MULTIPLY])
 801   .build();
 802 table[26] = ObjectBuilder
 803   .add(Symbol.ERROR, 13)
 804   .add(Symbol.EXPRESSION, 52)
 805   .add(Symbol.VARIABLE_SEQUENCE, 3)
 806-  .add(Symbol.TIME_AMPM, [SHIFT, 4])
 807-  .add(Symbol.TIME_24, [SHIFT, 5])
 808+  .add(Symbol.TIME_AMPM, [SHIFT, ReduceActions.TIME_CALL])
 809+  .add(Symbol.TIME_24, [SHIFT, ReduceActions.AS_NUMBER])
 810   .add(Symbol.NUMBER, 6)
 811-  .add(Symbol.STRING, [SHIFT, 7])
 812-  .add(Symbol.PLUS, [SHIFT, 10])
 813-  .add(Symbol.LEFT_PAREN, [SHIFT, 8])
 814-  .add(Symbol.MINUS, [SHIFT, 9])
 815-  .add(Symbol.FUNCTION, [SHIFT, 11])
 816+  .add(Symbol.STRING, [SHIFT, ReduceActions.AMPERSAND])
 817+  .add(Symbol.PLUS, [SHIFT, ReduceActions.LAST_NUMBER])
 818+  .add(Symbol.LEFT_PAREN, [SHIFT, ReduceActions.EQUALS])
 819+  .add(Symbol.MINUS, [SHIFT, ReduceActions.PLUS])
 820+  .add(Symbol.FUNCTION, [SHIFT, ReduceActions.LTE])
 821   .add(Symbol.CELL, 12)
 822-  .add(Symbol.FIXEDCELL, [SHIFT, 16])
 823-  .add(Symbol.CELL_UPPER, [SHIFT, 17])
 824-  .add(Symbol.VARIABLE, [SHIFT, 14])
 825-  .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
 826-  .add(Symbol.POUND, [SHIFT, 18])
 827+  .add(Symbol.FIXEDCELL, [SHIFT, ReduceActions.LT])
 828+  .add(Symbol.CELL_UPPER, [SHIFT, ReduceActions.MINUS])
 829+  .add(Symbol.VARIABLE, [SHIFT, ReduceActions.NOT])
 830+  .add(Symbol.NUMBER_UPPER, [SHIFT, ReduceActions.GT])
 831+  .add(Symbol.POUND, [SHIFT, ReduceActions.MULTIPLY])
 832   .build();
 833 table[27] = ObjectBuilder
 834   .add(Symbol.ERROR, 13)
 835   .add(Symbol.EXPRESSION, 53)
 836   .add(Symbol.VARIABLE_SEQUENCE, 3)
 837-  .add(Symbol.TIME_AMPM, [SHIFT, 4])
 838-  .add(Symbol.TIME_24, [SHIFT, 5])
 839+  .add(Symbol.TIME_AMPM, [SHIFT, ReduceActions.TIME_CALL])
 840+  .add(Symbol.TIME_24, [SHIFT, ReduceActions.AS_NUMBER])
 841   .add(Symbol.NUMBER, 6)
 842-  .add(Symbol.STRING, [SHIFT, 7])
 843-  .add(Symbol.PLUS, [SHIFT, 10])
 844-  .add(Symbol.LEFT_PAREN, [SHIFT, 8])
 845-  .add(Symbol.MINUS, [SHIFT, 9])
 846-  .add(Symbol.FUNCTION, [SHIFT, 11])
 847+  .add(Symbol.STRING, [SHIFT, ReduceActions.AMPERSAND])
 848+  .add(Symbol.PLUS, [SHIFT, ReduceActions.LAST_NUMBER])
 849+  .add(Symbol.LEFT_PAREN, [SHIFT, ReduceActions.EQUALS])
 850+  .add(Symbol.MINUS, [SHIFT, ReduceActions.PLUS])
 851+  .add(Symbol.FUNCTION, [SHIFT, ReduceActions.LTE])
 852   .add(Symbol.CELL, 12)
 853-  .add(Symbol.FIXEDCELL, [SHIFT, 16])
 854-  .add(Symbol.CELL_UPPER, [SHIFT, 17])
 855-  .add(Symbol.VARIABLE, [SHIFT, 14])
 856-  .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
 857-  .add(Symbol.POUND, [SHIFT, 18])
 858+  .add(Symbol.FIXEDCELL, [SHIFT, ReduceActions.LT])
 859+  .add(Symbol.CELL_UPPER, [SHIFT, ReduceActions.MINUS])
 860+  .add(Symbol.VARIABLE, [SHIFT, ReduceActions.NOT])
 861+  .add(Symbol.NUMBER_UPPER, [SHIFT, ReduceActions.GT])
 862+  .add(Symbol.POUND, [SHIFT, ReduceActions.MULTIPLY])
 863   .build();
 864 table[28] = ObjectBuilder
 865   .add(Symbol.ERROR, 13)
 866   .add(Symbol.EXPRESSION, 54)
 867   .add(Symbol.VARIABLE_SEQUENCE, 3)
 868-  .add(Symbol.TIME_AMPM, [SHIFT, 4])
 869-  .add(Symbol.TIME_24, [SHIFT, 5])
 870+  .add(Symbol.TIME_AMPM, [SHIFT, ReduceActions.TIME_CALL])
 871+  .add(Symbol.TIME_24, [SHIFT, ReduceActions.AS_NUMBER])
 872   .add(Symbol.NUMBER, 6)
 873-  .add(Symbol.STRING, [SHIFT, 7])
 874-  .add(Symbol.PLUS, [SHIFT, 10])
 875-  .add(Symbol.LEFT_PAREN, [SHIFT, 8])
 876-  .add(Symbol.MINUS, [SHIFT, 9])
 877-  .add(Symbol.FUNCTION, [SHIFT, 11])
 878+  .add(Symbol.STRING, [SHIFT, ReduceActions.AMPERSAND])
 879+  .add(Symbol.PLUS, [SHIFT, ReduceActions.LAST_NUMBER])
 880+  .add(Symbol.LEFT_PAREN, [SHIFT, ReduceActions.EQUALS])
 881+  .add(Symbol.MINUS, [SHIFT, ReduceActions.PLUS])
 882+  .add(Symbol.FUNCTION, [SHIFT, ReduceActions.LTE])
 883   .add(Symbol.CELL, 12)
 884-  .add(Symbol.FIXEDCELL, [SHIFT, 16])
 885-  .add(Symbol.CELL_UPPER, [SHIFT, 17])
 886-  .add(Symbol.VARIABLE, [SHIFT, 14])
 887-  .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
 888-  .add(Symbol.POUND, [SHIFT, 18])
 889+  .add(Symbol.FIXEDCELL, [SHIFT, ReduceActions.LT])
 890+  .add(Symbol.CELL_UPPER, [SHIFT, ReduceActions.MINUS])
 891+  .add(Symbol.VARIABLE, [SHIFT, ReduceActions.NOT])
 892+  .add(Symbol.NUMBER_UPPER, [SHIFT, ReduceActions.GT])
 893+  .add(Symbol.POUND, [SHIFT, ReduceActions.MULTIPLY])
 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.TIME_AMPM, [SHIFT, ReduceActions.TIME_CALL])
 902+  .add(Symbol.TIME_24, [SHIFT, ReduceActions.AS_NUMBER])
 903   .add(Symbol.NUMBER, 6)
 904-  .add(Symbol.STRING, [SHIFT, 7])
 905-  .add(Symbol.PLUS, [SHIFT, 10])
 906-  .add(Symbol.LEFT_PAREN, [SHIFT, 8])
 907-  .add(Symbol.MINUS, [SHIFT, 9])
 908-  .add(Symbol.FUNCTION, [SHIFT, 11])
 909+  .add(Symbol.STRING, [SHIFT, ReduceActions.AMPERSAND])
 910+  .add(Symbol.PLUS, [SHIFT, ReduceActions.LAST_NUMBER])
 911+  .add(Symbol.LEFT_PAREN, [SHIFT, ReduceActions.EQUALS])
 912+  .add(Symbol.MINUS, [SHIFT, ReduceActions.PLUS])
 913+  .add(Symbol.FUNCTION, [SHIFT, ReduceActions.LTE])
 914   .add(Symbol.CELL, 12)
 915-  .add(Symbol.FIXEDCELL, [SHIFT, 16])
 916-  .add(Symbol.CELL_UPPER, [SHIFT, 17])
 917-  .add(Symbol.VARIABLE, [SHIFT, 14])
 918-  .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
 919-  .add(Symbol.POUND, [SHIFT, 18])
 920+  .add(Symbol.FIXEDCELL, [SHIFT, ReduceActions.LT])
 921+  .add(Symbol.CELL_UPPER, [SHIFT, ReduceActions.MINUS])
 922+  .add(Symbol.VARIABLE, [SHIFT, ReduceActions.NOT])
 923+  .add(Symbol.NUMBER_UPPER, [SHIFT, ReduceActions.GT])
 924+  .add(Symbol.POUND, [SHIFT, ReduceActions.MULTIPLY])
 925   .build();
 926-table[30] = ObjectBuilder
 927+table[ReduceActions.CELL_VALUE] = ObjectBuilder
 928   .add(Symbol.VARIABLE, [SHIFT, 56])
 929   .build();
 930 table[31] = ObjectBuilder
 931-  .add(Symbol.EOF, [REDUCE, 40])
 932-  .add(Symbol.AMPERSAND, [REDUCE, 40])
 933-  .add(Symbol.EQUALS, [REDUCE, 40])
 934-  .add(Symbol.PLUS, [REDUCE, 40])
 935-  .add(Symbol.RIGHT_PAREN, [REDUCE, 40])
 936-  .add(Symbol.LESS_THAN, [REDUCE, 40])
 937-  .add(Symbol.GREATER_THAN, [REDUCE, 40])
 938-  .add(Symbol.NOT, [REDUCE, 40])
 939-  .add(Symbol.MINUS, [REDUCE, 40])
 940-  .add(Symbol.ASTERISK, [REDUCE, 40])
 941-  .add(Symbol.DIVIDE, [REDUCE, 40])
 942-  .add(Symbol.CARROT, [REDUCE, 40])
 943-  .add(Symbol.SEMI_COLON, [REDUCE, 40])
 944-  .add(Symbol.COMMA, [REDUCE, 40])
 945-  .add(Symbol.PERCENT, [REDUCE, 40])
 946-  .add(38, [REDUCE, 40])
 947+  .add(Symbol.EOF, [REDUCE, ReduceActions.REDUCE_PREV_AS_PERCENT])
 948+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.REDUCE_PREV_AS_PERCENT])
 949+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.REDUCE_PREV_AS_PERCENT])
 950+  .add(Symbol.PLUS, [REDUCE, ReduceActions.REDUCE_PREV_AS_PERCENT])
 951+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.REDUCE_PREV_AS_PERCENT])
 952+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.REDUCE_PREV_AS_PERCENT])
 953+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.REDUCE_PREV_AS_PERCENT])
 954+  .add(Symbol.NOT, [REDUCE, ReduceActions.REDUCE_PREV_AS_PERCENT])
 955+  .add(Symbol.MINUS, [REDUCE, ReduceActions.REDUCE_PREV_AS_PERCENT])
 956+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.REDUCE_PREV_AS_PERCENT])
 957+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.REDUCE_PREV_AS_PERCENT])
 958+  .add(Symbol.CARROT, [REDUCE, ReduceActions.REDUCE_PREV_AS_PERCENT])
 959+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.REDUCE_PREV_AS_PERCENT])
 960+  .add(Symbol.COMMA, [REDUCE, ReduceActions.REDUCE_PREV_AS_PERCENT])
 961+  .add(Symbol.PERCENT, [REDUCE, ReduceActions.REDUCE_PREV_AS_PERCENT])
 962+  .add(38, [REDUCE, ReduceActions.REDUCE_PREV_AS_PERCENT])
 963   .build();
 964 table[32] = ObjectBuilder
 965-  .add(Symbol.AMPERSAND, [SHIFT, 20])
 966-  .add(Symbol.EQUALS, [SHIFT, 21])
 967-  .add(Symbol.PLUS, [SHIFT, 22])
 968+  .add(Symbol.AMPERSAND, [SHIFT, ReduceActions.TO_POWER])
 969+  .add(Symbol.EQUALS, [SHIFT, ReduceActions.INVERT_NUM])
 970+  .add(Symbol.PLUS, [SHIFT, ReduceActions.TO_NUMBER_NAN_AS_ZERO])
 971   .add(Symbol.RIGHT_PAREN, [SHIFT, 57])
 972-  .add(Symbol.LESS_THAN, [SHIFT, 23])
 973-  .add(Symbol.GREATER_THAN, [SHIFT, 24])
 974-  .add(Symbol.NOT, [SHIFT, 25])
 975-  .add(Symbol.MINUS, [SHIFT, 26])
 976-  .add(Symbol.ASTERISK, [SHIFT, 27])
 977-  .add(Symbol.DIVIDE, [SHIFT, 28])
 978-  .add(Symbol.CARROT, [SHIFT, 29])
 979+  .add(Symbol.LESS_THAN, [SHIFT, ReduceActions.CALL_FUNCTION_LAST_BLANK])
 980+  .add(Symbol.GREATER_THAN, [SHIFT, ReduceActions.CALL_FUNCTION_LAST_TWO_IN_STACK])
 981+  .add(Symbol.NOT, [SHIFT, ReduceActions.I25])
 982+  .add(Symbol.MINUS, [SHIFT, ReduceActions.I26])
 983+  .add(Symbol.ASTERISK, [SHIFT, ReduceActions.I27])
 984+  .add(Symbol.DIVIDE, [SHIFT, ReduceActions.FIXED_CELL_VAL])
 985+  .add(Symbol.CARROT, [SHIFT, ReduceActions.FIXED_CELL_RANGE_VAL])
 986   .build();
 987 table[33] = ObjectBuilder
 988-  .add(Symbol.EOF, [REDUCE, 21])
 989-  .add(Symbol.AMPERSAND, [SHIFT, 20])
 990-  .add(Symbol.EQUALS, [REDUCE, 21])
 991-  .add(Symbol.PLUS, [REDUCE, 21])
 992-  .add(Symbol.RIGHT_PAREN, [REDUCE, 21])
 993-  .add(Symbol.LESS_THAN, [REDUCE, 21])
 994-  .add(Symbol.GREATER_THAN, [REDUCE, 21])
 995-  .add(Symbol.NOT, [REDUCE, 21])
 996-  .add(Symbol.MINUS, [REDUCE, 21])
 997-  .add(Symbol.ASTERISK, [SHIFT, 27])
 998-  .add(Symbol.DIVIDE, [SHIFT, 28])
 999-  .add(Symbol.CARROT, [SHIFT, 29])
1000-  .add(Symbol.SEMI_COLON, [REDUCE, 21])
1001-  .add(Symbol.COMMA, [REDUCE, 21])
1002+  .add(Symbol.EOF, [REDUCE, ReduceActions.INVERT_NUM])
1003+  .add(Symbol.AMPERSAND, [SHIFT, ReduceActions.TO_POWER])
1004+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.INVERT_NUM])
1005+  .add(Symbol.PLUS, [REDUCE, ReduceActions.INVERT_NUM])
1006+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.INVERT_NUM])
1007+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.INVERT_NUM])
1008+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.INVERT_NUM])
1009+  .add(Symbol.NOT, [REDUCE, ReduceActions.INVERT_NUM])
1010+  .add(Symbol.MINUS, [REDUCE, ReduceActions.INVERT_NUM])
1011+  .add(Symbol.ASTERISK, [SHIFT, ReduceActions.I27])
1012+  .add(Symbol.DIVIDE, [SHIFT, ReduceActions.FIXED_CELL_VAL])
1013+  .add(Symbol.CARROT, [SHIFT, ReduceActions.FIXED_CELL_RANGE_VAL])
1014+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.INVERT_NUM])
1015+  .add(Symbol.COMMA, [REDUCE, ReduceActions.INVERT_NUM])
1016   .build();
1017 table[34] = ObjectBuilder
1018-  .add(Symbol.EOF, [REDUCE, 22])
1019-  .add(Symbol.AMPERSAND, [SHIFT, 20])
1020-  .add(Symbol.EQUALS, [REDUCE, 22])
1021-  .add(Symbol.PLUS, [REDUCE, 22])
1022-  .add(Symbol.RIGHT_PAREN, [REDUCE, 22])
1023-  .add(Symbol.LESS_THAN, [REDUCE, 22])
1024-  .add(Symbol.GREATER_THAN, [REDUCE, 22])
1025-  .add(Symbol.NOT, [REDUCE, 22])
1026-  .add(Symbol.MINUS, [REDUCE, 22])
1027-  .add(Symbol.ASTERISK, [SHIFT, 27])
1028-  .add(Symbol.DIVIDE, [SHIFT, 28])
1029-  .add(Symbol.CARROT, [SHIFT, 29])
1030-  .add(Symbol.SEMI_COLON, [REDUCE, 22])
1031-  .add(Symbol.COMMA, [REDUCE, 22])
1032+  .add(Symbol.EOF, [REDUCE, ReduceActions.TO_NUMBER_NAN_AS_ZERO])
1033+  .add(Symbol.AMPERSAND, [SHIFT, ReduceActions.TO_POWER])
1034+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.TO_NUMBER_NAN_AS_ZERO])
1035+  .add(Symbol.PLUS, [REDUCE, ReduceActions.TO_NUMBER_NAN_AS_ZERO])
1036+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.TO_NUMBER_NAN_AS_ZERO])
1037+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.TO_NUMBER_NAN_AS_ZERO])
1038+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.TO_NUMBER_NAN_AS_ZERO])
1039+  .add(Symbol.NOT, [REDUCE, ReduceActions.TO_NUMBER_NAN_AS_ZERO])
1040+  .add(Symbol.MINUS, [REDUCE, ReduceActions.TO_NUMBER_NAN_AS_ZERO])
1041+  .add(Symbol.ASTERISK, [SHIFT, ReduceActions.I27])
1042+  .add(Symbol.DIVIDE, [SHIFT, ReduceActions.FIXED_CELL_VAL])
1043+  .add(Symbol.CARROT, [SHIFT, ReduceActions.FIXED_CELL_RANGE_VAL])
1044+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.TO_NUMBER_NAN_AS_ZERO])
1045+  .add(Symbol.COMMA, [REDUCE, ReduceActions.TO_NUMBER_NAN_AS_ZERO])
1046   .build();
1047 table[35] = ObjectBuilder
1048   .add(Symbol.ERROR, 13)
1049   .add(Symbol.EXPRESSION, 60)
1050   .add(Symbol.VARIABLE_SEQUENCE, 3)
1051-  .add(Symbol.TIME_AMPM, [SHIFT, 4])
1052-  .add(Symbol.TIME_24, [SHIFT, 5])
1053+  .add(Symbol.TIME_AMPM, [SHIFT, ReduceActions.TIME_CALL])
1054+  .add(Symbol.TIME_24, [SHIFT, ReduceActions.AS_NUMBER])
1055   .add(Symbol.NUMBER, 6)
1056-  .add(Symbol.STRING, [SHIFT, 7])
1057-  .add(Symbol.PLUS, [SHIFT, 10])
1058-  .add(Symbol.LEFT_PAREN, [SHIFT, 8])
1059+  .add(Symbol.STRING, [SHIFT, ReduceActions.AMPERSAND])
1060+  .add(Symbol.PLUS, [SHIFT, ReduceActions.LAST_NUMBER])
1061+  .add(Symbol.LEFT_PAREN, [SHIFT, ReduceActions.EQUALS])
1062   .add(Symbol.RIGHT_PAREN, [SHIFT, 58])
1063-  .add(Symbol.MINUS, [SHIFT, 9])
1064-  .add(Symbol.FUNCTION, [SHIFT, 11])
1065+  .add(Symbol.MINUS, [SHIFT, ReduceActions.PLUS])
1066+  .add(Symbol.FUNCTION, [SHIFT, ReduceActions.LTE])
1067   .add(Symbol.EXP_SEQ, 59)
1068   .add(Symbol.CELL, 12)
1069-  .add(Symbol.FIXEDCELL, [SHIFT, 16])
1070-  .add(Symbol.CELL_UPPER, [SHIFT, 17])
1071+  .add(Symbol.FIXEDCELL, [SHIFT, ReduceActions.LT])
1072+  .add(Symbol.CELL_UPPER, [SHIFT, ReduceActions.MINUS])
1073   .add(Symbol.ARRAY, [SHIFT, 61])
1074-  .add(Symbol.VARIABLE, [SHIFT, 14])
1075-  .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
1076-  .add(Symbol.POUND, [SHIFT, 18])
1077+  .add(Symbol.VARIABLE, [SHIFT, ReduceActions.NOT])
1078+  .add(Symbol.NUMBER_UPPER, [SHIFT, ReduceActions.GT])
1079+  .add(Symbol.POUND, [SHIFT, ReduceActions.MULTIPLY])
1080   .build();
1081 table[36] = ObjectBuilder
1082-  .add(Symbol.EOF, [REDUCE, 27])
1083-  .add(Symbol.AMPERSAND, [REDUCE, 27])
1084-  .add(Symbol.EQUALS, [REDUCE, 27])
1085-  .add(Symbol.PLUS, [REDUCE, 27])
1086-  .add(Symbol.RIGHT_PAREN, [REDUCE, 27])
1087-  .add(Symbol.LESS_THAN, [REDUCE, 27])
1088-  .add(Symbol.GREATER_THAN, [REDUCE, 27])
1089-  .add(Symbol.NOT, [REDUCE, 27])
1090-  .add(Symbol.MINUS, [REDUCE, 27])
1091-  .add(Symbol.ASTERISK, [REDUCE, 27])
1092-  .add(Symbol.DIVIDE, [REDUCE, 27])
1093-  .add(Symbol.CARROT, [REDUCE, 27])
1094-  .add(Symbol.SEMI_COLON, [REDUCE, 27])
1095-  .add(Symbol.COMMA, [REDUCE, 27])
1096+  .add(Symbol.EOF, [REDUCE, ReduceActions.I27])
1097+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.I27])
1098+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.I27])
1099+  .add(Symbol.PLUS, [REDUCE, ReduceActions.I27])
1100+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.I27])
1101+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.I27])
1102+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.I27])
1103+  .add(Symbol.NOT, [REDUCE, ReduceActions.I27])
1104+  .add(Symbol.MINUS, [REDUCE, ReduceActions.I27])
1105+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.I27])
1106+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.I27])
1107+  .add(Symbol.CARROT, [REDUCE, ReduceActions.I27])
1108+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.I27])
1109+  .add(Symbol.COMMA, [REDUCE, ReduceActions.I27])
1110   .build();
1111 table[37] = ObjectBuilder
1112-  .add(Symbol.POUND, [REDUCE, 43])
1113+  .add(Symbol.POUND, [REDUCE, ReduceActions.AS_ERROR])
1114   .build();
1115 table[38] = ObjectBuilder
1116   .add(Symbol.VARIABLE, [SHIFT, 62])
1117@@ -979,270 +981,270 @@ table[42] = ObjectBuilder
1118   .add(Symbol.EXCLAMATION_POINT, [SHIFT, 66])
1119   .build();
1120 table[43] = ObjectBuilder
1121-  .add(Symbol.EOF, [REDUCE, 7])
1122-  .add(Symbol.AMPERSAND, [REDUCE, 7])
1123-  .add(Symbol.EQUALS, [REDUCE, 7])
1124-  .add(Symbol.PLUS, [REDUCE, 7])
1125-  .add(Symbol.RIGHT_PAREN, [REDUCE, 7])
1126-  .add(Symbol.LESS_THAN, [REDUCE, 7])
1127-  .add(Symbol.GREATER_THAN, [REDUCE, 7])
1128-  .add(Symbol.NOT, [REDUCE, 7])
1129-  .add(Symbol.MINUS, [REDUCE, 7])
1130-  .add(Symbol.ASTERISK, [REDUCE, 7])
1131-  .add(Symbol.DIVIDE, [REDUCE, 7])
1132-  .add(Symbol.CARROT, [REDUCE, 7])
1133-  .add(Symbol.SEMI_COLON, [REDUCE, 7])
1134-  .add(Symbol.COMMA, [REDUCE, 7])
1135+  .add(Symbol.EOF, [REDUCE, ReduceActions.AMPERSAND])
1136+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.AMPERSAND])
1137+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.AMPERSAND])
1138+  .add(Symbol.PLUS, [REDUCE, ReduceActions.AMPERSAND])
1139+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.AMPERSAND])
1140+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.AMPERSAND])
1141+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.AMPERSAND])
1142+  .add(Symbol.NOT, [REDUCE, ReduceActions.AMPERSAND])
1143+  .add(Symbol.MINUS, [REDUCE, ReduceActions.AMPERSAND])
1144+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.AMPERSAND])
1145+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.AMPERSAND])
1146+  .add(Symbol.CARROT, [REDUCE, ReduceActions.AMPERSAND])
1147+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.AMPERSAND])
1148+  .add(Symbol.COMMA, [REDUCE, ReduceActions.AMPERSAND])
1149   .build();
1150 table[44] = ObjectBuilder
1151-  .add(Symbol.EOF, [REDUCE, 8])
1152-  .add(Symbol.AMPERSAND, [SHIFT, 20])
1153-  .add(Symbol.EQUALS, [REDUCE, 8])
1154-  .add(Symbol.PLUS, [SHIFT, 22])
1155-  .add(Symbol.RIGHT_PAREN, [REDUCE, 8])
1156-  .add(Symbol.LESS_THAN, [SHIFT, 23])
1157-  .add(Symbol.GREATER_THAN, [SHIFT, 24])
1158-  .add(Symbol.NOT, [SHIFT, 25])
1159-  .add(Symbol.MINUS, [SHIFT, 26])
1160-  .add(Symbol.ASTERISK, [SHIFT, 27])
1161-  .add(Symbol.DIVIDE, [SHIFT, 28])
1162-  .add(Symbol.CARROT, [SHIFT, 29])
1163-  .add(Symbol.SEMI_COLON, [REDUCE, 8])
1164-  .add(Symbol.COMMA, [REDUCE, 8])
1165+  .add(Symbol.EOF, [REDUCE, ReduceActions.EQUALS])
1166+  .add(Symbol.AMPERSAND, [SHIFT, ReduceActions.TO_POWER])
1167+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.EQUALS])
1168+  .add(Symbol.PLUS, [SHIFT, ReduceActions.TO_NUMBER_NAN_AS_ZERO])
1169+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.EQUALS])
1170+  .add(Symbol.LESS_THAN, [SHIFT, ReduceActions.CALL_FUNCTION_LAST_BLANK])
1171+  .add(Symbol.GREATER_THAN, [SHIFT, ReduceActions.CALL_FUNCTION_LAST_TWO_IN_STACK])
1172+  .add(Symbol.NOT, [SHIFT, ReduceActions.I25])
1173+  .add(Symbol.MINUS, [SHIFT, ReduceActions.I26])
1174+  .add(Symbol.ASTERISK, [SHIFT, ReduceActions.I27])
1175+  .add(Symbol.DIVIDE, [SHIFT, ReduceActions.FIXED_CELL_VAL])
1176+  .add(Symbol.CARROT, [SHIFT, ReduceActions.FIXED_CELL_RANGE_VAL])
1177+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.EQUALS])
1178+  .add(Symbol.COMMA, [REDUCE, ReduceActions.EQUALS])
1179   .build();
1180 table[45] = ObjectBuilder
1181-  .add(Symbol.EOF, [REDUCE, 9])
1182-  .add(Symbol.AMPERSAND, [SHIFT, 20])
1183-  .add(Symbol.EQUALS, [REDUCE, 9])
1184-  .add(Symbol.PLUS, [REDUCE, 9])
1185-  .add(Symbol.RIGHT_PAREN, [REDUCE, 9])
1186-  .add(Symbol.LESS_THAN, [REDUCE, 9])
1187-  .add(Symbol.GREATER_THAN, [REDUCE, 9])
1188-  .add(Symbol.NOT, [REDUCE, 9])
1189-  .add(Symbol.MINUS, [REDUCE, 9])
1190-  .add(Symbol.ASTERISK, [SHIFT, 27])
1191-  .add(Symbol.DIVIDE, [SHIFT, 28])
1192-  .add(Symbol.CARROT, [SHIFT, 29])
1193-  .add(Symbol.SEMI_COLON, [REDUCE, 9])
1194-  .add(Symbol.COMMA, [REDUCE, 9])
1195+  .add(Symbol.EOF, [REDUCE, ReduceActions.PLUS])
1196+  .add(Symbol.AMPERSAND, [SHIFT, ReduceActions.TO_POWER])
1197+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.PLUS])
1198+  .add(Symbol.PLUS, [REDUCE, ReduceActions.PLUS])
1199+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.PLUS])
1200+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.PLUS])
1201+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.PLUS])
1202+  .add(Symbol.NOT, [REDUCE, ReduceActions.PLUS])
1203+  .add(Symbol.MINUS, [REDUCE, ReduceActions.PLUS])
1204+  .add(Symbol.ASTERISK, [SHIFT, ReduceActions.I27])
1205+  .add(Symbol.DIVIDE, [SHIFT, ReduceActions.FIXED_CELL_VAL])
1206+  .add(Symbol.CARROT, [SHIFT, ReduceActions.FIXED_CELL_RANGE_VAL])
1207+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.PLUS])
1208+  .add(Symbol.COMMA, [REDUCE, ReduceActions.PLUS])
1209   .build();
1210 table[46] = ObjectBuilder
1211   .add(Symbol.ERROR, 13)
1212   .add(Symbol.EXPRESSION, 67)
1213   .add(Symbol.VARIABLE_SEQUENCE, 3)
1214-  .add(Symbol.TIME_AMPM, [SHIFT, 4])
1215-  .add(Symbol.TIME_24, [SHIFT, 5])
1216+  .add(Symbol.TIME_AMPM, [SHIFT, ReduceActions.TIME_CALL])
1217+  .add(Symbol.TIME_24, [SHIFT, ReduceActions.AS_NUMBER])
1218   .add(Symbol.NUMBER, 6)
1219-  .add(Symbol.STRING, [SHIFT, 7])
1220-  .add(Symbol.PLUS, [SHIFT, 10])
1221-  .add(Symbol.LEFT_PAREN, [SHIFT, 8])
1222-  .add(Symbol.MINUS, [SHIFT, 9])
1223-  .add(Symbol.FUNCTION, [SHIFT, 11])
1224+  .add(Symbol.STRING, [SHIFT, ReduceActions.AMPERSAND])
1225+  .add(Symbol.PLUS, [SHIFT, ReduceActions.LAST_NUMBER])
1226+  .add(Symbol.LEFT_PAREN, [SHIFT, ReduceActions.EQUALS])
1227+  .add(Symbol.MINUS, [SHIFT, ReduceActions.PLUS])
1228+  .add(Symbol.FUNCTION, [SHIFT, ReduceActions.LTE])
1229   .add(Symbol.CELL, 12)
1230-  .add(Symbol.FIXEDCELL, [SHIFT, 16])
1231-  .add(Symbol.CELL_UPPER, [SHIFT, 17])
1232-  .add(Symbol.VARIABLE, [SHIFT, 14])
1233-  .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
1234-  .add(Symbol.POUND, [SHIFT, 18])
1235+  .add(Symbol.FIXEDCELL, [SHIFT, ReduceActions.LT])
1236+  .add(Symbol.CELL_UPPER, [SHIFT, ReduceActions.MINUS])
1237+  .add(Symbol.VARIABLE, [SHIFT, ReduceActions.NOT])
1238+  .add(Symbol.NUMBER_UPPER, [SHIFT, ReduceActions.GT])
1239+  .add(Symbol.POUND, [SHIFT, ReduceActions.MULTIPLY])
1240   .build();
1241 table[47] = ObjectBuilder
1242   .add(Symbol.ERROR, 13)
1243   .add(Symbol.EXPRESSION, 68)
1244   .add(Symbol.VARIABLE_SEQUENCE, 3)
1245-  .add(Symbol.TIME_AMPM, [SHIFT, 4])
1246-  .add(Symbol.TIME_24, [SHIFT, 5])
1247+  .add(Symbol.TIME_AMPM, [SHIFT, ReduceActions.TIME_CALL])
1248+  .add(Symbol.TIME_24, [SHIFT, ReduceActions.AS_NUMBER])
1249   .add(Symbol.NUMBER, 6)
1250-  .add(Symbol.STRING, [SHIFT, 7])
1251-  .add(Symbol.PLUS, [SHIFT, 10])
1252-  .add(Symbol.LEFT_PAREN, [SHIFT, 8])
1253-  .add(Symbol.MINUS, [SHIFT, 9])
1254-  .add(Symbol.FUNCTION, [SHIFT, 11])
1255+  .add(Symbol.STRING, [SHIFT, ReduceActions.AMPERSAND])
1256+  .add(Symbol.PLUS, [SHIFT, ReduceActions.LAST_NUMBER])
1257+  .add(Symbol.LEFT_PAREN, [SHIFT, ReduceActions.EQUALS])
1258+  .add(Symbol.MINUS, [SHIFT, ReduceActions.PLUS])
1259+  .add(Symbol.FUNCTION, [SHIFT, ReduceActions.LTE])
1260   .add(Symbol.CELL, 12)
1261-  .add(Symbol.FIXEDCELL, [SHIFT, 16])
1262-  .add(Symbol.CELL_UPPER, [SHIFT, 17])
1263-  .add(Symbol.VARIABLE, [SHIFT, 14])
1264-  .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
1265-  .add(Symbol.POUND, [SHIFT, 18])
1266+  .add(Symbol.FIXEDCELL, [SHIFT, ReduceActions.LT])
1267+  .add(Symbol.CELL_UPPER, [SHIFT, ReduceActions.MINUS])
1268+  .add(Symbol.VARIABLE, [SHIFT, ReduceActions.NOT])
1269+  .add(Symbol.NUMBER_UPPER, [SHIFT, ReduceActions.GT])
1270+  .add(Symbol.POUND, [SHIFT, ReduceActions.MULTIPLY])
1271   .build();
1272 table[48] = ObjectBuilder
1273-  .add(Symbol.EOF, [REDUCE, 16])
1274-  .add(Symbol.AMPERSAND, [SHIFT, 20])
1275-  .add(Symbol.EQUALS, [REDUCE, 16])
1276-  .add(Symbol.PLUS, [SHIFT, 22])
1277-  .add(Symbol.RIGHT_PAREN, [REDUCE, 16])
1278-  .add(Symbol.LESS_THAN, [REDUCE, 16])
1279-  .add(Symbol.GREATER_THAN, [REDUCE, 16])
1280-  .add(Symbol.NOT, [REDUCE, 16])
1281-  .add(Symbol.MINUS, [SHIFT, 26])
1282-  .add(Symbol.ASTERISK, [SHIFT, 27])
1283-  .add(Symbol.DIVIDE, [SHIFT, 28])
1284-  .add(Symbol.CARROT, [SHIFT, 29])
1285-  .add(Symbol.SEMI_COLON, [REDUCE, 16])
1286-  .add(Symbol.COMMA, [REDUCE, 16])
1287+  .add(Symbol.EOF, [REDUCE, ReduceActions.LT])
1288+  .add(Symbol.AMPERSAND, [SHIFT, ReduceActions.TO_POWER])
1289+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.LT])
1290+  .add(Symbol.PLUS, [SHIFT, ReduceActions.TO_NUMBER_NAN_AS_ZERO])
1291+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.LT])
1292+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.LT])
1293+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.LT])
1294+  .add(Symbol.NOT, [REDUCE, ReduceActions.LT])
1295+  .add(Symbol.MINUS, [SHIFT, ReduceActions.I26])
1296+  .add(Symbol.ASTERISK, [SHIFT, ReduceActions.I27])
1297+  .add(Symbol.DIVIDE, [SHIFT, ReduceActions.FIXED_CELL_VAL])
1298+  .add(Symbol.CARROT, [SHIFT, ReduceActions.FIXED_CELL_RANGE_VAL])
1299+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.LT])
1300+  .add(Symbol.COMMA, [REDUCE, ReduceActions.LT])
1301   .build();
1302 table[49] = ObjectBuilder
1303   .add(Symbol.ERROR, 13)
1304   .add(Symbol.EXPRESSION, 69)
1305   .add(Symbol.VARIABLE_SEQUENCE, 3)
1306-  .add(Symbol.TIME_AMPM, [SHIFT, 4])
1307-  .add(Symbol.TIME_24, [SHIFT, 5])
1308+  .add(Symbol.TIME_AMPM, [SHIFT, ReduceActions.TIME_CALL])
1309+  .add(Symbol.TIME_24, [SHIFT, ReduceActions.AS_NUMBER])
1310   .add(Symbol.NUMBER, 6)
1311-  .add(Symbol.STRING, [SHIFT, 7])
1312-  .add(Symbol.PLUS, [SHIFT, 10])
1313-  .add(Symbol.LEFT_PAREN, [SHIFT, 8])
1314-  .add(Symbol.MINUS, [SHIFT, 9])
1315-  .add(Symbol.FUNCTION, [SHIFT, 11])
1316+  .add(Symbol.STRING, [SHIFT, ReduceActions.AMPERSAND])
1317+  .add(Symbol.PLUS, [SHIFT, ReduceActions.LAST_NUMBER])
1318+  .add(Symbol.LEFT_PAREN, [SHIFT, ReduceActions.EQUALS])
1319+  .add(Symbol.MINUS, [SHIFT, ReduceActions.PLUS])
1320+  .add(Symbol.FUNCTION, [SHIFT, ReduceActions.LTE])
1321   .add(Symbol.CELL, 12)
1322-  .add(Symbol.FIXEDCELL, [SHIFT, 16])
1323-  .add(Symbol.CELL_UPPER, [SHIFT, 17])
1324-  .add(Symbol.VARIABLE, [SHIFT, 14])
1325-  .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
1326-  .add(Symbol.POUND, [SHIFT, 18])
1327+  .add(Symbol.FIXEDCELL, [SHIFT, ReduceActions.LT])
1328+  .add(Symbol.CELL_UPPER, [SHIFT, ReduceActions.MINUS])
1329+  .add(Symbol.VARIABLE, [SHIFT, ReduceActions.NOT])
1330+  .add(Symbol.NUMBER_UPPER, [SHIFT, ReduceActions.GT])
1331+  .add(Symbol.POUND, [SHIFT, ReduceActions.MULTIPLY])
1332   .build();
1333 table[50] = ObjectBuilder
1334-  .add(Symbol.EOF, [REDUCE, 15])
1335-  .add(Symbol.AMPERSAND, [SHIFT, 20])
1336-  .add(Symbol.EQUALS, [REDUCE, 15])
1337-  .add(Symbol.PLUS, [SHIFT, 22])
1338-  .add(Symbol.RIGHT_PAREN, [REDUCE, 15])
1339-  .add(Symbol.LESS_THAN, [REDUCE, 15])
1340-  .add(Symbol.GREATER_THAN, [REDUCE, 15])
1341-  .add(Symbol.NOT, [REDUCE, 15])
1342-  .add(Symbol.MINUS, [SHIFT, 26])
1343-  .add(Symbol.ASTERISK, [SHIFT, 27])
1344-  .add(Symbol.DIVIDE, [SHIFT, 28])
1345-  .add(Symbol.CARROT, [SHIFT, 29])
1346-  .add(Symbol.SEMI_COLON, [REDUCE, 15])
1347-  .add(Symbol.COMMA, [REDUCE, 15])
1348+  .add(Symbol.EOF, [REDUCE, ReduceActions.GT])
1349+  .add(Symbol.AMPERSAND, [SHIFT, ReduceActions.TO_POWER])
1350+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.GT])
1351+  .add(Symbol.PLUS, [SHIFT, ReduceActions.TO_NUMBER_NAN_AS_ZERO])
1352+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.GT])
1353+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.GT])
1354+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.GT])
1355+  .add(Symbol.NOT, [REDUCE, ReduceActions.GT])
1356+  .add(Symbol.MINUS, [SHIFT, ReduceActions.I26])
1357+  .add(Symbol.ASTERISK, [SHIFT, ReduceActions.I27])
1358+  .add(Symbol.DIVIDE, [SHIFT, ReduceActions.FIXED_CELL_VAL])
1359+  .add(Symbol.CARROT, [SHIFT, ReduceActions.FIXED_CELL_RANGE_VAL])
1360+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.GT])
1361+  .add(Symbol.COMMA, [REDUCE, ReduceActions.GT])
1362   .build();
1363 table[51] = ObjectBuilder
1364-  .add(Symbol.EOF, [REDUCE, 14])
1365-  .add(Symbol.AMPERSAND, [SHIFT, 20])
1366-  .add(Symbol.EQUALS, [REDUCE, 14])
1367-  .add(Symbol.PLUS, [SHIFT, 22])
1368-  .add(Symbol.RIGHT_PAREN, [REDUCE, 14])
1369-  .add(Symbol.LESS_THAN, [SHIFT, 23])
1370-  .add(Symbol.GREATER_THAN, [SHIFT, 24])
1371-  .add(Symbol.NOT, [REDUCE, 14])
1372-  .add(Symbol.MINUS, [SHIFT, 26])
1373-  .add(Symbol.ASTERISK, [SHIFT, 27])
1374-  .add(Symbol.DIVIDE, [SHIFT, 28])
1375-  .add(Symbol.CARROT, [SHIFT, 29])
1376-  .add(Symbol.SEMI_COLON, [REDUCE, 14])
1377-  .add(Symbol.COMMA, [REDUCE, 14])
1378+  .add(Symbol.EOF, [REDUCE, ReduceActions.NOT])
1379+  .add(Symbol.AMPERSAND, [SHIFT, ReduceActions.TO_POWER])
1380+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.NOT])
1381+  .add(Symbol.PLUS, [SHIFT, ReduceActions.TO_NUMBER_NAN_AS_ZERO])
1382+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.NOT])
1383+  .add(Symbol.LESS_THAN, [SHIFT, ReduceActions.CALL_FUNCTION_LAST_BLANK])
1384+  .add(Symbol.GREATER_THAN, [SHIFT, ReduceActions.CALL_FUNCTION_LAST_TWO_IN_STACK])
1385+  .add(Symbol.NOT, [REDUCE, ReduceActions.NOT])
1386+  .add(Symbol.MINUS, [SHIFT, ReduceActions.I26])
1387+  .add(Symbol.ASTERISK, [SHIFT, ReduceActions.I27])
1388+  .add(Symbol.DIVIDE, [SHIFT, ReduceActions.FIXED_CELL_VAL])
1389+  .add(Symbol.CARROT, [SHIFT, ReduceActions.FIXED_CELL_RANGE_VAL])
1390+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.NOT])
1391+  .add(Symbol.COMMA, [REDUCE, ReduceActions.NOT])
1392   .build();
1393 table[52] = ObjectBuilder
1394-  .add(Symbol.EOF, [REDUCE, 17])
1395-  .add(Symbol.AMPERSAND, [SHIFT, 20])
1396-  .add(Symbol.EQUALS, [REDUCE, 17])
1397-  .add(Symbol.PLUS, [REDUCE, 17])
1398-  .add(Symbol.RIGHT_PAREN, [REDUCE, 17])
1399-  .add(Symbol.LESS_THAN, [REDUCE, 17])
1400-  .add(Symbol.GREATER_THAN, [REDUCE, 17])
1401-  .add(Symbol.NOT, [REDUCE, 17])
1402-  .add(Symbol.MINUS, [REDUCE, 17])
1403-  .add(Symbol.ASTERISK, [SHIFT, 27])
1404-  .add(Symbol.DIVIDE, [SHIFT, 28])
1405-  .add(Symbol.CARROT, [SHIFT, 29])
1406-  .add(Symbol.SEMI_COLON, [REDUCE, 17])
1407-  .add(Symbol.COMMA, [REDUCE, 17])
1408+  .add(Symbol.EOF, [REDUCE, ReduceActions.MINUS])
1409+  .add(Symbol.AMPERSAND, [SHIFT, ReduceActions.TO_POWER])
1410+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.MINUS])
1411+  .add(Symbol.PLUS, [REDUCE, ReduceActions.MINUS])
1412+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.MINUS])
1413+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.MINUS])
1414+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.MINUS])
1415+  .add(Symbol.NOT, [REDUCE, ReduceActions.MINUS])
1416+  .add(Symbol.MINUS, [REDUCE, ReduceActions.MINUS])
1417+  .add(Symbol.ASTERISK, [SHIFT, ReduceActions.I27])
1418+  .add(Symbol.DIVIDE, [SHIFT, ReduceActions.FIXED_CELL_VAL])
1419+  .add(Symbol.CARROT, [SHIFT, ReduceActions.FIXED_CELL_RANGE_VAL])
1420+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.MINUS])
1421+  .add(Symbol.COMMA, [REDUCE, ReduceActions.MINUS])
1422   .build();
1423 table[53] = ObjectBuilder
1424-  .add(Symbol.EOF, [REDUCE, 18])
1425-  .add(Symbol.AMPERSAND, [SHIFT, 20])
1426-  .add(Symbol.EQUALS, [REDUCE, 18])
1427-  .add(Symbol.PLUS, [REDUCE, 18])
1428-  .add(Symbol.RIGHT_PAREN, [REDUCE, 18])
1429-  .add(Symbol.LESS_THAN, [REDUCE, 18])
1430-  .add(Symbol.GREATER_THAN, [REDUCE, 18])
1431-  .add(Symbol.NOT, [REDUCE, 18])
1432-  .add(Symbol.MINUS, [REDUCE, 18])
1433-  .add(Symbol.ASTERISK, [REDUCE, 18])
1434-  .add(Symbol.DIVIDE, [REDUCE, 18])
1435-  .add(Symbol.CARROT, [SHIFT, 29])
1436-  .add(Symbol.SEMI_COLON, [REDUCE, 18])
1437-  .add(Symbol.COMMA, [REDUCE, 18])
1438+  .add(Symbol.EOF, [REDUCE, ReduceActions.MULTIPLY])
1439+  .add(Symbol.AMPERSAND, [SHIFT, ReduceActions.TO_POWER])
1440+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.MULTIPLY])
1441+  .add(Symbol.PLUS, [REDUCE, ReduceActions.MULTIPLY])
1442+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.MULTIPLY])
1443+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.MULTIPLY])
1444+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.MULTIPLY])
1445+  .add(Symbol.NOT, [REDUCE, ReduceActions.MULTIPLY])
1446+  .add(Symbol.MINUS, [REDUCE, ReduceActions.MULTIPLY])
1447+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.MULTIPLY])
1448+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.MULTIPLY])
1449+  .add(Symbol.CARROT, [SHIFT, ReduceActions.FIXED_CELL_RANGE_VAL])
1450+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.MULTIPLY])
1451+  .add(Symbol.COMMA, [REDUCE, ReduceActions.MULTIPLY])
1452   .build();
1453 table[54] = ObjectBuilder
1454-  .add(Symbol.EOF, [REDUCE, 19])
1455-  .add(Symbol.AMPERSAND, [SHIFT, 20])
1456-  .add(Symbol.EQUALS, [REDUCE, 19])
1457-  .add(Symbol.PLUS, [REDUCE, 19])
1458-  .add(Symbol.RIGHT_PAREN, [REDUCE, 19])
1459-  .add(Symbol.LESS_THAN, [REDUCE, 19])
1460-  .add(Symbol.GREATER_THAN, [REDUCE, 19])
1461-  .add(Symbol.NOT, [REDUCE, 19])
1462-  .add(Symbol.MINUS, [REDUCE, 19])
1463-  .add(Symbol.ASTERISK, [REDUCE, 19])
1464-  .add(Symbol.DIVIDE, [REDUCE, 19])
1465-  .add(Symbol.CARROT, [SHIFT, 29])
1466-  .add(Symbol.SEMI_COLON, [REDUCE, 19])
1467-  .add(Symbol.COMMA, [REDUCE, 19])
1468+  .add(Symbol.EOF, [REDUCE, ReduceActions.DIVIDE])
1469+  .add(Symbol.AMPERSAND, [SHIFT, ReduceActions.TO_POWER])
1470+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.DIVIDE])
1471+  .add(Symbol.PLUS, [REDUCE, ReduceActions.DIVIDE])
1472+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.DIVIDE])
1473+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.DIVIDE])
1474+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.DIVIDE])
1475+  .add(Symbol.NOT, [REDUCE, ReduceActions.DIVIDE])
1476+  .add(Symbol.MINUS, [REDUCE, ReduceActions.DIVIDE])
1477+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.DIVIDE])
1478+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.DIVIDE])
1479+  .add(Symbol.CARROT, [SHIFT, ReduceActions.FIXED_CELL_RANGE_VAL])
1480+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.DIVIDE])
1481+  .add(Symbol.COMMA, [REDUCE, ReduceActions.DIVIDE])
1482   .build();
1483 table[55] = ObjectBuilder
1484-  .add(Symbol.EOF, [REDUCE, 20])
1485-  .add(Symbol.AMPERSAND, [SHIFT, 20])
1486-  .add(Symbol.EQUALS, [REDUCE, 20])
1487-  .add(Symbol.PLUS, [REDUCE, 20])
1488-  .add(Symbol.RIGHT_PAREN, [REDUCE, 20])
1489-  .add(Symbol.LESS_THAN, [REDUCE, 20])
1490-  .add(Symbol.GREATER_THAN, [REDUCE, 20])
1491-  .add(Symbol.NOT, [REDUCE, 20])
1492-  .add(Symbol.MINUS, [REDUCE, 20])
1493-  .add(Symbol.ASTERISK, [REDUCE, 20])
1494-  .add(Symbol.DIVIDE, [REDUCE, 20])
1495-  .add(Symbol.CARROT, [REDUCE, 20])
1496-  .add(Symbol.SEMI_COLON, [REDUCE, 20])
1497-  .add(Symbol.COMMA, [REDUCE, 20])
1498+  .add(Symbol.EOF, [REDUCE, ReduceActions.TO_POWER])
1499+  .add(Symbol.AMPERSAND, [SHIFT, ReduceActions.TO_POWER])
1500+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.TO_POWER])
1501+  .add(Symbol.PLUS, [REDUCE, ReduceActions.TO_POWER])
1502+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.TO_POWER])
1503+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.TO_POWER])
1504+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.TO_POWER])
1505+  .add(Symbol.NOT, [REDUCE, ReduceActions.TO_POWER])
1506+  .add(Symbol.MINUS, [REDUCE, ReduceActions.TO_POWER])
1507+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.TO_POWER])
1508+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.TO_POWER])
1509+  .add(Symbol.CARROT, [REDUCE, ReduceActions.TO_POWER])
1510+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.TO_POWER])
1511+  .add(Symbol.COMMA, [REDUCE, ReduceActions.TO_POWER])
1512   .build();
1513 table[56] = ObjectBuilder
1514-  .add(Symbol.EOF, [REDUCE, 37])
1515-  .add(Symbol.AMPERSAND, [REDUCE, 37])
1516-  .add(Symbol.EQUALS, [REDUCE, 37])
1517-  .add(Symbol.PLUS, [REDUCE, 37])
1518-  .add(Symbol.RIGHT_PAREN, [REDUCE, 37])
1519-  .add(Symbol.LESS_THAN, [REDUCE, 37])
1520-  .add(Symbol.GREATER_THAN, [REDUCE, 37])
1521-  .add(Symbol.NOT, [REDUCE, 37])
1522-  .add(Symbol.MINUS, [REDUCE, 37])
1523-  .add(Symbol.ASTERISK, [REDUCE, 37])
1524-  .add(Symbol.DIVIDE, [REDUCE, 37])
1525-  .add(Symbol.CARROT, [REDUCE, 37])
1526-  .add(Symbol.SEMI_COLON, [REDUCE, 37])
1527-  .add(Symbol.COMMA, [REDUCE, 37])
1528-  .add(33, [REDUCE, 37])
1529+  .add(Symbol.EOF, [REDUCE, ReduceActions.ENSURE_LAST_TWO_IN_ARRAY_AND_PUSH])
1530+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.ENSURE_LAST_TWO_IN_ARRAY_AND_PUSH])
1531+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.ENSURE_LAST_TWO_IN_ARRAY_AND_PUSH])
1532+  .add(Symbol.PLUS, [REDUCE, ReduceActions.ENSURE_LAST_TWO_IN_ARRAY_AND_PUSH])
1533+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.ENSURE_LAST_TWO_IN_ARRAY_AND_PUSH])
1534+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.ENSURE_LAST_TWO_IN_ARRAY_AND_PUSH])
1535+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.ENSURE_LAST_TWO_IN_ARRAY_AND_PUSH])
1536+  .add(Symbol.NOT, [REDUCE, ReduceActions.ENSURE_LAST_TWO_IN_ARRAY_AND_PUSH])
1537+  .add(Symbol.MINUS, [REDUCE, ReduceActions.ENSURE_LAST_TWO_IN_ARRAY_AND_PUSH])
1538+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.ENSURE_LAST_TWO_IN_ARRAY_AND_PUSH])
1539+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.ENSURE_LAST_TWO_IN_ARRAY_AND_PUSH])
1540+  .add(Symbol.CARROT, [REDUCE, ReduceActions.ENSURE_LAST_TWO_IN_ARRAY_AND_PUSH])
1541+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.ENSURE_LAST_TWO_IN_ARRAY_AND_PUSH])
1542+  .add(Symbol.COMMA, [REDUCE, ReduceActions.ENSURE_LAST_TWO_IN_ARRAY_AND_PUSH])
1543+  .add(33, [REDUCE, ReduceActions.ENSURE_LAST_TWO_IN_ARRAY_AND_PUSH])
1544   .build();
1545 table[57] = ObjectBuilder
1546-  .add(Symbol.EOF, [REDUCE, 10])
1547-  .add(Symbol.AMPERSAND, [REDUCE, 10])
1548-  .add(Symbol.EQUALS, [REDUCE, 10])
1549-  .add(Symbol.PLUS, [REDUCE, 10])
1550-  .add(Symbol.RIGHT_PAREN, [REDUCE, 10])
1551-  .add(Symbol.LESS_THAN, [REDUCE, 10])
1552-  .add(Symbol.GREATER_THAN, [REDUCE, 10])
1553-  .add(Symbol.NOT, [REDUCE, 10])
1554-  .add(Symbol.MINUS, [REDUCE, 10])
1555-  .add(Symbol.ASTERISK, [REDUCE, 10])
1556-  .add(Symbol.DIVIDE, [REDUCE, 10])
1557-  .add(Symbol.CARROT, [REDUCE, 10])
1558-  .add(Symbol.SEMI_COLON, [REDUCE, 10])
1559-  .add(Symbol.COMMA, [REDUCE, 10])
1560+  .add(Symbol.EOF, [REDUCE, ReduceActions.LAST_NUMBER])
1561+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.LAST_NUMBER])
1562+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.LAST_NUMBER])
1563+  .add(Symbol.PLUS, [REDUCE, ReduceActions.LAST_NUMBER])
1564+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.LAST_NUMBER])
1565+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.LAST_NUMBER])
1566+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.LAST_NUMBER])
1567+  .add(Symbol.NOT, [REDUCE, ReduceActions.LAST_NUMBER])
1568+  .add(Symbol.MINUS, [REDUCE, ReduceActions.LAST_NUMBER])
1569+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.LAST_NUMBER])
1570+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.LAST_NUMBER])
1571+  .add(Symbol.CARROT, [REDUCE, ReduceActions.LAST_NUMBER])
1572+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.LAST_NUMBER])
1573+  .add(Symbol.COMMA, [REDUCE, ReduceActions.LAST_NUMBER])
1574   .build();
1575 table[58] = ObjectBuilder
1576-  .add(Symbol.EOF, [REDUCE, 23])
1577-  .add(Symbol.AMPERSAND, [REDUCE, 23])
1578-  .add(Symbol.EQUALS, [REDUCE, 23])
1579-  .add(Symbol.PLUS, [REDUCE, 23])
1580-  .add(Symbol.RIGHT_PAREN, [REDUCE, 23])
1581-  .add(Symbol.LESS_THAN, [REDUCE, 23])
1582-  .add(Symbol.GREATER_THAN, [REDUCE, 23])
1583-  .add(Symbol.NOT, [REDUCE, 23])
1584-  .add(Symbol.MINUS, [REDUCE, 23])
1585-  .add(Symbol.ASTERISK, [REDUCE, 23])
1586-  .add(Symbol.DIVIDE, [REDUCE, 23])
1587-  .add(Symbol.CARROT, [REDUCE, 23])
1588-  .add(Symbol.SEMI_COLON, [REDUCE, 23])
1589-  .add(Symbol.COMMA, [REDUCE, 23])
1590+  .add(Symbol.EOF, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_BLANK])
1591+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_BLANK])
1592+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_BLANK])
1593+  .add(Symbol.PLUS, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_BLANK])
1594+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_BLANK])
1595+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_BLANK])
1596+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_BLANK])
1597+  .add(Symbol.NOT, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_BLANK])
1598+  .add(Symbol.MINUS, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_BLANK])
1599+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_BLANK])
1600+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_BLANK])
1601+  .add(Symbol.CARROT, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_BLANK])
1602+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_BLANK])
1603+  .add(Symbol.COMMA, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_BLANK])
1604   .build();
1605 table[59] = ObjectBuilder
1606   .add(Symbol.RIGHT_PAREN, [SHIFT, 70])
1607@@ -1250,235 +1252,235 @@ table[59] = ObjectBuilder
1608   .add(Symbol.COMMA, [SHIFT, 72])
1609   .build();
1610 table[60] = ObjectBuilder
1611-  .add(Symbol.AMPERSAND, [SHIFT, 20])
1612-  .add(Symbol.EQUALS, [SHIFT, 21])
1613-  .add(Symbol.PLUS, [SHIFT, 22])
1614-  .add(Symbol.RIGHT_PAREN, [REDUCE, 32])
1615-  .add(Symbol.LESS_THAN, [SHIFT, 23])
1616-  .add(Symbol.GREATER_THAN, [SHIFT, 24])
1617-  .add(Symbol.NOT, [SHIFT, 25])
1618-  .add(Symbol.MINUS, [SHIFT, 26])
1619-  .add(Symbol.ASTERISK, [SHIFT, 27])
1620-  .add(Symbol.DIVIDE, [SHIFT, 28])
1621-  .add(Symbol.CARROT, [SHIFT, 29])
1622-  .add(Symbol.SEMI_COLON, [REDUCE, 32])
1623-  .add(Symbol.COMMA, [REDUCE, 32])
1624+  .add(Symbol.AMPERSAND, [SHIFT, ReduceActions.TO_POWER])
1625+  .add(Symbol.EQUALS, [SHIFT, ReduceActions.INVERT_NUM])
1626+  .add(Symbol.PLUS, [SHIFT, ReduceActions.TO_NUMBER_NAN_AS_ZERO])
1627+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.ENSURE_IS_ARRAY])
1628+  .add(Symbol.LESS_THAN, [SHIFT, ReduceActions.CALL_FUNCTION_LAST_BLANK])
1629+  .add(Symbol.GREATER_THAN, [SHIFT, ReduceActions.CALL_FUNCTION_LAST_TWO_IN_STACK])
1630+  .add(Symbol.NOT, [SHIFT, ReduceActions.I25])
1631+  .add(Symbol.MINUS, [SHIFT, ReduceActions.I26])
1632+  .add(Symbol.ASTERISK, [SHIFT, ReduceActions.I27])
1633+  .add(Symbol.DIVIDE, [SHIFT, ReduceActions.FIXED_CELL_VAL])
1634+  .add(Symbol.CARROT, [SHIFT, ReduceActions.FIXED_CELL_RANGE_VAL])
1635+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.ENSURE_IS_ARRAY])
1636+  .add(Symbol.COMMA, [REDUCE, ReduceActions.ENSURE_IS_ARRAY])
1637   .build();
1638 table[61] = ObjectBuilder
1639-  .add(Symbol.RIGHT_PAREN, [REDUCE, 33])
1640-  .add(Symbol.SEMI_COLON, [REDUCE, 33])
1641-  .add(Symbol.COMMA, [REDUCE, 33])
1642+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.ENSURE_YYTEXT_ARRAY])
1643+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.ENSURE_YYTEXT_ARRAY])
1644+  .add(Symbol.COMMA, [REDUCE, ReduceActions.ENSURE_YYTEXT_ARRAY])
1645   .build();
1646 table[62] = ObjectBuilder
1647   .add(Symbol.EXCLAMATION_POINT, [SHIFT, 73])
1648   .build();
1649 table[63] = ObjectBuilder
1650-  .add(Symbol.EOF, [REDUCE, 39])
1651-  .add(Symbol.AMPERSAND, [REDUCE, 39])
1652-  .add(Symbol.EQUALS, [REDUCE, 39])
1653-  .add(Symbol.PLUS, [REDUCE, 39])
1654-  .add(Symbol.RIGHT_PAREN, [REDUCE, 39])
1655-  .add(Symbol.LESS_THAN, [REDUCE, 39])
1656-  .add(Symbol.GREATER_THAN, [REDUCE, 39])
1657-  .add(Symbol.NOT, [REDUCE, 39])
1658-  .add(Symbol.MINUS, [REDUCE, 39])
1659-  .add(Symbol.ASTERISK, [REDUCE, 39])
1660-  .add(Symbol.DIVIDE, [REDUCE, 39])
1661-  .add(Symbol.CARROT, [REDUCE, 39])
1662-  .add(Symbol.SEMI_COLON, [REDUCE, 39])
1663-  .add(Symbol.COMMA, [REDUCE, 39])
1664-  .add(Symbol.PERCENT, [REDUCE, 39])
1665-  .add(38, [REDUCE, 39]).build();
1666+  .add(Symbol.EOF, [REDUCE, ReduceActions.REDUCE_FLOAT])
1667+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.REDUCE_FLOAT])
1668+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.REDUCE_FLOAT])
1669+  .add(Symbol.PLUS, [REDUCE, ReduceActions.REDUCE_FLOAT])
1670+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.REDUCE_FLOAT])
1671+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.REDUCE_FLOAT])
1672+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.REDUCE_FLOAT])
1673+  .add(Symbol.NOT, [REDUCE, ReduceActions.REDUCE_FLOAT])
1674+  .add(Symbol.MINUS, [REDUCE, ReduceActions.REDUCE_FLOAT])
1675+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.REDUCE_FLOAT])
1676+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.REDUCE_FLOAT])
1677+  .add(Symbol.CARROT, [REDUCE, ReduceActions.REDUCE_FLOAT])
1678+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.REDUCE_FLOAT])
1679+  .add(Symbol.COMMA, [REDUCE, ReduceActions.REDUCE_FLOAT])
1680+  .add(Symbol.PERCENT, [REDUCE, ReduceActions.REDUCE_FLOAT])
1681+  .add(38, [REDUCE, ReduceActions.REDUCE_FLOAT]).build();
1682 table[64] = ObjectBuilder
1683-  .add(Symbol.EOF, [REDUCE, 29])
1684-  .add(Symbol.AMPERSAND, [REDUCE, 29])
1685-  .add(Symbol.EQUALS, [REDUCE, 29])
1686-  .add(Symbol.PLUS, [REDUCE, 29])
1687-  .add(Symbol.RIGHT_PAREN, [REDUCE, 29])
1688-  .add(Symbol.LESS_THAN, [REDUCE, 29])
1689-  .add(Symbol.GREATER_THAN, [REDUCE, 29])
1690-  .add(Symbol.NOT, [REDUCE, 29])
1691-  .add(Symbol.MINUS, [REDUCE, 29])
1692-  .add(Symbol.ASTERISK, [REDUCE, 29])
1693-  .add(Symbol.DIVIDE, [REDUCE, 29])
1694-  .add(Symbol.CARROT, [REDUCE, 29])
1695-  .add(Symbol.SEMI_COLON, [REDUCE, 29])
1696-  .add(Symbol.COMMA, [REDUCE, 29]).build();
1697+  .add(Symbol.EOF, [REDUCE, ReduceActions.FIXED_CELL_RANGE_VAL])
1698+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.FIXED_CELL_RANGE_VAL])
1699+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.FIXED_CELL_RANGE_VAL])
1700+  .add(Symbol.PLUS, [REDUCE, ReduceActions.FIXED_CELL_RANGE_VAL])
1701+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.FIXED_CELL_RANGE_VAL])
1702+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.FIXED_CELL_RANGE_VAL])
1703+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.FIXED_CELL_RANGE_VAL])
1704+  .add(Symbol.NOT, [REDUCE, ReduceActions.FIXED_CELL_RANGE_VAL])
1705+  .add(Symbol.MINUS, [REDUCE, ReduceActions.FIXED_CELL_RANGE_VAL])
1706+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.FIXED_CELL_RANGE_VAL])
1707+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.FIXED_CELL_RANGE_VAL])
1708+  .add(Symbol.CARROT, [REDUCE, ReduceActions.FIXED_CELL_RANGE_VAL])
1709+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.FIXED_CELL_RANGE_VAL])
1710+  .add(Symbol.COMMA, [REDUCE, ReduceActions.FIXED_CELL_RANGE_VAL]).build();
1711 table[65] = ObjectBuilder
1712-  .add(Symbol.EOF, [REDUCE, 31])
1713-  .add(Symbol.AMPERSAND, [REDUCE, 31])
1714-  .add(Symbol.EQUALS, [REDUCE, 31])
1715-  .add(Symbol.PLUS, [REDUCE, 31])
1716-  .add(Symbol.RIGHT_PAREN, [REDUCE, 31])
1717-  .add(Symbol.LESS_THAN, [REDUCE, 31])
1718-  .add(Symbol.GREATER_THAN, [REDUCE, 31])
1719-  .add(Symbol.NOT, [REDUCE, 31])
1720-  .add(Symbol.MINUS, [REDUCE, 31])
1721-  .add(Symbol.ASTERISK, [REDUCE, 31])
1722-  .add(Symbol.DIVIDE, [REDUCE, 31])
1723-  .add(Symbol.CARROT, [REDUCE, 31])
1724-  .add(Symbol.SEMI_COLON, [REDUCE, 31])
1725-  .add(Symbol.COMMA, [REDUCE, 31]).build();
1726+  .add(Symbol.EOF, [REDUCE, ReduceActions.CELL_RANGE_VALUE])
1727+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.CELL_RANGE_VALUE])
1728+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.CELL_RANGE_VALUE])
1729+  .add(Symbol.PLUS, [REDUCE, ReduceActions.CELL_RANGE_VALUE])
1730+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.CELL_RANGE_VALUE])
1731+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.CELL_RANGE_VALUE])
1732+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.CELL_RANGE_VALUE])
1733+  .add(Symbol.NOT, [REDUCE, ReduceActions.CELL_RANGE_VALUE])
1734+  .add(Symbol.MINUS, [REDUCE, ReduceActions.CELL_RANGE_VALUE])
1735+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.CELL_RANGE_VALUE])
1736+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.CELL_RANGE_VALUE])
1737+  .add(Symbol.CARROT, [REDUCE, ReduceActions.CELL_RANGE_VALUE])
1738+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.CELL_RANGE_VALUE])
1739+  .add(Symbol.COMMA, [REDUCE, ReduceActions.CELL_RANGE_VALUE]).build();
1740 table[66] = ObjectBuilder
1741-  .add(Symbol.EOF, [REDUCE, 41])
1742-  .add(Symbol.AMPERSAND, [REDUCE, 41])
1743-  .add(Symbol.EQUALS, [REDUCE, 41])
1744-  .add(Symbol.PLUS, [REDUCE, 41])
1745-  .add(Symbol.RIGHT_PAREN, [REDUCE, 41])
1746-  .add(Symbol.LESS_THAN, [REDUCE, 41])
1747-  .add(Symbol.GREATER_THAN, [REDUCE, 41])
1748-  .add(Symbol.NOT, [REDUCE, 41])
1749-  .add(Symbol.MINUS, [REDUCE, 41])
1750-  .add(Symbol.ASTERISK, [REDUCE, 41])
1751-  .add(Symbol.DIVIDE, [REDUCE, 41])
1752-  .add(Symbol.CARROT, [REDUCE, 41])
1753-  .add(Symbol.SEMI_COLON, [REDUCE, 41])
1754-  .add(Symbol.COMMA, [REDUCE, 41])
1755-  .add(Symbol.VARIABLE, [REDUCE, 41])
1756-  .add(Symbol.POUND, [REDUCE, 41]).build();
1757+  .add(Symbol.EOF, [REDUCE, ReduceActions.REDUCE_LAST_THREE_A])
1758+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.REDUCE_LAST_THREE_A])
1759+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.REDUCE_LAST_THREE_A])
1760+  .add(Symbol.PLUS, [REDUCE, ReduceActions.REDUCE_LAST_THREE_A])
1761+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.REDUCE_LAST_THREE_A])
1762+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.REDUCE_LAST_THREE_A])
1763+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.REDUCE_LAST_THREE_A])
1764+  .add(Symbol.NOT, [REDUCE, ReduceActions.REDUCE_LAST_THREE_A])
1765+  .add(Symbol.MINUS, [REDUCE, ReduceActions.REDUCE_LAST_THREE_A])
1766+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.REDUCE_LAST_THREE_A])
1767+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.REDUCE_LAST_THREE_A])
1768+  .add(Symbol.CARROT, [REDUCE, ReduceActions.REDUCE_LAST_THREE_A])
1769+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.REDUCE_LAST_THREE_A])
1770+  .add(Symbol.COMMA, [REDUCE, ReduceActions.REDUCE_LAST_THREE_A])
1771+  .add(Symbol.VARIABLE, [REDUCE, ReduceActions.REDUCE_LAST_THREE_A])
1772+  .add(Symbol.POUND, [REDUCE, ReduceActions.REDUCE_LAST_THREE_A]).build();
1773 table[67] = ObjectBuilder
1774-  .add(Symbol.EOF, [REDUCE, 11])
1775-  .add(Symbol.AMPERSAND, [SHIFT, 20])
1776-  .add(Symbol.EQUALS, [REDUCE, 11])
1777-  .add(Symbol.PLUS, [SHIFT, 22])
1778-  .add(Symbol.RIGHT_PAREN, [REDUCE, 11])
1779-  .add(Symbol.LESS_THAN, [REDUCE, 11])
1780-  .add(Symbol.GREATER_THAN, [REDUCE, 11])
1781-  .add(Symbol.NOT, [REDUCE, 11])
1782-  .add(Symbol.MINUS, [SHIFT, 26])
1783-  .add(Symbol.ASTERISK, [SHIFT, 27])
1784-  .add(Symbol.DIVIDE, [SHIFT, 28])
1785-  .add(Symbol.CARROT, [SHIFT, 29])
1786-  .add(Symbol.SEMI_COLON, [REDUCE, 11])
1787-  .add(Symbol.COMMA, [REDUCE, 11]).build();
1788+  .add(Symbol.EOF, [REDUCE, ReduceActions.LTE])
1789+  .add(Symbol.AMPERSAND, [SHIFT, ReduceActions.TO_POWER])
1790+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.LTE])
1791+  .add(Symbol.PLUS, [SHIFT, ReduceActions.TO_NUMBER_NAN_AS_ZERO])
1792+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.LTE])
1793+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.LTE])
1794+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.LTE])
1795+  .add(Symbol.NOT, [REDUCE, ReduceActions.LTE])
1796+  .add(Symbol.MINUS, [SHIFT, ReduceActions.I26])
1797+  .add(Symbol.ASTERISK, [SHIFT, ReduceActions.I27])
1798+  .add(Symbol.DIVIDE, [SHIFT, ReduceActions.FIXED_CELL_VAL])
1799+  .add(Symbol.CARROT, [SHIFT, ReduceActions.FIXED_CELL_RANGE_VAL])
1800+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.LTE])
1801+  .add(Symbol.COMMA, [REDUCE, ReduceActions.LTE]).build();
1802 table[68] = ObjectBuilder
1803-  .add(Symbol.EOF, [REDUCE, 13])
1804-  .add(Symbol.AMPERSAND, [SHIFT, 20])
1805-  .add(Symbol.EQUALS, [REDUCE, 13])
1806-  .add(Symbol.PLUS, [SHIFT, 22])
1807-  .add(Symbol.RIGHT_PAREN, [REDUCE, 13])
1808-  .add(Symbol.LESS_THAN, [REDUCE, 13])
1809-  .add(Symbol.GREATER_THAN, [REDUCE, 13])
1810-  .add(Symbol.NOT, [REDUCE, 13])
1811-  .add(Symbol.MINUS, [SHIFT, 26])
1812-  .add(Symbol.ASTERISK, [SHIFT, 27])
1813-  .add(Symbol.DIVIDE, [SHIFT, 28])
1814-  .add(Symbol.CARROT, [SHIFT, 29])
1815-  .add(Symbol.SEMI_COLON, [REDUCE, 13])
1816-  .add(Symbol.COMMA, [REDUCE, 13]).build();
1817+  .add(Symbol.EOF, [REDUCE, ReduceActions.NOT_EQ])
1818+  .add(Symbol.AMPERSAND, [SHIFT, ReduceActions.TO_POWER])
1819+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.NOT_EQ])
1820+  .add(Symbol.PLUS, [SHIFT, ReduceActions.TO_NUMBER_NAN_AS_ZERO])
1821+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.NOT_EQ])
1822+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.NOT_EQ])
1823+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.NOT_EQ])
1824+  .add(Symbol.NOT, [REDUCE, ReduceActions.NOT_EQ])
1825+  .add(Symbol.MINUS, [SHIFT, ReduceActions.I26])
1826+  .add(Symbol.ASTERISK, [SHIFT, ReduceActions.I27])
1827+  .add(Symbol.DIVIDE, [SHIFT, ReduceActions.FIXED_CELL_VAL])
1828+  .add(Symbol.CARROT, [SHIFT, ReduceActions.FIXED_CELL_RANGE_VAL])
1829+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.NOT_EQ])
1830+  .add(Symbol.COMMA, [REDUCE, ReduceActions.NOT_EQ]).build();
1831 table[69] = ObjectBuilder
1832-  .add(Symbol.EOF, [REDUCE, 12])
1833-  .add(Symbol.AMPERSAND, [SHIFT, 20])
1834-  .add(Symbol.EQUALS, [REDUCE, 12])
1835-  .add(Symbol.PLUS, [SHIFT, 22])
1836-  .add(Symbol.RIGHT_PAREN, [REDUCE, 12])
1837-  .add(Symbol.LESS_THAN, [REDUCE, 12])
1838-  .add(Symbol.GREATER_THAN, [REDUCE, 12])
1839-  .add(Symbol.NOT, [REDUCE, 12])
1840-  .add(Symbol.MINUS, [SHIFT, 26])
1841-  .add(Symbol.ASTERISK, [SHIFT, 27])
1842-  .add(Symbol.DIVIDE, [SHIFT, 28])
1843-  .add(Symbol.CARROT, [SHIFT, 29])
1844-  .add(Symbol.SEMI_COLON, [REDUCE, 12])
1845-  .add(Symbol.COMMA, [REDUCE, 12]).build();
1846+  .add(Symbol.EOF, [REDUCE, ReduceActions.GTE])
1847+  .add(Symbol.AMPERSAND, [SHIFT, ReduceActions.TO_POWER])
1848+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.GTE])
1849+  .add(Symbol.PLUS, [SHIFT, ReduceActions.TO_NUMBER_NAN_AS_ZERO])
1850+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.GTE])
1851+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.GTE])
1852+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.GTE])
1853+  .add(Symbol.NOT, [REDUCE, ReduceActions.GTE])
1854+  .add(Symbol.MINUS, [SHIFT, ReduceActions.I26])
1855+  .add(Symbol.ASTERISK, [SHIFT, ReduceActions.I27])
1856+  .add(Symbol.DIVIDE, [SHIFT, ReduceActions.FIXED_CELL_VAL])
1857+  .add(Symbol.CARROT, [SHIFT, ReduceActions.FIXED_CELL_RANGE_VAL])
1858+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.GTE])
1859+  .add(Symbol.COMMA, [REDUCE, ReduceActions.GTE]).build();
1860 table[70] = ObjectBuilder
1861-  .add(Symbol.EOF, [REDUCE, 24])
1862-  .add(Symbol.AMPERSAND, [REDUCE, 24])
1863-  .add(Symbol.EQUALS, [REDUCE, 24])
1864-  .add(Symbol.PLUS, [REDUCE, 24])
1865-  .add(Symbol.RIGHT_PAREN, [REDUCE, 24])
1866-  .add(Symbol.LESS_THAN, [REDUCE, 24])
1867-  .add(Symbol.GREATER_THAN, [REDUCE, 24])
1868-  .add(Symbol.NOT, [REDUCE, 24])
1869-  .add(Symbol.MINUS, [REDUCE, 24])
1870-  .add(Symbol.ASTERISK, [REDUCE, 24])
1871-  .add(Symbol.DIVIDE, [REDUCE, 24])
1872-  .add(Symbol.CARROT, [REDUCE, 24])
1873-  .add(Symbol.SEMI_COLON, [REDUCE, 24])
1874-  .add(Symbol.COMMA, [REDUCE, 24]).build();
1875+  .add(Symbol.EOF, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_TWO_IN_STACK])
1876+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_TWO_IN_STACK])
1877+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_TWO_IN_STACK])
1878+  .add(Symbol.PLUS, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_TWO_IN_STACK])
1879+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_TWO_IN_STACK])
1880+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_TWO_IN_STACK])
1881+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_TWO_IN_STACK])
1882+  .add(Symbol.NOT, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_TWO_IN_STACK])
1883+  .add(Symbol.MINUS, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_TWO_IN_STACK])
1884+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_TWO_IN_STACK])
1885+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_TWO_IN_STACK])
1886+  .add(Symbol.CARROT, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_TWO_IN_STACK])
1887+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_TWO_IN_STACK])
1888+  .add(Symbol.COMMA, [REDUCE, ReduceActions.CALL_FUNCTION_LAST_TWO_IN_STACK]).build();
1889 table[71] = ObjectBuilder
1890   .add(Symbol.ERROR, 13)
1891   .add(Symbol.EXPRESSION, 74)
1892   .add(Symbol.VARIABLE_SEQUENCE, 3)
1893-  .add(Symbol.TIME_AMPM, [SHIFT, 4])
1894-  .add(Symbol.TIME_24, [SHIFT, 5])
1895+  .add(Symbol.TIME_AMPM, [SHIFT, ReduceActions.TIME_CALL])
1896+  .add(Symbol.TIME_24, [SHIFT, ReduceActions.AS_NUMBER])
1897   .add(Symbol.NUMBER, 6)
1898-  .add(Symbol.STRING, [SHIFT, 7])
1899-  .add(Symbol.EQUALS, [SHIFT, 21])
1900-  .add(Symbol.PLUS, [SHIFT, 10])
1901-  .add(Symbol.LEFT_PAREN, [SHIFT, 8])
1902-  .add(Symbol.MINUS, [SHIFT, 9])
1903-  .add(Symbol.FUNCTION, [SHIFT, 11])
1904+  .add(Symbol.STRING, [SHIFT, ReduceActions.AMPERSAND])
1905+  .add(Symbol.EQUALS, [SHIFT, ReduceActions.INVERT_NUM])
1906+  .add(Symbol.PLUS, [SHIFT, ReduceActions.LAST_NUMBER])
1907+  .add(Symbol.LEFT_PAREN, [SHIFT, ReduceActions.EQUALS])
1908+  .add(Symbol.MINUS, [SHIFT, ReduceActions.PLUS])
1909+  .add(Symbol.FUNCTION, [SHIFT, ReduceActions.LTE])
1910   .add(Symbol.CELL, 12)
1911-  .add(Symbol.FIXEDCELL, [SHIFT, 16])
1912-  .add(Symbol.CELL_UPPER, [SHIFT, 17])
1913-  .add(Symbol.VARIABLE, [SHIFT, 14])
1914-  .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
1915-  .add(Symbol.POUND, [SHIFT, 18]).build();
1916+  .add(Symbol.FIXEDCELL, [SHIFT, ReduceActions.LT])
1917+  .add(Symbol.CELL_UPPER, [SHIFT, ReduceActions.MINUS])
1918+  .add(Symbol.VARIABLE, [SHIFT, ReduceActions.NOT])
1919+  .add(Symbol.NUMBER_UPPER, [SHIFT, ReduceActions.GT])
1920+  .add(Symbol.POUND, [SHIFT, ReduceActions.MULTIPLY]).build();
1921 table[72] = ObjectBuilder
1922   .add(Symbol.ERROR, 13)
1923   .add(Symbol.EXPRESSION, 75)
1924   .add(Symbol.VARIABLE_SEQUENCE, 3)
1925-  .add(Symbol.TIME_AMPM, [SHIFT, 4])
1926-  .add(Symbol.TIME_24, [SHIFT, 5])
1927+  .add(Symbol.TIME_AMPM, [SHIFT, ReduceActions.TIME_CALL])
1928+  .add(Symbol.TIME_24, [SHIFT, ReduceActions.AS_NUMBER])
1929   .add(Symbol.NUMBER, 6)
1930-  .add(Symbol.STRING, [SHIFT, 7])
1931-  .add(Symbol.EQUALS, [SHIFT, 21])
1932-  .add(Symbol.PLUS, [SHIFT, 10])
1933-  .add(Symbol.LEFT_PAREN, [SHIFT, 8])
1934-  .add(Symbol.MINUS, [SHIFT, 9])
1935-  .add(Symbol.FUNCTION, [SHIFT, 11])
1936+  .add(Symbol.STRING, [SHIFT, ReduceActions.AMPERSAND])
1937+  .add(Symbol.EQUALS, [SHIFT, ReduceActions.INVERT_NUM])
1938+  .add(Symbol.PLUS, [SHIFT, ReduceActions.LAST_NUMBER])
1939+  .add(Symbol.LEFT_PAREN, [SHIFT, ReduceActions.EQUALS])
1940+  .add(Symbol.MINUS, [SHIFT, ReduceActions.PLUS])
1941+  .add(Symbol.FUNCTION, [SHIFT, ReduceActions.LTE])
1942   .add(Symbol.CELL, 12)
1943-  .add(Symbol.FIXEDCELL, [SHIFT, 16])
1944-  .add(Symbol.CELL_UPPER, [SHIFT, 17])
1945-  .add(Symbol.VARIABLE, [SHIFT, 14])
1946-  .add(Symbol.NUMBER_UPPER, [SHIFT, 15])
1947-  .add(Symbol.POUND, [SHIFT, 18]).build();
1948+  .add(Symbol.FIXEDCELL, [SHIFT, ReduceActions.LT])
1949+  .add(Symbol.CELL_UPPER, [SHIFT, ReduceActions.MINUS])
1950+  .add(Symbol.VARIABLE, [SHIFT, ReduceActions.NOT])
1951+  .add(Symbol.NUMBER_UPPER, [SHIFT, ReduceActions.GT])
1952+  .add(Symbol.POUND, [SHIFT, ReduceActions.MULTIPLY]).build();
1953 table[73] = ObjectBuilder
1954-  .add(Symbol.EOF, [REDUCE, 42])
1955-  .add(Symbol.AMPERSAND, [REDUCE, 42])
1956-  .add(Symbol.EQUALS, [REDUCE, 42])
1957-  .add(Symbol.PLUS, [REDUCE, 42])
1958-  .add(Symbol.RIGHT_PAREN, [REDUCE, 42])
1959-  .add(Symbol.LESS_THAN, [REDUCE, 42])
1960-  .add(Symbol.GREATER_THAN, [REDUCE, 42])
1961-  .add(Symbol.NOT, [REDUCE, 42])
1962-  .add(Symbol.MINUS, [REDUCE, 42])
1963-  .add(Symbol.ASTERISK, [REDUCE, 42])
1964-  .add(Symbol.DIVIDE, [REDUCE, 42])
1965-  .add(Symbol.CARROT, [REDUCE, 42])
1966-  .add(Symbol.SEMI_COLON, [REDUCE, 42])
1967-  .add(Symbol.COMMA, [REDUCE, 42])
1968-  .add(Symbol.VARIABLE, [REDUCE, 42])
1969-  .add(Symbol.POUND, [REDUCE, 42]).build();
1970+  .add(Symbol.EOF, [REDUCE, ReduceActions.REDUCE_LAST_THREE_B])
1971+  .add(Symbol.AMPERSAND, [REDUCE, ReduceActions.REDUCE_LAST_THREE_B])
1972+  .add(Symbol.EQUALS, [REDUCE, ReduceActions.REDUCE_LAST_THREE_B])
1973+  .add(Symbol.PLUS, [REDUCE, ReduceActions.REDUCE_LAST_THREE_B])
1974+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.REDUCE_LAST_THREE_B])
1975+  .add(Symbol.LESS_THAN, [REDUCE, ReduceActions.REDUCE_LAST_THREE_B])
1976+  .add(Symbol.GREATER_THAN, [REDUCE, ReduceActions.REDUCE_LAST_THREE_B])
1977+  .add(Symbol.NOT, [REDUCE, ReduceActions.REDUCE_LAST_THREE_B])
1978+  .add(Symbol.MINUS, [REDUCE, ReduceActions.REDUCE_LAST_THREE_B])
1979+  .add(Symbol.ASTERISK, [REDUCE, ReduceActions.REDUCE_LAST_THREE_B])
1980+  .add(Symbol.DIVIDE, [REDUCE, ReduceActions.REDUCE_LAST_THREE_B])
1981+  .add(Symbol.CARROT, [REDUCE, ReduceActions.REDUCE_LAST_THREE_B])
1982+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.REDUCE_LAST_THREE_B])
1983+  .add(Symbol.COMMA, [REDUCE, ReduceActions.REDUCE_LAST_THREE_B])
1984+  .add(Symbol.VARIABLE, [REDUCE, ReduceActions.REDUCE_LAST_THREE_B])
1985+  .add(Symbol.POUND, [REDUCE, ReduceActions.REDUCE_LAST_THREE_B]).build();
1986 table[74] = ObjectBuilder
1987-  .add(Symbol.AMPERSAND, [SHIFT, 20])
1988-  .add(Symbol.EQUALS, [SHIFT, 21])
1989-  .add(Symbol.PLUS, [SHIFT, 22])
1990-  .add(Symbol.RIGHT_PAREN, [REDUCE, 34])
1991-  .add(Symbol.LESS_THAN, [SHIFT, 23])
1992-  .add(Symbol.GREATER_THAN, [SHIFT, 24])
1993-  .add(Symbol.NOT, [SHIFT, 25])
1994-  .add(Symbol.MINUS, [SHIFT, 26])
1995-  .add(Symbol.ASTERISK, [SHIFT, 27])
1996-  .add(Symbol.DIVIDE, [SHIFT, 28])
1997-  .add(Symbol.CARROT, [SHIFT, 29])
1998-  .add(Symbol.SEMI_COLON, [REDUCE, 34])
1999-  .add(Symbol.COMMA, [REDUCE, 34]).build();
2000+  .add(Symbol.AMPERSAND, [SHIFT, ReduceActions.TO_POWER])
2001+  .add(Symbol.EQUALS, [SHIFT, ReduceActions.INVERT_NUM])
2002+  .add(Symbol.PLUS, [SHIFT, ReduceActions.TO_NUMBER_NAN_AS_ZERO])
2003+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.REDUCE_INT])
2004+  .add(Symbol.LESS_THAN, [SHIFT, ReduceActions.CALL_FUNCTION_LAST_BLANK])
2005+  .add(Symbol.GREATER_THAN, [SHIFT, ReduceActions.CALL_FUNCTION_LAST_TWO_IN_STACK])
2006+  .add(Symbol.NOT, [SHIFT, ReduceActions.I25])
2007+  .add(Symbol.MINUS, [SHIFT, ReduceActions.I26])
2008+  .add(Symbol.ASTERISK, [SHIFT, ReduceActions.I27])
2009+  .add(Symbol.DIVIDE, [SHIFT, ReduceActions.FIXED_CELL_VAL])
2010+  .add(Symbol.CARROT, [SHIFT, ReduceActions.FIXED_CELL_RANGE_VAL])
2011+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.REDUCE_INT])
2012+  .add(Symbol.COMMA, [REDUCE, ReduceActions.REDUCE_INT]).build();
2013 table[75] = ObjectBuilder
2014-  .add(Symbol.AMPERSAND, [SHIFT, 20])
2015-  .add(Symbol.EQUALS, [SHIFT, 21])
2016-  .add(Symbol.PLUS, [SHIFT, 22])
2017-  .add(Symbol.RIGHT_PAREN, [REDUCE, 35])
2018-  .add(Symbol.LESS_THAN, [SHIFT, 23])
2019-  .add(Symbol.GREATER_THAN, [SHIFT, 24])
2020-  .add(Symbol.NOT, [SHIFT, 25])
2021-  .add(Symbol.MINUS, [SHIFT, 26])
2022-  .add(Symbol.ASTERISK, [SHIFT, 27])
2023-  .add(Symbol.DIVIDE, [SHIFT, 28])
2024-  .add(Symbol.CARROT, [SHIFT, 29])
2025-  .add(Symbol.SEMI_COLON, [REDUCE, 35])
2026-  .add(Symbol.COMMA, [REDUCE, 35]).build();
2027+  .add(Symbol.AMPERSAND, [SHIFT, ReduceActions.TO_POWER])
2028+  .add(Symbol.EQUALS, [SHIFT, ReduceActions.INVERT_NUM])
2029+  .add(Symbol.PLUS, [SHIFT, ReduceActions.TO_NUMBER_NAN_AS_ZERO])
2030+  .add(Symbol.RIGHT_PAREN, [REDUCE, ReduceActions.REDUCE_PERCENT])
2031+  .add(Symbol.LESS_THAN, [SHIFT, ReduceActions.CALL_FUNCTION_LAST_BLANK])
2032+  .add(Symbol.GREATER_THAN, [SHIFT, ReduceActions.CALL_FUNCTION_LAST_TWO_IN_STACK])
2033+  .add(Symbol.NOT, [SHIFT, ReduceActions.I25])
2034+  .add(Symbol.MINUS, [SHIFT, ReduceActions.I26])
2035+  .add(Symbol.ASTERISK, [SHIFT, ReduceActions.I27])
2036+  .add(Symbol.DIVIDE, [SHIFT, ReduceActions.FIXED_CELL_VAL])
2037+  .add(Symbol.CARROT, [SHIFT, ReduceActions.FIXED_CELL_RANGE_VAL])
2038+  .add(Symbol.SEMI_COLON, [REDUCE, ReduceActions.REDUCE_PERCENT])
2039+  .add(Symbol.COMMA, [REDUCE, ReduceActions.REDUCE_PERCENT]).build();
2040 const ACTION_TABLE = table;
2041 
2042 
2043diff --git a/tests/Formulas/InfoTest.ts b/tests/Formulas/InfoTest.ts
2044index fc38402..31125f5 100644
2045--- a/tests/Formulas/InfoTest.ts
2046+++ b/tests/Formulas/InfoTest.ts
2047@@ -231,9 +231,12 @@ test("ISNA", function(){
2048 test("IFERROR", function(){
2049   let errorCell = new Cell("A1");
2050   errorCell.setError(new NAError("err"));
2051-  assertEquals(IFERROR(errorCell, 10), null);
2052+  assertEquals(IFERROR(errorCell, 10), 10);
2053   assertEquals(IFERROR(new NAError("err")), null);
2054+  assertEquals(IFERROR(new NAError("err"), 10), 10);
2055   assertEquals(IFERROR(10), 10);
2056+  assertEquals(IFERROR(10, false), 10);
2057+  assertEquals(IFERROR(false, 10), false);
2058   assertEquals(IFERROR(Cell.BuildFrom("A1", 10), "abc"), Cell.BuildFrom("A1", 10));
2059   assertEquals(IFERROR(new Cell("A1")), new Cell("A1"));
2060   catchAndAssertEquals(function() {
2061diff --git a/tests/SheetParsingTest.ts b/tests/SheetParsingTest.ts
2062index ad8eaff..5c4a473 100644
2063--- a/tests/SheetParsingTest.ts
2064+++ b/tests/SheetParsingTest.ts
2065@@ -41,13 +41,26 @@ test("Sheet ^", function(){
2066 
2067 test("Sheet throw error literal", function () {
2068   assertFormulaEqualsError('=#N/A', NA_ERROR);
2069-  // assertFormulaEqualsError('=ISNA(#N/A)', NA_ERROR);
2070   assertFormulaEqualsError('=#NUM!', NUM_ERROR);
2071   assertFormulaEqualsError('=#REF!', REF_ERROR);
2072   assertFormulaEqualsError('=#NULL!', NULL_ERROR);
2073   assertFormulaEqualsError('=#ERROR', PARSE_ERROR);
2074   assertFormulaEqualsError('=#DIV/0!', DIV_ZERO_ERROR);
2075   assertFormulaEqualsError('=#VALUE!', VALUE_ERROR);
2076+  assertFormulaEquals('=ISERROR(#N/A)', true);
2077+  assertFormulaEquals('=ISERROR(#NUM!)', true);
2078+  assertFormulaEquals('=ISERROR(#REF!)', true);
2079+  assertFormulaEquals('=ISERROR(#NULL!)', true);
2080+  assertFormulaEquals('=ISERROR(#ERROR)', true);
2081+  assertFormulaEquals('=ISERROR(#DIV/0!)', true);
2082+  assertFormulaEquals('=ISERROR(#VALUE!)', true);
2083+  assertFormulaEquals('=IFERROR(#N/A, 10)', 10);
2084+  assertFormulaEquals('=IFERROR(#NUM!, 10)', 10);
2085+  assertFormulaEquals('=IFERROR(#REF!, 10)', 10);
2086+  assertFormulaEquals('=IFERROR(#NULL!, 10)', 10);
2087+  assertFormulaEquals('=IFERROR(#ERROR, 10)', 10);
2088+  assertFormulaEquals('=IFERROR(#DIV/0!, 10)', 10);
2089+  assertFormulaEquals('=IFERROR(#VALUE!, 10)', 10);
2090 });
2091 
2092 test("Sheet numbers/math", function(){