enum is a Dictionary - view from GDScriptParser

?????? enum is a Dictionary
- [GraphViz](http://www.graphviz.org/Download.php)
- [CodeViz](http://www.csn.ul.ie/~mel/projects/codeviz/)
- [GDScript progress report: Writing a tokenizer](https://godotengine.org/article/gdscript-progress-report-writing-tokenizer/)
CodeViz 是 Understanding The Linux Virtual Memory Manager 一書的作者 Mel Gorman 編寫的一款分析 C/C++ 源代碼中函數(shù)調(diào)用關(guān)系的開源工具,類似軟件有 egypt、ncc 等。在編譯源文件時,它會導(dǎo)出其中函數(shù)的 call graph,然后用 Perl 腳本收集并整理調(diào)用關(guān)系,轉(zhuǎn)交給 Graphviz 繪制圖形。
CodeViz 現(xiàn)在已經(jīng)基本支持 C++ 語言,最新的 1.0.9 版能在 Windows + Cygwin 下順利地編譯使用。
Godot 中的枚舉類型 enum 和字典對象同源,可以使用 keys() 方法獲取枚舉量的名稱來實現(xiàn)到字符串的轉(zhuǎn)換。參考 global_constants.cpp 源代碼文件,其中注冊了全局類型常量。GDScript 解釋器也沒有專門設(shè)置一個Token 用于表示枚舉類型,而是和字典類型一樣,直接通過檢測代碼中的花括號來識別枚舉類型。
Godot 3.5 中的 GDScript 解析器定義了一個 parse_class 方法,它包攬了腳本的解析工作,整個方法非常臃腫。Godot 4.x 后,重新編寫了解析器,這個方法也被拆解成各個分工方法。
GDScriptTokenizer 定義了腳本中的 `Token` 類型,名字中的科室符號含義如下:
- TK 前綴簡寫為 Token;
- OP 表示 Operation code 操作碼;
- CF 表示 Control flow 流程控制;
- PR 表示 Keywords,可能是縮寫 Propose,但絕不 GitHub 中 PR(pull request);
Godot 3.5 Token 類定義如下,其中 TK_PR_SLAVE 由 TK_PR_PUPPET 取代,TK_CURSOR 用自動完成功能,可以看到 ++ 或 -- 這樣的運算符號還未提供實現(xiàn),共有 99 個 Token:
Godot 4.x 引入的多個關(guān)鍵字,或關(guān)鍵字功能的提升:
- in 作為關(guān)鍵字定義,對應(yīng)舊版本的 TK_OP_IN,用于決斷元素是否在 string, list, range, 字典或者節(jié)點中,也用于 for 循環(huán);
- super 用于調(diào)用父類構(gòu)造函數(shù)或成員,不用像舊版本中那樣使用 . 運算符號來調(diào)用父類;
- await 替代舊版本的 TK_PR_YIELD,雖然 yield 這個關(guān)鍵字還在,但使用它只會得到錯誤提示;
- tool、icon、onready、export 等等變更為標注,由 GDScriptParser 提供實現(xiàn),不同作為關(guān)鍵字使用;
- @warning_ignore 和 @rpc 是新增的兩個功能標注;
此外,還有引入了以下有符號定義但未提供實現(xiàn)的關(guān)鍵字:
- namespace 雖然在代碼中已經(jīng)有個關(guān)鍵字,是是還沒有具體實現(xiàn)命名空間的功能;
- trait 是混合編程模式概念,是代碼復(fù)用方法;
解析器方法 get_rule() 可以查詢 Token 類型與具體實現(xiàn)的規(guī)則。