📄 getsym.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include <fstream.h>
#include <iostream.h>
#include <string.h>
const numbermax=5;
char* sym[18]={"procedure","call","begin","end","if",
"then","while","do","odd","int"
,"char","long","double","even","continue","break","else","var"};
char* ope[8]={"+","-","*","/","<",">","=","#"};
char* ope2[4]={"<=",">=","<>",":="};
char line[80]; //记录单行字符串
char a[10]; //记录sym
int cc=0;
char ch;
int flags=0; //字符范围标记
void getch() //获取字符
{
ch=line[cc];
cc++;
}
void iniArra() //初始化数组a
{
int i=0;
while(i<sizeof(a))
{
a[i]='\0';
i++;
}
}
void iniArrline() //初始化数组line
{
int i=0;
while(i<sizeof(line))
{
line[i]='\0';
i++;
}
}
void error(int type) //编译错误
{
if(type==30)
{
cout<<"数字长度超出范围!\n";
}
if(type==10)
{
cout<<"标示符定义错误!\n";
}
if(type==100)
{
cout<<"无法识别的字符!\n";
}
}
void getsym()
{
ifstream fin("sam.txt");
int i=1;
do
{
iniArrline();
fin.getline(line,sizeof(line)); //读取下一行
cout<<i<<" "<<line<<"\n";
do
{
getch();
}while(ch==' ');
while(line[cc-1]!='\0') //若一行未读完,循环
{
flags=0;
iniArra(); //清空数组a
while(ch==' ')
{
getch();
flags=true;
}
if(ch>='a'&&ch<='z') //第一个为字符
{
int k=0; //a长度记录
int i=0; //关键字表记录长度
bool flag=false; //关键字标记
do //读取变量或关键字
{
if(k<sizeof(a))
{
a[k]=ch;
k++;
}
getch();
}while((ch>='a'&&ch<='z')||(ch>='0'&&ch<='9'));
while(sym[i]) //比较是否关键字
{
if(strcmp(sym[i],a)==0)
{
flag=true;
break;
}else{
flag=false;
i++;
}
}
if(flag)
{
cout<<"基本字 "<<a<<"\n";
}else{
cout<<"标示符 "<<a<<"\n";
}
flags=1;
}
if(ch>='0'&&ch<='9') //第一个为数字
{
int num=0;
int k=0;
do
{
num=num*10+(ch-'0');
k++;
getch();
}while(ch>='0'&&ch<='9');
if(ch>='a'&&ch<='z')
{
while(ch>='a'&&ch<='z')
{
cout<<"错误 "<<num<<ch<<" ";
error(10);
getch();
}
}else if(k>numbermax){
error(30);
}else{
cout<<"常数 "<<num<<"\n";
}
flags=1;
}
if(ch==','||ch==';'||ch==')'||ch=='('||ch==':'||ch=='.')//界符判断
{
do
{
cout<<"界符 "<<ch<<"\n";
getch();
}while(ch==','||ch==';'||ch==')'||ch=='('||ch==':'||ch=='.');
flags=1;
}
if(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='='||ch=='*')//一元运算符判断
{
do
{
cout<<"运算符 "<<ch<<"\n";
getch();
}while(ch=='+'||ch=='-'||ch=='*'||ch=='/'||ch=='='||ch=='*');
flags=1;
}
if(ch=='<') //二元运算符判断
{
char tmp[3]={'\0','\0','\0'};
int i=0;
tmp[i]=ch;
getch();
if(ch=='>'||ch=='=')
{
i++;
tmp[i]=ch;
getch();
cout<<"运算符 "<<tmp<<"\n";
}else{
cout<<"运算符 "<<tmp<<"\n";
}
flags=1;
}
if(ch=='>')
{
char tmp[3]={'\0','\0','\0'};
int i=0;
tmp[i]=ch;
getch();
if(ch=='=')
{
i++;
tmp[i]=ch;
getch();
cout<<"运算符 "<<tmp<<"\n";
}else{
cout<<"运算符 "<<tmp<<"\n";
}
flags=1;
}
if(flags==0) //判断错误
{
cout<<"错误 "<<ch;
error(100);
getch();
}
}
i++;
cc=0;
cout<<"\n";
}while(!fin.eof());
}
void main()
{
getsym();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -