1 /* Generated by re2c 0.13.5 on Fri May 6 13:47:06 2011 */
3 * Copyright (C) 2009 Google Inc. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above
12 * copyright notice, this list of conditions and the following disclaimer
13 * in the documentation and/or other materials provided with the
15 * * Neither the name of Google Inc. nor the names of its
16 * contributors may be used to endorse or promote products derived from
17 * this software without specific prior written permission.
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 // Generate js file as follows:
34 // re2c -isc WebCore/inspector/front-end/SourceHTMLTokenizer.re2js \
35 // | sed 's|^yy\([^:]*\)*\:|case \1:|' \
36 // | sed 's|[*]cursor[+][+]|this._charAt(cursor++)|' \
37 // | sed 's|[[*][+][+]cursor|this._charAt(++cursor)|' \
38 // | sed 's|[*]cursor|this._charAt(cursor)|' \
39 // | sed 's|yych = \*\([^;]*\)|yych = this._charAt\1|' \
40 // | sed 's|{ gotoCase = \([^; continue; };]*\)|{ gotoCase = \1; continue; }|' \
41 // | sed 's|unsigned\ int|var|' \
42 // | sed 's|var\ yych|case 1: case 1: var yych|'
44 WebInspector.SourceHTMLTokenizer = function()
46 WebInspector.SourceTokenizer.call(this);
48 // The order is determined by the generated code.
49 this._lexConditions = {
57 this.case_INITIAL = 1000;
58 this.case_COMMENT = 1001;
59 this.case_DOCTYPE = 1002;
61 this.case_DSTRING = 1004;
62 this.case_SSTRING = 1005;
64 this._parseConditions = {
74 this.condition = this.createInitialCondition();
77 WebInspector.SourceHTMLTokenizer.prototype = {
78 createInitialCondition: function()
80 return { lexCondition: this._lexConditions.INITIAL, parseCondition: this._parseConditions.INITIAL };
84 if (this._condition.internalJavaScriptTokenizerCondition) {
85 var match = /<\/script/i.exec(line);
87 this._internalJavaScriptTokenizer.line = line.substring(0, match.index);
89 this._internalJavaScriptTokenizer.line = line;
90 } else if (this._condition.internalCSSTokenizerCondition) {
91 var match = /<\/style/i.exec(line);
93 this._internalCSSTokenizer.line = line.substring(0, match.index);
95 this._internalCSSTokenizer.line = line;
100 _isExpectingAttribute: function()
102 return this._condition.parseCondition & this._parseConditions.ATTRIBUTE;
105 _isExpectingAttributeValue: function()
107 return this._condition.parseCondition & this._parseConditions.ATTRIBUTE_VALUE;
110 _setExpectingAttribute: function()
112 if (this._isExpectingAttributeValue())
113 this._condition.parseCondition ^= this._parseConditions.ATTRIBUTE_VALUE;
114 this._condition.parseCondition |= this._parseConditions.ATTRIBUTE;
117 _setExpectingAttributeValue: function()
119 if (this._isExpectingAttribute())
120 this._condition.parseCondition ^= this._parseConditions.ATTRIBUTE;
121 this._condition.parseCondition |= this._parseConditions.ATTRIBUTE_VALUE;
124 _stringToken: function(cursor, stringEnds)
126 if (!this._isExpectingAttributeValue()) {
127 this.tokenType = null;
130 this.tokenType = this._attrValueTokenType();
132 this._setExpectingAttribute();
136 _attrValueTokenType: function()
138 if (this._condition.parseCondition & this._parseConditions.LINKIFY) {
139 if (this._condition.parseCondition & this._parseConditions.A_NODE)
140 return "html-external-link";
141 return "html-resource-link";
143 return "html-attribute-value";
146 get _internalJavaScriptTokenizer()
148 return WebInspector.SourceTokenizer.Registry.getInstance().getTokenizer("text/javascript");
151 get _internalCSSTokenizer()
153 return WebInspector.SourceTokenizer.Registry.getInstance().getTokenizer("text/css");
156 scriptStarted: function(cursor)
158 this._condition.internalJavaScriptTokenizerCondition = this._internalJavaScriptTokenizer.createInitialCondition();
161 scriptEnded: function(cursor)
165 styleSheetStarted: function(cursor)
167 this._condition.internalCSSTokenizerCondition = this._internalCSSTokenizer.createInitialCondition();
170 styleSheetEnded: function(cursor)
174 nextToken: function(cursor)
176 if (this._condition.internalJavaScriptTokenizerCondition) {
177 // Re-set line to force </script> detection first.
178 this.line = this._line;
179 if (cursor !== this._internalJavaScriptTokenizer._line.length) {
180 // Tokenizer is stateless, so restore its condition before tokenizing and save it after.
181 this._internalJavaScriptTokenizer.condition = this._condition.internalJavaScriptTokenizerCondition;
182 var result = this._internalJavaScriptTokenizer.nextToken(cursor);
183 this.tokenType = this._internalJavaScriptTokenizer.tokenType;
184 this._condition.internalJavaScriptTokenizerCondition = this._internalJavaScriptTokenizer.condition;
186 } else if (cursor !== this._line.length)
187 delete this._condition.internalJavaScriptTokenizerCondition;
188 } else if (this._condition.internalCSSTokenizerCondition) {
189 // Re-set line to force </style> detection first.
190 this.line = this._line;
191 if (cursor !== this._internalCSSTokenizer._line.length) {
192 // Tokenizer is stateless, so restore its condition before tokenizing and save it after.
193 this._internalCSSTokenizer.condition = this._condition.internalCSSTokenizerCondition;
194 var result = this._internalCSSTokenizer.nextToken(cursor);
195 this.tokenType = this._internalCSSTokenizer.tokenType;
196 this._condition.internalCSSTokenizerCondition = this._internalCSSTokenizer.condition;
198 } else if (cursor !== this._line.length)
199 delete this._condition.internalCSSTokenizerCondition;
202 var cursorOnEnter = cursor;
206 // Following comment is replaced with generated state machine.
211 if (this.getLexCondition() < 3) {
212 if (this.getLexCondition() < 1) {
213 { gotoCase = this.case_INITIAL; continue; };
215 if (this.getLexCondition() < 2) {
216 { gotoCase = this.case_COMMENT; continue; };
218 { gotoCase = this.case_DOCTYPE; continue; };
222 if (this.getLexCondition() < 4) {
223 { gotoCase = this.case_TAG; continue; };
225 if (this.getLexCondition() < 5) {
226 { gotoCase = this.case_DSTRING; continue; };
228 { gotoCase = this.case_SSTRING; continue; };
232 /* *********************************** */
233 case this.case_COMMENT:
235 yych = this._charAt(cursor);
237 if (yych == '\n') { gotoCase = 4; continue; };
238 { gotoCase = 3; continue; };
240 if (yych <= '\r') { gotoCase = 4; continue; };
241 if (yych == '-') { gotoCase = 6; continue; };
242 { gotoCase = 3; continue; };
245 { this.tokenType = "html-comment"; return cursor; }
248 yych = this._charAt(YYMARKER = ++cursor);
249 { gotoCase = 9; continue; };
253 { this.tokenType = null; return cursor; }
256 yych = this._charAt(YYMARKER = ++cursor);
257 if (yych != '-') { gotoCase = 5; continue; };
260 yych = this._charAt(cursor);
261 if (yych == '>') { gotoCase = 10; continue; };
265 yych = this._charAt(cursor);
268 if (yych == '\n') { gotoCase = 2; continue; };
269 { gotoCase = 8; continue; };
271 if (yych <= '\r') { gotoCase = 2; continue; };
272 if (yych == '-') { gotoCase = 12; continue; };
273 { gotoCase = 8; continue; };
277 this.setLexCondition(this._lexConditions.INITIAL);
278 { this.tokenType = "html-comment"; return cursor; }
281 yych = this._charAt(cursor);
282 if (yych == '-') { gotoCase = 7; continue; };
285 { gotoCase = 2; continue; };
287 { gotoCase = 5; continue; };
289 /* *********************************** */
290 case this.case_DOCTYPE:
291 yych = this._charAt(cursor);
293 if (yych == '\n') { gotoCase = 18; continue; };
294 { gotoCase = 17; continue; };
296 if (yych <= '\r') { gotoCase = 18; continue; };
297 if (yych == '>') { gotoCase = 20; continue; };
298 { gotoCase = 17; continue; };
301 { this.tokenType = "html-doctype"; return cursor; }
303 yych = this._charAt(++cursor);
304 { gotoCase = 23; continue; };
307 { this.tokenType = null; return cursor; }
310 this.setLexCondition(this._lexConditions.INITIAL);
311 { this.tokenType = "html-doctype"; return cursor; }
314 yych = this._charAt(cursor);
317 if (yych == '\n') { gotoCase = 16; continue; };
318 { gotoCase = 22; continue; };
320 if (yych <= '\r') { gotoCase = 16; continue; };
321 if (yych == '>') { gotoCase = 16; continue; };
322 { gotoCase = 22; continue; };
324 /* *********************************** */
325 case this.case_DSTRING:
326 yych = this._charAt(cursor);
328 if (yych == '\n') { gotoCase = 28; continue; };
329 { gotoCase = 27; continue; };
331 if (yych <= '\r') { gotoCase = 28; continue; };
332 if (yych == '"') { gotoCase = 30; continue; };
333 { gotoCase = 27; continue; };
336 { return this._stringToken(cursor); }
338 yych = this._charAt(++cursor);
339 { gotoCase = 34; continue; };
342 { this.tokenType = null; return cursor; }
346 this.setLexCondition(this._lexConditions.TAG);
347 { return this._stringToken(cursor, true); }
349 yych = this._charAt(++cursor);
350 { gotoCase = 31; continue; };
353 yych = this._charAt(cursor);
356 if (yych == '\n') { gotoCase = 26; continue; };
357 { gotoCase = 33; continue; };
359 if (yych <= '\r') { gotoCase = 26; continue; };
360 if (yych == '"') { gotoCase = 32; continue; };
361 { gotoCase = 33; continue; };
363 /* *********************************** */
364 case this.case_INITIAL:
365 yych = this._charAt(cursor);
366 if (yych == '<') { gotoCase = 39; continue; };
368 { this.tokenType = null; return cursor; }
371 yych = this._charAt(YYMARKER = ++cursor);
373 if (yych == '!') { gotoCase = 44; continue; };
374 if (yych >= '/') { gotoCase = 41; continue; };
377 if (yych >= 'S') { gotoCase = 42; continue; };
379 if (yych == 's') { gotoCase = 42; continue; };
383 this.setLexCondition(this._lexConditions.TAG);
385 if (this._condition.parseCondition & (this._parseConditions.SCRIPT | this._parseConditions.STYLE)) {
386 // Do not tokenize script and style tag contents, keep lexer state, even though processing "<".
387 this.setLexCondition(this._lexConditions.INITIAL);
388 this.tokenType = null;
392 this._condition.parseCondition = this._parseConditions.INITIAL;
393 this.tokenType = "html-tag";
398 yych = this._charAt(YYMARKER = ++cursor);
399 if (yych == 'S') { gotoCase = 73; continue; };
400 if (yych == 's') { gotoCase = 73; continue; };
401 { gotoCase = 40; continue; };
403 yych = this._charAt(++cursor);
405 if (yych == 'C') { gotoCase = 62; continue; };
406 if (yych >= 'T') { gotoCase = 63; continue; };
409 if (yych >= 'c') { gotoCase = 62; continue; };
411 if (yych == 't') { gotoCase = 63; continue; };
416 { gotoCase = 40; continue; };
418 yych = this._charAt(++cursor);
420 if (yych != '-') { gotoCase = 43; continue; };
422 if (yych <= 'D') { gotoCase = 46; continue; };
423 if (yych == 'd') { gotoCase = 46; continue; };
424 { gotoCase = 43; continue; };
426 yych = this._charAt(++cursor);
427 if (yych == '-') { gotoCase = 54; continue; };
428 { gotoCase = 43; continue; };
430 yych = this._charAt(++cursor);
431 if (yych == 'O') { gotoCase = 47; continue; };
432 if (yych != 'o') { gotoCase = 43; continue; };
434 yych = this._charAt(++cursor);
435 if (yych == 'C') { gotoCase = 48; continue; };
436 if (yych != 'c') { gotoCase = 43; continue; };
438 yych = this._charAt(++cursor);
439 if (yych == 'T') { gotoCase = 49; continue; };
440 if (yych != 't') { gotoCase = 43; continue; };
442 yych = this._charAt(++cursor);
443 if (yych == 'Y') { gotoCase = 50; continue; };
444 if (yych != 'y') { gotoCase = 43; continue; };
446 yych = this._charAt(++cursor);
447 if (yych == 'P') { gotoCase = 51; continue; };
448 if (yych != 'p') { gotoCase = 43; continue; };
450 yych = this._charAt(++cursor);
451 if (yych == 'E') { gotoCase = 52; continue; };
452 if (yych != 'e') { gotoCase = 43; continue; };
455 this.setLexCondition(this._lexConditions.DOCTYPE);
456 { this.tokenType = "html-doctype"; return cursor; }
459 yych = this._charAt(cursor);
461 if (yych == '\n') { gotoCase = 57; continue; };
462 { gotoCase = 54; continue; };
464 if (yych <= '\r') { gotoCase = 57; continue; };
465 if (yych != '-') { gotoCase = 54; continue; };
468 yych = this._charAt(cursor);
469 if (yych == '-') { gotoCase = 59; continue; };
470 { gotoCase = 43; continue; };
473 this.setLexCondition(this._lexConditions.COMMENT);
474 { this.tokenType = "html-comment"; return cursor; }
477 yych = this._charAt(cursor);
478 if (yych != '>') { gotoCase = 54; continue; };
480 { this.tokenType = "html-comment"; return cursor; }
482 yych = this._charAt(++cursor);
483 if (yych == 'R') { gotoCase = 68; continue; };
484 if (yych == 'r') { gotoCase = 68; continue; };
485 { gotoCase = 43; continue; };
487 yych = this._charAt(++cursor);
488 if (yych == 'Y') { gotoCase = 64; continue; };
489 if (yych != 'y') { gotoCase = 43; continue; };
491 yych = this._charAt(++cursor);
492 if (yych == 'L') { gotoCase = 65; continue; };
493 if (yych != 'l') { gotoCase = 43; continue; };
495 yych = this._charAt(++cursor);
496 if (yych == 'E') { gotoCase = 66; continue; };
497 if (yych != 'e') { gotoCase = 43; continue; };
500 this.setLexCondition(this._lexConditions.TAG);
502 if (this._condition.parseCondition & this._parseConditions.STYLE) {
503 // Do not tokenize style tag contents, keep lexer state, even though processing "<".
504 this.setLexCondition(this._lexConditions.INITIAL);
505 this.tokenType = null;
508 this.tokenType = "html-tag";
509 this._condition.parseCondition = this._parseConditions.STYLE;
510 this._setExpectingAttribute();
514 yych = this._charAt(++cursor);
515 if (yych == 'I') { gotoCase = 69; continue; };
516 if (yych != 'i') { gotoCase = 43; continue; };
518 yych = this._charAt(++cursor);
519 if (yych == 'P') { gotoCase = 70; continue; };
520 if (yych != 'p') { gotoCase = 43; continue; };
522 yych = this._charAt(++cursor);
523 if (yych == 'T') { gotoCase = 71; continue; };
524 if (yych != 't') { gotoCase = 43; continue; };
527 this.setLexCondition(this._lexConditions.TAG);
529 if (this._condition.parseCondition & this._parseConditions.SCRIPT) {
530 // Do not tokenize script tag contents, keep lexer state, even though processing "<".
531 this.setLexCondition(this._lexConditions.INITIAL);
532 this.tokenType = null;
535 this.tokenType = "html-tag";
536 this._condition.parseCondition = this._parseConditions.SCRIPT;
537 this._setExpectingAttribute();
541 yych = this._charAt(++cursor);
543 if (yych == 'C') { gotoCase = 75; continue; };
544 if (yych <= 'S') { gotoCase = 43; continue; };
547 if (yych <= 'b') { gotoCase = 43; continue; };
548 { gotoCase = 75; continue; };
550 if (yych != 't') { gotoCase = 43; continue; };
553 yych = this._charAt(++cursor);
554 if (yych == 'Y') { gotoCase = 81; continue; };
555 if (yych == 'y') { gotoCase = 81; continue; };
556 { gotoCase = 43; continue; };
558 yych = this._charAt(++cursor);
559 if (yych == 'R') { gotoCase = 76; continue; };
560 if (yych != 'r') { gotoCase = 43; continue; };
562 yych = this._charAt(++cursor);
563 if (yych == 'I') { gotoCase = 77; continue; };
564 if (yych != 'i') { gotoCase = 43; continue; };
566 yych = this._charAt(++cursor);
567 if (yych == 'P') { gotoCase = 78; continue; };
568 if (yych != 'p') { gotoCase = 43; continue; };
570 yych = this._charAt(++cursor);
571 if (yych == 'T') { gotoCase = 79; continue; };
572 if (yych != 't') { gotoCase = 43; continue; };
575 this.setLexCondition(this._lexConditions.TAG);
577 this.tokenType = "html-tag";
578 this._condition.parseCondition = this._parseConditions.INITIAL;
579 this.scriptEnded(cursor - 8);
583 yych = this._charAt(++cursor);
584 if (yych == 'L') { gotoCase = 82; continue; };
585 if (yych != 'l') { gotoCase = 43; continue; };
587 yych = this._charAt(++cursor);
588 if (yych == 'E') { gotoCase = 83; continue; };
589 if (yych != 'e') { gotoCase = 43; continue; };
592 this.setLexCondition(this._lexConditions.TAG);
594 this.tokenType = "html-tag";
595 this._condition.parseCondition = this._parseConditions.INITIAL;
596 this.styleSheetEnded(cursor - 7);
599 /* *********************************** */
600 case this.case_SSTRING:
601 yych = this._charAt(cursor);
603 if (yych == '\n') { gotoCase = 89; continue; };
604 { gotoCase = 88; continue; };
606 if (yych <= '\r') { gotoCase = 89; continue; };
607 if (yych == '\'') { gotoCase = 91; continue; };
608 { gotoCase = 88; continue; };
611 { return this._stringToken(cursor); }
613 yych = this._charAt(++cursor);
614 { gotoCase = 95; continue; };
617 { this.tokenType = null; return cursor; }
621 this.setLexCondition(this._lexConditions.TAG);
622 { return this._stringToken(cursor, true); }
624 yych = this._charAt(++cursor);
625 { gotoCase = 92; continue; };
628 yych = this._charAt(cursor);
631 if (yych == '\n') { gotoCase = 87; continue; };
632 { gotoCase = 94; continue; };
634 if (yych <= '\r') { gotoCase = 87; continue; };
635 if (yych == '\'') { gotoCase = 93; continue; };
636 { gotoCase = 94; continue; };
638 /* *********************************** */
640 yych = this._charAt(cursor);
643 if (yych == '\n') { gotoCase = 100; continue; };
644 if (yych >= '\r') { gotoCase = 100; continue; };
647 if (yych >= ' ') { gotoCase = 100; continue; };
649 if (yych == '"') { gotoCase = 102; continue; };
655 if (yych <= '\'') { gotoCase = 103; continue; };
657 if (yych <= '<') { gotoCase = 100; continue; };
658 if (yych <= '=') { gotoCase = 104; continue; };
659 { gotoCase = 106; continue; };
663 if (yych >= '[') { gotoCase = 100; continue; };
665 if (yych == ']') { gotoCase = 100; continue; };
670 yych = this._charAt(cursor);
671 { gotoCase = 119; continue; };
674 if (this._condition.parseCondition === this._parseConditions.SCRIPT || this._condition.parseCondition === this._parseConditions.STYLE) {
675 // Fall through if expecting attributes.
676 this.tokenType = null;
680 if (this._condition.parseCondition === this._parseConditions.INITIAL) {
681 this.tokenType = "html-tag";
682 this._setExpectingAttribute();
683 var token = this._line.substring(cursorOnEnter, cursor);
685 this._condition.parseCondition |= this._parseConditions.A_NODE;
686 else if (this._condition.parseCondition & this._parseConditions.A_NODE)
687 this._condition.parseCondition ^= this._parseConditions.A_NODE;
688 } else if (this._isExpectingAttribute()) {
689 var token = this._line.substring(cursorOnEnter, cursor);
690 if (token === "href" || token === "src")
691 this._condition.parseCondition |= this._parseConditions.LINKIFY;
692 else if (this._condition.parseCondition |= this._parseConditions.LINKIFY)
693 this._condition.parseCondition ^= this._parseConditions.LINKIFY;
694 this.tokenType = "html-attribute-name";
695 } else if (this._isExpectingAttributeValue())
696 this.tokenType = this._attrValueTokenType();
698 this.tokenType = null;
703 { this.tokenType = null; return cursor; }
706 yych = this._charAt(YYMARKER = ++cursor);
707 { gotoCase = 115; continue; };
710 yych = this._charAt(YYMARKER = ++cursor);
711 { gotoCase = 109; continue; };
715 if (this._isExpectingAttribute())
716 this._setExpectingAttributeValue();
717 this.tokenType = null;
722 this.setLexCondition(this._lexConditions.INITIAL);
724 this.tokenType = "html-tag";
725 if (this._condition.parseCondition & this._parseConditions.SCRIPT) {
726 this.scriptStarted(cursor);
727 // Do not tokenize script tag contents.
731 if (this._condition.parseCondition & this._parseConditions.STYLE) {
732 this.styleSheetStarted(cursor);
733 // Do not tokenize style tag contents.
737 this._condition.parseCondition = this._parseConditions.INITIAL;
742 yych = this._charAt(cursor);
745 if (yych != '\n') { gotoCase = 108; continue; };
747 if (yych <= '\r') { gotoCase = 110; continue; };
748 if (yych == '\'') { gotoCase = 112; continue; };
749 { gotoCase = 108; continue; };
753 this.setLexCondition(this._lexConditions.SSTRING);
754 { return this._stringToken(cursor); }
757 { return this._stringToken(cursor, true); }
760 yych = this._charAt(cursor);
763 if (yych != '\n') { gotoCase = 114; continue; };
765 if (yych <= '\r') { gotoCase = 116; continue; };
766 if (yych == '"') { gotoCase = 112; continue; };
767 { gotoCase = 114; continue; };
771 this.setLexCondition(this._lexConditions.DSTRING);
772 { return this._stringToken(cursor); }
775 yych = this._charAt(cursor);
779 if (yych == '\n') { gotoCase = 99; continue; };
780 if (yych <= '\f') { gotoCase = 118; continue; };
781 { gotoCase = 99; continue; };
783 if (yych == ' ') { gotoCase = 99; continue; };
784 if (yych <= '!') { gotoCase = 118; continue; };
785 { gotoCase = 99; continue; };
789 if (yych == '\'') { gotoCase = 99; continue; };
790 if (yych <= ';') { gotoCase = 118; continue; };
791 { gotoCase = 99; continue; };
794 if (yych <= 'Z') { gotoCase = 118; continue; };
795 { gotoCase = 99; continue; };
797 if (yych == ']') { gotoCase = 99; continue; };
798 { gotoCase = 118; continue; };
808 WebInspector.SourceHTMLTokenizer.prototype.__proto__ = WebInspector.SourceTokenizer.prototype;