#define MAX_GRAMMAR 920
#define PHRASE_BASE 522
int gram[MAX_GRAMMAR] = {
   31,     3,   565,   517,   551,    16,   256,   513,   526,   257,   523,   524,   525,   258,   523,   524, 
  525,   258,   523,   524,   525,   518,     2,   259,   518,     2,   514,   260,     6,   531,   540,   542, 
  261,   565,   518,     2,   262,   519,     4,   533,   513,   539,   518,     2,   263,   518,     5,   535, 
  546,   513,   537,   518,     4,   264,   513,   537,   518,     2,   265,   519,    16,   534,   266,   513, 
  539,   267,   523,   524,   525,   260,   523,   524,   525,   547,   268,   548,   518,     2,   269,   518, 
    2,   270,   518,     1,   271,     2,   272,   518,     5,   513,   267,   523,   521,   273,    12,   274, 
  513,   539,   267,   523,   521,   260,   523,   521,   268,   549,   518,     2,   275,   518,     2,   276, 
  518,     2,   277,   518,     2,   514,   278,     3,   279,   554,   518,     7,   280,   514,   552,   281, 
  514,   553,   518,     2,   282,   518,     2,   283,   518,     2,   284,   518,     2,   285,   518,     2, 
  286,   518,     1,   518,     1,   512,     3,     1,   287,     1,   288,     0,     4,     2,   513,   526, 
    1,   521,     5,   267,   523,   524,   525,   268,     5,   262,   523,   524,   525,   262,     2,     3, 
  528,   524,   525,     0,     2,     6,   267,   523,   524,   525,   527,   268,     0,     2,     5,   258, 
  523,   524,   525,   527,     0,     6,     1,   287,     1,   288,     1,   279,     1,   289,     1,   290, 
    0,     2,     1,   291,     0,     2,     1,   258,     0,     2,     1,   292,     1,   293,     2,     1, 
  294,     0,     2,     1,   295,     1,   294,     3,     1,   295,     1,   294,     0,     5,     1,   296, 
    1,   297,     1,   298,     1,   299,     1,   300,     8,     1,   535,     1,   301,     1,   302,     1, 
  295,     2,   532,   303,     1,   304,     1,   294,     1,   305,     2,     6,   267,   536,   513,   539, 
  538,   268,     0,     2,     5,   530,   536,   513,   539,   538,     0,     2,     3,   258,   513,   539, 
    0,     2,     8,   523,   524,   525,   550,   523,   524,   525,   541,     4,   267,   540,   542,   268, 
    2,     4,   550,   523,   524,   525,     0,     3,     3,   306,   540,   543,     3,   307,   540,   544, 
    0,     2,     3,   306,   540,   543,     0,     2,     3,   307,   540,   544,     0,     2,     5,   257, 
  523,   524,   525,   529,     0,     2,     1,   264,     0,     2,     9,   258,   523,   524,   525,   260, 
  523,   524,   525,   547,     0,     2,    14,   258,   513,   539,   267,   523,   524,   525,   260,   523, 
  524,   525,   547,   268,   548,     0,     2,    11,   258,   513,   539,   267,   523,   521,   260,   523, 
  521,   268,   549,     0,     6,     1,   257,     1,   308,     1,   309,     1,   310,     1,   311,     1, 
  312,     2,     1,   518,     4,   531,   540,   542,   518,     2,     3,   258,   514,   552,     0,     2, 
    6,   258,   514,   552,   281,   514,   553,     0,   103,     3,   313,   513,   526,     4,   279,   560, 
  513,   526,     4,   314,   514,   561,   555,     2,   315,   515,     3,   316,   514,   278,     3,   317, 
  514,   561,     2,   318,   514,     6,   560,   319,   514,   319,   514,   556,     2,   320,   557,     2, 
  257,   558,     4,   321,   514,   322,   514,     4,   323,   514,   322,   514,     4,   324,   514,   322, 
  514,     4,   319,   514,   322,   514,     4,   325,   514,   322,   514,     4,   326,   514,   322,   514, 
    4,   327,   514,   322,   514,     5,   324,   514,   257,   523,   514,     2,   321,   514,     2,   323, 
  514,     2,   324,   514,     2,   319,   514,     2,   328,   514,     2,   329,   514,     1,   330,     4, 
  319,   559,   324,   514,     3,   331,   523,   514,     2,   332,   514,     1,   333,     1,   334,     1, 
  335,     1,   336,     1,   337,     1,   338,     1,   339,     1,   340,     1,   341,     1,   342,     1, 
  343,     1,   344,     1,   345,     1,   346,     1,   347,     1,   348,     1,   349,     1,   350,     1, 
  351,     1,   352,     1,   353,     1,   354,     1,   355,     1,   356,     1,   357,     1,   358,     1, 
  359,     1,   360,     1,   361,     1,   362,     1,   289,     1,   363,     1,   364,     1,   365,     1, 
  287,     1,   366,     1,   367,     1,   368,     1,   288,     1,   369,     1,   370,     1,   371,     1, 
  372,     1,   331,     1,   373,     1,   374,     1,   375,     1,   376,     1,   377,     1,   378,     1, 
  379,     1,   380,     1,   381,     1,   382,     1,   383,     1,   384,     1,   385,     1,   318,     1, 
  386,     1,   387,     5,   388,   562,   563,   321,   514,     2,   389,   514,     2,   390,   514,     2, 
  391,   514,     2,   392,   514,     2,   393,   514,     2,   394,   514,     2,   395,   514,     3,   316, 
  523,   514,     2,   396,   514,     5,   515,   289,   515,   289,   515,     4,   560,   397,   514,   564, 
    2,   398,   514,     2,   399,   514,     0,    20,     3,   323,   514,   400,     3,   323,   514,   401, 
    3,   323,   514,   402,     1,   403,     1,   257,     1,   404,     1,   310,     1,   405,     1,   406, 
    1,   407,     1,   408,     1,   409,     1,   410,     1,   411,     1,   412,     1,   413,     1,   414, 
    1,   415,     1,   416,     0,     8,     1,   417,     1,   418,     1,   419,     1,   321,     1,   420, 
    1,   421,     1,   422,     0,    10,     3,   423,   523,   514,     3,   424,   523,   514,     3,   425, 
  523,   514,     3,   426,   523,   514,     3,   323,   523,   514,     2,   427,   514,     2,   428,   514, 
    2,   429,   514,     2,   430,   514,     2,   431,   514,    12,     1,   330,     2,   321,   514,     2, 
  323,   514,     2,   324,   514,     2,   319,   514,     2,   432,   514,     2,   433,   514,     2,   434, 
  514,     2,   435,   514,     2,   436,   514,     2,   437,   514,     2,   438,   514,     2,     1,   287, 
    1,   288,     2,     1,   257,     0,     2,     1,   388,     0,     3,     1,   324,     1,   439,     1, 
  319,     6,     1,   423,     1,   440,     1,   323,     1,   441,     1,   397,     1,   442,     3,     3, 
  319,   514,   321,     2,   319,   514,     0,     8,     4,   513,   526,   516,   545,     2,   281,   514, 
    2,   443,   520,     1,   444,     5,   445,   257,   523,   524,   525,     1,   446,     7,   281,   513, 
  267,   523,   524,   525,   268,     2,   447,   514, 
};

#define MAX_KEYWORD 192
char *keyword[MAX_KEYWORD] = { // Keywords are based at 256
  "cycle", "=", ",", "repeat", 
  ":", "then", "!", "end", 
  "spec", "comment", "array", "(", 
  ")", "***A", "begin", "endofprogram", 
  "uppercasedelimiters", "):", "switch", "compilequeries", 
  "ignorequeries", "mcode", "P:", "*", 
  "fault", "->", "normaldelimiters", "strings", 
  "endofperm", "endofmcode", "definecompiler", "+", 
  "-", "/", "^", "?", 
  "if", "unless", "real", "integer", 
  "routine", "realfn", "integerfn", "realmap", 
  "integermap", "integerarrayname", "integername", "arrayname", 
  "realname", "addr", "and", "or", 
  ">=", ">", "#", "<=", 
  "<", "*@", "J", "SETB", 
  "SET", "JS", "EXIT", "M", 
  "SH", "Q", "TOQ", "C", 
  "I", "IM", "CM", "CI", 
  "NC", "DC", "LINK", "X+", 
  "X+C", "ROUNDHF", "ROUNDF", "ROUNDH", 
  "ROUND", "FLOATD", "FLOAT", "ERASE", 
  "REVD", "REV", "ZERO", "DUPD", 
  "DUP", "NEGDF", "NEGF", "NEGD", 
  "NEG", "ABSF", "ABS", "MAXF", 
  "MAX", "SIGNF", "SIGN", "CAB", 
  "FRB", "STAND", "/DF", "/D", 
  "/F", "/R", "/I", "+DF", 
  "+D", "+F", "-DF", "-D", 
  "-F", "XDF", "XD", "XF", 
  "X+F", "=TR", "BITS", "DUMMY", 
  "PERM", "TOP", "OR", "VR", 
  "NEV", "NOT", "FIX", "STR", 
  "CONT", "AND", "OUT", "X", 
  "P", "TLOG", "INTQ", "PARQ", 
  "BUSYQ", "MANUALQ", "CTQ", "CLOQ", 
  "ADVCA", "E", "JSE", "JE", 
  "NZS", "NZ", "Z", "=Z", 
  "#Z", ">Z", ">=Z", "<Z", 
  "<=Z", "V", "NV", "EN", 
  "NEN", "EJ", "NEJ", "TR", 
  "NTR", "QHN", "QH", "QN", 
  "HN", "H", "N", "A", 
  "AD", "L", "LD", "AC", 
  "ADC", "LC", "LDC", "CC", 
  "RC", "RI", "RM", "+Q", 
  "+C", "+I", "+M", "O", 
  "B", "D", "F", "caption", 
  "return", "result", "stop", "monitor", 
  };

#define MAX_BIP 10
int BIP[MAX_BIP] = { // BIPs precede PHRASEs at 512 upwards
 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 
};

#define MAX_PHRASE 54
#if defined(DEBUG_PARSER) || defined(EXTENDED_ERROR_REPORTING)
// FOR DEBUGGING ONLY
char *phrasename[MAX_PHRASE] = { // Based at 512 upwards
  "EOD", "NAME", "N", "OCTAL", 
  "SETMARKER1", "SETMARKER2", "S", "TEXT", 
  "CAPTIONTEXT", "CONST", "SS", "Opt_Plus", 
  "OPERAND", "RESTOF_EXPR", "APP", "RESTOF_EXPR_LIST", 
  "OP", "Opt_QUERY", "Opt_Comma", "Percent_IU", 
  "Opt_Percent_REAL", "TYPE", "Opt_TYPE", "RT", 
  "FP_DELIMITER", "FPP", "RESTOF_FP_LIST", "RESTOF_NAMELIST", 
  "SC", "RESTOF_SC", "RESTOF_COND", "RESTOF_AND_C", 
  "RESTOF_OR_C", "RESTOF_UI", "Opt_Percent_SPEC", "RESTOF_FPP_LIST", 
  "RESTOF_ARRAYLIST", "RESTOF_SWITCHLIST", "COMP", "RESTOF_SS1", 
  "RESTOF_FN_LIST", "RESTOF_FAULTLIST", "UCI", "J_INSTR", 
  "MS_INSTR", "SH_INSTR", "QS_INSTR", "Plus", 
  "Opt_Equals", "Opt_P", "IOM", "ATOF", 
  "E_INSTR", "UI", 
};
#endif /* DEBUG_PARSER */

int phrase_start[MAX_PHRASE-MAX_BIP] = {
    0,   150,   156,   174,   180,   189, 
  197,   209,   213,   217,   222,   226,   231,   237,   248,   266,   275,   283,   289,   304,   311,   321, 
  327,   333,   341,   345,   357,   374,   388,   401,   409,   415,   424,   711,   757,   773,   809,   845, 
  850,   854,   858,   865,   878,   887, 
};

#define P_EOD 512
#define B_EOD 0

#define P_NAME 513
#define B_NAME 1

#define P_N 514
#define B_N 2

#define P_OCTAL 515
#define B_OCTAL 3

#define P_SETMARKER1 516
#define B_SETMARKER1 4

#define P_SETMARKER2 517
#define B_SETMARKER2 5

#define P_S 518
#define B_S 6

#define P_TEXT 519
#define B_TEXT 7

#define P_CAPTIONTEXT 520
#define B_CAPTIONTEXT 8

#define P_CONST 521
#define B_CONST 9

#define P_SS 522
#define P_Opt_Plus 523
#define P_OPERAND 524
#define P_RESTOF_EXPR 525
#define P_APP 526
#define P_RESTOF_EXPR_LIST 527
#define P_OP 528
#define P_Opt_QUERY 529
#define P_Opt_Comma 530
#define P_Percent_IU 531
#define P_Opt_Percent_REAL 532
#define P_TYPE 533
#define P_Opt_TYPE 534
#define P_RT 535
#define P_FP_DELIMITER 536
#define P_FPP 537
#define P_RESTOF_FP_LIST 538
#define P_RESTOF_NAMELIST 539
#define P_SC 540
#define P_RESTOF_SC 541
#define P_RESTOF_COND 542
#define P_RESTOF_AND_C 543
#define P_RESTOF_OR_C 544
#define P_RESTOF_UI 545
#define P_Opt_Percent_SPEC 546
#define P_RESTOF_FPP_LIST 547
#define P_RESTOF_ARRAYLIST 548
#define P_RESTOF_SWITCHLIST 549
#define P_COMP 550
#define P_RESTOF_SS1 551
#define P_RESTOF_FN_LIST 552
#define P_RESTOF_FAULTLIST 553
#define P_UCI 554
#define P_J_INSTR 555
#define P_MS_INSTR 556
#define P_SH_INSTR 557
#define P_QS_INSTR 558
#define P_Plus 559
#define P_Opt_Equals 560
#define P_Opt_P 561
#define P_IOM 562
#define P_ATOF 563
#define P_E_INSTR 564
#define P_UI 565