fork download
  1. # -*- coding: cp1252 -*-
  2. enumkwlist = {
  3. "a" : "enum_a",
  4. "ab" : "enum_ab",
  5. "abba" : "enum_abba",
  6. "abab" : "enum_abab",
  7. "aabb" : "enum_aabb",
  8. }
  9.  
  10. error = "error" #Rückgabewert wenn string nicht gefunden wurde
  11.  
  12. indentor = "\t" # einrückungszeichen, könnte man durch leerzeichen ersetzen
  13.  
  14. def seperate(dictionary): #generiert aus dict<string, enum> ein dict<startchar, dict<string, enum>>, wobei die strings mit dem startchar beginnen
  15. worddict = dict()
  16. global wordlist
  17. wordlist = list()
  18. global char
  19. char = sorted(dictionary)[0][0]
  20. for entry in sorted(dictionary):
  21. if (entry[0] == char):
  22. wordlist.append(entry)
  23. else:
  24. worddict[char] = wordlist
  25. wordlist = [entry]
  26. char = entry[0]
  27. worddict[char] = wordlist
  28. return worddict
  29.  
  30. def generateNewDict(dictionary, char): #generiert ein neues dict wo der string mit char beginnen muss und entfernt das erste zeichen
  31. newdict = dict()
  32. for entry in dictionary:
  33. if (entry[0] == char):
  34. newdict[entry[1:]] = dictionary[entry]
  35. return newdict
  36.  
  37. def generate(sel, level): #sel sei "string enum list", generiert das ganze switch/case
  38. indention = level + 1
  39. if (len(sel) == 0): #ohne strings kein code
  40. return
  41. print indention * indentor+"switch(s["+str(level)+"]){"
  42. if ("" in sel):
  43. print indention * indentor + "case 0:"
  44. print indention * indentor + indentor + "return " + sel.values()[0] + ";"
  45. del sel[""]
  46. if (len(sel) == 0): #recheck weil 1 element gelöscht wurde
  47. print indention * indentor + "}"
  48. return
  49. for char in seperate(sel):
  50. print indention * indentor + "case '"+char+"':"
  51. generate(generateNewDict(sel, char), level + 1)
  52. print indention * indentor + indentor + "break;"
  53. print indention * indentor + "}"
  54.  
  55. print "my_enum to_enum(const char *s){"
  56. generate(enumkwlist, 0)
  57. print indentor + "return " + error + ";"
  58. print "}"
  59.  
Success #stdin #stdout 0.08s 10864KB
stdin
Standard input is empty
stdout
my_enum to_enum(const char *s){
	switch(s[0]){
	case 'a':
		switch(s[1]){
		case 0:
			return enum_a;
		case 'a':
			switch(s[2]){
			case 'b':
				switch(s[3]){
				case 'b':
					switch(s[4]){
					case 0:
						return enum_aabb;
					}
					break;
				}
				break;
			}
			break;
		case 'b':
			switch(s[2]){
			case 0:
				return enum_ab;
			case 'a':
				switch(s[3]){
				case 'b':
					switch(s[4]){
					case 0:
						return enum_abab;
					}
					break;
				}
				break;
			case 'b':
				switch(s[3]){
				case 'a':
					switch(s[4]){
					case 0:
						return enum_abba;
					}
					break;
				}
				break;
			}
			break;
		}
		break;
	}
	return error;
}