Reviewed by Eric Seidel.
[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
29 namespace KJS {
30
31   class Identifier;
32   class RegExp;
33
34   class Lexer : Noncopyable {
35   public:
36     void setCode(const UString &sourceURL, int startingLineNumber, const UChar *c, unsigned int len);
37     int lex();
38
39     int lineNo() const { return yylineno; }
40     UString sourceURL() const { return m_sourceURL; }
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     ~Lexer();
91     
92     int yylineno;
93     UString m_sourceURL;
94     bool done;
95     char *buffer8; // FIXME: This buffer is never deallocated.
96     UChar *buffer16; // FIXME: This buffer is never deallocated.
97     unsigned int size8, size16;
98     unsigned int pos8, pos16;
99     bool terminator;
100     bool restrKeyword;
101     // encountered delimiter like "'" and "}" on last run
102     bool delimited;
103     bool skipLF;
104     bool skipCR;
105     bool eatNextIdentifier;
106     int stackToken;
107     int lastToken;
108
109     State state;
110     void setDone(State);
111     unsigned int pos;
112     void shift(unsigned int p);
113     void nextLine();
114     int lookupKeyword(const char *);
115
116     bool isWhiteSpace() const;
117     bool isLineTerminator();
118     static bool isOctalDigit(int);
119
120     int matchPunctuator(int c1, int c2, int c3, int c4);
121     static unsigned short singleEscape(unsigned short);
122     static unsigned short convertOctal(int c1, int c2, int c3);
123
124     void record8(int);
125     void record16(int);
126     void record16(UChar);
127
128     KJS::Identifier *makeIdentifier(UChar *buffer, unsigned int pos);
129     UString *makeUString(UChar *buffer, unsigned int pos);
130
131     const UChar *code;
132     unsigned int length;
133     int yycolumn;
134 #ifndef KJS_PURE_ECMA
135     int bol;     // begin of line
136 #endif
137     bool error;
138
139     // current and following unicode characters (int to allow for -1 for end-of-file marker)
140     int current, next1, next2, next3;
141
142     UString **strings;
143     unsigned int numStrings;
144     unsigned int stringsCapacity;
145
146     KJS::Identifier **identifiers;
147     unsigned int numIdentifiers;
148     unsigned int identifiersCapacity;
149     
150     UString m_pattern;
151     UString m_flags;
152   };
153   
154   Lexer& lexer(); // Returns the singletone JavaScript lexer.
155
156 } // namespace KJS
157
158 #endif // Lexer_h