Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

fb:porticula NoPaste

Info
Info / Hilfe
Liste
Übersicht / Liste
Neu
Datei hochladen
Suche
Quellcode suchen
Download
Dateidownload

Einfaches Parser-Beispiel

Uploader:RedakteurMOD
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