Archiv verlassen und diese Seite im Standarddesign anzeigen : Contest: Interpretieren einer Datei
Jesus_666
29.03.2005, 15:23
Jaaaa, ich habe es geschafft! Nach nur einem halben Jahr ist mir endlich eine Sprache eingefallen, die man in einem Parsercontest verwenden kann! Ich bin so toll etc.
Also gut, kommen wir zum Contest. Es geht in diesem Contest darum, eine Datei einzulesen, zu parsen und zu interpretieren.
Besprechen wir erst mal die Grundlagen:
Ein Parser entscheidet, ob der Input zur Sprache einer bestimmten Grammatik angehört. Das klingt jetzt kompliziert, ist aber relativ einfach: Eine Grammatik ist eine Reihe von Regeln, die bestimmen, wie eine Sprache auszusehen hat. Eine Sprache ist die Menge aller Zeichenketten, die zu der Grammatik passen.
Beispielsweise könnte ich folgende Grammatik aufstellen: Alle Wörter bestehen aus dem Buchstaben A, der N-mal aneinandergereiht wird, wobei N zwischen 0 und 5 liegen kann. Das Wort "AAAA" entspricht dieser Grammatik, das Wort "" auch. "AAAB" tut es nicht, weil die Sprache kein B erlaubt; "AAAAAA" paßt auch nicht, weil das A nur fünf mal vorkommen darf.
Der Parser hat die Aufgabe, herauszufinden ob der Input zur Spache paßt oder nicht. Er wird in Compilern und Interpretern normalerweise als erste Routine verwendet - immerhin macht es wenig Sinn, Code verarbeiten zu wollen, der gar nicht korrekt ist. (Dieser Teil ist für den Contest wichtig.)
Ein Interpreter ist ein Programm, das Programme (die nicht in Maschinencode vorliegen) einliest und ausführt. Das war's schon.
Also gut, wir haben die Grundlagen durch, es wird Zeit für den eigentlichen Inhalt des Contests. Die Aufgabe ist, einen Interpreter nach bestimmten Regeln zu schreiben.
Diese Regeln müssen befolgt werden. Der Input muß aus einer Datei einlesbar sein; andere Eingabemethoden sind optional
Die erste Zeile beinhaltet einen Text, der ausgegeben werden soll. Im Text können sich Variablen im Format %Variablenname% befinden
Alle darauffolgenden Zeilen beinhalten Variablendefinitionen im Format %Variablenname%:Wert|Wert|Wert...
Alle Variablen sind Arrays von Strings. Wenn eine Variable irgendwo verwendet wird, wird ein zufälliger Wert aus der Variablendefinition verwendet
Variablennamen sind alphanumerische Zeichenketten mit einer Länge von 1 bis 255.
Nicht abgeschlossene Variablen sind Fehler. Beispiel: Ich bin ein %ding
% wird vor | ausgewertet
Jede Variable darf nur einmal definiert werden
Variablen dürfen Verweise auf weitere Variablen beinhalten. Eine Variable darf auf sich selbst verweisen, aber nicht in jedem Wert einen Verweis auf sich selbst beinhalten (es muß also mindestens einen Wert geben, in dem die Variable nicht auf sich selbst verweist)
Es darf Verweise auf Variablen geben, die nicht definiert sind. In diesem Fall ist der Variablenname mit Prozentzeichen unverändert zu übernehmen
Input, der nicht den Regeln entspricht ist als solcher kenntlich zu machen
Das hier war mal in der Spezifikation, wurde aber aus Gründen der Verarbeitbarkeit optional gemacht:
Variablennamen achten auf Groß- und Kleinschreibung. %bla% und %BLA% sind unterschiedliche Variablen
Um ein Prozentzeichen auszugeben muß man einen Backslash davorsetzen (\%). Wenn man also ausgeben will %bla% ist <Inhalt von %bla%>, dann steht im Input \%bla\% ist %bla%. Wenn man einen Querstrich schreiben will, dann verwendet man auch einen Backslash (\|). Um eine Raute zu schreiben verwendet man - Überraschung - einen Backslach (\#). Um einen Backslash zu schreiben verwendet man einen doppelten Backslash (\\). Es ist dem Entwickler überlassen, die gängigen Backslash-Kombinationen wie \n, \t, \b und \r zu implementieren. Jede Backslashkombination, die keinen Sinn macht ist als Fehler zu melden
Leerzeilen sowie Zeilen, die mit # anfangen, sind zu ignorieren. Whitespace (Leerzeichen, Tabs) wird am Anfang von Zeilen ignoriert, überall sonst nicht
Dazu kommen dann noch folgende Verhaltensweisen, die wünschenswert aber nicht notwendig sind: Das Programm kann Zeilenenden in allen drei Formaten (Unix/DOS/Mac) erkennen
Es ist nicht möglich, das Programm durch beschädigten Input zum Absturz zu bringen oder es in eine Endlosschleife zu schicken (was mit korrektem Input durchaus möglich sein kann)
Allgemeine Konditionen
Der Contest läuft ab sofort und endet Ende April.
Erlaubt sind sämtliche Sprachen, die Programme oder Skripte müssen entweder auf Windows oder *nix lauffähig sein; natürlich muß der Quellcode offengelegt werden - ob unter einer Open Source-Lizenz oder kommentarlos als "wer's will soll's nehmen" bleibt euch überlassen. Da Public Domain in Deutschland urheberrechtlich nicht erlaubt ist ist die zlib-Lizenz (http://www.opensource.org/licenses/zlib-license.php) vielleicht eine Überlegung wert, wenn man den Source ganz offiziell freigeben will.
Bewertet wird von den Usern, per Abstimmung. Es sollte dabei aber darauf geachtet werden, ob der Interpreter sich auch an die Spezifikation hält.
Die Sieger erhalten das tolle Gefühl, gewonnen zu haben. Vielleicht kann ich Chocwise noch einen Sonderrang aus den Rippen leiern - ich verspreche aber nichts.
Parsergeneratoren wie flex oder bison dürfen nicht verwendet werden. Ein bißchen Arbeit muß man schon selbst machen. ;)
Beispiele
Zum Schluß gebe ich noch ein paar Beispiele für Dateien, die der oben genannten Sprache entsprechen:
Ich habe eine%Tier%.
%Tier%:n Hund| KatzeDiese einfache Datei kann als Output entweder Ich habe einen Hund. oder Ich habe eine Katze. erzeugen.
OMG LOL%weiter%
%weiter%:!%weiter%|1%weiter%|Hier haben wir ein Beispiel für einen Selbstverweis. Am Ende von %weiter% ist ein leerer Wert, der die Verarbeitung irgendwann aufhören läßt. Ein Beispiel für Output wäre: OMG LOL!!!!11!1!!11111!!1
%tot%
%tot%:%tot%Das hier sollte der Interpreter mit einer Fehlermeldung quittieren, weil die Variable in jedem Wert einen Selbstverweis enthält.
Baum
%tot%:%tot%Auch wenn die Variable %tot% nirgends verwendet wird muß der Interpreter den Input zurückweisen, wenn eine derartige Definition drinsteht.
%tot%
#%tot%:%tot%Diese Version funktioniert: Zeilen mit # am Anfang gelten als Kommentare; der Output wäre also %tot%.
%tot%
#%tot%:%tot%Dieser Input ist mit dem letzten identisch, was die Verarbeitung angeht: Whitespace am Anfang von Zeilen wird ignoriert.
%tot%
%tot:Brot
In der zweiten Zeile fehlt ein %. Auch davon sollte dem Interpreter schlecht werden.
Ich nehme an lex/flex und yacc/bison dürfen nicht verwendet werden? Ansonsten. Auf ins Gefecht. >:D.
Jesus_666
29.03.2005, 16:23
Ich nehme an lex/flex und yacc/bison dürfen nicht verwendet werden? Ansonsten. Auf ins Gefecht. >:D.
Guter Einwand. Ich nehm' das mal schnell in die Regeln auf.
Crash-Override
29.03.2005, 16:39
Also muss das ganze nur unetr zumindestens Windows irgenwie lauffähig sein und mindestens Dateien verarbeiten kölnnen?
So, kann ich es dann auch als z.B. Delphi Konsolenanwendung machen und die Ausgabe dann einfach mit writeln(); lösen oder muss es zwngsläufig ne art MessageBox sein?
Ah, mir fällt noch was ein, muss man unendlich Varibalen verwenden können, da es ja wohl auch Sprachen gibt in denen Arrays in unendlicher Form probleme machen....
Und bei
Ich habe eine%Tier%.
%Tier%:n Hund| Katze
Muss man eine oder beide Varianten ausgeben?
Jesus_666
29.03.2005, 18:01
Also muss das ganze nur unetr zumindestens Windows irgenwie lauffähig sein und mindestens Dateien verarbeiten kölnnen?
Das Programm muß entweder unter Windows oder unter Linux oder unter beidem lauffähig sein. Eins reicht aber völlig.
[/quote]So, kann ich es dann auch als z.B. Delphi Konsolenanwendung machen und die Ausgabe dann einfach mit writeln(); lösen oder muss es zwngsläufig ne art MessageBox sein?[/quote]
Ich habe nirgendwo gesagt, daß der Interpreter ein GUI haben muß. Letztendlich ist es egal, wie Output und Bedienung gehandhabt werden, solange das Program tut, was es soll.
Ah, mir fällt noch was ein, muss man unendlich Varibalen verwenden können, da es ja wohl auch Sprachen gibt in denen Arrays in unendlicher Form probleme machen....
Man sollte in der Lage sein, alle in der Datei verwendeten Variablen verarbeiten zu können. Da ich nicht davon ausgehe, daß jemand eine unendlich lange Datei erstellt wird es wohl keine unendlich großen Variablen geben.
Und bei
Ich habe eine%Tier%.
%Tier%:n Hund| Katze
Muss man eine oder beide Varianten ausgeben?
In den Regeln steht, daß zufällig einer der Werte ausgewählt wird (siehe Regel 4).
Ich mache auch mit. Jede Programmiersprache ist doch erlaubt wenn dass Programm unter Windows oder Linux läuft, also sind nich sehr bekannte Sprachen auch möglich, oder?
Da ich nicht davon ausgehe, daß jemand eine unendlich lange Datei erstellt wird es wohl keine unendlich großen Variablen geben.
Schön und gut. Das denken sich Programmierer von overflow-anfälliger Software sicher auch. Aber einige denken da anders. ;)
Ich finde es wäre ganz praktisch zu wissen, mit wie großen Puffern man rumhantieren muss. Allein schon wegen der Segmente ist das z.B. für nen Assembler-Programmierer recht wichtig. Also ob man auch Code verarbeiten muss, der größer als 64kb ist und so. Eine maximale Filesize wäre vielleicht nicht schlecht. Die Aufgabe ist ja so schon umfangreich genug.
freundliche Grüße, Rolus
Jesus_666
29.03.2005, 19:50
Schön und gut. Das denken sich Programmierer von overflow-anfälliger Software sicher auch. Aber einige denken da anders. ;)
Ich finde es wäre ganz praktisch zu wissen, mit wie großen Puffern man rumhantieren muss. Allein schon wegen der Segmente ist das z.B. für nen Assembler-Programmierer recht wichtig. Also ob man auch Code verarbeiten muss, der größer als 64kb ist und so. Eine maximale Filesize wäre vielleicht nicht schlecht. Die Aufgabe ist ja so schon umfangreich genug.
freundliche Grüße, Rolus
Sagen wir, die Sprachdefinition sieht weder eine Maximalgröße der Datei noch eine maximale Anzahl der verwendeten Variablen vor, in diesem Contest werden aber keine Dateien verarbeitet, die größer als 64 Kilobyte sind oder die mehr als 256 Variablen beinhalten.
Ich mache auch mit. Jede Programmiersprache ist doch erlaubt wenn dass Programm unter Windows oder Linux läuft, also sind nich sehr bekannte Sprachen auch möglich, oder?
Solange es einen Compiler/Interpreter gibt, den andere User einfach bekommen können, ja. Wenn es nur einen Compiler gibt, der nur gegen Bezahlung erhältlich ist, dann wird's schwer, das Programm zu überprüfen.
Solange es einen Compiler/Interpreter gibt, den andere User einfach bekommen können, ja. Wenn es nur einen Compiler gibt, der nur gegen Bezahlung erhältlich ist, dann wird's schwer, das Programm zu überprüfen.
Wenn man davon eine Binary macht? Dann sollte es wohl machbar sein, den Source dazu zulegen und das Programm zum Testen als exe.
Was ist mit
Ich habe eine Tier%.
%Tier%:n Hund| Katze? Auch einfach ausgeben, wie bei unbekannten Variablen?
Crash-Override
29.03.2005, 21:32
Schäze mal ja, da die variable nicht abgeschlöossen ist...
MagicMagor
29.03.2005, 21:38
Schätze mal nein, da eine nicht abgeschlossene Variable den Regeln widerspricht und somit eine Fehlermeldung produzieren sollte. Ein Interpreter macht nicht viel Sinn, wenn er einfach alles annimmt und ausspuckt, auch wenns fehlerhaft ist..
Edit:
Was mich eher interessiert ist folgender Fall:
Dies ist eine Zeile %%
%Bla%:fu
Zählt die Variable oben als Variable, mit einem leeren Namen, oder ist sowas auch eine fehlerhafte Eingabe?
Schätze mal nein, da eine nicht abgeschlossene Variable den Regeln widerspricht und somit eine Fehlermeldung produzieren sollte. Ein Interpreter macht nicht viel Sinn, wenn er einfach alles annimmt und ausspuckt, auch wenns fehlerhaft ist..Mh. Das gilt aber doch nur für die Variablendefinition, dachte ich.
ich würde es als text lassen. Dass dann "Ich habe eine Tier%." ausgegeben wird. Muss ja auch möglich sein, ein % Zeichen zu schreiben.
Noch was. Meiner Meinung nach müssen % noch escaped werden können. Damit man auch % um Wörter benutzen kann die eigentlich Variablen sind:
Zum Beispiel: \%var\% ist %var%
%var%:eins|zwei|drei
Crash-Override
29.03.2005, 21:53
Noch was. Meiner Meinung nach müssen % noch escaped werden können. Damit man auch % um Wörter benutzen kann die eigentlich Variablen sind:
Zum Beispiel: \%var\% ist %var%
%var%:eins|zwei|drei
Vll noch Datenbank anbindung rein? :o
Ist doch eh nur ne Pseudo-Sprache, wer will da schon echt was mit proggen...
Vll noch Datenbank anbindung rein? :oGute Idee. Eigentlich bräuchte man nur Sockets. Dateiein- und ausgabe kann man dann ja auch über z.b. FTP oder HTTP machen..
# main:
%open% %write% %read% %close%
%open%:$socketopen$%open%|localhost %open%|80
%write%:$socketwrite$%write%|GET test.c02 HTTP 1.1
%read%:$socketread$
# hinweis: $socketread$ packts automatisch in read
%close%:$socketclose$Würde sich selbst ausgeben. o.o
Jesus_666
29.03.2005, 23:26
Schätze mal nein, da eine nicht abgeschlossene Variable den Regeln widerspricht und somit eine Fehlermeldung produzieren sollte.
Würde ich auch sagen. Jede Variable muß geschlossen werden.
Was mich eher interessiert ist folgender Fall:
Dies ist eine Zeile %%
%Bla%:fu
Zählt die Variable oben als Variable, mit einem leeren Namen, oder ist sowas auch eine fehlerhafte Eingabe?
Man kann %% zwar problemlos definieren, aber bei einigen Sprachen müßte man u.U. unnltigen Aufwand treiben, um das dann zu verarbeiten (abhängig davon, wie man intern arbeitet etc.). Ich ändere die Regeln so, daß der Variablenname mindestens ein Zeichen lang sein muß.
Noch was. Meiner Meinung nach müssen % noch escaped werden können. Damit man auch % um Wörter benutzen kann die eigentlich Variablen sind:
Zum Beispiel: \%var\% ist %var%
%var%:eins|zwei|drei
Und dafür mißbrauchen wir jetzt einfach %%. Hach, manchmal ist das Leben so einfach...
Was ist mit leeren Variablen?
omg lol lol!11
%var%:
Vergesst es. Muss richtig sein, wenn
omg lol%var%
%var%:1%var|!%var|auch richtig ist.
Feenstaub
30.03.2005, 21:51
Hallo @all,
Inwieweit sind libraries erlaubt? C-Runtime? C++-StandardLib?
Küsschen,
Feenstaub.
6. Wenn im Input zwei aufeinanderfolgende Prozentzeichen stehen (%%), so wird das als einzelnes Prozentzeichen ausgegeben. Wenn man also ausgeben will %bla% ist <Inhalt von %bla%>, dann steht im Input %%bla%% ist %bla%.
Wie ist das mit Prozent-zeichen in den Variablenwerten? zb: %Gewinn%:100%|50%|nichts
Jesus_666
30.03.2005, 22:24
Hallo @all,
Inwieweit sind libraries erlaubt? C-Runtime? C++-StandardLib?
Küsschen,
Feenstaub.
Nur Standardbibliotheken.
Wie ist das mit Prozent-zeichen in den Variablenwerten? zb: %Gewinn%:100%|50%|nichts
Genauso wie überall sonst: %Gewinn%:100%%|50%%|nichts
Feenstaub
30.03.2005, 23:48
Und bei anderen doppeldeutigen Token? zB: %operator%:&|||:|^
Sollen diese aus dem Kontext heraus erkannt werden? Oder gilt das %-Zeichen generell als literal Definition?
Küsschen,
Feenstaub.
Wie wär's, wenn Variablen keine Sonderzeichen enthalten dürften oder wenn nötig dann nur als ASCII-Zeichen übermittelt werden dürften? Dann könnte man ASCIIs wie folgt in einer Variablen kennzeichnen:
Variable ist: %var%
%var%:Der Inhalt betraegt 50 %ASC(37) .
Dies würde dann so dargestellt werden: (ASCII-Zeichen 37 ist das "%" Zeichen.)
Variable ist: Der Inhalt betraegt 50 %.
Oder irgendwie sonst der Variable klarmachen, dass hier ein bestimmtest ASCII-Zeichen eingefügt werden soll.
Jesus_666
31.03.2005, 00:02
Und bei anderen doppeldeutigen Token? zB: %operator%:&|||:|^
Sollen diese aus dem Kontext heraus erkannt werden? Oder gilt das %-Zeichen generell als literal Definition?
Küsschen,
Feenstaub.
Jetzt weiß ich, worauf du hinauswillst. Glaube ich.
%Gewinn%:100%|50%|nichts würde einen Fehler erzeugen, weil da ein | im Variablennamen steht - die dürfen aber nur alphanumerisch sein.
%operator%:&|||:|^ ist in Ordnung. Es ist absolut okay, wenn mehrmals der gleiche Wert vorkommt (er ist dann eben wahrscheinlicher) und der Doppelpunkt hat nur am Anfang der Zeile eine Funktion. Danach gilt er als normales Zeichen.
%operator%|:Wert würde einen Fehler erzeugen. Die Zeilen fangen mit einem Variablennamen und einem Doppelpunkt an, das tut diese nicht.
@Sunny: Warum? Es gibt nur zwei Zeichen, die irgendeine Bedeutung haben und das sind % (das mit der %%-Regelung problemlos dargestellt werden kann) und | (das bisher nicht dergestellt werden kann - das korrigiere ich mal, bevor sich noch jemand aufregt).
Ich könnte natürlich die Anregung aufnehmen und verlangen, daß jeder Interpreter eine $[xxxx]-Funktion beinhaltet, wobei xxxx der Hexcode für ein Unicode-Zeichen ist. Andererseits müßte ich das ja auch programmieren.
Feenstaub
31.03.2005, 02:15
Jetzt weiß ich, worauf du hinauswillst. Glaube ich.
%Gewinn%:100%|50%|nichts würde einen Fehler erzeugen, weil da ein | im Variablennamen steht - die dürfen aber nur alphanumerisch sein.
%operator%:&|||:|^ ist in Ordnung. Es ist absolut okay, wenn mehrmals der gleiche Wert vorkommt (er ist dann eben wahrscheinlicher) und der Doppelpunkt hat nur am Anfang der Zeile eine Funktion. Danach gilt er als normales Zeichen.
%operator%|:Wert würde einen Fehler erzeugen. Die Zeilen fangen mit einem Variablennamen und einem Doppelpunkt an, das tut diese nicht.
Ähm... nicht so ganz. Ich drück' mich wohl nicht richtig aus. Sorry. Ich versuche es nochmal. (Das Problem ist, dass du die Sprache in Satzform definiert hast, anstatt vielleicht BNF oder Syntaxdiagramme... dadurch wäre die Grammatik "durchschaubarer" ^^)
Ich habe meine Arbeit begonnen, indem ich mir deine Beispiele angeschaut habe:
Ich habe eine%Tier%.
%Tier%:n Hund| Katze
Das Leerzeichen vor Katze hat mir gesagt, dass das "|"-Zeichen die Trennung der Variablenwerte vornimmt. Nur so macht der Satz: "Ich habe eine(Leerzeichen)Katze." Sinn. Also habe ich mir gesagt. Das "|" trennt die einzelnen Werte KONKRET. Sprich, die Werte werden nicht links und rechts getrimmt!
OMG LOL%weiter%
%weiter%:!%weiter%|1%weiter%|
Hier schreibst du, dass hinter dem letzten "|" die leere Menge spezifiziert ist. Das heisst für mich: A) Eine leere Menge ist erlaubt. B) Die leere Menge ist definiert mit "kein Zeichen". C) Als letztes Zeichen in der Variablendeklaration steht entweder ein "|", dass die leere Menge mit einschliesst, oder der letzte Buchstabe eines echten Wertes (ein String).
Das führt aber zu folgender Doppeldeutigkeit:
%VarName%:|||
kann entweder heissen:
|(Leere Menge)|(Leere Menge)|
oder aber:
|("|"-Zeichen)|
und was ist: [%VarName%:]? Eine Variable, die nur die leere Menge enthält? Oder ist das syntaktisch falsch?
Und dann gibt esnoch etwas, dass zwar kein wirkliches Problem ist, aber die Nutzung zusäzlich erschwert. Auf Grund der Textdatei lässt sich nicht immer genau sagen, wie der Wert wirklich aussieht:
Das%tier%ist alt.
%tier%:| Pferd | Schaf
Hier habe ich hinter Schaf noch ein Leerzeichen. Im Text sieht man das aber nicht. Trotzdem ist die Syntax grundsätzlich richtig. Vielleicht sollte man ein Ende-Zeichen einführen? zB einen Punkt:
Das%tier%ist%fuellwort%alt.
%tier%:| Pferd | Schaf .
%fuellwort%: sehr | noch nicht .
Aber das ist nur ein formeller Hinweis. ;)
Zurück zu deinen Anforderungen. Von meinem bescheidenen Verständnis sähe die Variablendeklaration in EBNF etwa so aus:
VarDecl := "%" VarName "%" ":" (Value "|")* Value.
VarName := AlNum+.
AlNum := Alpha | Num.
Alpha := 'A'|'B'...'Y'|'Z|'a'|'b'...'y'|'z'.
Num := '0' | '1' ... '8' | '9'.
Value := AnyChar*.
Ist das so richtig? Und wie sollen wir vorgehen, wenn "AnyChar" ein '|' enthält?
Küsschen,
Feenstaub.
p.s. Sorry für den langen Post, aber Compilerbau war eine meiner Lieblingsthemen... damals... vor langer, langer Zeit... in einer weit, weit entfernten Galaxie...
Ich tippe mal drauf das, dass einen Fehler ausgibt.
Der Interpreter sollte das als ungeschlossene(?) Variable erkennen da das %-Zeichen nicht escaped ist (mit %%).
EDIT:
Mwah, total überflüssig. Ich sollte vielleicht auch mal darauf achten das es 2 Seiten in diesem Thread gibt.
Das führt aber zu folgender Doppeldeutigkeit:
%VarName%:|||
kann entweder heissen:
|(Leere Menge)|(Leere Menge)|
oder aber:
|("|"-Zeichen)|
Bin zwar nicht Jesus, aber ich erklär's mal so wie ich's verstanden hab:
Man muss sich die Definition auf der ersten Seite eben mehrmals durchlesen, da Jesus sie immer wieder verändert. Ich zitiere:
Wenn man einen Querstrich schreiben will, dann verwendet man %|%. Das ist die einzige Möglichkeit, ein nicht-alphanumerisches Zeichen zwischen zwei Prozentzeichen zu tun.
Dein genanntes Beispiel würde also eine Variable mit vier leeren Mengen initialisieren, also so:
%VarName%:(Leere Menge)|(Leere Menge)|(Leere Menge)|(Leere Menge)
Für ein |-Zeichen müsste der Code also so aussehen:
%Varname%:%|%.
und was ist: [%VarName%:]? Eine Variable, die nur die leere Menge enthält? Oder ist das syntaktisch falsch?
Ich denke mal das ist einfach ne leere Menge. Warum auch nicht?
Und dann gibt esnoch etwas, dass zwar kein wirkliches Problem ist, aber die Nutzung zusäzlich erschwert. Auf Grund der Textdatei lässt sich nicht immer genau sagen, wie der Wert wirklich aussieht:
Das%tier%ist alt.
%tier%:| Pferd | Schaf
Hier habe ich hinter Schaf noch ein Leerzeichen. Im Text sieht man das aber nicht. Trotzdem ist die Syntax grundsätzlich richtig. Vielleicht sollte man ein Ende-Zeichen einführen? zB einen Punkt:
Das%tier%ist%fuellwort%alt.
%tier%:| Pferd | Schaf .
%fuellwort%: sehr | noch nicht .
Ja, so einen Schluss-Punkt fände ich auch gut und so.
freundliche Grüße, Rolus
Jesus_666
31.03.2005, 11:19
Ähm... nicht so ganz. Ich drück' mich wohl nicht richtig aus. Sorry. Ich versuche es nochmal. (Das Problem ist, dass du die Sprache in Satzform definiert hast, anstatt vielleicht BNF oder Syntaxdiagramme... dadurch wäre die Grammatik "durchschaubarer" ^^)
Wenn ich erst noch allen hier die (E)BNF beibringen wollte wäre der Anfangspost mindestens dreimal so lang - und die Nachbesprechung auch. Erstaunlicherweise ist es ziemlich schwer, anderen Leuten das beizubringen, was man an der Uni gelernt hat.
Ursprünglich sollte der Contest sich mit der Simulation eines deterministischen endlichen Automaten befassen. Nachdem ich Luki mit meinen Erklärungsversuchen, was ein DEA tut, völlig verwirrt habe hab' ich das dann lieber doch gelassen.
Das Leerzeichen vor Katze hat mir gesagt, dass das "|"-Zeichen die Trennung der Variablenwerte vornimmt. Nur so macht der Satz: "Ich habe eine(Leerzeichen)Katze." Sinn. Also habe ich mir gesagt. Das "|" trennt die einzelnen Werte KONKRET. Sprich, die Werte werden nicht links und rechts getrimmt!
Das kommt so hin.
Das führt aber zu folgender Doppeldeutigkeit:
%VarName%:|||
kann entweder heissen:
|(Leere Menge)|(Leere Menge)|
oder aber:
|("|"-Zeichen)|
und was ist: [%VarName%:]? Eine Variable, die nur die leere Menge enthält? Oder ist das syntaktisch falsch?
Zu ersterem: Das | war nicht als druckbares Zeichen vorgesehen. Für den Fall, daß jemand es doch ausgeben will habe ich in den Regeln den Sonderfall %|% eingeführt.
Zu letzterem: %VarName%: würde ich tatsächlich als eine Variable, die nur ein leeres Wort enthält, betrachten.
BTW, du kannst statt dem -Tag auch den [tt]-Tag verwenden, den es seit Kurzem gibt. Der ist plattformunabhängiger (nicht jedes Betriebssystem muß eine Courier New-Schriftart haben).
Und dann gibt esnoch etwas, dass zwar kein wirkliches Problem ist, aber die Nutzung zusäzlich erschwert. Auf Grund der Textdatei lässt sich nicht immer genau sagen, wie der Wert wirklich aussieht:
[FONT=Courier New]Das%tier%ist alt.
%tier%:| Pferd | Schaf
Hier habe ich hinter Schaf noch ein Leerzeichen. Im Text sieht man das aber nicht. Trotzdem ist die Syntax grundsätzlich richtig. Vielleicht sollte man ein Ende-Zeichen einführen? zB einen Punkt:
Das%tier%ist%fuellwort%alt.
%tier%:| Pferd | Schaf .
%fuellwort%: sehr | noch nicht .
Aber das ist nur ein formeller Hinweis. ;)
Stimmt, allzu lesbar ist mein Format nicht. Ich mache trotzdem keine Zeilenenden rein, das wäre in erster Linie eine kosmetische Veränderung.
Zurück zu deinen Anforderungen. Von meinem bescheidenen Verständnis sähe die Variablendeklaration in EBNF etwa so aus:
VarDecl := "%" VarName "%" ":" (Value "|")* Value.
VarName := AlNum+.
AlNum := Alpha | Num.
Alpha := 'A'|'B'...'Y'|'Z|'a'|'b'...'y'|'z'.
Num := '0' | '1' ... '8' | '9'.
Value := AnyChar*.
Ist das so richtig? Und wie sollen wir vorgehen, wenn "AnyChar" ein '|' enthält?
Küsschen,
Feenstaub.
Habe ich schon in den Regeln festgelegt, nach meinem letzten Post. %|%. Ist zwar etwas häßlich, aber ich bin nie davon ausgegangen, daß jemand ein | ausgeben will...
p.s. Sorry für den langen Post, aber Compilerbau war eine meiner Lieblingsthemen... damals... vor langer, langer Zeit... in einer weit, weit entfernten Galaxie...
(E)BNF ist auf jeden Fall ein besseres Thema als Programmsemantik.
Klingt interessant. Aber 2 Fragen:
1. Du sagst was von jeder erdenklichen Programmier- oder Skriptsprache? Soll das heißen, dass PHP theoretisch auch erlaubt wäre? Nicht, dass ich vorhätte, das in PHP zu machen.
2. Ist es beabsichtigt, dass die Variablen entgegen jeder (mir bekannten) Regel erst ausgegeben und dann definiert werden? In dem Fall isses zwar ziemlich egal, weil jede Variable nur einmal definiert werden kann, aber trotzdem isses unlogisch und umständlich. Das würde jede Erweiterung der Sprache unmöglich machen.
Jesus_666
31.03.2005, 15:49
Klingt interessant. Aber 2 Fragen:
1. Du sagst was von jeder erdenklichen Programmier- oder Skriptsprache? Soll das heißen, dass PHP theoretisch auch erlaubt wäre? Nicht, dass ich vorhätte, das in PHP zu machen.
Ich habe vor, einen Interpreter in PHP zu schreiben. Jede Programmier- und Skriptsprache, die nicht gerade ein Spezialtool zum Bau von Compilern ist.
2. Ist es beabsichtigt, dass die Variablen entgegen jeder (mir bekannten) Regel erst ausgegeben und dann definiert werden? In dem Fall isses zwar ziemlich egal, weil jede Variable nur einmal definiert werden kann, aber trotzdem isses unlogisch und umständlich. Das würde jede Erweiterung der Sprache unmöglich machen.
Du gehst davon aus, daß es sich um eine Skriptsprache handelt. Es ist aber lediglich eine Spielerei, die nichts anderes tut, als einen String mit Zufallskomponenten auszugeben. Da soll nichts erweitert werden.
Die Notation habe ich übrigens vom Inputformat eins ähnlichen Programms übernommen, das in Perl geschrieben war. Leider habe ich keinen Link oder ein Beispiel.
Jesus_666
01.04.2005, 01:14
Doppelpost weil regelkritisch.
Aus irgendeinem Grund ist noch niemand auf die Idee gekommen, nach der Operatorpräferenz zu fragen. Sprich, ob % oder | Vorrang hat.
Ich sage mal, daß | Vorrang hat, also zurst ausgewertet wird. Immerhin sollen die Variablen ja innerhalb der einzelnen Werte gelten und die Werte werden durch | getrennt.
Auß0erdem habe ich den Kommentar, [tt]%|%[&tt] sei die einzige Möglichkeit, zwischen zwei Prozentzeichen nicht-alphanumerisch zu schreiben, entfernt. Ich gehe nicht ins Detail, aber rein theoretisch gibt es da dieses leere Wort namens Lambda...
Aus irgendeinem Grund ist noch niemand auf die Idee gekommen, nach der Operatorpräferenz zu fragen. Sprich, ob % oder | Vorrang hat.
Ich sage mal, daß | Vorrang hat, also zurst ausgewertet wird. Immerhin sollen die Variablen ja innerhalb der einzelnen Werte gelten und die Werte werden durch | getrennt.Und wie benutzt man dann | in Variablen? Wenn | Vorrang hat wird
%var%:blabla %|% blaja
%var%[0]=blabla%
%var%[1]=% blaWas wiederum zum Parsererror führt.
Jesus_666
01.04.2005, 01:38
Und wie benutzt man dann | in Variablen? Wenn | Vorrang hat wird
%var%:blabla %|% blaja
%var%[0]=blabla%
%var%[1]=% blaWas wiederum zum Parsererror führt.
Guter Eiwand. Ja, da habe ich in der Tat Unsinn gedacht. % hat natürlich Vorrang.
*notiert sich: Nicht mehr spät nachts versuchen, zu denken*
Mir wird das alles zu komplex und seltsam, sorry aber irgendwie ist das ein komisches Thema. Ein klares Ziel wäre schön, dessen Weg dort hin sich jeder selber suchen kann. Das wär ein gutes Contest thema. Aber hier gibt's bald mehr Regeln und Dinge zu beachten als in der deutschen Verkehrsverordnung.
Gute Idee, Sunny. Wollen wir einfach festlegen, dass % und | nicht anders als als Operatoren behandelt werden müssen?
Jesus_666
01.04.2005, 09:08
Gute Idee, Sunny. Wollen wir einfach festlegen, dass % und | nicht anders als als Operatoren behandelt werden müssen?
Nun, sie tun Dinge. Sie sind das, was in dieser kleinen Billigsprache einem Operator am nächsten kommt - aber es ist an sich egal, wie man sie betrachtet.
@Sunny: Ich muß auch zugeben, daß ich das Thema unterschätzt habe. Die Definition selbst einer einfachen nichttrivialen Sprache ist ziemlich aufwendig, weil man Dinge berücksichtigen und explizit angeben muß wie die Reihenflge, in der die Sache verarbeitet wird oder das exakte Format von Variablennamen in Abhängigkeit von der Mondphase.
Wenn ich gewußt hätte, worauf das hier hinausläuft hätte ich wohl einen Rechner mit polnischer Notation verlangt, die ist einfacher zu definieren.
BTW, es ist trotz der Regeln nicht sooo aufwendig, einen Interpreter zu bauen. Ich habe in drei Stunden den kompletten Parser mit allen Fehlerchecks implementiert gekriegt (allerdings in PHP; mal sehen wie's in Java aussehen wird).
Crash-Override
01.04.2005, 12:01
Mhm, also ich finde das Thema *ein bisschen* zu schwierig, und da ich sowie so nicht genügend Zeit finden werde lass ichs für's erste.
[Ich habs soweit das ich unendlich Vars deklamieren könnte, allerdings keine Vars in Vars.
Das ganze dann als Lustige Delphi Konsolen-App mit dem Namen 'Jesus_666-Skript Interpreter' :D)
Feenstaub
01.04.2005, 12:19
Mir wird das alles zu komplex und seltsam, sorry aber irgendwie ist das ein komisches Thema. Ein klares Ziel wäre schön, dessen Weg dort hin sich jeder selber suchen kann. Das wär ein gutes Contest thema. Aber hier gibt's bald mehr Regeln und Dinge zu beachten als in der deutschen Verkehrsverordnung.Ack.
BTW, du kannst statt dem [font]-Tag auch den [tt]-Tag verwenden, den es seit Kurzem gibt. Der ist plattformunabhängiger (nicht jedes Betriebssystem muß eine Courier New-Schriftart haben).Nichts gegen Plattformunabhängigkeit, bin ich auch voll dafür. Aber wenn ich das ganze erst 'ne halbe Stunde entziffern muss, dann verliere ich irgendwann die Lust am Lesen.
Mein Firefox + WinXP stellt das dar:
---------------------
http://www.cylogic.de/downloads/ringcodetag.png
---------------------
BTW, warum hast du es mit dem "|"-Operator so kompliziert und anders gemacht als mit dem %%? Wie ich oben bereits erwähnte, wäre a) die Benutzung des "%"-Zeichen als Escape-Charakter und b) eine geteilte Semantik für die Ausgabezeile und die Variablendeklarationen wesentlich durchschaubarer und auch selbst ohne Syntaxdiagramm mit Worten einfacher zu beschreiben. ... ... (glaube ich zumindest ^^)
Küsschen,
Feenstaub.
Jesus_666
01.04.2005, 13:37
Ack.
Nichts gegen Plattformunabhängigkeit, bin ich auch voll dafür. Aber wenn ich das ganze erst 'ne halbe Stunde entziffern muss, dann verliere ich irgendwann die Lust am Lesen.
Mein Firefox + WinXP stellt das dar:
---------------------
http://www.cylogic.de/downloads/ringcodetag.png
---------------------
BTW, warum hast du es mit dem "|"-Operator so kompliziert und anders gemacht als mit dem %%? Wie ich oben bereits erwähnte, wäre a) die Benutzung des "%"-Zeichen als Escape-Charakter und b) eine geteilte Semantik für die Ausgabezeile und die Variablendeklarationen wesentlich durchschaubarer und auch selbst ohne Syntaxdiagramm mit Worten einfacher zu beschreiben. ... ... (glaube ich zumindest ^^)
Küsschen,
Feenstaub.
Hm, scheint doch recht häufig zu sein, daß eine Schriftgröße Unterschied sich extrem äußert. Ich werde mal Chocwise bitten, daß er den [tt]-Tag auf die normale Schriftgröße zurcksetzt und bei mir clientseitig die Schrift verkleinern.
Ich will statt %| %|%, weil das die Überprüfung auf nicht-geschlossene Variablennamen einfacher macht. Im Nachhinein wäre \ als Escapezeichen vielleicht doch keine schlechte Idee gewesen. Wenn genug Leute dafür sind ändere ich meinetwegen die Regeln nochmal - die sind ja sowieso noch im Fluß.
Was meinst du mit geteilter Semantik?
\ als Escapezeichen = gut.
Die erste Zeile beinhaltet einen Text, der ausgegeben werden soll. Im Text können sich Variablen im Format %Variablenname% befinden
Alle darauffolgenden Zeilen beinhalten Variablendefinitionen im Format %Variablenname%:Wert|Wert|Wert...
Dazu hab ich mal eine Frage?
Darf man den Interpreter auch so bauen, dass er in allen Zeilen (nicht nur in der ersten) Text erlaubt und ebenso auch in der ersten Zeile Variablendefinitionen? Es würde für mich nämlich mehr Aufwand bedeuten, das ganze nur mit Text in der erste Zeiel zu machen.
Und ich wäre für den Backslash (\) als Escape-Zeichen, weil ich die Interpretation bei %|% ziemlich schwierig finde. Beispiel:
%Variable%:%%Variable%|%Variable%%|%%
Manni
Jesus_666
01.04.2005, 15:08
Dazu hab ich mal eine Frage?
Darf man den Interpreter auch so bauen, dass er in allen Zeilen (nicht nur in der ersten) Text erlaubt und ebenso auch in der ersten Zeile Variablendefinitionen? Es würde für mich nämlich mehr Aufwand bedeuten, das ganze nur mit Text in der erste Zeiel zu machen.
O_o Das kann ich irgendwie nicht nachvollziehen. Inwiefern soll es einfacher sein, für jede Zeile überprüfen zu müssen, ob es sich um Text oder eine Variablendefinition handelt, als die erste Zeile auszusortieren und einfach den Rest als Variablendefinitionen zu betrachten?
Und ich wäre für den Backslash (\) als Escape-Zeichen, weil ich die Interpretation bei %|% ziemlich schwierig finde. Beispiel:
%Variable%:%%Variable%|%Variable%%|%%
Manni
Okay, ich ändere es. Hoffentlich bleibt die Definition danach stabil...
Feenstaub
01.04.2005, 16:36
Hm, scheint doch recht häufig zu sein, daß eine Schriftgröße Unterschied sich extrem äußert. Ich werde mal Chocwise bitten, daß er den [tt]-Tag auf die normale Schriftgröße zurcksetzt und bei mir clientseitig die Schrift verkleinern.Danke, Jesus. Das wäre eine grosse Hilfe. BTW, wie veränderst du clientseitig die Schriftgrösse? Ich kannte bisher nur das bekannte Strg+Mausrad bei Firefox? Das verändert aber das gesamte Schriftbild.
Ich will statt %| %|%, weil das die Überprüfung auf nicht-geschlossene Variablennamen einfacher macht.Wieso dass denn? Jede Variablendeklaration beginnt mit %, dann muss mind. 1 bis max. 255 alphanum. Zeichen folgen, Abschluss bildet ein %, dann kommt ein darauffolgender Doppelpunkt, dann die Variablenwerte. Ich sehe da kein Problem. Oder meinst du die Referenzen innerhalb der Wertedefinition? Dann hast du natürlich recht. Andererseits ist es ja üblich und auch einfach zu implementieren, dass der Tokenizer Escapezeichenfolgen erkennen kann. Da würde sich eine Zweizeichenvorschau (wie bei %|%) sogar erschwerend bei der Implementierung auswirken... glaube ich.
Im Nachhinein wäre \ als Escapezeichen vielleicht doch keine schlechte Idee gewesen. Wenn genug Leute dafür sind ändere ich meinetwegen die Regeln nochmal - die sind ja sowieso noch im Fluß.Das ist mir egal. Dein Contest, deine Entscheidung. ^^ Mir würde auch ein % als Escapezeichen reichen. Aber alles, was den Quelltext (der von deiner entwickelten Sprache) lesbarer macht, ist super.
Was meinst du mit geteilter Semantik?Ausgabezeile und Variablendeklarationen könnten je eine eigene Semantik besitzen. Für Ausgabezeilen hat ja auch deine Syntax absolut zugereicht. Einziges Sonderzeichen ist %, dass entweder einen Variablennamen einleitet, oder eben das Prozentzeichen charakterisiert mit %%. Probleme gibt es ja nur bei den Deklarationen (und da nur in der Variablenwertedefinition), weil wir % für Referenzen auf andere Variablen verwenden, % als eigenständiges Zeichen haben müssen, | trennt die Werte und | muss auch als Zeichen verwendbar sein. Daher meinte ich, dass die erste Zeile nicht unbedingt dieser auszuklügelnden Syntax der VarDecl. entsprechen muss. Andererseits sollte die Sprache in sich vielleicht geschlossen sein? *kopfkratz* Hm... na, du wirst das schon machen. Jedenfalls meinte ich das mit der geteilten Semantik.
Küsschen,
Feenstaub.
p.s. Ich habe jetzt bei Firefox auch Einstellungen für Font&Color gefunden *kopfklatsch*. Na ja, danke trotzdem, @Jesus, für deine Bemühungen.
Jesus_666
01.04.2005, 16:46
Danke, Jesus. Das wäre eine grosse Hilfe. BTW, wie veränderst du clientseitig die Schriftgrösse? Ich kannte bisher nur das bekannte Strg+Mausrad bei Firefox? Das verändert aber das gesamte Schriftbild.
Ich benutze einen Filter (http://www.buerschgens.de/Prox/) für sowas.
Wieso dass denn? Jede Variablendeklaration beginnt mit %, dann muss mind. 1 bis max. 255 alphanum. Zeichen folgen, Abschluss bildet ein %, dann kommt ein darauffolgender Doppelpunkt, dann die Variablenwerte. Ich sehe da kein Problem. Oder meinst du die Referenzen innerhalb der Wertedefinition? Dann hast du natürlich recht. Andererseits ist es ja üblich und auch einfach zu implementieren, dass der Tokenizer Escapezeichenfolgen erkennen kann. Da würde sich eine Zweizeichenvorschau (wie bei %|%) sogar erschwerend bei der Implementierung auswirken... glaube ich.[/url]
Wurde bereits geklärt, siehe ein paar Threads weiter oben.
[quote]Ausgabezeile und Variablendeklarationen könnten je eine eigene Semantik besitzen. Für Ausgabezeilen hat ja auch deine Syntax absolut zugereicht. Einziges Sonderzeichen ist %, dass entweder einen Variablennamen einleitet, oder eben das Prozentzeichen charakterisiert mit %%. Probleme gibt es ja nur bei den Deklarationen (und da nur in der Variablenwertedefinition), weil wir % für Referenzen auf andere Variablen verwenden, % als eigenständiges Zeichen haben müssen, | trennt die Werte und | muss auch als Zeichen verwendbar sein. Daher meinte ich, dass die erste Zeile nicht unbedingt dieser auszuklügelnden Syntax der VarDecl. entsprechen muss. Andererseits sollte die Sprache in sich vielleicht geschlossen sein? *kopfkratz* Hm... na, du wirst das schon machen. Jedenfalls meinte ich das mit der geteilten Semantik.
Äh, die erste Zeile (die einzige Zeile, die ausgegeben wird) hat ja ein eigenes Format... Der komplette Text der Zeile wird (nach Verarbeiten der Variablen) ausgegeben. Den Kram mit den Escapezeichen habe ich ja auf \ umgestellt, das dürfte etwas übersichtlicher sein.
So, hab meinen Interpreter fertig (in PHP geschrieben).
Soll ich den Quellcode jetzt hier posten?
Wenn ja, editier ich ihn rein...
Jesus_666
01.04.2005, 17:42
Warte noch 'ne Weile. Wir sammeln den Kram erst gegen Ende ein.
Wieso müssen die wichtigsten Threads immer dann aufgemacht werden, wenn ich gerade mal 'ne Woche nicht ins Forum kann?
Ein paar Fragen hab ich noch, das meiste hat sich beim Lesen des Threads geklärt:
1. Wann ist der Contest genau zu Ende? Die Angabe "Ende April" ist etwas ungenau.
2. Was mache ich, wenn mein Output mit einem Leerzeichen beginnen soll? Die werden ja ignoriert. Vielleicht sollte man die Möglichkeit haben, Leerzeichen (und Tabs) am Zeilenanfang zu maskieren.
Jesus_666
03.04.2005, 13:16
Dann gibt es meinetwegen auch noch \ . Ehrlich gesagt ist mir die Sprache jetzt schon viel zu aufwendig - vor Allem die Einführung von \ als Escapezeichen hat die Verarbeitung um ein Vielfaches schwerer gemacht... Mein Interpreter wird garantiert nicht alle Auflagen erfüllen - und ich denke ernsthaft darüber nach, alles bis auf das absolute Minimum optional zu machen. Wer den meisten Kram interpretiert wird wohl auch die meisten Stimmen kriegen...
Das Ende für den Contest habe ich nicht festgelegt, weil der Anfang auch nicht festliegt. Bis jetzt ist ja nicht mal die Sprachspezifikation länger als ein paar Stunden am Stück konstant.
Hm, noch ein weiteres Zeichen, das man escapen können sollte: was ist, wenn mein Output mit # beginnen soll? Laut Spezifikation wäre das ein Kommentar, also müsste \# auch noch gehen.
Jesus_666
04.04.2005, 17:06
Sicher. Warum nicht. *nachtrag*
Vielleicht sollten wir noch \0x**** einfügen, um beliebige Unicode-Zeichen darzustellen. Nur um sicherzugehen.
Ich werde jetzt übrigens wirklich einen guten Teil der Sache optional machen - die Spezifikationen sind mit den ganzen Ausnahmen eher abschreckend. Eine komplette Sprache ist nett, aber ich bevorzuge eine, die man tatsächlich umsetzen kann, ohne dabei wie ein bulimisches Mädchen zum Klo zu rennen.
Wenn das eh schon optional ist, kann man auch noch \n einführen, falls jemand mehrzeiligen Output erzeugen will.
Jesus_666
05.04.2005, 20:34
Nachgetragen.
Öhm, jetzt haben wir eine seit 16 Tagen unveränderte Sprachdefinition.
Kommt demnächst mal ein Abgabedatum?
Jesus_666
21.04.2005, 20:21
Hmm, schmeißt den Kram mal hier in den Thread; Montag mache ich dann einen Abstimmthread auf.
Ich würde es bevorzugen, wenn ihr euren Code selbst hostet und hier nur die Dateien verlinkt.
http://home.arcor.de/dthorm/progforum/contest_02/
ich bin nicht mehr weiter gekommen mim kommentieren. vielleicht mach ichs morgen noch mal weiter.
dead_orc
21.04.2005, 21:26
Dann habe ich hiermit wohl die Ehre, als Erster meinen Code vorzustellen:
http://home.arcor.de/getoeteter_ork/rpg-ring/parser.php
Wie der Link schon vermuten lässt, ist mein Interpreter in PHP geschrieben und für die Konsolenanwendung gedacht. Änderungen des Codes bis Montag noch vorbehalten. (Diese Änderungen umfassen keinesfalls das Einfügen von Code anderer)
[EDIT]
DAMN IT! Zu langsam!
me > dead_orc.
BTW: Dein Interpreter sieht so klein und schlank aus im Gegensatz zu meinem. o_o
Naja.
Ich habs ja mehr oder minder mit Absicht gemacht. ^^
boah, ich hab seit ich meinen interpreter geschrieben hab voll viel neues gelernt, meinen style geändert und finde den interpreter jetzt total scheiße o.o!
Hm, bis Montag...
War eigentlich auf ca. 'ne Woche mehr vorbereitet, mal sehen, ob ich's schaffe (morgen hab ich auf jeden fall keine Zeit).
Naja, wird schon werden.
Joa, hier mal meiner:
http://mannithedark.ma.funpic.de/Interpreter/
Ist auch mit PHP gemacht ;)
(in der interpreter.php.txt steht der Quellcode)
Hier (http://mannithedark.ma.funpic.de/Interpreter/interpreter.php?file=test.txt) mal ein Beispiel ;)
Manni
PS: Meiner ist ehr aufs Internet ausgelegt ;)
Öhm, kleine Regelfrage noch:
Auf der ersten Siete ist die Frage aufgetaucht, was man mit
Dies ist eine Zeile %%
%Bla%:fumacht. Damals war die Planung, % als Escapezeichen zu benutzen, aber das wurde ja wieder verworfen. Wie muss der korrekt Output jetzt lauten (oder muss das 'ne Fehlermeldung ausspucken)?
Jesus_666
22.04.2005, 20:06
Öhm, kleine Regelfrage noch:
Auf der ersten Siete ist die Frage aufgetaucht, was man mit
Dies ist eine Zeile %%
%Bla%:fumacht. Damals war die Planung, % als Escapezeichen zu benutzen, aber das wurde ja wieder verworfen. Wie muss der korrekt Output jetzt lauten (oder muss das 'ne Fehlermeldung ausspucken)?
Wird als nicht definierte Variable mit leerem Inhalt verarbeitet, würde ich sagen.
Ja, damit sind %% und \% äquivalent, aber IMO ist es auf diese Weise konsequent. Ihr wolltet ja unbedingt Backslashes...
Ja, damit sind %% und \% äquivalent
Ich dachte, bei nicht definierten Variablen wird der komplette Name inklusiv der beiden %-Zeichen ausgegeben. Demnach wäre %% äquivalent zu \%\%, oder übersehe ich da mal wieder irgendwas total simples?
Jesus_666
22.04.2005, 20:23
Ich dachte, bei nicht definierten Variablen wird der komplette Name inklusiv der beiden %-Zeichen ausgegeben. Demnach wäre %% äquivalent zu \%\%, oder übersehe ich da mal wieder irgendwas total simples?
Du hast natürlich recht.
http://kx49.de/lukas/ring/progcontest/apr05.py.txt
Mit den Kommentaren hab ich etwas übertrieben...
Bestimmt nicht der beste Interpreter, aber dabei sein ist alles ;)
Edit:
Diese (http://kx49.de/lukas/ring/progcontest/crash.jeez) Datei crasht alle Interpreter im Contest (meinen eingeschlossen). Das zu umgehen wäre aber zu aufwändig und zu rechenintensiv, deshalb hab ich's nicht gemacht.
dead_orc
25.04.2005, 13:41
Über die Problematik der von dir geposteten Datei habe ich auch schon nachgedacht, dann aber gesagt, dass ich eh nicht gewinne und ich mir dann auch nicht stundenlang den Kopf darüber zerbrechen muss. Man könnte natürlich eine maximale Anzahl der zu ersetzenden Variablen bestimmen, aber das würde die Funktion der "Sprache" IMO sehr einschränken...
Tja, die Datei beweist, dass es nötig ist, eine feste Bearbeitungsreihenfolge festzulegen. Dann wär die Sache gar kein Problem und der Interpreter würde für nocht nicht definierte Variablen 0 bzw. "" annehmen. Folge wäre eine leere Ausgabe.
Mein Vorschlag für den nächsten Contest wäre deshalb noch mal die gleiche Aufgabe, aber mit einer sauber definierten Sprache, die auch etwas mehr kann als nur eine einzelne Zeile ausgeben.
Ich glaube, das wäre etwas langweilig. Für den nächsten Contest sollte was anderes kommen.
Außerdem müsste man die Sprache stark umkonzipieren, um mehr als einen Output zu erzeugen, die einzige halbwegs simple Möglichkeit wäre, Ausdrücke in den Strings zu erlaube (wie z.B. #{xy} in Ruby).
btw, wann kommt die Umfrage?
Jesus_666
25.04.2005, 14:58
Tja, die Datei beweist, dass es nötig ist, eine feste Bearbeitungsreihenfolge festzulegen. Dann wär die Sache gar kein Problem und der Interpreter würde für nocht nicht definierte Variablen 0 bzw. "" annehmen. Folge wäre eine leere Ausgabe.
Mein Vorschlag für den nächsten Contest wäre deshalb noch mal die gleiche Aufgabe, aber mit einer sauber definierten Sprache, die auch etwas mehr kann als nur eine einzelne Zeile ausgeben.
Die Sprache SOLL NICHTS ANDERES TUN, als eine Zeile auszugeben. Ziel des Contests war es, anhand einer einfachen Sprache die Konstruktion eines Parsers durchzuführen, nicht die Erfindung einer neuen Skriptsprache.
Falls ich einen zweiten Parsingcontest mache wird das nächste Mal wohl eine Sprache verwendet werden, die einfach ist und keine direkte Funktion hat, beispielsweise normale EBNF oder ein XML-Derivat. Die hier verwendete Sprache war der Versuch, BNF mit einer Ausgabe zu kombinieren, damit man sie auch interpretieren kann.
Nicht jede Sprache soll etwas tun, bei Weitem nicht. Und nicht jede Sprache, die etwas tut, ist eine Skriptsprache.
Das Problem mit der unendlichen Rekursion war mir übrigens von Anfang an bekannt; ich habe es ignoriert, weil diese Sprache nicht übermäßig komplex werden sollte - immerhin sollte das Ding einfach nur einen verdammten String ausgeben! Am Ende ist sie es dann doch geworden...
Ich glaube, das wäre etwas langweilig. Für den nächsten Contest sollte was anderes kommen.
Außerdem müsste man die Sprache stark umkonzipieren, um mehr als einen Output zu erzeugen, die einzige halbwegs simple Möglichkeit wäre, Ausdrücke in den Strings zu erlaube (wie z.B. #{xy} in Ruby).
Exakt. Die Sprache ist darauf ausgelegt, eine Zeile auszugeben. Das Interpretieren einer kompletten Skriptsprache ist nicht Sinn dieses Contests. Die Sinnhaftigkeit der Sprache steht nicht wirklich zur Debatte, weil der einzige Sinn der Sprache darin liegt, in diesem Contest verwendet zu werden.
Ich denke allerdings darüber nach, für den nächsten Contest einfach 3am etwas komplexer zu machen und das dann hier reinzusetzen, in EBNF. Die Sprache kann immerhin komplexere Skripte ausführen, sie hat Unterstützung für beliebigen Output und sie hat einen Sinn: Obskurer als Brainfuck zu sein.
btw, wann kommt die Umfrage?
Ich mache sie auf, wenn ich wieder zuhause bin. Ein bißchen was will ich in dieser Vorlesung noch mitkriegen...
dead_orc
25.04.2005, 16:56
@Dingsi:
Hm, ich habe glaube ich einen Fehler in deinem Interpreter gefunden:
%tot%
#%tot%:%tot%
Erzeugt den Fehler
Error: Unexpected '#' expecting %
was laut Spezifikationen von Jeez nicht passieren dürfte. Oder hab ich was falsch verstanden?
PS: Mein Interoreter hat da auch nen Fehler :(
Der Output ist statt "%tot%" "(4xLeerzeichen)%tot%". Schlimm?
Naja, wie lange geht so ne Vorlesung? Ich find Dingsis Interpreter nämlich glaube ich am besten, da er in C++ geschrieben ist (auch wenn das ja AFAIK nicht in die Bewertung eingehen sollte).
Naja, wie lange geht so ne Vorlesung?
Jeez hat vor knapp zwei Stunden im IRC gesagt, dass die Vorlesung fast vorbei sei.
Ich würde übrigens wahrscheinlich für deinen Interpreter stimmen, orc (allerdings werde ich mir alle nochmal genauer angucken); C++ ist für mich kein Grund und deiner wirkt bisher irgendwie am elegantesten.
In meinem hast du keine Fehler gefunden? Oder hast du keinen Python-Interpreter oder warst zu faul zum testen?
dead_orc
25.04.2005, 17:43
Ich habe keinen Python-Interpreter und bin zu faul (mir einen zu besorgen). Mannis werd ich mir wohl noch angucken...
Aber danke für deine Stimme, wenn du sie mir wirklich gibst! Und hast wohl recht, C ist eigentlich ne Sprache wie alle anderen auch und nix besseres.
*MannisInterpreterkopiertundausprobiert*
Update:
OMG! Kaum ruf ich das Teil zum ersten Mal auf, springen mich zwei Fehler an:
Notice: Undefined variable: text in e:\eigene dateien\homepage\janphilipp\php\manni.php on line 32
Notice: Undefined variable: text in e:\eigene dateien\homepage\janphilipp\php\manni.php on line 61
IMHO sollte der Code auch sauber sein, was er damit IMO nicht ist. Außerdem wird bei diesem Input
%tot%
#%tot%:%tot%
folgende Fehlermeldung generiert:
Warnung: Unbekannte Variable %tot%
Nicht abgeschlossene Variable gefunden
was wieder nach Jeez' Spezifikationen nicht gültig ist. (LOL, ich mach hier den Check für alle Interpreter ^^)
Außerdem habe ich das Gefühl, dass insgesamt nur eine Fehlermeldung definiert ist (hab bisher immer nur die oben stehende bekommen!)
Update²:
Toll, jetzt wurde schon die Umfrage eröffnet!
@Jesus_666: Kannste vielleicht des Komfort halber noch einen Link in die Umfrage in diesen Thread machen?
Jesus_666
25.04.2005, 17:45
http://forum.worldofplayers.net/forum/showthread.php?p=980822
Von der Uni brauche ich immer ca. anderthalb Stunden nach hause, FYI.
Powered by vBulletin® Version 4.2.3 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.