Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

248 lines
6.2 KiB

//
// 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__