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

📄 yufafenxi.c

📁 编译原理的语法分析程序
💻 C
字号:
#include "stdio.h"                  /*定义I/O库所用的某些宏和变量*/
#include "string.h"                 /*定义字符串库函数*/
#include "conio.h"                  /*提供有关屏幕窗口操作函数*/
#include "ctype.h"                  /*分类函数*/


char prog[80]={'\0'},
     token[8];                     /*存放构成单词符号的字符串*/
char ch;
int syn,                           /*存放单词字符的种别码*/
      n,
     kk,
    sum,                           /*存放整数型单词*/
    m,p;                           /*p是缓冲区prog的指针,m是token的指针*/
char *rwtab[6]={"begin","if","then","while","do","end"};


void scaner()
{
    m=0;
    sum=0;

    for(n=0;n<8;n++)
        token[n]='\0';

    ch=prog[p++];

    while(ch==' ')
        ch=prog[p++];

    if(isalpha(ch))    /*ch为字母字符*/
    {
        while(isalpha(ch)||isdigit(ch))    /*ch 为字母字符或者数字字符*/
        {
           token[m++]=ch;
           ch=prog[p++];
        }

        token[m++]='\0';
        ch=prog[p--];
        syn=10;

        for(n=0;n<6;n++)
            if(strcmp(token,rwtab[n])==0)    /*字符串的比较*/
            {
                syn=n+1;
                break;
            }
    }
    else
        if(isdigit(ch))    /*ch是数字字符*/
        {
            while(isdigit(ch))    /*ch是数字字符*/
            {
                sum=sum*10+ch-'0';
                ch=prog[p++];
            }

            ch=prog[p--];
            syn=11;
        }
        else
            switch(ch)
            {
                case'<':m=0;
                        token[m++]=ch;
                        ch=prog[p++];

                        if(ch=='>')
                        {
                            syn=21;
                            token[m++]=ch;
                        }

                        else if(ch=='=')
                        {
                            syn=22;
                            token[m++]=ch;
                        }

                             else
                             {
                                 syn=20;
                                 ch=prog[p--];
                             }
                        break;

                case'>':m=0;
                        token[m++]=ch;
                        ch=prog[p++];

                        if(ch=='=')
                        {
                            syn=24;
                            token[m++]=ch;
                        }

                        else
                        {
                            syn=23;
                            ch=prog[p--];
                        }
                        break;

             case':':m=0;
                     token[m++]=ch;
                     ch=prog[p++];

                     if(ch=='=')
                     {
                         syn=18;
                         token[m++]=ch;
                     }

                     else
                     {
                         syn=17;
                         ch=prog[p--];
                     }
                     break;

             case'+':syn=13;token[0]=ch;break;
             case'-':syn=14;token[0]=ch;break;
             case'*':syn=15;token[0]=ch;break;
             case'/':syn=16;token[0]=ch;break;
             case'=':syn=25;token[0]=ch;break;
             case';':syn=26;token[0]=ch;break;
             case'(':syn=27;token[0]=ch;break;
             case')':syn=28;token[0]=ch;break;
             case'#':syn=0;token[0]=ch;break;
             default:syn=-1;
          }
}

lrparser()
{
    if(syn==1)
    {
        scaner();
        yucu();
        if(syn==6)
        {
            scaner();
            if(syn==0 && (kk==0))
                printf("success");
            else
            {
                if(kk!=1)
                    printf("The lack of \"end\",ERROR!");
                    kk=1;
            }
        }
    }
    else
    {
        printf("The lack of \"begin\",ERROR!");
        kk=1;
    }
    return;
}

yucu()
{
    statement();
    while(syn==26)
    {
        scaner();
        statement();
    }
    return;
}

statement()
{
    if(syn==10)
    {
        scaner();
        if(syn==18)
        {
            scaner();
            expression();
        }
        else
        {
            printf("\":=\" ERROR!");
            kk=1;
        }
    }
    else
    {
        printf("statement ERROR!");
        kk=1;
    }
    return;
}

expression()
{
    term();
    while(syn==13 || syn==14)
    {
        scaner();
        term();
    }
    return;
}

term()
{
    factor();
    while(syn==15 || syn==16)
    {
        scaner();
        factor();
    }
    return;
}

factor()
{
    if(syn==10 || syn==11)
        scaner();
        else if(syn==27)
             {
                 scaner();
                 expression();
                 if(syn==28)
                     scaner();
                 else
                 {
                     printf("\')\' ERROR!");
                 }
             }
             else
             {
                 printf("expressions ERROR!");
                 kk=1;
             }
             return;
}




main()
{
    kk=0;
    /*printf("\n\nThe significance of the figures:\n"
           "1.figures 1 to 6 said Keyword\n"
           "2.figures 10 and 11 said Other indicators\n"
           "3.figures 13 to 28 said Operators\n"); */

    p=0;
    printf("\nplease input string:(end of \"#\")\n");

    do {
           ch=getchar();
           prog[p++]=ch;
       }while(ch!='#');

     p=0;

    /*do
    {
        scaner();
        switch(syn)
        {
            case 11: printf("(%d,%d)\n",syn,sum);break;
            case -1: printf("\n ERROR;\n");break;
            default: printf("(%d,%s)\n",syn,token);
        }
     }while(syn!=0);*/
     scaner();
     lrparser();
     printf("\nplease enter key...");

     getch();

}

⌨️ 快捷键说明

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