📄 tgrammdoc.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 + -