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

📄 lexcial.cpp

📁 一个简单实用的CMM语言编译器,可以帮助了解如何构造一个简单的词法分析器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
            wordget[i++] = ch;
            GetChar();
        }while(ch != '"' && ch != '\0');
        wordget[i++] = ch;    wordget[i] = '\0';
        if(ch == '\0')
        {
            printf("%s",wordget);
            ProcError(3);
            pDu->kind = ERROR;
            pDu->value = 0;
        }
        else
        {
            value = InsertConst(wordget);
            pDu->kind = CONST;
            pDu->value = value;
        }
        return true;
        //字符常量
    case '\'':
        wordget[i++] = ch;    // '
        GetChar();
        wordget[i++] = ch;

        if(ch == '\\')    // '\n'
        {//如果是转义字符则要多接收一个字符
            GetChar();            // ch = '
            wordget[i++] = ch;
        }
        GetChar();
        wordget[i++] = ch;
        wordget[i] = '\0';
        if(ch != '\'')
        {//'\b'
            printf("%s",wordget);
            ProcError(2);
            pDu->kind = ERROR;
            pDu->value = 0;
        }
        else
        {
            value = InsertConst(wordget);
            pDu->kind = CONST;
            pDu->value = value;
        }
        return true;
    case '(':
    case ')':
    case '[':
    case ']':
    case '.':
    case ',':
    case '~':
    case '?':
    case ':':
    case ';':
    case '{':
    case '}':
    case '#':
        wordget[i++] = ch;    wordget[i] = '\0';
        pDu->kind = DIVIDE; //界符
        pDu->value = -1;
        return true;
    case '!':
        //!=
        wordget[i++] = ch;
        GetChar();
        if (ch=='=') wordget[i++] = ch;
        else Retract();
        wordget[i]='\0';
        break;
    case '<':
        // << <=
        wordget[i++] = ch;
        GetChar();
        if (ch == '<' || ch == '=') wordget[i++] = ch;
        else Retract();
        wordget[i]='\0';
        break;
    case '>':
        // >> >=
        wordget[i++] = ch;
        GetChar();
        if (ch == '>' || ch == '=') wordget[i++] = ch;
        else Retract();
        wordget[i]='\0';
        break;
    case '=':
        // ==
        wordget[i++] = ch;
        GetChar();
        if (ch == '=') wordget[i++] = ch;
        else Retract();
        wordget[i]='\0';
        break;
    case '&':
        // && &=
        wordget[i++] = ch;
        GetChar();
        if (ch == '&' || ch == '=') wordget[i++] = ch;
        else Retract();
        wordget[i]='\0';
        break;
    case '|':
        // || |=
        wordget[i++] = ch;
        GetChar();
        if (ch == '|' || ch == '=') wordget[i++] = ch;
        else Retract();
        wordget[i]='\0';
        break;
    case '+':
        // ++ +=
        wordget[i++] = ch;
        GetChar();
        if (ch == '+' || ch == '=') wordget[i++] = ch;
        else Retract();
        wordget[i]='\0';
        break;
    case '-':
        // -- -= ->
        wordget[i++] = ch;
        GetChar();
        if (ch == '-' || ch == '=' || ch == '>') wordget[i++] = ch;
        else Retract();
        wordget[i]='\0';
        break;
    case '*':
        // ** *=
        wordget[i++] = ch;
        GetChar();
        if (ch == '*' || ch == '=') wordget[i++] = ch;
        else Retract();
        wordget[i]='\0';
        break;
    case '/':
        // /=
        wordget[i++] = ch;
        GetChar();
        if (ch == '=') wordget[i++] = ch;
        else Retract();
        wordget[i]='\0';
        break;
    case '%':
        // %=
        wordget[i++] = ch;
        GetChar();
        if (ch == '=') wordget[i++] = ch;
        else Retract();
        wordget[i]='\0';
        break;
    case '^':
        // ^=
        wordget[i++] = ch;
        GetChar();
        if (ch == '=') wordget[i++] = ch;
        else Retract();
        wordget[i]='\0';
        break;
    case '\0':
        return false;
    default:
        ProcError(1);
        return false;
    }
    pDu->kind = OPERAT;
    return true;
}

int main()
{
    Dualistic  tmp;
    pDualistic ptmp = &tmp;
    FILE *fin, *fout;
    int i;
    char c;

    printf("源代码读入\n");
    //将源程序读入缓冲区
    if ((fin=fopen("Test.c","r")) == NULL)
    {
        printf("Cannot open infile\n");
        return 0;
    }
    i = 0;
    while((c = fgetc(fin)) != EOF)
    {
        if(i >= PRO_MAX_LEN-1)
        {
            printf("\n程序代码太长,无法处理\a");
            return 0;
        }
        proBuffer[i++] = c;
    }
    fclose(fin);    //关闭文件
    proBuffer[i++] = '\0';
    printf("\n***************************\n源代码读入成功,源代码如下:\n%s",proBuffer);
    printf("\n按任意键继续\n");    getch();
    //预处理
    printf("\n预处理\n");
    pretreatment();
    printf("\n***************************\n预处理成功,去掉注释后的源代码为:\n%s*",proBuffer);
    printf("\n按任意键继续\n");    getch();
    printf("\n词法分析\n");
    point = 0;
    //词法分析
    if ((fout=fopen("Result.txt","wb")) == NULL)
    {
        printf("建立文件Result.txt失败。\n");
        return 0;
    }
    i = 0;
    errorLine = 0;    //错误行归零
    do
    {
        if(i++ > PRO_MAX_LEN)//防止遇到BUG 导致程序死循环无限写文件
            break;
        if(!wordAnalyse(ptmp))
        {
            break;
        }
        if (ptmp->value == -1)
            fprintf(fout, "<%3d,  ->\t",ptmp->kind);
        else
            fprintf(fout, "<%3d,%3d>\t",ptmp->kind, ptmp->value);
        switch(ptmp->kind)
        {
        case ERROR:
            fprintf(fout, "(出  错:%s)",wordget);
            break;
        case ID:
            fprintf(fout, "(标识符:%s)",wordget);
            break;
        case CONST:
            fprintf(fout, "(常  量:%s)",wordget);
            break;
        case OPERAT:
            fprintf(fout, "(运算符:%s)",wordget);
            break;
        case DIVIDE:
            fprintf(fout, "(界  符:%s)",wordget);
            break;
        default:;
        }
        if(ptmp->kind >= 1 && ptmp->kind <= KEYWORD_LEN)
            fprintf(fout, "(关键字:%s)",kwTab[ptmp->kind-1]);
        fprintf(fout, "\r\n");        
    }while(1);
    fclose(fout);

    printf("写回常量表和标识符表\n");
    //常量表
    if ((fout=fopen("Const.txt","wb")) == NULL)
    {
        printf("建立文件Const.txt失败。\n");
        return 0;
    }
    for(i = 0; i < pointCTB; ++i)
        fprintf(fout, "%3d %s\r\n",i, constTab[i]);
    fclose(fout);
    //标识符表
    if ((fout=fopen("Sign.txt","wb")) == NULL)
    {
        printf("建立文件Sign.txt失败。\n");
        return 0;
    }
    for(i = 0; i < pointSTB; ++i)
        fprintf(fout, "%3d %s\r\n",i, signTab[i]);
    fclose(fout);
    printf("\n写入完毕\n按任意键继续\n");    getch();

    return 0;
}

⌨️ 快捷键说明

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