| 
				
					|  | 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: 1283
 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.
 
 |  |