📄 word.cpp
字号:
#include "word.h"
#include "fstream.h"
#include "iostream.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h"
/*PutWord 函数的参数,RuseltFile统一采用默认的文件,文件名为result.txt*/
/*在result.txt文件中保存的每一条的信息格式为:每条一行,保存形式为:标识符+空格+编号*/
/*关键字及其编号保存在keyword.txt中,运算符及其编号保存在operator.txt中*/
/*非法输入的标识符的编号是32,合法标识符的编号是31,数字的编号为33,每次遇到回车则记录为:@+空格+34,*/
/*对于组成非法的标识符,在词法分析阶段不给出错误信息,在语法分析和代码生成阶段再给出相应的信息*/
word::word()
{
int i;
fstream keyfile;
char num[9];
keyfile.open("keyword.txt",ios::in|ios::nocreate);
if(keyfile.fail())
{
cout<<"1文件打开失败!程序将退出!"<<endl;
exit(0);
}
InputFile.open("ceshi.txt",ios::in|ios::nocreate);
if(InputFile.fail())
{
cout<<"2文件打开失败!程序将退出!"<<endl;
exit(0);
}
ResultFile.open("result.txt",ios::out|ios::nocreate);
if(ResultFile.fail())
{
cout<<"3文件打开失败!程序将退出!"<<endl;
exit(0);
}
for(i=0;i<15;i++)
{
keyfile.getline(keyword[i],10,' ');
keyfile.getline(num,8,'\n');
}
}
word::~word()
{
InputFile.close();
ResultFile.close();
cout<<"词法分析结束!"<<endl;
cout<<"按任意键进入下一阶段!"<<endl;
getch();
cout<<"进入语法分析阶段,请稍等..........."<<endl;
//cout<<
}
int word::WordAnalyse()//词法分析
{
int i,length,j;
char line[1001]="";
cout<<"进入词法分析阶段,请稍等.............."<<endl;
cout<<"\n输入的原程序为:"<<endl;
while(!InputFile.eof())
{
line[0]=' ';
while(1)//跳过文件中的空格
{
InputFile.get(line[0]);
if(line[0]!=' ')
break;
}
if(InputFile.eof())
break;
line[1]='\0';
InputFile.getline(&line[1],1000,'\n');
length=strlen(line);
for(i=0;i<length;)
{
j=0;
while(1)//跳过文件中的空格
{
if(line[i]!=' ')
break;
i++;
}
if(line[i]>='a'&&line[i]<='z'||line[i]>='A'&&line[i]<='Z')//输入为标识符
{
name[j++]=line[i];
while(1)
{
i++;//指向下一个字符
if(line[i]>='a'&&line[i]<='z'||line[i]>='A'&&line[i]<='Z'||line[i]>='0'&&line[i]<='9')
{
if(j<9)
name[j++]=line[i];
}
else
{
name[j]='\0';
JudgeWord();
ResultFile<<name<<' '<<number<<endl;
cout<<name<<' ';
break;
}
}
}
else if(line[i]>='0'&&line[i]<='9')//输入为数字
{
name[j++]=line[i];
while(1)
{
i++;
if(line[i]>='0'&&line[i]<='9')
{
if(j<9)
name[j++]=line[i];
number=33;
}
else
{
if(line[i]>='a'&&line[i]<='z'||line[i]>='A'&&line[i]<='Z')
{
while(1)
{
if(line[i]>='a'&&line[i]<='z'||line[i]>='A'&&line[i]<='Z')
{
if(j<9)
name[j++]=line[i];
i++;
}
else
{
number=32;
break;
}
}
}
break;
}
}
name[j]='\0';
ResultFile<<name<<' '<<number<<endl;
cout<<name<<' ';
}
else
{
switch(line[i])
{
case '=':name[j++]=line[i++];
number=16;
break;
case '<':name[j++]=line[i++];
if(line[i]=='>')
{
name[j++]=line[i];
number=17;
i++;
}
else if(line[i]=='=')
{
name[j++]=line[i];
number=19;
i++;
}
else
{
number=18;
}
break;
case '>':name[j++]=line[i++];
if(line[i]=='=')
{
name[j++]=line[i++];
number=21;
}
else
{
number=20;
}
break;
case '+':name[j++]=line[i++];
number=22;
break;
case '-':name[j++]=line[i++];
number=23;
break;
case '*':name[j++]=line[i++];
number=24;
break;
case '/':name[j++]=line[i++];
number=25;
break;
case ':':name[j++]=line[i++];
if(line[i]=='=')
{
name[j++]=line[i++];
number=26;
}
else
{
number=32;
}
break;
case '(':name[j++]=line[i++];
number=27;
break;
case ')':name[j++]=line[i++];
number=28;
break;
case ';':name[j++]=line[i++];
number=29;
break;
case ',':name[j++]=line[i++];
number=30;
break;
case '.':name[j++]=line[i++];
number=35;
break;
default:name[j++]=line[i++];
number=32;
}
name[j]='\0';
ResultFile<<name<<' '<<number<<endl;
cout<<name<<' ';
}
}
ResultFile<<"@"<<' '<<34<<endl;
cout<<endl;
}
return 1;
}
void word::JudgeWord(void)
//判断读出来的单词的编号,保存到number中
{
int i;
for(i=0;i<15;i++)
{
if(name[0]==keyword[i][0])
if(strcmp(name,keyword[i])==0)
{
number=i+1;
return;
}
}
number=31;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -