编译原理词法分析与语法分析实验报告Word格式文档下载.docx
《编译原理词法分析与语法分析实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析与语法分析实验报告Word格式文档下载.docx(13页珍藏版)》请在冰点文库上搜索。
E′—>+TE′|ε
T—>FT′
T′—>*FT′|ε
F—>(E)|id
实验步骤
1
根据状态图,设计词法分析算法
2
采用C++语言,实现该算法
3
调试程序:
输入一组单词,检查输出结果。
4编制给定文法的非递归的预测分析程序,并加以测试。
三、实验环境
计算机、Windows操作系统、VisualC++程序集成环境。
四、实验原理(或程序框图)及步骤
LL
(1)中的第一个L表示从左到右扫描输入,第二个L表示产生最右推导,而‘1’则表示在每一步中只需要向前看一个输入符号来决定语法分析动作。
构造一个预测分析表如下:
输入:
文法G
输出:
预测分析表M
方法:
对于文法G的每个产生式A→α,进行如下处理:
1):
对于FIRST(α)中的每个终结符a,将A→α加入到M[A,α]中。
2):
如果ε在FIRST(α)中,那么对于FOLLOW(A)中的每个终结符b,将A→α加入到M[A,α]中。
如果ε在FIRST(α)中,且$在FOLLOW(A)中,也将A→α加入到M[A,$]中。
完成上面操作之后,如果M[A,α]中没有产生式,那么将M[A,α]设置为error。
五、程序源代码
词法分析函数:
structkey_kord{
char*word;
intid;
};
key_wordkeyword[]={
{"
if"
1},
then"
2},
else"
3},
while"
4},
do"
5},
integer"
16}
voidscan(FILE*ftp)
{
chartemp_char;
inti,c;
while(!
feof(ftp)){
temp_char=fgetc(ftp);
if(isalpha(temp_char)){
TOKEN[0]=temp_char;
i=1;
while(isalnum(temp_char)){
TOKEN[i]=temp_char;
i++;
}
TOKEN[i]='
\0'
;
fseek(ftp,-1,1);
c=lookup(TOKEN);
if(c==0)
out(ID,TOKEN);
else
out(c,"
"
);
elseif(isdigit(temp_char)){
while(isdigit(temp_char)){
out(INT,TOKEN);
switch(temp_char){
case'
'
:
temp_char=fgetc(ftp);
if(temp_char=='
='
)
out(LE,"
elseif(temp_char=='
>
out(NE,"
else{
out(LT,"
break;
out(EQ,"
break;
)
out(GE,"
(GT,"
out(FZ,"
report_error(temp_char);
/'
){
do{
}while(temp_char!
\n'
graphnum++;
out(DEV,"
'
:
graphnum++;
case'
case-1:
default:
report_error(temp_char);
return;
LL
(1)算法实现:
#defineMAXSYMBOL30
temp_chararNT[]={'
E'
'
A'
T'
B'
F'
temp_chararTE[]={'
i'
+'
*'
('
)'
temp_charar*analysisTable[MAXSYMBOL][3]={
{"
E"
"
i"
TG"
},{"
+"
"
*"
("
)"
#"
},
A"
+TA"
$"
T"
FB"
B"
*FB"
F"
(E)"
intStack_Count(HEADSTACK*head)
intcount=0;
if(head->
stackHead==NULL)
return0;
TEMP_CHARARSTACK*currentNode=head->
stackHead;
while(currentNode!
=NULL)
{
currentNode=currentNode->
nextNode;
count++;
}
returncount;
HEADSTACK*Stack_Init()
HEADSTACK*headNode=(HEADSTACK*)malloc(sizeof(HEADSTACK));
headNode->
stackHead=NULL;
returnheadNode;
voidStack_Push(HEADSTACK*head,temp_charartemp_char)
TEMP_CHARARSTACK*currentNode,*tail;
tail=(TEMP_CHARARSTACK*)malloc(sizeof(TEMP_CHARARSTACK));
tail->
temp_char=temp_char;
nextNode=NULL;
head->
stackHead=tail;
return;
currentNode=head->
while(currentNode->
nextNode!
currentNode->
nextNode=tail;
currentNode=tail;
TEMP_CHARARSTACKStack_Pop(HEADSTACK*head)
TEMP_CHARARSTACK*currentNode,*tail,popNode;
printf("
Error:
TheStackdoesnothasnode\n"
returnpopNode;
currentNode=tail=head->
if(tail->
nextNode==NULL)
popNode.temp_char=tail->
temp_char;
popNode.nextNode=NULL;
while(tail->
tail=tail->
popNode.nextNode=tail->
boolIsNT(temp_charartemp_char)
for(inti=0;
i<
sizeof(NT)/sizeof(temp_charar);
i++)
if(temp_char==NT[i])
returntrue;
returnfalse;
boolIsTE(temp_charartemp_char)
sizeof(TE)/sizeof(temp_charar);
if(temp_char==TE[i])
temp_charar*GetMatrixValue(temp_chararNT,temp_chararTE)
temp_chararnt[2],te[2];
nt[0]=NT;
nt[1]='
te[0]=TE;
te[1]='
MAXSYMBOL;
if((strcmp(nt,analysisTable[i][0])==0)&
&
(strcmp(te,analysisTable[i][1])==0)&
(analysisTable[i][2]!
="
))
returnanalysisTable[i][2];
return"
boolIsCorrectSentence(temp_chararstr[])
intpos=0;
boolFlag=true;
temp_chararX;
temp_charar*conclude;
HEADSTACK*head;
head=Stack_Init();
Stack_Push(head,'
#'
while(Flag)
X=Stack_Pop(head).temp_char;
if(IsTE(X))
if(X==str[pos])
pos++;
else
elseif(X=='
Flag=false;
elseif(strcmp((conclude=GetMatrixValue(X,str[pos])),"
)!
=0)
if(strcmp(conclude,"
)==0)
continue;
for(intj=strlen(conclude)-1;
j>
-1;
j--)
Stack_Push(head,conclude[j]);
}六、实验数据、结果分析
通过实验记录可知,程序的输出结果与实际的结果一致,程序能正确实现LL
(1)文法。
通过本次试验,我初步掌握基本掌握计算机语言的词法分析程序和语法分析程序的设计方法,并且对词法分析与语法分析的联系有了更深入的理解,对文法的理解,应用领域更加了解,这对于以后我将他们应用于更多地方有很多帮助。
同时通过上机编程锻炼了我的动手能力。