view pyrect/pyrect/regexp/fa.py @ 9:493c96d030c0

add pyrect
author nobuyasu <dimolto@cr.ie.u-ryukyu.ac.jp>
date Tue, 14 Jun 2011 17:24:03 +0900
parents
children
line wrap: on
line source

#!/usr/bin/env python

from pyrect.regexp.ast import AnyChar, Range

class FA(object):
    def __init__(self, transition, start, accepts, states=None):
        self.transition = transition
        self.start = start
        self.accepts = accepts
        self.states = states

    def accept(self, laungage):
        return False

class Transition(dict):
    def __setitem__(self, key, value):
        if type(key) == tuple:
            (state, input) = key
            if self.has_key(state):
                self[state][input] = value
            else:
                self[state] = {input: value}
        else:
            if not isinstance(value, dict):
                raise "Transition.__setitem__: invalid item!"
            dict.__setitem__(self, key, value)

    def __getitem__(self, key):
        if type(key) == tuple:
            (state, input) = key
            if self.has_key(state) and self[state].has_key(input):
                return self[state][input]
            else:
                return None
        else:
            if self.has_key(key):
                return dict.__getitem__(self, key)
            else:
                return None

    def __str__(self):
        string = "Transition:"
        for (s, i), ns in self.itertrans():
            string += " %s x %s -> %s," % (s, i, ns)
        return string

    def iterstates(self):
        for s, t in self.iteritems():
            yield s, t

    def itertrans(self):
        for s, v in self.iteritems():
            for i, n in v.iteritems():
                yield (s, i), n