Untitled

 avatar
unknown
plain_text
5 months ago
4.2 kB
1
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
Editor is loading...
Leave a Comment