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

📄 yffx.c

📁 编译原理语法分析
💻 C
字号:
# include <stdio.h>
# include <string.h>
char prog[80],token[8];
char ch;
int syn,p,m,n,sum=0,kk;
char *rwtab[6]={"begin","if","then","while","do","end"};
void scaner();
Irparser();
yucu();
statement();
expression();
term();
factor();

void main()
{
    p=0;
    printf("\n please input string:\n");
    do{
        scanf("%c",&prog[p++]);
    }while(prog[p-1]!='#');
    p=0;
    kk=0;
    scaner();
    Irparser();
    getch();
/*    do{
        scaner();
        switch(syn)
        {
        case 11:printf("(11,%d) ",sum);break;
        case -1:printf("error! ");break;
        default:printf("(%d,%s) ",syn,token);
        getch();
        }
    }while(syn!=0);
    */
}

void scaner()
{
    for(n=0;n<8;n++)
        token[n]=NULL;
    sum=0;
    ch=prog[p++];
    while(ch==' ')
        ch=prog[p++];
    if((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z'))
    {
        m=0;
        while((ch>='a'&&ch<='z')||(ch>='A'&&ch<='Z')||(ch>='0'&&ch<='9'))
        {
            
            token[m++]=ch;
            ch=prog[p++];
        }
        token[m++]='\0';
        p--;
        syn=10;
        for(n=0;n<6;n++)
            if(strcmp(token,rwtab[n])==0)
            {
                syn=n+1;
                break;
            }
    }
    else
    {
        if(ch>='0'&&ch<='9')
        {
            while(ch>='0'&&ch<='9')
            {
                sum=sum*10+(ch-'0');
                ch=prog[p++];
            }
            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;
                    p--;
                }
                break;
            case '>':
                m=0;
                token[m++]=ch;
                ch=prog[p++];
                if(ch=='=')
                {
                    syn=24;
                    token[m++]=ch;
                }
                else
                {
                    syn=23;
                    p--;
                }
                break;
            case ':':
                m=0;
                token[m++]=ch;
                ch=prog[p++];
                if(ch=='=')
                {
                    syn=18;
                    token[m++]=ch;
                }
                else
                {
                    syn=17;
                    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;
            }
        }
    }
}

Irparser()
{
    if(syn==1)
    {
        scaner();
        yucu();
        if(syn==6)
        {
            scaner();
            if(syn==0&&kk==0)
                printf("success\n");
        }
        else
        {
            if(kk!=1)
                printf("lost 'end'\n");
            kk=1;
        }
    }
    else
    {
        printf("lost 'begin'\n");
        kk=1;
    }
    return;
}

yucu()
{
    statement();
    while(syn==26)
    {
        scaner();
        statement();
    }
    if(syn!=6)
    {
        printf("error input\n");
        kk=1;
    }
    return;
}

statement()
{
    if(syn==10)
    {
        scaner();
        if(syn==18)
        {
            scaner();
            expression();
        }
        else
        {
            printf("error in ':='\n");
            kk=1;
        }
    }
    else
    {
        printf("error in letter\n");
        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("lost ')'\n");
            kk=1;
        }
    }
    else
    {
        printf("the expression is wrong\n");
        kk=1;
    }
    return;
}



⌨️ 快捷键说明

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