⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 myeidtview.cpp

📁 词法分析程序
💻 CPP
字号:
// MyEidtView.cpp : implementation of the CMyEditView class
//

#include "stdafx.h"
#include "afx.h"
#include "SmartC.h"

#include "SmartCDoc.h"
#include "MyEditView.h"
#include "OutputView.h"
#include "OutputTreeView.h"
#include "Cifa.h"
#include "Syntax.h"
#include "Error.h"
//#include "MyString1.h"//这里定义了一些全局变量

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
///以下都是全局变量
/*//记录输出信息
Node outputfront;//这里存结果输出信息
Node errorfront;//这里存错误输出信息
//以上变量在各自view里初始化
int output_linenum=0;
int error_linenum=0;
extern ouput_linenum,error_linenum;
void insertline(Node* node,int* linenum,char* string)
{
	int len=strlen(string);
	Node* temp=node;
	while(temp->next)
	{
		temp=temp->next;
	}
	temp->next=new Node;
	temp->next->next=NULL;
	temp->next->pchar=new char[len+1];
	strcpy(temp->next->pchar,string);
	*linenum+=1;	
}
void freenode(Node* node,int* linenum)
{
	Node* temp;
	while(node->next)
	{
		temp=node->next;
		node->next=node->next->next;
		delete [] temp->pchar;
		delete temp;
	}
	*linenum=0;	
}*/
/////////////////////////////////////////////////////////////////////////////
// CMyEditView

IMPLEMENT_DYNCREATE(CMyEditView, CEditView)

BEGIN_MESSAGE_MAP(CMyEditView, CEditView)
	//{{AFX_MSG_MAP(CMyEditView)
	ON_COMMAND(ID_FILE_OPEN, OnFileOpen)
	ON_COMMAND(ID_RUN, OnRun)
	ON_COMMAND(ID_FILE_SAVE, OnFileSave)
	ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
	ON_WM_LBUTTONDBLCLK()
	//}}AFX_MSG_MAP
	// Standard printing commands
	ON_COMMAND(ID_FILE_PRINT, CEditView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_DIRECT, CEditView::OnFilePrint)
	ON_COMMAND(ID_FILE_PRINT_PREVIEW, CEditView::OnFilePrintPreview)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CMyEditView construction/destruction

CMyEditView::CMyEditView()
{
	// TODO: add construction code here
	m_filename.Empty();
}

CMyEditView::~CMyEditView()
{
}

BOOL CMyEditView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	BOOL bPreCreated = CEditView::PreCreateWindow(cs);
	cs.style &= ~(ES_AUTOHSCROLL|WS_HSCROLL);	// Enable word-wrapping

	return bPreCreated;
}

/////////////////////////////////////////////////////////////////////////////
// CMyEditView drawing

void CMyEditView::OnDraw(CDC* pDC)
{
//	CSmartCDoc* pDoc = GetDocument();
//	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CMyEditView printing

BOOL CMyEditView::OnPreparePrinting(CPrintInfo* pInfo)
{
	// default CEditView preparation
	return CEditView::OnPreparePrinting(pInfo);
}

void CMyEditView::OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	// Default CEditView begin printing.
	CEditView::OnBeginPrinting(pDC, pInfo);
}

void CMyEditView::OnEndPrinting(CDC* pDC, CPrintInfo* pInfo)
{
	// Default CEditView end printing
	CEditView::OnEndPrinting(pDC, pInfo);
}

/////////////////////////////////////////////////////////////////////////////
// CMyEditView diagnostics

#ifdef _DEBUG
void CMyEditView::AssertValid() const
{
	CEditView::AssertValid();
}

void CMyEditView::Dump(CDumpContext& dc) const
{
	CEditView::Dump(dc);
}
/*
CSmartCDoc* CMyEditView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSmartCDoc)));
	return (CSmartCDoc*)m_pDocument;
}*/
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CMyEditView message handlers

void CMyEditView::OnFileOpen() 
{
	// TODO: Add your command handler code here
//	CClientDC dc(this);
	CFile m_file;
	CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("文本文件|*.txt|"));
	if(dlg.DoModal()==IDOK)
	{
		m_filename=dlg.GetPathName();
		if(m_filename.Find('.')==-1)//没有后缀
				m_filename.Insert(555,".txt");
		m_file.Open(m_filename,CFile::modeRead);
		CArchive archive(&m_file,CArchive::load);
		SerializeRaw(archive);
		archive.Close();
		m_file.Close();
	}
	else 
		return;
}

#if !defined INTOTSTRINTTOSTR
#define INTOTSTRINTTOSTR
void inttostr(int n,char *pchar)
{
	int i=0;
	char temp[10];
	if(n<10)//个位数凑足两位
	{
		temp[i]=n+'0';
		i++;
		temp[i]='0';
		i++;
	}
	else
	{
		while(n!=0)
		{
			temp[i]=n%10+'0';
			i++;
			n/=10;
		}
	}
	for(i--;i>=0;i--)
	{
		*pchar=temp[i];
		pchar++;
	}
	*pchar=0;//结尾
}
#endif //INTOTSTRINTTOSTR
#if !defined OUTPUTFILEOUTPUTFILE
#define OUTPUTFILEOUTPUTFILE
int OutputFile(HTREEITEM tempNode,CTreeCtrl *pTree,CArchive *parchive,int layer)
{
	CString		stext;
//HTREEITEM	oldNode;
	stext=pTree->GetItemText(tempNode);
	for(int i=0;i<layer;i++)
		parchive->WriteString("\t");
	parchive->WriteString(stext);
	parchive->WriteString("\n");
//	oldNode=tempNode;
	if(pTree->ItemHasChildren(tempNode))
	{
		tempNode=pTree->GetChildItem(tempNode);
		while(tempNode!=NULL)
		{
			OutputFile(tempNode,pTree,parchive,layer+1);
			tempNode=pTree->GetNextItem(tempNode,TVGN_NEXT);
		}
	}
	return 1;
}
#endif //OUTPUTFILEOUTPUTFILE
void CMyEditView::OnRun()
{
	CSmartCDoc* thedoc=(class CSmartCDoc*) GetDocument();
	ASSERT_VALID(thedoc);
	//free node list when run agan
	thedoc->freenode(0);
	thedoc->freenode(1);
	char mystr[230];
//	TOKEN temp;
	CEdit& theEdit = GetEditCtrl();
	POSITION pos = thedoc->GetFirstViewPosition();
	thedoc->GetNextView(pos);
	COutputTreeView* pView=(COutputTreeView*) thedoc->GetNextView(pos);
	HTREEITEM	tempNode;
	CTreeCtrl   &tTree = pView->GetTreeCtrl ();
	tTree.DeleteAllItems();
	pView->OnInitialUpdate();
	Error error(thedoc);
//	Cifa cf(&theEdit,&error);
	Syntax syntax(&theEdit,&error,pView);
	syntax.Programe();
	mystr[0]=0;
/*	while(cf.GetNextToken(&temp)!=MYEOF)
	{
		inttostr(temp.tokentype,mystr);
		strcat(mystr,"      ");
		// NOT id int or keyword add to 注释
		if(temp.tokentype!=IDSY&&temp.tokentype!=INTSY&&temp.tokentype!=VOIDSY&&temp.tokentype!=CSTRINGSY&&temp.tokentype>8)
			strcat(mystr,"                      ");
		strcat(mystr,temp.pchar);
		thedoc->insertline(0,mystr);
		mystr[0]=0;
	}*/
	/*strcpy(mystr,"0 Error(s),0 Warning(s)");
	thedoc->insertline(1,mystr);
	thedoc->insertline(1,mystr);
	thedoc->insertline(1,mystr);
	thedoc->insertline(1,mystr);
	thedoc->insertline(1,mystr);
	thedoc->insertline(1,mystr);*/
	//以下是输出文件操作
/*	Node* node;
	node=thedoc->outputfront.next;
	if(node!=NULL)//输出结果不为空
	{*/
		if(m_filename.Replace(".txt",".obj")!=0)//换后缀,此为输出文件名
		{
			CStdioFile m_file;
			CString		stext;
		//	int len;
		//	mystr[0]=0;
			m_file.Open(m_filename,CStdioFile::modeWrite|CStdioFile::modeCreate);
		//	m_file.Open(m_filename,CFile::modeCreate|CFile::modeWrite);
			CArchive archive(&m_file,CArchive::store);
			//SerializeRaw(archive);
			//archive.WriteObject((CObject*)this);
			tempNode=tTree.GetRootItem();
			OutputFile(tempNode,&tTree,&archive,0);
			archive.Close();
			m_file.Close();
		/*	while(node)
			{
				strcpy(mystr,node->pchar);
				len=strlen(mystr);
			//	mystr[len]='\r';
				mystr[len]='\n';
				mystr[len+1]=0;
				m_file.WriteString(mystr);
				node=node->next;
				mystr[0]=0;
			}
			m_file.Close();*/
			m_filename.Replace(".obj",".txt");//把后缀换回
		}
//	}
	thedoc->UpdateAllViews(NULL);
}

void CMyEditView::OnFileSave() 
{
	// TODO: Add your command handler code here
	CFile m_file;
	if(!m_filename.IsEmpty())
	{
		m_file.Open(m_filename,CFile::modeCreate|CFile::modeWrite);
		CArchive archive(&m_file,CArchive::store);
		SerializeRaw(archive);
		//archive.WriteObject(this);
		archive.Close();
		m_file.Close();
	}
	else
	{
		CFileDialog dlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("文本文件|*.txt|"));
		if(dlg.DoModal()==IDOK)
		{
			m_filename=dlg.GetPathName();
			if(m_filename.Find('.')==-1)//没有后缀
				m_filename.Insert(555,".txt");
			m_file.Open(m_filename,CFile::modeWrite|CFile::modeCreate);
			CArchive archive(&m_file,CArchive::store);
			SerializeRaw(archive);
			//archive.WriteObject(this);
			archive.Close();
			m_file.Close();
		}
	
	}
}

void CMyEditView::OnFileSaveAs() 
{
	// TODO: Add your command handler code here
	CFile m_file;
	CFileDialog dlg(FALSE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,_T("文本文件|*.txt|"));
	if(dlg.DoModal()==IDOK)
	{
		m_filename=dlg.GetPathName();
		if(m_filename.Find('.')==-1)//没有后缀
			m_filename.Insert(555,".txt");
		m_file.Open(m_filename,CFile::modeWrite|CFile::modeCreate);
		CArchive archive(&m_file,CArchive::store);
		SerializeRaw(archive);
		archive.Close();
		m_file.Close();
	}
}

void CMyEditView::OnInitialUpdate() 
{
	CEditView::OnInitialUpdate();
	
	// TODO: Add your specialized code here and/or call the base class
	SetTabStops(16);
}

void CMyEditView::OnLButtonDblClk(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	CEdit& theEdit = GetEditCtrl();
	int start=theEdit.LineIndex(1);
	int end=start+theEdit.LineLength(1);
	theEdit.SetSel(start,end);
	CEditView::OnLButtonDblClk(nFlags, point);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -