• 大小: 6KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-13
  • 语言: Python
  • 标签: python  

资源简介

python3.7实现正则表达式到dfa的转变,提供控制台输出文件,graphviz图像输出文件,graphviz图像输出需自行配置相关环境

资源截图

代码片段和文件信息

from graphviz import Digraph


stack = []  # 储存nfa的栈
flag = []  # 判断图是否遍历完全
symbol = (‘|‘ ‘·‘ ‘*‘ ‘(‘ ‘)‘)  # 符号元组
temp = []  # 求闭包时判断是否遍历重复结点
_name = 0  # 求当前结点的数字编号


class State(object):  # nfa的起始和终止状态
    “““docstring for State“““
    def __init__(self start end):
        self.start = start
        self.end = end


class nfa():  # nfa的每个状态信息
    “““docstring for retonfa“““
    def __init__(self):
        self.name = -1
        self.next = []
        self.val = []


def Clear():  # 清空flag标志列表
    flag.clear()


def initnfa(val):  # 初始化一个nfa
    global _name
    start = nfa()
    start.name = _name
    _name = _name + 1
    end = nfa()
    end.name = _name
    _name = _name + 1
    start.next.append(end)
    start.val.append(val)
    stack.append(State(start end))
    # for i in range(len(start.next)):
    #     print(start.name start.val[i] start.next[i].name)
    # print(start.name end.name)


def stnfa(op):  # 构造nfa
    global _name
    if op == ‘|‘:
        start = nfa()
        start.name = _name
        _name = _name + 1
        end = nfa()
        end.name = _name
        _name = _name + 1
        start.next.append(stack[-2].start)
        start.val.append(“null“)
        start.next.append(stack[-1].start)
        start.val.append(“null“)
        stack[-2].end.next.append(end)
        stack[-2].end.val.append(“null“)
        stack[-1].end.next.append(end)
        stack[-1].end.val.append(“null“)
        stack.pop()
        stack.pop()
        stack.append(State(start end))
        # printnfa(start)
        # print(“\n“)
        flag.clear()
        # for i in range(len(start.next)):
        #     print(start.name start.val[i] start.next[i].name)
    elif op == ‘*‘:
        start = nfa()
        start.name = _name
        _name = _name + 1
        end = nfa()
        end.name = _name
        _name = _name + 1
        start.next.append(stack[-1].start)
        start.val.append(“null“)
        stack[-1].end.next.append(stack[-1].start)
        stack[-1].end.val.append(“null“)
        stack[-1].end.next.append(end)
        stack[-1].end.val.append(“null“)
        start.next.append(end)
        start.val.append(“null“)
        stack.pop()
        stack.append(State(start end))
        # printnfa(start)
        # print(“\n“)
        flag.clear()
        # for i in range(len(start.next)):
        #     print(start.name start.val[i] start.next[i].name)
    elif op == ‘·‘:
        start = nfa()
        start.name = _name
        _name = _name + 1
        end = nfa()
        end.name = _name
        _name = _name + 1
        start.next.append(stack[-2].start)
        start.val.append(“null“)
        stack[-2].end.next.append(stack[-1].start)
        stack[-2].end.val.append(“null“)
        stack[-1].end.next.append(end)
        stack[-1].end.val.append(“null“)
        stack.pop()
        stack.pop()
        stack.append(State(

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     文件       12119  2018-10-27 11:04  re-dfa.py
     文件         171  2018-10-27 11:48  readme.txt
     文件       15568  2018-10-27 11:44  retodfa.py

评论

共有 条评论