B<EOD> = 0;
B<NAME> = 1;
B<N> = 2;
B<OCTAL> = 3;
B<SETMARKER1> = 4;
B<SETMARKER2> = 5;
B<S> = 6;
B<TEXT> = 7;
B<CAPTIONTEXT> = 8;
B<CONST> = 9;

P<SS> = 
	 <UI> <SETMARKER2> <RESTOF_SS1>,
	 'cycle' <NAME> <APP> '=' <Opt_Plus> <OPERAND> <RESTOF_EXPR> ',' <Opt_Plus> <OPERAND> <RESTOF_EXPR> ',' <Opt_Plus> <OPERAND> <RESTOF_EXPR> <S>,
	 'repeat' <S>,
	 <N> ':',
	 <Percent_IU> <SC> <RESTOF_COND> 'then' <UI> <S>,
	 '!' <TEXT>,
	 <TYPE> <NAME> <RESTOF_NAMELIST> <S>,
	 'end' <S>,
	 <RT> <Opt_Percent_SPEC> <NAME> <FPP> <S>,
	 'spec' <NAME> <FPP> <S>,
	 'comment' <TEXT>,
	 <Opt_TYPE> 'array' <NAME> <RESTOF_NAMELIST> '(' <Opt_Plus> <OPERAND> <RESTOF_EXPR> ':' <Opt_Plus> <OPERAND> <RESTOF_EXPR> <RESTOF_FPP_LIST> ')' <RESTOF_ARRAYLIST> <S>,
	 '***A' <S>,
	 'begin' <S>,
	 'endofprogram',
	 'uppercasedelimiters' <S>,
	 <NAME> '(' <Opt_Plus> <CONST> '):',
	 'switch' <NAME> <RESTOF_NAMELIST> '(' <Opt_Plus> <CONST> ':' <CONST> ')' <RESTOF_SWITCHLIST> <S>,
	 'compilequeries' <S>,
	 'ignorequeries' <S>,
	 'mcode' <S>,
	 <N> 'P:',
	 '*' <UCI> <S>,
	 'fault' <N> <RESTOF_FN_LIST> '->' <N> <RESTOF_FAULTLIST> <S>,
	 'normaldelimiters' <S>,
	 'strings' <S>,
	 'endofperm' <S>,
	 'endofmcode' <S>,
	 'definecompiler' <S>,
	 <S>;

P<Opt_Plus> = 
	 '+',
	 '-',
	;

P<OPERAND> = 
	 <NAME> <APP>,
	 <CONST>,
	 '(' <Opt_Plus> <OPERAND> <RESTOF_EXPR> ')',
	 '!' <Opt_Plus> <OPERAND> <RESTOF_EXPR> '!';

P<RESTOF_EXPR> = 
	 <OP> <OPERAND> <RESTOF_EXPR>,
	;

P<APP> = 
	 '(' <Opt_Plus> <OPERAND> <RESTOF_EXPR> <RESTOF_EXPR_LIST> ')',
	;

P<RESTOF_EXPR_LIST> = 
	 ',' <Opt_Plus> <OPERAND> <RESTOF_EXPR> <RESTOF_EXPR_LIST>,
	;

P<OP> = 
	 '+',
	 '-',
	 '*',
	 '/',
	 '^',
	;

P<Opt_QUERY> = 
	 '?',
	;

P<Opt_Comma> = 
	 ',',
	;

P<Percent_IU> = 
	 'if',
	 'unless';

P<Opt_Percent_REAL> = 
	 'real',
	;

P<TYPE> = 
	 'integer',
	 'real';

P<Opt_TYPE> = 
	 'integer',
	 'real',
	;

P<RT> = 
	 'routine',
	 'realfn',
	 'integerfn',
	 'realmap',
	 'integermap';

P<FP_DELIMITER> = 
	 <RT>,
	 'integerarrayname',
	 'integername',
	 'integer',
	 <Opt_Percent_REAL> 'arrayname',
	 'realname',
	 'real',
	 'addr';

P<FPP> = 
	 '(' <FP_DELIMITER> <NAME> <RESTOF_NAMELIST> <RESTOF_FP_LIST> ')',
	;

P<RESTOF_FP_LIST> = 
	 <Opt_Comma> <FP_DELIMITER> <NAME> <RESTOF_NAMELIST> <RESTOF_FP_LIST>,
	;

P<RESTOF_NAMELIST> = 
	 ',' <NAME> <RESTOF_NAMELIST>,
	;

P<SC> = 
	 <Opt_Plus> <OPERAND> <RESTOF_EXPR> <COMP> <Opt_Plus> <OPERAND> <RESTOF_EXPR> <RESTOF_SC>,
	 '(' <SC> <RESTOF_COND> ')';

P<RESTOF_SC> = 
	 <COMP> <Opt_Plus> <OPERAND> <RESTOF_EXPR>,
	;

P<RESTOF_COND> = 
	 'and' <SC> <RESTOF_AND_C>,
	 'or' <SC> <RESTOF_OR_C>,
	;

P<RESTOF_AND_C> = 
	 'and' <SC> <RESTOF_AND_C>,
	;

P<RESTOF_OR_C> = 
	 'or' <SC> <RESTOF_OR_C>,
	;

P<RESTOF_UI> = 
	 '=' <Opt_Plus> <OPERAND> <RESTOF_EXPR> <Opt_QUERY>,
	;

P<Opt_Percent_SPEC> = 
	 'spec',
	;

P<RESTOF_FPP_LIST> = 
	 ',' <Opt_Plus> <OPERAND> <RESTOF_EXPR> ':' <Opt_Plus> <OPERAND> <RESTOF_EXPR> <RESTOF_FPP_LIST>,
	;

P<RESTOF_ARRAYLIST> = 
	 ',' <NAME> <RESTOF_NAMELIST> '(' <Opt_Plus> <OPERAND> <RESTOF_EXPR> ':' <Opt_Plus> <OPERAND> <RESTOF_EXPR> <RESTOF_FPP_LIST> ')' <RESTOF_ARRAYLIST>,
	;

P<RESTOF_SWITCHLIST> = 
	 ',' <NAME> <RESTOF_NAMELIST> '(' <Opt_Plus> <CONST> ':' <Opt_Plus> <CONST> ')' <RESTOF_SWITCHLIST>,
	;

P<COMP> = 
	 '=',
	 '>=',
	 '>',
	 '#',
	 '<=',
	 '<';

P<RESTOF_SS1> = 
	 <S>,
	 <Percent_IU> <SC> <RESTOF_COND> <S>;

P<RESTOF_FN_LIST> = 
	 ',' <N> <RESTOF_FN_LIST>,
	;

P<RESTOF_FAULTLIST> = 
	 ',' <N> <RESTOF_FN_LIST> '->' <N> <RESTOF_FAULTLIST>,
	;

P<UCI> = 
	 '*@' <NAME> <APP>,
	 '*' <Opt_Equals> <NAME> <APP>,
	 'J' <N> <Opt_P> <J_INSTR>,
	 'SETB' <OCTAL>,
	 'SET' <N> 'P:',
	 'JS' <N> <Opt_P>,
	 'EXIT' <N>,
	 <Opt_Equals> 'M' <N> 'M' <N> <MS_INSTR>,
	 'SH' <SH_INSTR>,
	 '=' <QS_INSTR>,
	 'Q' <N> 'TOQ' <N>,
	 'C' <N> 'TOQ' <N>,
	 'I' <N> 'TOQ' <N>,
	 'M' <N> 'TOQ' <N>,
	 'IM' <N> 'TOQ' <N>,
	 'CM' <N> 'TOQ' <N>,
	 'CI' <N> 'TOQ' <N>,
	 'I' <N> '=' <Opt_Plus> <N>,
	 'Q' <N>,
	 'C' <N>,
	 'I' <N>,
	 'M' <N>,
	 'NC' <N>,
	 'DC' <N>,
	 'LINK',
	 'M' <Plus> 'I' <N>,
	 'X+' <Opt_Plus> <N>,
	 'X+C' <N>,
	 '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',
	 'X+',
	 '=TR',
	 'BITS',
	 'DUMMY',
	 'PERM',
	 'TOP',
	 'OR',
	 'VR',
	 'NEV',
	 'NOT',
	 'FIX',
	 'STR',
	 'CONT',
	 'AND',
	 'EXIT',
	 'OUT',
	 'X',
	 'P' <IOM> <ATOF> 'Q' <N>,
	 'TLOG' <N>,
	 'INTQ' <N>,
	 'PARQ' <N>,
	 'BUSYQ' <N>,
	 'MANUALQ' <N>,
	 'CTQ' <N>,
	 'CLOQ' <N>,
	 'SET' <Opt_Plus> <N>,
	 'ADVCA' <N>,
	 <OCTAL> '/' <OCTAL> '/' <OCTAL>,
	 <Opt_Equals> 'F' <N> <E_INSTR>,
	 'JSE' <N>,
	 'JE' <N>,
	;

P<J_INSTR> = 
	 'C' <N> 'NZS',
	 'C' <N> 'NZ',
	 'C' <N> 'Z',
	 '=Z',
	 '=',
	 '#Z',
	 '#',
	 '>Z',
	 '>=Z',
	 '<Z',
	 '<=Z',
	 'V',
	 'NV',
	 'EN',
	 'NEN',
	 'FJ',
	 'NFJ',
	 'TR',
	 'NTR',
	;

P<MS_INSTR> = 
	 'QHN',
	 'QH',
	 'QN',
	 'Q',
	 'HN',
	 'H',
	 'N',
	;

P<SH_INSTR> = 
	 'A' <Opt_Plus> <N>,
	 'AD' <Opt_Plus> <N>,
	 'L' <Opt_Plus> <N>,
	 'LD' <Opt_Plus> <N>,
	 'C' <Opt_Plus> <N>,
	 'AC' <N>,
	 'ADC' <N>,
	 'LC' <N>,
	 'LDC' <N>,
	 'CC' <N>;

P<QS_INSTR> = 
	 'LINK',
	 'Q' <N>,
	 'C' <N>,
	 'I' <N>,
	 'M' <N>,
	 'RC' <N>,
	 'RI' <N>,
	 'RM' <N>,
	 '+Q' <N>,
	 '+C' <N>,
	 '+I' <N>,
	 '+M' <N>;

P<Plus> = 
	 '+',
	 '-';

P<Opt_Equals> = 
	 '=',
	;

P<Opt_P> = 
	 'P',
	;

P<IOM> = 
	 'I',
	 'O',
	 'M';

P<ATOF> = 
	 'A',
	 'B',
	 'C',
	 'D',
	 'E',
	 'F';

P<E_INSTR> = 
	 'M' <N> 'Q',
	 'M' <N>,
	;

P<UI> = 
	 <NAME> <APP> <SETMARKER1> <RESTOF_UI>,
	 '->' <N>,
	 'caption' <CAPTIONTEXT>,
	 'return',
	 'result' '=' <Opt_Plus> <OPERAND> <RESTOF_EXPR>,
	 'stop',
	 '->' <NAME> '(' <Opt_Plus> <OPERAND> <RESTOF_EXPR> ')',
	 'monitor' <N>;

E
