Пример #1
0
        public void Parse()
        {
            la = new Token();
            la.val = "";
            Get();
            CSS3();

            Expect(0);
        }
Пример #2
0
        void Get()
        {
            for (; ; ) {
                t = la;
                la = scanner.Scan();
                if (la.kind <= maxT) { ++errDist; break; }

                la = t;
            }
        }
Пример #3
0
        Token NextToken()
        {
            while (ch == 10 || ch == 13) NextCh();
            if (ch == '/' && Comment0()) return NextToken();
            t = new Token();
            t.pos = pos; t.col = col; t.line = line;
            int state;
            try { state = start[ch]; } catch (KeyNotFoundException) { state = 0; }
            tlen = 0; AddCh();

            switch (state) {
                case -1: { t.kind = eofSym; break; } // NextCh already done
                case 0: { t.kind = noSym; break; }   // NextCh already done
                case 1:
                    if (ch == '-' || ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'z') { AddCh(); goto case 1; } else { t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t; }
                case 2: { t.kind = 2; break; }
                case 3: { t.kind = 3; break; }
                case 4: { t.kind = 4; break; }
                case 5:
                    if (ch == '!') { AddCh(); goto case 6; } else { t.kind = noSym; break; }
                case 6:
                    if (ch == '-') { AddCh(); goto case 7; } else { t.kind = noSym; break; }
                case 7:
                    if (ch == '-') { AddCh(); goto case 8; } else { t.kind = noSym; break; }
                case 8: { t.kind = 5; break; }
                case 9:
                    if (ch == '>') { AddCh(); goto case 10; } else { t.kind = noSym; break; }
                case 10: { t.kind = 6; break; }
                case 11: { t.kind = 7; break; }
                case 12: { t.kind = 8; break; }
                case 13: { t.kind = 10; break; }
                case 14: { t.kind = 11; break; }
                case 15: { t.kind = 23; break; }
                case 16: { t.kind = 25; break; }
                case 17: { t.kind = 26; break; }
                case 18: { t.kind = 27; break; }
                case 19: { t.kind = 28; break; }
                case 20: { t.kind = 29; break; }
                case 21: { t.kind = 30; break; }
                case 22: { t.kind = 33; break; }
                case 23: { t.kind = 34; break; }
                case 24: { t.kind = 35; break; }
                case 25: { t.kind = 36; break; }
                case 26: { t.kind = 37; break; }
                case 27:
                    if (ch == '=') { AddCh(); goto case 28; } else { t.kind = noSym; break; }
                case 28: { t.kind = 38; break; }
                case 29:
                    if (ch == '=') { AddCh(); goto case 30; } else { t.kind = noSym; break; }
                case 30: { t.kind = 39; break; }
                case 31:
                    if (ch == '=') { AddCh(); goto case 32; } else { t.kind = noSym; break; }
                case 32: { t.kind = 40; break; }
                case 33: { t.kind = 41; break; }
                case 34: { t.kind = 42; break; }
                case 35: { t.kind = 43; break; }
                case 36: { t.kind = 44; break; }
                case 37: { t.kind = 46; break; }
                case 38: { t.kind = 47; break; }
                case 39: { t.kind = 48; break; }
                case 40:
                    if (ch == '-') { AddCh(); goto case 9; } else { t.kind = 24; break; }
                case 41:
                    if (ch == '=') { AddCh(); goto case 26; } else { t.kind = 31; break; }
                case 42:
                    if (ch == '=') { AddCh(); goto case 33; } else { t.kind = 32; break; }
                case 43:
                    if (ch == '-' || ch >= '0' && ch <= '9' || ch >= 'A' && ch <= 'Z' || ch == '_' || ch >= 'a' && ch <= 'z') { AddCh(); goto case 1; } else if (ch == 92) { AddCh(); goto case 38; } else { t.kind = 1; t.val = new String(tval, 0, tlen); CheckLiteral(); return t; }

            }
            t.val = new String(tval, 0, tlen);
            return t;
        }
Пример #4
0
        void Init()
        {
            pos = -1; line = 1; col = 0;
            oldEols = 0;
            NextCh();
            if (ch == 0xEF) { // check optional byte order mark for UTF-8
                NextCh(); int ch1 = ch;
                NextCh(); int ch2 = ch;
                if (ch1 != 0xBB || ch2 != 0xBF) {
                    throw new FatalError(String.Format("illegal byte order mark: EF {0,2:X} {1,2:X}", ch1, ch2));
                }
                buffer = new UTF8Buffer(buffer); col = 0;
                NextCh();
            }
            start = new Dictionary<int, int>(128);
            for (int i = 65; i <= 84; ++i) start[i] = 1;
            for (int i = 86; i <= 90; ++i) start[i] = 1;
            for (int i = 95; i <= 95; ++i) start[i] = 1;
            for (int i = 97; i <= 122; ++i) start[i] = 1;
            for (int i = 10; i <= 10; ++i) start[i] = 2;
            for (int i = 13; i <= 13; ++i) start[i] = 2;
            for (int i = 48; i <= 57; ++i) start[i] = 3;
            for (int i = 9; i <= 9; ++i) start[i] = 4;
            for (int i = 11; i <= 12; ++i) start[i] = 4;
            for (int i = 32; i <= 32; ++i) start[i] = 4;
            start[60] = 5;
            start[45] = 40;
            start[39] = 11;
            start[34] = 12;
            start[40] = 13;
            start[41] = 14;
            start[64] = 15;
            start[44] = 16;
            start[123] = 17;
            start[59] = 18;
            start[125] = 19;
            start[43] = 20;
            start[62] = 21;
            start[126] = 41;
            start[42] = 42;
            start[35] = 22;
            start[46] = 23;
            start[91] = 24;
            start[61] = 25;
            start[124] = 27;
            start[36] = 29;
            start[94] = 31;
            start[93] = 34;
            start[58] = 35;
            start[33] = 36;
            start[47] = 37;
            start[85] = 43;
            start[37] = 39;
            start[Buffer.EOF] = -1;

            pt = tokens = new Token();  // first token is a dummy
        }
Пример #5
0
 // get the next token (possibly a token already seen during peeking)
 public Token Scan()
 {
     if (tokens.next == null) {
         return NextToken();
     } else {
         pt = tokens = tokens.next;
         return tokens;
     }
 }
Пример #6
0
 // make sure that peeking starts at the current scan position
 public void ResetPeek()
 {
     pt = tokens;
 }
Пример #7
0
 // peek for the next token, ignore pragmas
 public Token Peek()
 {
     if (pt.next == null) {
         do {
             pt = pt.next = NextToken();
         } while (pt.kind > maxT); // skip pragmas
     } else {
         do {
             pt = pt.next;
         } while (pt.kind > maxT);
     }
     return pt;
 }