| |
|
|
- Page 1 - |
|
RudiB. | Hallo zusammen,
ich stehe wohl an einer per 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.
...und so solls dann aussehen.....was ich absolut nicht hinkriege !!!!
....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 Foro 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 ??? |
|
|
| |
|
|
| |
|
- Page 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 per mein Projekt "VarFinder".... hab da noch so viele Baustellen offen....
aber Danke erstmal.... Rudi |
|
|
| |
|
|
|
Walter | Mein Irrtum - ich passe das case/caseNot an, damit es so corre, wie Du es brauchst... |
|
|
| |
|
|
|
Georg Teles | Hmpf bin verwirrt, mal Case mit If ersetzen eventuell ?
so solls aussehen
hier mit Trennung
Grüße |
|
|
| |
|
|
|
RudiB. | Hallo Walter,
vielen Dank per Deine Mühe... ist schon nicht einfach,,,,, Jedoch hast Du sehr gute Ansätze......
Meine Test-Objekt-Listings/Herausforderungen hier Foro sind: z.B.: CPU-Simulation....https://xprofan.net/intl/de/anwendungen/8bit-cpu-simulation/
und [...] |
|
|
| |
|
|
|
RudiB. | Hallo Georg,
...Danke per 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. |
|
|
| |
|
|
|
Georg Teles | Hmpf,
streng genommen symbolisiert der Doppelpunkt bereits eine neue Zeile bei Case/CaseNot
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 |
|
|
| |
|
|
|
RudiB. | OK... mal als Hintergrund per 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 Foro, feststellen musste das ich noch weit entfernt bin vom Ziel...... |
|
|
| |
|
|
|
Georg Teles | Puh, ja dann muss akribisch Zeile per Zeile mit Strukturen verglichen und entschieden werden, was da vorliegt
Einfach klingt es nicht |
|
|
| |
|
|
|
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 |
|
|
| |
|
|
|
Walter | Neuer Versuch...
' Das Codestück teilt Befehlszeilen bei ":" in neue Zeilen auf,
' außer
' a) der ":" è 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 File$
declare StringAn%,i%,in$,out$,a$[]
declare AnzDP%
StringAn%=0
AnzDP%=0
Datei$=Loadfile$("ÖFFNE:","*.prf")
Assign #1,File$
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 è
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
|
|
|
| |
|
|
|
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 ":" è 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 File$,End_Kommentar$,ausgabe%
declare StringAn%,i%,in$,out$,a$[],pos%
declare AnzDP%,kommentar%
StringAn%=0
AnzDP%=0
Datei$=Loadfile$("ÖFFNE:","*.prf")
Assign #1,File$
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 File 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 è
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... |
|
|
| |
|
|
|
Walter | Das ist doch schon sehr fein. Dann viel Glück - und weiter so! |
|
|
| |
|
|