AutoIT - Script-to-OOP-Script-Converter

  • Hallo liebe Leute,

    Seitdem ich die AutoITObject.au3 für mich entdeckt habe (greetings an die ersteller),
    komm ich von den Objekten nichtmehr weg...

    Standartmäßig, konvertier ich erst alles Mühsam per Hand STUNDEN(2,3,4,5..[-open end] manchmal ;( ),
    da das kein Zustand war, hab ich mir gedacht ich schreib nen "CLASS_Parser", der mir wenigstens die CLASS parsed.

    Der CLASS_Parser war super einfach und schnell fertig, darum jetzt ein "OBJECT&CLASS - PARSER + CODE ERSTELLER".

    Kurz und knapp gesagt, man gibt der UDF einen Link zu einer Datei:
    [bsp. X:\Data\convert.au3] und schreibt dazu noch den Wunschnamen seiner neuen Classe [bsp. ich_werde].
    ( das Programm hängt hinten noch _converted dran, sodass der komplette Name dann lautet [ich_werde_converted() // $ich_werde_obj // $ich_werde_class]

    Die Bedienung ist fast leichter als ne MsgBox zu erzeugen

    Und ACHTUNG: Dieser Parser ist kein "1-klick-ich-mach-die-ganze-arbeit-für-dich-parser".

    Er befindet sich noch im Alpha Stadium und wird warscheinlich von Bugs und Fehlern nur so geplagt....
    Aufjedenfall Konvertiert er erstmal alles was er schafft, was er nicht muss man mit der Hand nachtragen.
    Sparrt trotzdem einen HAUFEN Arbeit.

    z.B. bei der WinHTTPConstants.au3 mussten 330 Zeilen in diesem Stil umgeschrieben werden :


    1) Von:

    Code
    Global CONST $WINHTTP_AUTO_DETECT_TYPE_DNS_A =  0x00000002

    2) Auf:

    Code
    '.AddProperty    ("WINHTTP_AUTO_DETECT_TYPE_DNS_A",$ELSCOPE_READONLY, 0x00000002)'

    Das z.B. schafft das Programm (bei einzeiliger deklarierung) schon soziemlich perfekt.

    (Der Code ist noch etwas unordentlich 8o ) (Es gibt auch Ordentlich DEBUG-Optionen bei Fehlern)

    Programm: "AutoIT - [Script]-to-[OOP-Script]-[Converter] .au3"

    Beispiel Benutzung:

    Kompletter Sourcecode:


    Eine BeispielDatei die ich umkonvertiert habe, das ist die WinHTTPConstants.au3


    Diese Datei wurde von 'AutoIT - Script-to-OOP-Converter' automatisch generiert.


    Feedback ist SEHR erwünscht..


    Zuletzt geupdated : [21.02.2017] >> [09:30]


    UPDATE

    Code
    [21.02.2017] >> [09:30] >> [v0.81] >> Includes werden jetzt korrekt eingebunden


    [BUGLISTE]

    Code
    - includes werden nicht eingebunden [FIXED]
    	- get varaibles even through linebreak not working yet</strong>
    	- get more variables from one line, yet only one is working</strong>
    	- arrays sometimes will be shown weird, like ".addProperty( "aTestProperty[" & .bTestProperty[0][1 & "]", public/private, "value")


    [HISTORIE]

    Code
    -v0.81 pub.a {
    	> includes work now
    }
    -v0.8 [pub]lic.[a]lpha { 
    	> first public version
    	> Reads an Entire .au3 script and tries to Split FUNCTIONS and VARIABLE DECLARATIONS  into CLASSES, OBJECTS, PROPERTY and METHODS.
    	> Works realy good yet if you dont write too obfuscated :P
    	> MULTI DEKLARATIONS dont work yet
    	> DEKLARATIONS With a LINKEBREAK dont work yet
    }

    4 Mal editiert, zuletzt von Busti (21. Februar 2017 um 09:43)

  • [UPDATE]

    Code
    -v0.81 pub.a {
            > includes work now
    }


    Hoffe es ist okay, das ich neuerungen in einen neuen Post schreibe, falls nicht, bitte einfach drauf hinweisen, dann strukturier ich alles um. :)

    • Offizieller Beitrag
    Zitat
    • > MULTI DEKLARATIONS dont work yet
    • > DEKLARATIONS With a LINKEBREAK dont work yet

    1. Meinst du mit Multideklarationen Deklarationen mit selben Namen in unterschiedlichem Scope?
    2. Deklarationen mit Linebreak aufzulösen ist recht easy: Skript einlesen, Zeilenfortschreibungen löschen, Parsen

    Für beides findest du schon Lösungen hier im Forum. Ich habe das für SciTE-AddOns verwendet, schau mal in der Lua-Abteilung.

  • Hi, danke für die Antwort.

    Naja, damit meine ich z.B.

    Code
    Global $bla, $bla2, $bla4="",$bla5=";",$bla6='zomg'


    oder auch

    Code
    global $bla, _
    $bla1, $bla4, _
    $bla6 = "", _
    $bla7=""


    bin grad schon am überlegen, wie ich das am besten regel...

    und danke für den tipp, ich werd mal in die LUA sektion reinstöbern.

    Hast du evtl noch ein Zwei Anhaltspunkte nach was ich genau suchen soll?


    und kann ich evtl die Linebreaks so umgehen, bzw meinst du das so :

    Code
    stringreplace( $source, ", _", "\b" )
    • Offizieller Beitrag

    Global $bla, $bla2, $bla4="",$bla5=";",$bla6='zomg'

    Das ist nicht sehr komplex:
    Wenn du die Zuweisungen auch möchtest, als Pattern: $sPattern = '(\$[_\w]+)(?:\s*=([^,]+))?' Wenn eine Variable eine Zuweisung hat folgt sie im Array nach dem Variablennamen.

    AutoIt
    $sLine = 'Global $bla, $bla2, $bla4="",$bla5=";",$bla6="zomg"'
    $sPattern = '(\$[_\w]+)(?:\s*=[^,]+)?'
    $aResult = StringRegExp($sLine, $sPattern, 3)
    For $i = 0 To UBound($aResult) -1
    	ConsoleWrite($aResult[$i] & @CRLF)
    Next

    stringreplace( $source, ", _", "\b" )

    Ich würde mit einem Leerzeichen ersetzen, aber nur die Fortschreibung: StringReplace( $source, " _", " " )
    EDIT: Da es eingelesen ist, hängt noch ein Zeilenumbruch hinter, der muß natürlich auch mit weg. ;)

  • Vielen Dank für den RegEx Befehl...
    Genau sowas suche ich !!

    Versteh mich nicht falsch, es wär echt cool, natürlich nur falls du Zeit und lust hast, mir den PATTERN zu erklären....

    Bevor es jetzt gleich heißt, google,.. ich bin seid Monaten an diesen RegEx Befehlen dran und hab bisjetzt nur 1-2 geschafft die auch absolut standart sind.... ( wie z.B. alles zwischen '<' und '>' ).

    Das Problem mit RegEx und mir ist, ich steig noch nicht ganz hinter die Logik, ich brauch die nur einmal verstehen, aber irgentwie, schaff ich es nicht, mir dieses letzte bröckchen verständniss, übers lesen beizubringen..

    Naja, wär echt nice :-). Dann ersetz ich den Großteil des Scripts nämlich durch Regex statt meine 'verstringten' functionen :) .


    Frage am Rande, hast du das script mal probiert? positives/negatives Feedback? gehts/nicht?
    Lohnt sich das Script eigtl, oder ist es nur eine Spielerei? Auch nicht falsch verstehen, ich meine da die Objecte ja in c++ Generiert werden, müssten sie ja 'schneller' arbeiten... die Frage ist nur, wird der AutoIT Code, der in die "(C) Objecte" verlagert wird, nun immernoch mit der selben geschwindigkeit ausgeführt, oder geht es schneller?

    Oder läuft es gar ganz so, das rein die Objecte, aber der AutoIT-Code garnicht davon betroffen ist und immernoch langsam läuft?

    Sorry für die Vielen Fragen, war lang nichtmehr in nem Forum und hab mit Leuten geschrieben die'n 'Plan' haben... Und die neugier... ach die neugier... haha :)

    grüße


    btw. dein PATTERN is genau so einer, aus dem ich nicht schlau werde.... es muss nur 1 mal Klick machen.... :rock:

    Edit 2:

    Dein Patter gibt nur die Variablen zurück, leider nicht den Wert bei $bla6 z.B. :/

    Und ich versuche hier grad schon an dem PAttern rumzubauen, aber das einzige was ich schaffe, ist das Kauderwelsch zurückkommt oder gar-nichts. :?:

    Edti3 :

    versuche es mal noch mit deiner Seite, vll ist es da so erklärt das ichs ralle, das war doch die, oder?

    Edit4 :

    ich sehe grad du hast mir auch nen Pattern gegeben mit zuweisen o_o.
    ich checks kurz ab und erstatte in Edit 5 Bericht haha

    Edit5:

    Aaaaaalso, 1. du bist Genial, zweitens würd ich evtl noch ein kleines Problem sehen, undzwar:

    das ist mein Return:

    Code
    $bla
    $bla2
    $bla4
    ""
    $bla5
    ";"
    $bla6
    "zomg"


    WOHER, weiß ich jetzt, ob das nach $bla4 ne Zuweisung ist und nicht z.B. sowas : $bla4 = $bla10, dann krieg ich ja zurück:

    Code
    $bla4
    $bla10

    in dem Fall, kann ich doch nicht eruieren, ob $bla10 ne eigene Variable ist oder ne Zuweisung.
    Also klar, ne eigene Variable ist es so oder so, in dem Fall, aber, nach dem Parsen würde bei .bla4 = .bla10 fehlen, weil ich nie gewusst hätte das es dort zugefügt gehört.

    Hatte eher an sone regex maske gedacht.... uff wie beschreib ich das jetzt

    .... Also, ich versuchs mal....

    GLOBAL $var, $var2, $var5, $var4=4, $var7='x', $var5= $var7, $xxx= 1234

    also ein patter der checkt ob:

    GLOBAL[ ]$VAR(hier soll überprüft werden ob ein = kommt, von dem pattern)(wenn kein = kommt, soll überprüft werden, ob ein , das NICHT in ' oder " gesetzt ist kommt, damit ich weiß wie ich weiter vorgehe... :x...

    hmmmgrml regex ?(?(?(?(?(

  • Versteh mich nicht falsch, es wär echt cool, natürlich nur falls du Zeit und lust hast, mir den PATTERN zu erklären....

    Es ist eine Kunst regexen zu können. Schau dir diverse Tutorials an und probier dich mal an ein paar Patterns.
    Als Liveparser kann ich dir regex101 empfehlen, da dieser standardmäßig die selbe RegEx-Engine verwendet wie AutoIt.

    • Offizieller Beitrag

    Hier mal das Pattern erläutert:

    Dein Skript habe ich noch nicht getestet.
    Ich habe viel mit AutoItOOP experimentiert. Bei einem Problem bin ich aber stecken geblieben: AutoitOOP-Objekte lassen sich nicht ByRef nutzen. Das liegt leider in der Natur dieses Objektes und läßt sich nicht ändern. Dadurch geht leider viel Objekt-Funktionalität verloren.

  • Es ist eine Kunst regexen zu können. Schau dir diverse Tutorials an und probier dich mal an ein paar Patterns.Als Liveparser kann ich dir regex101 empfehlen, da dieser standardmäßig die selbe RegEx-Engine verwendet wie AutoIt.

    Danke, alpines.

    Wie bereits geschrieben, ich würde die Frage nicht stellen(da sie mir selbst unangenehm ist), wenn ich noch irgentwo die chance sehen würde, ohne einen kleinen Stubbs in die richtige Richtung mit Regex zu kommen. Ich versuche es wirklich schon seit Monaten, lande aber immerwieder an rumgefiesel mit String funktionen :(.

    Hab mal wie gesagt 2 regex strings geschafft, ganz einfache, habs aber auch geschafft, mir den pattern (für mich) nicht fixbar zu beschädigen und musste ihn wieder aus den weiten des Internets rausfischen.. Dabei hab ich nur versucht ihn abzubauen und wieder aufzubauen und ggf. kleinigkeiten verändern.

    Aber egal wieviel Tonnen an Code in meinen hirn rumfliegen, gehts um regex, ist das wie ein Säurebad. Vorallem, ich weiß, das ichs beherrschen werde, sobald ich SYNTAX & LOGIK der REGEX verstehe :D.

    Und ja, ich bin schon auf deiner regex101 seite und auf BugFix und les mir alles durch und spiel mich nochmal durch.


    Ein Beispiel, zum Aufzeigen meiner REGEX Künste

    Als Beipiel nehm ich mal den Urlangen String von BugFix seiner Seite(der macht einem schon vom ansehen ein schwummriges bauchgefühl):


    Viel spaß beim lachen haha :party:

  • Hier mal das Pattern erläutert:

    Dein Skript habe ich noch nicht getestet.
    Ich habe viel mit AutoItOOP experimentiert. Bei einem Problem bin ich aber stecken geblieben: AutoitOOP-Objekte lassen sich nicht ByRef nutzen. Das liegt leider in der Natur dieses Objektes und läßt sich nicht ändern. Dadurch geht leider viel Objekt-Funktionalität verloren.

    1. Vielen Dank.
    2. Das Rahm ich aus und klebs mir an die Wand :P
    3. Bin bisjetzt noch nie auf Probleme wegen ByRef gestoßen, das ist doch eigentlich, ganz gut umgehbar?
    Bin nur einmal ewig an nem Error gehangen, bis ich verstanden hatte, dass das mit dem ByRef zusammenhing.

    Warscheinlich is der Vorteil von ByRef, das es schneller geht, da nix erstellt werden muss sondern immer weiterverarbeitet, richtig?

    Grüße :klatschen:

  • Warscheinlich is der Vorteil von ByRef, das es schneller geht, da nix erstellt werden muss sondern immer weiterverarbeitet, richtig?

    Wie der Name sagt wird statt einer Kopie eine Referenz verwendet.
    Das ursprüngliche Objekt das in die Funktion gegeben wird wird maniupuliert und es muss kein neuer Speicherplatz allokiert werden um eine Kopie (ByValue) zu erstellen.

    • Offizieller Beitrag

    Warscheinlich is der Vorteil von ByRef, das es schneller geht, da nix erstellt werden muss sondern immer weiterverarbeitet, richtig?

    Die Geschwindigkeit (durch das Sparen des Kopierens des Originals) ist ein Punkt. Aber wesentlicher bei Objekten ist die Nutzung von ByRef bei Methoden des Objektes. Und das geht leider nicht mit AutoIt-OOP. Das Problem hatte ich mal hier geschildert.

  • :rofl: Es ist noch kein Meister vom Himmel gefallen.
    \s ist ein Bezeichner für Whitespaces. Da sind z.B. Leerzeichen und Tabs inbegriffen.
    (\s{1}) matcht \s einmal.
    | hast du richtig erkannt, das ist ein Oder. Beispiel: (aber|doch) würde aber oder doch matchen im Pattern.

    aaaaaaaaaaah, okayokay, ich muss mir alle Infors von euch zwei gleich sorgfältig abspeichern und lernen....
    Sehr gut, vielen dank, jetzt schonmal, selbst wenn ichs nicht hinkriegen sollte, die patterns zu machen, danke(an euch beide, ihr seid Genius) für die Zeit & Hilfe meine Fragen zum beantworten.

    Ansich teil ich deine Meinung, mit dem Meister, der vom Himmel gefallen ist, ich rechne mir selbst aber doch, 'etwas' Kenntnisse im PC-Bereich zu, darum Wurmt mich das mit dem REGEX umso mehr....

    REGEX + POINTER damals bei c++.

    Das Problem ist nicht, das ich damit nicht umgehen könnte, das Problem ist, das ich (unglaub aber wahr) jemanden benötige, der mir das einmal beibringt.

    Das unglaublich aber wahr, ist eine Anspielung auf nen "Lehrer". War früher immer der Meinung alles alleine viel besser lernen zu können.
    Ansich ist es auch garnicht so verkehrt, man braucht nur 100 Jahre länger und kaut zeug durch, das andere schon perfekt verstehen und einem einfach beibringen könnten.

    So mit dem Alter, lernt man den einen oder anderen Lehrer die man früher hatte und/oder das Wissen, das sie Bereit waren/sind zu vermitteln, mit ganz anderen augen zu sehen 8).

    Autoit z.B. hab ich von der Pike auf sturr durchd as Helpfile gelernt. Jetzt könnt ich 2 Wochen durchprogrammieren, ohne das mir der Stoff ausgeht..
    Props an das super Helpfile und die Community [eng/deu], die mir damals schon, geholfen haben.
    Bei REGEX und C++ sah die ganze Sache damals anders aus.... da bin ich untergegangen, kaum tutorials bzw. die, die es gab, waren komischerweise nie für meine visual Studio version und wenn ich dann mal doch die richtige hatte, hats an den simplesten Aufgaben gescheitert.... bsp. Pointer * zPointer. (is bestimmt schon 10 Jahre her+)

    Aber ich schweife ab, me sorry.

    Wie der Name sagt wird statt einer Kopie eine Referenz verwendet.Das ursprüngliche Objekt das in die Funktion gegeben wird wird maniupuliert und es muss kein neuer Speicherplatz allokiert werden um eine Kopie (ByValue) zu erstellen.

    Ok, danke für die noch Detailliertere Aussage.
    So hatt ichs mir auch gedacht. Aber neben den gespaarten Speicherplatz müsste doch auch Geschwindigkeit++ wahrzunehmen sein? (ich hoffedu verstehst meinen Witz haha :))
    Weil ja ein/paar Schritt/e unnötig sind und übersprungen bzw. ausgelassen werden könnten.

  • So hatt ichs mir auch gedacht. Aber neben den gespaarten Speicherplatz müsste doch auch Geschwindigkeit++ wahrzunehmen sein?

    Das ist ja der nette Nebeneffekt davon das man das ursprüngliche Objekt verwendet. Es wird keine Zeit damit verschwendet eine neue Kopie anzulegen indem man neuen Speicherplatz allokiert und die Daten rüberkopiert sondern direkt mit dem Original arbeitet. Der Nachteil ist nur das man dann keine Kopie vom ursprünglichen Zustand des Originals mehr hat, wenn das aber egal ist kann man sich so oft es geht ByRefs um die Ohren hauen.

  • Code
    (\$[_\w]+)(?:\s*=([^,]+))?
    
    ...
    
    \s*              - Leerzeichen mit Quantifier "*", 0 bis unendlich oft
    
    ...

    Muß das nicht '\s+' heißen, also [whitespace) gefolgt von weiteren Zeichen aus der Zeichengruppe?

    '\s*' bedeutet doch "ein Whitespace, gefolgt von weiteren BELIEBIGEN Zeichen" ?

  • '\s*' bedeutet doch "ein Whitespace, gefolgt von weiteren BELIEBIGEN Zeichen" ?

    Falsch, wenn du ein beliebiges Zeichen matchen willst, dann verwendest du dafür den .-Operator.

    Das Sternsymbol steht dafür, dass Whitespaces vorkommen können, es aber nicht muss.

    Es ist ein Quantifizierer.

    \s+bedeutet: Matche greedy min. ein Whitespace

    \s*bedeutet: Matche greedy min. null Whitespaces

    Eine detaillierte Erklärung findest du in der Hilfe: https://www.autoitscript.com/autoit3/docs/f…tringRegExp.htm