Advertisement
Guest User

Untitled

a guest
Jun 25th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.99 KB | None | 0 0
  1. #!/usr/bin/env python3.1
  2. import sys
  3.  
  4. ''' Undeterministic machina which accept/decline input sequence of word
  5. Example of running:
  6. python3.1 NFA.py zadani.txt < vstupy.txt
  7. '''
  8.    
  9. class Table:
  10.     ''' Contains table of transitions '''
  11.    
  12.     __states = []   ## 3dimensional array which holds array of transits for each state
  13.     __tr = []       ## transits in this table
  14.     __map = {}
  15.     __final = []
  16.     __numStates = 0
  17.     __closures = []
  18.    
  19.     def __init__( self, config ):
  20.         ''' Build table based on cofig file '''
  21.         fh = None
  22.         try:
  23.             fh = open(config, 'r');
  24.             arr = fh.readline().strip().split()[1:]
  25.             self.__tr = [ tr for tr in arr ]
  26.             # map holds indexes in table of states based on characted for input
  27.             for num, tr in enumerate(arr):
  28.                 self.__map[tr] = num
  29.             # fill table of states
  30.             line = fh.readline()
  31.             state = 0
  32.             while len(line) > 0:
  33.                 arr = line.strip().split()
  34.                 if arr[0].startswith("<"): self.__final.append( state )
  35.                
  36.                 self.__states.append( [] )
  37.                 for num, tr in enumerate(arr[1:]):
  38.                     self.__states[state].append( set() )
  39.                    
  40.                     for i, st in enumerate(tr.split("|")):
  41.                         if st != "-":
  42.                             self.__states[state][num].add(int(st))
  43.                
  44.                 state += 1
  45.                 line = fh.readline()
  46.             #endwhile
  47.            
  48.         except IOError as io:
  49.             print("Cannot load file " + config )
  50.         finally:
  51.             if fh != None:
  52.                 fh.close()
  53.                
  54.         self.__numStates = len( self.__states )
  55.        
  56.         # recursively building eps-closures
  57.         for st in range( self.__numStates ):
  58.             self.__closures.append( set() )
  59.             self.buildClosures( st, self.__closures[st] )
  60.        
  61.     def buildClosures(self, state, closures) :
  62.         ''' Recursive function for building eps-closures
  63.        state int for which state we append eps-closures
  64.        closures set where to append closures
  65.        '''
  66.         arr = self.__states[ state ] [ self.__map["\eps"] ]
  67.         if len( arr ) > 0:
  68.             closures.update( arr )
  69.             for a in arr:
  70.                 self.buildClosures(  a, closures )
  71.    
  72.     def __str__(self):
  73.         out = "Table of transitions\n"
  74.         for i,st in enumerate(self.__states):
  75.             out += str(i) + ". prechody:" + str(st) + "uzavery:" + str(self.__closures[i]) + "\n"
  76.         out += "\nKonecne stavy: " + str (self.__final) + "\n\n"
  77.        
  78.         return out
  79.  
  80.     def getState( self, state, transit ):
  81.         '''Returns set of states even from eps-closures'''
  82.         out = set()
  83.         # adding transitions for given state
  84.         out.update(self.__states[ state ] [self.__map[transit]])
  85.        
  86.         # adding eps-closures from transitions
  87.         for tr in self.__states[ state ] [ self.__map[transit] ]:
  88.             out.update(self.__closures[ tr ])
  89.            
  90.         # adding transitions from eps-closures
  91.         for tr in self.__closures[state]:
  92.             out.update(self.__states[ tr ][ self.__map[transit] ])
  93.        
  94.         # adding eps-closures for given state WRONG!
  95.         # out.update(self.__closures[state])
  96.        
  97.         return out
  98.    
  99.     def isFinal(self, state):
  100.         return state in self.__final
  101.  
  102.  
  103. class Machine:
  104.     def __init__(self, table):
  105.         self.__states = set([0])
  106.         self.__table = table
  107.         self.__nextStates = set()
  108.        
  109.     def parseString( self, string ):
  110.         ''' Raise self.changeState() for every char in input string '''
  111.         self.__states = set([0])
  112.         for c in string:
  113.             for st in self.__states:
  114.                 self.changeState( self.__table.getState(st, c) )
  115.             self.swapStates()
  116.             #print( "Pro '"+ str(c) + "' :" + str ( self.__states ))
  117.        
  118.         for st in self.__states:
  119.             if self.__table.isFinal( st ) == True:
  120.                 return True
  121.        
  122.         return False
  123.  
  124.     def swapStates( self ):
  125.         '''Perform union of current states and desired states'''
  126.         self.__states = self.__nextStates
  127.         self.__nextStates = set()
  128.  
  129.     def changeState(self, states):
  130.         '''Prepare new array with actual states. Doesnt change inner states of object'''
  131.         self.__nextStates.update( states )
  132.  
  133.  
  134.  
  135.  
  136. if __name__ == '__main__':
  137.    
  138.     if len( sys.argv ) != 2:
  139.         print("Usage: {0} konfiguracni_soubor".format( sys.argv[0] ))
  140.         sys.exit()
  141.        
  142.     table = Table( sys.argv[-1] )
  143.     # print( table )
  144.     machine = Machine( table )
  145.     while True:
  146.         try:
  147.             s = input()
  148. #            if len(s) == 0:
  149. #                break
  150.             ret = machine.parseString ( s )
  151.             print( str( int(ret) ) )
  152.         except EOFError:
  153.             break
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement