資源簡介
通過設計編制調試一個具體的詞法分析程序,加深對詞法分析原理的理解。并掌握在對程序設計語言源程序進行掃描過程中將其分解為各類單詞的詞法分析方法。

代碼片段和文件信息
#include?
#include?
char?set[1000];??/*用于存放代碼,以字符形式存放*/
char?str[500];???/*用于存放預處理過的代碼*/
char?strtoken[20];??/*用于暫時存放字符串*/
char?ch;
int?srto;
typedef?struct?keytable????/*放置關鍵字*/
{
????char?name[20];
????int??kind;
}KEYTABLE;
KEYTABLE?keyword[]={??????/*設置關鍵字*/??????????????????????
??????????????????????{“if“1}
??????????????????????{“int“1}
??????????????????????{“for“1}
??????????????????????{“while“1}
??????????????????????{“do“1}
??????????????????????{“return“1}
??????????????????????{“break“1}
??????????????????????{“continue“1}??????????????????????
??????????????????????{“default“2}
????????????????????};
KEYTABLE?arr1[10]={
{“+“4}
{“-“4}
{“*“4}
{“/“4}
{“=“4}
{“<“4}
{“>“4}
{“!“4}
};
KEYTABLE?arr2[10]={
{““5}
{“;“5}
{“{“5}
{“}“5}
{“(“5}
{“)“5}
};
void?openfile()???/*打開文件*/
{
??FILE?*fp;
??char?filename[10];
??int?n=0;
??printf(“請輸入源文件名(包括路徑和后綴名):“);
??gets(filename);
??if((fp=fopen(filename“r“))==NULL)
????{
??????printf(“無法打開該文件!!!請確認該文件存在!\n“);
????}
??else
??????while(!feof(fp))??/*文件不結束,則循環*/
???????{
?????????set[n]=getc(fp);???/*文件的每一個字符都放入set[]數組中*/
?????????n++;
???????}
??fclose(fp);????????????/*關閉文件*/
??set[n-1]=‘\0‘;
??printf(“\n-------------------Source?Code--------------------------\n“);
??puts(set);
??printf(“\n--------------------------------------------------------\n“);
}
void?prearrange()???/*預處理程序,主要用于去除連續空格和換行符*/
{
????int?j=0;
????sr=0;????/*全局變量sr是str[]的指示器*/
????while(set[j]!=‘\0‘)
????{
????if(set[j]==‘?‘?||?set[j]==‘\n‘)
????????{
???????????while(set[j]==‘?‘?||?set[j]==‘\n‘)?/*掃描到有連續的空格或換行符*/
?????????????????j++;
???????????str[sr]=‘?‘;????/*用一個空格代替掃描到的連續空格和換行符放入str[]*/
???????????sr++;
????????}
????else
???????{
?????????str[sr]=set[j];??/*若當前字符不為空格或換行符就直接放入str[]*/
?????????sr++;
?????????j++;
???????}
????}
????str[sr]=‘\0‘;
}
void?GetChar()
{
//do
//{
ch=str[sr++];
//}while(ch==‘?‘);
}
void?Concat()
{
???strtoken[to]=ch;
???to++;????????????/*全局變量to是strtoken的指示器*/
???strtoken[to]=‘\0‘;
}
void?panduan(){//判斷雙運算符
if(ch==‘>‘){
GetChar();
??if((ch==‘>‘)||(ch==‘=‘))
??????Concat();
??else{?sr=sr-2;//回滾
??GetChar();}
}else?if(ch==‘<‘){
GetChar();
??if((ch==‘<‘)||(ch==‘=‘))
??????Concat();
??else{????sr=sr-2;
??GetChar();}
??
}else?if(ch==‘!‘){
GetChar();
??if(ch==‘=‘)
??????Concat();
??else{?sr=sr-2;
??GetChar();}
??????
}else?if(ch==‘=‘){
GetChar();
??if(ch==‘=‘)
??????Concat();
??else{??sr=sr-2;
??GetChar();}
?????
}
}
int?Reserve()??/*對strtoken中的字符串查找保留字表,若是則返回它的編碼,否則返回0*/
{
???int?ik=1;?
???for(i=0;i<=20;i++)
?????{
???????if(strcmp(strtokenkeyword[i].name)==0)
?????????{?
???k=0;???????????
???????????return(keyword[i].kind);
?????????}
?????}
???if(k)
??????return?0;
}
int?Reserve2()
{
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????74240??2011-05-11?00:06??編繹實驗1報告.doc
?????文件??????57344??2010-06-14?10:07??實驗一?詞法分析.doc
?????文件???????4893??2011-05-10?22:50??my\my01.cpp
?????文件???????3377??2011-05-10?18:54??my\my01.dsp
?????文件????????516??2011-05-10?23:49??my\my01.dsw
?????文件??????41984??2011-05-10?23:49??my\my01.ncb
?????文件??????48640??2011-05-10?23:49??my\my01.opt
?????文件????????736??2011-05-10?23:45??my\my01.plg
?????文件?????180303??2011-05-10?23:45??my\Debug\my01.exe
?????文件?????214212??2011-05-10?23:45??my\Debug\my01.ilk
?????文件??????13851??2011-05-10?23:45??my\Debug\my01.obj
?????文件?????217468??2011-05-10?19:23??my\Debug\my01.pch
?????文件?????459776??2011-05-10?22:50??my\Debug\my01.pdb
?????文件??????33792??2011-05-10?23:45??my\Debug\vc60.idb
?????文件??????53248??2011-05-10?22:50??my\Debug\vc60.pdb
?????目錄??????????0??2011-05-10?23:49??my\Debug
?????目錄??????????0??2011-05-10?23:49??my
-----------?---------??----------?-----??----
??????????????1404380????????????????????17
評論
共有 條評論