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