编译原理上机三文档格式.docx
- 文档编号:21730409
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:9
- 大小:52.21KB
编译原理上机三文档格式.docx
《编译原理上机三文档格式.docx》由会员分享,可在线阅读,更多相关《编译原理上机三文档格式.docx(9页珍藏版)》请在冰豆网上搜索。
LL
(1)文法的判定:
对于文法G的每一个非终结符U的产生式:
U→α1|α2|…|αn。
如果文法G是一个LL
(1)文法,则有SELECT(U→αi)∩SELECT(U→αj)=Ф(i≠j,i,j=1,2,…,n)。
SELECT集的构造:
SELECT(U→α)=?
FIRST(α),当α不空FIRST(α)∪FOLLOW(U),否则LL
(1)分析表构造算法:
对于每个产生式U→α,执行下一步骤:
1、对于每个终结符号:
a∈FIRST(α),M[U,a]=?
→α?
;
2、如果e∈FIRST(α?
),对于每个终结符号:
b∈FOLLOW(U),M[U,b]=?
3、将其它未定义的分析元素置为ERROR。
5、
附录:
关键代码
/*LL
(1)分析法源程序,只能在VC++中运行*/
#include<
stdio.h>
stdlib.h>
string.h>
dos.h>
charA[20];
/*分析栈*/
charB[20];
/*剩余串*/
charv1[20]={'
i'
'
+'
*'
('
)'
#'
};
/*终结符*/
charv2[20]={'
E'
G'
T'
S'
F'
/*非终结符*/
intj=0,b=0,top=0,l;
/*L为输入串长度*/
typedefstructtype/*产生式类型定义*/
{
charorigin;
/*大写字符*/
chararray[5];
/*产生式右边字符*/
intlength;
/*字符个数*/
}type;
typee,t,g,g1,s,s1,f,f1;
/*结构体变量*/
typeC[10][10];
/*预测分析表*/
voidprint()/*输出分析栈*/
inta;
/*指针*/
for(a=0;
a<
=top+1;
a++)
printf("
%c"
A[a]);
printf("
\t\t"
);
}/*print*/
voidprint1()/*输出剩余串*/
intj;
for(j=0;
j<
b;
j++)/*输出对齐符*/
"
for(j=b;
=l;
j++)
B[j]);
\t\t\t"
}/*print1*/
voidmain()
intm,n,k=0,flag=0,finish=0;
charch,x;
typecha;
/*用来接受C[m][n]*/
/*把文法产生式赋值结构体*/
e.origin='
strcpy(e.array,"
TG"
e.length=2;
t.origin='
strcpy(t.array,"
FS"
t.length=2;
g.origin='
strcpy(g.array,"
+TG"
g.length=3;
g1.origin='
g1.array[0]='
^'
g1.length=1;
s.origin='
strcpy(s.array,"
*FS"
s.length=3;
s1.origin='
s1.array[0]='
s1.length=1;
f.origin='
strcpy(f.array,"
(E)"
f.length=3;
f1.origin='
f1.array[0]='
f1.length=1;
for(m=0;
m<
=4;
m++)/*初始化分析表*/
for(n=0;
n<
=5;
n++)
C[m][n].origin='
N'
/*全部赋为空*/
/*填充分析表*/
C[0][0]=e;
C[0][3]=e;
C[1][1]=g;
C[1][4]=g1;
C[1][5]=g1;
C[2][0]=t;
C[2][3]=t;
C[3][1]=s1;
C[3][2]=s;
C[3][4]=C[3][5]=s1;
C[4][0]=f1;
C[4][3]=f;
提示:
本程序只能对由'
构成的以'
结束的字符串进行分析,\n"
请输入要分析的字符串:
"
do/*读入分析串*/
{
scanf("
&
ch);
if((ch!
='
)&
&
(ch!
)&
))
输入串中有非法字符\n"
exit
(1);
}
B[j]=ch;
j++;
}while(ch!
l=j;
/*分析串长度*/
ch=B[0];
/*当前分析字符*/
A[top]='
A[++top]='
/*'
进栈*/
步骤\t\t分析栈\t\t剩余字符\t\t所用产生式\n"
do
x=A[top--];
/*x为当前栈顶字符*/
%d"
k++);
j++)/*判断是否为终结符*/
if(x==v1[j])
{
flag=1;
break;
}
if(flag==1)/*如果是终结符*/
if(x=='
)
{
finish=1;
/*结束标记*/
printf("
acc!
\n"
/*接受*/
getchar();
exit
(1);
}/*if*/
if(x==ch)
print();
print1();
%c匹配\n"
ch);
ch=B[++b];
/*下一个输入字符*/
flag=0;
/*恢复标记*/
else/*出错处理*/
%c出错\n"
/*输出出错终结符*/
}/*else*/
}/*if*/
else/*非终结符处理*/
for(j=0;
if(x==v2[j])
{
m=j;
/*行号*/
break;
}
if(ch==v1[j])
n=j;
/*列号*/
cha=C[m][n];
if(cha.origin!
)/*判断是否为空*/
%c->
cha.origin);
/*输出产生式*/
for(j=0;
cha.length;
cha.array[j]);
for(j=(cha.length-1);
j>
=0;
j--)/*产生式逆序入栈*/
A[++top]=cha.array[j];
if(A[top]=='
)/*为空则不进栈*/
top--;
x);
/*输出出错非终结符*/
}/*else*/
}while(finish==0);
}/*main*/
六、实验者自评
在LL
(1)分析器的编写中我只达到了最低要求,就是自己手动输入的select集,first集,follow集然后通过程序将预测分析表构造出来了,并且没有做出对输入串的分析。
通过本次试验,我能够设计、编制、调试一个典型的语法分析程序,实现对词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。
并且有能力选择对各种常见程序语言都用的语法结构,如赋值语句(尤指表达式)作为分析对象,并且与所选语法分析方法要比较贴切。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 上机