Type
  TIdentTypes = (
    iNone,
    iString,
    iChar,
    iByte,
    iShort,
    iWord,
    iInteger,
    iLongInt,
    iReal,
    iBool,
    iFile,
    iRecord
  );

  TTokenOpsRec  = (
    opBlockOpen,                 // 1
    opBlockClose,                // 2
    opVarDeclare,                // 3
    opStr,                       // 4
    opChar,                      // 5
    opByte,                      // 6
    opShort,                     // 7
    opWord,                      // 8
    opInt,                       // 9
    opLong,                      // 10
    opReal,                      // 11
    opBool,                      // 12
    opSetVar,                    // 13
    opLeftParan,                 // 14
    opRightParan,                // 15
    opVariable,                  // 16
    opOpenString,                // 17
    opCloseString,               // 18
    opProcDef,                   // 19
    opProcExec,                  // 20
    opParamSep,                  // 21
    opFor,                       // 22
    opTo,                        // 23
    opDownTo,                    // 24
    opTrue,                      // 25
    opFalse,                     // 26
    opEqual,                     // 27
    opNotEqual,                  // 28
    opGreater,                   // 29
    opLess,                      // 30
    opEqGreat,                   // 31
    opEqLess,                    // 32
    opStrAdd,                    // 33
    opProcType,                  // 34
    opIf,                        // 35
    opElse,                      // 36
    opWhile,                     // 37
    opOpenNum,                   // 38
    opCloseNum,                  // 39
    opRepeat,                    // 40
    opNot,                       // 41
    opAnd,                       // 42
    opOr,                        // 43
    opStrArray,                  // 44
    opArrDef,                    // 45
    opStrSize,                   // 46
    opVarNormal,                 // 47
    opGoto,                      // 48
    opHalt,                      // 49
    opCase,                      // 50
    opNumRange,                  // 51
    opTypeRec,                   // 52
    opBreak,                     // 53
    opContinue,                  // 54
    opUses,                      // 55
    opExit,                      // 56
    opNone                       // 57
  );

Const
  mplVer           = '110';
  mplVersion       = '[MPX ' + mplVer +']' + #26;
  mplVerLength     = 10;
  mplExtSource     = '.mps';
  mplExtExecute    = '.mpx';
  mplMaxInclude    = 10;
  mplMaxFiles      = 20;
  mplMaxIdentLen   = 20;
  mplMaxVars       = 2500;
  mplMaxGotos      = 100;
  mplMaxCaseNums   = 20;
  mplMaxVarDeclare = 20;
  mplMaxArrayDem   = 3;   //cannot be changed yet
  mplMaxProcParams = 8;
  mplMaxRecords    = 20;
  mplMaxRecFields  = 40;
  mplMaxDataSize   = 65535;
  mplMaxConsts     = 100;

Const
   chNumber           = ['0'..'9','.'];
   chIdent1           = ['a'..'z','A'..'Z','_'];
   chIdent2           = ['a'..'z','A'..'Z','0'..'9','_'];
   chDigit            = ['0'..'9'];
   chHexDigit         = ['0'..'9','A'..'F','a'..'f'];

{$IFNDEF MPLPARSER}
   mpxEndOfFile       = 1;
   mpxInvalidFile     = 2;
   mpxVerMismatch     = 3;
   mpxUnknownOp       = 4;
   mpxMultiInit       = 5;
   mpxDivisionByZero  = 6;
   mpxMathematical    = 7;
{$ELSE}
   mpsEndOfFile       = 1;
   mpsFileNotfound    = 2;
   mpsFileRecurse     = 3;
   mpsOutputFile      = 4;
   mpsExpected        = 5;
   mpsUnknownIdent    = 6;
   mpsInStatement     = 7;
   mpsIdentTooLong    = 8;
   mpsExpIdentifier   = 9;
   mpsTooManyVars     = 10;
   mpsDupIdent        = 11;
   mpsOverMaxDec      = 12;
   mpsTypeMismatch    = 13;
   mpsSyntaxError     = 14;
   mpsStringNotClosed = 15;
   mpsStringTooLong   = 16;
   mpsTooManyParams   = 17;
   mpsBadProcRef      = 18;
   mpsNumExpected     = 19;
   mpsToOrDowntoExp   = 20;
   mpsExpOperator     = 21;
   mpsOverArrayDim    = 22;
   mpsNoInitArray     = 23;
   mpsTooManyGotos    = 24;
   mpsDupLabel        = 25;
   mpsLabelNotFound   = 26;
   mpsFileParamVar    = 27;
   mpsBadFunction     = 28;
   mpsOperation       = 29;
   mpsOverMaxCase     = 30;
   mpsTooManyFields   = 31;
   mpsDataTooBig      = 32;
   mpsMaxConsts       = 33;
{$ENDIF}

// ==========================================================================

{$IFDEF MPLPARSER}
Type
  TTokenWordRec = (wBlockOpen,    wBlockClose,  wVarDeclare,  wVarSep,
                   wSetVar,       wLeftParan,   wRightParan,  wOpenString,
                   wCloseString,  wStrAdd,      wCharPrefix,  wProcDef,
                   wOpenParam,    wCloseParam,  wParamVar,    wParamSpec,
                   wFuncSpec,     wParamSep,    wFor,         wTo,
                   wDownTo,       wDo,          wTrue,        wFalse,
                   wOpEqual,      wOpNotEqual,  wOpGreater,   wOpLess,
                   wOpEqGreat,    wOpEqLess,    wIf,          wThen,
                   wElse,         wWhile,       wRepeat,      wUntil,
                   wNot,          wAnd,         wOr,          wOpenArray,
                   wCloseArray,   wArrSep,      wVarDef,      wOpenStrSize,
                   wCloseStrSize, wGoto,        wLabel,       wHalt,
                   wVarSep2,      wFuncDef,     wArray,       wCaseStart,
                   wCaseOf,       wNumRange,    wType,        wConst,
                   wBreak,        wContinue,    wUses,        wExit,
                   wHexPrefix,    wExpAnd,      wExpOr,       wExpXor,
                   wExpShl,       wExpShr);
{$ENDIF}


Const
  {$IFDEF MPLPARSER}
     tkv : Array[TIdentTypes] of String[mplMaxIdentLen] = (
             'none',            'string',         'char',       'byte',
             'shortint',        'word',           'integer',    'longint',
             'real',            'boolean',        'file',       'record');

Type
     TTokenWordType = Array[TTokenWordRec] of String[mplMaxIdentLen];

Const
     wTokensPascal : TTokenWordType = (
             'begin',           'end',            'var',        ',',
             ':=',              '(',              ')',          '''',
             '''',              '+',              '#',          'procedure',
             '(',               ')',              '+',          ';',
             ':',               ',',              'for',        'to',
             'downto',          'do',             'true',       'false',
             '=',               '<>',             '>',          '<',
             '>=',              '<=',             'if',         'then',
             'else',            'while',          'repeat',     'until',
             'not',             'and',            'or',         '[',
             ']',               ',',              '=',          '[',
             ']',               'goto',           ':',          'halt',
             ':',               'function',       'array',      'case',
             'of',              '..',             'type',       'const',
             'break',           'continue',       'uses',       'exit',
             '$',               'and',            'or',         'xor',             'shl',            'shr'
           );

     wTokensIPLC : TTokenWordType = (
             '{',               '}',              '@',          ',',
             '=',               '(',              ')',          '"',
             '"',               '+',              '#',          'proc',
             '(',               ')',              '+',          ';',
             ':',               ',',              'for',        'to',
             'downto',          'do',             'true',       'false',
             '==',              '<>',             '>',          '<',
             '>=',              '<=',             'if',         'then',
             'else',            'while',          'repeat',     'until',
             '!',               '&&',             '||',         '(',
             ')',               ',',              '=',          '[',
             ']',               'goto',           ':',          'halt',
             ':',               'func',           'array',      'switch',
             'of',              '..',             'type',       'const',
             'break',           'continue',       'uses',       'exit',
             '$',               '&',              '|',          'xor',             '<<',             '>>'
           );

  {$ENDIF}

  vNums    : Set of TIdentTypes = [iByte, iShort, iWord, iInteger, iLongInt, iReal];
  vStrings : Set of TIdentTypes = [iChar, iString];

Type
  {$IFNDEF MPLPARSER}
    PStack     = ^TStack;
    TStack     = Array[1..mplMaxDataSize] of Byte;
    TArrayInfo = Array[1..mplMaxArrayDem] of Word;

(*
// MEMORY SAVING... could be 28 bytes per var?!?!
// could at least make a procrec that tvarrec links to via a pointer.  would
// save us about 25 bytes per var... which is about half the memory.  we
// could also remove IsProc var in TVar because we could just check to see
// if Proc : Pointer is assigned...
    PProcInfoRec = ^TProcInfoRec;
    TProcInfoRec = Record
      Params    : Array[1..mplMaxProcParams] of Char;
      ParamID   : Array[1..mplMaxProcParams] of Word;
      NumParams : Byte;
      Position  : LongInt;
    End;
*)

    PVarRec = ^TVarRec;
    TVarRec = Record
       VarID     : Word;
       vType     : TIdentTypes;
       Params    : Array[1..mplMaxProcParams] of Char;
       NumParams : Byte;
       pID       : Array[1..mplMaxProcParams] of Word;
       ProcPos   : LongInt;
       DataSize  : Word;
       VarSize   : Word;
       Data      : PStack;
       Kill      : Boolean;
       ArrPos    : Byte;
       ArrDim    : TArrayInfo;
    End;

    PRecordRec = ^TRecordRec;
    TRecordRec = Record
//      RecID     : Word; needed when Record variable type is added
      RecStart  : Word;
      NumFields : Word;
    End;

    VarDataRec = Array[1..mplMaxVars] of PVarRec;
    RecDataRec = Array[1..mplMaxRecords] of PRecordRec;
  {$ELSE}
    PVarRec = ^TVarRec;
    TVarRec = Record
       VarID     : Word;
       Ident     : String[mplMaxIdentLen];
       VType     : TIdentTypes;
       Params    : Array[1..mplMaxProcParams] of Char;
       NumParams : Byte;
       InProc    : Boolean;
       Proc      : Boolean;
       ArrPos    : Byte;
    End;

    PGotoRec = ^TGotoRec;
    TGotoRec = Record
      Ident : String[mplMaxIdentLen];
      xPos  : LongInt;
      Stat  : Byte;
    End;

    VarDataRec = Array[1..mplMaxVars] of PVarRec;
{$ENDIF}