1. 程式人生 > >Kaleidoscope: Implementing a Parser and AST

Kaleidoscope: Implementing a Parser and AST

Implementing a Parser and AST

Introduction

本章將使用上一章中的詞法分析器喂Kaleidoscope構建完整的解析器, 然後定義並構建一個Abstract Syntax Tree (抽象語法樹). 解析器使用遞迴下降解析和操作符優先解析的組合來解析Kaleidoscope.我們先從解析器的輸出,AST開始.

AST

程式的AST應該使編譯器的後續階段容易理解. 我們希望每個構造都有一個物件,AST應該對語言進行密切建模.在Kaleidoscope中,我們有表示式,原型, 和函式物件. 我們首先從表示式開始:

// ExprAST - 所有表示式節點的基類
classs ExprAST{
publlic:
	virtual ~ExprAST(){}
};

// NumberExprAST - 數值表示式,如''1.0'
class NumberExprAST : public ExprAST{
	double Val;
	
public: 
	NumberExprAST(double Val) : Val(Val){}
}

NumberExprAST類將數值捕捉為例項變數, 這允許編譯器的後續階段獲取儲存的數值. 目前我們只是建立AST, 還沒有訪問它們的有效方法, 我們可以新增虛擬方法來列印程式碼. 以下是其他表示式AST節點定義:

// VariableExprAST - 變數的表達類, 如 'a'
class VariableExprAST : public ExprAST{
	std::string Name;

public:
	VariableExprAST(const std::string &Name) : Name(Name){}
};

// BinaryExprAST - 二元操作符表達類
class BinaryExprAST :  public ExprAST{
	char Op;
	std::unique_ptr<ExprAST>  LHS, RHS;

public:
	BinaryExprAST(char op, std::unique_ptr<ExprAST> LHS, std::unique_ptr<ExprAST> RHS) : Op(op), LHS(std::move(LHS)), RHS(std::move(RHS)){}
};

其中,move函式