⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wslexer.c

📁 The Kannel Open Source WAP and SMS gateway works as both an SMS gateway, for implementing keyword b
💻 C
📖 第 1 页 / 共 3 页
字号:
                        }                        if (ch == '\n' || ch == '\r') {                            /* Line terminators. */                            if (ch == '\r' && ws_stream_getc(compiler->input,                                                             &ch2)) {                                if (ch2 != '\n')                                    ws_stream_ungetc(compiler->input, ch2);                            }                            compiler->linenum++;                            /* Continue reading the block comment. */                            continue;                        }                        if (ch == '*' && ws_stream_getc(compiler->input, &ch2)) {                            if (ch2 == '/')                                /* The end of the comment found. */                                break;                            ws_stream_ungetc(compiler->input, ch2);                        }                    }                    /* Continue after the comment. */                    continue;                }                if (ch2 == '/') {                    /* Single line comment. */                    while (1) {                        if (!ws_stream_getc(compiler->input, &ch))                            /* The end of input stream reached.  We accept                               this as a valid comment terminator. */                            break;                        if (ch == '\n' || ch == '\r') {                            /* Line terminators. */                            if (ch == '\r' && ws_stream_getc(compiler->input,                                                             &ch2)) {                                if (ch2 != '\n')                                    ws_stream_ungetc(compiler->input, ch2);                            }                            /* The end of the line (and the comment)                                                    reached. */                            compiler->linenum++;                            break;                        }                    }                    /* Continue after the comment. */                    continue;                }                if (ch2 == '=')                    return tDIVA;                ws_stream_ungetc(compiler->input, ch2);            }            return '/';        case '<': 		/* <, <<, <<=, <= */            if (ws_stream_getc(compiler->input, &ch2)) {                if (ch2 == '<') {                    if (ws_stream_getc(compiler->input, &ch2)) {                        if (ch2 == '=')                            return tLSHIFTA;                        ws_stream_ungetc(compiler->input, ch2);                    }                    return tLSHIFT;                }                if (ch2 == '=')                    return tLE;                ws_stream_ungetc(compiler->input, ch2);            }            return '<';        case '=': 		/* =, == */            if (ws_stream_getc(compiler->input, &ch2)) {                if (ch2 == '=')                    return tEQ;                ws_stream_ungetc(compiler->input, ch2);            }            return '=';        case '>': 		/* >, >=, >>, >>=, >>>, >>>= */            if (ws_stream_getc(compiler->input, &ch2)) {                if (ch2 == '>') {                    if (ws_stream_getc(compiler->input, &ch2)) {                        if (ch2 == '>') {                            if (ws_stream_getc(compiler->input, &ch2)) {                                if (ch2 == '=')                                    return tRSZSHIFTA;                                ws_stream_ungetc(compiler->input, ch2);                            }                            return tRSZSHIFT;                        }                        if (ch2 == '=')                            return tRSSHIFTA;                        ws_stream_ungetc(compiler->input, ch2);                    }                    return tRSSHIFT;                }                if (ch2 == '=')                    return tGE;                ws_stream_ungetc(compiler->input, ch2);            }            return '>';        case '^': 		/* ^, ^= */            if (ws_stream_getc(compiler->input, &ch2)) {                if (ch2 == '=')                    return tXORA;                ws_stream_ungetc(compiler->input, ch2);            }            return '^';        case '|': 		/* |, |=, || */            if (ws_stream_getc(compiler->input, &ch2)) {                if (ch2 == '=')                    return tORA;                if (ch2 == '|')                    return tOR;                ws_stream_ungetc(compiler->input, ch2);            }            return '|';        case '#': 		/* The simple cases. */        case '(':        case ')':        case ',':        case ':':        case ';':        case '?':        case '{':        case '}':        case '~':            return (int) ch;        case '\'': 		/* String literals. */        case '"':            {                WsUInt32 string_end_ch = ch;                WsUtf8String *str = ws_utf8_alloc();                if (str == NULL) {                    ws_error_memory(compiler);                    return EOF;                }                while (1) {                    if (!ws_stream_getc(compiler->input, &ch)) {eof_in_string_literal:                        ws_src_error(compiler, 0, "EOF in string literal");                        ws_utf8_free(str);                        return EOF;                    }                    if (ch == string_end_ch)                        /* The end of string reached. */                        break;                    if (ch == '\\') {                        /* An escape sequence. */                        if (!ws_stream_getc(compiler->input, &ch))                            goto eof_in_string_literal;                        switch (ch) {                        case '\'':                        case '"':                        case '\\':                        case '/':                            /* The character as-is. */                            break;                        case 'b':                            ch = '\b';                            break;                        case 'f':                            ch = '\f';                            break;                        case 'n':                            ch = '\n';                            break;                        case 'r':                            ch = '\r';                            break;                        case 't':                            ch = '\t';                            break;                        case 'x':                        case 'u':                            {                                int i, len;                                int type = ch;                                if (ch == 'x')                                    len = 2;                                else                                    len = 4;                                ch = 0;                                for (i = 0; i < len; i++) {                                    if (!ws_stream_getc(compiler->input, &ch2))                                        goto eof_in_string_literal;                                    if (!WS_IS_HEX_DIGIT(ch2)) {                                        ws_src_error(compiler, 0,                                                     "malformed `\\%c' escape in "                                                     "string literal", (char) type);                                        ch = 0;                                        break;                                    }                                    ch *= 16;                                    ch += WS_HEX_TO_INT(ch2);                                }                            }                            break;                        default:                            if (WS_IS_OCTAL_DIGIT(ch)) {                                int i;                                int limit = 3;                                ch = WS_OCTAL_TO_INT(ch);                                if (ch > 3)                                    limit = 2;                                for (i = 1; i < limit; i++) {                                    if (!ws_stream_getc(compiler->input, &ch2))                                        goto eof_in_string_literal;                                    if (!WS_IS_OCTAL_DIGIT(ch2)) {                                        ws_stream_ungetc(compiler->input, ch2);                                        break;                                    }                                    ch *= 8;                                    ch += WS_OCTAL_TO_INT(ch2);                                }                            } else {                                ws_src_error(compiler, 0,                                             "unknown escape sequence `\\%c' in "                                             "string literal", (char) ch);                                ch = 0;                            }                            break;                        }                        /* FALLTHROUGH */                    }                    if (!ws_utf8_append_char(str, ch)) {                        ws_error_memory(compiler);                        ws_utf8_free(str);                        return EOF;                    }                }                if (!ws_lexer_register_utf8(compiler, str)) {                    ws_error_memory(compiler);                    ws_utf8_free(str);                    return EOF;                }                gw_assert(str != NULL);                yylval->string = str;                return tSTRING;            }            break;        default:            /* Identifiers, keywords and number constants. */            if (WS_IS_IDENTIFIER_LETTER(ch)) {                WsBool got;                int token;                unsigned char *p;                unsigned char *np;                size_t len = 0;                /* An identifier or a keyword.  We start with a 256                 * bytes long buffer but it is expanded dynamically if                 * needed.  However, 256 should be enought for most                 * cases since the byte-code format limits the function                 * names to 255 characters. */                p = ws_malloc(256);                if (p == NULL) {                    ws_error_memory(compiler);                    return EOF;                }                do {                    /* Add one extra for the possible terminator                       character. */                    np = ws_realloc(p, len + 2);                    if (np == NULL) {                        ws_error_memory(compiler);                        ws_free(p);                        return EOF;                    }                    p = np;                    /* This is ok since the only valid identifier names                     * can be written in 7 bit ASCII. */                    p[len++] = (unsigned char) ch;                } while ((got = ws_stream_getc(compiler->input, &ch))                         && (WS_IS_IDENTIFIER_LETTER(ch)                             || WS_IS_DECIMAL_DIGIT(ch)));                if (got)                    /* Put back the terminator character. */                    ws_stream_ungetc(compiler->input, ch);                /* Is it a keyword? */                if (lookup_keyword((char *) p, len, &token)) {                    /* Yes it is... */                    ws_free(p);                    /* ...except one case: `div='. */                    if (token == tIDIV) {                        if (ws_stream_getc(compiler->input, &ch)) {                            if (ch == '=')                                return tIDIVA;                            ws_stream_ungetc(compiler->input, ch);                        }                    }                    /* Return the token value. */                    return token;                }                /* It is a normal identifier.  Let's pad the name with a                          null-character.  We have already allocated space for                          it. */                p[len] = '\0';                if (!ws_lexer_register_block(compiler, p)) {                    ws_error_memory(compiler);                    ws_free(p);                    return EOF;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -