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

📄 tokenize.cpp

📁 PL编译器
💻 CPP
字号:
// Tokenize.cpp: implementation of the CTokenize class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "PascalCompiler.h"
#include "Tokenize.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif


//定义保留字表,用字符指针数组保存
char *pKeyword[KEY_NUM]={"BEGIN","END","IF","THEN","ELSE","WHILE","DO","INTEGER","VAR"};



//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CTokenize::CTokenize()
{

}

CTokenize::~CTokenize()
{

}

//定义词法分析函数
void CTokenize::PASCALscan(FILE * fSource,FILE * fObject)
{
	int i=0;	
	int j;

	//从源文件中读取一个字符
	ch = fgetc(fSource);
	
	while (ch != EOF)
	{
		//如果读入的是空格、换行、水平制表、回车其中之一
		while ((' '==ch) || ('\n'==ch) || ('\t'==ch) || ('\r'==ch))
			ch=fgetc(fSource);	//跳过以上无意义字符
		
		//字母处理
		if (isalpha(ch))		
		{
			token[0] = ch;			//保存识别出的字母
			i = 1;					//标记此字母

			ch = fgetc(fSource);	//继续读下一个字符
			
			//如果是字母和数字则组合成标识符
			while (isalnum(ch))		
			{
				token[i++] = ch;			//将组合标识符保存
				ch = fgetc(fSource);		//继续读下一个字符
			}
			token[i] = '\0';				//标识符组合结束

			//查保留字
			for (j=0; j<KEY_NUM; j++)
			{
				if (0 == strcmp(token,pKeyword[j]))
					break;
			}

			if (j >= KEY_NUM)					//不是保留字
			{
				strncpy(token,token,8);
				token[8] = '\0';
				fprintf(fObject,"%d\t\t\t%s\n",SYN_ID,token);
			}

			else								//是保留字
			{	
				if (!strcmp(token,pKeyword[0]))
					fprintf(fObject,"%d\t\t\t%s\n",SYN_BEGIN,token);

				if (!strcmp(token,pKeyword[1]))
					fprintf(fObject,"%d\t\t\t%s\n",SYN_END,token);

				if (!strcmp(token,pKeyword[2]))
					fprintf(fObject,"%d\t\t\t%s\n",SYN_IF,token);

				if (!strcmp(token,pKeyword[3]))
					fprintf(fObject,"%d\t\t\t%s\n",SYN_THEN,token);
				
				if (!strcmp(token,pKeyword[4]))
					fprintf(fObject,"%d\t\t\t%s\n",SYN_ELSE,token);
				
				if (!strcmp(token,pKeyword[5]))
					fprintf(fObject,"%d\t\t\t%s\n",SYN_WHILE,token);
				
				if (!strcmp(token,pKeyword[6]))
					fprintf(fObject,"%d\t\t\t%s\n",SYN_DO,token);
					
				if (!strcmp(token,pKeyword[7]))
					fprintf(fObject,"%d\t\t\t%s\n",SYN_INTEGER,token);

				if (!strcmp(token,pKeyword[8]))
					fprintf(fObject,"%d\t\t\t%s\n",SYN_VAR,token);
			}
		}

		//数字处理
		else if (isdigit(ch))				
		{
			token[0] = ch;
			i = 1;
			ch = fgetc(fSource);

			//如果下一个字符是数字
			while (isdigit(ch))					
			{
				token[i++] = ch;			//保留组合整数
				ch = fgetc(fSource);		//读下一个字符
			}

			int temp = atoi(token);
			if (temp > 65535)
			{
				token[i] = '\0';
				fprintf(fObject,"%s\t\t\t%s\n","数字大于65535",token);
			}

			else
			{
				token[i] = '\0';			//整数组合结束
				fprintf(fObject,"%d\t\t\t%s\n",SYN_NUM,token);
			}
		}

		//加号处理
		else if ('+' == ch)
		{
			token[0] = ch;
			token[1] = '\0';
			ch = fgetc(fSource);	

			fprintf(fObject,"%d\t\t\t%s\n",SYN_PLUS,token);
		}

		//减号处理
		else if ('-' == ch)
		{
			token[0] = ch;
			token[1] = '\0';
			ch = fgetc(fSource);	
			fprintf(fObject,"%d\t\t\t%s\n",SYN_SUB,token);
		}

		//乘号处理
		else if ('*' == ch)
		{
			token[0] = ch;
			token[1] = '\0';
			ch = fgetc(fSource);	
			fprintf(fObject,"%d\t\t\t%s\n",SYN_MUL,token);
		}

		//分号处理
		else if (';' == ch)
		{
			token[0] = ch;
			token[1] = '\0';
			ch = fgetc(fSource);	
			fprintf(fObject,"%d\t\t\t%s\n",SYN_SEMI,token);
		}

		//句号处理
		else if ('.' == ch)
		{
			token[0] = ch;
			token[1] = '\0';
			ch = fgetc(fSource);
			fprintf(fObject,"%d\t\t\t%s\n",SYN_PERIOD,token);
		}

		//逗号处理
		else if (',' == ch)
		{
			token[0] = ch;
			token[1] = '\0';
			ch = fgetc(fSource);	
			fprintf(fObject,"%d\t\t\t%s\n",SYN_COMMA,token);
		}

		//左小括号处理
		else if ('(' == ch)
		{
			token[0] = ch;
			token[1] = '\0';
			ch = fgetc(fSource);	
			fprintf(fObject,"%d\t\t\t%s\n",SYN_LPAREN,token);
		}

		//右小括号号处理
		else if (')' == ch)
		{
			token[0] = ch;
			token[1] = '\0';
			ch = fgetc(fSource);	
			fprintf(fObject,"%d\t\t\t%s\n",SYN_RPAREN,token);
		}

		//小于号处理
		else if ('<' == ch)
		{
			token[0] = ch;
			ch = fgetc(fSource);

			//小于等于号处理
			if ('=' == ch)
			{
				token[1] = ch;
				token[2] = '\0';
				ch = fgetc(fSource);	
				fprintf(fObject,"%d\t\t\t%s\n",SYN_LE,token);
			}

			//不等于号处理
			else if ('>' == ch)
			{
				token[1] = ch;
				token[2] = '\0';
				ch = fgetc(fSource);	
				fprintf(fObject,"%d\t\t\t%s\n",SYN_NE,token);
			}

			//小于号
			else
			{
				token[1] = '\0';	
				fprintf(fObject,"%d\t\t\t%s\n",SYN_LT,token);
			}
		}

		//大于号处理
		else if ('>' == ch)
		{
			token[0] = ch;
			ch = fgetc(fSource);

			//大于等于号处理
			if ('=' == ch)
			{
				token[1] = ch;
				token[2] = '\0';
				ch = fgetc(fSource);	
				fprintf(fObject,"%d\t\t\t%s\n",SYN_ME,token);
			}

			//大于号
			else
			{
				token[1] = '\0';
				fprintf(fObject,"%d\t\t\t%s\n",SYN_LG,token);
			}
		}

		//等于号处理
		else if('=' == ch)
		{
			token[0] = ch;
			ch = fgetc(fSource);
			if ('=' == ch)
			{
				token[1] = ch;
				token[2] = '\0';
				ch = fgetc(fSource);	
				fprintf(fObject,"%d\t\t\t%s\n",SYN_EQ,token);
			}
		}

		//:=号处理
		else if(':' == ch)
		{
			token[0] = ch;
			ch = fgetc(fSource);
			if ('=' == ch)
			{
				token[1] = ch;
				token[2] = '\0';
				ch = fgetc(fSource);	
				fprintf(fObject,"%d\t\t\t%s\n",SYN_COLE,token);
			}

			else
			{
				token[1] = '\0';
				fprintf(fObject,"%d\t\t\t%s\n",SYN_COLON,token);
			}
		}

		//斜杠号处理
		else if ('/' == ch)
		{
			token[0] = ch;
			ch = fgetc(fSource);

			//多行注释处理
			if ('*' == ch)
			{
				char temp = fgetc(fSource);
				do
				{
					ch = temp;
					temp = fgetc(fSource);
				}while ((ch != '*' || temp != '/') && (temp != EOF));

				ch = fgetc(fSource);
			}

			//单行注释处理
			else if ('/' == ch)
			{
				do
				{
					ch = fgetc(fSource);
				}while ((ch != '\n') && (ch != EOF));

				ch = fgetc(fSource);
			}

			//除号
			else
			{
				token[1] = '\0';
				fprintf(fObject,"%d\t\t\t%s\n",SYN_DIV,token);
			}
		}

		//错误处理
		else		
		{
			token[0] = ch;
			token[1] = '\0';
			ch = fgetc(fSource);
			fprintf(fObject,"%s\t\t\t%s\n","ERROR",token);
		}
	}
		
	fclose(fSource);
	fclose(fObject);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -