|
|
// Copyright (c) 1999 Microsoft Corporation. All rights reserved.
//
// Declaration of Lexer.
//
// Lexical analyzer for AudioVBScript. Breaks down the characters of source code into a stream tokens.
#pragma once
const int g_iMaxBuffer = 256; // max length for VBScript identifiers is 255
enum LexErr { LEXERR_NoError = 0, LEXERR_InvalidCharacter, LEXERR_NonAsciiCharacterInStringLiteral = LEXERR_InvalidCharacter, LEXERR_IdentifierTooLong, LEXERR_StringLiteralTooLong, LEXERR_StringLiteralUnterminated, LEXERR_NumericLiteralTooLarge, LEXERR_Max };
enum Token { TOKEN_eof = 0, // used for end of file or an error (nenzero error_num() indicates an error)
TOKEN_sub, TOKEN_dim, TOKEN_if, TOKEN_then, TOKEN_end, TOKEN_elseif, TOKEN_else, TOKEN_set, TOKEN_call, TOKEN_lparen, TOKEN_rparen, TOKEN_comma, TOKEN_op_minus, TOKEN_op_not, TOKEN_op_pow, TOKEN_op_mult, TOKEN_op_div, TOKEN_op_mod, TOKEN_op_plus, TOKEN_op_lt, TOKEN_op_leq, TOKEN_op_gt, TOKEN_op_geq, TOKEN_op_eq, TOKEN_op_neq, TOKEN_is, TOKEN_and, TOKEN_or, TOKEN_linebreak, TOKEN_identifier, TOKEN_identifierdot, TOKEN_stringliteral, TOKEN_numericliteral };
struct TokenKeysym { WCHAR c; Token t; }; extern const TokenKeysym g_TokenKeysyms[];
struct TokenKeyword { const WCHAR *s; Token t; }; extern const TokenKeyword g_TokenKeywords[];
bool CheckOperatorType(Token t, bool fAcceptParens, bool fAcceptUnary, bool fAcceptBinary, bool fAcceptOverloadedAssignmentTokens);
class Lexer { public: Lexer(const WCHAR *pwszSource);
Lexer &operator++() { Next(); Scan(); return *this; } int line() { return m_iLine; } int column() { return m_iColumn; } operator Token() { return m_t; }
// Additional token-specific info. Only valid while on this token.
// error
int error_num() { assert(m_t == TOKEN_eof); return num(); } // 0 if no error
const char *error_descr() { assert(m_t == TOKEN_eof); return str(); }
// identifier and identifierdot
const char *identifier_name() { assert(m_t == TOKEN_identifier || m_t == TOKEN_identifierdot); return str(); }
// numeric literal
int numericliteral_val() { assert(m_t == TOKEN_numericliteral); return num(); }
// string literal
const char *stringliteral_text() { assert(m_t == TOKEN_stringliteral); return str(); }
private: friend class CActiveScriptError;
void Next(); void Scan(); // handling for line break tokens and calls ScanMain
void ScanMain();
const char *str() { return m_szStr; } // Multipurpose string info set by some tokens.
void err(LexErr iErr); int num() { return m_iNum; } // Multipurpose numeric info set by some tokens.
const WCHAR *m_p; const WCHAR *m_pNext; // If this is set then the next Next call will advance the pointer (and the column) to this point.
int m_iLine; int m_iColumn; Token m_t;
char m_szStr[g_iMaxBuffer]; int m_iNum; };
|