資源簡(jiǎn)介
編譯原理的課程設(shè)計(jì),用c++完成了詞法分析和語(yǔ)法分析的功能,附帶結(jié)題報(bào)告。
代碼片段和文件信息
#include?“head.h“
//詞法分析
void?connect(char?token[]char?ch)//字符連接
{
int?i;
for(i=0;token[i];i++);??
token[i]=ch;
token[++i]=‘\0‘;//結(jié)尾加上終結(jié)符
}
int?reserve(char?token[])//檢查是否是保留字
{
for(int?i=0;i<17;i++)
if(!strcmp(tokenlist[i]))//是保留字
return?WORD;//保留字
return?IDENT;//標(biāo)識(shí)符
}
struct?Token?scanner(char?*buf)//掃描單詞?返回二元式
{
static?int?i=0;//buf指針
Token?t={‘\0‘“NULL“};//臨時(shí)變量
char?token[20]=““;//保存單詞
while(buf[i]==‘?‘)//空格
i++;
if(buf[i]>=‘a(chǎn)‘&&buf[i]<=‘z‘||buf[i]>=‘A‘&&buf[i]<=‘Z‘)//標(biāo)識(shí)符
{
while(buf[i]>=‘a(chǎn)‘&&buf[i]<=‘z‘||buf[i]>=‘A‘&&buf[i]<=‘Z‘||buf[i]>=‘0‘&&buf[i]<=‘9‘)
connect(tokenbuf[i++]);//單詞拼接
t.type=reserve(token);//查看是否是保留字
strcpy(t.valtoken);//賦值
return?t;//返回二元式
}
if(buf[i]>=‘0‘&&buf[i]<=‘9‘)//常數(shù)
{???
while(buf[i]>=‘0‘&&buf[i]<=‘9‘)????
connect(tokenbuf[i++]);???
t.type=CONSTNUM;//常數(shù)
strcpy(t.valtoken);?????
return?t;?
}
switch(buf[i])
{???
case?‘‘:t.type=DELIMIT;t.val[0]=‘‘;t.val[1]=‘\0‘;break;//界符?
case?‘.‘:t.type=DELIMIT;t.val[0]=‘.‘;t.val[1]=‘\0‘;break;?
case?‘;‘:t.type=DELIMIT;t.val[0]=‘;‘;t.val[1]=‘\0‘;break;???
case?‘(‘:t.type=DELIMIT;t.val[0]=‘(‘;t.val[1]=‘\0‘;break;
case?‘)‘:t.type=DELIMIT;t.val[0]=‘)‘;t.val[1]=‘\0‘;break;
case?‘+‘:t.type=OPERATOR;t.val[0]=‘+‘;t.val[1]=‘\0‘;break;//運(yùn)算符
case?‘-‘:t.type=OPERATOR;t.val[0]=‘-‘;t.val[1]=‘\0‘;break;
case?‘*‘:t.type=OPERATOR;t.val[0]=‘*‘;t.val[1]=‘\0‘;break;
case?‘/‘:t.type=OPERATOR;t.val[0]=‘/‘;t.val[1]=‘\0‘;break;
case?‘=‘:t.type=OPERATOR;t.val[0]=‘=‘;t.val[1]=‘\0‘;break;
case?‘>‘:t.type=OPERATOR;strcpy(t.val“rop“);break;
case?‘<‘:t.type=OPERATOR;strcpy(t.val“rop“);break;
case?‘#‘:t.type=DELIMIT;t.val[0]=‘#‘;t.val[1]=‘\0‘;break;
default:cout<<“Error?char>“< }
i++;//指向下個(gè)單詞???
return?t;//返回當(dāng)前單詞的二元式??
}
void?sym()//詞法分析
{
int?i=0;
char?ch1=‘\0‘;//前一個(gè)字符
char?ch2;//當(dāng)前字符
while(fin.read(&ch2sizeof(char)))//讀取字符
{
if(ch2==‘\t‘||ch2==‘\n‘)
ch2=‘?‘;
buf[i++]=ch2;
}
buf[i]=‘#‘;//輸入串末位加上終結(jié)符
cout<<“當(dāng)前輸入串:“< fout<<“當(dāng)前輸入串:“< // Sleep(1000);
//show1();//詞法說(shuō)明
cout<<“詞法分析開(kāi)始...“< fout<<“詞法分析開(kāi)始...“< //Sleep(1000);
Token?t;
do{
t=scanner(buf);
cout<<“(“< fout< //加入token數(shù)組
tokenarr[wordsnum++]=t;
//Sleep(500);
}while(t.val[0]!=‘#‘);
cout<<“詞法分析結(jié)束\n“< fout<<“詞法分析結(jié)束\n“< //Sleep(1000);
}
/*詞法分析結(jié)束應(yīng)該獲得一組諸如此類的(單詞,單詞類型)二元式。
在語(yǔ)法分析階段,將所有的結(jié)構(gòu)體入棧,根據(jù)單詞的類型來(lái)進(jìn)行判別
*/
int?ChangeToColumn(Token?t)//查表獲取該單詞對(duì)應(yīng)的下一個(gè)列的狀態(tài)
{
int?ij;
//id=+*()-;#beginendifthenorandnotroptruefalseSCABKL
if(t.type==3||t.type==4)
{
return?0;?
}
else?if(t.type==5||t.type==2)
{
switch(t.val[0])
{???
case?‘=‘:return?1;break;
case?‘;‘:return?7;break;???
case?‘(‘:return?4;break;
case?‘)‘:return?5;break;
case?‘+‘:return
?屬性????????????大小?????日期????時(shí)間???名稱
-----------?---------??----------?-----??----
?????文件????????610??2018-12-22?13:40??LessonProject\Debug\cl.command.1.tlog
?????文件??????16412??2018-12-22?13:40??LessonProject\Debug\CL.read.1.tlog
?????文件????????264??2018-12-22?13:40??LessonProject\Debug\CL.write.1.tlog
?????文件?????104448??2018-12-22?13:40??LessonProject\Debug\LessonProject.exe
?????文件????????406??2018-12-10?22:07??LessonProject\Debug\LessonProject.exe.em
?????文件????????472??2018-12-10?22:07??LessonProject\Debug\LessonProject.exe.em
?????文件????????381??2018-12-22?13:40??LessonProject\Debug\LessonProject.exe.intermediate.manifest
?????文件????1418812??2018-12-22?13:40??LessonProject\Debug\LessonProject.ilk
?????文件?????????63??2018-12-22?13:40??LessonProject\Debug\LessonProject.lastbuildstate
?????文件???????3846??2018-12-22?13:40??LessonProject\Debug\LessonProject.log
?????文件????1141760??2018-12-22?13:40??LessonProject\Debug\LessonProject.pdb
?????文件????????713??2018-12-10?22:06??LessonProject\Debug\LessonProject.vcxprojResolveAssemblyReference.cache
?????文件??????????0??2018-12-10?22:06??LessonProject\Debug\LessonProject.write.1.tlog
?????文件????????216??2018-12-10?22:06??LessonProject\Debug\LessonProject_manifest.rc
?????文件??????????2??2018-12-22?13:40??LessonProject\Debug\li
?????文件??????????2??2018-12-22?13:40??LessonProject\Debug\li
?????文件??????????2??2018-12-22?13:40??LessonProject\Debug\li
?????文件??????????2??2018-12-22?13:40??LessonProject\Debug\li
?????文件??????????2??2018-12-22?13:40??LessonProject\Debug\li
?????文件??????????2??2018-12-22?13:40??LessonProject\Debug\li
?????文件??????????2??2018-12-22?13:40??LessonProject\Debug\li
?????文件??????????2??2018-12-22?13:40??LessonProject\Debug\li
?????文件??????????2??2018-12-22?13:40??LessonProject\Debug\li
?????文件??????????2??2018-12-22?13:40??LessonProject\Debug\li
?????文件??????????2??2018-12-22?13:40??LessonProject\Debug\li
?????文件??????????2??2018-12-22?13:40??LessonProject\Debug\li
?????文件??????????2??2018-12-22?13:40??LessonProject\Debug\li
?????文件??????????2??2018-12-22?13:40??LessonProject\Debug\li
?????文件??????????2??2018-12-22?13:40??LessonProject\Debug\li
?????文件??????????2??2018-12-22?13:40??LessonProject\Debug\li
............此處省略44個(gè)文件信息
評(píng)論
共有 條評(píng)論