《leetcode-runner》如何手搓一个debug调试器——指令系统
前文:
《leetcode-runner》如何手搓一个debug调试器——引言
《leetcode-runner》如何手搓一个debug调试器——架构
文章目录
- 什么是指令系统
- 指令的组成部分
- leetcode-runner支持哪些指令
- 如何解析用户输入的命令行
- 指令识别流程
仓库地址:leetcode-runner
什么是指令系统
指令系统,是leetcode-runner项目debug模块内部通用的一套指令,它标识用户要求做出的debug工作
指令的组成部分
一条指令拥有两个组成部分:操作 + 参数
比如添加断点指令,“b 18”。b是breakpoint操作,意思是添加断点。其后的整数18就是b指令的参数,合起来就是在第18行添加断点
有的指令存在参数,有的指令不存在参数,比如R指令,他表示运行程序,直到程序结束或者遇到断点。R指令就不存在参数
leetcode-runner支持哪些指令
指令名词 | 指令输入形式 | 指令作用 |
---|---|---|
N指令 | n | n 数字 | n 数字 | step into单步执行 |
R指令 | r | 运行代码, 直到下一个断点 |
P指令 | p | 打印本地变量 |
B指令 | b 数字 | 在指定行打上断点 |
SHOWB指令 | show b | s b | sb | 显示所有断点 |
RB指令 | remove b 数字| r b 数字| rb 数字| remove b数字| r b数字| rb数字 | 移除指定行断点 |
RBA指令 | remove all| ra| r a | 移除所有断点 |
W指令 | w | 查看当前所在位置 |
STEP指令 | step out | step over | 功能和idea的debug对应按钮功能一致 |
WATCH指令 | watch expression | 计算expression, 同时将expression加入监视池 |
如何解析用户输入的命令行
先看UML图
指令Instruction,由操作 + 参数组成。不同的操作会对应着不同的参数,也就代表着不同的指令。因此,leetcode-runner提供Operation枚举类,枚举不同的操作
Operation,操作的枚举类,拥有两个重要参数
- ParameterExtractor 参数提取器
- regex:正则表达式,用于匹配用户输入的命令
指令识别流程
InstParserImpl作为识别指令的核心类,它的处理识别流程大致如上
首先遍历Operation枚举的所有操作,使用操作匹配用户输入。如果匹配成功,则使用操作对应的指令提取器提取参数,如果提取成功,创建并返回指令。否则终止匹配