Changeset 43156 in webkit for trunk/JavaScriptCore/parser/Lexer.h
- Timestamp:
- May 3, 2009, 9:49:35 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/parser/Lexer.h
r43144 r43156 1 1 /* 2 2 * Copyright (C) 1999-2000 Harri Porten ([email protected]) 3 * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.3 * Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved. 4 4 * 5 5 * This library is free software; you can redistribute it and/or … … 23 23 #define Lexer_h 24 24 25 #include "Identifier.h"26 25 #include "Lookup.h" 27 26 #include "SegmentedVector.h" 28 27 #include "SourceCode.h" 28 #include <wtf/ASCIICType.h> 29 29 #include <wtf/Vector.h> 30 30 #include <wtf/unicode/Unicode.h> … … 36 36 class Lexer : Noncopyable { 37 37 public: 38 // Character manipulation functions. 39 static bool isWhiteSpace(int character); 40 static bool isLineTerminator(int character); 41 static unsigned char convertHex(int c1, int c2); 42 static UChar convertUnicode(int c1, int c2, int c3, int c4); 43 44 // Functions to set up parsing. 38 45 void setCode(const SourceCode&); 39 46 void setIsReparsing() { m_isReparsing = true; } 47 48 // Functions for the parser itself. 40 49 int lex(void* lvalp, void* llocp); 50 int lineNumber() const { return m_lineNumber; } 51 bool prevTerminator() const { return m_terminator; } 52 SourceCode sourceCode(int openBrace, int closeBrace, int firstLine); 53 bool scanRegExp(); 54 const UString& pattern() const { return m_pattern; } 55 const UString& flags() const { return m_flags; } 41 56 42 int lineNo() const { return yylineno; } 57 // Functions for use after parsing. 58 bool sawError() const { return m_error; } 59 void clear(); 43 60 44 bool prevTerminator() const { return m_terminator; } 61 private: 62 friend class JSGlobalData; 63 64 Lexer(JSGlobalData*); 65 ~Lexer(); 45 66 46 67 enum State { … … 76 97 }; 77 98 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 SourceCode sourceCode(int openBrace, int closeBrace, int firstLine) { return SourceCode(m_source->provider(), openBrace, closeBrace + 1, firstLine); }93 94 static inline bool isWhiteSpace(int ch)95 {96 return ch == '\t' || ch == 0x0b || ch == 0x0c || WTF::Unicode::isSeparatorSpace(ch);97 }98 99 static inline bool isLineTerminator(int ch)100 {101 return ch == '\r' || ch == '\n' || ch == 0x2028 || ch == 0x2029;102 }103 104 private:105 friend class JSGlobalData;106 Lexer(JSGlobalData*);107 ~Lexer();108 109 99 void setDone(State); 110 void shift(unsigned int p); 100 void shift1(); 101 void shift2(); 102 void shift3(); 103 void shift4(); 111 104 void nextLine(); 112 105 int lookupKeyword(const char *); 113 106 114 bool isWhiteSpace() const;115 107 bool isLineTerminator(); 116 static bool isOctalDigit(int);117 108 118 ALWAYS_INLINE int matchPunctuator(int& charPos, int c1, int c2, int c3, int c4); 119 static unsigned short singleEscape(unsigned short); 120 static unsigned short convertOctal(int c1, int c2, int c3); 109 int matchPunctuator(int& charPos); 121 110 122 111 void record8(int); … … 124 113 void record16(UChar); 125 114 126 ALWAYS_INLINE JSC::Identifier* makeIdentifier(const Vector<UChar>& buffer) 127 { 128 m_identifiers.append(JSC::Identifier(m_globalData, buffer.data(), buffer.size())); 129 return &m_identifiers.last(); 130 } 115 void copyCodeWithoutBOMs(); 116 117 int currentOffset() const; 118 119 JSC::Identifier* makeIdentifier(const Vector<UChar>& buffer); 120 121 bool lastTokenWasRestrKeyword() const; 131 122 132 123 static const size_t initialReadBufferCapacity = 32; 133 124 static const size_t initialIdentifierTableCapacity = 64; 134 125 135 int yylineno; 136 int yycolumn; 126 int m_lineNumber; 137 127 138 128 bool m_done; … … 140 130 Vector<UChar> m_buffer16; 141 131 bool m_terminator; 142 bool m_restrKeyword;143 132 bool m_delimited; // encountered delimiter like "'" and "}" on last run 144 bool m_skipLF; 145 bool m_skipCR; 146 bool m_eatNextIdentifier; 147 int m_stackToken; 133 unsigned char m_skipLineEnd; 148 134 int m_lastToken; 149 135 150 136 State m_state; 151 unsigned int m_position;152 137 const SourceCode* m_source; 153 138 const UChar* m_code; 154 unsigned int m_length; 139 const UChar* m_codeStart; 140 const UChar* m_codeEnd; 155 141 bool m_isReparsing; 156 intm_atLineStart;142 bool m_atLineStart; 157 143 bool m_error; 158 144 … … 163 149 int m_next3; 164 150 165 int m_currentOffset;166 int m_nextOffset1;167 int m_nextOffset2;168 int m_nextOffset3;169 170 151 SegmentedVector<JSC::Identifier, initialIdentifierTableCapacity> m_identifiers; 171 152 … … 175 156 UString m_flags; 176 157 177 const HashTable m_mainTable; 158 const HashTable m_keywordTable; 159 160 Vector<UChar> m_codeWithoutBOMs; 178 161 }; 162 163 inline bool Lexer::isWhiteSpace(int ch) 164 { 165 return isASCII(ch) ? (ch == ' ' || ch == '\t' || ch == 0xB || ch == 0xC) : WTF::Unicode::isSeparatorSpace(ch); 166 } 167 168 inline bool Lexer::isLineTerminator(int ch) 169 { 170 return ch == '\r' || ch == '\n' || ch == 0x2028 || ch == 0x2029; 171 } 172 173 inline unsigned char Lexer::convertHex(int c1, int c2) 174 { 175 return (toASCIIHexValue(c1) << 4) | toASCIIHexValue(c2); 176 } 177 178 inline UChar Lexer::convertUnicode(int c1, int c2, int c3, int c4) 179 { 180 return (convertHex(c1, c2) << 8) | convertHex(c3, c4); 181 } 179 182 180 183 } // namespace JSC
Note:
See TracChangeset
for help on using the changeset viewer.