编译原理 简单样本语言的语法分析器2Word下载.docx
- 文档编号:18366549
- 上传时间:2022-12-15
- 格式:DOCX
- 页数:24
- 大小:87.74KB
编译原理 简单样本语言的语法分析器2Word下载.docx
《编译原理 简单样本语言的语法分析器2Word下载.docx》由会员分享,可在线阅读,更多相关《编译原理 简单样本语言的语法分析器2Word下载.docx(24页珍藏版)》请在冰豆网上搜索。
单词符号
种别编码
助记符
内码值
DIM
IF
DO
STOP
END
标识符
常数(整)
=
+
*
**
,
(
)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$DIM
$IF
$DO
$STOP
$END
$ID
$INT
$ASSIGN
$PLUS
$STAR
$POWER
$COMMA
$LPAR
$RPAR
-
内部字符串
标准二进形式
对于这个小语言,有几点重要的限制:
首先,所有的关键字(如IF﹑WHILE等)都是“保留字”。
所谓的保留字的意思是,用户不得使用它们作为自己定义的标示符。
例如,下面的写法是绝对禁止的:
IF(5)=x
其次,由于把关键字作为保留字,故可以把关键字作为一类特殊标示符来处理。
也就是说,对于关键字不专设对应的转换图。
但把它们(及其种别编码)预先安排在一张表格中(此表叫作保留字表)。
当转换图识别出一个标识符时,就去查对这张表,确定它是否为一个关键字。
再次,如果关键字、标识符和常数之间没有确定的运算符或界符作间隔,则必须至少用一个空白符作间隔(此时,空白符不再是完全没有意义的了)。
例如,一个条件语句应写为
IFi>
0i=1;
而绝对不要写成
IFi>
0i=1;
因为对于后者,我们的分析器将无条件地将IFI看成一个标识符。
三、所用仪器、材料(设备名称、型号、规格等或使用软件)
Windows下的visualc++6.0;
四、实验方法、步骤(或:
程序代码或操作过程)
代码:
#include"
stdlib.h"
stdio.h"
string.h"
#include<
windows.h>
typedefstruct
{
charR;
charr;
intflag;
}array;
arrayF[30];
charE;
chare;
}charLode;
charLode*base;
inttop;
}charstack;
charstr[80][80],arr[80][80],brr[80][80];
intm,kk,p,ppp,FF=1;
charr[20];
intcrr[30][30],FLAG=0;
charccrr1[1][30],ccrr2[30][1];
voidInitstack(charstack*s)
s->
base=(charLode*)malloc(30*sizeof(charLode));
top=-1;
}
voidpush(charstack*s,charLodew)
top++;
base[s->
top].E=w.E;
top].e=w.e;
voidpop(charstack*s,charLode*w)
w->
E=s->
top].E;
e=s->
top].e;
top--;
intIsEmpty(charstacks)
if(s.top==-1)
return1;
else
return0;
intIsLetter(charch)
if(ch>
='
A'
&
ch<
Z'
intjudge1(intn)
intj=3,flag=1,i;
for(i=0;
i<
=n;
i++)
while(str[i][j]!
\0'
{
chara=str[i][j];
charb=str[i][j+1];
if(IsLetter(a)&
IsLetter(b))
flag=0;
break;
}
j++;
returnflag;
voidjudge2(intn)
inti;
if(str[i][3]=='
~'
||judge1(n)==0||FLAG==1)
printf("
语法G不是操作符优先级的语法!
\n"
);
FF=0;
if(i>
n)
语法G是操作符优先级的语法!
intsearch1(charr[],intkk,chara)
kk;
if(r[i]==a)
if(i==kk)
voidcreateF(intn)
intk=0,i=1;
charc;
intj;
chart[10];
t[0]=str[0][0];
while(i<
=n)
if(t[k]!
=str[i][0])
k++;
t[k]=str[i][0];
i++;
kk=0;
j=3;
c=str[i][j];
if(IsLetter(c)==0)
if(!
search1(r,kk,c))
r[kk]=c;
kk++;
m=0;
k;
for(j=0;
j<
kk-1;
j++)
F[m].R=t[i];
F[m].r=r[j];
F[m].flag=0;
m++;
voidsearch(charLodew)
m;
if(F[i].R==w.E&
F[i].r==w.e)
F[i].flag=1;
voidFirstVT(intn)
charstacksta;
charLodeww;
charLodew;
inti=0,k;
chara,b;
Initstack(&
sta);
k=3;
w.E=str[i][0];
a=str[i][k];
b=str[i][k+1];
IsLetter(a))
w.e=a;
push(&
sta,w);
search(w);
elseif(IsLetter(a)&
b!
!
w.e=b;
while(!
IsEmpty(sta))
pop(&
sta,&
ww);
if(str[i][3]==ww.E&
str[i][4]=='
w.e=ww.e;
elseif(str[i][3]==ww.E&
w.E!
=ww.E)
p=0;
k=1;
i=1;
m)
if(F[i-1].flag==1)
arr[p][0]=F[i-1].R;
arr[p][k]=F[i-1].r;
while(F[i].flag==0&
if(F[i].flag==1)
if(F[i].R==arr[p][0])
arr[p][k+1]='
;
p++;
}
voidLastVT(intn)
charLodeee;
intk,i;
F[i].flag=0;
i=0;
intk=strlen(str[i]);
a=str[i][k-1];
b=str[i][k-2];
ee);
if(str[i][3]==ee.E&
w.e=ee.e;
i=1;
ppp=0;
brr[ppp][0]=F[i-1].R;
brr[ppp][k]=F[i-1].r;
if(F[i].R==arr[ppp][0])
brr[ppp][k+1]='
ppp++;
voidcreateYXB(intn)
inti,j;
intI,mm,pp,J;
for(j=1;
=kk;
ccrr1[0][j]=r[j-1];
for(i=1;
ccrr2[i][0]=r[i-1];
crr[i][j]=0;
I=0,J=3;
while(I<
if(str[I][J+1]=='
I++;
J=3;
while(str[I][J+1]!
charaa=str[I][J];
charbb=str[I][J+1];
IsLetter(aa)&
IsLetter(bb))
{
if(ccrr2[i][0]==aa)
if(ccrr1[0][j]==bb)
if(crr[i][j]==0)
crr[i][j]=1;
FLAG=1;
I=n+1;
J++;
IsLetter(bb)&
str[I][J+2]!
IsLetter(str[I][J+2]))
if(ccrr1[0][j]==str[I][J+2])
if(aa==ccrr2[i][0])
=p;
if(bb==arr[j][0])
for(mm=1;
arr[j][mm]!
mm++)
for(pp=1;
pp<
pp++)
if(ccrr1[0][pp]==arr[j][mm])
if(crr[i][pp]==0)
crr[i][pp]=2;
if(IsLetter(aa)&
if(ccrr1[0][i]==bb)
=ppp;
if(aa==brr[j][0])
brr[j][mm]!
if(ccrr2[pp][0]==brr[j][mm])
if(crr[pp][i]==0)
crr[pp][i]=3;
intjudge3(chars,chara)
inti=1,j=1;
while(ccrr2[i][0]!
=s)
while(ccrr1[0][j]!
=a)
if(crr[i][j]==3)
return3;
elseif(crr[i][j]==2)
return2;
elseif(crr[i][j]==1)
elsereturn0;
voidprint(chars[],charSTR[][20],intq,intu,intii,intk)
%d\t\t"
u);
=k;
%c"
s[i]);
\t\t"
for(i=q;
=ii;
STR[0][i]);
voidprocess(charSTR[][20],intii)
intk=0,q=0,u=0,b,i,j;
chars[40],a;
step\t\tcharstack\tinputstring\tAction\n"
s[k]='
#'
print(s,STR,q,u,ii,k);
ready\n"
u++;
s[k]=STR[0][q];
q++;
shift\n"
while(q<
=ii)
a=STR[0][q];
IsLetter(s[k]))
j=k;
j=k-1;
b=judge3(s[j],a);
if(b==3)
while(IsLetter(s[j-1]))
j--;
for(i=j;
s[i]='
k=j;
s[k]='
G'
u++;
减小\n"
elseif(b==2||b==1)
s[k]=a;
if(s[0]=='
s[1]=='
N'
s[2]=='
接受\n"
错误\n"
还原成功\n"
还原失败\n"
voidmain()
intn,i,j,o;
intii;
请输入定义的语法G的数量:
"
scanf("
%d"
&
n);
请输入语法G"
n;
%s"
str[i]);
j=strlen(str[i]);
str[i][j]='
str[i][0]='
Q'
str[i][1]='
-'
str[i][2]='
>
'
str[i][3]='
str[i][4]=str[0][0];
str[i][5]='
str[i][6]='
你定义的风格如下:
%s\n"
if(judge1(n)==0)
printf(语法G不是操作符语法!
if(judge1(n)==1)
语法G是操作符优先级语法!
createF(n);
FirstVT(n);
LastVT(n);
createYXB(n);
judge2(n);
if(FLAG==0)
FirstVT(%c)={"
arr[i][0]);
for(o=1;
arr[i][o+1]!
o++)
%c,"
arr[i][o]);
%c}\n"
FirstVT(Q)={#}\n"
LastVT(%c)={"
brr[i][o+1]!
brr[i][o]);
LastVT(Q)={#}\n"
优先表如下:
"
ccrr1[0][i]);
%c"
ccrr2[i][0]);
="
<
elseif(crr[i][j]==3)
if(FF==1)
charSTR[1][20];
请输入字符串的法令:
STR[0]);
//getchar();
//gets(STR[0]);
ii=strlen(STR[0]);
STR[0][ii]='
分析如下:
process(STR,ii);
五、实验过程原始记录(测试数据、图表、计算等)
六、实验结果、分析和结论(误差分析与数据处理、成果总结等。
其中,绘制曲线图时必须用计算纸或程序运行
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理 简单样本语言的语法分析器2 编译 原理 简单 样本 语言 语法 分析器