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

📄 tgrammdoc.cpp

📁 中文词法分析器
💻 CPP
字号:
// TGrammDoc.cpp : implementation of the CTGrammDoc class
//

#include "stdafx.h"
#include "TGramm.h"

#include "TGrammDoc.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CTGrammDoc

IMPLEMENT_DYNCREATE(CTGrammDoc, CDocument)

BEGIN_MESSAGE_MAP(CTGrammDoc, CDocument)
	//{{AFX_MSG_MAP(CTGrammDoc)
	ON_COMMAND(ID_QUERY, OnQuery)
	ON_COMMAND(ID_FILE_SAVE, OnFileSave)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTGrammDoc construction/destruction

CTGrammDoc::CTGrammDoc()
{
	// TODO: add one-time construction code here
	m_Paratiao = 0;
	ispartone = false;
	A_gramer.RemoveAll();
	A_PartOne.RemoveAll();
	A_PartTwo.RemoveAll();
	
	m_part1 = _T("");
	m_part2 = _T("");
	m_part3 = _T("");
	initData();
}

CTGrammDoc::~CTGrammDoc()
{
}

BOOL CTGrammDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	((CEditView*)m_viewList.GetHead())->SetWindowText(NULL);

	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)

	return TRUE;
}



/////////////////////////////////////////////////////////////////////////////
// CTGrammDoc serialization

void CTGrammDoc::Serialize(CArchive& ar)
{
	// CEditView contains an edit control which handles all serialization
	((CEditView*)m_viewList.GetHead())->SerializeRaw(ar);
}

/////////////////////////////////////////////////////////////////////////////
// CTGrammDoc diagnostics

#ifdef _DEBUG
void CTGrammDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CTGrammDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CTGrammDoc commands

void CTGrammDoc::initData()
{
	CFile files;
	if(files.Open("grammer.ini",CFile::modeRead))
	{
		char* buff;
		DWORD length;
		length = files.GetLength();
		buff = new char[length+1];
		files.Read(buff,length);
		files.Close();
		CString str(buff);
		delete[] buff;
		GetGramer(str);
	}
	else{
		AfxMessageBox("加载grammer.ini文件出错!");
	}
}

void CTGrammDoc::GetGramer(CString str)
{
	if (str.IsEmpty())
	{
		return;
	}

	A_gramer.RemoveAll();
	int pos;
	while((pos=str.Find('\n'))!=-1)
	{
		if (pos<3 && str.GetLength()>3)
		{
			str.Delete(0,pos+1);
			continue;
		}
		else if (str.GetLength()<2)
		{
			break;
		}
		CString line = str.Left(pos);
		str.Delete(0,pos+1);
		if (line.GetLength()>4)
		{
			Grammer tt = GetOneGramer(line,m_Paratiao);
			A_gramer.Add(tt);
		}
		m_Paratiao++;
	}
	if (str.GetLength()>4)
	{
		m_Paratiao++;
		Grammer tt = GetOneGramer(str,m_Paratiao);
		A_gramer.Add(tt);
	}
}

Grammer CTGrammDoc::GetOneGramer(CString line, int index)
{
	Grammer temp;
	int pos1,pos2;
	if ((pos1 = line.Find("->"))!=-1)
	{
		if ((pos2 = line.Find(" ::"))!=-1)
		{
			temp.coondition = line.Mid(pos1+2,pos2-pos1-2); 
		}
	}
	if ((pos1 = line.Find("} "))!=-1)
	{
		if ((pos2 = line.Find("->"))!=-1)
		{
			temp.creGram = line.Mid(pos1+2,pos2-pos1-2); 
		}
	}
	if ((pos1 = line.Find("="))!=-1)
	{
		int pos3=0;
		if ((pos3 = line.Find('\n'))!=-1)
		{
			temp.innerTit = line.Mid(pos1+1, pos3-pos1-1); 
		}
		else
			temp.innerTit = line.Mid(pos1+1,line.GetLength()-pos1-2);
		
	}

	temp.index = index;

	return temp;
}

bool CTGrammDoc::Receiver(CString cond)
{
	if (cond.IsEmpty())
	{
		return false;
	}
	
	for (int i=0; i<A_gramer.GetSize(); i++)
	{
		if (cond == A_gramer[i].coondition)
		{
			if (ispartone)
			{
				A_PartOne.Add(A_gramer[i]);
			}
			else{
				A_PartTwo.Add(A_gramer[i]);
			}
			
		}
	}
	return TRUE;
}



void CTGrammDoc::ParseStr(CString part1, CString part2, CString part3)
{
	//////////////分解获得,形成查询////////////////////////////////////////////////////////////
	CString cond = part2 + " " + part3;
	ispartone = false;
	CArray<CString, CString> temp;//用于存放最终结果
	temp.RemoveAll();
	result.RemoveAll();
	
	Receiver(cond); ////获得第二部分分析数组
	for (int i = 0; i < A_PartTwo.GetSize(); i++)
	{
		CString cond2 = part1 + " " +A_PartTwo[i].creGram; //与第一部分形成查询条件
		A_PartOne.RemoveAll(); //清空第一部分数组;
		ispartone = true;
		
		Receiver(cond2); //获得第一部分语法结构数组

		////形成最终结构数组
		
		for (int j = 0; j < A_PartOne.GetSize(); j++)
		{
			CString str;
			Grammer tt;
			str.Format("(%s:%s(%s,%s:%s(%s,%s)))",A_PartOne[j].creGram,A_PartOne[j].innerTit,part1,A_PartTwo[i].creGram,A_PartTwo[i].innerTit,part2,part3);
			
			temp.Add(str);
		}
	}
	
	//////////////////////////////////////////////////////////////////////////
	cond = part1 + " " + part2;
	ispartone = true;
	A_PartOne.RemoveAll(); //清空第一部分数组
	Receiver(cond); ////获得第一部分分析数组
	for (int ii = 0; ii < A_PartOne.GetSize(); ii++)
	{
		CString cond2 = A_PartOne[ii].creGram + " " +part3; //与第一部分形成查询条件
		A_PartTwo.RemoveAll(); //清空第二部分数组;
		ispartone = false;
		
		Receiver(cond2); //获得第二部分语法结构数组

		////形成最终结构数组
		
		for (int j = 0; j < A_PartTwo.GetSize(); j++)
		{
			CString str;
			Grammer tt;
			str.Format("(%s:%s(%s:%s(%s,%s),%s))",A_PartTwo[j].creGram,A_PartTwo[j].innerTit,A_PartOne[ii].creGram,A_PartOne[ii].innerTit,part1,part2,part3);
			
			temp.Add(str);
		}
	}

	//////////////删除重复的数组项////////////////////////////////////////////////////////////
	for (int k = 0; k < temp.GetSize(); k++)
	{
		bool isHave = false;
		for (int l=0; l < result.GetSize(); l++)
		{
			if (temp[k]==result[l])
			{
				isHave = true;
			}
		}
		if (!isHave)
		{
			result.Add(temp[k]);
		}
	}
}

void CTGrammDoc::OnQuery() 
{
	// TODO: Add your command handler code here
	if (m_part1 !="" && m_part2 != "" && m_part3 != "")
	{	
		ParseStr(m_part1,m_part2,m_part3);
	}
	else
		AfxMessageBox("输入语法不正确");
	UpdateAllViews(NULL);
}

void CTGrammDoc::OnFileSave() 
{
	// TODO: Add your command handler code here
	CFileDialog dlg(false,NULL,NULL,0,"文本文件(*.txt)|*.txt||");
	CString lpPath;
	if (dlg.DoModal() == IDOK)
	{
		lpPath = dlg.GetPathName();
		if (lpPath.Find('.') < 0)
		{
			lpPath = lpPath+".txt";
		}
		CFile file;
		file.Open(lpPath,CFile::modeCreate|CFile::modeReadWrite);
		for (int i = 0; i < result.GetSize(); i++)
		{
			CString str;
			str.Format("%d. %s \n", i+1, result[i]);
			file.Write(str.GetBuffer(str.GetLength()),str.GetLength());
		}
		file.Close();
	}

}
#include "MyEditView.h"
#include "MainFrm.h"
void CTGrammDoc::Query()
{
	if (m_part1 !="" && m_part2 != "" && m_part3 != "")
	{	
		result.RemoveAll();
		A_PartOne.RemoveAll();
		A_PartTwo.RemoveAll();
		ParseStr(m_part1,m_part2,m_part3);
	}
	else
		AfxMessageBox("输入语法不正确");

	CMainFrame   *pFrame   =   (CMainFrame*)AfxGetApp()->m_pMainWnd;
	CWnd *pWnd = pFrame->m_wndSplitter.GetDlgItem(pFrame->m_wndSplitter.IdFromRowCol(0,1));
	if(pWnd->IsKindOf(RUNTIME_CLASS(CMyEditView)))
	{
		CMyEditView* pMyEditView = (CMyEditView*)pWnd;
		pMyEditView->DrawText();
	}
	UpdateAllViews(NULL);
}

⌨️ 快捷键说明

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