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

📄 合作.cpp

📁 编译原理课程设计词法分析源码及程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
        else
        {
            value = InsertConst(wordget); //将str串以常数插入符号表,并返回常数表指针
            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);//将str串以常数插入符号表,并返回常数表指针
            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("\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★★ \n");
printf("\t\t★                                                  ★\n");
printf("\t\t★                  词法分析器                      ★\n");
printf("\t\t★                                                  ★ \n");
printf("\t\t★            班级: 计算计05-3班                   ★ \n");
printf("\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★★ \n\n");
printf("\t\t                                                  \n");
printf("\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★★ \n");
printf("\t\t★                                                  ★ \n");
printf("\t\t★            杨倩    学号:   0504030338           ★\n");
printf("\t\t★            张文明  学号:   0504030446           ★\n");
printf("\t\t★                                                  ★\n");
printf("\t\t★★★★★★★★★★★★★★★★★★★★★★★★★★★ \n\n");
printf("\n\n                           ***************************\n");
    printf(" \t\t\t        读入要分析的词法\n");
    //将源程序读入缓冲区
    if ((fin=fopen("Test.c","r")) == NULL)
    {
        printf("Cannot open infile\n");
        return 0;
    }
    i = 0;
    while((c = fgetc(fin)) != EOF)//fgetc文件中所有的数据(包括'\0')都是一样处理,除非读到了末尾,它就返回一个特殊值EOF
    {
        if(i >= PRO_MAX_LEN-1)  // PRO_MAX_LEN 源程序最大长度
        {
            printf("\n程序代码太长,无法处理\a");
            return 0;
        }
        proBuffer[i++] = c;
    }
    fclose(fin);    //关闭文件
    proBuffer[i++] = '\0';
	
    printf("\t\t           ***************************\n词法读入成功,如下所示:\n%s",proBuffer);
    printf("\n请按任意键继续\n");    getch();
    //预处理
    printf("\n*****************************\n");
    printf("\n      预处理\n");
    pretreatment();//预处理函数
    printf("\n*****************************\n预处理成功,去掉注释后的词法为:\n%s*",proBuffer);
    printf("\n请按任意键继续\n");    
	getch();// 所谓的按任意键继续
    printf("\n*****************************\n");
    printf("\n  词法分析\n");
    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请按任意键继续\n");    getch();

    return 0;
}




⌨️ 快捷键说明

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