Dort hatten wir recursive Parser programmiert. Das erste Einstiegsbeispiel war ein Number-Parser, der einfach einen String aus Ziffern in einen Integer wandelt. Analog zum Val() Befehl. Leider find ich keine Unterlagen und keinen einzigen Beispielcode mehr dazu. Ich probier das nun schon über längere Zeit immer wieder. Es klappt aber einfach nicht. Entweder es kommt nix raus, oder es stürtzt gleich ab.
Die Umwandlung blanker Ziffern in einen Int so zu machen ist natürlich quatsch, aber es geht mir rein um die recursive Technik, sonst nichts.
Wenn ich das wieder verstanden hab, kann man mit der selben Technik komplette Formelparser bauen.
Ich habe im Endziel vor, mit dieser Technik, 3D Step und IGES Files zu parsen. STEP ist recht kompliziert mit seinen verschachtelten vorwärts und rückwärts Verweisen. Mit recursive parsing, muss man sich nur strikt an die Regeln halten und zum Schluß kommt ein korrektes Ergebnis raus, obwohl man nicht unbedingt versteht warum. Auch wenn man es selbst programmiert hat.
hier mal mein Code, der aber leider nicht geht!
Was ich einfach nicht blicke ist, wie ich dieses aufaddieren machen muss.
Ich versteh noch, dass erst eine Art Baum bis zum letzten Zeichen aufgebaut wird. Dann kollabiert die ganze Struktur rückwärts
und der Rückgabewert der ParseDec() Funktion muss aufaddiert werden und in jedem Zyklus muss die 10er-Stelle um 1 gerückt werden.
Dazu das N als Static was in 1,10,100,1000... läuft.
Ich hoffe es weis von euch jemand wie das geht!
Code: Alles auswählen
Procedure.i ParseDec(*Str.Character)
; recursive parsing a String to convert it into an Integer
; das geht leider noch nicht!
Static N
Protected ret
Select *Str\c
Case '0' To '9' ; digigtal numbers
ret = ParseDec(*Str + SizeOf(Character)) * N
Debug ret
N * 10
ProcedureReturn ret
Default ; End of decimals reached
N = 1 ; start with N=1
ProcedureReturn 0
EndSelect
EndProcedure
Procedure ParseDec_Classic(*Str.Character)
; classic Version -> das funktioniert!
Protected val, neg
While *Str\c = 32 Or *Str\c = 9
; remove Spaces and Tabs
*Str + SizeOf(Character)
Wend
; check Sign
If *Str\c = '-'
neg = #True
*Str + SizeOf(Character)
ElseIf *Str\c = '+'
*Str + SizeOf(Character)
EndIf
While *Str\c
Select *Str\c
Case '0' To '9'
val = val * 10 + (*Str\c - 48)
Default ; EndOfDecimals reached
Break
EndSelect
*Str + SizeOf(Character) ; Pointer to NextChar
Wend
If neg
ProcedureReturn -val
Else
ProcedureReturn val
EndIf
EndProcedure
Define res
Define StrVal.s
StrVal = "12345678"
Debug "recursive Version"
res = ParseDec(@StrVal)
Debug "Ergebnis = " + Str(res)
Debug #Null$
Debug "Classic Version"
res = ParseDec_Classic(@StrVal)
Debug "Ergebnis = " + Str(res)