import re

macro_start_pattern = re.compile(r'(\w+):MACRO\s*(.*?)\s*ENDM', re.DOTALL)

param_regex = r'\$(\\?\w+)(?:\s*,\s*\$\\?\w+)*'

def parse_macro(macro_match):

  macro_name, macro_content = macro_match.groups()

  # Use regex to extract parameter list
  params = re.search(param_regex, macro_content)
  param_string = params.group() if params else ""

  # Split macro content into lines
  lines = macro_content.split('\n')

  # Get macro body
  macro_body = '\n'.join(lines[1:])

  # Handle empty macro body
  if not macro_body:
    formatted_body = ''
  else:
    # Calculate common indent
    common_indent = min(len(line) - len(line.lstrip()) for line in macro_body.split('\n') if line.strip())
    formatted_body = macro_body.replace('\n' + ' ' * common_indent, '\n')
  param_string = params.group() if params else ""

  # Extract param string
  param_string = params.group() if params else ""

  # Verify parameters start with $\\
  if param_string:
      valid = all(p.startswith('$\\') for p in param_string.split(','))
      if not valid:
          param_string = ""

  return f"MACRO Name: {macro_name}\nDefinition:\n{formatted_body}\nParameters: {param_string}"

def parse_source_file(filename):
    with open(filename, 'r') as f:
        source_text = f.read()

    # Use finditer() to iterate over all matches
    macro_matches = re.finditer(macro_start_pattern, source_text)
    macro_definitions = []

    for macro_match in macro_matches:
        macro_definition = parse_macro(macro_match)
        macro_definitions.append(macro_definition)

    return macro_definitions


if __name__ == '__main__':
    # Parse the source text file and extract all MACRO definitions
    macro_definitions = parse_source_file('MEN4.s')

    # Print each MACRO definition with clear separation
    for i, macro_definition in enumerate(macro_definitions, start=1):
        print(f"\nMACRO Definition {i}:\n{macro_definition}")