资源简介
建立文法及其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
- 上一篇:编译原理实验
- 下一篇:基于ARM处理器的烟雾报警控制系统实验报告
评论
共有 条评论