?? scandoc.cpp
字號:
{
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 + -