Kaleidoscope: Implementing a Parser and AST
阿新 • • 發佈:2018-12-11
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函式