🦄
第一本 TinTin++ 编程书
  • 第一本 TinTin++ 编程书
  • 前言✅
    • 阅读指南✅
    • 术语和约定✅
  • TinTin++ 入门
    • 快速上手❌
      • 安装与启动✅
      • 连接到游戏❌
      • 你好,TinTin++❌
      • 到哪里寻求帮助?❌
      • 别名(#alias)❌
      • 重复(#N)和循环(#loop)❌
      • 第一个机器人❌
      • 触发器(#action)❌
      • 变量(#var)❌
      • 根据情况执行不同命令(#if)❌
      • 定时器(#timer)❌
      • 延迟执行(#delay)❌
      • 触发器(#action)❌
      • 归类(#class)❌
    • 更多触发❌
  • TinTin++ 语法指南
    • 命令和命令解析❌
      • 分号和花括号❌
      • 标识符和变量内插❌
      • 函数❌
    • 变量和数据类型❌
      • 局部变量(#local)❌
      • 字符串❌
      • 数值和数学运算❌
      • 带颜色的字符串❌
      • 字符串列表❌
      • 数组(#list)❌
      • 关联数组(table)❌
    • 流程控制❌
    • 强大的正则表达式❌
    • 调试和日志❌
    • 会话管理❌
  • 实战
    • 地图与路径❌
    • 从走路说起❌
    • 数据与代码同构❌
    • 定制你的人机交互方式❌
    • 坑❌
  • 参考手册
    • TinTin++ 指令手册❌
    • TinTin++ 支持的协议❌
  • TinTin++ 源代码解析
    • 源码概述❌
    • 命令是怎样被执行的❌
      • 词法分析❌
      • 语法分析❌
      • 文本替换❌
    • 核心数据结构❌
      • tintin_data* gtd❌
      • listroot 和 listnode
      • level_data* gtd->level❌
    • 内存管理和栈模型❌
      • str 和 ptr❌
      • str 维护❌
  • 社区
    • 社交礼仪❌
    • 贡献指南❌
    • 鸣谢❌
    • 流行 MUD 介绍❌
    • 参与 TinTin++ 开发❌
由 GitBook 提供支持
在本页
  1. TinTin++ 源代码解析

命令是怎样被执行的❌

命令执行的总入口是 script_driver(),不论是命令行输入还是执行脚本最终都是通过它。调用路径分别如下:

  • 命令行输入: update.c:mainloop() => update.c:update_input() => input.c:process_input() => parse.c:parse_input() => tokenize.c:script_driver()

process_input() 本质上仍然是事件循环的一部分,一次只捕获一个按键,因此最终是否真的调用 parse_input() 取决于用户是否按下了回车键。这部分处理在 cursor.c 中进行,按下回车键后会设置标记 TINTIN_FLAG_PROCESSINPUT,否则就会跳过后续处理:

	if (!HAS_BIT(gtd->flags, TINTIN_FLAG_PROCESSINPUT))
	{
		pop_call();
		return;
	}
  • 执行脚本:files.c:do_read() => files.c:read_file() => tokenize.c:script_driver()

注意 read_file() 中有一个相当长的前置处理,在交给 script_driver() 之前,实际上就已经做了一些粗略的词法处理:

  • 去掉注释

  • 处理花括号

  • 忽略 '\r',去掉 '\n',并且根据命令分隔符(也就是 ';')拆分命令。

  • FIXME: 没找到关于转义字符的处理,不确定是何时处理的。

上一页源码概述❌下一页词法分析❌

最后更新于1年前