?? cfenxi.cpp
字號:
// CFenXi.cpp: implementation of the CFenXi class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "Lojo.h"
#include "CFenXi.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#define WORDLEN 20
#define NUMLEN 8
#endif
CFenXi::CFenXi(){}
CFenXi::~CFenXi(){}
/*================================================================
* 函數名: CiFaFenXi
* 功能描述: 詞法分析 (public)
* 返回值: void
================================================================*/
void CFenXi::CiFaFenXi(){
BOOL flag=false;
char token[20];
int k,v;
init();
for (int i=0;i<m_n;i++) //當第2次調用該函數時,就要釋放前1次的資源
delete m_cifa[i];
int n=0; //用于指示當前的字符
m_n=0; //詞法結果的個數
while (m_str[n])
{
if (flag) //在注釋區內
{
while (!((m_str[n]=='*')&&(m_str[n+1]=='/'))) //注釋 "*/"
{
if (m_str[n]) n++;
else break;
}
if (m_str[n])
{
n++;
n++;
flag=false;
}
}//注釋區外
while (1)// 跳過空白符號
{
while ((m_str[n]==32) || (m_str[n]==9)) n++;
if (!((m_str[n]==13) && (m_str[n+1]==10))) break;
n++;
n++;
}
if (isalpha(m_str[n])) //字母開頭
{
k=0;
while (1)
{
if (k<WORDLEN-1) //標志符的長度為20
token[k++]=m_str[n++];
else
n++;
if (!isalnum(m_str[n])) //如果不是數字或字母就退出
break;
}
token[k]=0;
v=FindInKWTab(token); //查找關鍵詞表
if (v) //如果是關鍵詞
{
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=0;
m_cifa[m_n]->nType=v;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n-k;
m_n++;
}
else //普通標志符
{
m_cifa[m_n]=new CIFA;
/*----------在詞法分析結果中查找-----------*/
int vv=1;
for (int i=0;i<m_n;i++)
{
if (m_cifa[i]->nType==1)
{
vv++;
if (!::stricmp(m_cifa[i]->szText,token))
m_cifa[m_n]->nValue= m_cifa[i]->nValue;
}
}
m_cifa[m_n]->nValue=vv;
/*---------------------------------------*/
m_cifa[m_n]->nType=1;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n-k;
m_n++;
}
}
else if (isdigit(m_str[n])) //數字
{
k=0;
BOOL error=false;
BOOL isreal=false;
while (1)
{
if (k<=NUMLEN) //
token[k++]=m_str[n++];
else
{
error=true;
n++;
}
if (!isdigit(m_str[n])){
if(m_str[n]=='.') isreal=true;//實數
else break;
}
}
token[k]=0;
v=::strtol(token,NULL,10);
if (error)
{
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=1;
m_cifa[m_n]->nType=0;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n-k;
m_n++;
}
else
{
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=v;
if(isreal) m_cifa[m_n]->nType=3; //實數
else m_cifa[m_n]->nType=2;//整數
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n-k;
m_n++;
}
}
else
switch (m_str[n]) //其他符號
{
case '+':
case '-':
case '*':
case '~':
case '&':
case '|':
case '=':
case ';':
case '.':
case ',':
case '(':
case ')':
case '[':
case ']':
token[0]=m_str[n];
token[1]=0;
v=FindInKWTab(token);
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=0;
m_cifa[m_n]->nType=v;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n;
m_n++;
n++;
break;
case '\0':
break;
case '/':
switch (m_str[n+1])
{
case '*':
n++;
n++;
flag=true;
break;
default:
token[0]=m_str[n];
token[1]=0;
v=FindInKWTab(token);
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=0;
m_cifa[m_n]->nType=v;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n;
m_n++;
n++;
}
break;
case '<':
switch (m_str[n+1])
{
case '=':
token[0]=m_str[n];
token[1]=m_str[n+1];
token[2]=0;
v=FindInKWTab(token);
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=0;
m_cifa[m_n]->nType=v;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n;
m_n++;
n++;
n++;
break;
case '>':
token[0]=m_str[n];
token[1]=m_str[n+1];
token[2]=0;
v=FindInKWTab(token);
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=0;
m_cifa[m_n]->nType=v;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n;
m_n++;
n++;
n++;
break;
default:
token[0]=m_str[n];
token[1]=0;
v=FindInKWTab(token);
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=0;
m_cifa[m_n]->nType=v;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n;
m_n++;
n++;
}
break;
case '>':
switch (m_str[n+1])
{
case '=':
token[0]=m_str[n];
token[1]=m_str[n+1];
token[2]=0;
v=FindInKWTab(token);
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=0;
m_cifa[m_n]->nType=v;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n;
m_n++;
n++;
n++;
break;
default:
token[0]=m_str[n];
token[1]=0;
v=FindInKWTab(token);
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=0;
m_cifa[m_n]->nType=v;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n;
m_n++;
n++;
}
break;
case ':':
switch (m_str[n+1])
{
case '=':
token[0]=m_str[n];
token[1]=m_str[n+1];
token[2]=0;
v=FindInKWTab(token);
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=0;
m_cifa[m_n]->nType=v;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n;
m_n++;
n++;
n++;
break;
default:
token[0]=m_str[n];
token[1]=0;
v=FindInKWTab(token);
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=0;
m_cifa[m_n]->nType=v;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n;
m_n++;
n++;
}
break;
default:
token[0]=m_str[n];
token[1]=0;
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=2;
m_cifa[m_n]->nType=0;
strcpy(m_cifa[m_n]->szText,token);
m_cifa[m_n]->nAddr=n;
m_n++;
n++;
}
if (m_n==10000-2) //詞法分析的結果的個數規定為10000
{
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=99;
m_cifa[m_n]->nType=0;
strcpy(m_cifa[m_n]->szText,"");
m_cifa[m_n]->nAddr=n-1;
m_n++;
break;
}
}
m_cifa[m_n]=new CIFA;
m_cifa[m_n]->nValue=0;
m_cifa[m_n]->nType=-1; //結束符
strcpy(m_cifa[m_n]->szText,"");
m_cifa[m_n]->nAddr=0;
m_n++;
return;
}
/*================================================================
* 函數名: FindInKWTab(char * a)
* 功能描述: 在關鍵字表中查找 (protected)
* 返回值: int (如果找到返回在表中的位置,否則返回0)
================================================================*/
int CFenXi::FindInKWTab(char * a)
{
for (int i=0;i<50;i++)
if (!::stricmp(m_szKW[i],a)) //找到
return i;
return 0; //未找到
}
/*================================================================
* 函數名: init
* 功能描述: 用于初始化關鍵字表和錯誤信息表 (protected)
* 返回值: void
================================================================*/
void CFenXi::init()
{
strcpy(m_szKW[0],"");
strcpy(m_szKW[1],"");//標識符
strcpy(m_szKW[2],"");//整數
strcpy(m_szKW[3],"");//實數
strcpy(m_szKW[4],"TRUE"); //布爾值
strcpy(m_szKW[5],"FALSE");
strcpy(m_szKW[6],"CONST"); //變量類型
strcpy(m_szKW[7],"INTEGER");
strcpy(m_szKW[8],"REAL");
strcpy(m_szKW[9],"BOOLEAN");
strcpy(m_szKW[10],"ARRAY");
strcpy(m_szKW[11],"PROGRAM"); //程序架構
strcpy(m_szKW[12],"FUNCTION");
strcpy(m_szKW[13],"RETURN");
strcpy(m_szKW[14],"BEGIN"); //起始結束
strcpy(m_szKW[15],"END");
strcpy(m_szKW[16],"IF");//條件
strcpy(m_szKW[17],"THEN");
strcpy(m_szKW[18],"ELSE");
strcpy(m_szKW[19],"WHILE"); //循環1
strcpy(m_szKW[20],"DO");
strcpy(m_szKW[21],"FOR");//循環2
strcpy(m_szKW[22],"TO");
strcpy(m_szKW[23],"REPEAT");//循環3
strcpy(m_szKW[24],"UNTIL");
strcpy(m_szKW[25],"READ"); //讀寫
strcpy(m_szKW[26],"WRITE");
strcpy(m_szKW[27],"*");//運算符
strcpy(m_szKW[28],"/");
strcpy(m_szKW[29],"+");
strcpy(m_szKW[30],"-");
strcpy(m_szKW[31],"<");
strcpy(m_szKW[32],"<=");
strcpy(m_szKW[33],">");
strcpy(m_szKW[34],">=");
strcpy(m_szKW[35],"=");
strcpy(m_szKW[36],"<>");
strcpy(m_szKW[37],"~");
strcpy(m_szKW[38],"&");
strcpy(m_szKW[39],"|");
strcpy(m_szKW[40],":=");
strcpy(m_szKW[41],";");//分割符
strcpy(m_szKW[42],":");
strcpy(m_szKW[43],".");
strcpy(m_szKW[44],",");
strcpy(m_szKW[45],"(");
strcpy(m_szKW[46],")");
strcpy(m_szKW[47],"[");
strcpy(m_szKW[48],"]");
strcpy(m_szKW[49],"/*");
strcpy(m_szKW[50],"*/");
strcpy(m_szTP[0],"未知 ");
strcpy(m_szTP[1],"標識符 ");
strcpy(m_szTP[2],"整數 ");
strcpy(m_szTP[3],"實數 ");
strcpy(m_szTP[4],"布爾數 ");
strcpy(m_szTP[5],"關鍵字 ");
strcpy(m_szTP[6],"運算符 ");
strcpy(m_szTP[7],"分割符 ");
strcpy(m_szErrMsg[0],"正確!");
strcpy(m_szErrMsg[1],"數字位數過長!");
strcpy(m_szErrMsg[2],"非法字符!");
strcpy(m_szErrMsg[3],"缺少關鍵字“ program ”!");
strcpy(m_szErrMsg[4],"program 后缺少標識符!");
strcpy(m_szErrMsg[5],"缺少“ ; ”符號!");
strcpy(m_szErrMsg[6],"缺少程序結束符“ . ”符號!");
strcpy(m_szErrMsg[7],"缺少《程序體》,應為 begin,integer,real,function");
strcpy(m_szErrMsg[8],"缺少保留字“ begin ”!");
strcpy(m_szErrMsg[9],"缺少《語句》,應為 begin,ID,if,while,call");
strcpy(m_szErrMsg[10],"缺少保留字“ end ”!");
strcpy(m_szErrMsg[11],"缺少《聲明》,應為 integer,real,function");
strcpy(m_szErrMsg[12],"缺少保留字 integer 或 real!");
strcpy(m_szErrMsg[13],"function 后缺少標識符!");
strcpy(m_szErrMsg[14],"變量聲明后缺少標識符!");
strcpy(m_szErrMsg[15],"缺少保留字“ function ”!");
strcpy(m_szErrMsg[16],"缺少 “ ( ”符號!");
strcpy(m_szErrMsg[17],"缺少 “ ) ”符號!");
strcpy(m_szErrMsg[18],"缺少形參標識符 !");
strcpy(m_szErrMsg[19],"缺少 “ : ”符號!");
strcpy(m_szErrMsg[20],"缺少標識符!");
strcpy(m_szErrMsg[21],"缺少賦值符號“ := ”!");
strcpy(m_szErrMsg[22],"缺少保留字“ if ”!");
strcpy(m_szErrMsg[24],"缺少保留字“ while ”!");
strcpy(m_szErrMsg[25],"缺少保留字“ do ”!");
strcpy(m_szErrMsg[26],"缺少保留字“ call ”!");
strcpy(m_szErrMsg[27],"缺少被調過程名標識符!");
strcpy(m_szErrMsg[28],"缺少《因子》,應為 (,ID,NUMBER");
strcpy(m_szErrMsg[29],"缺少《布爾表達式》,應為 ~,(,ID,NUMBER");
strcpy(m_szErrMsg[30],"缺少《關系》!");
strcpy(m_szErrMsg[31],"變量名不能和過程名相同!");
strcpy(m_szErrMsg[32],"標識符重復聲明!");
strcpy(m_szErrMsg[33],"未聲明標識符!");
strcpy(m_szErrMsg[34],"不能直接引用過程名!");
strcpy(m_szErrMsg[35],"不能從real轉換為integer類型!");
strcpy(m_szErrMsg[36],"不能用常數作實參!");
strcpy(m_szErrMsg[37],"變參應為變量!");
strcpy(m_szErrMsg[38],"實參個數不足!");
strcpy(m_szErrMsg[39],"只有integer和integer才能比較!");
strcpy(m_szErrMsg[40],"不能這樣調用過程!");
strcpy(m_szErrMsg[41],"");
strcpy(m_szErrMsg[42],"");
strcpy(m_szErrMsg[43],"");
strcpy(m_szErrMsg[96],"源程序結束符 end. 后還有多余內容!");
strcpy(m_szErrMsg[97],"語法錯誤太多,終止語法分析!");
strcpy(m_szErrMsg[98],"源程序不正常結束!");
strcpy(m_szErrMsg[99],"內存不足!詞法分析終止!");
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -