河北工业大学编译原理实验报告精品资料docWord文档格式.docx

上传人:b****5 文档编号:18765522 上传时间:2023-01-01 格式:DOCX 页数:29 大小:118.97KB
下载 相关 举报
河北工业大学编译原理实验报告精品资料docWord文档格式.docx_第1页
第1页 / 共29页
河北工业大学编译原理实验报告精品资料docWord文档格式.docx_第2页
第2页 / 共29页
河北工业大学编译原理实验报告精品资料docWord文档格式.docx_第3页
第3页 / 共29页
河北工业大学编译原理实验报告精品资料docWord文档格式.docx_第4页
第4页 / 共29页
河北工业大学编译原理实验报告精品资料docWord文档格式.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

河北工业大学编译原理实验报告精品资料docWord文档格式.docx

《河北工业大学编译原理实验报告精品资料docWord文档格式.docx》由会员分享,可在线阅读,更多相关《河北工业大学编译原理实验报告精品资料docWord文档格式.docx(29页珍藏版)》请在冰豆网上搜索。

河北工业大学编译原理实验报告精品资料docWord文档格式.docx

>

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

S4

S5

S6

S7

Acc

R3

S8

S9

R6

R8

S15

R1

R2

R4

R5

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<

stdio.h>

ctype.h>

stdlib.h>

string.h>

math.h>

#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"

/*关键字结束标记*/

//数组指针

charTOKEN[20];

charch;

intICON;

doubleFCON;

staticintCurrentState=0;

intresult;

intstart=0;

//指示程序的开始

intend=0;

//指示程序的结束

intGetChar(void);

intEXCUTE(int,int);

intHandleOtherWord(void)

{

returnClassOther;

}

intHandleError(void)

{printf("

Error!

\n"

);

return0;

}

{

intn=0;

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

if(!

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

returnn+1;

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

break;

n++;

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

intGetChar(chara)

charc=a;

if(isdigit(c))

d=c-'

0'

;

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

returnDIGIT;

if(c=='

.'

)returnPOINT;

E'

||c=='

e'

)returnPOWER;

+'

)returnPL;

-'

)returnMU;

returnOTHER;

voidreport_error()

printf("

错误\n"

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

switch(a)

case1:

printf("

(BEGIN,)\n"

break;

case2:

(END,)\n"

case3:

(IF,)\n"

case4:

(THEN,)\n"

case5:

(ELSE,)\n"

case6:

(ID,%s)\n"

token);

case8:

(LT,%s)\n"

case9:

(LE,%s)\n"

case10:

(EQ,%s)\n"

case11:

(NE,%s)\n"

case12:

(GT,%s)\n"

case13:

(GE,%s)\n"

case14:

(IS,%s)\n"

case15:

(PL,%s)\n"

case16:

(MI,%s)\n"

case17:

(MU,%s)\n"

case18:

(DI,%s)\n"

case19:

((,)\n"

case20:

(),)\n"

default:

report_error();

intout(inta)

switch(a)

case7:

return6;

//常量

return2;

//+

return3;

return4;

return5;

return0;

return1;

case21:

return7;

case22:

return100;

//判断是否是空格或换行

case26:

return26;

//标识符

return001;

report_error();

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

inti,c;

ch=fgetc(fp);

if(ch=='

'

||ch=='

\n'

{

scanner_example(fp);

else

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

TOKEN[0]=ch;

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);

//标识符

if(c==1)

{

start=1;

out1(c,"

"

}

if(c==2)

end=1;

out1(c,"

if(isdigit(ch)||ch=='

)//判断是否是数字或“.”

i=0;

//TOKEN[i]=ch;

if(isdigit(ch))

d=ch-'

EXCUTE(CurrentState,DIGIT);

if(ch=='

)EXCUTE(CurrentState,POINT);

)EXCUTE(CurrentState,POWER);

)EXCUTE(CurrentState,PL);

)EXCUTE(CurrentState,MU);

while(CurrentState!

=EndState)

TOKEN[i]=ch;

i++;

ch=fgetc(fp);

intc=GetChar(ch);

EXCUTE(CurrentState,c);

//printf("

(UCON,%g)\n"

FCON);

result=out(UCON);

elseswitch(ch)//关系运算符

case'

'

='

)out1(LE,"

elseif(ch=='

)out1(NE,"

else

fseek(fp,-1,1);

printf("

//out(UCON);

//out(EQ,"

//out(GE,"

//out(GT,"

case'

ch=fgetc(fp);

{printf("

//out(IS,"

break;

result=out(PL);

result=out(MI);

*'

result=out(MU);

/'

result=out(DI);

('

result=out(zuokuohao);

)'

result=out(youkuohao);

result=out(jin);

caseEOF:

default:

return;

intEXCUTE(intstate,intsymbol)

switch(state)

case0:

switch(symbol)

caseDIGIT:

n=0;

p=0;

e=1;

w=d;

CurrentState=1;

Class=UCON;

casePOINT:

w=0;

n=0;

CurrentState=3;

default:

HandleOtherWord();

Class=ClassOther;

CurrentState=EndState;

w=w*10+d;

//CurrentState=1

CurrentState=2;

casePOWER:

CurrentState=4;

FCON=w;

CurrentState=EndState;

w=w*10+d;

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

CurrentState=2;

HandleError();

p=p*10+d;

CurrentState=6;

caseMU:

e=-1;

CurrentState=5;

casePL:

e=1;

returnCurrentState;

intcifa(FILE*fp)

CurrentState=0;

//初始0状态

scanner_example(fp);

return(result);

#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

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1