语法分析程序报告Word格式.docx
- 文档编号:20796926
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:38
- 大小:51.75KB
语法分析程序报告Word格式.docx
《语法分析程序报告Word格式.docx》由会员分享,可在线阅读,更多相关《语法分析程序报告Word格式.docx(38页珍藏版)》请在冰豆网上搜索。
(18),<
(19)
;
(20)(分号,语句结束时使用),(21)(定义变量时分隔多个变量)
:
(22)(冒号,定义变量时使用):
=(23)(冒号+等号,赋值号)
*(24)乘,/(25)除
3.语法分析程序
#include<
iostream.h>
#include"
fstream.h"
#include<
string>
classQueue
{
private:
charptr[128];
inthead;
inttail;
public:
voidcopy(Queue*queue)
{
queue->
head=head;
queue->
tail=tail;
for(inti=head;
i<
tail;
i++)
queue->
ptr[i]=ptr[i];
}
boolFind(intt)
for(inti=head;
{
if(ptr[i]==t)
returntrue;
}
returnfalse;
Queue()
{
head=tail=0;
}
voidpushQueue(intpara)
ptr[tail]=para;
tail++;
intpopQueue()
inttemp=ptr[head];
head++;
returntemp;
voidclear()
boolisEmpty()
if(tail-head>
0)
returnfalse;
returntrue;
};
classPro_Process
private:
intsta_stack;
public:
Pro_Process()
sta_stack=0;
voidProcess(char*ptr)
char*temp2=ptr;
while((int)*temp2!
=0)//去掉//和/*
if(sta_stack!
=0)//进入夹逼注释阶段
//寻找下一个标记符号
if((int)*temp2=='
*'
&
(int)*(temp2+1)=='
/'
)//寻找到
sta_stack--;
*temp2=32;
*(temp2+1)=32;
)
sta_stack++;
else//否则在注释中置为空格
*temp2=32;
else//正常进行阶段
if((int)*temp2=='
{
if((int)*(temp2+1)=='
{
Pro_process1(temp2);
return;
}
}
}
temp2++;
/*将当前符号置为0
*
*/
voidPro_process1(char*temp2)
*temp2=0;
classTwo_pass
charptr[20];
intindex;
intstate;
//确定返回的是否带有字符串,如果有为1;
没有为0;
public:
boolequal(char*p)
inttemp=strcmp(ptr,p);
if(temp==0)//strcmp字符串匹配成功为0
returntrue;
boolequal(intpara)
if(para==index)
Two_pass()
index=0;
voidTwo_copy(char*p,intdex)
state=1;
intcount=0;
while(*p!
='
\0'
ptr[count]=*p;
count++;
p++;
ptr[count]='
;
index=dex;
voidTwo_copy(intdex)//返回值没有字符串
state=0;
if(1==index)
strcpy(ptr,"
program"
);
if(2==index)
begin"
if(3==index)
end"
if(4==index)
var"
if(5==index)
integer"
if(6==index)
if"
if(7==index)
then"
if(8==index)
else"
if(9==index)
do"
if(10==index)
while"
if(13==index)
strcpy(ptr,"
+"
if(14==index)
-"
if(15==index)
("
if(16==index)
)"
if(17==index)
="
if(18==index)
>
"
if(19==index)
if(20==index)
if(21==index)
"
if(22==index)
:
if(23==index)
if(24==index)
*"
if(25==index)
/"
voidTwo_copy(Two_passps)
Two_copy(ps.get_String(),ps.getIndex());
char*get_String()
char*p=ptr;
returnp;
intgetIndex()
returnindex;
intgetState()
returnstate;
classAccidenceAnalyse
ifstreamifs;
Pro_Processpro;
charch;
charstrInstream[257];
//存储文件的行,最后一位为回车
charstrToken[257];
//新生成的单词
intcount;
//标记strToken[]数组下一个方位
char*p;
//标记strInstream[]数组方位
intline;
public:
AccidenceAnalyse()
ch=32;
p=NULL;
count=0;
ifs.open("
test.txt"
ios:
in);
//init_map();
line=0;
intgetLine()
returnline;
voidGetchar()//取当前字符,指针向下移位
ch=*p;
voidgetNBC()
while(ch==32)
Getchar();
voidConcat()
strToken[count]=ch;
count++;
voidAppend()
strToken[count]='
boolisLetter()
if((ch>
a'
ch<
z'
)||(ch>
A'
Z'
))
returntrue;
returnfalse;
boolisDigit()
if(ch>
0'
9'
returntrue;
voidRetract()
ch=32;
p--;
intreserve()
switch(strToken[0])
case'
p'
if(strcmp(strToken,"
)==0)
return1;
return0;
break;
b'
if(strcmp(strToken,"
{
return2;
}
return0;
break;
e'
if(strcmp(strToken,"
return3;
return8;
v'
return4;
case'
i'
return5;
return6;
t'
return7;
return0;
d'
return9;
w'
return10;
default:
return0;
boolProcess(Two_pass*pass)//处理程序返回二值对
if(ifs.eof()!
=0)
if(p==NULL||(int)ch==0)//第一次初始化,或者指针为末尾,引进新的行
line++;
ifs.getline(strInstream,sizeof(strInstream),'
\n'
p=strInstream;
//指针指到首位
pro.Process(strInstream);
Getchar();
getNBC();
//////////////跨行注释代码
if((int)ch==0)
//////////////
count=0;
//每一次取值的时候新的单词放到缓冲数组的第一位
intcode;
if(isLetter())
while(isLetter()||isDigit())
Concat();
Getchar();
Append();
code=reserve();
if(code==0)//为一般的标识符
pass->
Two_copy(strToken,11);
else
Two_copy(code);
else
if(isDigit())
while(isDigit())
Concat();
Append();
Two_copy(strToken,12);
if(ch=='
+'
pass->
Two_copy(13);
Getchar();
if(ch=='
-'
Two_copy(14);
('
Two_copy(15);
Two_copy(24);
Getchar();
if(ch=='
Two_copy(25);
)'
Two_copy(16);
Two_copy(17);
'
Two_copy(18);
Two_copy(19);
Two_copy(20);
'
Two_copy(21);
pass->
Two_copy(23);
Getchar();
else
Two_copy(22);
//returnfalse;
classAnalyseMachine
Two_passSYM;
AccidenceAnalysesss;
boolsysmbol;
QueueErrorqueue;
//错误队列
QueueRightqueue;
//正确队列
AnalyseMachine()
sysmbol=true;
boolgetCorretMess()
returnsysmbol;
boolADVANCE()
returnsss.Process(&
SYM);
voidtest()
inti=0;
while(ADVANCE())
i++;
boolgetNextLine()//取到本行分号;
返回true,如果文件尾返回false
if(SYM.equal(20))
while(sss.Process(&
SYM))
//文件尾
boolZ()//如果有句子,继续分析,返回true,否则为文件尾,返回false
Errorqueue.clear();
//错误消息队列清空
Rightqueue.clear();
//正确队列清空
if(false==ADVANCE())
if(SYM.equal(6))//if语句
Rightqueue.pushQueue(10);
A();
getNextLine();
if(SYM.equal(11))//赋值语句
I();
getNextLine();
else
if(SYM.equal(10))//循环语句
Rightqueue.pushQueue
(2);
L();
getNextLine();
else
ERROR();
if(sysmbol==false)
cout<
false"
true"
///////////////////赋值语句
voidI()
Rightqueue.pushQueue(3);
if(SYM.equal(11))//标识符
J();
if(SYM.equal(23))//赋值号
ADVANCE();
ERROR();
D();
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/*if(SYM.equal(20))
*/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语法分析 程序 报告