宋为
2015-06-07 02:53:27 UTC
最近拿Common Lisp写了个小的正则表达式引擎。
按龙书上给的方法实现的。
地址:(还没有按照asdf打包)
https://github.com/leosongwei/ll-regex
但是在实现高级功能的时候遇到了问题。我想实现集合功能(就是[a-z]这种),
于是就把构建出来的集合作为一种匹配类型放在nfa中,然后构建dfa。然后发现存
在这样的问题:
表达式是a\e(我暂时用\e表示所有小写英文字母),不能匹配aa。
构建出来的DFA是这样的:
(最前面是编号,states是构造DFA用的中间变量,outs 是 (cons 如果匹配 应该
去的地方),sym指出如果停在某处,应该返回的值,若是最后一次跳转到3,就返
回 'MATCH)
个集合匹配,又和"a"匹配,从理论上讲,此时不应该知道要跳往哪一个状态。如
此看来这肯定不是正确的姿势。
求指点正确的实现方法。谢谢啦。
按龙书上给的方法实现的。
地址:(还没有按照asdf打包)
https://github.com/leosongwei/ll-regex
但是在实现高级功能的时候遇到了问题。我想实现集合功能(就是[a-z]这种),
于是就把构建出来的集合作为一种匹配类型放在nfa中,然后构建dfa。然后发现存
在这样的问题:
表达式是a\e(我暂时用\e表示所有小写英文字母),不能匹配aa。
构建出来的DFA是这样的:
(最前面是编号,states是构造DFA用的中间变量,outs 是 (cons 如果匹配 应该
去的地方),sym指出如果停在某处,应该返回的值,若是最后一次跳转到3,就返
回 'MATCH)
0: #<D states:(0) outs:((LOWCASE . 1) (a . 2)) sym:NIL>
1: #<D states:NIL outs:((LOWCASE . 1) (a . 1)) sym:NIL>
2: #<D states:(1) outs:((LOWCASE . 3) (a . 1)) sym:NIL>
3: #<D states:(2) outs:((LOWCASE . 1) (a . 1)) sym:MATCH>
我意识到这其实不是一个DFA,是个NFA,接收到“aa”时,每个字母既和LOWCASE这1: #<D states:NIL outs:((LOWCASE . 1) (a . 1)) sym:NIL>
2: #<D states:(1) outs:((LOWCASE . 3) (a . 1)) sym:NIL>
3: #<D states:(2) outs:((LOWCASE . 1) (a . 1)) sym:MATCH>
个集合匹配,又和"a"匹配,从理论上讲,此时不应该知道要跳往哪一个状态。如
此看来这肯定不是正确的姿势。
求指点正确的实现方法。谢谢啦。
--
--
Lisp-cn(Lisp中文用户组)
CLUG http://lisp.org.cn
---
您收到此邮件是因为您订阅了 Google 网上论坛的“Lisp-cn(Lisp中文用户组)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到lisp-cn+***@googlegroups.com。
要查看更多选项,请访问 https://
--
Lisp-cn(Lisp中文用户组)
CLUG http://lisp.org.cn
---
您收到此邮件是因为您订阅了 Google 网上论坛的“Lisp-cn(Lisp中文用户组)”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到lisp-cn+***@googlegroups.com。
要查看更多选项,请访问 https://