Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 26.07.2007, 13:44 Titel: |
|
|
Noch eine Idee:
Wenn CMD die ID des Befehls ist, kann CMD doch ein Array sein.
z.B.
Code: | dim CMD(1 to 4) as string
CMD(1) = "print"
CMD(2) = "input"
CMD(3) = "do"
CMD(4) = "loop" | Dann kann man in einer Schleife das Array durchsuchen und spart sich den ersten IF-Block.
(Ich hoffe, dass man sieht, dass ich mir Mühe gebe zu helfen) _________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 26.07.2007, 13:45 Titel: |
|
|
Man sollte auch Konstanten für die Befehle festlegen imho.  _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
dreael Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 2529 Wohnort: Hofen SH (Schweiz)
|
Verfasst am: 26.07.2007, 13:46 Titel: |
|
|
Zum Titelthema: Ist selbstverständlich kein Problem, der sog. Compilerbau stellt ein eigenes Gebiet in der Informatik dar und war während meines Studiums auch ein separates Fach.
Wichtig ist einfach, dass Du Dich mit Syntaxdiagrammen und -darstellungen wie beispielsweise EBNF und Eisenbahndiagramm intensiver auseinandersetzst. Daneben stellt das Generieren von Maschinencode für eine bestimmte Prozessorarchitektur eine Welt für sich dar, was ebenfalls nur mit ganz guten Assemblerkenntnissen gemeistert werden kann. _________________ Teste die PC-Sicherheit mit www.sec-check.net |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 26.07.2007, 13:49 Titel: |
|
|
Da hätte ich mal eine Frage in eigener Sache:
Gibt es dafür keine Bibliotheken, die z.B. vorgefertige Routinen für einfache Befehle wie print, locate, input bietet, oder ASM => Maschinencode übersetzt?
Die Umwandlung ASM=>Maschinencode macht schließlich fast jeder Compiler, deshalb ffrage ich. _________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 26.07.2007, 14:03 Titel: |
|
|
Nein, afaik nicht.
Jeder Compiler optimiert anders und kann je nach Sprache auch anders optimieren. _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 26.07.2007, 14:31 Titel: |
|
|
Wie lässt sich sowas mit Benutzerdefinierten Strings lösen?? _________________ Bis irgendwann...  |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 26.07.2007, 14:43 Titel: |
|
|
Was genau meinst du mit "benutzerdefiniert"? _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 26.07.2007, 14:46 Titel: |
|
|
Wenn man jetzt der Datei schreiben würde
muss dieser string im interpreter irgendwie weiter verarbeitet werden können
Das muss auch mit Zahlen gelöst werden. _________________ Bis irgendwann...  |
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 26.07.2007, 15:05 Titel: |
|
|
Anders:
Wie kriegt mann es gebacken das belibige Strings zum beispiel mit Print angezeigt bekommt?? _________________ Bis irgendwann...  |
|
Nach oben |
|
 |
Eternal_pain

Anmeldungsdatum: 08.08.2006 Beiträge: 1783 Wohnort: BW/KA
|
Verfasst am: 26.07.2007, 15:14 Titel: |
|
|
eine Function/Sub
irgendwas wie, if befehl="print" Then.... parameter auslesen....
und die eigene function mit diesen Parameter aufrufen
zb meinprint (string) oder so...
die funktion ist dann eigentlich nichts anderes wie
sub meinprint (parameter as string)
print parameter
end sub
so in etwa... es gehort mehr dazu als nur den Befehl auszulesen... auch parameter ect gehoeren dazu.... _________________
 |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 26.07.2007, 15:38 Titel: |
|
|
Bau einen Tokenizer. Der nimmt Zeichen für Zeichen des Sources, und entscheidet, was das genau ist. Z.B. ein Befehl, eine Konstante, etc. Danach fällt das weitere Interpretieren leichter.
Sonst hab ich hier auch noch ein etwas älteres Tutorial zum Compilerbau. Nicht unbedingt vollständig, nicht unbedingt aktuell, aber auf jeden Fall informativ.
(Achja, du solltest Englisch und Pascal nicht scheuen. ) _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
csde_rats

Anmeldungsdatum: 07.01.2007 Beiträge: 2292 Wohnort: Zwischen Sessel und Tastatur
|
Verfasst am: 26.07.2007, 15:46 Titel: |
|
|
Meine Idee zu Variablen:
Statt einem Suffix ein Praefix verwenden; also statt Variable$ $Variable. Wie bei PHP. Dann kannst du Variablen (fast) wie Befehle verarbeiten. _________________ If hilfreicher_Beitrag then klick(location.here)
Klick |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 26.07.2007, 16:51 Titel: |
|
|
Kann man auch anders lösen.
Prüfe z.B. ob der aktuell herausgetrennte Stück Code (z.B. aus "MYVAR=15") als Befehl existiert. Wenn ja, kann der Interpreter schonmal gleich eine Fehlermeldung schmeißen, da das wahrscheinlich nicht die Aufrufkonvention eines Befehls ist (herausgetrennt würde in diesem Fall halt erstmal "MYVAR"). Weiters kann man ja immer noch überprüfen ob's eine Funktion ist (wobei ich Funktionen aus der Scriptsprache erstmal raushalten würde ).
Eben diese Sache (das heraustrennen bzw. herausarbeiten) wäre erstmal Arbeit des Tokenizers. Eine andere Sub könnte überprüfen, ob das entsprechende Token an dieser Stelle erlaubt ist.
Schau dir dazu am Besten mal oben genanntes Tutorial an. _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
Sebastian Administrator

Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
|
Nach oben |
|
 |
DL1YOV
Anmeldungsdatum: 28.02.2007 Beiträge: 7
|
Verfasst am: 26.07.2007, 17:52 Titel: |
|
|
Klar geht das. Ich bin übrigens selbst grad dabei, sowas ähnliches zu programmieren. Es ist allerdings ratsam, sich mal etwas näher mit den Grundlagen des Compilerbaus zu beschäfitigen. Sehr schnell stößt man dann auf Begriffe wie "endlicher Automat", "Kellerautomat" usw. Ganz grob gesagt; Zuerst hat man einen Eingabedatenstrom (z.B. eine Datei oder einen String), der Zeichen für Zeichen untersucht wird. Stellt man fest, daß eine Zeichenfolge einem best. Muster entspricht, hat man als Ergebnis einen sog. Token. Diesen Schritt nennt man lexikalische Analyse. Bei der nachfolgenden syntaktischen Analyse wird dann geprüft, ob eine Reihe von Tokens einen gültigen vollständigen Befehl der jeweiligen Programmiersprache bilde. Ist das der Fall, wird eine entsprechende Aktion ausgeführt. Das mal so ganz grob als Ablaufschema. Ein Buchtip zum Thema ist z.B. das sog. "Drachenbuch" (Aho, Sethi, Ullmann: Compilers - Principles, Techniques and Tools). Die Codebeispiele darin sind zwar alle in C oder Pascal, lassen sich jedoch ohne größeren Aufwand auch nach Freebasic übertragen.
Gruß,
Oliver |
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 27.07.2007, 13:44 Titel: |
|
|
Ich hab ihn fast fertig..
Screen, Line und sogar der Open Befehl mitsamt Get, Put usw
(Das das aber so häftig wird zu schreiben hätte ich nicht gedacht xD)
Ich brauche noch tipps wie man IF einbauen kann  _________________ Bis irgendwann...  |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 27.07.2007, 14:08 Titel: |
|
|
Einmal hab ich dir schon 'nen Link gepostet, dann noch Sebastian - beides führte zur Wettbewerbsseite zum Thema Interpreter.
Schau's dir dort halt mal an, sollte man allgemein so machen, wenn man Antworten auf seine Frage bekommt.  _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 27.07.2007, 15:44 Titel: |
|
|
Jo so bin ich doch noch auf den einen oder anderen Hinweis gekommen wies jetzt weiter geht.
Mein Programm ist inzwischen soweit, das ich mit leitigkeit schon am Basic vom C64 fast schon ran kommt.
Ich hab jetzt mein Interpreter neu Aufgebaut und die Befehle eine ID gegeben.
Das sieht inetwa so aus:
Code: | const IDNRS = 9
DIM AS STRING Befehl(1 to IDNRS)
Print "Befehle laden.."
FOR ID=1 to IDNRS
READ Befehl(ID)
Print "ID";ID;" = "+Befehl(ID)
Next
sleep
' Befehldaten (ID Wird nach der Reihe verteilt)
DATA "PRINT"
DATA "INPUT"
DATA "OPEN"
DATA "FOR"
DATA "NEXT"
DATA "IF"
DATA "THEN"
DATA "DO"
DATA "LOOP"
|
Das ist nur ein kleiner Teil der unterstützten Befehle..
Diese die IDs sorgen ganz einfach dafür dass man nicht jedesmal den ganzen kram wie "Print","Input" usw
eingeben muss stattdessen nurnoch die ID wo Print usw drinn steht  _________________ Bis irgendwann...  |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 27.07.2007, 21:15 Titel: |
|
|
Naja, bedenke aber mal bitte, dass dein BASIC nur auf dem Vorhandensein der Befehle von FreeBASIC basiert. Und quasi nicht wirklich viel selbst macht.
FB bzw. das BASIC vom C64 hingegen haben/hatten eine eigene RTL/eigene Umsetzungen der Befehle.
/edit:
Btw, du kannst das "Befehle werden geladen" weglassen. Das geht selbst auf 'nem wiiiiiiiiirklich alten System ruckzuck. _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
|