Files
stgsharp/future/ngra-regex-ir.md
T

1.7 KiB
Raw Blame History

适用于NGRA字符串正则的IR形式

两个指针

  1. 活动指针,记录当前的搜索位置,下文“不更新活动指针”的意思是算计结束后自行对活动指针进行复位
  2. 锚点指针,记录一个区间的开始位置

检查点

检查点是锚点指针的一种形式,以栈形态存储,创建检查点时,上一个检查点自动压栈,并用当前检查点替换为当前的锚点指针

符号区

使用DEFINE指令定义的符号定义在符号区中,符号的类型通过第一次赋值确定,源生成模式下,可以通过第一个赋值指令推导其类型

算子

  1. 搜索算子(SEARCH %str; SEARCH %unicode;SERCH %set_expression),向后搜索确定长度序列或者满足规则的字符集,更新活动指针,不更新锚点指针,搜索结果保存在全局上下文中
  2. 跳转算子(JMP %cmd_idx),跳转到指定的IR指令之前,不变化任何指针,
  3. 回到(BACK %cmd_idx %count)跳转到一个跳自身位置之前的位置,并更新跳转次数,不变化任何的指针,%count应当是使用DEFINE指令定义好的符号
  4. 比较指令(CONDITION %cmd_true %cmd_fail),比较前一条SEARCH指令是否成功,并指定跳转到指定的位置,如果某种条件不需要跳转,请使用0进行填充
  5. 检查点指令(CHECK),将锚点指针强制拉取到活动指针的位置
  6. 弹出检查点(UNCHECK),将一个检查点撤销并销毁
  7. 划分区间指令(SPAN %name),将锚点指针和活动指针之间的部分划分为一个Span<>,并弹出对应的检查点
  8. 定义指令(DEFINE %symbol)定义一个符号
  9. 赋值指令(ASSIGN %symbol %value)将符号设定为值