程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 一個c++語言的詞法分析

一個c++語言的詞法分析

編輯:C++入門知識

在大學時候寫的,當時是匯編語言課程的一個小作業。自己嘗試去完成,但是有點遺憾沒完全。
將該類的代碼發出來,有興趣的可以看看。
// complie.h
// 詞法分析結果信息
struct scanresult
{
CString code; // 代碼值
int nType; // 所屬類型
CString remark; // 類型說明
};


class CComplie
{
public:
// 根據關鍵字exp分割字符
void SplitStr(CString str,CString exp,CStringArray &strnew);
// 自定義的一個Find查找字符
int FindStr(CString str, CString findstr);
// 關鍵函數,詞法掃描
CString Scan(CString str);
// 加載文件
CString LoadFile();
public:
CComplie();
virtual ~CComplie();
public:
// 進一步分離分界符
CString IsSeparate(CString str);
CString CharType(CString str);

// 保存詞法結果輸出1
CString m_strOut;
CString m_result;
// 打開文件名稱
CString m_FileName;
};
// complie.cpp
CComplie::CComplie()
{
m_FileName="";
m_strOut="";
m_result="";
}

CComplie::~CComplie()
{

}

CString CComplie::LoadFile()
{
CString strTemp,strOut;
// 創建一個打開對話框的對象
CFileDialog dlg(TRUE,_T("CPP"),_T("*.cpp"),OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("C++文件(*.cpp)|*.cpp|"));
if(IDOK==dlg.DoModal ())
{
// 獲取得到文件名
m_FileName.Format ("%s",dlg.GetPathName());
// 創建一個文件讀寫對象
CStdioFile sf;
// 打開文件
if(sf.Open((LPCTSTR)m_FileName,CFile::modeRead))
{
// 按行讀取
while(sf.ReadString(strTemp))
{
strOut+=strTemp;
strOut+=" ";
}
}
}
return strOut;
}

CString CComplie::Scan(CString str)
{
CString strleft;
CString strTmp;
// 字符串的結束符號
str+="#";
int i=0;
int j=0;
int k=0;
// 查找回車換行符號
while(i=FindStr(str," "))
{
// 獲取第一個回車左邊的所有字符
strleft=str.Left(i);
// 去掉前後的空格
strleft.TrimLeft();
strleft.TrimRight();
while(j=FindStr(strleft," "))
{
strTmp=strleft.Left(j);
strTmp.TrimLeft();
strTmp.TrimRight();
m_strOut+=strTmp;
m_strOut+="|";
strleft=strleft.Right(strleft.GetLength()-j-1);
strleft.TrimLeft();
strleft.TrimRight();
//MessageBox(strleft);
}

if(!strleft.IsEmpty())
{
strleft.TrimLeft();
strleft.TrimRight();
m_strOut+=strleft;
m_strOut+="|";
}
str=str.Right(str.GetLength()-i-1);
str.TrimRight();
str.TrimLeft();
//MessageBox(str);
}
return m_strOut;
}

int CComplie::FindStr(CString str, CString findstr)
{
int i=0;
i=str.Find(findstr);
if(i==-1)
{
return 0;
}
if(i==0)
{
return 10000;
}
else
{
return i;
}

}

void CComplie::SplitStr(CString str, CString exp,CStringArray &strnew)
{
int nPos=0;
while(nPos=FindStr(str,exp))
{
CString strleft;
strleft=str.Left(nPos);
strnew.Add(strleft);
str=str.Right(str.GetLength()-nPos-1);
}
}

CString CComplie::CharType(CString str)
{
return str;
}

CString CComplie::IsSeparate(CString str)
{
int k=0;
m_result="";
CString strleft;
CStringArray strTmp;
// 分離scan函數分開的單詞,以|分界符
SplitStr(str,"|",strTmp);
// 分界符列表,以#分割
CString separate="{#}#(#)#[#]#=#||#&&#!#,#;#::#<<#"#.#>>#->#%#==#!=#++#--#^#+#-#*#/#";
CStringArray strseparte;
// 分離關鍵字並保存到CString數組
SplitStr(separate,"#",strseparte);
/*
for(int x=0;x {
AfxMessageBox(strseparte[x]);
}
*/
for(int i=0;i {
for(int j=0;j {
while(k=FindStr(strTmp[i],strseparte[j]))
{
if(k==10000)
{
k=1;
strleft=strTmp[i].Left(k+1);
}
strleft=strTmp[i].Left(k);
AfxMessageBox(strleft);
m_result+=strleft;
m_result+="|";
//AfxMessageBox(m_result);
strTmp[i]=strTmp[i].Right(strTmp[i].GetLength()-k);
}

}
if(!strTmp[i].IsEmpty())
{
m_result+=strTmp[i];
m_result+="|";
//AfxMessageBox(m_result);
}
}
return m_result;

}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved