尝试把正则表达式转换成指令序列形式

本文探讨了如何将识别正则表达式的确定有限自动机(DFA)表示为指令序列,通过顺序解释该序列处理字符串,旨在提高效率。以正则表达式(a|b)[0-9].*c为例,演示了从语法树生成DFA的过程,并讨论了如何进一步简化处理流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

将识别正则表达式的DFA表示成转移函数表,每次都查找在转移比较麻烦。如果能表示成一个顺序的指令序列,通过顺序解释这个序列来处理字符串,将是一种很有效的方法。如果还能加入优化,把代码最小化还能提高不少效率。不过这也可能只是丫丫。

先做一个试验

对于正则表达式 (a|b)[0-9].*c,可以用以前的方法先生成语法树,然后出DFA。


状态 (1,2)表示含有叶子1,2,等等。

用伪码描述这个自动机

str ::= input string

begin

12:
if ( lookahead == a || lookahead ==  b ) then { accept one char; goto 3; }
else { retry; }
3:
if ( lookahead >= 0 && lookahead <= 9 ) then { accept one char; goto 45; }
else { retry; }
45:
if ( lookahead == c ) then { accept one char; goto 456; }
else if ( lookahead != 0 ) { accept one char; goto 45; }
else { retry }
456:
matched
if ( lookahead == c ) then { accept one char; goto 456; }
else if ( lookahead != 0 ) then  { accept one char; goto 45; }
else stop

end

这样定义retry
begin
if  ( once matched ) { stop; }  // 有一次成功说明之前的匹配成功的地方已经是最长了,后面的尝试是失败的
else { str++; restart match; }  // 一次都没匹配成功过,从新的位置从新尝试。这里没有考虑强制开始的运算符号。
end

这样似乎并不是足够简单,有很多重复无聊的定式。如果能想展开成汇编一样的代码就好了。
也可以不必去再解释if命令。只要一个一个执行就可以了。

困……遁觉
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值