编译原理实验3-算符优先分析法

2014-11-24 00:56:26 · 作者: · 浏览: 10
#include  
#include  
#include  
#include  
#define SIZE 128  
char priority[6][6];  //算符优先关系表数组  
char input[SIZE];     //存放输入的要进行分析的句子  
char remain[SIZE];    //存放剩余串  
char AnalyseStack[SIZE];  //分析栈  
void analyse();  
int  testchar(char x);  //判断字符X在算符优先关系表中的位置  
void remainString();    //移进时处理剩余字符串,即去掉剩余字符串第一个字符  
int k;  
void init()//构造算符优先关系表,并将其存入数组中  
{  
    priority[1][0]='>';  
    priority[1][1]='>';  
    priority[1][2]='<';  
    priority[1][3]='<';  
    priority[1][4]='>';  
    priority[1][5]='>';  
  
    priority[2][0]='>';  
    priority[2][1]='>';  
    priority[2][2]='$';//无优先关系的用$表示  
    priority[2][3]='$';  
    priority[2][4]='>';  
    priority[2][5]='>';  
  
    priority[3][0]='<';  
    priority[3][1]='<';  
    priority[3][2]='<';  
    priority[3][3]='<';  
    priority[3][4]='=';  
    priority[3][5]='$';  
  
    priority[4][0]='>';  
    priority[4][1]='>';  
    priority[4][2]='$';  
    priority[4][3]='$';  
    priority[4][4]='>';  
    priority[4][5]='>';  
  
    priority[5][0]='<';  
    priority[5][1]='<';  
    priority[5][2]='<';  
    priority[5][3]='<';  
    priority[5][4]='$';  
    priority[5][5]='=';  
}  
void analyse()//对所输入的句子进行算符优先分析过程的函数  
{  
    int i,j,f,z,z1,n,n1,z2,n2;  
    int count=0;//操作的步骤数  
    char a; //用于存放正在分析的字符  
    char p,Q,p1,p2;  
    f=strlen(input);  //测出数组的长度  
    for(i=0;i<=f;i++)  
    {  
        a=input[i];  
        if(i==0)  
            remainString();  
        if(AnalyseStack[k]=='+'||AnalyseStack[k]=='*'||AnalyseStack[k]=='i'  
     ||AnalyseStack[k]=='('||AnalyseStack[k]==')'||AnalyseStack[k]=='#')  
            j=k;  
        else  
            j=k-1;  
        z=testchar(AnalyseStack[j]);//从优先关系表中查出s[j]和a的优先关系  
        if(a=='+'||a=='*'||a=='i'||a=='('||a==')'||a=='#')  
            n=testchar(a);  
        else //如果句子含有不是终结符集合里的其它字符,不合法  
        {  
            printf("错误!该句子不是该文法的合法句子!\n");  
            break;  
        }  
        p=priority[z][n];  
        if(p=='$')  
        {  
            printf("错误!该句子不是该文法的合法句子!\n");  
            return;  
        }  
        if(p=='>')  
    { for( ; ; )  
        {  
        Q=AnalyseStack[j];  
             if(AnalyseStack[j-1]=='+'||AnalyseStack[j-1]=='*'||AnalyseStack[j-1]=='i'  
       ||AnalyseStack[j-1]=='('||AnalyseStack[j-1]==')'||AnalyseStack[j-1]=='#')  
                 j=j-1;  
             else  
                 j=j-2;  
             z1=testchar(AnalyseStack[j]);  
             n1=testchar(Q);  
             p1=priority[z1][n1];  
             if(p1=='<')  //把AnalyseStack[j+1]~AnalyseStack[k]归约为N  
             {  
                 count++;  
                 printf("(%d)     %s\t%10c\t%5c%17s\t    归约\n",count,AnalyseStack,p,a,remain);  
                 k=j+1;  
                 i--;  
                 AnalyseStack[k]='N';  
                 int r,r1;  
                 r=strlen(AnalyseStack);  
                 for(r1=k+1;r1