编译原理词法分析与语法分析实验报告Word格式文档下载.docx

上传人:b****1 文档编号:1511080 上传时间:2023-04-30 格式:DOCX 页数:13 大小:38.68KB
下载 相关 举报
编译原理词法分析与语法分析实验报告Word格式文档下载.docx_第1页
第1页 / 共13页
编译原理词法分析与语法分析实验报告Word格式文档下载.docx_第2页
第2页 / 共13页
编译原理词法分析与语法分析实验报告Word格式文档下载.docx_第3页
第3页 / 共13页
编译原理词法分析与语法分析实验报告Word格式文档下载.docx_第4页
第4页 / 共13页
编译原理词法分析与语法分析实验报告Word格式文档下载.docx_第5页
第5页 / 共13页
编译原理词法分析与语法分析实验报告Word格式文档下载.docx_第6页
第6页 / 共13页
编译原理词法分析与语法分析实验报告Word格式文档下载.docx_第7页
第7页 / 共13页
编译原理词法分析与语法分析实验报告Word格式文档下载.docx_第8页
第8页 / 共13页
编译原理词法分析与语法分析实验报告Word格式文档下载.docx_第9页
第9页 / 共13页
编译原理词法分析与语法分析实验报告Word格式文档下载.docx_第10页
第10页 / 共13页
编译原理词法分析与语法分析实验报告Word格式文档下载.docx_第11页
第11页 / 共13页
编译原理词法分析与语法分析实验报告Word格式文档下载.docx_第12页
第12页 / 共13页
编译原理词法分析与语法分析实验报告Word格式文档下载.docx_第13页
第13页 / 共13页
亲,该文档总共13页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

编译原理词法分析与语法分析实验报告Word格式文档下载.docx

《编译原理词法分析与语法分析实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《编译原理词法分析与语法分析实验报告Word格式文档下载.docx(13页珍藏版)》请在冰点文库上搜索。

编译原理词法分析与语法分析实验报告Word格式文档下载.docx

E′—>+TE′|ε

T—>FT′

T′—>*FT′|ε

F—>(E)|id

实验步骤

 

根据状态图,设计词法分析算法

采用C++语言,实现该算法

调试程序:

输入一组单词,检查输出结果。

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)文法。

通过本次试验,我初步掌握基本掌握计算机语言的词法分析程序和语法分析程序的设计方法,并且对词法分析与语法分析的联系有了更深入的理解,对文法的理解,应用领域更加了解,这对于以后我将他们应用于更多地方有很多帮助。

同时通过上机编程锻炼了我的动手能力。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 解决方案 > 其它

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2