⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 getsym.cpp

📁 能够实现词法分析,是我在学编译时做的,希望多提意见
💻 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 + -