Hilfe beim Parsen(Regex) von Globalen/Lokalen Variablen aus einer *.au3 Datei

  • Hallo zusammen,
    Ich versuche mich schon seit Stunden an einer Regex Anweisung um alle Globalen und Lokalen deklarierten Variablen aus einer AutoIt Datei zu Parsen und neu zu erstellen.

    Mir geht es ABER darum, das ich aus:

    [autoit]

    Global Const $ScriptDir = @ScriptDir, $__FILE__ = @ScriptFullPath
    Global $DirTarget = $ScriptDir
    Global $__Modus = 1, $__WriteToConsole = Not @Compiled, $__7zStatus, $__ReturnMsg
    Local $Test = StringRegExpReplace(StringReplace($sString, "'", Chr(26), 0, 2), $sPattern, $sDummy)

    [/autoit]


    das bekomme:

    [autoit]

    Global Const $ScriptDir = @ScriptDir
    Global Const $__FILE__ = @ScriptFullPath
    Global $DirTarget = $ScriptDir
    Global $__Modus = 1
    Global $__WriteToConsole = Not @Compiled
    Global $__7zStatus
    Global $__ReturnMsg
    Local $Test = StringRegExpReplace(StringReplace($sString, "'", Chr(26), 0, 2), $sPattern, $sDummy)

    [/autoit]


    Mein Pattern ist bis jetzt:

    [autoit]

    While 1
    $Str = StringRegExpReplace($Str, "(?i)((?:Global|Local)(?: Const| Static)*)\h+(\$\w+)\h*(=\h*\w+.*\)|=\h*[\w@]+|=\h*[\x22']+.*[\x22']+|)\h*,\h*(\$.*)", "\1 \2\3"&@CRLF&"\1 \4")
    If @Extended <= 0 Then ExitLoop
    WEnd

    [/autoit]


    Was aber leider immer noch nicht richtig funktioniert. Ich bin aber auch leider nicht so "der" regex profi, aber ggf kann mir ja jemand weiterhelfen :)

    Einmal editiert, zuletzt von Taz77 (20. Mai 2013 um 19:35)

  • Danke BugFix aber leider nicht, da du in deinem Script nur auf normale Globale Variablen mit \$[\d\w]+ prüfst.

    Der Hintergrund warum ich jede Variable einzeln in einer Lokalen/Globalen Deklaration haben will bzw. muss,
    ist das Au3Check mit der Option -v 3 die unbenutzten Variablen nicht findet :/

    So findet die Au3Check die unbenutzte $Var2 nicht:

    [autoit]

    #AutoIt3Wrapper_AU3Check_Parameters=-v 3
    Global $Var1 = 'Test1', $Var2 = 'Test2'
    ConsoleWrite($Var1)

    [/autoit]


    So hingegen schon:

    [autoit]

    #AutoIt3Wrapper_AU3Check_Parameters=-v 3
    Global $Var1 = 'Test1'
    Global $Var2 = 'Test2'
    ConsoleWrite($Var1)

    [/autoit]
    Code
    XXX.au3(3,1) : UNREFED(3):	$Var2
    • Offizieller Beitrag

    Noch was: Ich halte es für wenig wahrscheinlich, dass du allein mit einem Pattern die Ergebnisse rausziehen kannst.
    Mein Tipp:
    1. Datei als ganzes Einlesen
    2. Zeilenfortschreibungen löschen (" _CRLF"), damit was in eine Zeile gehört auch in einer Zeile steht.
    3. Inhalt an CRLF in ein Zeilen-Array splitten
    4. Lies aus allen verwendeten Includes die Konstantendeklarationen aus (in ein Dictionry od. Arraylist).
    Nun kannst du Zeile für Zeile parsen. Arbeite mit mehreren Dictionary/Arraylist ($Var nicht deklariert, $Var Global/Dim, $Var Local). Füge gefundene Variable dem jeweiligen Dict. zu, wenn noch nicht enthalten und nicht in Konstanten. Somit hast du nach Durchlauf aller Zeilen eine Übersicht, welche Variablen in welchem Scope verwendet werden.

  • Danke für deine Tipps :thumbup:

    Noch was: Ich halte es für wenig wahrscheinlich, dass du allein mit einem Pattern die Ergebnisse rausziehen kannst.


    Jap genau, das Problem sind die Funktion in Funktion Zuweisungen zu einer Variable, z.b:

    [autoit]

    Local $Test = StringRegExpReplace(StringReplace($sString, "'", Chr(26), 0, 2), $sPattern, $sDummy), $Var

    [/autoit]


    Ich habe es jetzt so gelöst das ich die "einfachen" Zuweisungen schon mal mit einen Regex Teile, und für die Komplexeren, werde ich mal deine Tipps befolgen.
    Stichwort: Klammern zählen inc :D