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

📄 lex.cpp

📁 一个小型C语言编译器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
                        else                            n = (n<<4) + d;                    }                    if ((char *)rcp - token <= 2)                        //error("invalid hexadecimal constant `%S'\n", token, (char *)rcp-token);                        printf("invalid hexadecimal constant `%S'\n", token, (char *)rcp-token);                    cp = rcp;                    //tsym = icon(n, overflow, 16);                } else if (*token == '0') {                    int err = 0, overflow = 0;                    for ( ; map[*rcp]&DIGIT; rcp++) {                        if (*rcp == '8' || *rcp == '9')                            err = 1;                        if (n&~((unsigned)-1 >> 3))                            overflow = 1;                        else                            n = (n<<3) + (unsigned)(*rcp - '0');                    }                    if (*rcp == '.' || *rcp == 'e' || *rcp == 'E') {                        cp   = rcp;                        //tsym = fcon();                        fcon();                        return FCON;                    }                           cp = rcp;                    //tsym = icon(n, overflow, 8);                    if (err)                        //error("invalid octal constant `%S'\n", token, (char*)cp-token);                        printf("invalid octal constant `%S'\n", token, (char*)cp-token);                } else {                    int overflow = 0;                    for (n = *token - '0'; map[*rcp]&DIGIT; ) {                        int d = *rcp++ - '0';                        if (n > ((unsigned)UINT_MAX - d)/10)                            overflow = 1;                        else                            n = 10*n + d;                    }                    if (*rcp == '.' || *rcp == 'e' || *rcp == 'E') {                        cp = rcp;                        //tsym = fcon();                        fcon();                        return FCON;                    }                           cp = rcp;                    //tsym = icon(n, overflow, 10);                }                return ICON;            }            case '.':                if (rcp[0] == '.' && rcp[1] == '.') {                    cp += 2;                    return ELLIPSIS;                }                if ((map[*rcp]&DIGIT) == 0)                    return '.';                if (limit - rcp < MAXLINE) {                    cp = rcp - 1;                    fillbuf();                    rcp = ++cp;                }                assert(cp == rcp);                cp = rcp - 1;                token = (char *)cp;                //tsym = fcon();                fcon();                return FCON;scon:               case '\'': case '"':             {                static char cbuf[BUFSIZE+1];                char *s = cbuf;                int nbad = 0;                *s++ = *--cp;                do {                    cp++;                    while (*cp != cbuf[0]) {                        int c;                        if (map[*cp]&NEWLINE) {                            if (cp < limit)                                break;                            cp++;                            nextline();                            if (cp == limit)                                break;                            continue;                        }                        c = *cp++;                        if (c == '\\') {                            if (map[*cp]&NEWLINE) {                                if (cp < limit)                                    break;                                cp++;                                nextline();                            }                            if (limit - cp < MAXTOKEN)                                fillbuf();                            c = backslash(cbuf[0]);                        } else if (map[c] == 0)                            nbad++;                        if (s < &cbuf[sizeof cbuf] - 2)                            *s++ = c;                    }                    if (*cp == cbuf[0])                        cp++;                    else                      //error("missing %c\n", cbuf[0]);                      printf("missing %c\n", cbuf[0]);                } while (cbuf[0] == '"' && getchr() == '"');                *s++ = 0;                if (s >= &cbuf[sizeof cbuf])                    //error("%s literal too long\n", cbuf[0] == '"' ? "string" : "character");                    printf("%s literal too long\n", cbuf[0] == '"' ? "string" : "character");                //if (Aflag >= 2 && cbuf[0] == '"' && s - cbuf - 1 > 509)                //    warning("more than 509 characters in a string literal\n");                //if (Aflag >= 2 && nbad)                //    warning("%s literal contains non-portable characters\n", cbuf[0] == '"' ? "string" : "character");                token = cbuf;                //tsym = &tval;                if (cbuf[0] == '"') {                    //tval.type = array(chartype, s - cbuf - 1, 0);                    //tval.u.c.v.p = cbuf + 1;                    return SCON;                } else {                    if (s - cbuf > 3)                        //warning("excess characters in multibyte character literal `%S' ignored\n", token, (char*)cp-token);                        printf("excess characters in multibyte character literal `%S' ignored\n", token, (char*)cp-token);                    else if (s - cbuf <= 2)                        //error("missing '\n");                        printf("missing '\n");                    //tval.type = inttype;                    //tval.u.c.v.i = cbuf[1];                    return ICON;                }            }            case 'a':                if (rcp[0] == 'u'                &&  rcp[1] == 't'                &&  rcp[2] == 'o'                && !(map[rcp[3]]&(DIGIT|LETTER))) {                    cp = rcp + 3;                    return AUTO;                }                goto id;            case 'b':                if (rcp[0] == 'r'                &&  rcp[1] == 'e'                &&  rcp[2] == 'a'                &&  rcp[3] == 'k'                && !(map[rcp[4]]&(DIGIT|LETTER))) {                    cp = rcp + 4;                    return BREAK;                }                goto id;            case 'c':                if (rcp[0] == 'a'                &&  rcp[1] == 's'                &&  rcp[2] == 'e'                && !(map[rcp[3]]&(DIGIT|LETTER))) {                    cp = rcp + 3;                    return CASE;                }                if (rcp[0] == 'h'                &&  rcp[1] == 'a'                &&  rcp[2] == 'r'                && !(map[rcp[3]]&(DIGIT|LETTER))) {                    cp = rcp + 3;                    //tsym = chartype->u.sym;                    return CHAR;                }                if (rcp[0] == 'o'                &&  rcp[1] == 'n'                &&  rcp[2] == 's'                &&  rcp[3] == 't'                && !(map[rcp[4]]&(DIGIT|LETTER))) {                    cp = rcp + 4;                    return CONST;                }                if (rcp[0] == 'o'                &&  rcp[1] == 'n'                &&  rcp[2] == 't'                &&  rcp[3] == 'i'                &&  rcp[4] == 'n'                &&  rcp[5] == 'u'                &&  rcp[6] == 'e'                && !(map[rcp[7]]&(DIGIT|LETTER))) {                    cp = rcp + 7;                    return CONTINUE;                }                goto id;            case 'd':                if (rcp[0] == 'e'                &&  rcp[1] == 'f'                &&  rcp[2] == 'a'                &&  rcp[3] == 'u'                &&  rcp[4] == 'l'                &&  rcp[5] == 't'                && !(map[rcp[6]]&(DIGIT|LETTER))) {                    cp = rcp + 6;                    return DEFAULT;                }                if (rcp[0] == 'o'                &&  rcp[1] == 'u'                &&  rcp[2] == 'b'                &&  rcp[3] == 'l'                &&  rcp[4] == 'e'                && !(map[rcp[5]]&(DIGIT|LETTER))) {                    cp = rcp + 5;                    //tsym = doubletype->u.sym;                    return DOUBLE;                }                if (rcp[0] == 'o'                && !(map[rcp[1]]&(DIGIT|LETTER))) {                    cp = rcp + 1;                    return DO;                }                goto id;            case 'e':                if (rcp[0] == 'l'                &&  rcp[1] == 's'                &&  rcp[2] == 'e'                && !(map[rcp[3]]&(DIGIT|LETTER))) {                    cp = rcp + 3;                    return ELSE;                }                if (rcp[0] == 'n'                &&  rcp[1] == 'u'                &&  rcp[2] == 'm'                && !(map[rcp[3]]&(DIGIT|LETTER))) {                    cp = rcp + 3;                    return ENUM;                }                if (rcp[0] == 'x'                &&  rcp[1] == 't'                &&  rcp[2] == 'e'                &&  rcp[3] == 'r'                &&  rcp[4] == 'n'                && !(map[rcp[5]]&(DIGIT|LETTER))) {                    cp = rcp + 5;                    return EXTERN;                }                goto id;            case 'f':                if (rcp[0] == 'l'                &&  rcp[1] == 'o'                &&  rcp[2] == 'a'                &&  rcp[3] == 't'                && !(map[rcp[4]]&(DIGIT|LETTER))) {                    cp = rcp + 4;                    //tsym = floattype->u.sym;                    return FLOAT;                }                if (rcp[0] == 'o'                &&  rcp[1] == 'r'                && !(map[rcp[2]]&(DIGIT|LETTER))) {                    cp = rcp + 2;                    return FOR;                }                goto id;            case 'g':                if (rcp[0] == 'o'                &&  rcp[1] == 't'                &&  rcp[2] == 'o'                && !(map[rcp[3]]&(DIGIT|LETTER))) {                    cp = rcp + 3;                    return GOTO;                }                goto id;            case 'l':                if (rcp[0] == 'o'                &&  rcp[1] == 'n'                &&  rcp[2] == 'g'                && !(map[rcp[3]]&(DIGIT|LETTER))) {                    cp = rcp + 3;                    //tsym = longtype->u.sym;                    return LONG;                }                goto id;            case 'r':                if (rcp[0] == 'e'                &&  rcp[1] == 'g'                &&  rcp[2] == 'i'                &&  rcp[3] == 's'                &&  rcp[4] == 't'                &&  rcp[5] == 'e'                &&  rcp[6] == 'r'                && !(map[rcp[7]]&(DIGIT|LETTER))) {                    cp = rcp + 7;                    return REGISTER;                }                if (rcp[0] == 'e'                &&  rcp[1] == 't'                &&  rcp[2] == 'u'                &&  rcp[3] == 'r'                &&  rcp[4] == 'n'                && !(map[rcp[5]]&(DIGIT|LETTER))) {                    cp = rcp + 5;                    return RETURN;                }                goto id;            case 's':

⌨️ 快捷键说明

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