class PhpParser:
  def parse(self, tokens):
    self.left_bracket = 0
    self.is_class = False
    self.function = False
    self.double_quote = False
    self.single_quote = False

    class_map = {}
    current_class = None

    for token in tokens:
      if len(token) == 0:
        continue

      if token == "class":
        self.is_class = True if self.double_quote != True and self.single_quote !=True and self.left_bracket == 0 else False

      elif token == "function":
        self.function = True if self.double_quote != True and self.single_quote !=True else False
      elif token == "{":
        self.left_bracket += 1
      elif token == "}":
        self.left_bracket -= 1
      elif token == "'":
        self.single_quote = False if self.single_quote == True else True
      elif token == '"':
        self.single_quote = False if self.single_quote == True else True
      else:
        # it is string token, process it accordingly.
        if self.is_class == True and token not in class_map:
          class_map[token] = []
          current_class = token
          self.is_class = False
        elif self.function == True and current_class != None:
          class_map[current_class].append(token)
          self.function = False

    return class_map

parser = PhpParser()

input = [
  "class", "Foo", "{",
    "public", "$aMemberVar", "=", "'", "aMemberVar", "Member", "Variable", "'",";",
    "public", "$aFuncName", "=", "'","aMemberFunc","'",";",
  "function", "aMemberFunc","(",")", "{",
        "print", "'", "Inside" "`","aMemberFunc","(",")","`","'",";",
    "}",
  "function", "bob","(",")", "{",
    "print", '"',"hi", ",", "Hi", "am", "function", "bob2", '"',";",
  "}",
"}",
"class", "Olivia",
"{",
 "function", "say","(",")", "{", "print", '"',"hi",'"', ";", "}",
"}",
"$foo", "=", "new", "Foo", ";",
"class", "bogus", ";"
]
        
print ("input = {} \n output = {}".format(input, parser.parse(input)))