fb:porticula NoPaste
für mod
Uploader: | MB Interactive Labs |
Datum/Zeit: | 07.11.2010 19:53:42 |
'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
'Mainschleife
'Beispielcodezeile
If command$(1) = "" then Print "format is:"
Open command$(1) For Input As #1
Dim As String text
'Zeile vorbereiten
'erst eine datei laden. command übergibt die datei an mein paser
Do
'input #1, text
'print text
'loop until eof(1)
Input #1, text
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 <> ""
'hier werden die befehle ausgeführt.
Print aktuellerText 'zur zeit nur anzeigen
'Ausfüren der befehle
Select Case aktuellerText
Case "QCMM"
Print "Komentar"
Case "QCLS"
Print "Cls"
Case "QSCR"
Dim As String para1,para2,para3
'Nächsten Textbaustein holen
para1 = gibText(text)
Print para1 + " Wert1"
para2 = gibText(text)
Print para2 + " Wert2"
para3 = gibText(text)
Print para3 + " Wert3"
ScreenRes Val(para1),Val(para2),Val(para3)
Case "QCOL"
Print "Farbe setzen"
Case "QLIN"
Print "Linie zeichnen"
End Select
'Nächsten Textbaustein holen
aktuellerText = gibText(text)
Wend
Loop Until Eof(1)
'Vor dem Beenden auf Tastendruck warten, damit man auch was sieht
Sleep
Close #1
'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 einfacherheitshalber 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 aufereiteten Text, damit der entnommen Textbaustein nicht mehr enthalten ist
Function gibText (text As String) As String
Dim As String ret
'Sucht den Text nach dem Trennzeiche (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