String umwandeln

jkallup

Erfahrenes Mitglied
Hallo,

wie kann ich den String:

this.pushbutton1 = new MyQPushButton(this);

so verwandeln, das

MyQPushButton *pushbutton1;

heraus kommt?
 
Hi jkallup,

bitte stelle deine Frage mal anständig in einem oder mehreren vollen Sätzen.
Was soll dein Programm an Eingabedaten bekommen und was soll dann rauskommen?
Hast du Pseudo-Code oder schon Code-Fragmente geschrieben? Wo liegt dein konkretes Problem? Was willst du mit deinem Programm bezwecken, wozu schreibst du das?

Die Antwort auf deine jetzige "Frage" ist 42.
(Wir können dir keine Antwort geben, wenn du uns nicht eine verständliche Frage stellst.)

Grüße,
BK
 
Zuletzt bearbeitet:
Hi jkallup,

nutzt du vielleicht den Borland Builder?
"this.pushbutton1 = new MyQPushButton(this);"

erstellt dir ein Objekt mit dem Typ "MyQPushButton".(Denk daran das Objekt später auch wieder zu löschen, wenn du es mit new anlegst)

und "MyQPushButton *pushbutton1;" ist ein Zeiger auf ein Objekt mit dem Typ MyQPushButton.
Suchst du vielleicht nach der Zeile, die den Zeiger auf das neue Objekt zeigen lässt?
 
Hallo Jungs,

zur Zeit bastel ich an einen Compiler, der mir aus einer Ausgangssprache eine Zwischensprache generiert.
den String "this.pushbutton1 = new PushButton(this);"
habe ich bereits in
"this.pushbutton1 = new MyQPushButton(this);"
umwandeln können.
jetzt brauche ich ja eigentlich nur noch den Punkt mit -> ersetzen und
in einer Header Datei das "this" wegschneiden und "MyQPushButton *pushbutton1;" hineinschreiben.
Danke an Lyro, für den Tipp bzw, Denkanstoss.
 
Hi,

danke für deine Erklärungen, langsam wird es klarer.

Du parst quasi deine komplette Datei in Zeilen und willst daraus jetzt:
a) Erkennen, dass es eine Instanzierung von ClassX (z.B. PushButton) auf ein Klassenattribut ist
b) Die Klasse ClassX durch ClassY ersetzen (PushButton -> MyQPushButton)
c) In einer anderen Datei das Attribut definieren (ClassY *attributName)
d) An der Original-Stelle die Instanzierung ändern, so dass anstatt "this.attributName" auf "this->attributName" verwiesen wird

Habe ich den kompletten Vorgang richtig verstanden?
Vielleicht hilft dir die kurze Zusammenfassung ja eh schon Als Denkanstoß weiter beim Lösen :)

Grüße,
BK
 
Dies geht mit einer einfachen String-Ersetzung (replace) oder regulären Ausdrücken.
Idealerweise würdest du allerdings die Quelldatei wirklich parsen und den AST (Abstract Syntax Tree) nutzen, um die Ersetzungen immer semantisch und syntaktisch korrekt durchzuführen.
 
Hallo Bratkartoffel,

ja so in etwa, Danke für Deine Eckdaten/Tipps/Hints ...

@ComFreek
auch Dir ein dankeschön! Mit AST habe ich noch nicht so die Erfahrung.
Ich verwende in der Tat RegEx.
Verschiedene Durchläufe (ParsePasses) (mind. 2) verwende ich dafür,
um zum Beispiel
"
local f
f = new Form1()
f.show()
CLASS Form1 OF FORM .... ENDCLASS " zu parsen.

da ist dann der erste Schritt, die "CLASS" Daten zu fangen und im 2ten Schritt
das local f ... f.show()"
Dadurch kann ich zum Beispiel auch bestimmen, wohin ich hüpfen muss, wenn
ich ein IF <expr> ELSE ... ENDIF parsen will
Da brauche ich ; oder THEN oder so.

mit AST muss ich miich mal beschäftigen, ich denke mal dass das fast das gleiche
ist.
Gruß an alle
 
Sodäle,

ich habs mal an die Hand genommen und Qt zu Hilfe genommen.
Herausgekommen ist folgendes:

Code:
if run_parse(4)
{
    QString str1 = QString($1).toLower();
    QString str2 = str1;

    str1 = str1.replace(QRegExp(".*new[ \t\n]pushbutton\\("),"MyQPushButton(");
    str1 = str1.replace(QRegExp(".*new[ \t\n]"),"");
    str1 = str1.replace(QRegExp("\\(.*\\)"),"");

    qDebug() << str1;

    str2 = str2.replace(QRegExp("this."),"");
    str2 = str2.replace(QRegExp("[ \t\n]=[ \t\n]new[ \t\n]pushbutton\\("),"");

    qDebug() << str2;
    qDebug() << str1 << " * " << str2 << ";";
}

Das Ergibt dann in der Letzten Zeile: "MyQPushButton * pushbutton1;"
was dem Entspricht, das ich haben wollte.
Ich sag ja immer wieder: "Gewusst Wie!" :)
 
Zurück