Scriptsprache, eigene Funktionen implementieren

Übersicht BlitzBasic Beginners-Corner

Neue Antwort erstellen

 

dont_know_to_use

Betreff: Scriptsprache, eigene Funktionen implementieren

BeitragMo, Jul 25, 2011 11:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi
Ich schreibe gerade eine eigene Scriptsprache, welche über einen Interpreter eingelesen wird und jede Zeile mittels Instr nach einem Befehl überprüft wird. Nun habe ich ein Problem: Ich möchte eigene Funktionen in meiner Scriptsprache haben, ungefähr so, wie die Funktionen in BlitzMax und BlitzBasic, welche so gebildet werden:
BlitzBasic: [AUSKLAPPEN]
Function BlaBlub()
;Code
End Function

Anders als bei BlitzBasic ist es für meine Funktionen wichtig, dass keine Parameter erlaubt sind, also etwas wie Function BlaBlub(parameter1) darf es nicht geben. Es müsste also so aussehen:
Code: [AUSKLAPPEN]
Aufruf function1
;...
Function1:
  ;Funktionscode
End Function

Und der Code im Interpreter so(Pseudocode):
BlitzBasic: [AUSKLAPPEN]
If Instr(Zeile,"Aufruf") Then
;Alle Zeilen überspringen bis Function1 gefunden wurde
EndIf
If Gefunden Then
;Code der Funktion wie jeden anderen Code interpretieren
EndIf
If Instr(Zeile,"End Function") Then
;Zur Zeile springen, nach der Zeile in der der Aufruf der Function1 stattgefunden hat
EndIf

Aber wie genau mache ich es jetzt? Wie überspringe ich all die Zeilen bis eine Funktion gefunden wurde? Wie kann ich zu der Zeile springen, in der der Aufruf stattgefunden hat?

ZEVS

BeitragMo, Jul 25, 2011 12:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Springen mit den Zeilen ist keine gute Idee. Am besten, du parst das Script erstmal mit Funktionen, die du dann z.B. in einem Type speicherst:
BlitzBasic: [AUSKLAPPEN]

;Erster loop, nur für Funktionen
;...
If Instr(Zeile, "Funktion") Then
f.func = New func
f\name = [...]
;loop über die weiteren Zeilen
;...
If Instr(Zeile, "End Function") Then Exit
f\code = f\code+Zeile
;loop Ende
; loop Ende

;Zweiter Loop (ausführen)
;...
If Instr(Zeile,"Aufruf") Then
;name ermitteln
For f.func = Each func
If f\name = name Then
execFunc func
EndIf
Next
EndIf
;loop ende


Ich hoffe, du verstehst, was ich meine.

Midimaster

BeitragMo, Jul 25, 2011 12:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Du liest den gesamten Text auf einmal in ein Text-Array ein. Jede Zeile wird eine Element.

Danach kannst Du Dich nach Belieben im Array rauf und runter bewegen.

Code ist nur symbolisch gemeint:

BlitzBasic: [AUSKLAPPEN]
For i=0 To 999
Zeile(i)= ReadLine(....
Next


Den Sprung in die Unter-Routinen könnte man rekursiv machen:

Code ist nur symbolisch gemeint:

BlitzBasic: [AUSKLAPPEN]
Function Action(ZeilenNummer%)

Repeat
ZeilenNummer = ZeilenNummer +1
AktZeile$=Zeile(ZeilenNummer)

If Instr(AktZeile,"Aufruf") Then
; suche nach der Zeile
For i=0 To 999
If Instr(Zeile(I),"Function"
......
NeueNummer=i+1
......
Next
Action NeueNummer

Else If Instr(AktZeile,"End Function")
Return
Else
tu was du tun muss mit der akt.-Zeile
EndIf
Until AktZeile= "End"
End Function

 

dont_know_to_use

BeitragMo, Jul 25, 2011 12:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke Smile

Ich setze mich ran und schaue, wie ich dies am besten in meinen Interpreter einbauen kann. Wenn es Probleme gibt, melde ich mich wieder. Wink

Neue Antwort erstellen


Übersicht BlitzBasic Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group