SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 4076|回复: 0
打印 上一主题 下一主题

[Discuss] 公式(formula)

[复制链接]

149

主题

331

帖子

2445

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2445
跳转到指定楼层
楼主
发表于 2017-3-29 12:09:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
令牌(token)
以一个字符串构造formula时,首先是形成令牌vector。
  1. (background_image)
复制代码

这一个字符串会拆为三个令牌
  • 左侧大括号(TOKEN_LPARENS),
  • 标识(TOKEN_IDENTIFIER),
  • 右侧大括号(TOKEN_RPARENS)


自变量赋值
自变量赋值也是一种操作,identifier_expression表示此种操作。
  1. class identifier_expression : public formula_expression {
  2.         variant execute(const formula_callable& variables, formula_debugger*) const {
  3.                 return variables.query_value(id_);
  4.         }
  5. };
复制代码
query_value基本直接调用get_value。
  1. variant map_formula_callable::get_value(const std::string& key) const
  2. {
  3.         return map_get_value_default(values_, key, fallback_ ? fallback_->query_value(key) : variant());
  4. }
复制代码
map_get_value_default的第二个参数指示了映射不存在此key时,返回是什么值。从代码可看出,去判断是否设置了回卷映射,有就取回卷映射key对应的值,否则variant()。一般情况不会设置fallback_,所以映射没有key时,返回的就是variant(),即type=TYPE_NULL的variant。

在公式调试器窗口,找不到key时的赋值操作将显示“(null)0”。为什么显示这个看以下代码。注意TYPE_INT前没有“break”。
  1. std::string variant::to_debug_string(std::vector<const game_logic::formula_callable*>* seen, bool verbose) const
  2. {
  3.         switch (type_) {
  4.         case TYPE_NULL:
  5.                 s << "(null)";
  6.         case TYPE_INT:
  7.                 s << int_value;
  8.                 break;
  9.         ......
  10. }
复制代码

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2025-5-2 00:24 , Processed in 0.054607 second(s), 19 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表