欢迎光临散文网 会员登陆 & 注册

enum is a Dictionary - view from GDScriptParser

2023-02-03 20:44 作者:紧果呗  | 我要投稿

🟠🟢🔵 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++ 源代码中函数调用关系的开源工具,类似软件有 egypt、ncc 等。在编译源文件时,它会导出其中函数的 call graph,然后用 Perl 脚本收集并整理调用关系,转交给 Graphviz 绘制图形。

CodeViz 现在已经基本支持 C++ 语言,最新的 1.0.9 版能在 Windows + Cygwin 下顺利地编译使用。


Godot 中的枚举类型 enum 和字典对象同源,可以使用 keys() 方法获取枚举量的名称来实现到字符串的转换。参考 global_constants.cpp 源代码文件,其中注册了全局类型常量。GDScript 解释器也没有专门设置一个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 用自动完成功能,可以看到 ++ 或 -- 这样的运算符号还未提供实现,共有 99 个 Token:

Godot 4.x 引入的多个关键字,或关键字功能的提升:

  • - in 作为关键字定义,对应旧版本的 TK_OP_IN,用于决断元素是否在 string, list, range, 字典或者节点中,也用于 for 循环;

  • - super 用于调用父类构造函数或成员,不用像旧版本中那样使用 . 运算符号来调用父类;

  • - await 替代旧版本的 TK_PR_YIELD,虽然 yield 这个关键字还在,但使用它只会得到错误提示;

  • - tool、icon、onready、export 等等变更为标注,由 GDScriptParser 提供实现,不同作为关键字使用;

  • - @warning_ignore 和 @rpc 是新增的两个功能标注;

此外,还有引入了以下有符号定义但未提供实现的关键字:

  • - namespace 虽然在代码中已经有个关键字,是是还没有具体实现命名空间的功能;

  • - trait 是混合编程模式概念,是代码复用方法;

解析器方法 get_rule() 可以查询 Token 类型与具体实现的规则。


enum is a Dictionary - view from GDScriptParser的评论 (共 条)

分享到微博请遵守国家法律