自製程式語言 2 語法分析 變數宣告語句

2021-10-05 22:12:35 字數 1780 閱讀 4347

先從比較簡單的語法解析開始,cscript打算設計成強型別語言,所以所有變數都要先宣告才可以使用。

增添了ast樹

class astnode

; astnode(int _line, int _column) :line(_line), column(_column) {}

//分析語法後生成中間碼

virtual operand evaluation(std::vector& context, memory& memory, nametable& table)

~astnode() {};

};

//表示式基類

class expression : public astnode

virtual operand evaluation(std::vector& context, memory& memory, nametable& table)

~expression() {}

};//語句

class statement : public astnode

virtual operand evaluation(std::vector& context, memory& memory, nametable& table)

~statement() {}

};

宣告了表示式和語句連個類,都是ast節點,下面將宣告語句類設計好。

//變數宣告語句

class variabledeclarestatement : public statement

//型別

token type;

//型別名字

std::string typename;

//識別符號表示式

std::string identname;

//表示式解析

virtual operand evaluation(std::vector& context, memory& memory, nametable& table)

~variabledeclarestatement() {}

};

宣告語句中儲存了變數型別,識別符號名字,型別名字,這裡的型別名字是以後有自定義型別時候使用的字段,表示式解析函式這裡先不用管。

在parser類中新增了一下幾個函式來支援變數宣告語法。

//語法入口

std::shared_ptrparsestatement();

//宣告表示式

std::shared_ptrdecalrestatement();

//變數宣告

std::shared_ptrvariabledeclare();

std::shared_ptrparser::parsestatement()

return result;

}

語法入口函式要根據第乙個token型別判斷這句話屬於什麼語句,這裡目前只寫了乙個bool型別宣告。

下面的函式是宣告表示式,因為後面還有函式宣告,陣列是宣告等,所以需要這個函式來判斷宣告型別。

std::shared_ptrparser::decalrestatement()

最後,根據語法結構,來識別宣告語句。

std::shared_ptrparser::variabledeclare()

具體**請看原始碼鏈結,在這裡

自製程式語言 8 語法分析 陣列賦值

陣列也和變數一樣,需要有直接賦值操作。其語法如下 int a 3 這裡主要對大括號裡的內容進行處理,至於個數要到後面就解析的時候處理。陣列宣告語句 class arraydeclarestatement public statement 陣列型別 token type 型別名 std string ...

實驗2 遞迴下降語法分析程式設計

開發語言及實現平台或實驗環境 c clion 實驗目的 1 理解語法分析在編譯程式中的作用,以及它與詞法分析程式的關係 2 加深對遞迴下降語法分析原理的理解 3 掌握遞迴下降語法分析的實現方法 實驗內容 編制乙個遞迴下降分析程式,實現對詞法分析程式提供的單詞序列的語法檢查和結構分析。實驗要求 1 待...

編譯原理 實驗2 遞迴下降語法分析程式設計

實驗要求 1 待分析的簡單語言的詞法同實驗1 2 待分析的簡單語言的語法 用擴充的bnf表示如下 1 程式 begin 語句串 end 2 語句串 語句 3 語句 賦值語句 4 賦值語句 id 表示式 5 表示式 項 6 項 因子 7 因子 id num 表示式 3 語法分析程式的功能 輸入單詞串以...