/**************************************************************************** | |
** | |
** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies). | |
** All rights reserved. | |
** Contact: Nokia Corporation (qt-info@nokia.com) | |
** | |
** This file is part of the QtScript module of the Qt Toolkit. | |
** | |
** $QT_BEGIN_LICENSE:LGPL-ONLY$ | |
** GNU Lesser General Public License Usage | |
** This file may be used under the terms of the GNU Lesser | |
** General Public License version 2.1 as published by the Free Software | |
** Foundation and appearing in the file LICENSE.LGPL included in the | |
** packaging of this file. Please review the following information to | |
** ensure the GNU Lesser General Public License version 2.1 requirements | |
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. | |
** | |
** If you have questions regarding the use of this file, please contact | |
** Nokia at qt-info@nokia.com. | |
** $QT_END_LICENSE$ | |
** | |
****************************************************************************/ | |
#ifndef QSCRIPTLEXER_P_H | |
#define QSCRIPTLEXER_P_H | |
// | |
// W A R N I N G | |
// ------------- | |
// | |
// This file is not part of the Qt API. It exists purely as an | |
// implementation detail. This header file may change from version to | |
// version without notice, or even be removed. | |
// | |
// We mean it. | |
// | |
#include <QtCore/QString> | |
QT_BEGIN_NAMESPACE | |
class QScriptEnginePrivate; | |
class QScriptNameIdImpl; | |
namespace QScript { | |
class Lexer | |
{ | |
public: | |
Lexer(QScriptEnginePrivate *eng); | |
~Lexer(); | |
void setCode(const QString &c, int lineno); | |
int lex(); | |
int currentLineNo() const { return yylineno; } | |
int currentColumnNo() const { return yycolumn; } | |
int startLineNo() const { return startlineno; } | |
int startColumnNo() const { return startcolumn; } | |
int endLineNo() const { return currentLineNo(); } | |
int endColumnNo() const | |
{ int col = currentColumnNo(); return (col > 0) ? col - 1 : col; } | |
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 }; | |
enum Error { | |
NoError, | |
IllegalCharacter, | |
UnclosedStringLiteral, | |
IllegalEscapeSequence, | |
IllegalUnicodeEscapeSequence, | |
UnclosedComment, | |
IllegalExponentIndicator, | |
IllegalIdentifier | |
}; | |
enum ParenthesesState { | |
IgnoreParentheses, | |
CountParentheses, | |
BalancedParentheses | |
}; | |
enum RegExpBodyPrefix { | |
NoPrefix, | |
EqualPrefix | |
}; | |
bool scanRegExp(RegExpBodyPrefix prefix = NoPrefix); | |
QScriptNameIdImpl *pattern; | |
int flags; | |
State lexerState() const | |
{ return state; } | |
QString errorMessage() const | |
{ return errmsg; } | |
void setErrorMessage(const QString &err) | |
{ errmsg = err; } | |
void setErrorMessage(const char *err) | |
{ setErrorMessage(QString::fromLatin1(err)); } | |
Error error() const | |
{ return err; } | |
void clearError() | |
{ err = NoError; } | |
private: | |
QScriptEnginePrivate *driver; | |
int yylineno; | |
bool done; | |
char *buffer8; | |
QChar *buffer16; | |
uint size8, size16; | |
uint pos8, pos16; | |
bool terminator; | |
bool restrKeyword; | |
// encountered delimiter like "'" and "}" on last run | |
bool delimited; | |
int stackToken; | |
State state; | |
void setDone(State s); | |
uint pos; | |
void shift(uint p); | |
int lookupKeyword(const char *); | |
bool isWhiteSpace() const; | |
bool isLineTerminator() const; | |
bool isHexDigit(ushort c) const; | |
bool isOctalDigit(ushort c) const; | |
int matchPunctuator(ushort c1, ushort c2, | |
ushort c3, ushort c4); | |
ushort singleEscape(ushort c) const; | |
ushort convertOctal(ushort c1, ushort c2, | |
ushort c3) const; | |
public: | |
static unsigned char convertHex(ushort c1); | |
static unsigned char convertHex(ushort c1, ushort c2); | |
static QChar convertUnicode(ushort c1, ushort c2, | |
ushort c3, ushort c4); | |
static bool isIdentLetter(ushort c); | |
static bool isDecimalDigit(ushort c); | |
inline int ival() const { return qsyylval.ival; } | |
inline double dval() const { return qsyylval.dval; } | |
inline QScriptNameIdImpl *ustr() const { return qsyylval.ustr; } | |
const QChar *characterBuffer() const { return buffer16; } | |
int characterCount() const { return pos16; } | |
private: | |
void record8(ushort c); | |
void record16(QChar c); | |
void recordStartPos(); | |
int findReservedWord(const QChar *buffer, int size) const; | |
void syncProhibitAutomaticSemicolon(); | |
const QChar *code; | |
uint length; | |
int yycolumn; | |
int startlineno; | |
int startcolumn; | |
int bol; // begin of line | |
union { | |
int ival; | |
double dval; | |
QScriptNameIdImpl *ustr; | |
} qsyylval; | |
// current and following unicode characters | |
ushort current, next1, next2, next3; | |
struct keyword { | |
const char *name; | |
int token; | |
}; | |
QString errmsg; | |
Error err; | |
bool wantRx; | |
bool check_reserved; | |
ParenthesesState parenthesesState; | |
int parenthesesCount; | |
bool prohibitAutomaticSemicolon; | |
}; | |
} // namespace QScript | |
QT_END_NAMESPACE | |
#endif |