Code analysieren
-
Hi
Ich möchte eine Funktion schreiben, die einen Code analysiert, also
bei z.B. diesem CodeFoo (abcd|$Boo (cdef|ghi))
erst Boo (cdef|ghi) aufruft und dann das ergebnis als Argument für Foo nimmt.
Nun habe ich bei meinem Ansatz den Fehler gemacht, dass der ganze Code in der Klammer gesplitted wird und dann das rauskommt:1. abcd 2. Boo (cdef 3. ghi )
String^ EvaluateExecute ( String^ Evaluatable , Object^ sender ) { try{ Evaluatable = EvaluateVariables(Evaluatable);//Funktion unten int start_p = Evaluatable->IndexOf('(')+1; if(start_p<0) { cmErrorMachine->Parse('s',0);return "returned error"; } int end_p = Evaluatable->LastIndexOf(')'); if(end_p<0) { cmErrorMachine->Parse('s',1);return "returned error"; } int len = end_p - start_p; String^ ExecutableString = Evaluatable->Substring(0,start_p)->Split(gcnew array<wchar_t>{' ',' '})[0]; String^ EvaluatingString = Evaluatable->Substring(start_p,len); array<String^>^ EvaluatedSplitted = EvaluatingString ->Split(gcnew array<wchar_t>{'|'}); int index = IndexOfExisting(ExecutableString,false); if(Executables[index]->ExecutionTakes(EvaluatedSplitted->Length)==false){ cmErrorMachine->Parse('s',2); return "returned error"; } for(int i=0;i<EvaluatedSplitted->Length;++i){ if(EvaluatedSplitted[i]->StartsWith("$")&&EvaluatedSplitted[i]->Length>1){ String^ r = EvaluateExecute(EvaluatedSplitted[i]->Substring(1),sender); EvaluatedSplitted[i] = r; } } return Executables[IndexOfExisting(ExecutableString,false)]->ExecutionService(cmExecutionContext,EvaluatedSplitted, gcnew array<Object^>{sender , this, cmErrorMachine}); //Ruft die angegebene funktion aus der Executables liste auf }catch(ArgumentOutOfRangeException^ ex){ ex; cmErrorMachine->Parse('s',3); return "returned error"; } } String^ EvaluateVariables(String^ Evaluatable){ Evaluatable = Evaluatable ->Replace("\\r","\r"); Evaluatable = Evaluatable ->Replace("\\n","\n"); Dictionary<String^,String^>::KeyCollection^ kc = Variables->Keys; Dictionary<String^,String^>::KeyCollection::Enumerator^ e=kc->GetEnumerator(); while(e->MoveNext()){ String^ key=(String^)e->Current; Evaluatable = Evaluatable->Replace("{"+key+"}",Variables[key]); Evaluatable = Evaluatable->Replace("<{>","{"); Evaluatable = Evaluatable->Replace("<}>","}"); } return Evaluatable; }
Hat jemand für das Problem ne Lösung?
Vielen dank im voraus.
lg robthar
-
Mit C++/CLI hat das nicht wirklich was zu tun... Du solltest Dich mal mit Parsern beschäftigen, wie man sowas korrekt auflöst...
-
Wo sollt ich das denn hinposten?
Was meinst du mit Parsern?Ich hab auch gedacht, anstatt erst zu splitten erst die Klammern aufzulösen und vom höchsten Level an zu Interpretieren
-
Ich wollte damit nur sagen, dass es kein C++/CLI Problem ist, was Du hast... sondern eine "Algorythmus"-Problem...
-
Ja ok, is mir aber nachdem ichs in C++/cli programmiert hatte als erstes eingefallen
Trotzdem, was meinst du mit Parser?
-
Ich brauch jetzt dringend mal einen Parser. Ich schaffs einfach nicht es ist zu kompliziert, mir platzt der Kopf
-
Schau dir mal boost::spirit an.
Im Umfeld von Standard C++ wirst du wohl eher da auf Informationen zu stossen.
Im Magazin findest du auch 2 Artikel zu boost::spirit.Alternativ müsstest du dir Lexx/Yacc ansehen.