一个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;
}
补充:软件开发 , C++ ,