?? classpt.cpp
字號:
#include "StdAfx.h"
#include "ClassPt.h"
CString Compare(CString,CString);
void ClassPt::Empty()
{
int i;
Count=0;
NewNonTerminator='A';
for(i=0;i<50;i++)
{
pleft[i].Empty();
pright[i].Empty();
priority[i]=9; //優先級設置為最大,用于文法排序
}
}
bool ClassPt::RecordDel(CString left,CString right)
{
int i,j;
for(i=0;i<Count;i++)
{
if(left==pleft[i] && right==pright[i])
{
for(j=i;j<Count-1;j++)
{
pleft[j]=pleft[j+1];
pright[j]=pright[j+1];
}
pleft[j].Empty();
pright[j].Empty();
priority[j]=9;
Count--;
return(true);
}
}
return(false);
}
int ClassPt::RecordDel(CString left)
{
int i,j;
int num=0;
for(i=0;i<Count;i++)
{
if(left==pleft[i])
{
for(j=i;j<Count-1;j++)
{
pleft[j]=pleft[j+1];
pright[j]=pright[j+1];
}
pleft[j].Empty();
pright[j].Empty();
priority[j]=9;
Count--;
i--;
num++;
}
}
return(num);
}
bool ClassPt::RecordFind(CString left)
{
int i;
for(i=0;i<Count;i++)
{
if(left==pleft[i])
return(true);
}
return(false);
}
void ClassPt::RecordApp(CString left,CString right)
{
pleft[Count]=left;
pright[Count]=right;
Count++;
}
void ClassPt::GetInVn(CString str) //錄入原始非終結符集
{
Vn.Empty();
Vn=str;
}
void ClassPt::GetInVnPrimal(CString str)
{
VnPrimal.Empty();
VnPrimal=str;
}
CString ClassPt::GetNewVn() //得到ClassPt類的所有非終結符集
{
int i;
CString Vnn;
Vnn.Empty();
for(i=0;i<Count;i++)
{
if(VnPrimal.Find(pleft[i][0])!=-1 && Vnn.Find(pleft[i][0])==-1)
Vnn+=pleft[i][0];
}
for(i=0;i<Count;i++)
{
if(Vnn.Find(pleft[i][0])==-1)
Vnn+=pleft[i][0];
}
Vn=Vnn;
return(Vn);
}
void ClassPt::SetStarter() //設置文法開始符號
{
Starter=pleft[0][0];
}
void ClassPt::GetNewNonTerminator() //得到一個新的非終結符
{
GetNewVn();
while(Vn.Find(NewNonTerminator)!=-1)
NewNonTerminator++;
Vn+=NewNonTerminator;
}
void ClassPt::InsteadOf(CString ToInstead,CString BeInstead)
{
int i,j,jmax;
CString buffer[10];
CString BufferLeft,BufferRight;
CString left,right;
for(i=0;i<10;i++)
buffer[i].Empty();
j=0;
for(i=0;i<Count;i++) //將ToInstead的右部存入buffer
{
if(pleft[i]==ToInstead)
{
buffer[j]=pright[i];
if(buffer[j]=="ε")
buffer[j].Empty();
j++;
}
}
jmax=j;
for(i=0;i<Count;i++)
{
if(pleft[i]==BeInstead && pright[i][0]==ToInstead)
{
BufferLeft=pleft[i];
BufferRight=pright[i];
BufferRight.Delete(0,1);
pright[i]=BufferRight;
pright[i].Insert(0,buffer[0]);
if(pright[i]=="")
pright[i]="ε";
for(j=1;j<jmax;j++)
{
left=BufferLeft;
right=BufferRight;
right.Insert(0,buffer[j]);
if(right=="")
right="ε";
RecordApp(left,right);
}
}
}
}
void ClassPt::SetPriority() //設置文法優先級
{
int i;
int pos;
for(i=0;i<Count;i++)
{
if(pleft[i]==Starter) //開始符號優先級設置為0
priority[i]=0;
if(Vn.Find(pleft[i])!=-1 && pleft[i]!=Starter)
{
pos=Vn.Find(pleft[i]); //得到非終結符在Vn中位置,
priority[i]=pos; //并設置為其優先級
}
if(Vn.Find(pleft[i])==-1) //新增加的非終結符
priority[i]=8; //優先級設置為8
}
}
void ClassPt::Sort() //根據優先級對文法進行冒泡排序
{
int i,j;
CString buffer;
for(i=0;i<Count;i++) //將優先級插入文法左部第一位,準備排序
{
pleft[i].Insert(0,priority[i]);
}
for(i=0;i<Count-1;i++)
for(j=i+1;j<Count;j++)
{
if(pleft[i]>pleft[j])
{
buffer=pleft[i]; //交換左部
pleft[i]=pleft[j];
pleft[j]=buffer;
buffer=pright[i]; //交換右部
pright[i]=pright[j];
pright[j]=buffer;
}
}
for(i=0;i<Count;i++) //排序結束,將優先級從文法左部去除,還原文法
{
pleft[i].Delete(0,1);
}
}
int ClassPt::GetLength()
{
return(Count);
}
int ClassPt::GetNum(char Letter)
{
int Num=0;
for(int i=0;i<Count;i++)
{
if(pleft[i][0]==Letter)
Num++;
}
return(Num);
}
CString Compare(CString str1,CString str2)
{
int pos=0;
CString resemblance;
resemblance.Empty();
while(str1[pos]==str2[pos])
{
resemblance+=str1[pos];
if(pos==str1.GetLength()-1 || pos==str2.GetLength()-1)
return(resemblance);
pos++;
}
return(resemblance);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -