1/* Generated by re2c 0.13.5 on Tue Feb  2 00:44:38 2010 */
2/*
3 * Copyright (C) 2009 Google Inc. All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met:
8 *
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
14 * distribution.
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.
18 *
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.
30 */
31
32// Generate js file as follows:
33//
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|'
43
44WebInspector.SourceHTMLTokenizer = function()
45{
46    WebInspector.SourceTokenizer.call(this);
47
48    // The order is determined by the generated code.
49    this._lexConditions = {
50        INITIAL: 0,
51        COMMENT: 1,
52        DOCTYPE: 2,
53        TAG: 3,
54        DSTRING: 4,
55        SSTRING: 5
56    };
57    this.case_INITIAL = 1000;
58    this.case_COMMENT = 1001;
59    this.case_DOCTYPE = 1002;
60    this.case_TAG = 1003;
61    this.case_DSTRING = 1004;
62    this.case_SSTRING = 1005;
63
64    this._parseConditions = {
65        INITIAL: 0,
66        ATTRIBUTE: 1,
67        ATTRIBUTE_VALUE: 2,
68        LINKIFY: 4,
69        A_NODE: 8,
70        SCRIPT: 16
71    };
72
73    this.initialCondition = { lexCondition: this._lexConditions.INITIAL, parseCondition: this._parseConditions.INITIAL };
74}
75
76WebInspector.SourceHTMLTokenizer.prototype = {
77    _isExpectingAttribute: function()
78    {
79        return this._parseCondition & this._parseConditions.ATTRIBUTE;
80    },
81
82    _isExpectingAttributeValue: function()
83    {
84        return this._parseCondition & this._parseConditions.ATTRIBUTE_VALUE;
85    },
86
87    _setExpectingAttribute: function()
88    {
89        if (this._isExpectingAttributeValue())
90            this._parseCondition ^= this._parseConditions.ATTRIBUTE_VALUE;
91        this._parseCondition |= this._parseConditions.ATTRIBUTE;
92    },
93
94    _setExpectingAttributeValue: function()
95    {
96        if (this._isExpectingAttribute())
97            this._parseCondition ^= this._parseConditions.ATTRIBUTE;
98        this._parseCondition |= this._parseConditions.ATTRIBUTE_VALUE;
99    },
100
101    _stringToken: function(cursor, stringEnds)
102    {
103        if (!this._isExpectingAttributeValue()) {
104            this.tokenType = null;
105            return cursor;
106        }
107        this.tokenType = this._attrValueTokenType();
108        if (stringEnds)
109            this._setExpectingAttribute();
110        return cursor;
111    },
112
113    _attrValueTokenType: function()
114    {
115        if (this._parseCondition & this._parseConditions.LINKIFY) {
116            if (this._parseCondition & this._parseConditions.A_NODE)
117                return "html-external-link";
118            return "html-resource-link";
119        }
120        return "html-attribute-value";
121    },
122
123    nextToken: function(cursor)
124    {
125        var cursorOnEnter = cursor;
126        var gotoCase = 1;
127        while (1) {
128            switch (gotoCase)
129            // Following comment is replaced with generated state machine.
130
131        {
132            case 1: var yych;
133            var yyaccept = 0;
134            if (this.getLexCondition() < 3) {
135                if (this.getLexCondition() < 1) {
136                    { gotoCase = this.case_INITIAL; continue; };
137                } else {
138                    if (this.getLexCondition() < 2) {
139                        { gotoCase = this.case_COMMENT; continue; };
140                    } else {
141                        { gotoCase = this.case_DOCTYPE; continue; };
142                    }
143                }
144            } else {
145                if (this.getLexCondition() < 4) {
146                    { gotoCase = this.case_TAG; continue; };
147                } else {
148                    if (this.getLexCondition() < 5) {
149                        { gotoCase = this.case_DSTRING; continue; };
150                    } else {
151                        { gotoCase = this.case_SSTRING; continue; };
152                    }
153                }
154            }
155/* *********************************** */
156case this.case_COMMENT:
157
158            yych = this._charAt(cursor);
159            if (yych <= '\f') {
160                if (yych == '\n') { gotoCase = 4; continue; };
161                { gotoCase = 3; continue; };
162            } else {
163                if (yych <= '\r') { gotoCase = 4; continue; };
164                if (yych == '-') { gotoCase = 6; continue; };
165                { gotoCase = 3; continue; };
166            }
167case 2:
168            { this.tokenType = "html-comment"; return cursor; }
169case 3:
170            yyaccept = 0;
171            yych = this._charAt(YYMARKER = ++cursor);
172            { gotoCase = 9; continue; };
173case 4:
174            ++cursor;
175case 5:
176            { this.tokenType = null; return cursor; }
177case 6:
178            yyaccept = 1;
179            yych = this._charAt(YYMARKER = ++cursor);
180            if (yych != '-') { gotoCase = 5; continue; };
181case 7:
182            ++cursor;
183            yych = this._charAt(cursor);
184            if (yych == '>') { gotoCase = 10; continue; };
185case 8:
186            yyaccept = 0;
187            YYMARKER = ++cursor;
188            yych = this._charAt(cursor);
189case 9:
190            if (yych <= '\f') {
191                if (yych == '\n') { gotoCase = 2; continue; };
192                { gotoCase = 8; continue; };
193            } else {
194                if (yych <= '\r') { gotoCase = 2; continue; };
195                if (yych == '-') { gotoCase = 12; continue; };
196                { gotoCase = 8; continue; };
197            }
198case 10:
199            ++cursor;
200            this.setLexCondition(this._lexConditions.INITIAL);
201            { this.tokenType = "html-comment"; return cursor; }
202case 12:
203            ++cursor;
204            yych = this._charAt(cursor);
205            if (yych == '-') { gotoCase = 7; continue; };
206            cursor = YYMARKER;
207            if (yyaccept <= 0) {
208                { gotoCase = 2; continue; };
209            } else {
210                { gotoCase = 5; continue; };
211            }
212/* *********************************** */
213case this.case_DOCTYPE:
214            yych = this._charAt(cursor);
215            if (yych <= '\f') {
216                if (yych == '\n') { gotoCase = 18; continue; };
217                { gotoCase = 17; continue; };
218            } else {
219                if (yych <= '\r') { gotoCase = 18; continue; };
220                if (yych == '>') { gotoCase = 20; continue; };
221                { gotoCase = 17; continue; };
222            }
223case 16:
224            { this.tokenType = "html-doctype"; return cursor; }
225case 17:
226            yych = this._charAt(++cursor);
227            { gotoCase = 23; continue; };
228case 18:
229            ++cursor;
230            { this.tokenType = null; return cursor; }
231case 20:
232            ++cursor;
233            this.setLexCondition(this._lexConditions.INITIAL);
234            { this.tokenType = "html-doctype"; return cursor; }
235case 22:
236            ++cursor;
237            yych = this._charAt(cursor);
238case 23:
239            if (yych <= '\f') {
240                if (yych == '\n') { gotoCase = 16; continue; };
241                { gotoCase = 22; continue; };
242            } else {
243                if (yych <= '\r') { gotoCase = 16; continue; };
244                if (yych == '>') { gotoCase = 16; continue; };
245                { gotoCase = 22; continue; };
246            }
247/* *********************************** */
248case this.case_DSTRING:
249            yych = this._charAt(cursor);
250            if (yych <= '\f') {
251                if (yych == '\n') { gotoCase = 28; continue; };
252                { gotoCase = 27; continue; };
253            } else {
254                if (yych <= '\r') { gotoCase = 28; continue; };
255                if (yych == '"') { gotoCase = 30; continue; };
256                { gotoCase = 27; continue; };
257            }
258case 26:
259            { return this._stringToken(cursor); }
260case 27:
261            yych = this._charAt(++cursor);
262            { gotoCase = 34; continue; };
263case 28:
264            ++cursor;
265            { this.tokenType = null; return cursor; }
266case 30:
267            ++cursor;
268case 31:
269            this.setLexCondition(this._lexConditions.TAG);
270            { return this._stringToken(cursor, true); }
271case 32:
272            yych = this._charAt(++cursor);
273            { gotoCase = 31; continue; };
274case 33:
275            ++cursor;
276            yych = this._charAt(cursor);
277case 34:
278            if (yych <= '\f') {
279                if (yych == '\n') { gotoCase = 26; continue; };
280                { gotoCase = 33; continue; };
281            } else {
282                if (yych <= '\r') { gotoCase = 26; continue; };
283                if (yych == '"') { gotoCase = 32; continue; };
284                { gotoCase = 33; continue; };
285            }
286/* *********************************** */
287case this.case_INITIAL:
288            yych = this._charAt(cursor);
289            if (yych == '<') { gotoCase = 39; continue; };
290            ++cursor;
291            { this.tokenType = null; return cursor; }
292case 39:
293            yyaccept = 0;
294            yych = this._charAt(YYMARKER = ++cursor);
295            if (yych <= '/') {
296                if (yych == '!') { gotoCase = 44; continue; };
297                if (yych >= '/') { gotoCase = 41; continue; };
298            } else {
299                if (yych <= 'S') {
300                    if (yych >= 'S') { gotoCase = 42; continue; };
301                } else {
302                    if (yych == 's') { gotoCase = 42; continue; };
303                }
304            }
305case 40:
306            this.setLexCondition(this._lexConditions.TAG);
307            {
308                    if (this._parseCondition & this._parseConditions.SCRIPT) {
309                        // Do not tokenize script tag contents, keep lexer state although processing "<".
310                        this.setLexCondition(this._lexConditions.INITIAL);
311                        this.tokenType = null;
312                        return cursor;
313                    }
314
315                    this._parseCondition = this._parseConditions.INITIAL;
316                    this.tokenType = "html-tag";
317                    return cursor;
318                }
319case 41:
320            yyaccept = 0;
321            yych = this._charAt(YYMARKER = ++cursor);
322            if (yych == 'S') { gotoCase = 68; continue; };
323            if (yych == 's') { gotoCase = 68; continue; };
324            { gotoCase = 40; continue; };
325case 42:
326            yych = this._charAt(++cursor);
327            if (yych == 'C') { gotoCase = 62; continue; };
328            if (yych == 'c') { gotoCase = 62; continue; };
329case 43:
330            cursor = YYMARKER;
331            { gotoCase = 40; continue; };
332case 44:
333            yych = this._charAt(++cursor);
334            if (yych <= 'C') {
335                if (yych != '-') { gotoCase = 43; continue; };
336            } else {
337                if (yych <= 'D') { gotoCase = 46; continue; };
338                if (yych == 'd') { gotoCase = 46; continue; };
339                { gotoCase = 43; continue; };
340            }
341            yych = this._charAt(++cursor);
342            if (yych == '-') { gotoCase = 54; continue; };
343            { gotoCase = 43; continue; };
344case 46:
345            yych = this._charAt(++cursor);
346            if (yych == 'O') { gotoCase = 47; continue; };
347            if (yych != 'o') { gotoCase = 43; continue; };
348case 47:
349            yych = this._charAt(++cursor);
350            if (yych == 'C') { gotoCase = 48; continue; };
351            if (yych != 'c') { gotoCase = 43; continue; };
352case 48:
353            yych = this._charAt(++cursor);
354            if (yych == 'T') { gotoCase = 49; continue; };
355            if (yych != 't') { gotoCase = 43; continue; };
356case 49:
357            yych = this._charAt(++cursor);
358            if (yych == 'Y') { gotoCase = 50; continue; };
359            if (yych != 'y') { gotoCase = 43; continue; };
360case 50:
361            yych = this._charAt(++cursor);
362            if (yych == 'P') { gotoCase = 51; continue; };
363            if (yych != 'p') { gotoCase = 43; continue; };
364case 51:
365            yych = this._charAt(++cursor);
366            if (yych == 'E') { gotoCase = 52; continue; };
367            if (yych != 'e') { gotoCase = 43; continue; };
368case 52:
369            ++cursor;
370            this.setLexCondition(this._lexConditions.DOCTYPE);
371            { this.tokenType = "html-doctype"; return cursor; }
372case 54:
373            ++cursor;
374            yych = this._charAt(cursor);
375            if (yych <= '\f') {
376                if (yych == '\n') { gotoCase = 57; continue; };
377                { gotoCase = 54; continue; };
378            } else {
379                if (yych <= '\r') { gotoCase = 57; continue; };
380                if (yych != '-') { gotoCase = 54; continue; };
381            }
382            ++cursor;
383            yych = this._charAt(cursor);
384            if (yych == '-') { gotoCase = 59; continue; };
385            { gotoCase = 43; continue; };
386case 57:
387            ++cursor;
388            this.setLexCondition(this._lexConditions.COMMENT);
389            { this.tokenType = "html-comment"; return cursor; }
390case 59:
391            ++cursor;
392            yych = this._charAt(cursor);
393            if (yych != '>') { gotoCase = 54; continue; };
394            ++cursor;
395            { this.tokenType = "html-comment"; return cursor; }
396case 62:
397            yych = this._charAt(++cursor);
398            if (yych == 'R') { gotoCase = 63; continue; };
399            if (yych != 'r') { gotoCase = 43; continue; };
400case 63:
401            yych = this._charAt(++cursor);
402            if (yych == 'I') { gotoCase = 64; continue; };
403            if (yych != 'i') { gotoCase = 43; continue; };
404case 64:
405            yych = this._charAt(++cursor);
406            if (yych == 'P') { gotoCase = 65; continue; };
407            if (yych != 'p') { gotoCase = 43; continue; };
408case 65:
409            yych = this._charAt(++cursor);
410            if (yych == 'T') { gotoCase = 66; continue; };
411            if (yych != 't') { gotoCase = 43; continue; };
412case 66:
413            ++cursor;
414            this.setLexCondition(this._lexConditions.TAG);
415            {
416                    this.tokenType = "html-tag";
417                    this._parseCondition = this._parseConditions.SCRIPT;
418                    this._setExpectingAttribute();
419                    return cursor;
420                }
421case 68:
422            yych = this._charAt(++cursor);
423            if (yych == 'C') { gotoCase = 69; continue; };
424            if (yych != 'c') { gotoCase = 43; continue; };
425case 69:
426            yych = this._charAt(++cursor);
427            if (yych == 'R') { gotoCase = 70; continue; };
428            if (yych != 'r') { gotoCase = 43; continue; };
429case 70:
430            yych = this._charAt(++cursor);
431            if (yych == 'I') { gotoCase = 71; continue; };
432            if (yych != 'i') { gotoCase = 43; continue; };
433case 71:
434            yych = this._charAt(++cursor);
435            if (yych == 'P') { gotoCase = 72; continue; };
436            if (yych != 'p') { gotoCase = 43; continue; };
437case 72:
438            yych = this._charAt(++cursor);
439            if (yych == 'T') { gotoCase = 73; continue; };
440            if (yych != 't') { gotoCase = 43; continue; };
441case 73:
442            ++cursor;
443            this.setLexCondition(this._lexConditions.TAG);
444            {
445                    this.tokenType = "html-tag";
446                    this._parseCondition = this._parseConditions.INITIAL;
447                    return cursor;
448                }
449/* *********************************** */
450case this.case_SSTRING:
451            yych = this._charAt(cursor);
452            if (yych <= '\f') {
453                if (yych == '\n') { gotoCase = 79; continue; };
454                { gotoCase = 78; continue; };
455            } else {
456                if (yych <= '\r') { gotoCase = 79; continue; };
457                if (yych == '\'') { gotoCase = 81; continue; };
458                { gotoCase = 78; continue; };
459            }
460case 77:
461            { return this._stringToken(cursor); }
462case 78:
463            yych = this._charAt(++cursor);
464            { gotoCase = 85; continue; };
465case 79:
466            ++cursor;
467            { this.tokenType = null; return cursor; }
468case 81:
469            ++cursor;
470case 82:
471            this.setLexCondition(this._lexConditions.TAG);
472            { return this._stringToken(cursor, true); }
473case 83:
474            yych = this._charAt(++cursor);
475            { gotoCase = 82; continue; };
476case 84:
477            ++cursor;
478            yych = this._charAt(cursor);
479case 85:
480            if (yych <= '\f') {
481                if (yych == '\n') { gotoCase = 77; continue; };
482                { gotoCase = 84; continue; };
483            } else {
484                if (yych <= '\r') { gotoCase = 77; continue; };
485                if (yych == '\'') { gotoCase = 83; continue; };
486                { gotoCase = 84; continue; };
487            }
488/* *********************************** */
489case this.case_TAG:
490            yych = this._charAt(cursor);
491            if (yych <= '&') {
492                if (yych <= '\r') {
493                    if (yych == '\n') { gotoCase = 90; continue; };
494                    if (yych >= '\r') { gotoCase = 90; continue; };
495                } else {
496                    if (yych <= ' ') {
497                        if (yych >= ' ') { gotoCase = 90; continue; };
498                    } else {
499                        if (yych == '"') { gotoCase = 92; continue; };
500                    }
501                }
502            } else {
503                if (yych <= '>') {
504                    if (yych <= ';') {
505                        if (yych <= '\'') { gotoCase = 93; continue; };
506                    } else {
507                        if (yych <= '<') { gotoCase = 90; continue; };
508                        if (yych <= '=') { gotoCase = 94; continue; };
509                        { gotoCase = 96; continue; };
510                    }
511                } else {
512                    if (yych <= '[') {
513                        if (yych >= '[') { gotoCase = 90; continue; };
514                    } else {
515                        if (yych == ']') { gotoCase = 90; continue; };
516                    }
517                }
518            }
519            ++cursor;
520            yych = this._charAt(cursor);
521            { gotoCase = 109; continue; };
522case 89:
523            {
524                    if (this._parseCondition === this._parseConditions.SCRIPT) {
525                        // Fall through if expecting attributes.
526                        this.tokenType = null;
527                        return cursor;
528                    }
529
530                    if (this._parseCondition === this._parseConditions.INITIAL) {
531                        this.tokenType = "html-tag";
532                        this._setExpectingAttribute();
533                        var token = this._line.substring(cursorOnEnter, cursor);
534                        if (token === "a")
535                            this._parseCondition |= this._parseConditions.A_NODE;
536                        else if (this._parseCondition & this._parseConditions.A_NODE)
537                            this._parseCondition ^= this._parseConditions.A_NODE;
538                    } else if (this._isExpectingAttribute()) {
539                        var token = this._line.substring(cursorOnEnter, cursor);
540                        if (token === "href" || token === "src")
541                            this._parseCondition |= this._parseConditions.LINKIFY;
542                        else if (this._parseCondition |= this._parseConditions.LINKIFY)
543                            this._parseCondition ^= this._parseConditions.LINKIFY;
544                        this.tokenType = "html-attribute-name";
545                    } else if (this._isExpectingAttributeValue())
546                        this.tokenType = this._attrValueTokenType();
547                    else
548                        this.tokenType = null;
549                    return cursor;
550                }
551case 90:
552            ++cursor;
553            { this.tokenType = null; return cursor; }
554case 92:
555            yyaccept = 0;
556            yych = this._charAt(YYMARKER = ++cursor);
557            { gotoCase = 105; continue; };
558case 93:
559            yyaccept = 0;
560            yych = this._charAt(YYMARKER = ++cursor);
561            { gotoCase = 99; continue; };
562case 94:
563            ++cursor;
564            {
565                    if (this._isExpectingAttribute())
566                        this._setExpectingAttributeValue();
567                    this.tokenType = null;
568                    return cursor;
569                }
570case 96:
571            ++cursor;
572            this.setLexCondition(this._lexConditions.INITIAL);
573            {
574                    if (this._parseCondition & this._parseConditions.SCRIPT) {
575                        // Do not tokenize script tag contents.
576                        this.tokenType = null;
577                        return cursor;
578                    }
579
580                    this._parseCondition = this._parseConditions.INITIAL;
581                    this.tokenType = "html-tag";
582                    return cursor;
583                }
584case 98:
585            ++cursor;
586            yych = this._charAt(cursor);
587case 99:
588            if (yych <= '\f') {
589                if (yych != '\n') { gotoCase = 98; continue; };
590            } else {
591                if (yych <= '\r') { gotoCase = 100; continue; };
592                if (yych == '\'') { gotoCase = 102; continue; };
593                { gotoCase = 98; continue; };
594            }
595case 100:
596            ++cursor;
597            this.setLexCondition(this._lexConditions.SSTRING);
598            { return this._stringToken(cursor); }
599case 102:
600            ++cursor;
601            { return this._stringToken(cursor, true); }
602case 104:
603            ++cursor;
604            yych = this._charAt(cursor);
605case 105:
606            if (yych <= '\f') {
607                if (yych != '\n') { gotoCase = 104; continue; };
608            } else {
609                if (yych <= '\r') { gotoCase = 106; continue; };
610                if (yych == '"') { gotoCase = 102; continue; };
611                { gotoCase = 104; continue; };
612            }
613case 106:
614            ++cursor;
615            this.setLexCondition(this._lexConditions.DSTRING);
616            { return this._stringToken(cursor); }
617case 108:
618            ++cursor;
619            yych = this._charAt(cursor);
620case 109:
621            if (yych <= '"') {
622                if (yych <= '\r') {
623                    if (yych == '\n') { gotoCase = 89; continue; };
624                    if (yych <= '\f') { gotoCase = 108; continue; };
625                    { gotoCase = 89; continue; };
626                } else {
627                    if (yych == ' ') { gotoCase = 89; continue; };
628                    if (yych <= '!') { gotoCase = 108; continue; };
629                    { gotoCase = 89; continue; };
630                }
631            } else {
632                if (yych <= '>') {
633                    if (yych == '\'') { gotoCase = 89; continue; };
634                    if (yych <= ';') { gotoCase = 108; continue; };
635                    { gotoCase = 89; continue; };
636                } else {
637                    if (yych <= '[') {
638                        if (yych <= 'Z') { gotoCase = 108; continue; };
639                        { gotoCase = 89; continue; };
640                    } else {
641                        if (yych == ']') { gotoCase = 89; continue; };
642                        { gotoCase = 108; continue; };
643                    }
644                }
645            }
646        }
647
648        }
649    }
650}
651
652WebInspector.SourceHTMLTokenizer.prototype.__proto__ = WebInspector.SourceTokenizer.prototype;
653