📄 tokenize.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 + -