河北工业大学编译原理实验报告.docx

上传人:b****3 文档编号:6088398 上传时间:2023-05-09 格式:DOCX 页数:34 大小:119.16KB
下载 相关 举报
河北工业大学编译原理实验报告.docx_第1页
第1页 / 共34页
河北工业大学编译原理实验报告.docx_第2页
第2页 / 共34页
河北工业大学编译原理实验报告.docx_第3页
第3页 / 共34页
河北工业大学编译原理实验报告.docx_第4页
第4页 / 共34页
河北工业大学编译原理实验报告.docx_第5页
第5页 / 共34页
河北工业大学编译原理实验报告.docx_第6页
第6页 / 共34页
河北工业大学编译原理实验报告.docx_第7页
第7页 / 共34页
河北工业大学编译原理实验报告.docx_第8页
第8页 / 共34页
河北工业大学编译原理实验报告.docx_第9页
第9页 / 共34页
河北工业大学编译原理实验报告.docx_第10页
第10页 / 共34页
河北工业大学编译原理实验报告.docx_第11页
第11页 / 共34页
河北工业大学编译原理实验报告.docx_第12页
第12页 / 共34页
河北工业大学编译原理实验报告.docx_第13页
第13页 / 共34页
河北工业大学编译原理实验报告.docx_第14页
第14页 / 共34页
河北工业大学编译原理实验报告.docx_第15页
第15页 / 共34页
河北工业大学编译原理实验报告.docx_第16页
第16页 / 共34页
河北工业大学编译原理实验报告.docx_第17页
第17页 / 共34页
河北工业大学编译原理实验报告.docx_第18页
第18页 / 共34页
河北工业大学编译原理实验报告.docx_第19页
第19页 / 共34页
河北工业大学编译原理实验报告.docx_第20页
第20页 / 共34页
亲,该文档总共34页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

河北工业大学编译原理实验报告.docx

《河北工业大学编译原理实验报告.docx》由会员分享,可在线阅读,更多相关《河北工业大学编译原理实验报告.docx(34页珍藏版)》请在冰点文库上搜索。

河北工业大学编译原理实验报告.docx

河北工业大学编译原理实验报告

河北工业大学编译原理实验报告

 

 

————————————————————————————————作者:

————————————————————————————————日期:

 

 

编译原理实验报告

 

组员:

韦廷廷(112455)、熊敏(112456)、马昊(113042)

任课老师:

吴清

 

一、任务概述

本次实验我们要完成的任务主要是实现一个简单语言集的词法、语法和语义分析程序,验证实际编译系统的实现方法。

我们组的分工并不是词法分析、语法分析、语义分析每人负责一个,而是先确定每种分析按照哪一种方法实现,然后每个人写出自己的想法,按照自己的想法实验,最后总结到一起,有问题大家一起讨论,共同商量解决的办法。

二、系统设计

实验采用的实现方法和依据:

语言中的各类单词符号及其分类码表

单词符号

类别编码

类别码的助记符

单词值

begin

1

BEGIN

end

2

END

if

3

IF

then

4

THEN

else

5

ELSE

标识符

6

ID

字母打头的字母数字串

无符号常数

7

UCON

机内二进制表示

<

8

LT

<=

9

LE

=

10

EQ

<>

11

NE

>

12

GT

>=

13

GE

:

=

14

IS

+

15

PL

-

16

MI

*

17

MU

/

18

DI

实验采用的实现方法和依据:

文法:

E→T|E+T|E-TT→F|T*F|T/FF→i|(E)

SLR

(1)分析表

状态

ACTION

GOTO

+

-

*

/

i

#

E

T

F

0

S4

S5

1

2

3

1

S6

S7

Acc

2

R3

R3

R3

S8

S9

R3

3

R6

R6

R6

R6

R6

R6

4

S4

S5

10

2

3

5

R8

R8

R8

R8

R8

R8

6

S4

S5

11

3

7

S4

S5

12

3

8

S4

S5

13

9

S4

S5

14

10

S15

S6

S7

11

R1

R1

R1

S8

S9

R1

12

R2

R2

R2

S8

S9

R2

13

R4

R4

R4

R4

R4

R4

14

R5

R5

R5

R5

R5

R5

15

R7

R7

R7

R7

R7

R7

 

三、系统实现(包括必要的框图,各.h和.c文件说明,所有函数功能的说明,数据结构、各种表格、变量等的说明,以及函数调用关系图等)

(1)各.h和.c文件说明

Cifa.cpp的功能:

字符串扫描识别。

Table.cpp的功能:

存放SLR分析法需要用到的ACTION和GOTO表。

Yufa.cpp的功能:

引用Cifa.cpp、Table.cpp两个文件进行语法、语义的分析。

(2)函数功能说明

词法分析部分函数说明:

intlookup(char*token)//比较是否是关键字

intGetChar(charch)//每调用一次,就把扫描指示器当前所指示的源程序字符送入字符变量ch,然后把扫描指示器前推一个字符位置。

intHandleError(void)//报错函数

intEXCUTE(intstate,intsymbol)//状态转换

intlookup(char*token)//比较是否是关键字

voidout(inta,char*token)//输出函数

voidscanner_example(FILE*fp)//词法分析

语法、语义部分函数功能说明:

voidREPORT_ERROR()//报错函数

voidAccept()//语法成功接受

intINDEX(chara)//获取当前字符串对应的索引

voidyuyi(intn)//语义子程序

voidINPUT(inta)//语法分析程序

(2)数据结构、各种表格、变量等的说明

Cifa.cpp中:

char*KeyWordTable[MAX_KEY_NUMBER]={"begin","end","if","then","else",KEY_WORD_END};

//数组指针关键字

intw,n,p,e,d;//w尾数累加器,n小数位数计数器,p指数累加器,e指数符号标记,

intClass;//标识单词类型

Table.cpp

#defineMAXROW16//行数

#defineMAXCOL11//列数

intTable[MAXROW][MAXCOL]

Yufa.cpp中

#defineNUMBER9//表达式的个数

intState[MAXState];//状态栈

intCURRENTSTATE=0;//标识当前状态

intLENGTH[NUMBER]={1,3,3,1,3,3,1,3,1};//表达式右边的长度

intYes=0;//判断是否结束

inttag=0;//判断是否需要调用词法程序

四、系统工作过程及运行说明(使用操作指南)

程序使用:

在工程里创建一个b.txt文件以识别算数运算表达式

五、源程序清单(要求有详细注释)和实例程序运行结果

源程序清单:

Cifa.cpp

#include

#include

#include

#include

#include

#defineDIGIT1

#definePOINT2

#defineOTHER3

#definePOWER4

#defineID6

#defineUCON7

#defineLT8

#defineLE9

#defineEQ10

#defineNE11

#defineGT12

#defineGE13

#defineIS14

#definePL15//+

#defineMI16//-

#defineMU17

#defineDI18

#definezuokuohao19

#defineyoukuohao20

#definejin21

#defineClassOther200

#defineEndState-1

#defineMAX_KEY_NUMBER20/*关键字的数量*/

#defineKEY_WORD_END"END"/*关键字结束标记*/

char*KeyWordTable[MAX_KEY_NUMBER]={"begin","end","if","then","else",KEY_WORD_END};

//数组指针

charTOKEN[20];

charch;

intw,n,p,e,d;//w尾数累加器,n小数位数计数器,p指数累加器,e指数符号标记,

intClass;//标识单词类型

intICON;

doubleFCON;

staticintCurrentState=0;

intresult;

intstart=0;//指示程序的开始

intend=0;//指示程序的结束

intGetChar(void);

intEXCUTE(int,int);

intHandleOtherWord(void)

{

returnClassOther;

}

intHandleError(void)

{printf("Error!

\n");return0;}

intlookup(char*token)//比较是否是关键字

{

intn=0;

while(strcmp(KeyWordTable[n],KEY_WORD_END))/*strcmp比较两串是否相同,若相同返回0*/

{

if(!

strcmp(KeyWordTable[n],token))/*比较token所指向的关键字和保留字表中哪个关键字相符*/

{

returnn+1;/*根据单词分类码表I,设置正确的关键字类别码,并返回此类别码的值*/

break;

}

n++;

}

return0;/*单词不是关键字,而是标识符*/

}

intGetChar(chara)

{

charc=a;

if(isdigit(c))

{

d=c-'0';//字符c与字符0的ascii码差值,返回类型为一个整数

returnDIGIT;}

if(c=='.')returnPOINT;

if(c=='E'||c=='e')returnPOWER;

if(c=='+')returnPL;

if(c=='-')returnMU;

returnOTHER;

}

voidreport_error()

{

printf("错误\n");

}

voidout1(inta,char*token)//输出函数

{

switch(a)

{

case1:

printf("(BEGIN,)\n");break;

case2:

printf("(END,)\n");break;

case3:

printf("(IF,)\n");break;

case4:

printf("(THEN,)\n");break;

case5:

printf("(ELSE,)\n");break;

case6:

printf("(ID,%s)\n",token);break;

case8:

printf("(LT,%s)\n",token);break;

case9:

printf("(LE,%s)\n",token);break;

case10:

printf("(EQ,%s)\n",token);break;

case11:

printf("(NE,%s)\n",token);break;

case12:

printf("(GT,%s)\n",token);break;

case13:

printf("(GE,%s)\n",token);break;

case14:

printf("(IS,%s)\n",token);break;

case15:

printf("(PL,%s)\n",token);break;

case16:

printf("(MI,%s)\n",token);break;

case17:

printf("(MU,%s)\n",token);break;

case18:

printf("(DI,%s)\n",token);break;

case19:

printf("((,)\n");break;

case20:

printf("(),)\n");break;

default:

report_error();break;

}

}

intout(inta)

{

switch(a)

{

case7:

return6;break;//常量

case15:

return2;break;//+

case16:

return3;break;

case17:

return4;break;

case18:

return5;break;

case19:

return0;break;

case20:

return1;break;

case21:

return7;break;

case22:

return100;break;//判断是否是空格或换行

case26:

return26;break;//标识符

default:

return001;report_error();break;

}

}

voidscanner_example(FILE*fp)//文件扫描器

{

inti,c;

ch=fgetc(fp);

if(ch==''||ch=='\n')

{

scanner_example(fp);

}

else

if(isalpha(ch))//判断是否是英文字母

{

TOKEN[0]=ch;

ch=fgetc(fp);

i=1;

while(isalnum(ch))

{

TOKEN[i]=ch;i++;

ch=fgetc(fp);

}

TOKEN[i]='\0';

fseek(fp,-1,1);/*retract*/

c=lookup(TOKEN);

if(c==0)

{

//printf("算术表达式不需要\n");

result=out(26);//标识符

}

else

{

if(c==1)

{

start=1;

out1(c,"");

}

if(c==2)

{

end=1;

out1(c,"");

}

}

}

else

if(isdigit(ch)||ch=='.')//判断是否是数字或“.”

{

i=0;

//TOKEN[i]=ch;

if(isdigit(ch))

{

d=ch-'0';//字符c与字符0的ascii码差值,返回类型为一个整数

EXCUTE(CurrentState,DIGIT);}

if(ch=='.')EXCUTE(CurrentState,POINT);

if(ch=='E'||ch=='e')EXCUTE(CurrentState,POWER);

if(ch=='+')EXCUTE(CurrentState,PL);

if(ch=='-')EXCUTE(CurrentState,MU);

while(CurrentState!

=EndState)

{

TOKEN[i]=ch;

i++;

ch=fgetc(fp);

intc=GetChar(ch);

EXCUTE(CurrentState,c);

}

TOKEN[i]='\0';

fseek(fp,-1,1);

//printf("(UCON,%g)\n",FCON);

result=out(UCON);

}

elseswitch(ch)//关系运算符

{

case'<':

ch=fgetc(fp);

if(ch=='=')out1(LE,"");

elseif(ch=='>')out1(NE,"");

else

{

fseek(fp,-1,1);

printf("算术表达式不需要\n");

//out(UCON);

}

break;

case'=':

printf("算术表达式不需要\n");

//out(EQ,"");

break;

case'>':

ch=fgetc(fp);

if(ch=='=')

{

printf("算术表达式不需要\n");

//out(GE,"");

}

else

{

fseek(fp,-1,1);

printf("算术表达式不需要\n");

//out(GT,"");

}

break;

case':

':

ch=fgetc(fp);

if(ch=='=')

{printf("算术表达式不需要\n");

//out(IS,"");

}

break;

case'+':

result=out(PL);

break;

case'-':

result=out(MI);

break;

case'*':

result=out(MU);

break;

case'/':

result=out(DI);

break;

case'(':

result=out(zuokuohao);break;

case')':

result=out(youkuohao);break;

case';':

result=out(jin);break;

caseEOF:

break;

default:

report_error();

break;

}

return;

}

intEXCUTE(intstate,intsymbol)

{

switch(state)

{

case0:

switch(symbol)

{

caseDIGIT:

n=0;p=0;e=1;w=d;CurrentState=1;Class=UCON;break;

casePOINT:

w=0;n=0;p=0;e=1;CurrentState=3;Class=UCON;break;

default:

HandleOtherWord();Class=ClassOther;

CurrentState=EndState;

}

break;

case1:

switch(symbol)

{

caseDIGIT:

w=w*10+d;break;//CurrentState=1

casePOINT:

CurrentState=2;break;

casePOWER:

CurrentState=4;break;

default:

FCON=w;CurrentState=EndState;

}

break;

case2:

switch(symbol)

{

caseDIGIT:

n++;w=w*10+d;break;

casePOWER:

CurrentState=4;break;

default:

FCON=w*pow(10,e*p-n);CurrentState=EndState;

}

break;

case3:

switch(symbol)

{

caseDIGIT:

n++;w=w*10+d;CurrentState=2;break;

default:

HandleError();CurrentState=EndState;

}

break;

case4:

switch(symbol)

{

caseDIGIT:

p=p*10+d;CurrentState=6;break;

caseMU:

e=-1;CurrentState=5;break;

casePL:

e=1;CurrentState=5;break;

default:

HandleError();CurrentState=EndState;

}

break;

case5:

switch(symbol)

{

caseDIGIT:

p=p*10+d;CurrentState=6;break;

default:

HandleError();CurrentState=EndState;

}

break;

case6:

switch(symbol)

{

caseDIGIT:

p=p*10+d;break;

default:

FCON=w*pow(10,e*p-n);CurrentState=EndState;

}

break;

}

returnCurrentState;

}

 

intcifa(FILE*fp)

{

CurrentState=0;//初始0状态

scanner_example(fp);

return(result);

}

Table.cpp

#include

#include

#include

#include

#include

#defineMAXROW16//行数

#defineMAXCOL11//列数

#defineS11

#defineS22

#defineS33

#defineS44

#defineS55

#defineS66

#defineS77

#defineS88

#defineS99

#defineS1010

#defineS1111

#defineS1212

#defineS1313

#defineS1414

#defineS1515

#defineR121

#defineR222

#defineR323

#defineR424

#defineR525

#defineR626

#defineR727

#defineR828

#defineacc100

//SLR

(1)分析表,21~30表示规约,1~20表示移近,0报错

intTable[MAXROW][MAXCOL]=

{{S4,0,0,0,0,0,S5,0,S1,S2,S3},

{0,0,S6,S7,0,0,0,acc,0,0,0},

{0,23,23,23,8,9,0,23,0,0,0},

{0,26,26,26,26,26,0,26,0,0,0},

{4,0,0,0,0,0,5,0,10,2,3},

{0,28,28,28,28,28,0,28,0,0,0},

{4,0,0,0,0,0,5,0,0,11,3},

{4,0,0,0,0,0,5,0,0,12,3},

{4,0,0,0,0,0,5,0,0,0,13},

{4,0,0,0,0,0,5,0,0,0,14},

{0,15,6,7,0,0,0,0,0,0,0},

{0,21,21,21,8,9,0,21,0,0,0},

{0,22,22,22,8,9,0,22,0,0,0},

{0,24,24,24,24,24,0,24,0,0,0},

{0,25,25,25,25,25,0,25,0,0,0},

{0,27,27,27,27,27,0,27,0,0,0}};

Yufa.cpp

#include

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

当前位置:首页 > 自然科学 > 物理

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

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