From bdfc8ea1b2d5543735d73574d4b60e9b70851cb8 Mon Sep 17 00:00:00 2001 From: Kshitij Date: Sun, 3 Nov 2024 22:57:36 +0530 Subject: [PATCH] Heavily modified and simplified Code-A2 (two pass macro processor in python) - Removed class, there's individual functions now - No more "self", that's too much work for practical exam - Removed expand_macro function, it was unnecessary - Overall refinement for better understanding - Added comments --- Codes/Group A/Code-A2.py | 161 ++++++++++++++++++--------------------- 1 file changed, 75 insertions(+), 86 deletions(-) diff --git a/Codes/Group A/Code-A2.py b/Codes/Group A/Code-A2.py index db9de40..6288f62 100644 --- a/Codes/Group A/Code-A2.py +++ b/Codes/Group A/Code-A2.py @@ -1,89 +1,81 @@ -class MacroProcessor: - def __init__(self): - self.macro_name_table = {} - self.macro_definition_table = {} - self.mdt_index = 0 +# Assignment-A2 - Two-pass macro processor code in Python - def process_pass1(self, source_code): - inside_macro = False - current_macro_name = None - macro_definition = [] +# BEGINNING OF CODE +# Required databases +macro_definition_table = {} # Storing all macro definitions with their names +macro_name_table = {} # Storing macro names and their index +########################################################################## +def process_pass1(source_code): + mdt_index = 0 + macro_definition = [] + current_macro_name = None + inside_macro = False - for line in source_code: - tokens = line.strip().split() + for line in source_code: + tokens = line.strip().split() # store each word of the line of source code - if not tokens: - continue + if (not tokens): # skips blank lines + continue - if tokens[0] == 'MACRO': - inside_macro = True - continue + if (tokens[0] == 'MACRO'): # beginning of macro definition + inside_macro = True + continue - if inside_macro and tokens[0] == 'MEND': - inside_macro = False - self.macro_definition_table[current_macro_name] = macro_definition[:] - self.macro_name_table[current_macro_name] = self.mdt_index - self.mdt_index += len(macro_definition) - macro_definition = [] - current_macro_name = None - continue + if (inside_macro == True and tokens[0] == 'MEND'): # if end of macro is reached + inside_macro = False + macro_definition_table[current_macro_name] = macro_definition[:] + macro_name_table[current_macro_name] = mdt_index + mdt_index += len(macro_definition) + macro_definition = [] + current_macro_name = None + continue - if inside_macro: - if not current_macro_name: - current_macro_name = tokens[0] - macro_definition.append(line.strip()) - else: - pass + if (inside_macro == True): # processing contents of macro + if (not current_macro_name): + current_macro_name = tokens[0] + macro_definition.append(line.strip()) +########################################################################## +def process_pass2(source_code): + output = [] + inside_macro = False - def process_pass2(self, source_code): - output = [] - inside_macro = False + for line in source_code: + tokens = line.strip().split() - for line in source_code: - tokens = line.strip().split() + if (not tokens or tokens[0] == 'MACRO'): # skipping spaces, MACRO and MEND keywords + inside_macro = True + continue + elif (tokens[0] == 'MEND'): + inside_macro = False + continue - if not tokens: - continue + if inside_macro: + continue - if tokens[0] == 'MACRO': - inside_macro = True - continue - elif tokens[0] == 'MEND': - inside_macro = False - continue + macro_name = tokens[0] + if macro_name in macro_name_table: # expand macro from source code + args = tokens[1:] + macro_def = macro_definition_table[macro_name] + for expanded_line in macro_def: + for i, arg in enumerate(args): + expanded_line = expanded_line.replace(f"&ARG{i+1}", arg) + output.append(expanded_line) + else: # append line if not a macro + output.append(line.strip()) - if inside_macro: - continue - - macro_name = tokens[0] - if macro_name in self.macro_name_table: - macro_def = self.macro_definition_table[macro_name] - args = tokens[1:] - output.extend(self.expand_macro(macro_def, args)) - else: - output.append(line.strip()) - - return output - - def expand_macro(self, macro_def, args): - expanded_lines = [] - for line in macro_def: - for i, arg in enumerate(args): - line = line.replace(f"&ARG{i+1}", arg) - expanded_lines.append(line) - return expanded_lines - - def display_tables(self): - print("Macro Name Table (MNT):") - for name, index in self.macro_name_table.items(): - print(f"Macro Name: {name}, MDT Index: {index}") - - print("\nMacro Definition Table (MDT):") - for name, definition in self.macro_definition_table.items(): - print(f"Macro Name: {name}") - for line in definition: - print(f"\t{line}") + return output +########################################################################## +def display(): + print("Macro Name Table (MNT):") + for name, index in macro_name_table.items(): + print(f"Macro Name: {name} | Index: {index}") + print("Macro Definition Table (MDT):") + for name, definition in macro_definition_table.items(): + print(f"Macro: {name}") + for line in definition: + print(f"\t{line}") +########################################################################## source_code = [ "MACRO", "INCR &ARG1", @@ -96,16 +88,13 @@ source_code = [ "START", "INCR A", "DECR B", - "END", + "END" ] - -macro_processor = MacroProcessor() - -macro_processor.process_pass1(source_code) -macro_processor.display_tables() - -expanded_code = macro_processor.process_pass2(source_code) - -print("\nExpanded Source Code (Pass 2):") -for line in expanded_code: - print(line) +########################################################################## +process_pass1(source_code) +display() +print("PASS 2:") +expanded_code = process_pass2(source_code) +for i in expanded_code: + print(i) +# END OF CODE