Deutsch
Quelltexte/ Codesnippets

Befehlszeilentrennung

 
- Seite 1 -



RudiB.
Hallo zusammen,

ich stehe wohl an einer für mich schier unlösbaren Aufgabe.
Ich möchte ein Programm-Listing mit Befehlszeilentrennung durch Doppelpunkte, aufsplitten in separate Programmzeilen.
Als Sonderfall soll jedoch eine Zeile mit "Case" oder "CaseNot" beibehalten werden.

Hier mal ein absolut Sinnfreies Listing und danach das Listing bereinigt.
CLS
Declare a$,b$:Declare c$,d$
Declare e$:Print "Hallo \
zusammen !":Declare INT GROBI: GROBI=500
a$=" der Hund geht zum \
hell brennenden Feuer um sich \
zu wärmen: ABER!!\
die Katze steht ihm im weg"
b$="nicht LEER"
c$="Test"
d$="fertig"
Print:Print:Case b$="":Print" B ist LEER":Print GROBI
Print c$,d$,GROBI
waitinput

...und so solls dann aussehen.....was ich absolut nicht hinkriege !!!!
CLS
Declare a$,b$
Declare c$,d$
Declare e$
Print "Hallo \
zusammen !"
Declare INT GROBI
GROBI=500
a$=" der Hund geht zum \
hell brennenden Feuer um sich \
zu wärmen: ABER!!\
die Katze steht ihm im weg"
b$="nicht LEER"
c$="Test"
d$="fertig"
Print
Print
Case b$="":Print" B ist LEER"
Print GROBI
Print c$,d$,GROBI
waitinput

....z.B: alleine schon der String in VAR a$ mit einem Doppelpunkt darin stellt eine Herausforderung dar...weil hier auch noch die eigentliche Befehlszeile mit einem Backslash aufgesplittet wird...

auch hier im Forum wird das erste Listing mit den Strings farblich nicht korrekt dargestellt....

Stehe gerade voll auf dem Schlauch...
Kann mir hier jemand auf die Sprünge helfen ???
 
XProfan X4
Xprofan X4
Rudolf Beske / München

Hardware: NB Intel I9 - 16GByte RAM
15.10.2022  
 



 
- Seite 2 -



RudiB.
ja Walter eigentlich so.....ist ja schon cool
jedoch möchte ich eine komplette Befehlszeilen-Auftrennung (ausser Case/Casenot) ....
sprich, auch nach einem Case/Casenot sollten Befehle getrennt werden....
Ich weiss ja das ist Tricky..schwierig...sch..schwer.

Aber ich denke hier kann ich anknüpfen....
Ich brauche das für mein Projekt "VarFinder"....
hab da noch so viele Baustellen offen....

aber Danke erstmal....
Rudi
 
XProfan X4
Xprofan X4
Rudolf Beske / München

Hardware: NB Intel I9 - 16GByte RAM
19.10.2022  
 




Walter
Mein Irrtum - ich passe das case/caseNot an, damit es so läuft, wie Du es brauchst...
 
19.10.2022  
 




Georg
Teles
Hmpf bin verwirrt, mal Case mit If ersetzen eventuell ?

so solls aussehen
CLS
Declare a$,b$
Declare c$,d$
Declare e$
Print "Hallo \
zusammen !"
Declare INT GROBI
GROBI=500
a$=" der Hund geht zum \
hell brennenden Feuer um sich \
zu wärmen: ABER!!\
die Katze steht ihm im weg"
b$="nicht LEER"
c$="Test"
d$="fertig"
Print
Print

If b$=""

    Print" B ist LEER"

EndIf

Print GROBI
Print c$,d$,GROBI
waitinput

hier mit Trennung
CLS
Declare a$,b$:Declare c$,d$
Declare e$:Print "Hallo \
zusammen !":Declare INT GROBI: GROBI=500
a$=" der Hund geht zum \
hell brennenden Feuer um sich \
zu wärmen: ABER!!\
die Katze steht ihm im weg"
b$="nicht LEER"
c$="Test"
d$="fertig"
Print:Print:If b$="":Print" B ist LEER":EndIf:Print GROBI
Print c$,d$,GROBI
waitinput

Grüße
 
XProfan X2
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

19.10.2022  
 




RudiB.
Hallo Walter,

vielen Dank für Deine Mühe... ist schon nicht einfach,,,,,
Jedoch hast Du sehr gute Ansätze......

Meine Test-Objekt-Listings/Herausforderungen hier Forum sind:
z.B.:
CPU-Simulation....https://xprofan.net/intl/de/anwendungen/8bit-cpu-simulation/

und  [...] 
 
XProfan X4
Xprofan X4
Rudolf Beske / München

Hardware: NB Intel I9 - 16GByte RAM
19.10.2022  
 




RudiB.
Hallo Georg,

...Danke für Deinen Kommentar....

Ich weiß nicht so wirklich, ob ich mich hier konkret genug ausgedrückt habe.
Ich arbeite immer noch an meinem Projekt "VarFinder".
Da ist es eben wichtig, Programmzeilen zu analysieren..... sprich das Programm muss Befehlszeilen auftrennen können.
Gerade in Bezug auf If und Endif einer Zeile, auch dieses soll aufgetrennt werden können.
In diesem Beispiel gehts mal nur darum um eine Programmformatierung vernünftig durchzuführen.
Und so gehts weiter ......Probleme...Probleme...usw.
 
XProfan X4
Xprofan X4
Rudolf Beske / München

Hardware: NB Intel I9 - 16GByte RAM
19.10.2022  
 




Georg
Teles
Hmpf,

streng genommen symbolisiert der Doppelpunkt bereits eine neue Zeile bei Case/CaseNot
cls
var d%=2
case d%=1
print "asd"
case d%=2
print "dffff"
waitinput

Bedeutet, dass du mittels Parsen den Doppelpunkt vorher entfernst und eine neue Zeile daraus machst oder je nachdem, ob du den Doppelpunkt als neue Zeile interpretierst, mal so als Idee

Grüße
 
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

19.10.2022  
 




RudiB.
OK... mal als Hintergrund für meine Intension.
Mein Programm "VarFinder" soll alle Variablen in einem Programm finden können, sprich in welcher Zeile "Deklariert" in welchen Zeilen kommt sie noch vor, ist sie Global deklariert oder kommt sie auch noch in einer "Proc" vor usw.
Gibt es Schleifen, Abfragen " If Endif"" etc.
Hierzu muss ich nun mal jede Programmzeile auseinanderfieseln/zerlegen...
Ist nicht gerade einfach...
Ich dachte schon ich wäre fast am Ziel, jedoch wurde auf den Boden der Realität geholt,als ich im Praxistest mit Programmen aus diesem Forum, feststellen musste das ich noch weit entfernt bin vom Ziel......
 
XProfan X4
Xprofan X4
Rudolf Beske / München

Hardware: NB Intel I9 - 16GByte RAM
19.10.2022  
 




Georg
Teles
Puh, ja dann muss akribisch Zeile für Zeile mit Strukturen verglichen und entschieden werden, was da vorliegt

Einfach klingt es nicht
 
XProfan X2
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

19.10.2022  
 




RudiB.
Nein einfach bestimmt nicht ...jedoch denke ich, das ich auf einem guten Weg bin.
Es gibt mit Sicherheit noch viele Fehler im Programm.....bin aber ständig dabei diese auszumerzen...eben auf diesem Wege und immer in der Hoffnung das es jemanden gibt, der eine neue "PROFANE" Idee reinwirft
 
XProfan X4
Xprofan X4
Rudolf Beske / München

Hardware: NB Intel I9 - 16GByte RAM
19.10.2022  
 




Walter
Neuer Versuch...
' Das Codestück teilt Befehlszeilen bei ":" in neue Zeilen auf,
' außer
'   a) der ":" befindet sich innerhalb eines Stringliterals; oder
'   b) nach case/caseNot.
'      Hier bleibt der erste ":" mit dem folgenden Befehl in derselben
'      Zeile erhalten.
' Kommentarzeilen sind nicht berücksichtigt;
' die müssen ggf vorher ausgeschieden werden
cls
Declare Datei$
declare StringAn%,i%,in$,out$,a$[]
declare AnzDP%
StringAn%=0
AnzDP%=0
Datei$=Loadfile$("ÖFFNE:","*.prf")
Assign #1,Datei$
reset #1
Print "Working.....Please Wait"

WhileNot EOF(#1)

    input #1,in$
    a$[]=explode(in$)' Zeichen der Zeile in Array schreiben
    'Alle Zeichen der Zeile durchlaufen
    for i%,len(in$)
    ' Feststellen, ob man sich innerhalb eines Strings befindet

    if (a$[i%-1]=Chr$(34)) and (StringAn%=0)

        StringAn%=1

    elseif (a$[i%-1]=Chr$(34)) and (StringAn%=1)

        StringAn%=0

    endif

    if a$[i%-1]=":"

        ' case UND erster : ?

        if (left$(trim$(lower$(out$)),5)="case ") or (left$(trim$(lower$(out$)),8)="casenot ")

            if AnzDP%=0' erster Doppelpunkt - Zeile fortsetzen

                out$=out$+a$[i%-1]
                inc AnzDP%

            else'Zeile teilen

                print out$
                out$=""
                AnzDP%=0

            endif

        elseIf StringAn%=0' : ist nicht innerhalb eines Strings - Zeile teilen

            print out$
            out$=""

        else

            out$=out$+a$[i%-1]' : ist innerhalb eines Strings - Zeile fortsetzen

        endif

    else' anderes Zeichen als :

        out$=out$+a$[i%-1]

    endif

    endfor
    print out$
    out$=""

EndWhile

Close #1
Print "FERTIG"
waitinput
 
20.10.2022  
 




RudiB.
Das sieht Super aus !!!

Habe das ganze noch erweitert, so das ganzzeilige Kommentare übersprungen werden und Endkommentare zunächst abgetrennt werden und am Schluss wiederhergestellt werden.
Ausserdem als Besonderheit noch Sprungmarker, die auf einen Doppelpunkt enden....
' Das Codestück teilt Befehlszeilen bei ":" in neue Zeilen auf,
' außer
'   a) der ":" befindet sich innerhalb eines Stringliterals; oder
'   b) nach case/caseNot.
'      Hier bleibt der erste ":" mit dem folgenden Befehl in derselben
'      Zeile erhalten.
' Kommentarzeilen sind nicht berücksichtigt;
' die müssen ggf vorher ausgeschieden werden
cls
Declare Datei$,End_Kommentar$,ausgabe%
declare StringAn%,i%,in$,out$,a$[],pos%
declare AnzDP%,kommentar%
StringAn%=0
AnzDP%=0
Datei$=Loadfile$("ÖFFNE:","*.prf")
Assign #1,Datei$
reset #1
Assign #2,"Test_Datei.prf"
rewrite #2

While 1

    If (ausgabe%<1) Or (ausgabe%>2)

        Print "Bitte gültigen Wert wählen ( 1 oder 2 )"
        ausgabe%=Input$("1- auf Bildschirm ausgeben / 2- in Datei screiben","Bitte Auswahl treffen",ausgabe%)

    Else

        break

    EndIf

Endwhile

Print "Working.....Please Wait"

WhileNot EOF(#1)

    '-----------------------------------------------------------------------------------------------------------------------
    '          *ganzzeilige Kommentare überspringen
    '-----------------------------------------------------------------------------------------------------------------------
    input #1,in$

    If left$(trim$(in$),2)="/*"

        If ausgabe%=1

            Print in$

        Else

            print #2,in$

        Endif

        kommentar%=1
        continue

    Endif

    If left$(trim$(in$),2)="*/"

        If ausgabe%=1

            Print in$

        Else

            print #2,in$

        Endif

        kommentar%=0
        Continue

    Endif

    If (left$(trim$(in$),1)="'") Or (left$(trim$(in$),2)="//") Or (kommentar%=1)

        If ausgabe%=1

            Print in$

        Else

            Print #2, in$

        Endif

        continue

    EndIf

    '-----------------------------------------------------------------------------------------------------------------------
    '          Endkommentare abschneiden
    '-----------------------------------------------------------------------------------------------------------------------

    If (Instr("'",Trim$(in$),2)) Or (Instr("//",Trim$(in$),2))

        pos%=0
        End_kommentar$=""

        Whileloop Len(in$)

            If mid$(in$,&loop,1)=chr$(34)

                pos%=Not(pos%)

            EndIf

            If (mid$(in$,&loop,1)="'") And (pos%=0)

                End_kommentar$=Right$(in$,Len(in$)-&loop+1)
                in$=Left$(in$,&loop-1)
                Break

            EndIf

            If (mid$(in$,&loop,2)="//") And (pos%=0)

                End_kommentar$=Right$(in$,Len(in$)-&loop+1)
                in$=Left$(in$,&loop-1)
                Break

            EndIf

        EndWhile

    EndIf

    '--------------------------------------------------------------------------------------------------------------------------

    If right$(Trim$(in$),1)=":"' wenn letztes Zeichen Doppelpunkt / Sprungmarker

        If ausgabe%=1

            Print in$

        Else

            Print #2, in$

        Endif

        Continue

    Endif

    a$[]=explode(in$)' Zeichen der Zeile in Array schreiben
    'Alle Zeichen der Zeile durchlaufen
    for i%,len(in$)
    ' Feststellen, ob man sich innerhalb eines Strings befindet

    if (a$[i%-1]=Chr$(34)) and (StringAn%=0)

        StringAn%=1

    elseif (a$[i%-1]=Chr$(34)) and (StringAn%=1)

        StringAn%=0

    endif

    if a$[i%-1]=":"

        ' case UND erster : ?

        if (left$(trim$(lower$(out$)),5)="case ") or (left$(trim$(lower$(out$)),8)="casenot ")

            if AnzDP%=0' erster Doppelpunkt - Zeile fortsetzen

                out$=out$+a$[i%-1]
                inc AnzDP%

            else'Zeile teilen

                If ausgabe%=1

                    print out$

                Else

                    print #2,out$

                Endif

                out$=""
                AnzDP%=0

            endif

        elseIf StringAn%=0' : ist nicht innerhalb eines Strings - Zeile teilen

            If ausgabe%=1

                print out$

            Else

                print #2,out$

            Endif

            out$=""

        else

            out$=out$+a$[i%-1]' : ist innerhalb eines Strings - Zeile fortsetzen

        endif

    else' anderes Zeichen als :

        out$=out$+a$[i%-1]

    endif

    endfor

    If ausgabe%=1

        print out$+End_Kommentar$

    Else

        print #2,out$+End_Kommentar$

    Endif

    End_Kommentar$=""
    out$=""

EndWhile

Close #1
close #2
Print "FERTIG"
waitinput

Habe es dann mit dem Quellcode "CPU-Simulation" laufen lassen.
es scheint Fehlerfrei durchzulaufen...
 
XProfan X4
Xprofan X4
Rudolf Beske / München

Hardware: NB Intel I9 - 16GByte RAM
20.10.2022  
 




Walter
Das ist doch schon sehr fein.
Dann viel Glück - und weiter so!
 
20.10.2022  
 




Zum Quelltext


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

330 Betrachtungen

Unbenanntvor 0 min.
Michael W. vor 14 Tagen
Paul Glatz vor 31 Tagen
Wilfried Friebe29.10.2022
ByteAttack28.10.2022
Mehr...

Themeninformationen

Dieses Thema hat 3 Teilnehmer:

RudiB. (13x)
Walter (8x)
Georg Teles (3x)


Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie