?? 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 + -