Reviewed by Maciej.
[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 "ustring.h"
28 #include <wtf/Vector.h>
29
30 namespace KJS {
31
32   class Identifier;
33   class RegExp;
34
35   class Lexer : Noncopyable {
36   public:
37     void setCode(int startingLineNumber, const UChar *c, unsigned int len);
38     int lex();
39
40     int lineNo() const { return yylineno; }
41
42     bool prevTerminator() const { return terminator; }
43
44     enum State { Start,
45                  IdentifierOrKeyword,
46                  Identifier,
47                  InIdentifierOrKeyword,
48                  InIdentifier,
49                  InIdentifierUnicodeEscapeStart,
50                  InIdentifierUnicodeEscape,
51                  InSingleLineComment,
52                  InMultiLineComment,
53                  InNum,
54                  InNum0,
55                  InHex,
56                  InOctal,
57                  InDecimal,
58                  InExponentIndicator,
59                  InExponent,
60                  Hex,
61                  Octal,
62                  Number,
63                  String,
64                  Eof,
65                  InString,
66                  InEscapeSequence,
67                  InHexEscape,
68                  InUnicodeEscape,
69                  Other,
70                  Bad };
71
72     bool scanRegExp();
73     const UString& pattern() const { return m_pattern; }
74     const UString& flags() const { return m_flags; }
75
76     static unsigned char convertHex(int);
77     static unsigned char convertHex(int c1, int c2);
78     static UChar convertUnicode(int c1, int c2, int c3, int c4);
79     static bool isIdentStart(int);
80     static bool isIdentPart(int);
81     static bool isHexDigit(int);
82
83     bool sawError() const { return error; }
84
85     void clear();
86
87   private:
88     friend Lexer& lexer();
89     Lexer();
90
91     int yylineno;
92     bool done;
93     Vector<char> m_buffer8;
94     Vector<UChar> m_buffer16;
95     bool terminator;
96     bool restrKeyword;
97     // encountered delimiter like "'" and "}" on last run
98     bool delimited;
99     bool skipLF;
100     bool skipCR;
101     bool eatNextIdentifier;
102     int stackToken;
103     int lastToken;
104
105     State state;
106     void setDone(State);
107     unsigned int pos;
108     void shift(unsigned int p);
109     void nextLine();
110     int lookupKeyword(const char *);
111
112     bool isWhiteSpace() const;
113     bool isLineTerminator();
114     static bool isOctalDigit(int);
115
116     int matchPunctuator(int c1, int c2, int c3, int c4);
117     static unsigned short singleEscape(unsigned short);
118     static unsigned short convertOctal(int c1, int c2, int c3);
119
120     void record8(int);
121     void record16(int);
122     void record16(UChar);
123
124     KJS::Identifier* makeIdentifier(const Vector<UChar>& buffer);
125     UString* makeUString(const Vector<UChar>& buffer);
126
127     const UChar *code;
128     unsigned int length;
129     int yycolumn;
130 #ifndef KJS_PURE_ECMA
131     int bol;     // begin of line
132 #endif
133     bool error;
134
135     // current and following unicode characters (int to allow for -1 for end-of-file marker)
136     int current, next1, next2, next3;
137
138     Vector<UString*> m_strings;
139     Vector<KJS::Identifier*> m_identifiers;
140     
141     UString m_pattern;
142     UString m_flags;
143   };
144   
145   Lexer& lexer(); // Returns the singletone JavaScript lexer.
146
147 } // namespace KJS
148
149 #endif // Lexer_h