add more ir opt code, clearified what to opt, so current opt code may need rewrite

This commit is contained in:
Youmu Liu
2026-06-24 18:09:05 +08:00
parent 2b05d626c7
commit 45f9b04b6d
4 changed files with 121 additions and 54 deletions
+20 -31
View File
@@ -33,43 +33,32 @@
1. 尽可能降低源生成或者运行时执行中,对多指令上下文的依赖,尽可能保证每一个IR可以单独输出最佳的代码
2. 减少多余的结构,使得一行指令尽可能处理多的数据
### 语义改写优化
### AST优化器
1. 计数器展开
建议在lower做
对于形如a+b或者a{2,4}b的正则表达式,可以优化为a*(ab|b)和a{2,3}(ab|b)的写法
1. ALT合并
将多个ALT CASE合并到一个链表中
2. 确定性计数展开
建议在lower做
对于形如a{m,n}的正则表达式,将其展开为a{m}a{0,n-m}的形式
2. SPAN合并
将连续的CHAR CONCAT合并为一个char span
3. charset合并
建议在ast-opt做
对于形如[ abc ]|[ def ]的表达式,将其合并为[ abcdef ]
3. alt合并
将多个alt分支中的公共部分提取出来
4. charset展开
在lower做
对于形如abc[ de ]的表达式,如果字符集容量不超过4,可以站卡为(abcd|abce)形式
### IR优化器
### 匹配策略改变
1. .*a特征,优化为
FIND_SEQ(a, last)
.*?a特征,优化为
FIND_SEQ(a, first)
1. 长度预测
在source-gen阶段做
对于一个正则表达式,可以计算其所需的最小长度,可以在开始的时候提前进行比较
2. a+特征,优化为
MATCH_SEQ(a)
COUNT_SEQ(a,0,+inf,greedy)
2. .*优化
在lower阶段做
对于COUNT_SET min=0 max=-1 "."指令,也就是.*操作,将后续指令从match转为find
3. a{1} -> a
3. [ set ]*优化
在source-gen阶段做
对于其他的COUNT_SET min=0 max=-1 "???"指令,使用IndexOf,IndexOfAnyExcept等进行优化
4. .\*a\*特征,优化为.*
4. 首字母检查
**这个不好做,因为IR直接把ALT打碎成if-else串了**
对于(abc|defg|xyz)表达式,可以检查其首字母
### C# span opt trick
1. Span.StartWith
2. [ 0-9 ]展开为IndexOf("0123456789")
5. a{m,n}特征,展开为
MATCH_SEQ(aa...m个a....aa)
COUNT_SEQ(a,0,n,greedy)