|
令牌(token)
以一个字符串构造formula时,首先是形成令牌vector。
这一个字符串会拆为三个令牌
- 左侧大括号(TOKEN_LPARENS),
- 标识(TOKEN_IDENTIFIER),
- 右侧大括号(TOKEN_RPARENS)
自变量赋值
自变量赋值也是一种操作,identifier_expression表示此种操作。
- class identifier_expression : public formula_expression {
- variant execute(const formula_callable& variables, formula_debugger*) const {
- return variables.query_value(id_);
- }
- };
复制代码 query_value基本直接调用get_value。
- variant map_formula_callable::get_value(const std::string& key) const
- {
- return map_get_value_default(values_, key, fallback_ ? fallback_->query_value(key) : variant());
- }
复制代码 map_get_value_default的第二个参数指示了映射不存在此key时,返回是什么值。从代码可看出,去判断是否设置了回卷映射,有就取回卷映射key对应的值,否则variant()。一般情况不会设置fallback_,所以映射没有key时,返回的就是variant(),即type=TYPE_NULL的variant。
在公式调试器窗口,找不到key时的赋值操作将显示“(null)0”。为什么显示这个看以下代码。注意TYPE_INT前没有“break”。
- std::string variant::to_debug_string(std::vector<const game_logic::formula_callable*>* seen, bool verbose) const
- {
- switch (type_) {
- case TYPE_NULL:
- s << "(null)";
- case TYPE_INT:
- s << int_value;
- break;
- ......
- }
复制代码
|
|