249 lines
6.2 KiB
C
249 lines
6.2 KiB
C
//
|
|
// Copyright (c) Microsoft Corporation 1995
|
|
//
|
|
// scanner.h
|
|
//
|
|
// Header file for the scanner.
|
|
//
|
|
// History:
|
|
// 04-05-95 ScottH Created
|
|
//
|
|
|
|
#ifndef __SCANNER_H__
|
|
#define __SCANNER_H__
|
|
|
|
//
|
|
// Symbols
|
|
//
|
|
|
|
|
|
typedef enum
|
|
{
|
|
SYM_EOF, // end of file
|
|
SYM_UNKNOWN, // unknown lexeme
|
|
|
|
SYM_COLON, // ':'
|
|
SYM_COMMA, // ','
|
|
|
|
SYM_IDENT, // identifier
|
|
SYM_STRING_LITERAL, // a string literal
|
|
SYM_INT_LITERAL, // an integer literal
|
|
|
|
SYM_INTEGER, // 'integer'
|
|
SYM_STRING, // 'string'
|
|
SYM_BOOLEAN, // 'boolean'
|
|
|
|
SYM_WAITFOR, // 'waitfor'
|
|
SYM_THEN, // 'then'
|
|
SYM_UNTIL, // 'until'
|
|
SYM_TRANSMIT, // 'transmit'
|
|
SYM_PROC, // 'proc'
|
|
SYM_ENDPROC, // 'endproc'
|
|
SYM_DELAY, // 'delay'
|
|
SYM_HALT, // 'halt'
|
|
SYM_GETIP, // 'getip'
|
|
SYM_GOTO, // 'goto'
|
|
SYM_WHILE, // 'while'
|
|
SYM_DO, // 'do'
|
|
SYM_ENDWHILE, // 'endwhile'
|
|
SYM_IF, // 'if'
|
|
SYM_ENDIF, // 'endif'
|
|
|
|
SYM_RAW, // 'raw'
|
|
SYM_MATCHCASE, // 'matchcase'
|
|
|
|
SYM_SET, // 'set'
|
|
|
|
SYM_IPADDR, // 'ipaddr'
|
|
|
|
SYM_PORT, // 'port'
|
|
SYM_DATABITS, // 'databits'
|
|
|
|
SYM_STOPBITS, // 'stopbits'
|
|
|
|
SYM_PARITY, // 'parity'
|
|
SYM_NONE, // 'none'
|
|
SYM_ODD, // 'odd'
|
|
SYM_EVEN, // 'even'
|
|
SYM_MARK, // 'mark'
|
|
SYM_SPACE, // 'space'
|
|
|
|
SYM_SCREEN, // 'screen'
|
|
SYM_KEYBRD, // 'keyboard'
|
|
SYM_ON, // 'on'
|
|
SYM_OFF, // 'off'
|
|
|
|
SYM_LPAREN, // '('
|
|
SYM_RPAREN, // ')'
|
|
SYM_ASSIGN, // = (assignment)
|
|
SYM_TRUE, // 'TRUE'
|
|
SYM_FALSE, // 'FALSE'
|
|
SYM_NOT, // '!'
|
|
|
|
// WARNING: The types below must match the order of their
|
|
// corresponding BOT values.
|
|
|
|
SYM_OR, // 'or'
|
|
SYM_AND, // 'and'
|
|
|
|
SYM_LEQ, // '<='
|
|
SYM_LT, // '<'
|
|
SYM_GEQ, // '>='
|
|
SYM_GT, // '>'
|
|
SYM_NEQ, // '!='
|
|
SYM_EQ, // '=='
|
|
|
|
SYM_PLUS, // '+'
|
|
SYM_MINUS, // '-'
|
|
SYM_MULT, // '*'
|
|
SYM_DIV, // '/'
|
|
} SYM;
|
|
DECLARE_STANDARD_TYPES(SYM);
|
|
|
|
|
|
//
|
|
// Tokens
|
|
//
|
|
|
|
|
|
#define MAX_BUF_KEYWORD 32
|
|
|
|
typedef enum
|
|
{
|
|
TT_BASE,
|
|
TT_SZ,
|
|
TT_INT,
|
|
} TOKTYPE;
|
|
|
|
|
|
// Basic Token Type
|
|
|
|
typedef struct tagTOK
|
|
{
|
|
DWORD cbSize;
|
|
SYM sym;
|
|
TOKTYPE toktype;
|
|
DWORD iLine;
|
|
char szLexeme[MAX_BUF_KEYWORD];
|
|
} TOK; // Basic token type
|
|
DECLARE_STANDARD_TYPES(TOK);
|
|
|
|
#define Tok_GetSize(p) (((PTOK)(p))->cbSize)
|
|
#define Tok_GetSym(p) (((PTOK)(p))->sym)
|
|
#define Tok_GetType(p) (((PTOK)(p))->toktype)
|
|
#define Tok_GetLine(p) (((PTOK)(p))->iLine)
|
|
#define Tok_GetLexeme(p) (((PTOK)(p))->szLexeme)
|
|
|
|
#define Tok_SetSize(p, s) (((PTOK)(p))->cbSize = (s))
|
|
#define Tok_SetSym(p, s) (((PTOK)(p))->sym = (s))
|
|
#define Tok_SetType(p, tt) (((PTOK)(p))->toktype = (tt))
|
|
#define Tok_SetLine(p, l) (((PTOK)(p))->iLine = (l))
|
|
#define Tok_SetLexeme(p, s) lstrcpyn(((PTOK)(p))->szLexeme, s, sizeof(((PTOK)(p))->szLexeme))
|
|
|
|
RES PUBLIC Tok_New(PTOK * pptok, SYM sym, LPCSTR pszLexeme, DWORD iLine);
|
|
void PUBLIC Tok_Delete(PTOK this);
|
|
|
|
|
|
// String Token
|
|
|
|
typedef struct tagTOKSZ
|
|
{
|
|
TOK tok;
|
|
char sz[MAX_BUF];
|
|
} TOKSZ;
|
|
DECLARE_STANDARD_TYPES(TOKSZ);
|
|
|
|
#define TokSz_GetSz(p) (((PTOKSZ)(p))->sz)
|
|
|
|
#define TokSz_SetSz(p, s) lstrcpyn(((PTOKSZ)(p))->sz, s, sizeof(((PTOKSZ)(p))->sz))
|
|
|
|
RES PUBLIC TokSz_New(PTOK * pptok, SYM sym, LPCSTR pszLexeme, DWORD iLine, LPCSTR pszID);
|
|
|
|
|
|
// Integer Token
|
|
|
|
typedef struct tagTOKINT
|
|
{
|
|
TOK tok;
|
|
int n;
|
|
} TOKINT;
|
|
DECLARE_STANDARD_TYPES(TOKINT);
|
|
|
|
#define TokInt_GetVal(p) (((PTOKINT)(p))->n)
|
|
|
|
#define TokInt_SetVal(p, v) (((PTOKINT)(p))->n = (v))
|
|
|
|
RES PUBLIC TokInt_New(PTOK * pptok, SYM sym, LPCSTR pszLexeme, DWORD iLine, int n);
|
|
|
|
//
|
|
// Syntax error object
|
|
//
|
|
|
|
typedef struct tagSTXERR
|
|
{
|
|
char szLexeme[MAX_BUF_KEYWORD];
|
|
DWORD iLine;
|
|
RES res;
|
|
} STXERR;
|
|
DECLARE_STANDARD_TYPES(STXERR);
|
|
|
|
#define Stxerr_GetLexeme(p) ((p)->szLexeme)
|
|
#define Stxerr_GetLine(p) ((p)->iLine)
|
|
#define Stxerr_GetRes(p) ((p)->res)
|
|
|
|
|
|
//
|
|
// Scanner
|
|
//
|
|
|
|
typedef struct tagSCANNER
|
|
{
|
|
DWORD dwFlags; // SCF_*
|
|
|
|
PSESS_CONFIGURATION_INFO psci;
|
|
|
|
char szScript[MAX_PATH];
|
|
HANDLE hfile;
|
|
LPBYTE pbBuffer; // Read buffer
|
|
LPBYTE pbCur; // Current unread position in buffer
|
|
DWORD cbUnread; // Count of unread bytes in buffer
|
|
|
|
char chCur; // Current character, set by Scanner_GetChar()
|
|
char chTailByte; // Tail byte for DBCS characters
|
|
char chUnget; // Ungotten character
|
|
|
|
PTOK ptokCur; // Current token, set by Scanner_GetToken()
|
|
PTOK ptokUnget; // Ungotten token
|
|
|
|
DWORD iLine; // The current line number
|
|
|
|
HSA hsaStxerr; // List of errors
|
|
DWORD isaStxerr; // Current error
|
|
|
|
} SCANNER;
|
|
DECLARE_STANDARD_TYPES(SCANNER);
|
|
|
|
// Scanner flags
|
|
#define SCF_NOSCRIPT 0x0001
|
|
|
|
#define Scanner_GetStxerrHandle(this) ((this)->hsaStxerr)
|
|
|
|
RES PUBLIC Scanner_Create(PSCANNER * ppscanner, PSESS_CONFIGURATION_INFO psci);
|
|
RES PUBLIC Scanner_Destroy(PSCANNER this);
|
|
RES PUBLIC Scanner_OpenScript(PSCANNER this, LPCSTR pszPath);
|
|
|
|
RES PUBLIC Scanner_GetToken(PSCANNER this, PTOK * pptok);
|
|
RES PUBLIC Scanner_UngetToken(PSCANNER this);
|
|
RES PUBLIC Scanner_Peek(PSCANNER this, PSYM psym);
|
|
RES PUBLIC Scanner_ReadToken(PSCANNER this, SYM sym);
|
|
RES PUBLIC Scanner_CondReadToken(PSCANNER this, SYM symExpect, PTOK * pptok);
|
|
DWORD PUBLIC Scanner_GetLine(PSCANNER this);
|
|
|
|
RES PUBLIC Scanner_AddError(PSCANNER this, PTOK ptok, RES resErr);
|
|
|
|
RES PUBLIC Stxerr_ShowErrors(HSA hsaStxerr, HWND hwndOwner);
|
|
RES PUBLIC Stxerr_Add(HSA hsaStxerr, LPCSTR pszLexeme, DWORD iLine, RES resErr);
|
|
RES PUBLIC Stxerr_AddTok(HSA hsaStxerr, PTOK ptok, RES resErr);
|
|
|
|
#endif // __SCANNER_H__
|