c语言加法和乘法的有序混合运算语法

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define Max 1000
int j=1;
long g=0;
char nchar[Max]={""};
int k=0;
char ch=NULL;
char m[30]={""};
int sym=-1;
int error=0;
main()
{
    char cha;
    printf("请输入一串字符串:");
    while((cha=getchar())!='$')
	{
		nchar[g]=cha;
		g++;
	}
    scanner();
    E();
    if(sym==0&&error==0)
    {
        printf("success\n");
    }
    else
    {
        printf("fail\n");
    }
}
void E()
{
    T();
    E1();
}
void E1()
{
    if(sym==13)
    {
        scanner();
        T();
        E1();
    }
    else
    {
        if(sym!=0&&sym!=28)
        {
            printf("error\n");
            error++;
        }
    }
}
void T()
{
    F();
    T1();
}
T1()
{
    if(sym==15)
    {
        scanner();
        F();
        T1();
    }
    else
    {
        if(sym!=28&&sym!=0&&sym!=13)
        {
            printf("error\n");
            error++;
        }
    }
}
void F()
{
     if(sym==27)
    {
        scanner();
        E();
        if(sym==28)
        {
            scanner();
        }
        else
        {
            printf("error\n");
            error++;
        }
    }
    else if(sym==10||sym==11)
    {
        scanner();
    }
    else
    {
        printf("error\n");
        error++;
    }

}
int scanner()
{
    int i;
    char a[2]={""};
    char word[][15]={"begin","do","end","if","then","while"};
    int wsym[6]={1,2,3,4,5,6};
    int ssym[9]={25,26,27,28,0,13,14,15,16};
    char b[9]={'=',';','(',')','#','+','-','*','/'};
    if(j==1&&k<g)
    {
    	ch=nchar[k];
    	j++;
    	k++;
	}
    while(ch==' '||ch==10||ch==9||ch==13)
    {
    	if(k==g)
    	{
			return 0;
		}
        ch=nchar[k];
        k++;
    }
    if(ch>='a'&&ch<='z')
    {
        while((ch>='a'&&ch<='z')||(ch>='0'&&ch<='9')||ch=='_')
        {
            a[0]=ch;
            strcat(m,a);
            printf("%s",m);
            if(k==g)
            {
            	break;
			}
            ch=nchar[k];
            k++;
        }
        for(i=0;i<6;i++)
        {
            if(strcmp(m,&word[i][0])==0)
                break;
        }
        if(i<6)
        {
        	sym=wsym[i];
            printf("保留字%s  种别码%d\n",m,wsym[i]);
        }
        else
        {
        	sym=10;
            printf("标识符%s  种别码10\n",m);
        }
        if(k==g)
		return 0;
        strcpy(m,"");
        return 1;
    }
    else if(ch>='0'&&ch<='9')
    {
        while(ch>='0'&&ch<='9')
        {
            a[0]=ch;
            strcat(m,a);
            if(k==g)
            {
            	break;
			}
            ch=nchar[k];
            k++;
        }
        sym=11;
        printf("常数%s   种别码11\n",m);
        if(k==g)
		return 0;
        strcpy(m,"");
        return 1;
    }
    else if(ch==':')
    {
        a[0]=ch;
        strcat(m,a);
        if(k==g)
        {
        	sym=17;
        	printf("运算符%s  种别码17\n",m);
        	return 0;
		}
		ch=nchar[k];
		k++;
        if(ch=='=')
        {
            a[0]=ch;
            strcat(m,a);
            sym=18;
            printf("运算符%s  种别码18\n",m);
            if(k==g)
        	{
        		return 0;
			}
			ch=nchar[k];
			k++;
        }
        strcpy(m,"");
        return 1;
    }
    else if(ch=='<')
    {
        a[0]=ch;
        strcat(m,a);
        if(k<g)
		{
			ch=nchar[k];
			k++;
		 }
        if(ch=='=')
        {
            a[0]=ch;
            strcat(m,a);
            sym=21;
            printf("运算符%s   种别码21\n",m);
            if(k==g)
        	{
        		return 0;
			}
			ch=nchar[k];
			k++;
        }
        else if(ch=='>')
        {
            a[0]=ch;
            strcat(m,a);
            sym=22;
            printf("运算符%s   种别码22\n",m);
            if(k==g)
        	{
        		return 0;
			}
			ch=nchar[k];
			k++;
        }
        else
        {
            printf("运算符%s   种别码22\n",m);
        }
        if(k==g)
		{
			return 0;
		 }
        strcpy(m,"");
        return 1;
    }
    else if(ch=='>')
    {
        a[0]=ch;
        strcat(m,a);
        if(k<g)
		{
			ch=nchar[k];
			k++;
		 }
        if(ch=='=')
        {
            a[0]=ch;
            strcat(m,a);
            sym=24;
            printf("运算符%s   种别码24\n",m);
            if(k==g)
        	{
        		return 0;
			}
			ch=nchar[k];
			k++;
        }
        else
        {
        	sym=23;
            printf("运算符%s   种别码23\n",m);
        }
        if(k==g)
        {
        	return 0;
		}
        strcpy(m,"");
        return 1;
    }
    else
    {
        for(i=0;i<9;i++)
        {
            if(ch==b[i])
                break;
        }
        if(i<9)
        {
        	sym=ssym[i];
        	a[0]=ch;
        	strcat(m,a);
        	sym=ssym[i];
            printf("%s   种别码为:%d\n",m,ssym[i]);
        }
        else
        {
        	a[0]=ch;
        	strcat(m,a);
        	sym=-1;
        	printf("错误!%s不存在种别码\n",m);
		}
        if(k<g)
        {
        	ch=nchar[k];
        	k++;
        }
        else
       	{
        	return 0;
		}
		strcpy(m,"");
		return 1;
    }
}



 

posted @ 2016-12-22 22:31  183区展伯  阅读(1327)  评论(0编辑  收藏  举报