正规式转NFA由以下几种基础的情况组成:
(1)单个字符
(2)并运算
(3)连接运算
(4)闭包运算
针对非操作符以及各种操作符的详细处理:
1' 当遇到左括号’(‘时:直接压入栈中即可;
2' 当遇到右括号')'时:依次弹出符号栈中的符号直到遇到'('为止。在依次弹出符号栈中的符号时对NFA栈中的NFA元素的操作是:弹出NFA栈顶的两个元素,进行相应的符号操作后合成一个新的NFA并压入栈中;
3' 当遇到或操作'|'时:此操作符的优先级最低,在压入栈时需要对符号栈中'('以上的符号进行判断,对于优先级高于或操作的连接操作需要将其先弹出后进行连接操作,直到栈中不存在连接操作后再将'|'压入符号栈中;
4' 当遇到闭包操作'*'时:此操作符的优先级最高,无须将其压入符号栈中,直接将NFA栈中的栈顶NFA弹出栈后进行闭包操作后再将新的NFA压入NFA栈;
5' 当遇到隐含的连接操作'.'时:该操作符是隐含在正规式中的 ,如:ab,a(b|c)*。因此在扫描过程中,需要对是否添加连接符进行判断。其有以下三种情况:当遇到非运算符时,需要对其后面的符号进行判断,若遇到左括号或非运算符时,则需要往符号栈中添加连接符'.';当遇到闭包运算符'*'时,需要判断其右边的符号,若非'|'和')'则需要在符号栈中天年假连接符'*';当遇到右括号')'时需要对其右边的符号进行判断,