C语言和C++兼容在一起写的词法分析器DOC.docx
- 文档编号:28195412
- 上传时间:2023-07-09
- 格式:DOCX
- 页数:43
- 大小:22.43KB
C语言和C++兼容在一起写的词法分析器DOC.docx
《C语言和C++兼容在一起写的词法分析器DOC.docx》由会员分享,可在线阅读,更多相关《C语言和C++兼容在一起写的词法分析器DOC.docx(43页珍藏版)》请在冰豆网上搜索。
C语言和C++兼容在一起写的词法分析器DOC
//MainFrm.cpp:
implementationoftheCMainFrameclass
//
#include"stdafx.h"
#include"MainFrm.h"
#include"ErrorView.h"
#include"SourceView.h"
#include"OutputView.h"
#include"Edit_Mechine.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
#defineSum_of_keyWord26
intId_change=Sum_of_keyWord;
constchar*keyWord[Sum_of_keyWord]={"program","var","integer","bool","real","char","const","begin",
"if","then","else","while","do","repeat","until","for","to","not","or","define","int","float","long","struct","typedef","endif"};//关键字1—6
//char*Others[]={"+","-","*","/",":
",":
=","<>","<=",">",">=","=",";","(",")","#"};//运算符,分隔符13-1617-1820-280
IMPLEMENT_DYNCREATE(CMainFrame,CFrameWnd)
BEGIN_MESSAGE_MAP(CMainFrame,CFrameWnd)
//{{AFX_MSG_MAP(CMainFrame)
ON_WM_CREATE()
ON_COMMAND(ID_LexAnalyzer,OnLexAnalyzer)
ON_COMMAND(ID_FILE_OPEN,OnFileOpen)
ON_COMMAND(ID_FILE_OUTPUT_SAVE,OnFileOutputSave)
ON_COMMAND(ID_FILE_ERROR_SAVE,OnFileErrorSave)
ON_COMMAND(ID_FILE_SOURCE_SAVE_SAVE_AS,OnFileSourceSaveSaveAs)
ON_COMMAND(ID_FILE_OUTPUT_SAVE_AS,OnFileOutputSaveAs)
ON_COMMAND(ID_FILE_ERROR_SAVE_AS,OnFileErrorSaveAs)
ON_COMMAND(ID_FILE_SAVE_AS_HELP,OnFileSaveAsHelp)
ON_COMMAND(ID_FILE_HELP,OnFileHelp)
ON_COMMAND(KEYWORD_INPUT,OnInput)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
staticUINTindicators[]=
{
ID_SEPARATOR,//statuslineindicator
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
/////////////////////////////////////////////////////////////////////////////
//CMainFrameconstruction/destruction
CMainFrame:
:
CMainFrame()
{
//TODO:
addmemberinitializationcodehere
Line=1;
memset(temp,0,sizeof(temp));
HEAD_OF_Error=NULL;
BODY_OF_Error=NULL;
Sourcefile=NULL;
HEAD_OF_KeyWord=NULL;
BODY_OF_KeyWord=NULL;
m_strFileNamePath="fanjian.txt";
HEAD_OF_KeyWordBox=NULL;
BODY_OF_KeyWordBox=NULL;
TRANSPORT_OF_Error=NULL;
TRANSPORT_OF_KeyWord=NULL;
TRANSPORT_OF_KeyWordBox=NULL;
HEAD_OF_Error=(structError*)malloc(sizeof(structError));
HEAD_OF_KeyWord=(structKeyWord*)malloc(sizeof(structKeyWord));
HEAD_OF_KeyWordBox=(structKeyWordBox*)malloc(sizeof(structKeyWordBox));
HEAD_OF_Error->next=NULL;
HEAD_OF_KeyWord->next=NULL;
HEAD_OF_KeyWordBox->next=NULL;
TRANSPORT_OF_Error=HEAD_OF_Error;
TRANSPORT_OF_KeyWord=HEAD_OF_KeyWord;
TRANSPORT_OF_KeyWordBox=HEAD_OF_KeyWordBox;
m_strEdit_Source="=========================源文件窗口===========================\r\n";
m_strEdit_Output="=========================输出文件窗口=========================\r\n";
m_strEdit_Error="=========================错误信息窗口=========================\r\n";
}
CMainFrame:
:
~CMainFrame()
{
}
intCMainFrame:
:
OnCreate(LPCREATESTRUCTlpCreateStruct)
{
if(CFrameWnd:
:
OnCreate(lpCreateStruct)==-1)
return-1;
if(!
m_wndToolBar.CreateEx(this,TBSTYLE_FLAT,WS_CHILD|WS_VISIBLE|CBRS_TOP
|CBRS_GRIPPER|CBRS_TOOLTIPS|CBRS_FLYBY|CBRS_SIZE_DYNAMIC)||
!
m_wndToolBar.LoadToolBar(IDR_MAINFRAME))
{
TRACE0("Failedtocreatetoolbar\n");
return-1;//failtocreate
}
if(!
m_wndStatusBar.Create(this)||
!
m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))
{
TRACE0("Failedtocreatestatusbar\n");
return-1;//failtocreate
}
//TODO:
Deletethesethreelinesifyoudon'twantthetoolbarto
//bedockable
m_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);
EnableDocking(CBRS_ALIGN_ANY);
DockControlBar(&m_wndToolBar);
return0;
}
BOOLCMainFrame:
:
PreCreateWindow(CREATESTRUCT&cs)
{
if(!
CFrameWnd:
:
PreCreateWindow(cs))
returnFALSE;
//TODO:
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
returnTRUE;
}
/////////////////////////////////////////////////////////////////////////////
//CMainFramediagnostics
#ifdef_DEBUG
voidCMainFrame:
:
AssertValid()const
{
CFrameWnd:
:
AssertValid();
}
voidCMainFrame:
:
Dump(CDumpContext&dc)const
{
CFrameWnd:
:
Dump(dc);
}
#endif//_DEBUG
/////////////////////////////////////////////////////////////////////////////
//CMainFramemessagehandlers
voidCMainFrame:
:
OnLexAnalyzer()
{
//TODO:
Addyourcommandhandlercodehere
charch;
CMainFrame*pMainFrame=(CMainFrame*)AfxGetMainWnd();
COutputView*pOutputView=(COutputView*)pMainFrame->m_wndSplitter2.GetPane(0,0);
CErrorView*pErrorView=(CErrorView*)pMainFrame->m_wndSplitter2.GetPane(1,0);
Sourcefile=fopen(m_strFileNamePath,"r");
if(Sourcefile==NULL)
{
char*OpenFileOut="无法打开!
!
!
\r\n或是错误文件名\r\n或是此软件出现了问题,建议\r\n在编辑框中直接输入测试程序。
";
m_strEdit_Output+=OpenFileOut;
UpdateData(FALSE);
}
else
{
while(!
feof(Sourcefile))
{
ch=fgetc(Sourcefile);//读入一个字符
if(isalpha(ch)||ch=='_')//是英文字符
{
LetterProcess(ch,Sourcefile);//字母处理
}
elseif(isdigit(ch))//是数字
{
NumberProcess(ch,Sourcefile);//数字处理
}
elseif(ch=='\t'||ch==''||ch=='\n')
{
if(ch=='\n')
{
Line++;
}
;
}
else
{
OtherProcess(ch,Sourcefile);//其他字符处理
}
}
fclose(Sourcefile);//关闭
TRANSPORT_OF_KeyWord=HEAD_OF_KeyWord->next;
chartr[5];
memset(tr,0,sizeof(tr));
while(TRANSPORT_OF_KeyWord!
=NULL)
{
TRANSPORT_OF_KeyWordBox=HEAD_OF_KeyWordBox->next;
while(TRANSPORT_OF_KeyWordBox!
=NULL)
{
if(strcmp(TRANSPORT_OF_KeyWord->Name,TRANSPORT_OF_KeyWordBox->Name)==0)
{
TRANSPORT_OF_KeyWord->Id=TRANSPORT_OF_KeyWordBox->Id;
strcpy(TRANSPORT_OF_KeyWord->Type,TRANSPORT_OF_KeyWordBox->Type);
}
TRANSPORT_OF_KeyWordBox=TRANSPORT_OF_KeyWordBox->next;
}
memset(tr,0,sizeof(tr));
itoa(TRANSPORT_OF_KeyWord->Id,tr,10);
charId[5];
memset(Id,0,sizeof(Id));
strcpy(Id,tr);
charName[30];
memset(Name,0,sizeof(Name));
strcpy(Name,TRANSPORT_OF_KeyWord->Name);
memset(tr,0,sizeof(tr));
itoa(TRANSPORT_OF_KeyWord->Line,tr,10);
charLine[5];
memset(Line,0,sizeof(Line));
strcpy(Line,tr);
charType[30];
memset(Type,0,sizeof(Type));
strcpy(Type,TRANSPORT_OF_KeyWord->Type);
m_strEdit_Output+=CString(Id)+"\t\t";
m_strEdit_Output+=CString(Name)+"\t\t";
m_strEdit_Output+=CString(Line)+"\t\t";
m_strEdit_Output+=CString(Type);
m_strEdit_Output+="\r\n";
TRANSPORT_OF_KeyWord=TRANSPORT_OF_KeyWord->next;
}
//************************************************************************
TRANSPORT_OF_Error=HEAD_OF_Error->next;
while(TRANSPORT_OF_Error!
=NULL)
{
memset(tr,0,sizeof(tr));
itoa(TRANSPORT_OF_Error->Line,tr,10);
CStringLine=CString(tr);
Line+="\t";
memset(tr,0,sizeof(tr));
CStringName=CString(TRANSPORT_OF_Error->Name);
Name+="\t";
CStringMsg=CString(TRANSPORT_OF_Error->Msg);
Msg+="\r";
Msg+="\n";
m_strEdit_Error+=(Line+Name+Msg);
TRANSPORT_OF_Error=TRANSPORT_OF_Error->next;
}
}
//************************************************************************
pOutputView->SetWindowText(m_strEdit_Output);
pErrorView->SetWindowText(m_strEdit_Error);
}
BOOLCMainFrame:
:
OnCreateClient(LPCREATESTRUCTlpcs,CCreateContext*pContext)
{
//TODO:
Addyourspecializedcodehereand/orcallthebaseclass
if(!
m_wndSplitter1.CreateStatic(this,1,2))
{
TRACE0("Failedtocreatenestedsplitter\n");
returnFALSE;
}
if(!
m_wndSplitter2.CreateStatic(&m_wndSplitter1,2,1,WS_CHILD|WS_VISIBLE|WS_BORDER,m_wndSplitter1.IdFromRowCol(0,1)))
{
TRACE0("Failedtocreatenestedsplitter\n");
returnFALSE;
}
CRectrect;
GetClientRect(&rect);
intcx=rect.Width();
intcy=rect.Height();
if(!
m_wndSplitter1.CreateView(0,0,RUNTIME_CLASS(CSourceView),CSize(cx/2,0),pContext))
{
TRACE0("Failedtocreatenestedsplitter\n");
returnFALSE;
}
if(!
m_wndSplitter2.CreateView(0,0,RUNTIME_CLASS(COutputView),CSize(0,cy/2+100),pContext))
{
TRACE0("Failedtocreatenestedsplitter\n");
returnFALSE;
}
if(!
m_wndSplitter2.CreateView(1,0,RUNTIME_CLASS(CErrorView),CSize(0,0),pContext))
{
TRACE0("Failedtocreatenestedsplitter\n");
returnFALSE;
}
returnTRUE;
/*returnCFrameWnd:
:
OnCreateClient(lpcs,pContext);*/
}
voidCMainFrame:
:
OnFileOpen()
{
//TODO:
Addyourcommandhandlercodehere
charch;
CMainFrame*pMainFrame=(CMainFrame*)AfxGetMainWnd();
CSourceView*pSourceView=(CSourceView*)pMainFrame->m_wndSplitter1.GetPane(0,0);
//pSourceView->DestroyWindow();
CFileDialogdlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"TextFiles(*.c;*.txt;*.src)|*.c;*.txt;*.src");//设置读取的文件类型
if(dlg.DoModal()==IDOK)
{
m_strFileNamePath=dlg.GetPathName();//取文件的路径
Sourcefile=fopen(m_strFileNamePath,"r");
UpdateData(FALSE);
if(Sourcefile==NULL)
{
char*OpenFileOut="无法打开!
!
!
\r\n或是错误文件名\r\n或是此软件出现了问题,建议\r\n在编辑框中直接输入测试程序。
";
m_strEdit_Source=OpenFileOut;
UpdateData(FALSE);
}
else
{
while(!
feof(Sourcefile))
{
ch=fgetc(Sourcefile);//读入一个字符
if(feof(Sourcefile))
{
break;
}
if(ch=='\n')
{
m_strEdit_Source+='\r';
m_strEdit_Source+='\n';
}
else
m_strEdit_Source+=ch;
}
fseek(Sourcefile,0,SEEK_SET);
}
fclose(Sourcefile);//关闭
}
pSourceView->SetWindowText(m_strEdit_Source);
}
//*****************************************************************************************************************************
voidCMainFrame:
:
ClearTemp()
{
for(inti=0;i<20;i++)
{
temp[i]=NULL;
}
}
//******************************************************************************************************************************
//读入数字
//******************************************************************************************************************************
voidCMainF
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 C+ 兼容 在一起 词法 分析器 DOC