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

📄 scandoc.cpp

📁 编译原理--词法扫描
💻 CPP
📖 第 1 页 / 共 2 页
字号:
{
	source=fopen("test.l","r");
	tTokenType tem;
	symtab_node* root=NULL;

	while(_ENDFILE != (tem=getToken()) )
	{
		switch(tem)
		{
		case  IF:
		case  THEN:
		case  ELSE:
		case  END:
		case  REPEAT:
		case  UNTIL:
		case  READ:
		case  WRITE:
		  cout<<lineno<<" "<<"reserved words:"<<tokenString<<endl;
		  enter_symtab(tokenString,"key words",lineno,root);
		  break;
		case  ID:
    	  cout<<lineno<<" "<<"identifier:"<<tokenString<<endl;
		  enter_symtab(tokenString,"identifier",lineno,root);
		  break;
		case  NUM:
    	  cout<<lineno<<" "<<"number:"<<tokenString<<endl;
		  enter_symtab(tokenString,"number",lineno,root);
		  break;
		case  ASSIGN:
		case  EQ:
		case  LT:
		case  PLUS:
		case  MINUS:
		case  TIMES:
		case  OVER:
		case  LPAREN:
		case  RPAREN:
		case  SEMI:
    	  cout<<lineno<<" "<<"operant:"<<tokenString<<endl;
		  enter_symtab(tokenString,"operant",lineno,root);
		  break;
		default:
			break;
		}

 	}
visit_symtab(root);
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

/////////////////////////////////////////////////////////////////////////////
// CScanDoc

IMPLEMENT_DYNCREATE(CScanDoc, CDocument)

BEGIN_MESSAGE_MAP(CScanDoc, CDocument)
	//{{AFX_MSG_MAP(CScanDoc)
	ON_COMMAND(ID_RUN_STEP, OnRunStep)
	ON_COMMAND(ID_RUN_SCAN, OnRunScan)
	ON_COMMAND(ID_FIND, OnFind)
	ON_COMMAND(ID_CLEAR, OnClear)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CScanDoc construction/destruction

CScanDoc::CScanDoc()
{
	// TODO: add one-time construction code here

}

CScanDoc::~CScanDoc()
{
}

BOOL CScanDoc::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;
}



/////////////////////////////////////////////////////////////////////////////
// CScanDoc serialization

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

/////////////////////////////////////////////////////////////////////////////
// CScanDoc diagnostics

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

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

/////////////////////////////////////////////////////////////////////////////
// CScanDoc commands


void CScanDoc::OnRunStep() 
{
   static bool first_time=true;
   if(first_time)
  {
	char *filename=new char[255];
	CString str=GetPathName();            /* get the file name opened in CEditView */
	filename=(char*)(str.GetBuffer(255)); /* get the buffer */
	
	/* file name is null,prompt to save it */
	if(!strcmp(filename,"\0"))
	{
		AfxMessageBox("You must save the file first!",MB_OK,MB_ICONEXCLAMATION);
		return;
	}

	nStartChar=nFilePos=0;   /* reset global variables */
	first_time=false;
	symtab_root=NULL;        /* reset root of binary tree */
    g_TraceBar.ClearAll();   /* cleal all the items in ListCtrl */
	m_i=0;                   /* clear item counts in ListCtrl */

	/* tiny variables */
	lineno=0;                /* global variable,record line number */
	linepos=0;               /* static global variable,record position in linebuf[] */
	bufsize=0;               /* static global variable, size of linebuf */
	EOF_flag = FALSE;        /* static global variable, weather end of file */
	source=fopen(filename,"r");
	if(!source)
	{
		AfxMessageBox("Error on opening file!");
		return;
	}
	}

	//start
	tTokenType tem;
	char line_str[255]={0};

	if(_ENDFILE == (tem=getToken()) )
	{
		first_time=true;             /* new */
		g_pEditCtrl->SetSel(0,0);    /* clear any selection setted by SetSel() */
		AfxMessageBox("End of file.Scaning stopped!",MB_OK,MB_ICONEXCLAMATION);	
		return;
	}

	int nlen=strlen(tokenString);

	/* nFilePos records position of the file , it starts from 0 
	 * In CEdit, SetSel() takes '\n' as two chars('\r' and '\n'),
	 * so when GetNextChar() meets '\n',nFilePos must increase by 2 
	 * After getToken() performs, nFilePos reaches the end of curToken.
	 * For instance,at the beginning of the file, assume curToken is "READ" , tokenString is "read",
	 * so nFilePos will reaches the end of curToken, that is at 'd'.
	 * So nStartChar will be nFilePos - strlen(tokenString).
	 */
	nStartChar=nFilePos-nlen;       
    int nEndChar=nStartChar+nlen;

	g_pEditCtrl->SetSel(nStartChar,nEndChar);  //high light the string

	sprintf(line_str,"%d",lineno);
	switch(tem)
		{
		case  IF:
		case  THEN:
		case  ELSE:
		case  END:
		case  REPEAT:
		case  UNTIL:
		case  READ:
		case  WRITE:
		  g_TraceBar.InsertItem(m_i,line_str);
		  g_TraceBar.SetItemText(m_i,1,"key word");
		  g_TraceBar.SetItemText(m_i++,2,tokenString);
		  enter_symtab(tokenString,"key words",lineno,symtab_root);
		  break;
		case  ID:
		  g_TraceBar.InsertItem(m_i,line_str);
		  g_TraceBar.SetItemText(m_i,1,"identifier");
		  g_TraceBar.SetItemText(m_i++,2,tokenString);
		  enter_symtab(tokenString,"identifier",lineno,symtab_root);
		  break;
		case  NUM:
		  g_TraceBar.InsertItem(m_i,line_str);
		  g_TraceBar.SetItemText(m_i,1,"number");
		  g_TraceBar.SetItemText(m_i++,2,tokenString);
		  enter_symtab(tokenString,"number",lineno,symtab_root);
		  break;
		case  ASSIGN:
		case  EQ:
		case  LT:
		case  PLUS:
		case  MINUS:
		case  TIMES:
		case  OVER:
		case  LPAREN:
		case  RPAREN:
		case  SEMI:
		  g_TraceBar.InsertItem(m_i,line_str);
		  g_TraceBar.SetItemText(m_i,1,"operant");
		  g_TraceBar.SetItemText(m_i++,2,tokenString);
		  enter_symtab(tokenString,"operant",lineno,symtab_root);
		  break;
		default:
			break;
		}
 		
}

void CScanDoc::OnRunScan() 
{
	CString str=GetPathName();            /* get the file name opened in CEditView */
	char *filename=new char[255];
	filename=(char*)(str.GetBuffer(255)); /* get the buffer */
	
	/* file name is NULL, prompt to save it */
	if(!strcmp(filename,"\0"))         
	{
		AfxMessageBox("You must save document first!");
		return;
	}
	source=fopen(filename,"r");
	
	/* error opening file */
	if(!source)                  
	{
		AfxMessageBox("Error on opening file!");
		return;
	}

	/* start  scaning */

	//initializing 
	g_TraceBar.ClearAll();  /* clear all the items in ListCtrl */  
	symtab_root=NULL;       /* reset the root in the binary tree */
	m_i=0;                  /* reset the item counts in ListCtrl */

	/* tiny variables */
	lineno=0;          /* global variable */
	linepos=0;         /* static variable */
	bufsize=0;		   /* static variable */
	EOF_flag = FALSE;  /* static variable */

	tTokenType tem;
	char line_str[255]={0};
	
	while(_ENDFILE != (tem=getToken()) )
	{
	  sprintf(line_str,"%d",lineno);
		switch(tem)
		{
		case  IF:
		case  THEN:
		case  ELSE:
		case  END:
		case  REPEAT:
		case  UNTIL:
		case  READ:
		case  WRITE:
		  g_TraceBar.InsertItem(m_i,line_str);               /* add to ListCtrl */
		  g_TraceBar.SetItemText(m_i,1,"key word");
		  g_TraceBar.SetItemText(m_i++,2,tokenString);
		  enter_symtab(tokenString,"key words",lineno,symtab_root);
		  break;
		case  ID:
		  g_TraceBar.InsertItem(m_i,line_str);
		  g_TraceBar.SetItemText(m_i,1,"identifier");
		  g_TraceBar.SetItemText(m_i++,2,tokenString);
		  enter_symtab(tokenString,"identifier",lineno,symtab_root);
		  break;
		case  NUM:
		  g_TraceBar.InsertItem(m_i,line_str);
		  g_TraceBar.SetItemText(m_i,1,"number");
		  g_TraceBar.SetItemText(m_i++,2,tokenString);
		  enter_symtab(tokenString,"number",lineno,symtab_root);
		  break;
		case  ASSIGN:
		case  EQ:
		case  LT:
		case  PLUS:
		case  MINUS:
		case  TIMES:
		case  OVER:
		case  LPAREN:
		case  RPAREN:
		case  SEMI:
		  g_TraceBar.InsertItem(m_i,line_str);
		  g_TraceBar.SetItemText(m_i,1,"operant");
		  g_TraceBar.SetItemText(m_i++,2,tokenString);
		  enter_symtab(tokenString,"operant",lineno,symtab_root);
		  break;
		default:
			break;
		}
 	}
}

void CScanDoc::OnFind() 
{
	CFind find;
	find.m_symtab_node_root=(symtab_node2*)symtab_root;  //get the root
	find.DoModal();   //display the find dialog
}

void CScanDoc::OnClear() 
{
g_TraceBar.ClearAll();  //clear all the ListCtrl item
m_i=0;					//item count reset
}

⌨️ 快捷键说明

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