mirror of
https://github.com/microsoft/Microsoft-3D-Movie-Maker.git
synced 2024-11-25 03:33:22 +01:00
172 lines
3.5 KiB
C++
172 lines
3.5 KiB
C++
/* Copyright (c) Microsoft Corporation.
|
|
Licensed under the MIT License. */
|
|
|
|
/* Copyright (c) Microsoft Corporation.
|
|
Licensed under the MIT License. */
|
|
|
|
/***************************************************************************
|
|
Author: ShonK
|
|
Project: Kauai
|
|
Reviewed:
|
|
Copyright (c) Microsoft Corporation
|
|
|
|
A lexer for command scripts.
|
|
|
|
***************************************************************************/
|
|
#ifndef LEX_H
|
|
#define LEX_H
|
|
|
|
enum
|
|
{
|
|
fctNil = 0, //invalid character
|
|
fctLow = 1, //lowercase letter
|
|
fctUpp = 2, //uppercase letter
|
|
fctOct = 4, //octal
|
|
fctDec = 8, //digit
|
|
fctHex = 16, //hex digit
|
|
fctSpc = 32, //space character
|
|
fctOp1 = 64, //first character of a multi-character operator
|
|
fctOp2 = 128, //last character of a multi-character operator
|
|
fctOpr = 256, //lone character operator
|
|
fctQuo = 512, //quote character
|
|
};
|
|
#define kgrfctDigit (fctOct|fctDec|fctHex)
|
|
|
|
enum
|
|
{
|
|
ttNil,
|
|
ttError, //bad token
|
|
ttLong, //numeric constant
|
|
ttName, //identifier
|
|
ttString, //string constant
|
|
|
|
ttAdd, // +
|
|
ttSub, // -
|
|
ttMul, // *
|
|
ttDiv, // /
|
|
ttMod, // %
|
|
ttInc, // ++
|
|
ttDec, // --
|
|
ttBOr, // |
|
|
ttBAnd, // &
|
|
ttBXor, // ^
|
|
ttBNot, // ~
|
|
ttShr, // >>
|
|
ttShl, // <<
|
|
ttLOr, // ||
|
|
ttLAnd, // &&
|
|
ttLXor, // ^^
|
|
ttEq, // ==
|
|
ttNe, // !=
|
|
ttGt, // >
|
|
ttGe, // >=
|
|
ttLt, // <
|
|
ttLe, // <=
|
|
ttLNot, // !
|
|
ttAssign, // =
|
|
ttAAdd, // +=
|
|
ttASub, // -=
|
|
ttAMul, // *=
|
|
ttADiv, // /=
|
|
ttAMod, // %=
|
|
ttABOr, // |=
|
|
ttABAnd, // &=
|
|
ttABXor, // ^=
|
|
ttAShr, // >>=
|
|
ttAShl, // <<=
|
|
ttArrow, // ->
|
|
ttDot, // .
|
|
ttQuery, // ?
|
|
ttColon, // :
|
|
ttComma, // ,
|
|
ttSemi, // ;
|
|
ttOpenRef, // [
|
|
ttCloseRef, // ]
|
|
ttOpenParen, // (
|
|
ttCloseParen, // )
|
|
ttOpenBrace, // {
|
|
ttCloseBrace, // }
|
|
ttPound, // #
|
|
ttDollar, // $
|
|
ttAt, // @
|
|
ttAccent, // `
|
|
ttBackSlash, // backslash character (\)
|
|
ttScope, // ::
|
|
|
|
ttLimBase
|
|
};
|
|
|
|
|
|
struct TOK
|
|
{
|
|
long tt;
|
|
long lw;
|
|
STN stn;
|
|
};
|
|
typedef TOK *PTOK;
|
|
|
|
|
|
/***************************************************************************
|
|
Base lexer.
|
|
***************************************************************************/
|
|
#define kcchLexbBuf 512
|
|
|
|
typedef class LEXB *PLEXB;
|
|
#define LEXB_PAR BASE
|
|
#define kclsLEXB 'LEXB'
|
|
class LEXB : public LEXB_PAR
|
|
{
|
|
RTCLASS_DEC
|
|
ASSERT
|
|
MARKMEM
|
|
|
|
protected:
|
|
static ushort _mpchgrfct[];
|
|
|
|
PFIL _pfil; //exactly one of _pfil, _pbsf should be non-nil
|
|
PBSF _pbsf;
|
|
STN _stnFile;
|
|
long _lwLine; //which line
|
|
long _ichLine; //which character on the line
|
|
|
|
FP _fpCur;
|
|
FP _fpMac;
|
|
long _ichLim;
|
|
long _ichCur;
|
|
achar _rgch[kcchLexbBuf];
|
|
bool _fLineStart: 1;
|
|
bool _fSkipToNextLine: 1;
|
|
bool _fUnionStrings: 1;
|
|
|
|
ulong _GrfctCh(achar ch)
|
|
{ return (uchar)ch < 128 ? _mpchgrfct[(byte)ch] : fctNil; }
|
|
bool _FFetchRgch(achar *prgch, long cch = 1);
|
|
void _Advance(long cch = 1)
|
|
{ _ichCur += cch; _ichLine += cch; }
|
|
bool _FSkipWhiteSpace(void);
|
|
virtual void _ReadNumber(long *plw, achar ch, long lwBase, long cchMax);
|
|
virtual void _ReadNumTok(PTOK ptok, achar ch, long lwBase, long cchMax)
|
|
{ _ReadNumber(&ptok->lw, ch, lwBase, cchMax); }
|
|
bool _FReadHex(long *plw);
|
|
bool _FReadControlCh(achar *pch);
|
|
|
|
public:
|
|
LEXB(PFIL pfil, bool fUnionStrings = fTrue);
|
|
LEXB(PBSF pbsf, PSTN pstnFile, bool fUnionStrings = fTrue);
|
|
~LEXB(void);
|
|
|
|
virtual bool FGetTok(PTOK ptok);
|
|
virtual long CbExtra(void);
|
|
virtual void GetExtra(void *pv);
|
|
|
|
void GetStnFile(PSTN pstn);
|
|
long LwLine(void)
|
|
{ return _lwLine; }
|
|
long IchLine(void)
|
|
{ return _ichLine; }
|
|
};
|
|
|
|
#endif //!LEX_H
|
|
|
|
|