?? prase.h
字號:
#ifndef PRASE_H_
#define PARSE_H_
/*********************************************************
**宏定義,用掃描器讀取源程序中的一個記號。
*********************************************************/
#define READSYMBOL \
m_Entoken=m_Enforexp;\
strcpy(m_strIDname, m_pScaner->GettokenString());\
m_Enforexp=m_pScaner->getToken();
/*******************************************************
**在程序的迭代處理中經常用到建立兄弟鏈表處理,把它組織成一個宏。
************************************************************/
#define MAKELINK if(temp2!=NULL){ temp2->m_pbrother=temp;\
temp2=temp2->m_pbrother;}\
else{first_declare=temp;temp2=temp;}
/****************************************************************
**由于分析法本身的弱點,對于一個表達式結束后,后續符號應該
**是) ,還是; 無法區分。該枚舉量用于表識該處表達式應該以何種標識結束。
******************************************************************/
enum Endexp{ESEMI,ERPAREN,ECOMMA};
/*******************************************************
**語法樹結點類型: 函數,表達式,參數表,變量聲明,語句體
**********************************************************/
enum NodeKind{FuncK, ExpK, ParaK, DeclK, StmtK};
/**********************************************************
**語句體類型的子類型:if,while,for, goto, break;,continue,return
***************************************************************/
enum StmtKind{IfK, WhileK, ForK, GotoK, BreakK,
WritebK,WritedK,ContinueK, ReturnK,AddressK,CallK};
/**************************************************************
** 表達式類型的子類型:操作數,常數,標識符。
*************************************************************/
enum ExpKind{OpK,ConstK,IdK};
/*******************************************
**語法樹結點。
******************************************/
struct CTreeNode{
struct CTreeNode *m_pchild[3]; //指向子結點的指針。
struct CTreeNode *m_pfather; //指向雙親結點,為實現break,continue而加。
struct CTreeNode *m_pbrother; //指向兄弟結點的指點
NodeKind m_Ennodekind; //結點類型
TokenType m_EnTypevalue;
char m_strIDname[MAXTOKENLEN+1];
char m_strScope[MAXTOKENLEN+1]; //記錄結點的作用域范圍。
int m_ilineno;
union{
StmtKind m_EnStmtKind;
ExpKind m_EnExpKind;
}kind; //結點類型的子類型。
};
/*****************************************************************
**類名: CPraser
**功能描述:這是一個完整的語法分析器,通過掃描器的輔助,建立程序的
** 的完整語法樹。
**作 者:何林強
**日 期:2002年5月28日
**修 改:
**日 期:
*****************************************************************/
class CPraser{
private:
Endexp m_EnEndexp;
//表式的處理從expresstion()開始,要求向前讀一個字符,但是對于以ID開始的表達
//式,必須讀到第二個才能知道是表達式,還是函數調用,還是地址標號,該標志用于
//恢復表達式處理時只向前讀一個。
TokenType m_Enforexp;
int m_indentno; //找印語法樹時,用于控制縮進格式。
CScaner *m_pScaner;
private: //建語法樹時的幾個輔助變量。
TokenType m_Entoken;
TokenType m_Enfirst;
TokenType m_EnSecond;
TokenType m_Enthird;
char m_strIDname[MAXTOKENLEN+1];
char m_strScope[MAXTOKENLEN+1];//記錄結點所屬作用域范圍。
private:
void program(void);
CTreeNode *declaration_list(void);
CTreeNode *declaration(void);
CTreeNode *compound_stmt(void);
CTreeNode *params(void);
CTreeNode *fun_declaration(void);
CTreeNode *var_declaration(void);
CTreeNode *local_declarations(void);
CTreeNode *selection_stmt(void);
CTreeNode *expression(void);
CTreeNode *write_stmt(void);
CTreeNode *iteration_stmt(void);
CTreeNode *iteration2_stmt(void);
CTreeNode *jump_stmt(void);
CTreeNode *break_stmt(void);
CTreeNode *continue_stmt(void);
CTreeNode *subcompound_stmt(void);
CTreeNode *address(void);
CTreeNode *call_func(void);
CTreeNode *args(void);
CTreeNode *logic1_expression(void);
CTreeNode *return_stmt(void);
CTreeNode *logic2_expression(void);
CTreeNode *simple_expression(void);
CTreeNode *add_expression(void);
CTreeNode *term(void);
CTreeNode *logic3_expression(void);
CTreeNode *factor(void);
/*****/
inline CTreeNode *newNode(NodeKind pa_kind);
inline CTreeNode *newStmtNode(StmtKind pa_subkind);
inline CTreeNode *newExpNode(ExpKind pa_subkind);
inline void match(TokenType pa_expcted,string pa_errorifno);
void Delete_program(CTreeNode *t);
public:
static CTreeNode *m_program;
CPraser();
~CPraser();
void PrintTree(CTreeNode *pa_Ctree);
};
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -