Reviewed by Oliver.
[WebKit-https.git] / JavaScriptCore / kjs / lexer.h
1 // -*- c-basic-offset: 2 -*-
2 /*
3  *  This file is part of the KDE libraries
4  *  Copyright (C) 1999-2000 Harri Porten (porten@kde.org)
5  *  Copyright (C) 2007 Apple Inc.
6  *
7  *  This library is free software; you can redistribute it and/or
8  *  modify it under the terms of the GNU Library General Public
9  *  License as published by the Free Software Foundation; either
10  *  version 2 of the License, or (at your option) any later version.
11  *
12  *  This library is distributed in the hope that it will be useful,
13  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  *  Library General Public License for more details.
16  *
17  *  You should have received a copy of the GNU Library General Public License
18  *  along with this library; see the file COPYING.LIB.  If not, write to
19  *  the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  *  Boston, MA 02110-1301, USA.
21  *
22  */
23
24 #ifndef Lexer_h
25 #define Lexer_h
26
27 #include "lookup.h"
28 #include "ustring.h"
29 #include <wtf/Vector.h>
30 #include "SourceRange.h"
31
32 namespace KJS {
33
34     class Identifier;
35     class RegExp;
36
37     class Lexer : Noncopyable {
38     public:
39         void setCode(int startingLineNumber, PassRefPtr<SourceProvider> source);
40         int lex(void* lvalp, void* llocp);
41
42         int lineNo() const { return yylineno; }
43
44         bool prevTerminator() const { return m_terminator; }
45
46         enum State {
47             Start,
48             IdentifierOrKeyword,
49             Identifier,
50             InIdentifierOrKeyword,
51             InIdentifier,
52             InIdentifierStartUnicodeEscapeStart,
53             InIdentifierStartUnicodeEscape,
54             InIdentifierPartUnicodeEscapeStart,
55             InIdentifierPartUnicodeEscape,
56             InSingleLineComment,
57             InMultiLineComment,
58             InNum,
59             InNum0,
60             InHex,
61             InOctal,
62             InDecimal,
63             InExponentIndicator,
64             InExponent,
65             Hex,
66             Octal,
67             Number,
68             String,
69             Eof,
70             InString,
71             InEscapeSequence,
72             InHexEscape,
73             InUnicodeEscape,
74             Other,
75             Bad
76         };
77
78         bool scanRegExp();
79         const UString& pattern() const { return m_pattern; }
80         const UString& flags() const { return m_flags; }
81
82         static unsigned char convertHex(int);
83         static unsigned char convertHex(int c1, int c2);
84         static UChar convertUnicode(int c1, int c2, int c3, int c4);
85         static bool isIdentStart(int);
86         static bool isIdentPart(int);
87         static bool isHexDigit(int);
88
89         bool sawError() const { return m_error; }
90
91         void clear();
92         SourceRange sourceRange(int openBrace, int closeBrace) { return SourceRange(m_source, openBrace + 1, closeBrace); }
93
94     private:
95         friend class JSGlobalData;
96         Lexer(JSGlobalData*);
97         ~Lexer();
98
99         void setDone(State);
100         void shift(unsigned int p);
101         void nextLine();
102         int lookupKeyword(const char *);
103
104         bool isWhiteSpace() const;
105         bool isLineTerminator();
106         static bool isOctalDigit(int);
107
108         int matchPunctuator(int& charPos, int c1, int c2, int c3, int c4);
109         static unsigned short singleEscape(unsigned short);
110         static unsigned short convertOctal(int c1, int c2, int c3);
111
112         void record8(int);
113         void record16(int);
114         void record16(UChar);
115
116         KJS::Identifier* makeIdentifier(const Vector<UChar>& buffer);
117         UString* makeUString(const Vector<UChar>& buffer);
118
119         int yylineno;
120         int yycolumn;
121
122         bool m_done;
123         Vector<char> m_buffer8;
124         Vector<UChar> m_buffer16;
125         bool m_terminator;
126         bool m_restrKeyword;
127         bool m_delimited; // encountered delimiter like "'" and "}" on last run
128         bool m_skipLF;
129         bool m_skipCR;
130         bool m_eatNextIdentifier;
131         int m_stackToken;
132         int m_lastToken;
133
134         State m_state;
135         unsigned int m_position;
136         RefPtr<SourceProvider> m_source;
137         const UChar* m_code;
138         unsigned int m_length;
139         int m_atLineStart;
140         bool m_error;
141
142         // current and following unicode characters (int to allow for -1 for end-of-file marker)
143         int m_current;
144         int m_next1;
145         int m_next2;
146         int m_next3;
147         
148         int m_currentOffset;
149         int m_nextOffset1;
150         int m_nextOffset2;
151         int m_nextOffset3;
152         
153         Vector<UString*> m_strings;
154         Vector<KJS::Identifier*> m_identifiers;
155
156         JSGlobalData* m_globalData;
157
158         UString m_pattern;
159         UString m_flags;
160
161         const HashTable m_mainTable;
162     };
163
164 } // namespace KJS
165
166 #endif // Lexer_h