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