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

📄 lex.cpp

📁 一个小型C语言编译器
💻 CPP
📖 第 1 页 / 共 3 页
字号:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <string.h>#include <errno.h>#include <assert.h>#include "token.h"#include "input.h"#include "string.h"#include "self_def.h"
#define MAXTOKEN 32enum { BLANK=01,  NEWLINE=02, LETTER=04,       DIGIT=010, HEX=020,    OTHER=040 };static unsigned char map[256] = { /* 000 nul */ 0,           /* 001 soh */  0,           /* 002 stx */  0,           /* 003 etx */  0,           /* 004 eot */  0,           /* 005 enq */  0,           /* 006 ack */  0,           /* 007 bel */  0,           /* 010 bs  */  0,           /* 011 ht  */  BLANK,           /* 012 nl  */  NEWLINE,           /* 013 vt  */  BLANK,           /* 014 ff  */  BLANK,           /* 015 cr  */  0,           /* 016 so  */  0,           /* 017 si  */  0,           /* 020 dle */  0,           /* 021 dc1 */  0,           /* 022 dc2 */  0,           /* 023 dc3 */  0,           /* 024 dc4 */  0,           /* 025 nak */  0,           /* 026 syn */  0,           /* 027 etb */  0,           /* 030 can */  0,           /* 031 em  */  0,           /* 032 sub */  0,           /* 033 esc */  0,           /* 034 fs  */  0,           /* 035 gs  */  0,           /* 036 rs  */  0,           /* 037 us  */  0,           /* 040 sp  */  BLANK,           /* 041 !   */  OTHER,           /* 042 "   */  OTHER,           /* 043 #   */  OTHER,           /* 044 $   */  0,           /* 045 %   */  OTHER,           /* 046 &   */  OTHER,           /* 047 '   */  OTHER,           /* 050 (   */  OTHER,           /* 051 )   */  OTHER,           /* 052 *   */  OTHER,           /* 053 +   */  OTHER,           /* 054 ,   */  OTHER,           /* 055 -   */  OTHER,           /* 056 .   */  OTHER,           /* 057 /   */  OTHER,           /* 060 0   */  DIGIT,           /* 061 1   */  DIGIT,           /* 062 2   */  DIGIT,           /* 063 3   */  DIGIT,           /* 064 4   */  DIGIT,           /* 065 5   */  DIGIT,           /* 066 6   */  DIGIT,           /* 067 7   */  DIGIT,           /* 070 8   */  DIGIT,           /* 071 9   */  DIGIT,           /* 072 :   */  OTHER,           /* 073 ;   */  OTHER,           /* 074 <   */  OTHER,           /* 075 =   */  OTHER,           /* 076 >   */  OTHER,           /* 077 ?   */  OTHER,           /* 100 @   */  0,           /* 101 A   */  LETTER|HEX,           /* 102 B   */  LETTER|HEX,           /* 103 C   */  LETTER|HEX,           /* 104 D   */  LETTER|HEX,           /* 105 E   */  LETTER|HEX,           /* 106 F   */  LETTER|HEX,           /* 107 G   */  LETTER,           /* 110 H   */  LETTER,           /* 111 I   */  LETTER,           /* 112 J   */  LETTER,           /* 113 K   */  LETTER,           /* 114 L   */  LETTER,           /* 115 M   */  LETTER,           /* 116 N   */  LETTER,           /* 117 O   */  LETTER,           /* 120 P   */  LETTER,           /* 121 Q   */  LETTER,           /* 122 R   */  LETTER,           /* 123 S   */  LETTER,           /* 124 T   */  LETTER,           /* 125 U   */  LETTER,           /* 126 V   */  LETTER,           /* 127 W   */  LETTER,           /* 130 X   */  LETTER,           /* 131 Y   */  LETTER,           /* 132 Z   */  LETTER,           /* 133 [   */  OTHER,           /* 134 \   */  OTHER,           /* 135 ]   */  OTHER,           /* 136 ^   */  OTHER,           /* 137 _   */  LETTER,           /* 140 `   */  0,           /* 141 a   */  LETTER|HEX,           /* 142 b   */  LETTER|HEX,           /* 143 c   */  LETTER|HEX,           /* 144 d   */  LETTER|HEX,           /* 145 e   */  LETTER|HEX,           /* 146 f   */  LETTER|HEX,           /* 147 g   */  LETTER,           /* 150 h   */  LETTER,           /* 151 i   */  LETTER,           /* 152 j   */  LETTER,           /* 153 k   */  LETTER,           /* 154 l   */  LETTER,           /* 155 m   */  LETTER,           /* 156 n   */  LETTER,           /* 157 o   */  LETTER,           /* 160 p   */  LETTER,           /* 161 q   */  LETTER,           /* 162 r   */  LETTER,           /* 163 s   */  LETTER,           /* 164 t   */  LETTER,           /* 165 u   */  LETTER,           /* 166 v   */  LETTER,           /* 167 w   */  LETTER,           /* 170 x   */  LETTER,           /* 171 y   */  LETTER,           /* 172 z   */  LETTER,           /* 173 {   */  OTHER,           /* 174 |   */  OTHER,           /* 175 }   */  OTHER,           /* 176 ~   */  OTHER, };//typedef struct symbol SYMBOL;//static SYMBOL  tval;//static int     backslash ARGS((int q));static int backslash(int q);int getchr(void);//static Symbol  fcon      ARGS((void));//static Symbol  icon      ARGS((unsigned int, int, int));//static void    ppnumber  ARGS((char *));//Coordinate     src;                                            /* current source coordinate *///int            t;//char*          token;                                          /* current token *///Symbol         tsym;                                           /* symbol table entry for current token */char*          token; struct coordinate{    char* file;    unsigned x,y;}src = {NULL, 0,0};int gettok() {    extern char* filename;    for (;;) {        register unsigned char *rcp = cp;        while (map[*rcp]&BLANK)          rcp++;        if (limit - rcp < MAXTOKEN) {          cp = rcp;          fillbuf();          rcp = cp;        }        src.file = filename;        src.x = rcp - line;        src.y = lineno;        cp = rcp + 1;        switch (*rcp++) {            case '/':                 if (*rcp == '*') {                    int c = 0;                    for (rcp++; *rcp != '/' || c != '*'; )                      if (map[*rcp]&NEWLINE) {                          if (rcp < limit)                              c = *rcp;                          cp = rcp + 1;                          nextline();                          rcp = cp;                          if (rcp == limit)                              break;                      } else                          c = *rcp++;                    if (rcp < limit)                        rcp++;                    else                        //error("unclosed comment\n");      //error函数在什么地方实现????                        printf("unclosed comment \r\n");                    cp = rcp;                    continue;                }                return '/';//            case 'L': //                if (*rcp == '\'') {//                    int t = gettok();//                    assert(t == ICON);//                    src.x--;//                    tval.type = unsignedchar;//                    tval.u.c.v.uc = tval.u.c.v.i;//                    return t;//                }//                if (*rcp != '"')//                    goto id;//                cp = rcp + 1;//                goto scon;                            case '<':                if (*rcp == '=') return cp++, LEQ;                if (*rcp == '<') return cp++, LSHIFT;                return '<';            case '>':                if (*rcp == '=') return cp++, GEQ;                if (*rcp == '>') return cp++, RSHIFT;                return '>';            case '-':                if (*rcp == '>') return cp++, DEREF;                if (*rcp == '-') return cp++, DECR;                return '-';            case '=': return *rcp == '=' ? cp++, EQL    : '=';            case '!': return *rcp == '=' ? cp++, NEQ    : '!';            case '|': return *rcp == '|' ? cp++, OROR   : '|';            case '&': return *rcp == '&' ? cp++, ANDAND : '&';            case '+': return *rcp == '+' ? cp++, INCR   : '+';            case ';': case ',': case ':':            case '*': case '~': case '%': case '^': case '?':            case '[': case ']': case '{': case '}': case '(': case ')':                return rcp[-1];//直接返回case所列举的若干个字符                      case '\n': case '\v': case '\r': case '\f':                nextline();                if (cp == limit) {                    //tsym = NULL;      //文件已经结束,没有标识符了                    return EOI;                }                continue;                    case 'i':                if (rcp[0] == 'f'                && !(map[rcp[1]]&(DIGIT|LETTER))) {                  cp = rcp + 1;                  return IF;                }                if (rcp[0] == 'n'                &&  rcp[1] == 't'                && !(map[rcp[2]]&(DIGIT|LETTER))) {                  cp = rcp + 2;                  //tsym = inttype->u.sym;                  return INT;                }                goto id;            case 'h': case 'j': case 'k': case 'm': case 'n': case 'o':            case 'p': case 'q': case 'x': case 'y': case 'z':            case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':            case 'G': case 'H': case 'I': case 'J': case 'K':            case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':            case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':            case 'Y': case 'Z': case '_':            case 'L':            id:                if (limit - rcp < MAXLINE) {                    cp = rcp - 1;                    fillbuf();                    rcp = ++cp;                }                assert(cp == rcp);                token = (char *)rcp - 1;                while (map[*rcp]&(DIGIT|LETTER))                    rcp++;                token = stringn(token, (char *)rcp - token);                //tsym = lookup(token, identifiers);                cp = rcp;                return ID;            case '0': case '1': case '2': case '3': case '4':            case '5': case '6': case '7': case '8': case '9':             {                unsigned int n = 0;                if (limit - rcp < MAXLINE) {                    cp = rcp - 1;                    fillbuf();                    rcp = ++cp;                }                assert(cp == rcp);                token = (char *)rcp - 1;                if (*token == '0' && (*rcp == 'x' || *rcp == 'X')) {                    int d, overflow = 0;

⌨️ 快捷键说明

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