#ifndef Lexer_h
#define Lexer_h
#include "SourceCode.h"
#include "ustring.h"
#include <wtf/Vector.h>
namespace KJS {
class Identifier;
class RegExp;
class Lexer : Noncopyable {
public:
void setCode(const SourceCode&);
int lex();
int lineNo() const { return yylineno; }
bool prevTerminator() const { return terminator; }
enum State { Start,
IdentifierOrKeyword,
Identifier,
InIdentifierOrKeyword,
InIdentifier,
InIdentifierStartUnicodeEscapeStart,
InIdentifierStartUnicodeEscape,
InIdentifierPartUnicodeEscapeStart,
InIdentifierPartUnicodeEscape,
InSingleLineComment,
InMultiLineComment,
InNum,
InNum0,
InHex,
InOctal,
InDecimal,
InExponentIndicator,
InExponent,
Hex,
Octal,
Number,
String,
Eof,
InString,
InEscapeSequence,
InHexEscape,
InUnicodeEscape,
Other,
Bad };
bool scanRegExp();
const UString& pattern() const { return m_pattern; }
const UString& flags() const { return m_flags; }
static unsigned char convertHex(int);
static unsigned char convertHex(int c1, int c2);
static UChar convertUnicode(int c1, int c2, int c3, int c4);
static bool isIdentStart(int);
static bool isIdentPart(int);
static bool isHexDigit(int);
bool sawError() const { return error; }
void clear();
SourceCode sourceCode(int openBrace, int closeBrace, int firstLine)
{
return SourceCode(m_source->provider(), m_source->startOffset() + openBrace + 1, m_source->startOffset() + closeBrace, firstLine - 1);
}
private:
friend Lexer& lexer();
Lexer();
int yylineno;
bool done;
Vector<char> m_buffer8;
Vector<UChar> m_buffer16;
bool terminator;
bool restrKeyword;
bool delimited;
bool skipLF;
bool skipCR;
bool eatNextIdentifier;
int stackToken;
int lastToken;
State state;
void setDone(State);
unsigned int pos;
void shift(unsigned int p);
void nextLine();
int lookupKeyword(const char *);
bool isWhiteSpace() const;
bool isLineTerminator();
static bool isOctalDigit(int);
int matchPunctuator(int& charPos, int c1, int c2, int c3, int c4);
static unsigned short singleEscape(unsigned short);
static unsigned short convertOctal(int c1, int c2, int c3);
void record8(int);
void record16(int);
void record16(UChar);
KJS::Identifier* makeIdentifier(const Vector<UChar>& buffer);
UString* makeUString(const Vector<UChar>& buffer);
const SourceCode* m_source;
const UChar* code;
unsigned int length;
int yycolumn;
int atLineStart;
bool error;
int current, next1, next2, next3;
int m_currentOffset;
int m_nextOffset1;
int m_nextOffset2;
int m_nextOffset3;
Vector<UString*> m_strings;
Vector<KJS::Identifier*> m_identifiers;
UString m_pattern;
UString m_flags;
};
Lexer& lexer();
}
#endif // Lexer_h