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

📄 parser.h

📁 C-MINUS编译器
💻 H
字号:
#ifndef MY_PARSER_H_
#define MY_PARSER_H_
/*************************************************
  Copyright (C), 2002-2008, lonelyforest.
  File name:      parser.h
  Author:  林公玉 (lonelyforest)
  Version:  1.0
  Date: 22-03-06 15:47
  Description:  其中主要有 树节点类(TreeNode), 语法树类(Parser),
                主要将从词法分析器的来的 每个标识符 建造成一棵语
                法树,以便于后端语义分析,符号表生成等等。
*************************************************/

#include "scanner.h"

typedef enum { varK, funK, paramK, stmtK, expK } NodeKind;

typedef enum { 
	ifK, whileK, readK, writeK, returnK, callK } StmtKind;

typedef enum { OpK, ConstK, IDK } ExpKind;

// parser-tree max childrens
const int MAX_CHILDREN = 3;

// parser tree node
struct TreeNode
{
    //------------------------------------------------------------------------
	TreeNode();
	~TreeNode();
	TreeNode* LastSibling();
    //------------------------------------------------------------------------
	TreeNode*	child[ MAX_CHILDREN]; // pointer to child node
	TreeNode*	father;					// pointer to father node
	TreeNode*	sibling;			 // pointer to sibling node
    //------------------------------------------------------------------------
	NodeKind	nodekind;
	union {
		StmtKind	stmt;
		ExpKind		exp;
	} kind;
	enum tokenType	type;
	
	string			name;
	string			scope;	    // node function scpo
	bool			bArr;		// array ?
	int			    lineno;
	int				iArrSize;	// arrary size;
};

/**:	class Scanner
*   构建语法树,进行语法检查,提示错误生成语法树文件;
*
*  重要接口 BuildSyntaxTree() & getTreeFile()
*  分别将一个个的 Token 标识符构建为语法树 &生成语法树文件
&
*       将词法分析器作为指针成员,动态生成, 这样增加了操作的灵活性;
*
*	author:	lonelyforest;
*	data:	2006.03.22
*/
// clas Parser, primary class and interface;
class Parser
{
public:
	Parser(const string& filename);
	~Parser();
	TreeNode*	BuildSyntaxTree();
	//------------------------------------------------------------------------
	void	getTreeFile();
	void	getListFile(){ scan->getListFile(); }
	//------------------------------------------------------------------------
	void	noListFile()	{ scan->noListFile();}
	void    noTreeFile()    { traceParse  = false; }
    //------------------------------------------------------------------------
	void	add_err()	{	scan->add_err(); }
	void	add_warn()	{	scan->add_warn();}
	int	errCount()const	{ return scan->errCount();}
	int	warnCount()const{ return scan->warnCount(); }
	bool	is_good() const	{ return scan->is_good(); }
    //------------------------------------------------------------------------

protected:
	TreeNode*	m_program;

	TreeNode*	newNode(const NodeKind Kind, const tokenType Type, const string&  Name);
	TreeNode*	newStmtNode(const StmtKind Kind, const string&	Name);
	TreeNode*	newExpNode(const ExpKind Kind, const tokenType Type, const string& Name);
    //------------------------------------------------------------------------
	bool	match(tokenType Type);
	/* 错误恢复,多谢一个网友后来给了个参考,让我改写错误恢复,
	* 我发现这个方法似乎不是很好,但也不错。
	*/
	void	consumeUntil(const tokenType Type);
	void	consumeUntil(const tokenType type1, const tokenType type2);
    //------------------------------------------------------------------------
protected:
    //------------------------------------------------------------------------
	// Gramer functions
	TreeNode* program();
	TreeNode* declaration_list();
	TreeNode* declaration();
	TreeNode* var_declaration();
	TreeNode* fun_declaration();
	TreeNode* params();			// ...
	TreeNode* compound_stmt();
	TreeNode* local_declarations();
	TreeNode* read_stmt();		// read(int)
	TreeNode* write_stmt();		// write(int);
	TreeNode* expression_stmt();
	TreeNode* subcompound_stmt(); // ...
	TreeNode* if_stmt();
	TreeNode* while_stmt();
	TreeNode* return_stmt();
	TreeNode* expression();
	TreeNode* simple_expression();
	TreeNode* additive_expression();
	TreeNode* term();
	TreeNode* factor();
	TreeNode* var();
	TreeNode* call();
	TreeNode* args();
    //------------------------------------------------------------------------
	void PrintTree(TreeNode* pNode);	// print the syntax tree to treeFile
private:
    //------------------------------------------------------------------------
	Scanner*	scan;	// use pointer, better than member
	Token		cToken, tToken, iToken;	// current Token, typeToken, idnameToken
	string		Scope;		// current scope
	string		treeFile;	// print syntax tree, use extern name .st(syntax tree)
	ofstream	out;		// open and write tree file
	int			indent;
	//------------------------------------------------------------------------
	bool       traceParse;
};

#endif // MY_PARSER_H_

⌨️ 快捷键说明

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