Compiler Output-Zeilen ermitteln und bearbeiten - Vorschläge und Meinungen?

  • Ausgangssituation sind die Output-Zeilen von AutoIt bei "Run", "Compile", usw. wie sie z. B. in SciTE zu sehen sind. Für mein PSPad4AutoIt3 Projekt will ich die Fehlerzeilen aus dem Log-Fenster herausgefiltern, sowie den Pfad zum Script auslesen und Angaben ersetzten.

    Folgende Arten von Fehlermeldungen sind mir bekannt:

    Zitat

    "D:\test files\FileQuantityLimit (Testdatei).au3"(112,16) : warning: $iTest possibly not declared/created yet

    "D:\test files\FileQuantityLimit (Testdatei).au3"(131,11) : error: zzzz(): undefined function.

    "D:\test files\FileQuantityLimit (Testdatei).au3" (163) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:

    Erstes Suchkriterium sind error, warning und der Pfeil "==>", anhand derer die entsprechenden Zeilen gefunden werden können.

    Das zweite Kriterium sind die 2 Zahlenangaben, getrennt durch ein Komma, eingeschlossen in runde Klammern.

    Als drittes Kriterium steht der Pfad zum Script, der nicht nur erkannt, sondern ausgelesen werden soll.

    Zusätzlich soll bei der Variante mit nur 1 Zahlenwert ein Komma und "1" hinzugefügt werden, sodass es auch dort 2 Zahlenangaben sind: Z. B. aus (163) wird (163,1). Auch ein "error:" soll hinzugefügt werden, damit der Higlighter die Fehlerzeile als solche einfärbt.

    Erste Problematik ist, dass in Pfadangaben/Dateinamen einige der Suchkriterien vorkomen können, z. B. Zahlenangaben (123,17), der Pfeil "==>", ja man könnte sogar die Dateiendung inklusive Punkt mitten rein schreiben. Auch die einfachen Anführungszeichen, Semikolon, und $, +, -, &, usw. können darin vorkommen, was die Suche möglicherweise erschwert.

    Auf der Positiv-Seite sind die Doppelpunkte zu erwähnen, die definitiv nicht in Dateipfaden/namen vorkommen können und die beiden doppelten Anführungszeichen, die den jeweiligen Pfad umschließen. Also gute Suchkriterien. ;)

    Mein erster Gedanke war, StringDies, StringDas. ... Mein zweiter war RegExp, nach dem Motto, investiere jetzt ein bisschen Einarbeitungszeit, dann hast du nachher eine solide Routine, und kannst dein Wissen auch bei anderen Aufgaben einsetzen. Über 2 Stunden habe ich verschiedene Quellen zu RegExp durchgelesen und ausprobiert, unter anderem das Tutorial von SEuBo. Dann plötzlich hatte ich den vollen Durchblick: Das wird nie was! :D Meine Erinnerungen kamen wieder und mir wurde klar, dass RegExp's definitiv nicht das gleiche sind, wie Suchstrings mit WildCards.

    Leider habe ich keine Funktion gefunden, bei der mit WildCards gesucht werden kann. StringInStr($sLine, '.au3"(*,*) : error: ') funktioniert nicht.

    Nach den vielen Infos und Tutorials habe ich dann mithilfe einer Website zum Testen von RegExp's folgendes geschafft:

    (?i)(\"*\.au3\"\(\d{1,},\d{1,}\) : Warning: )

    oder

    (?i)\.au3\"\(\d+,\d+\) : Warning:

    Beide funktionieren für error und warning. Für den Pfeil "==>" habe ich es nicht geschafft, eine RegExp zu erstellen. Vielleicht kann das ja ein RegExp-erte? :P Außerdem müssten noch 0 oder 1 Leerzeichen vor die Klammer mit dem Zahlenwert hinzugefügt werden.

    Damit könnte man die Fehlerzeilen (wahrscheinlich) zuverlässig erkennen. Danach mit _StringBetween() den Dateipfad auslesen und mit StringLeft-Mid-Right... den Zahlen-Teil ermitteln, noch ein paar Routinen zusammenklöppeln, um den "einsamen" Zahlenwert ein Komma und einen zweiten Zahlenwert zu spendieren, ins Log zurückschreiben und fertig. (Nach meiner Schlappe mit StringRegExp wollte ich StringRegExpReplace nicht mehr ergründen.)

    Wie würdet ihr an die Sache herangehen?

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

    5 Mal editiert, zuletzt von Professor Bernd (29. Oktober 2019 um 04:18)

  • Professor Bernd 29. Oktober 2019 um 04:17

    Hat den Titel des Themas von „Die bekannten Compiler Output-Zeilen ermitteln - Vorschläge und Meingungen?“ zu „Compiler Output-Zeilen ermitteln und bearbeiten - Vorschläge und Meinungen?“ geändert.
  • Ich hab das ganze jetzt mal mit einem regulären ausdruck erledigt:

    Einmal wird gesucht und der Dateiname, die Zeile und Spalte sowie der Typ in ein Array gespeichert und dann wird auch mit nem StringRegExpReplace die Zeile ersetzt, so wie du sie haben möchtest :)

    Ausgabe:

    Code
    "D:\test files\FileQuantityLimit (Testdatei).au3"(112,16) : warning: $iTest possibly not declared/created yet
        FOUND: D:\test files\FileQuantityLimit (Testdatei).au3 -> (112,16) -> warning
        "D:\test files\FileQuantityLimit (Testdatei).au3" (112,16): warning: $iTest possibly not declared/created yet
    "D:\test files\FileQuantityLimit (Testdatei).au3"(131,11) : error: zzzz(): undefined function.
        FOUND: D:\test files\FileQuantityLimit (Testdatei).au3 -> (131,11) -> error
        "D:\test files\FileQuantityLimit (Testdatei).au3" (131,11): error: zzzz(): undefined function.
    "D:\test files\FileQuantityLimit (Testdatei).au3" (163) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
        FOUND: D:\test files\FileQuantityLimit (Testdatei).au3 -> (163) -> ==>
        "D:\test files\FileQuantityLimit (Testdatei).au3" (163,1): ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:

    Wobei die for Schleife mit $j nicht notwendig sein sollte und stattdessen nen ConsoleWrite(@TAB&"FOUND: "&$arResult[0]&" -> "&$arResult[1]&" -> "&$arResult[2]&@crlf) ausreichen sollte :)

    MfG Kanashius

  • Hallo Kanashius.

    Respekt! Schüttlest du sowas einfach aus dem Ärmel? Also für mich sieht das ungefähr so aus: Global $sPattern='????????????????' :/:S

    Bis hierhin danke dafür! Da habe ich erstmal dran zu knappern, danach melde ich mich wieder. (Erst wollte ich schreiben, dass ich mich melde, sobald ich durchblicke, aber wer weiß, ob das jemals ... ?) 8o

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Einige Stunden und 2 Kannen Kaffee später.

    Nun habe ich deinen Code soweit studiert. Es wäre übertrieben zu sagen, ich würde halbwegs durchzusteigen. Um mich einzuarbeiten, habe ich deinen Code umformatiert, auseinadergezogen und mit _ArrayDisplay und Kommentaren ergänzt. Daran kannst du sehen, wie weit ich durchgestiegen bin. (siehe Anhang)

    Mit dem Beispiel funktioniert es und hat auch kleinere Tests überstanden. Da das bis hierhin wirklich gut aussieht, folgt nun die Verfeinerung der Anforderungen. :whistling:

    Ausgangssituation:

    - Im Log-Fenster wurde vom Compiler Output geschrieben.

    - Eine beliebige Zeile wurde markiert, abhängig von verschiedenen Dingen (fehlerfrei oder Fehler/Warnings gefunden, Debug-Zeilen, alles von ConsoleWrite, usw.)

    Schritte: (so wie sie nachher funktionieren sollen)

    - Die Zeilen werden einzeln durchlaufen und durchsucht nach error, warning und "==>" Mustern, wie ganz oben beschrieben.

    - Wird in einer Zeile nichts gefunden, gehts zur nächsten.

    - Werden in einer Zeile Marker für error oder warning oder "==>" gefunden, wird angehalten und diese Zeile als aktive gesetzt.

    - Werden in einer Zeile Marker für "==>" gefunden, wird zudem der Zahlenteil ergänzt, ein Leerzeichen entfernt und "error" hinzugefügt. Vorher/Nachher-Beispiel:

    "D:\test files\FileQuantityLimit (Testdatei).au3" (163) : ==> Array variable has incorrect number of blabla ...

    "D:\test files\FileQuantityLimit (Testdatei).au3"(163,1) : error: ==> Array variable has incorrect number of blabla ...

    Hier das Ganze nochmal als Bild.

    Das heißt, benötigt werden 2 Dinge:

    - eine Erkennung, ob eine Zeile einen der Marker für error, warning oder "==>" enthält,

    - eine Ersetzung für String-Teile, wenn "==>" gefunden wird.

    Wie du im Code vom Anhang sehen kannst, habe ich noch nicht einmal die Ersetzung (einfügen von ",1) : error") hin bekommen. Kannst du deine RegExp's abändern, so dass sie die beiden Punkte erledigen können?

  • Ich würde vorschlagen, dass wir das etwas abändern. Momentan wird beim ersetzen jede Zeile ersetzt, sofern es ein error/warning/==> ist. Stattdessen würde ich es mit nem If machen. Wir haben ja schon die Erkennung, ob es error, warning oder ==> ist und können dort nur bei dem ==> eine Ersetzung vornehmen, dann wird der Ausdruck zum ersetzen deutlich einfacher als jetzt.

    Die Änderung mit dem error würde es nur noch komplexer machen und die Methode ist auch was Performance angeht nicht sehr schnell. Meistens wird man zwar vorher schon rausgeworfen, da die ", der Pfad, die Klammern,... nicht stimmen, aber das muss je nach Ausgabe des Programmes nicht immer der Fall sein. Mit viel Pech könnten wir die Kommandozeilenausgabe ziemlich verlangsamen. Ich "missbrauche" ein forward lookahead um das ",1" ,welches ans Ende angefügt wird zu finden und zu matchen und als Gruppe anzuzeigen. Dabei wird der gesamte String 1x extra durchsucht. Für das error müsste ich was ähnliches machen,...

  • dann wird der Ausdruck zum ersetzen deutlich einfacher als jetzt.

    Finde ich gut! :)

    Ich arbeite gerade an einem Test-Szenario und werde es hochladen. Dann ist es vielleicht klarer, was gemeint ist.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Bei dieser Teil-Aufgabe geht es um das Nachbilden der "F4-Funktion", nenne ich das mal, wie man sie in SciTE kennt. Hat man im Log-Win Fehlermeldungen vom Compiler, kann man auf F4 drücken und die Fehlermeldungen werden durchlaufen. Das Ganze gehört zu meinem PSPad4AutoIt3 Projekt DE .

    Da hast du aber auch echt nen paar sehr grausame Pfade,... verwendet :D

    Ich habe mir schon überlegt, die Pfade aus der Prüfung raus zu lassen. Auch SciTE scheint bei der "F4-Funktion" die Pfade nicht zu überprüfen. Das merkt man an folgedem: Wenn man mehrere Tab/au3's in SciTE geöffnet hat, und z. B. in Tab 1 compiliert, das Log-Win angezeigt wird und man zu einem anderen Tab wechselt, dann wird bei einem Druck auf F4 automatisch auf Tab 1 zurück gewechselt.

    Dafür würden also die anderen Marker reichen. Jetzt werde ich mir zuerst mal dein neues Script ansehen. :)

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Wunderbar! :thumbup:

    Ist das schön, dass manche Sachen funktionieren, auch wenn man nicht genau weiß wie! 8o

    Dein Code aus Posting #8 funktioniert soweit. Es hat im Test-Szenario funktioniert und in der echten Umgebung meiner F4-Funktion. Dort habe ich lediglich eine Stelle angepasst:

    If NOT IsArray($arResult) Then ContinueLoop

    Das habe ich umgekehrt und zu einer abgeschlossenen Abfrage gewandelt:

    If IsArray($arResult) Then

    ; RegExp-Prüfungen und Co.

    EndIf

    Grund dafür ist, dass das Ende des Schleifendurchlaufs ausgeführt werden muss. Wenn die letzte Zeile erreicht ist, wird wieder von vorne angefangen. Das wird dort ermittelt.

    Interessiert dich PSPad? Falls ja, kann ich dir gerne meine F4-Funktion zukommen lassen. Dann kannst du sehen, was ich aus deinen Tipps gemacht habe und ich habe einen Tester. ;)

    Vielen Dank,

    Bernd.

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.

  • Ne, ich programmiere kaum noch mit AutoIT und dafür reicht der SciTE-Editor :)

    Ich programmiere eher in Java oder C++, das ist perfomanter und mit den IDEs auch sehr angenehm.

    Außerdem möchte ich demnächst komplett auf Linux umsteigen und da muss ich meine ganzen Scripts nach bash/c++ umschreiben :D

    Aber ich finde es cool, dass du eine Alternative ermöglichen möchtest :)

  • Und ich finde es cool, dass du dich für Linux begeisterst. Java und C++ sind natürlich echte Programmiersprachen. Auch AutoIt hat seinen Charme, und PSPad hat mich schon seit Jahren begeistert. Nun bin ich in seinem Bann, und es ist erfrischend zu sehen, dass beide zwar nicht so hyper-populär sind, aber lebendig! Hi hi, nach dem Motto "klein aber fein". Was solls, mir machts Spaß! :thumbup:

    Übrigens wünsche ich dir ein langes Leben, denn sollte mal irgendwas mit de RegExp-Code sein, bin ich aufgeschmissen! :D

    Auf jeden Fall vielen Dank für deine Hilfe! Nun ist das PSPad4AutoIt3 Projekt wieder um ein kleines Stück gewachsen. :)

    Wenn jemand sagt: "Das geht nicht!" Denke daran: Das sind seine Grenzen, nicht deine.