📄 词法.cpp
字号:
#include<iostream.h>
#include<fstream.h>
#include<stdlib.h>
#include"string.h"
int num=0;
char *coding[61]=
{
" ", "and", "array", "begin", "bool", "call",
"case", "char", "constant","dim", "do",
"else", "end", "false", "for", "if",
"input", "integer", "not", "of", "or",
"output","procedure","program", "read", "real",
"repeat","set", "stop", "then", "to",
"true", "until", "var", "while", "write",
"标识符","整数", "字符常数","(", ")",
"*", "*/", "+", ",", "-",
".", "..", "/", "/*", ":",
":=", ";", "<", "<=", "<>",
"=", ">", ">=", "[", "]"
};
struct Identify //存放单词
{
int index;
char identify[30];
};
struct error //存放错误
{
int errn;
int line1;
char errword;
};
error errid[100];
int ch=0; //搜索指示器]
int line=0;
int ch3=0;
char ch2; //存放当前取得的字符
char array[200]=""; //存放一行字符
int wordn=0; //结构数组下标
char word[20]; //存放构成单词符号的字符串
int errn=0;
int err[10]; //出错信息;
Identify wordID[100]; //符号表,存放标识符
void ReadChar() //将下一个输入字读进ch2
{
ch2=array[ch];
ch++;
}
void IsBlack()
{
while(ch2==' ')
{
ReadChar();
}
}
void Concat() //将ch中的字符链接到word后,搜索指示器前移一个字符
{
word[ch3]=ch2;
ch3++;
}
bool IsLetter()
{
if(ch2>='a'&&ch2<='z'||ch2>='A'&&ch2<='Z')
return(1);
else
return(0);
}
bool IsDigit()
{
if(ch2>='0'&&ch2<='9')
return(1);
else
return(0);
}
int Reserve()
{
for(int a=1;a<61;a++)
{
if(strcmp(word,coding[a])==0)
return(a);
}
return(0);
}
int InsertId()
{
strcpy(wordID[wordn].identify,word);
wordID[wordn].index++;
wordn++;
return wordn;
}
void main()
{
int code;
int ind=0;
int value=0;
int value2=0;
int op=0;
int i=0;
int u=0;
int compute=0;
char filename[10];
cout<<"......................................................................"<<endl;
cout<<" 计算机学院2002级2班 "<<endl;
cout<<" 冯煦亮 "<<endl;
cout<<" 200245003020 "<<endl;
cout<<"......................................................................"<<endl;
cout<<"请输入文件路径及文件名:";
cin>>filename;
ifstream file(filename,ios::in);
while(!file.eof())
{
loop:
line++;
ch=0;
ch3=0;
file.getline(array,200);
ReadChar(); //预取一个字符
while(ch2!='\0')
{
IsBlack(); //判断是否为空格,是则调用readchar,直至ch2不为空格
if(IsLetter()) //判断是否字母
{
while( IsLetter()||IsDigit() ) //保留字或标识符
{
Concat(); //把字符加入word
ReadChar( ); //读下一个字符
}
word[ch3]='\0';
ch3=0;
code=Reserve(); //判是否保留字
if(code==0) //是标识符
{
for(int t=0;t<=wordn;t++)
{
if(strcmp(wordID[t].identify,word)==0)
{
cout<<"("<<36<<","<<t+1<<")";
op=1;
num++;
if(num==5)
{
cout<<endl;
num=0;
}
}
}
if(op!=1)
{
wordn=InsertId();
cout<<"("<<36<<","<<wordn<<")";num++;
if(num==5)
{
cout<<endl;
num=0;
}
}
}
else //是保留字
{cout<<"("<<code<<","<<"-"<<")";
num++;
if(num==5)
{
cout<<endl;
num=0;
}
}
}
else if(IsDigit())
{
while(IsDigit())
{
Concat();
ReadChar();
}
word[ch3]='\0';
ch3=0;
op=0;
for(int t=0;t<=wordn;t++)
{
if(strcmp(wordID[t].identify,word)==0)
{
cout<<"("<<37<<","<<t+1<<")"; op=1;
num++;
if(num==5)
{
cout<<endl;
num=0;
}
}
}
if(op!=1)
{
wordn=InsertId();
cout<<"("<<37<<","<<wordn<<")";
num++;
if(num==5)
{
cout<<endl;
num=0;
}
}
}
else if(ch2=='\'')
{
u++;
ReadChar( );
while( IsLetter()||IsDigit() )
{
Concat();
ReadChar( );
}
word[ch3]='\0';
ch3=0;
op=0;
if(ch2=='\'')
{
u++;
for(int t=0;t<=wordn;t++)
{
if(strcmp(wordID[t].identify,word)==0)
{
cout<<"("<<38<<","<<t+1<<")";
op=1;
num++;
if(num==5)
{
cout<<endl;
num=0;
}
}
}
if(op!=1)
{
wordn=InsertId();
cout<<"("<<38<<","<<wordn<<")";
num++;
if(num==5)
{
cout<<endl;
num=0;
}
}
}
else
if(u==1)
{errid[compute].line1=line; //右边单引号
errid[compute++].errn=2;}
u=0;
ReadChar( );
}
else if(ch2=='(')
{
cout<<"(39,-)";
ReadChar( );
num++;
if(num==5)
{
cout<<endl;
num=0;
}
}
else if(ch2==')')
{
cout<<"(40,-)";
ReadChar( );
num++;
if(num==5)
{
cout<<endl;
num=0;
}
}
else if(ch2=='*')
{
ReadChar();
if(ch2=='/')
{
cout<<"(42,-)";
num++;
if(num==5)
{
cout<<endl;
num=0;
}
}
else
{
ch--;
cout<<"(41,-)";
num++;
if(num==5)
{
cout<<endl;
num=0;
}
ReadChar( );
}
}
else if(ch2=='+')
{
cout<<"(43,-)";
ReadChar( );
num++;
if(num==5)
{
cout<<endl;
num=0;
}
}
else if(ch2==',')
{
cout<<"(44,-)";
ReadChar( );
num++;
if(num==5)
{
cout<<endl;
num=0;
}
}
else if(ch2=='-')
{
cout<<"(45,-)";
ReadChar( );
num++;
if(num==5)
{
cout<<endl;
num=0;
}
}
else if(ch2=='.')
{
ReadChar();
if(ch2=='.')
{
cout<<"(47,-)";
num++;
if(num==5)
{
cout<<endl;
num=0;
}
ReadChar( );
}
else
{
cout<<"(46,-)";
num++;
if(num==5)
{
cout<<endl;
num=0;
}
}
}
else if(ch2=='/')
{
ReadChar();
if(ch2=='*')
{
ReadChar( );
while(ch2!='*')
ReadChar( );
if(ch2=='*')
{
ReadChar( );
if(ch2=='/')
ReadChar( );
else
{
errid[compute].errn=1; //右边届符
errid[compute++].line1=line;
goto loop;
}
}
else
{
cout<<"(49,-)";
num++;
if(num==5)
{
cout<<endl;
num=0;
}
ReadChar( );
}
}
else
{
cout<<"(48,-)";
num++;
if(num==5)
{
cout<<endl;
num=0;
}
}
ReadChar( );
}
else if(ch2==':')
{
ReadChar();
if(ch2=='=')
{
cout<<"(51,-)";
num++;
if(num==5)
{
cout<<endl;
num=0;
}
ReadChar( );
}
else
{
ch--;
cout<<"(50,-)";
num++;
if(num==5)
{
cout<<endl;
num=0;
}
ReadChar( );
}
}
else if(ch2==';')
{
cout<<"(52,-)";
ReadChar( );
num++;
if(num==5)
{
cout<<endl;
num=0;
}
}
else if(ch2=='<')
{
ReadChar();
if(ch2=='=')
{
cout<<"(54,-)";
num++;
if(num==5)
{
cout<<endl;
num=0;
}
ReadChar( );
}
else
if(ch2=='>')
{
cout<<"(55,-)";
num++;
if(num==5)
{
cout<<endl;
num=0;
}
ReadChar( );
}
else
{
ch--;
cout<<"(53,-)";
num++;
if(num==5)
{
cout<<endl;
num=0;
}
ReadChar( );
}
}
else if(ch2=='>')
{
ReadChar();
if(ch2=='=')
{
cout<<"(58,-)";
num++;
if(num==5)
{
cout<<endl;
num=0;
}
ReadChar( );
}
else
{
ch--;
cout<<"(57,-)";
num++;
if(num==5)
{
cout<<endl;
num=0;
}
ReadChar( );
}
}
else if(ch2=='=')
{
cout<<"(56,-)";
ReadChar( );
num++;
if(num==5)
{
cout<<endl;
num=0;
}
}
else if(ch2=='[')
{
cout<<"(59,-)";
ReadChar( );
num++;
if(num==5)
{
cout<<endl;
num=0;
}
}
else if(ch2==']')
{
cout<<"(60,-)";
ReadChar( );
num++;
if(num==5)
{
cout<<endl;
num=0;
}
}
else
{
errid[compute].errword=ch2; //非法字符
errid[compute].errn=3;
errid[compute].line1=line;
compute++;
ReadChar( );
}
}
}
for(int y=0;y<compute;y++)
{
if(errid[y].errn==1)
cout<<"第"<<errid[y].line1<<"行注释部分缺右边的界符*/"<<endl;
if(errid[y].errn==2)
cout<<"第"<<errid[y].line1<<"行字符常数缺右边的单引号'"<<endl;
if(errid[y].errn==3)
{ cout<<"第"<<errid[y].line1<<"行出现非法字符";
cout<<errid[y].errword<<endl;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -