• 大小: 3KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-08-20
  • 语言: 其他
  • 标签:

资源简介

建立文法及其LL(1)分析表表示的数据结构,设计并实现相应的预测分析器,对源程序经词法分析后生成的二元式代码流进行预测分析,如果输入串是文法定义的句子则输出“是”,否则输出“否”。

资源截图

代码片段和文件信息

#include 
#include 
#include 
#include 
//               0   1   2   3   4   5   6
char termin[7]={‘#‘‘;‘‘+‘‘*‘‘(‘‘)‘‘i‘};          /*终结符号*/
char non_ter[8]={‘p‘‘P‘‘e‘‘t‘‘E‘‘f‘‘T‘‘S‘};         /*非终结符号*/

char Yy_pushtab[13][4]=                                   /*逆序存放产生式右部内容*/
{
{‘P‘‘;‘‘e‘‘\0‘}
{‘p‘‘\0‘}
{‘\0‘}
{‘E‘‘t‘‘\0‘}
{‘\0‘}
{‘E‘‘t‘‘+‘‘\0‘}
{‘\0‘}
{‘T‘‘f‘‘\0‘}
{‘T‘‘f‘‘*‘‘\0‘}
{‘\0‘}
{‘)‘‘e‘‘(‘‘\0‘}
{‘i‘‘\0‘}
{‘p‘‘\0‘}
};

int Yy_d[8][7]=                            //LL1分析表
{
-1 0 -1 -1 0 -1 0
2 1 -1 -1 1  -1 1
-1 4 -1 -1 3 4 3
-1 -1 -1 -1 7 -1 7
-1 6 5 -1 -1 6 -1
-1 -1 -1 -1 10 -1 11
-1 9 9 8 -1 9 -1
-1 12 -1 -1 12 -1 12
};


int is_Vt(char x)//判断是否为终结符
{
int i;
// printf(“x = %c \n“x);
for(i=0;i<7;i++)
{
if(termin[i]==x){
//     printf(“is_Vt : %c  %d\n“termin[i]i);
            return 1;       //若是,返回1
}
}
     return 0;    //若不是,返回0
}



/*******************************************
 主函数
********************************************/
int main()
{
int ijkpqwhat_to_doa;
    char chre;
char W[20]=“S“S[20]=“S“str[20]st[20];
    printf(“\n 请输入该文法的句型:“);
scanf(“%s“st);
//    st={‘1‘‘+‘‘2‘‘;‘};
    for( a=0;a<=strlen(st);a++)
    {
        r=st[a];
        if(isdigit(r))  //判断是否是十进制数
            str[a]=‘i‘;
        else str[a]=st[a];
    }
    st[strlen(st)]=‘#‘;
i=strlen(str);
// str[i]=‘#‘;
// str[i+1]=‘\0‘;

j=0;
ch=str[j];

printf(“S栈(字母) | str栈(输入串)  | What_to_do \n“);
    while(S[0]!=‘\0‘)//分析栈非空则继续
{
        for(q=0;S[q]!=‘\0‘;q++)
            W[q]=S[q];
        W[q]=‘\0‘;
//        printf(“resurlt : %d\n“is_Vt(S[strlen(S)-1]));
if(is_Vt(S[strlen(S)-1]))//栈顶为终结符
{
// printf(“\n栈顶元素为:%c ch为: %c \n“S[strlen(S)-1]ch);
what_to_do=-1;
if(S[strlen(S)-1]!=ch)//栈顶与输入符号不等
{
printf(“\n分析结果:该符号串不是文法的句型!\n“);
                return 0;
}

else
{
                S[strlen(S)-1]=‘\0‘;
j++;
ch=str[j];
}
}
else //栈顶为非终结符
{
// printf(“进来过\n“);
            for(i=0;;i++)//获得Yy_d[][]的第一个下标
if(non_ter[i]==S[strlen(S)-1])
break;
for(k=0;;k++)//获得Yy_d[][]的第二个下标
{
if(termin[k]==ch)
break;
if(k==strlen(termin))//输入符号不是终结符
{
printf(“词法错误!“);
return 0;
}
}
what_to_do=Yy_d[i][k];
if(what_to_do==-1)
{
printf(“语法错误!“);
return 0;
}

else                                   //把栈顶元素弹出   再把右部压栈
{
                if(Yy_pushtab[what_to_do][0]==‘\0‘)
S[strlen(S)-1]=‘\0‘;
else
{
int mnh;
    n=strlen(S)-1;
    m=n;
    for( h=0;h S[n++]=Yy_pushtab[what_to_do][h];
    S[m+strlen(Yy_pushtab[what_to_do])]=‘\0‘;
}
}
}

printf(“ %-10s        

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       3415  2018-05-09 16:40  非递归预测分析器.c

     文件       2218  2018-05-07 21:58  编译原理非递归预测.lnk

----------- ---------  ---------- -----  ----

                 5633                    2


评论

共有 条评论

相关资源