Interpreter

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Interpreter

Beitrag von AndyX »

Hallo,
ich hab mal wieder :D ein Problem. Also, ich will nen kleinen Interpreter mal coden, und: Ich hab ja schon Ideen wie ich den Code zerlege, also die Befehle und parameter rausfinden und so (hab schon in den Thread "Parsen" reingschaut. :)), nur wie bringe ich das dann zum laufen??? Ich will ja nix großes machen, nur so n paar funktionen, z.b. variablen, inne Console schreiben, sonst eh nix. So ungefähr wie brainfuck, nur viel kleiner. Also wie geht das, und brauch ich da ASM, wenn ja, wie mach ich das dann???
wie gesagt, nurmal einpaar funktionen(höchstens 6, naja vielleicht 7 oder 8 <))

Danke im Voraus.

Mfg,
AndyX
Benutzeravatar
brotkasten-deluxe
Beiträge: 147
Registriert: 29.08.2004 01:43
Wohnort: Germany
Kontaktdaten:

Beitrag von brotkasten-deluxe »

vielleicht sollteste ma die Vars in eine Struktur packen und dann in eine linkedlist schmeissen damit du diese schon ma aussortiert hast.dann könntest du noch evtl. die Proceduren bestimmen : ich meine wenn du nur 8 haben willst kannste diese ja gleich ausm PB übernehmen . Hmm wie gesagt da musste mir auch vielleicht ma mehr infos zu deinem prog geben damit ich dir genauer unter die arme greifen kann ;)


PS: Interpreter/Parser/Compiler scheinen ein neuer Trend in der PB-Community geworden zu sein , was ich zB sehr Willkommen heisse :allright:
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

Ich hab da mal nen kleine Batch-Interpreter geschrieben, mit ca. 25 Befehlen. Der Code müßte an die aktuelle PB Version angepaßt werden. Stammt noch von 2003. Wenn Du Interesse hast Dir das anzugucken, schick ich dir den gesamten Code per E-Mail als Zip-Anhang. Kannste dann mit machen was Du willst. Posten geht leider nicht, sind ca. 10 Dateien.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

kannst dir ja mein Easy Interpreter ansehen :lol:
Bild
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

brotkasten-deluxe hat geschrieben:Hmm wie gesagt da musste mir auch vielleicht ma mehr infos zu deinem prog geben damit ich dir genauer unter die arme greifen kann :wink:
Naja, so n kleiner Interpreter, der in so nem window laufen wird, eine geöffnete datei wird ausgelesen und der code darin schritt für schritt ausgeführt. Zuerst zerkleinert, dann interpretiert oder so irgendwie.
Meine Vorstellungen der Befehle: (Schleifen brauch ich daweil noch nicht)

Code: Alles auswählen

MakeVarNum #ID        Um Variable Long zu erstellen
MakeVarString #ID        Um Variable String zu erstellen
SelectVar #ID        Variable auswählen
SetVar #Inhalt        In Variable schreiben
Out #String             In Console schreiben (Console wird automatisch geöffnet)
In #ID                 Etwas eingeben lassen und in Variable speichern
Clean                 Console cleanen
Wait #Millsekunden         Zeit warten
Vielleicht noch etwas zum umwandeln von Long nach String und umgekehrt (OK, werden dann schon bald 10, 15 Funktionen :oops:)
ts-soft hat geschrieben:Wenn Du Interesse hast Dir das anzugucken, schick ich dir den gesamten Code per E-Mail als Zip-Anhang.
Ja bitte, kann ich vielleicht brauchen. Will ich mir ansehen.
LittleFurz hat geschrieben:kannst dir ja mein Easy Interpreter ansehen :lol:
Ist gut, nurn bissl zu kompliziert für mich. :mrgreen:

EDIT: Ich fang gleich mal zum proggen an. (Nur mal Parser und "Entwicklungsumgebung" :D)

Mfg,
AndyX
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Beitrag von Leo »

Ich hab dir mal nen ganz kleinen Interpreter geschrieben.. (allerdings extra ohne tokens einteilung, schleifen und if..das musst du schon machen :) )

Code: Alles auswählen

;/
;/[Console pur] Interpreter
;/

;{-Vars etc.
Structure StringVar
  Name.s
  Wert.s
EndStructure
NewList Strings.StringVar()
NewList Lines.s()
;}

;{-Proceduren
Procedure.s GetParam(str.s) ;Gibt einen Parameter zurück
  tPos.l = FindString(str," ",0)
  ProcedureReturn LTrim(Mid(str,tPos,Len(str)-tPos+1))
EndProcedure
Procedure.s GetSecondParam(str.s) ;Gibt den zweiten Parameter zurück von 2en
  tPos.l = FindString(str,",",0)
  ProcedureReturn LTrim(Mid(str,tPos+1,Len(str)-tPos))
EndProcedure
Procedure.s GetFirstParam(str.s) ;Gibt den ersten Parameter zurück von 2en
  tPos.l = FindString(str,",",0)
  tProPos.l = FindString(str," ",0)
  ProcedureReturn LTrim(Mid(str,tProPos,tPos-tProPos))
EndProcedure
Procedure.s GetBefehl(str.s) ;Gibt den Befehls Namen zurück
  tPos.l = FindString(str," ",0)
  If tPos 
    ProcedureReturn RTrim(Mid(str,0,tPos))
  Else
    ProcedureReturn str
  EndIf 
EndProcedure
Procedure.s GetStringWert(str.s) ;Gibt den Wert des Strings zurück
  ForEach Strings()
    If Strings()\Name = str
      ProcedureReturn Strings()\Wert
    EndIf
  Next
EndProcedure
Procedure UseString(str.s)
  ForEach Strings()
    If Strings()\Name = str
      ProcedureReturn 1
    EndIf
  Next
  ProcedureReturn 0
EndProcedure
;}

;{-File einlesen
If ReadFile(0,"Test.int")
  While Eof(0) = 0
    str.s = ReadString()
    If Mid(str,0,1) <> ";" And str <> ""
      AddElement(Lines())
      Lines() = str
    EndIf 
  Wend
  CloseFile(0)
EndIf
;}

;-Interpretieren

OpenConsole()

CallDebugger

ForEach Lines()
  Befehl.s = GetBefehl(Lines())
  Select Befehl.s
    Case "STRING"
      If UseString(GetFirstParam(Lines())) = 0
        AddElement(Strings())
        Strings()\Name = GetFirstParam(Lines())
        Strings()\Wert = GetSecondParam(Lines())
      Else
        Strings()\Wert = GetSecondParam(Lines())
      EndIf 
    Case "DEBUGSTRING"
      Print(GetStringWert(GetParam(Lines())))
    Case "INPUT"
      UseString(GetParam(Lines()))
      Strings()\Wert = Input()
    Case "INPUTCLEAR"
      Input()
    Case "NLINE"
      PrintN("")
    Case "DELAY"
      Delay(Val(GetParam(Lines())))
    Case "GOTO"
      SelectElement(Lines(),Val(GetParam(Lines())))
  EndSelect
Next
Und als beispiels code für Test.int:

Code: Alles auswählen

STRING hehe,MUHAA
DEBUGSTRING hehe
DELAY 100
GOTO 0
Benutzeravatar
AndyX
Beiträge: 1272
Registriert: 17.12.2004 20:10
Wohnort: Niederösterreich
Kontaktdaten:

Beitrag von AndyX »

Ja, ich bin wieder da, und hab mal ne kleine Version. Ist jetzt nix ernsthaftes geworden, das ganze hab ich neu gemacht und es iss so ungefähr wie Brainfuck. Es heißt OMGWTFIT - Oh My God What The F*** Is This? Man muss sich ziemlich den A**** aufreißen um en kleines prog zu coden, aber *tadaaa!* ES FUNTKIONIERT! :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol: :lol:

EDIT: Hab den Code vergessen. :oops:

Code: Alles auswählen

; OMGWTFIT - Oh My God What The F*** Is This?

; Eine Programmiersprache, bei der man sich wirklich den A**** aufreißen muss, nur um mal ein Hello World Prog zu schreiben!!!


Goto main

Procedure Interpreter(datei$,title$)
OpenConsole()
ConsoleTitle(title$)
ReadFile(0,datei$)
*memory = AllocateMemory(1000)
For i = 0 To 100000
ReadData(*memory,1)
befehl$ = PeekS(*memory)
Select befehl$
Case ":"
asc + 1
Case "|"
asc - 1
Case "!"
Print(Chr(asc))
Case "§"
Delay(250)
EndSelect
FreeMemory(*memory)
If Eof(0) <> 0
 CloseConsole()
 Goto main
EndIf
Next i
EndProcedure

main:
If OpenWindow(0,0,0,225,70,#PB_Window_ScreenCentered|#PB_Window_SystemMenu,"OMGWTFIT")
 CreateGadgetList(WindowID(0))
 ButtonGadget(1,10,10,205,50,"Open")
 Repeat: If WaitWindowEvent() = #PB_Event_CloseWindow:End:EndIf
 Until WaitWindowEvent() = #PB_Event_Gadget
 gadget = EventGadgetID()
 If gadget = 1
 CloseWindow(0)
 ReadFile(2,"OMGWTFIT.txt")
 title$ = ReadString()
datei$ = OpenFileRequester("Wähle OMGWTFIT SourceCode","","OMGWTFIT Datei(*.OMG)|*.OMG",0)
asc = 0
Interpreter(datei$,title$)
 EndIf
EndIf
Es ist wie gesagt an BF orientiert, hat 4 befehle:

Code: Alles auswählen

OMGWTFIT - Oh My God What The F*** Is This?

: Sets the Asc Value up.
| Sets the Asc Value down.
! Output.
§ Waits 250 ms.
Man braucht umbedingt ne ascII tabelle.

Hello-World-Prog;

Code: Alles auswählen

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::!::::::::::::::::::::::::::::::|!:::::::!!:::!
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||:::!||||||||||||!
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::!||||||||!
:::!||||||!||||||||!||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||:::!§§§§§§§§§§
Einfach mit Erweiterung *.omg speichern.

Ein Bug, den ich kenne: Wenn man was das erste mal ausführt, funzt nicht. Beim nächsten Mal schon. Weiß wer wieso???

Könnt ihr mir sagen wie ich das prog verbessern kann? Könnt ihr ein bisschen käfer suchen?? Bitte. :D

Danke im Voraus.

Mfg,
AndyX

Hm... Das Mfg,AndyX sollte ich ma in die Sig. stecken. :mrgreen:
crX
Beiträge: 21
Registriert: 29.12.2004 17:29
Wohnort: Dort wo's leckcher Fondüü hat

Beitrag von crX »

:? OMGWTFIT <- Passender Name, erster Gedanke meinerseits, als ich dein Hallo-Welt betrachtet habe...
:lol:
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag von MVXA »

AndyX hat geschrieben:

Code: Alles auswählen

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::!::::::::::::::::::::::::::::::|!:::::::!!:::!
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||:::!||||||||||||!
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::!||||||||!
:::!||||||!||||||||!||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||:::!§§§§§§§§§§
Willst du nicht doch versuchen den Easy Interpreter zu mißhandeln :? ? Easy ist auf jeden Fall lesbarer als das da :freak:. Easy kennt da wenigstens Kommentare :mrgreen:
Bild
Benutzeravatar
Zaphod
Beiträge: 2875
Registriert: 29.08.2004 00:40

Beitrag von Zaphod »

ich würde mich nicht so sehr auf brainfuck versteigen, denn brainfuck ist eine sehr spezielle form von interpretiertem code, nämlich ein turingmaschinen simulator.
in einer normalen skriptsprache ist später zumindest einfacher zu programmieren.
Antworten