Untitled
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