Untitled

 avatar
unknown
plain_text
5 months ago
4.8 kB
4
Indexable
#Conitional Seq Extractor Class
class conditional_seq_extractor():
    """
    Class to get conditinal Seq of all conitional blocks within the program.
    Each line with the conditional block will be tied or dependent to its parent. Sequence no of parrent will be taken as conditional seq.
    
    Functions:
        add_keyword_idx_seq : Append elemets to lists [block, block_idx, seq]
        pop_keyword_idx_seq : Pop's out element from lists [block_idx, block] and appends to Seq
        pop_IF_seq_special  : Pop's out element function for special cases - IF
        pop_EV_seq_special  : Pop's out element function for special cases - EVALUATE
        pop_endevaluate     : Pop's out element function for End-EVALUATE
        pop_when            : Pop's out element on block and append in seq - WHEN
        extract             : main function which will return conditional sequence as a list
        
    """
    def __init__(self):
        self.block     = []
        self.block_idx = []
        self.seq       = []
    
    def add_keyword_idx_seq(self, data, seq):
        self.block.append(data[1].strip().split()[0])
        self.block_idx.append(data[0])
        self.seq.append(seq)
        
    def pop_keyword_idx_seq(self, data):
        if self.block[-1] == 'ELSE': self.block.pop(), self.block_idx.pop()
        assert self.block[-1]=='IF','Unordered IF'
        self.seq.append(self.block_idx[-1])
        self.block.pop()
        self.block_idx.pop()
        
    def pop_IF_seq_special(self):
        seq_temp = 0
        for n in range(len(self.block)):
            if self.block[-1] in ['ELSE', 'IF']:
                seq_temp = self.block_idx[-1]
                self.block.pop()
                self.block_idx.pop()
            else:
                break
        self.seq.append(seq_temp)
        
    def pop_EV_seq_special(self):
        seq_temp = 0
        for n in range(len(self.block)):
            if self.block[-1] in ['EVALUATE','WHEN']:
                seq_temp = self.block_idx[-1]
                self.block.pop()
                self.block_idx.pop()
            else:
                break
        self.seq.append(seq_temp)
        
    def pop_endevaluate(self):
        assert self.block[-1] in ['EVALUATE', 'WHEN'],'Unordered EV'
        for i in range(len(self.block)):
            if self.block[-1] =='WHEN': self.block.pop(), self.block_idx.pop() 
        self.seq.append(self.block_idx[-1])
        self.block.pop()
        self.block_idx.pop()
    
    def pop_when(self, d):
        if self.block[-1]=='WHEN': self.block.pop(), self.block_idx.pop()
        self.seq.append(self.block_idx[-1])
        self.block.append(d[1].strip().split()[0])
        self.block_idx.append(d[0])
        
    def extract(self, data):
        logging.debug('Conditional Sequence Extraction ==> Started')
        for i,d in data.iterrows():
            
            statement = d[1].strip()
            
            if statement.startswith(('IF ', 'EVALUATE ')) and self.block==[]: self.add_keyword_idx_seq(d, float('nan'))
                
            elif statement.startswith(('IF ', 'EVALUATE ')) and self.block!=[]: self.add_keyword_idx_seq(d, self.block_idx[-1])
            
            elif statement.startswith('ELSE'): self.add_keyword_idx_seq(d, self.block_idx[-1])
            
            elif statement.startswith('END-IF.'): self.pop_IF_seq_special()
            
            elif statement.startswith('END-IF'): self.pop_keyword_idx_seq(d)

            elif statement.startswith('END-EVALUATE.'): self.pop_EV_seq_special()
            
            elif statement.startswith('END-EVALUATE'): self.pop_endevaluate()
            
            elif statement.startswith('WHEN'): self.pop_when(d)
            
            elif statement.startswith('.'): self.seq.append(self.block_idx[0]), self.block.clear(), self.block_idx.clear()
            
            elif self.block!=[]: self.seq.append(self.block_idx[-1])
            
            elif self.block==[]: self.seq.append(float('nan'))
            
            else: self.seq.append(float('nan'))
        logging.debug('Conditional Sequence Extraction ==> Completed')
        return self.seq


    295             elif statement.startswith('END-EVALUATE'): self.pop_endevaluate()
    296 
--> 297             elif statement.startswith('WHEN'): self.pop_when(d)
    298 
    299             elif statement.startswith('.'): self.seq.append(self.block_idx[0]), self.block.clear(), self.block_idx.clear()

    270 
    271     def pop_when(self, d):
--> 272         if self.block[-1]=='WHEN': self.block.pop(), self.block_idx.pop()
    273         self.seq.append(self.block_idx[-1])
    274         self.block.append(d[1].strip().split()[0])

IndexError: list index out of range
Editor is loading...
Leave a Comment