Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Simpler Interpreter

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Andt2018



Anmeldungsdatum: 22.12.2017
Beiträge: 7

BeitragVerfasst am: 05.09.2018, 00:54    Titel: Simpler Interpreter Antworten mit Zitat

Hier ein kleiner Programierbarer Interpreter fürs scripting auf Basis meiner noch kommenden Gameengine lächeln
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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 1262
Wohnort: Ruhrpott

BeitragVerfasst am: 05.09.2018, 08:31    Titel: Antworten mit Zitat

Nicht schlecht für den Anfang. lächeln 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
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Projektvorstellungen Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz