📄 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 + -