fb:porticula NoPaste
Einfaches Parser-Beispiel
Uploader: | MOD |
Datum/Zeit: | 07.11.2010 16:00:01 |
'Ein Beispielcode, wie ein Parser für einen Interpreter aussehen könnte
'Das ist keine Ideallösung und behandelt auch nicht alle Fälle
'Es dient als Anschauungsmaterial wie man so etwas lösen könnte
'Keine Haftung wenn der PC explodiert oder sonstiges ;)
'Definition von TRUE und FALSE
#Ifndef FALSE
#Define FALSE 0
#Define TRUE (Not FALSE)
#EndIf
'Benötigte Funktionen - Beschreibung siehe bei der Funktion selbst
Declare Function aufknuepfen (text As String) As String
Declare Function gibText (text As String) As String
'Beispielcodezeile
Dim As String text = "dim as integer x = 5"
'Zeile vorbereiten
text = aufknuepfen(text)
'Ersten Textbaustein aufnehmen
Dim As String aktuellerText
aktuellerText = gibText(text)
'Diese Schleife könnte die einzelnen Textbausteine gleich an eine
'Funktion weitergeben, die diese verarbeitet
While aktuellerText <> ""
Print aktuellerText
'Nächsten Textbaustein holen
aktuellerText = gibText(text)
Wend
'Vor dem Beenden auf Tastendruck warten, damit man auch was sieht
Sleep
'Diese Funktion bereitet den Eingabetext auf, indem es die einzelnen Textbausteine raussucht
'und eindeutig mit Leerzeichen kennzeichnet
Function aufknuepfen (text As String) As String
Dim As String ausgabe
'Diese Schleife läuft die Zeichen nacheinander durch
For i As Integer = 0 To Len(text) - 1
'Überprüfen um was für ein Zeichen es sich handelt
Select Case text[i]
Case 48 To 57, 65 To 90, 97 To 122 'Zahlen und Buchstaben
'werden direkt angehängt
ausgabe &= Chr(text[i])
Case 43, 45, 61 '+ - =
'werden vom Rest getrennt
If Not Right(ausgabe, 1) = Chr(32) Then
ausgabe &= Chr(32) & Chr(text[i]) & Chr(32)
Else
ausgabe &= Chr(text[i]) & Chr(32)
EndIf
Case Else
'alles andere wird hier der Einfacherheit halber nicht besonders behandelt
If Not Right(ausgabe, 1) = Chr(32) Then
ausgabe &= Chr(32)
EndIf
End Select
Next
'Am Ende noch ein Leerzeichen anhängen, so spart man sich das Suchen nach dem letzten Zeichen
If Not Right(ausgabe, 1) = Chr(32) Then
ausgabe &= Chr(32)
EndIf
Return ausgabe
End Function
'Diese Funktion nimmt den aufbereiteten Text, gibt den nächsten Textbaustein zurück
'und kürzt den aufbereiteten Text, damit der entnommene Textbaustein nicht mehr enthalten ist
Function gibText (text As String) As String
Dim As String ret
'Sucht den Text nach dem Trennzeichen (Leerzeichen) ab, kürzt den Text und gibt den Baustein zurück
For i As Integer = 0 To Len(text) - 1
Select Case text[i]
Case 32 'Leerzeichen
If Not (i = 0) Then
text = Right(text, Len(text) - i)
Return ret
EndIf
Case Else
ret &= Chr(text[i])
End Select
Next
End Function