|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Andt2018
Anmeldungsdatum: 22.12.2017 Beiträge: 7
|
Verfasst am: 05.09.2018, 00:54 Titel: Simpler Interpreter |
|
|
Hier ein kleiner Programierbarer Interpreter fürs scripting auf Basis meiner noch kommenden Gameengine
Features:
-Speicherplatz für 10 Strings
-Leicht zu erweitern
-Feste Syntax (Syntax: "Befehl","Argument1","Argument2")
-Kapslung in einer Sandbox (keine möglichkeit mit fehlerhaften Scripts das Hauptprogramm abstürzen zu lassen)
Code: |
type entry
cmd as string
arg1 as string
arg2 as string
end type
dim as string strings(10)
dim shared as entry commands(10)
dim as integer cmdptr,trueflag
sub set_entry(cmd as string = "",arg1 as string = "",arg2 as string = "",byref e as entry)
e.cmd = cmd
e.arg1 = arg1
e.arg2 = arg2
end sub
sub add_entry(cmd as string, arg1 as string = "" ,arg2 as string = "")
static as uinteger entry_id
with commands(entry_id)
.cmd = cmd
.arg1 = arg1
.arg2 = arg2
end with
entry_id+=1
end sub
open "software.txt" for input access read as #1
for i as integer = lbound(commands) to ubound(commands)
with commands(i)
input #1,.cmd,.arg1,.arg2
end with
next
do
if cmdptr > ubound(commands) then cmdptr = lbound(commands)
with commands(cmdptr)
select case .cmd
case "nextline"
locate csrlin+1,1
case "print"
select case .arg1
case "text"
print .arg2;
case "string"
if val(.arg2) >= lbound(strings) and val(.arg2) <= ubound(strings) then
print strings(val(.arg2))
else
print "Print - Out of bounds"
end if
case else
print "Syntax error - Print @ ";cmdptr
end select
case "Input"
if val(.arg1) >= lbound(strings) and val(.arg1) <= ubound(strings) then
Input "",strings(val(.arg1))
end if
case "Set_String"
if val(.arg1) >= lbound(strings) and val(.arg1) <= ubound(strings) then
strings(val(.arg1)) = .arg2
end if
case "Compare_String"
if val(.arg1) >= lbound(strings) and val(.arg1) <= ubound(strings) and val(.arg2) >= lbound(strings) and val(.arg2) <= ubound(strings) then
if strings(val(.arg1)) = strings(val(.arg2)) then
trueflag = 1
else
trueflag = 0
end if
end if
case "Compare_Trueflag"
if trueflag = 1 then cmdptr = val(.arg1)- 1 else cmdptr = val(.arg2)-1
case "Exit"
exit do
case "jump_to"
cmdptr = val(.arg1)
case ""
if inkey = Chr(27) then exit do
case else
Print "Syntax error @ ";cmdptr
end select
end with
sleep 1
cmdptr+=1 'Nächsten Eintrag
loop
sleep |
Ohne eine Software.txt passiert da nicht nicht viel.. hier ein Beispiel:
Code: | "print","text","HELLO WORLD"
"nextline","",""
"print","text","ENTER PASSWORD->"
"Input","0",""
"Set_String","1","MEDUSA"
"Compare_String","1","0"
"Compare_Trueflag","9","7"
"print","text","BAD PASSWORD"
"jump_to","0",""
"print","text","YOU DID IT!"
"Exit","","" |
|
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1262 Wohnort: Ruhrpott
|
Verfasst am: 05.09.2018, 08:31 Titel: |
|
|
Nicht schlecht für den Anfang. Allerdings würde ich empfehlen, die Befehlsliste dynamisch einzulesen: Code: | ...
ReDim Shared As entry commands(0) 'dynamisches array
...
Dim As Integer i
Open "software.txt" For Input Access Read As #1
i = 0
Do Until Eof(1)
ReDim Preserve commands(i) 'array erweitern
With commands(i)
Input #1,.cmd,.arg1,.arg2 'befehl einlesen
End With
i += 1 'nächster index
Loop
... |
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|