先從比較簡單的語法解析開始,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 語法分析程式的功能 輸入單詞串以...