2011-04-13 08:42:33 +02:00
|
|
|
/**************************************************************************
|
2010-01-18 13:13:34 +01:00
|
|
|
**
|
2011-04-13 08:42:33 +02:00
|
|
|
** This file is part of Qt Creator
|
2010-01-18 13:13:34 +01:00
|
|
|
**
|
2011-04-13 08:42:33 +02:00
|
|
|
** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
|
2010-01-18 13:13:34 +01:00
|
|
|
**
|
2011-11-02 15:59:12 +01:00
|
|
|
** Contact: Nokia Corporation (qt-info@nokia.com)
|
2010-01-18 13:13:34 +01:00
|
|
|
**
|
2011-05-12 13:25:35 +02:00
|
|
|
**
|
2010-01-18 13:13:34 +01:00
|
|
|
** GNU Lesser General Public License Usage
|
2011-04-13 08:42:33 +02:00
|
|
|
**
|
|
|
|
|
** 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.
|
2010-01-18 13:13:34 +01:00
|
|
|
**
|
|
|
|
|
** In addition, as a special exception, Nokia gives you certain additional
|
2011-04-13 08:42:33 +02:00
|
|
|
** rights. These rights are described in the Nokia Qt LGPL Exception
|
2010-01-18 13:13:34 +01:00
|
|
|
** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
|
|
|
|
|
**
|
2011-04-13 08:42:33 +02:00
|
|
|
** Other Usage
|
2010-01-18 13:13:34 +01:00
|
|
|
**
|
2011-04-13 08:42:33 +02:00
|
|
|
** Alternatively, this file may be used in accordance with the terms and
|
|
|
|
|
** conditions contained in a signed written agreement between you and Nokia.
|
2010-01-18 13:13:34 +01:00
|
|
|
**
|
2011-04-13 08:42:33 +02:00
|
|
|
** If you have questions regarding the use of this file, please contact
|
2011-11-02 15:59:12 +01:00
|
|
|
** Nokia at qt-info@nokia.com.
|
2010-01-18 13:13:34 +01:00
|
|
|
**
|
2011-04-13 08:42:33 +02:00
|
|
|
**************************************************************************/
|
2010-01-18 13:13:34 +01:00
|
|
|
|
|
|
|
|
#ifndef QMLJSLEXER_P_H
|
|
|
|
|
#define QMLJSLEXER_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 "qmljsglobal_p.h"
|
2011-09-13 08:42:52 +02:00
|
|
|
#include "qmljsgrammar_p.h"
|
2010-01-18 13:13:34 +01:00
|
|
|
#include <QtCore/QString>
|
|
|
|
|
|
|
|
|
|
QT_QML_BEGIN_NAMESPACE
|
|
|
|
|
|
|
|
|
|
namespace QmlJS {
|
|
|
|
|
|
|
|
|
|
class Engine;
|
|
|
|
|
|
2011-09-19 14:09:26 +02:00
|
|
|
class QML_PARSER_EXPORT Directives {
|
|
|
|
|
public:
|
|
|
|
|
virtual ~Directives() {}
|
|
|
|
|
|
|
|
|
|
virtual void pragmaLibrary()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
virtual void importFile(const QString &jsfile, const QString &module)
|
|
|
|
|
{
|
|
|
|
|
Q_UNUSED(jsfile);
|
|
|
|
|
Q_UNUSED(module);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
virtual void importModule(const QString &uri, const QString &version, const QString &module)
|
|
|
|
|
{
|
|
|
|
|
Q_UNUSED(uri);
|
|
|
|
|
Q_UNUSED(version);
|
|
|
|
|
Q_UNUSED(module);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
2011-09-13 08:42:52 +02:00
|
|
|
class QML_PARSER_EXPORT Lexer: public QmlJSGrammar
|
2010-01-18 13:13:34 +01:00
|
|
|
{
|
|
|
|
|
public:
|
2011-09-13 08:42:52 +02:00
|
|
|
enum {
|
|
|
|
|
T_ABSTRACT = T_RESERVED_WORD,
|
|
|
|
|
T_BOOLEAN = T_RESERVED_WORD,
|
|
|
|
|
T_BYTE = T_RESERVED_WORD,
|
|
|
|
|
T_CHAR = T_RESERVED_WORD,
|
|
|
|
|
T_CLASS = T_RESERVED_WORD,
|
|
|
|
|
T_DOUBLE = T_RESERVED_WORD,
|
|
|
|
|
T_ENUM = T_RESERVED_WORD,
|
|
|
|
|
T_EXPORT = T_RESERVED_WORD,
|
|
|
|
|
T_EXTENDS = T_RESERVED_WORD,
|
|
|
|
|
T_FINAL = T_RESERVED_WORD,
|
|
|
|
|
T_FLOAT = T_RESERVED_WORD,
|
|
|
|
|
T_GOTO = T_RESERVED_WORD,
|
|
|
|
|
T_IMPLEMENTS = T_RESERVED_WORD,
|
|
|
|
|
T_INT = T_RESERVED_WORD,
|
|
|
|
|
T_INTERFACE = T_RESERVED_WORD,
|
|
|
|
|
T_LET = T_RESERVED_WORD,
|
|
|
|
|
T_LONG = T_RESERVED_WORD,
|
|
|
|
|
T_NATIVE = T_RESERVED_WORD,
|
|
|
|
|
T_PACKAGE = T_RESERVED_WORD,
|
|
|
|
|
T_PRIVATE = T_RESERVED_WORD,
|
|
|
|
|
T_PROTECTED = T_RESERVED_WORD,
|
|
|
|
|
T_SHORT = T_RESERVED_WORD,
|
|
|
|
|
T_STATIC = T_RESERVED_WORD,
|
|
|
|
|
T_SUPER = T_RESERVED_WORD,
|
|
|
|
|
T_SYNCHRONIZED = T_RESERVED_WORD,
|
|
|
|
|
T_THROWS = T_RESERVED_WORD,
|
|
|
|
|
T_TRANSIENT = T_RESERVED_WORD,
|
|
|
|
|
T_VOLATILE = T_RESERVED_WORD,
|
|
|
|
|
T_YIELD = T_RESERVED_WORD
|
|
|
|
|
};
|
2010-01-18 13:13:34 +01:00
|
|
|
|
|
|
|
|
enum Error {
|
|
|
|
|
NoError,
|
|
|
|
|
IllegalCharacter,
|
|
|
|
|
UnclosedStringLiteral,
|
|
|
|
|
IllegalEscapeSequence,
|
|
|
|
|
IllegalUnicodeEscapeSequence,
|
|
|
|
|
UnclosedComment,
|
|
|
|
|
IllegalExponentIndicator,
|
|
|
|
|
IllegalIdentifier
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
enum RegExpBodyPrefix {
|
|
|
|
|
NoPrefix,
|
|
|
|
|
EqualPrefix
|
|
|
|
|
};
|
|
|
|
|
|
2011-09-19 14:09:26 +02:00
|
|
|
enum RegExpFlag {
|
|
|
|
|
RegExp_Global = 0x01,
|
|
|
|
|
RegExp_IgnoreCase = 0x02,
|
|
|
|
|
RegExp_Multiline = 0x04
|
|
|
|
|
};
|
|
|
|
|
|
2011-09-13 08:42:52 +02:00
|
|
|
public:
|
|
|
|
|
Lexer(Engine *engine);
|
|
|
|
|
|
|
|
|
|
QString code() const;
|
|
|
|
|
void setCode(const QString &code, int lineno, bool qmlMode = true);
|
|
|
|
|
|
|
|
|
|
int lex();
|
|
|
|
|
|
2010-01-18 13:13:34 +01:00
|
|
|
bool scanRegExp(RegExpBodyPrefix prefix = NoPrefix);
|
2011-09-19 14:09:26 +02:00
|
|
|
bool scanDirectives(Directives *directives);
|
2010-01-18 13:13:34 +01:00
|
|
|
|
2011-09-13 08:42:52 +02:00
|
|
|
int regExpFlags() const { return _patternFlags; }
|
|
|
|
|
QString regExpPattern() const { return _tokenText; }
|
|
|
|
|
|
2011-09-19 14:09:26 +02:00
|
|
|
int tokenKind() const;
|
2011-09-13 08:42:52 +02:00
|
|
|
int tokenOffset() const;
|
|
|
|
|
int tokenLength() const;
|
2010-01-18 13:13:34 +01:00
|
|
|
|
2011-09-13 08:42:52 +02:00
|
|
|
int tokenStartLine() const;
|
|
|
|
|
int tokenStartColumn() const;
|
2010-01-18 13:13:34 +01:00
|
|
|
|
2011-09-13 08:42:52 +02:00
|
|
|
int tokenEndLine() const;
|
|
|
|
|
int tokenEndColumn() const;
|
2010-01-18 13:13:34 +01:00
|
|
|
|
2011-09-13 08:42:52 +02:00
|
|
|
QStringRef tokenSpell() const;
|
|
|
|
|
double tokenValue() const;
|
|
|
|
|
QString tokenText() const;
|
|
|
|
|
|
|
|
|
|
Error errorCode() const;
|
|
|
|
|
QString errorMessage() const;
|
|
|
|
|
|
|
|
|
|
bool prevTerminator() const;
|
2011-09-19 14:09:26 +02:00
|
|
|
bool followsClosingBrace() const;
|
|
|
|
|
bool canInsertAutomaticSemicolon(int token) const;
|
2011-09-13 08:42:52 +02:00
|
|
|
|
|
|
|
|
enum ParenthesesState {
|
|
|
|
|
IgnoreParentheses,
|
|
|
|
|
CountParentheses,
|
|
|
|
|
BalancedParentheses
|
|
|
|
|
};
|
2010-01-18 13:13:34 +01:00
|
|
|
|
|
|
|
|
private:
|
2011-09-13 08:42:52 +02:00
|
|
|
inline void scanChar();
|
|
|
|
|
int scanToken();
|
|
|
|
|
|
|
|
|
|
int classify(const QChar *s, int n, bool qmlMode);
|
|
|
|
|
|
2010-01-18 13:13:34 +01:00
|
|
|
bool isLineTerminator() const;
|
2011-09-13 08:42:52 +02:00
|
|
|
static bool isIdentLetter(QChar c);
|
2010-01-18 13:13:34 +01:00
|
|
|
static bool isDecimalDigit(ushort c);
|
2011-09-13 08:42:52 +02:00
|
|
|
static bool isHexDigit(QChar c);
|
|
|
|
|
static bool isOctalDigit(ushort c);
|
|
|
|
|
static bool isUnicodeEscapeSequence(const QChar *chars);
|
2010-01-18 13:13:34 +01:00
|
|
|
|
2011-09-13 08:42:52 +02:00
|
|
|
void syncProhibitAutomaticSemicolon();
|
|
|
|
|
QChar decodeUnicodeEscapeCharacter(bool *ok);
|
2010-01-18 13:13:34 +01:00
|
|
|
|
|
|
|
|
private:
|
2011-09-13 08:42:52 +02:00
|
|
|
Engine *_engine;
|
2010-01-18 13:13:34 +01:00
|
|
|
|
2011-09-13 08:42:52 +02:00
|
|
|
QString _code;
|
|
|
|
|
QString _tokenText;
|
|
|
|
|
QString _errorMessage;
|
|
|
|
|
QStringRef _tokenSpell;
|
2010-01-18 13:13:34 +01:00
|
|
|
|
2011-09-13 08:42:52 +02:00
|
|
|
const QChar *_codePtr;
|
|
|
|
|
const QChar *_lastLinePtr;
|
|
|
|
|
const QChar *_tokenLinePtr;
|
|
|
|
|
const QChar *_tokenStartPtr;
|
2010-01-18 13:13:34 +01:00
|
|
|
|
2011-09-13 08:42:52 +02:00
|
|
|
QChar _char;
|
|
|
|
|
Error _errorCode;
|
|
|
|
|
|
|
|
|
|
int _currentLineNumber;
|
|
|
|
|
double _tokenValue;
|
|
|
|
|
|
|
|
|
|
// parentheses state
|
|
|
|
|
ParenthesesState _parenthesesState;
|
|
|
|
|
int _parenthesesCount;
|
2010-01-18 13:13:34 +01:00
|
|
|
|
2011-09-13 08:42:52 +02:00
|
|
|
int _stackToken;
|
2010-01-18 13:13:34 +01:00
|
|
|
|
2011-09-13 08:42:52 +02:00
|
|
|
int _patternFlags;
|
|
|
|
|
int _tokenKind;
|
|
|
|
|
int _tokenLength;
|
|
|
|
|
int _tokenLine;
|
2010-01-18 13:13:34 +01:00
|
|
|
|
2011-09-13 08:42:52 +02:00
|
|
|
bool _validTokenText;
|
|
|
|
|
bool _prohibitAutomaticSemicolon;
|
|
|
|
|
bool _restrictedKeyword;
|
|
|
|
|
bool _terminator;
|
2011-09-19 14:09:26 +02:00
|
|
|
bool _followsClosingBrace;
|
2011-09-13 08:42:52 +02:00
|
|
|
bool _delimited;
|
|
|
|
|
bool _qmlMode;
|
2010-01-18 13:13:34 +01:00
|
|
|
};
|
|
|
|
|
|
2011-09-13 08:42:52 +02:00
|
|
|
} // end of namespace QmlJS
|
2010-01-18 13:13:34 +01:00
|
|
|
|
|
|
|
|
QT_QML_END_NAMESPACE
|
|
|
|
|
|
2011-09-13 08:42:52 +02:00
|
|
|
#endif // LEXER_H
|