#ifndef _KJSLEXER_H_
#define _KJSLEXER_H_
#include "ustring.h"
namespace KJS {
class Identifier;
class RegExp;
class Lexer {
public:
Lexer();
~Lexer();
static Lexer *curr();
void setCode(const UString &sourceURL, int startingLineNumber, const UChar *c, unsigned int len);
int lex();
int lineNo() const { return yylineno; }
UString sourceURL() const { return m_sourceURL; }
bool prevTerminator() const { return terminator; }
enum State { Start,
Identifier,
InIdentifier,
InSingleLineComment,
InMultiLineComment,
InNum,
InNum0,
InHex,
InOctal,
InDecimal,
InExponentIndicator,
InExponent,
Hex,
Octal,
Number,
String,
Eof,
InString,
InEscapeSequence,
InHexEscape,
InUnicodeEscape,
Other,
Bad };
bool scanRegExp();
UString pattern, flags;
private:
int yylineno;
UString m_sourceURL;
bool done;
char *buffer8;
UChar *buffer16;
unsigned int size8, size16;
unsigned int pos8, pos16;
bool terminator;
bool restrKeyword;
bool delimited;
bool skipLF;
bool skipCR;
bool eatNextIdentifier;
int stackToken;
int lastToken;
State state;
void setDone(State s);
unsigned int pos;
void shift(unsigned int p);
void nextLine();
int lookupKeyword(const char *);
bool isWhiteSpace() const;
bool isLineTerminator();
bool isOctalDigit(unsigned short c) const;
int matchPunctuator(unsigned short c1, unsigned short c2,
unsigned short c3, unsigned short c4);
unsigned short singleEscape(unsigned short c) const;
unsigned short convertOctal(unsigned short c1, unsigned short c2,
unsigned short c3) const;
public:
static unsigned char convertHex(unsigned short c1);
static unsigned char convertHex(unsigned short c1, unsigned short c2);
static UChar convertUnicode(unsigned short c1, unsigned short c2,
unsigned short c3, unsigned short c4);
static bool isIdentLetter(unsigned short c);
static bool isDecimalDigit(unsigned short c);
static bool isHexDigit(unsigned short c);
#ifdef KJS_DEBUG_MEM
static void globalClear();
#endif
bool sawError() const { return error; }
void doneParsing();
private:
void record8(unsigned short c);
void record16(UChar c);
KJS::Identifier *makeIdentifier(UChar *buffer, unsigned int pos);
UString *makeUString(UChar *buffer, unsigned int pos);
const UChar *code;
unsigned int length;
int yycolumn;
#ifndef KJS_PURE_ECMA
int bol; #endif
bool error;
unsigned short current, next1, next2, next3;
UString **strings;
unsigned int numStrings;
unsigned int stringsCapacity;
KJS::Identifier **identifiers;
unsigned int numIdentifiers;
unsigned int identifiersCapacity;
class LexerPrivate;
LexerPrivate *priv;
};
};
#endif