code: def _mpda(self, re_grammar, splitstring=0):
          
          cnfgrammar = CNFGenerator(re_grammar)
  
          if not self.alphabet:
              self._extract_alphabet(cnfgrammar)
  
          cnftopda = CnfPda(self.alphabet)
          productions = {}
          nonterminals = []
          nonterminals.append(cnfgrammar.init_symbol)
          for key in list(cnfgrammar.grammar_nonterminals):
              if key != cnfgrammar.init_symbol:
                  nonterminals.append(key)
          for key in list(cnfgrammar.grammar_nonterminals):
              j = 0
              productions[key] = {}
              # print 'testing '+key
              for pair in cnfgrammar.grammar_rules:
                  cnf_form = list(pair)
                  if cnf_form[0] == key:
                      productions[key][j] = {}
                      if isinstance(cnf_form[1], type(())):
                          #            print list(p[1])
                          productions[key][j]['b0'] = list(cnf_form[1])[0]
                          productions[key][j]['b1'] = list(cnf_form[1])[1]
                      else:
                          #           print p[1]
                          productions[key][j]['a'] = cnf_form[1]
                      j = j + 1
          return cnftopda.initialize(
              nonterminals, productions, list(
                  cnfgrammar.grammar_terminals), splitstring)
docs: Args:
              re_grammar (list): A list of grammar rules
              splitstring (bool): A boolean for enabling or disabling
                              the splitting of symbols using a space
          Returns:
              PDA: The generated PDA