OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (C) 2009 Google Inc. All rights reserved. | |
3 * | |
4 * Redistribution and use in source and binary forms, with or without | |
5 * modification, are permitted provided that the following conditions are | |
6 * met: | |
7 * | |
8 * * Redistributions of source code must retain the above copyright | |
9 * notice, this list of conditions and the following disclaimer. | |
10 * * Redistributions in binary form must reproduce the above | |
11 * copyright notice, this list of conditions and the following disclaimer | |
12 * in the documentation and/or other materials provided with the | |
13 * distribution. | |
14 * * Neither the name of Google Inc. nor the names of its | |
15 * contributors may be used to endorse or promote products derived from | |
16 * this software without specific prior written permission. | |
17 * | |
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
29 */ | |
30 | |
31 /* | |
32 * Generate js file as follows: | |
33 re2c -isc devtools/front_end/SourceJavaScriptTokenizer.re2js \ | |
34 | sed 's|^yy\([^:]*\)*\:|case \1:|' \ | |
35 | sed 's|[*]cursor[+][+]|this._charAt(cursor++)|' \ | |
36 | sed 's|[[*][+][+]cursor|this._charAt(++cursor)|' \ | |
37 | sed 's|[*]cursor|this._charAt(cursor)|' \ | |
38 | sed 's|yych = \*\([^;]*\)|yych = this._charAt\1|' \ | |
39 | sed 's|goto case \([^;]*\)|{ gotoCase = \1; continue; }|' \ | |
40 | sed 's|yych <= \(0x[0-9a-fA-F]*\)|yych \<\= String.fromCharCode(\1)|' \ | |
41 | sed 's|unsigned\ int|var|' \ | |
42 | sed 's|var\ yych|case 1: var yych|' > devtools/front_end/SourceJavaScriptTok
enizer.js | |
43 */ | |
44 | |
45 /** | |
46 * @constructor | |
47 * @extends {WebInspector.SourceTokenizer} | |
48 */ | |
49 WebInspector.SourceJavaScriptTokenizer = function() | |
50 { | |
51 WebInspector.SourceTokenizer.call(this); | |
52 | |
53 this._lexConditions = { | |
54 DIV: 0, | |
55 NODIV: 1, | |
56 COMMENT: 2, | |
57 DSTRING: 3, | |
58 SSTRING: 4, | |
59 REGEX: 5 | |
60 }; | |
61 | |
62 this.case_DIV = 1000; | |
63 this.case_NODIV = 1001; | |
64 this.case_COMMENT = 1002; | |
65 this.case_DSTRING = 1003; | |
66 this.case_SSTRING = 1004; | |
67 this.case_REGEX = 1005; | |
68 | |
69 this.condition = this.createInitialCondition(); | |
70 } | |
71 | |
72 WebInspector.SourceJavaScriptTokenizer.Keywords = [ | |
73 "null", "true", "false", "break", "case", "catch", "const", "default", "
finally", "for", | |
74 "instanceof", "new", "var", "continue", "function", "return", "void", "d
elete", "if", | |
75 "this", "do", "while", "else", "in", "switch", "throw", "try", "typeof",
"debugger", | |
76 "class", "enum", "export", "extends", "import", "super", "get", "set", "
with" | |
77 ].keySet(); | |
78 | |
79 WebInspector.SourceJavaScriptTokenizer.GlobalObjectValueProperties = { | |
80 "NaN": "javascript-nan", | |
81 "undefined": "javascript-undef", | |
82 "Infinity": "javascript-inf" | |
83 }; | |
84 | |
85 WebInspector.SourceJavaScriptTokenizer.prototype = { | |
86 createInitialCondition: function() | |
87 { | |
88 return { lexCondition: this._lexConditions.NODIV }; | |
89 }, | |
90 | |
91 nextToken: function(cursor) | |
92 { | |
93 var cursorOnEnter = cursor; | |
94 var gotoCase = 1; | |
95 var YYMARKER; | |
96 while (1) { | |
97 switch (gotoCase) | |
98 // Following comment is replaced with generated state machine. | |
99 /*!re2c | |
100 re2c:define:YYCTYPE = "var"; | |
101 re2c:define:YYCURSOR = cursor; | |
102 re2c:define:YYGETCONDITION = "this.getLexCondition"; | |
103 re2c:define:YYSETCONDITION = "this.setLexCondition"; | |
104 re2c:condprefix = "case this.case_"; | |
105 re2c:condenumprefix = "this._lexConditions."; | |
106 re2c:yyfill:enable = 0; | |
107 re2c:labelprefix = "case "; | |
108 re2c:indent:top = 2; | |
109 re2c:indent:string = " "; | |
110 | |
111 LineComment = "//" [^\r\n]*; | |
112 CommentContent = ([^*\r\n] | ("*"+[^/*]))*; | |
113 Comment = "/*" CommentContent "*"+ "/"; | |
114 CommentStart = "/*" CommentContent [\r\n]; | |
115 CommentEnd = CommentContent "*"+ "/"; | |
116 | |
117 DecimalDigit = [0-9]; | |
118 NonZeroDigit = [1-9]; | |
119 OctalDigit = [0-7]; | |
120 HexDigit = [0-9a-fA-F]; | |
121 SignedInteger = ("+"|"-")? DecimalDigit+; | |
122 ExponentPart = ("e" | "E") SignedInteger; | |
123 DecimalIntegerLiteral = "0" | NonZeroDigit DecimalDigit*; | |
124 DecimalLiteral = DecimalIntegerLiteral "." DecimalDigit* Exponen
tPart? | "." DecimalDigit+ ExponentPart? | DecimalIntegerLiteral ExponentPart?; | |
125 HexIntegerLiteral = "0" ("x"|"X") HexDigit+; | |
126 OctalIntegerLiteral = "0" OctalDigit+; | |
127 NumericLiteral = DecimalLiteral | HexIntegerLiteral | OctalInteg
erLiteral; | |
128 | |
129 Punctuation = [\!\%\&\(\*\+\,\-\.\:\;\<\=\>\?\[\]\^\{\|\}\~] | "
!=" | "!==" | "%=" | "&&" | "&=" | "*=" | "++" | "+=" | "--" | "-=" | "<<" | "<<
=" | "<=" | "==" | "===" | ">=" | ">>" | ">>=" | ">>>" | ">>>=" | "^=" | "|=" |
"||"; | |
130 Division = "/" | "/="; | |
131 RightParen = ")"; | |
132 | |
133 Letter = [a-zA-Z\x80-\xFF]; | |
134 UnicodeEscapeSequence = "\\u" HexDigit HexDigit HexDigit HexDigi
t; | |
135 | |
136 IdentifierStart = Letter | "_" | "$" | UnicodeEscapeSequence; | |
137 IdentifierPart = IdentifierStart | DecimalDigit; | |
138 Identifier = IdentifierStart IdentifierPart *; | |
139 Spaces = " "+; | |
140 | |
141 DoubleStringContent = ([^\r\n\"\\] | UnicodeEscapeSequence | "\\
" ['"\\bfnrtv])*; | |
142 SingleStringContent = ([^\r\n\'\\] | UnicodeEscapeSequence | "\\
" ['"\\bfnrtv])*; | |
143 StringLiteral = "\"" DoubleStringContent "\"" | "'" SingleString
Content "'"; | |
144 DoubleStringStart = "\"" DoubleStringContent "\\" [\r\n]; | |
145 DoubleStringEnd = DoubleStringContent "\""; | |
146 SingleStringStart = "'" SingleStringContent "\\" [\r\n]; | |
147 SingleStringEnd = SingleStringContent "'"; | |
148 | |
149 BackslashSequence = "\\" [^\r\n]; | |
150 RegexSet = "[" ([^\r\n*\\/] | BackslashSequence)* "]"; | |
151 RegexFirstChar = [^\r\n*\\/\[\]] | BackslashSequence | RegexSet; | |
152 RegexChar = [^\r\n\\/\[\]] | BackslashSequence | RegexSet; | |
153 RegexContent = RegexChar*; | |
154 Regex = "/" RegexFirstChar RegexContent "/" [igm]*; | |
155 RegexStart = "/" RegexFirstChar RegexContent "\\"; | |
156 RegexEnd = RegexContent "/" [igm]*; | |
157 | |
158 <DIV,NODIV> LineComment { this.tokenType = "javascript-comment";
return cursor; } | |
159 <DIV,NODIV> Comment { this.tokenType = "javascript-comment"; ret
urn cursor; } | |
160 <DIV,NODIV> CommentStart => COMMENT { this.tokenType = "javascri
pt-comment"; return cursor; } | |
161 <COMMENT> CommentContent => COMMENT { this.tokenType = "javascri
pt-comment"; return cursor; } | |
162 <COMMENT> CommentEnd => NODIV { this.tokenType = "javascript-com
ment"; return cursor; } | |
163 | |
164 <DIV,NODIV> Spaces {this.tokenType = "whitespace"; return cursor
; } | |
165 <DIV,NODIV> StringLiteral { this.tokenType = "javascript-string"
; return cursor; } | |
166 <DIV,NODIV> DoubleStringStart => DSTRING { this.tokenType = "jav
ascript-string"; return cursor; } | |
167 <DSTRING> DoubleStringContent => DSTRING { this.tokenType = "jav
ascript-string"; return cursor; } | |
168 <DSTRING> DoubleStringEnd => NODIV { this.tokenType = "javascrip
t-string"; return cursor; } | |
169 <DIV,NODIV> SingleStringStart => SSTRING { this.tokenType = "jav
ascript-string"; return cursor; } | |
170 <SSTRING> SingleStringContent => SSTRING { this.tokenType = "jav
ascript-string"; return cursor; } | |
171 <SSTRING> SingleStringEnd => NODIV { this.tokenType = "javascrip
t-string"; return cursor; } | |
172 | |
173 <NODIV> Regex { this.tokenType = "javascript-regexp"; return cur
sor; } | |
174 <NODIV> RegexStart => REGEX { this.tokenType = "javascript-regex
p"; return cursor; } | |
175 <REGEX> RegexContent => REGEX { this.tokenType = "javascript-reg
exp"; return cursor; } | |
176 <REGEX> RegexEnd => NODIV { this.tokenType = "javascript-regexp"
; return cursor; } | |
177 | |
178 <DIV,NODIV> NumericLiteral => DIV { this.tokenType = "javascript
-number"; return cursor; } | |
179 <DIV,NODIV> Identifier => DIV | |
180 { | |
181 var token = this._line.substring(cursorOnEnter, cursor); | |
182 if (WebInspector.SourceJavaScriptTokenizer.GlobalObjectValue
Properties.hasOwnProperty(token)) | |
183 this.tokenType = WebInspector.SourceJavaScriptTokenizer.
GlobalObjectValueProperties[token]; | |
184 else if (WebInspector.SourceJavaScriptTokenizer.Keywords[tok
en] === true && token !== "__proto__") | |
185 this.tokenType = "javascript-keyword"; | |
186 else | |
187 this.tokenType = "javascript-ident"; | |
188 return cursor; | |
189 } | |
190 <DIV,NODIV> RightParen => DIV { this.tokenType = "brace-end"; re
turn cursor; } | |
191 <DIV,NODIV> Punctuation => NODIV | |
192 { | |
193 var token = this._line.charAt(cursorOnEnter); | |
194 if (token === "{") | |
195 this.tokenType = "block-start"; | |
196 else if (token === "}") | |
197 this.tokenType = "block-end"; | |
198 else if (token === "(") | |
199 this.tokenType = "brace-start"; | |
200 else this.tokenType = null; | |
201 return cursor; | |
202 } | |
203 <DIV> Division => NODIV { this.tokenType = null; return cursor;
} | |
204 <*> [^] { this.tokenType = null; return cursor; } | |
205 */ | |
206 } | |
207 }, | |
208 | |
209 __proto__: WebInspector.SourceTokenizer.prototype | |
210 } | |
OLD | NEW |