?? 1.txt
字號:
/////////////////////////////////////////////////////
// 《編譯原理》實驗一:詞法分析程序 //
/////////////////////////////////////////////////////
// 定義保留字,標識符,常數,運算符,分隔符,其它 //
// 單詞總別碼分別為1,2,3,4,5,6 //
/////////////////////////////////////////////////////
#include <iostream>
#include <fstream>
#include <string>
#include <string.h>
#include <ctype.h>
using namespace std;
char *ReserveWords[8]={"if","int","for","while","do","return","break","continue"};
char GetChar(ifstream &S) //將下一個輸入字符讀到ch中
{
char b;
S.get(b);
return b;
}
char GetBC(ifstream &S) //檢查ch中的字符是否為空白
{
char b;
S.get(b);
while(b==' ')
S.get(b);
return b;
}
void Concat(char *str,char c) //將ch中的字符連接到strToken之后
{
size_t n=strlen(str); //strlen返回str中字符的個數,其中str為一個以'\0'結尾的字符串
str[n++]=c;
str[n]='\0';
}
bool Reserve(const char *str) //判斷保留字
{
bool a = false;
for (int i=0;i<8;i++)
{
if(_stricmp(ReserveWords[i],str)==0)//比較保留字和輸入的字符串,相等返回0
{
a=true;
break;
}
}
return a;
}
char Retract(ifstream &S) //將搜索指示器回調一個位置
{
S.seekg(-1,ios::cur); //把S的讀指針從當前位置回調1個位置
return '\0';
}
void Analyzer(ifstream &S,ofstream &D)
{
//定義保留字,標識符,常數,運算符,分隔符,其它的單詞總別碼分別為1,2,3,4,5,6;
//分析結果輸出的基本格式為“(單詞,單詞總別,單詞總別碼)”
char ch;
char strToken[128]=" ";
ch=GetBC(S);
if(isalpha(ch)) //判斷是保留字還是標識符
{
while(isalpha(ch)||isdigit(ch)||ch=='_')
{
Concat(strToken,ch);
ch=GetChar(S);
}
ch=Retract(S);
if(Reserve(strToken))
D<<"("<<strToken<<",保留字,1)"<<"\n";
else
D<<"("<<strToken<<",標識符,2)"<<"\n";
}
else if(isdigit(ch)) //判斷是否是常數
{
while(isdigit(ch))
{
Concat(strToken,ch);
ch=GetChar(S);
}
Retract(S);
D<<"("<<strToken<<",常數,3)"<<"\n";
}
switch(ch) //判斷是否是運算符,分隔符或其它
{
case('+'):
D<<"("<<ch<<",加,4)"<<"\n";break;
case('-'):
D<<"("<<ch<<",減,4)"<<"\n";break;
case('*'):
D<<"("<<ch<<",乘,4)"<<"\n";break;
case('/'):
D<<"("<<ch<<",除,4)"<<"\n";break;
case('='):
D<<"("<<ch<<",等于,4)"<<"\n";break;
case(','):
D<<"("<<ch<<",逗號,5)"<<"\n";break;
case(';'):
D<<"("<<ch<<",分號,5)"<<"\n";break;
case('{'):
D<<"("<<ch<<",左大括號,5)"<<"\n";break;
case('}'):
D<<"("<<ch<<",右大括號,5)"<<"\n";break;
case('('):
D<<"("<<ch<<",左括號,5)"<<"\n";break;
case(')'):
D<<"("<<ch<<",右括號,5)"<<"\n";break;
default:
D<<"("<<ch<<",其它,6)"<<"\n";break;
}
}
int main(int argc,char *argv[]) //argc是記錄參數的個數,argv記錄調用該主函數時給出的參數內容
{
string strS; //strS為文件名
if (argc==1)
{
cout<<"請輸入需要進行詞法分析的文件:";
getline(cin,strS);
}
ifstream S(strS.c_str());
if(S.fail())
{
cout<<"打開" <<strS<<"文件失敗!"<<endl;
return 1;
}
ofstream D("分析結果.txt");
while(!S.eof()) //返回S里的eof變量,變量在S讀到文件的結束符時變為1
Analyzer(S,D);
S.close();
D.close();
return 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -