原来使用的语法根据原来使用的语法,一个symbol只能对应一个字符,得到的dfa每次只能处理一个字符。
<re> ::= <expr> { <expr> }
| <re> '|' <re>
<expr> ::= <term>
| <term> '*'
<term> ::= <label>
| '(' <re> ')'
<label> ::= <symbol>
| '[' <range> { <range> } ']'
| '[' '^' <range> { <range> } ']'
<range> ::= <symbol>
| <symbol> '-' <symbol>
<symbol> ::= '.'
| 0 .. n (any element of alphabet)
| '/' <symbol>
如果改为
<symbol> ::= '.'<re_char> ::= 0..n ( any element of alphabet )
| <re_char> { <re_char> }
| '/' <symbol>
这样可以把一个symbol对应到一个字符串。对于含有确定子串的正则表达式,可以大幅度减少语法树的叶子。
转换出来的dfa,含有更少的状态,还可以通过字符串而不是字符,达到批量处理。