📄 getsym.cpp
字号:
#include <stdio.h>
#include <stdlib.h>
#include <iostream.h>
#include <string.h>
#include <ctype.h>
#include "b.h"
#include "getsym.h"
#include "errout.h"
extern FILE *fp;//源文件指针
extern FILE *err;//错误输出
extern int lineNnm;
extern char *SYM;
extern char *ID;
extern double NUM;
extern REWord REWords[20];//保留字
#define BLOCKSIZE 4096
bool canread=true;
char buf;
char buffer[BLOCKSIZE];
int max(int a,int b)
{
if(a>b) return a;
else return b;
}
char GETCH()
{//取一个字符
char c;
fread(&c,1,1,fp);
return c;
}
int getSYM()
{
//////////////////////////////////////////////////////////////////////////开始读文件
char *buff=new char[256];
int i,j,length;
double d;
if (canread)
{
buf=GETCH();
canread=false;
}
if(buf==NULL)
{
errout('f',"\n");
return 1;
}
do
{
if (isspace(buf))
{//空白字符就继续读
// printf("%i",buf);
if (buf==10)
{
// printf("----------\n");
lineNnm++;
}
buf=GETCH();
continue;
}
else if (ispunct(buf))
{//符号
printf("符号");
switch (buf)
{//ID从11开始
case '=':
printf("%c\n",buf);
SYM="=SYM";
buf=GETCH();
break;
case ',':
printf("%c\n",buf);
SYM=",SYM";
buf=GETCH();
break;
case ';':
printf("%c\n",buf);
SYM=";SYM";
buf=GETCH();
break;
case '+':
printf("%c\n",buf);
SYM="+SYM";
buf=GETCH();
break;
case '-':
printf("%c\n",buf);
SYM="-SYM";
buf=GETCH();
break;
case '*':
printf("%c\n",buf);
SYM="*SYM";
buf=GETCH();
break;
case '/':
printf("%c\n",buf);
SYM="/SYM";
buf=GETCH();
break;
case '#':
printf("%c\n",buf);
SYM="#SYM";
buf=GETCH();
break;
case '(':
printf("%c\n",buf);
SYM="(SYM";
buf=GETCH();
break;
case ')':
printf("%c\n",buf);
SYM=")SYM";
buf=GETCH();
break;
case ':':
printf("%c\n",buf);
SYM=":SYM";
buf=GETCH();
if (buf=='=')
{//识别出:=
printf(":=\n");
SYM=":=SYM";
buf=GETCH();
}
break;
case '<':
printf("%c\n",buf);
SYM="<SYM";
buf=GETCH();
if (buf=='=')
{//识别出<=
buf=GETCH();
SYM="<=SYM";
}
break;
case '>':
printf("%c\n",buf);
SYM=">SYM";
buf=GETCH();
if (buf=='=')
{//识别出>=
SYM=">=SYM";
buf=GETCH();
}
break;
default:
//错误情况
// printf("%c\n",buf);
errout('c',"出现未知字符!");
buf=GETCH();
break;
}
break;
}
else if (isalpha(buf))
{//字母
memset(buff,'\0',256);
i=0;
do
{
buff[i++]=buf;
//取下一个
buf=GETCH();
} while (isalpha(buf)||isdigit(buf)||'.'==buf);//是字母数字串
if (isalpha(buff[1])||isdigit(buff[1])||'.'==buff[1])
{//不是个单字母
for (j=0;j<10;j++)
{
//cout<<strlen(REWords[j].KEY)<<" "<<i<<endl;
if (0==strncmp(buff,REWords[j].KEY,max(strlen(REWords[j].KEY),i)))
{
// printf("ok!\n");
SYM=REWords[j].SYM;
cout<<SYM<<endl;
break;
}
}
if(10==j)
{//不是保留字
printf("%s\n",buff);
SYM="IDENT";
ID=buff;
cout<<SYM<<" "<<ID<<endl;
}
}
else
{//是单字母
printf("%c\n",buff[0]);
SYM="IDENT";
ID=buff;
cout<<SYM<<" "<<ID<<endl;
}
if(ispunct(buf))
{
if(!(';'==buf||'<'==buf||'>'==buf||'='==buf||'('==buf||')'==buf||'/'==buf
||'*'==buf||'+'==buf||'-'==buf||','==buf||':'==buf))
{
errout('c',"标示符拼写非法!");
}
}
break;
}
else if (isdigit(buf))
{//数字
memset(buff,'\0',256);
i=0;
do
{
buff[i++]=buf;
//取下一个
buf=GETCH();
} while (isdigit(buf)||buf=='.');
if(!isspace(buf)&&buf!=';'&&!(';'==buf||'<'==buf||'>'==buf||'='==buf||'('==buf||')'==buf||'/'==buf
||'*'==buf||'+'==buf||'-'==buf||','==buf||':'==buf))
{
errout('c',"数字后有非法字符!");
}
d=atof(buff);
SYM="NUMBER";
NUM=d;
cout<<SYM<<" "<<NUM<<endl;
break;
}
else
{
errout('c',"出现未知字符!");
}
buf=GETCH();
} while (buf>=0);//buf=-1 is end of file
delete buff;
if (buf<0)
{
return -1;
}
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -