📄 词法分析器(文件).cpp
字号:
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<fstream>
#include<string>
using namespace std;
ofstream fout1("token.txt");
ofstream fout2("number.txt");
ofstream fout3("string.txt");
//ifstream fin("source.txt");
void scan();
int judge(char ch);//判断输入字符的类型
void out1(char ch);//写入token.txt
void out2(char ch,string word);//写入number.txt
void out3(char ch,string word);//写入string.txt
FILE *fp;//文件source.txt
int wordcount;//标志符计数
int numcount;//整型常数计数
int err;//标志词法分析结果正确或错误
void main()
{
wordcount=0;
numcount=0;
err=0;
scan();
if(err==0)
cout<<"词法分析正确完成!"<<endl;
cout<<endl;
system("pause");
}
void scan()
{
char ch;
string word;
char document[50];
int flag=0;
cout<<"请输入源文件路径及名称:";
cin>>document;
cout<<endl;
if((fp=fopen(document,"rt"))==NULL)
{
err=1;
cout<<"无法找到该文件!"<<endl;
return;
}
while(!feof(fp))
{
word="";
ch=fgetc(fp);
flag=judge(ch);
if(flag==1)
out1(ch);
else if(flag==2)
out2(ch,word);
else if(flag==3)
out3(ch,word);
else if(flag==4 || flag==5 ||flag==6)
continue;
else
{
cout<<"错误:非法字符! "<<ch<<endl;
err=1;
}
}
fclose(fp);
}
int judge(char ch)
{
int flag=0;
if(ch=='=' || ch=='+' || ch=='*' || ch=='(' || ch==')' || ch=='<' || ch==';' || ch=='{' || ch=='}')
flag=1;//符号
else if('0'<=ch && ch<='9')
flag=2;//数字
else if(('a'<=ch && ch<='z') || ('A'<=ch && ch<='Z'))
flag=3;//字母
else if(ch==' ')
flag=4;//空格
else if(feof(fp))
flag=5;//结束
else if(ch=='\n')
flag=6;//换行
else
flag=0;//非法字符
return(flag);
}
void out1(char ch)
{
int id;
switch(ch)
{
case '=' : id=1;break;
case '+' : id=2;break;
case '*' : id=3;break;
case '(' : id=4;break;
case ')' : id=5;break;
case '<' : id=6;break;
case ';' : id=10;break;
case '{' : id=11;break;
case '}' : id=12;break;
default : id=0;
}
fout1<<id<<endl;
return;
}
void out2(char ch,string word)
{
int flag=0;
word=word+ch;
ch=fgetc(fp);
flag=judge(ch);
if(flag==1)
{
numcount++;
fout1<<"26"<<" "<<numcount<<endl;
fout2<<numcount<<" "<<"26"<<" "<<word<<endl;
out1(ch);
}
else if(flag==2)
out2(ch,word);
else if(flag==3)
{
err=1;
cout<<"错误:数字后面跟字母!"<<endl;
return;
}
else if(flag==4 || flag==5 || flag==6)
{
numcount++;
fout1<<"26"<<" "<<numcount<<endl;
fout2<<numcount<<" "<<"26"<<" "<<word<<endl;
return;
}
else
{
err=1;
cout<<"错误:非法字符! "<<ch<<endl;
return;
}
}
void out3(char ch,string word)
{
int flag=0;
word=word+ch;
ch=fgetc(fp);
flag=judge(ch);
if(flag==1 || flag==4 || flag==5 || flag==6)
{
if(word=="and" || word=="if" || word=="while" || word=="int" || word=="true" || word=="false")
{
if(word=="and")
fout1<<"7"<<endl;
else if(word=="if")
fout1<<"8"<<endl;
else if(word=="while")
fout1<<"9"<<endl;
else if(word=="int")
fout1<<"13"<<endl;
else if(word=="true")
fout1<<"14"<<endl;
else if(word=="false")
fout1<<"15"<<endl;
if(flag==1)
out1(ch);
else if(flag==4 || flag==5 || flag==6)
return;
}
else if(flag==1)
{
wordcount++;
fout1<<"25"<<" "<<wordcount<<endl;
fout3<<wordcount<<" "<<"25"<<" "<<word<<endl;
out1(ch);
}
else if(flag==4 || flag==5 || flag==6)
{
wordcount++;
fout1<<"25"<<" "<<wordcount<<endl;
fout3<<wordcount<<" "<<"25"<<" "<<word<<endl;
}
return;
}
else if(flag==2 || flag==3)
out3(ch,word);
else
{
err=1;
cout<<"错误:非法字符! "<<ch<<endl;
return;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -