| |
|
|
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.
...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 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 ??? |
|
|
| |
|
|
|
RudiB. | ach......, das wichtigste vergessen....die Aufsplittung der Befehlszeilen mit Backslash soll natürlich, wie im unteren Listing, beibehalten werden. |
|
|
| |
|
|
|
RudiB. | Das ist mein Versuch (LISTING) das Problem zu lösen...
cls
Declare zeile$,x%,pos%,pos2%,new_zeile$,next_zeile$,org_zeile$,End_kommentar$,kom%,array$[]
Declare Zeit&,Datei$
Datei$=Loadfile$("ÖFFNE:","*.prf")
Zeit&=&gettickcount
Assign #1,Datei$
reset #1
Print "Working.....Please Wait"
WhileNot EOF(#1)
input #1,zeile$
Org_Zeile$=Zeile$
'-----------------------------------------------------------------------------------------------------------------------
' Ganzzeilige Kommentare und Blockkommentare in Leerzeilen wandeln
'-----------------------------------------------------------------------------------------------------------------------
If (Left$(Trim$(Zeile$),1)="'") Or (Left$(Trim$(Zeile$),2)="//")
Zeile$=""
Print Org_zeile$
continue
EndIf
If Left$(Zeile$,2)="/*"
Print Org_zeile$
kom%=1
continue
EndIf
If Left$(Zeile$,2)="*/"
Print Org_zeile$
kom%=0
continue
EndIf
If kom%=1
Zeile$=""
Print Org_zeile$
continue
EndIf
'-----------------------------------------------------------------------------------------------------------------------
'-----------------------------------------------------------------------------------------------------------------------
' Doppelpunkte in Strings umwandeln
'-----------------------------------------------------------------------------------------------------------------------
IfNot right$(trim$(Zeile$),1)=chr$(92)
If instr(chr$(58),Zeile$)
pos%=0
Whileloop Len(Zeile$)
If mid$(Zeile$,&loop,1)=chr$(34)
pos%=Not(pos%)
EndIf
If (pos%=1) And (mid$(Zeile$,&loop,1)=Chr$(58))
New_Zeile$=New_Zeile$+chr$(247)
Else
new_Zeile$=new_Zeile$+mid$(Zeile$,&loop,1)
EndIf
EndWhile
If pos%=1
Zeile$=Translate$(Zeile$,chr$(58),chr$(247))
Else
Zeile$=New_Zeile$
new_zeile$=""
Endif
EndIf
Endif
'-----------------------------------------------------------------------------------------------------------------------
' Endkommentare abschneiden
'-----------------------------------------------------------------------------------------------------------------------
If (Instr("'",Trim$(Zeile$),2)) Or (Instr("//",Trim$(Zeile$),2))
pos%=0
End_kommentar$=""
Whileloop Len(Zeile$)
If mid$(Zeile$,&loop,1)=chr$(34)
pos%=Not(pos%)
EndIf
If (mid$(Zeile$,&loop,1)="'") And (pos%=0)
End_kommentar$=Right$(Zeile$,Len(Zeile$)-&loop+1)
Zeile$=Left$(Zeile$,&loop-1)
Break
EndIf
If (mid$(Zeile$,&loop,2)="//") And (pos%=0)
End_kommentar$=Right$(Zeile$,Len(Zeile$)-&loop+1)
Zeile$=Left$(Zeile$,&loop-1)
Break
EndIf
EndWhile
EndIf
'-----------------------------------------------------------------------------------------------------------------------
' Doppelpunkt Befehlszeilen-Trennung
'-----------------------------------------------------------------------------------------------------------------------
IfNot right$(trim$(Zeile$),1)=chr$(92)
If Instr(":",Zeile$)
pos%=0
pos2%=1
new_zeile$=""
While 1
Pos%=Instr(":",Zeile$,pos2%)
If pos%=0
Break
EndIf
If right$(Zeile$,1)=":"'Sprungmarker
break
EndIf
If (Left$(Trim$(lower$(Zeile$)),5)="case ") or (Left$(Trim$(lower$(Zeile$)),8)="casenot ")
Pos2%=Instr(":",Zeile$,pos%+1)
If pos2%=0
Break
EndIf
EndIf
new_Zeile$=Left$(Zeile$,pos%-1)
new_Zeile$=Translate$(new_Zeile$,chr$(247),chr$(58))
Print new_zeile$
new_Zeile$=""
Zeile$=right$(Zeile$,Len(Zeile$)-pos%)
EndWhile
EndIf
Endif
Zeile$=Translate$(Zeile$,chr$(247),chr$(58))
Print zeile$+" "+End_kommentar$
End_kommentar$=""
new_zeile$=" "
EndWhile
Close #1
Print &gettickcount-Zeit&
Print "FERTIG"
Waitinput
|
|
|
| |
|
|
|
Walter | Hier ein erster Ansatz, der einfach feststellt, ob man sich bei einem Doppelpunkt innerhalb eines Strings befindet oder nicht. Bzgl. Case muss erst noch geklärt werden, ob nur der erste Doppelpunkt danach bleiben soll bzw. wie man mit weiteren verfährt.
'## Kommentarzeilen sind hier nicht berücksichtigt
'## case ist hier noch nicht berücksichtigt
cls
Declare Datei$
declare StringAn%,i%,in$,out$,a$[]
StringAn%=0' 0=Außerhalb eines Strings, 1=Innerhalb eines Strings
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 ein Array schreiben
'Alle Zeichen der Zeile durchlaufen
for i%,len(in$)
' Feststellen, ob man sich innerhalb eines Strings befindet
case a$[i%-1]=Chr$(34) and StringAn%=0:StringAn%=1
case a$[i%-1]=Chr$(34) and StringAn%=1:StringAn%=0
if a$[i%-1]=":"
If 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
out$=out$+a$[i%-1]
endif
endfor
print out$
out$=""
EndWhile
Close #1
Print "FERTIG"
waitinput
|
|
|
| |
|
|
|
RudiB. | Hallo Walter,
...schön das doch noch jemand auf dieses Thema antwortet.
Dein Ansatz ist ja richtig, doch der Teufel steckt ja im Detail... Wenn ich z.B.: Eine Programmzeile die einen String beinhaltet, aber dann mit einem Backslash auf mehrere Zeilen aufgeteilt wird. siehe hier....
hier haperst dann gewaltig...
Ich weiß schon eine Lösung für mein Problem im allgemeinen, jedoch würde ich gerne auch eine Lösung dafür finden, wenn ich eine Datei Zeilenweise einlese .... Es gibt auch hierfür eine Lösung .... hier müsste dann aber jede Zeile durch mehrere Abfragen laufen, was natürlich sehr viel Zeit kostet.....
Ich hab eben gehofft, jemand hat eine zündende Idee, auf die ich nicht komme...
Gruß aus München Rudi |
|
|
| |
|
|
|
Walter | Mein Programmstück kommt mit Deinem Code
aber bestens zurecht... |
|
|
| |
|
|
|
Walter | Sorry - schon gesehen. Schau ich mir weiter an... |
|
|
| |
|
|
|
RudiB. | DANKE... |
|
|
| |
|
|
|
Walter | Bähhh - war nur ein kleiner Fehler drin... Jetzt geht das!
'## Kommentarzeilen nicht berücksichtigt
'## case nicht berücksichtigt
cls
Declare Datei$
declare StringAn%,i%,in$,out$,a$[]
StringAn%=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]=":"
If 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
out$=out$+a$[i%-1]
endif
endfor
print out$
out$=""
EndWhile
Close #1
Print "FERTIG"
waitinput
|
|
|
| |
|
|
|
RudiB. | Ich arbeite ja auch dran.... aber scheinbar seh ich den Wald vor lauter Bäumen nicht.... oft ist es so einfach...hab ich schon so oft hier im Forum erlebt... |
|
|
| |
|
|
|
RudiB. | wow....kurz probiert mit dem Test-Listing, wie hast Du jetzt das gemacht???? ..muss Deinen Code mal anschauen... |
|
|
| |
|
|
|
Walter | Hier nun samt case / caseNot: Dabei hab ich mich daran gehalten, dass normalerweise alle auf case folgenden Befehle in derselben Zeile bei true abgearbeitet werden, während bei false sofort in die nächste Zeile gesprungen wird. (Aus der Hilfe: Case N : BEF Hat der Ausdruck N einen Wert <> 0, wird BEF ausgeführt, ansonsten geht die Programmausführung in die nächste Zeile...)
' Das Codestück teilt Befehlszeilen bei ":" in neue Zeilen auf,
' außer
' a) der ":" befindet sich innerhalb eines Stringliterals; oder
' b) bei case/caseNot. Hier bleiben alle ":" in derselben Zeile _nach_ einem
' case/caseNot erhalten (allerdings bisher noch ohne Berücksichtigung von
' Umbrüchen langer Codezeilen)
' Kommentarzeilen sind nicht berücksichtigt;
' die müssen ggf vorher ausgeschieden werden
cls
Declare Datei$
declare StringAn%,i%,in$,out$,a$[]
declare caseAn%,pos%
StringAn%=0
CaseAn%=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
' Falls case oder caseNot drin: Position feststellen
pos%=instr("case ",lower$(in$))
case pos%=0:pos%=instr("casenot ",lower$(in$))
if pos%=0' KEIN case drin
'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]=":"
If 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
out$=out$+a$[i%-1]' anderes Zeichen als :
endif
endfor
else' case bzw caseNot drin
'Alle Zeichen der Zeile bis zu case durchlaufen
for i%,pos%-1
' 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]=":"
If 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
out$=out$+a$[i%-1]' ein anderes Zeichen als :
endif
endfor
endif
if pos%>0
' Rest der case-Zeile in eine neue Zeile schreiben
print mid$(in$,pos%,len(in$)-pos%+1)
else
print out$
out$=""
endif
EndWhile
Close #1
Print "FERTIG"
waitinput
Gerne nachfragen, sofern die Kommentare nicht ausreichen. Fehler sind natürlich möglich... |
|
|
| |
|
|