编译器的语法分析Word文档格式.docx
- 文档编号:17843816
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:46
- 大小:61.85KB
编译器的语法分析Word文档格式.docx
《编译器的语法分析Word文档格式.docx》由会员分享,可在线阅读,更多相关《编译器的语法分析Word文档格式.docx(46页珍藏版)》请在冰豆网上搜索。
(1)是否存在标识符先引用未声明的情况;
(2)是否存在己声明的标识符的错误引用;
(3)是否存在一般标识符的多重声明。
三、实验步骤;
1.将实验一“词法分析”的输出结果,作为表达式语法分析器的输入,进行语法解析,对于语法正确的表达式,报告“语法正确”;
并指出该语句属于哪一条文法。
对于语法错误的表达式,报告“语法错误”,指出错误原因。
2.把语法分析器设计成一个独立一遍的过程。
3.语法分析器的编写方法采用递归子程序法。
四、程序代码;
set.h:
#ifndefSET_H
#defineSET_H
typedefstructsnode
{
intelem;
structsnode*next;
}snode,*symset;
symsetphi,declbegsys,statbegsys,facbegsys,relset;
symsetcreateset(intdata,.../*SYM_NULL*/);
voiddestroyset(symsets);
symsetuniteset(symsets1,symsets2);
intinset(intelem,symsets);
voidshowset(symsets);
#endif
//EOFset.h
pl0.h:
#include<
stdio.h>
#defineNRW11//numberofreservedwords
#defineTXMAX500//lengthofidentifiertable
#defineMAXNUMLEN14//maximumnumberofdigitsinnumbers
#defineNSYM10//maximumnumberofsymbolsinarrayssymandcsym
#defineMAXIDLEN10//lengthofidentifiers
#defineMAXADDRESS32767//maximumaddress
#defineMAXLEVEL32//maximumdepthofnestingblock
#defineCXMAX500//sizeofcodearray
#defineMAXSYM30//maximumnumberofsymbols
#defineSTACKSIZE1000//maximumstorage
enumsymtype
SYM_NULL,//0
SYM_IDENTIFIER,//1
SYM_NUMBER,//2
SYM_PLUS,//3+
SYM_MINUS,//4-
SYM_TIMES,//5*
SYM_SLASH,//6/
SYM_ODD,//7odd
SYM_EQU,//8=
SYM_NEQ,//9-
SYM_LES,//10<
SYM_LEQ,//11<
=
SYM_GTR,//12>
SYM_GEQ,//13>
SYM_LPAREN,//14(
SYM_RPAREN,//15)
SYM_COMMA,//16,
SYM_SEMICOLON,//17;
SYM_PERIOD,//18.
SYM_BECOMES,//19:
SYM_BEGIN,//20begin
SYM_END,//21end
SYM_IF,//22if
SYM_THEN,//23then
SYM_WHILE,//24while
SYM_DO,//25do
SYM_CALL,//26call
SYM_CONST,//27const
SYM_VAR,//28var
SYM_PROCEDURE//29procedure
};
enumidtype
ID_CONSTANT,ID_VARIABLE,ID_PROCEDURE
enumopcode
LIT,OPR,LOD,STO,CAL,INT,JMP,JPC
enumoprcode
OPR_RET,OPR_NEG,OPR_ADD,OPR_MIN,
OPR_MUL,OPR_DIV,OPR_ODD,OPR_EQU,
OPR_NEQ,OPR_LES,OPR_LEQ,OPR_GTR,
OPR_GEQ
typedefstruct
intf;
//functioncode
intl;
//level
inta;
//displacementaddress
}instruction;
//////////////////////////////////////////////////////////////////////
char*err_msg[]=
/*0*/"
"
/*1*/"
Found'
:
='
whenexpecting'
."
/*2*/"
Theremustbeanumbertofollow'
/*3*/"
Theremustbean'
tofollowtheidentifier."
/*4*/"
Theremustbeanidentifiertofollow'
const'
'
var'
or'
procedure'
/*5*/"
Missing'
'
or'
;
'
/*6*/"
Incorrectprocedurename."
/*7*/"
Statementexpected."
/*8*/"
Followthestatementisanincorrectsymbol."
/*9*/"
.'
expected."
/*10*/"
/*11*/"
Undeclaredidentifier."
/*12*/"
Illegalassignment."
/*13*/"
/*14*/"
Theremustbeanidentifiertofollowthe'
call'
/*15*/"
Aconstantorvariablecannotbecalled."
/*16*/"
then'
/*17*/"
end'
/*18*/"
do'
/*19*/"
Incorrectsymbol."
/*20*/"
Relativeoperatorsexpected."
/*21*/"
Procedureidentifiercannotbeinanexpression."
/*22*/"
)'
/*23*/"
Thesymbolcannotbefollowedbyafactor."
/*24*/"
Thesymbolcannotbeasthebeginningofanexpression."
/*25*/"
Thenumberistoogreat."
/*26*/"
Redeclaredidentifier."
//addedbyyzhang02-02-28
/*27*/"
/*28*/"
/*29*/"
/*30*/"
/*31*/"
/*32*/"
Therearetoomanylevels."
charch;
//lastcharacterread
intsym;
//lastsymbolread
charid[MAXIDLEN+1];
//lastidentifierread
intnum;
//lastnumberread
intcc;
//charactercount
intll;
//linelength
intkk;
interr;
intcx;
//indexofcurrentinstructiontobegenerated.
intlevel=0;
inttx=0;
charline[80];
instructioncode[CXMAX];
char*word[NRW+1]=
"
/*placeholder*/
begin"
"
call"
const"
do"
end"
"
if"
odd"
procedure"
then"
var"
while"
intwsym[NRW+1]=
SYM_NULL,SYM_BEGIN,SYM_CALL,SYM_CONST,SYM_DO,SYM_END,
SYM_IF,SYM_ODD,SYM_PROCEDURE,SYM_THEN,SYM_VAR,SYM_WHILE
intssym[NSYM+1]=
SYM_NULL,SYM_PLUS,SYM_MINUS,SYM_TIMES,SYM_SLASH,
SYM_LPAREN,SYM_RPAREN,SYM_EQU,SYM_COMMA,SYM_PERIOD,SYM_SEMICOLON
charcsym[NSYM+1]=
'
+'
-'
*'
/'
('
#defineMAXINS8
char*mnemonic[MAXINS]=
LIT"
OPR"
LOD"
STO"
CAL"
INT"
JMP"
JPC"
charname[MAXIDLEN+1];
intkind;
intvalue;
}comtab;
comtabtable[TXMAX];
shortlevel;
shortaddress;
}mask;
FILE*infile,*outfile;
//EOFPL0.h
set.c:
stdlib.h>
stdarg.h>
#include"
set.h"
symsetuniteset(symsets1,symsets2)
symsets;
snode*p;
s=p=(snode*)malloc(sizeof(snode));
//addedbyyzhang02-02-28
s1=s1->
next;
s2=s2->
//endadd
while(s1&
&
s2)
{
p->
next=(snode*)malloc(sizeof(snode));
p=p->
if(s1->
elem<
s2->
elem)
{
p->
elem=s1->
elem;
s1=s1->
}
else
elem=s2->
s2=s2->
}
if(s2)s1=s2;
//addedbyyzhang02-02-28
while(s1)
s1=s1->
/*deletedbyyzhang02-02-28
while(s2)
s2=s2->
*/
p->
next=NULL;
returns;
}//uniteset
voidsetinsert(symsets,intelem)
snode*p=s;
snode*q;
while(p->
next&
next->
elem)
q=(snode*)malloc(sizeof(snode));
q->
elem=elem;
next=p->
next=q;
}//setinsert
symsetcreateset(intelem,.../*SYM_NULL*/)
va_listlist;
s=(snode*)malloc(sizeof(snode));
s->
va_start(list,elem);
while(elem)
setinsert(s,elem);
elem=va_arg(list,int);
va_end(list);
}//createset
voiddestroyset(symsets)
while(s)
p=s;
s=s->
free(p);
}//destroyset
intinset(intelem,symsets)
s=s->
while(s&
if(s&
elem==elem)
return1;
else
return0;
}//inset
//addedbyyzhang02-02-28
voidshowset(symsets)
while(s){
printf("
%d,"
s->
elem);
printf("
\n"
);
}//showset
//EOFset.c
pl0.c:
//pl0compilersourcecode
string.h>
ctype.h>
pl0.h"
//printerrormessage.
voiderror(intn)
inti;
for(i=1;
i<
=cc-1;
i++)
fprintf(outfile,"
fprintf(outfile,"
^\n"
Error%3d:
%s\n"
n,err_msg[n]);
err++;
}//error
voidgetch(void)
if(cc==ll)
if(feof(infile))
printf("
\nPROGRAMINCOMPLETE\n"
exit
(1);
ll=cc=0;
%5d"
cx);
while((!
feof(infile))//added&
modifiedbyalex01-02-09
&
((ch=getc(infile))!
='
\n'
))
fprintf(outfile,"
%c"
ch);
line[++ll]=ch;
}//while
line[++ll]='
ch=line[++cc];
}//getch
//getsasymbolfrominputstream.
voidgetsym(void)
inti,k;
chara[MAXIDLEN+1];
while(ch=='
||ch=='
\t'
)
//modifiedbyyzhang02-03-12,addsomewhitespace
getch();
if(isalpha(ch))
{//symbolisareservedwordoranidentifier.
k=0;
do
if(k<
MAXIDLEN)
a[k++]=ch;
getch();
while(isalpha(ch)||isdigit(ch));
a[k]=0;
strcpy(id,a);
word[0]=id;
i=NRW;
while(strcmp(id,word[i--]));
if(++i)
sym=wsym[i];
//symbolisareservedword
sym=SYM_IDENTIFIER;
//symbolisanidentifier
elseif(isdigit(ch))
{//symbolisanumber.
k=num=0;
sym=SYM_NUMBER;
num=num*10+ch-'
0'
k++;
while(isdigit(ch));
if(k>
MAXNUMLEN)
error(25);
//Thenumberistoogreat.
elseif(ch=='
)
if(ch=='
sym=SYM_BECOMES;
//:
sym=SYM_NULL;
//illegal?
>
sym=SYM_GEQ;
//>
sym=SYM_GTR;
<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译器 语法分析
![提示](https://static.bdocx.com/images/bang_tan.gif)