Seite 1 von 4 1234 LetzteLetzte
Ergebnis 1 bis 20 von 72

Thema: Contest: Interpretieren einer Datei

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1

    Contest: Interpretieren einer Datei

    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.
    1. Der Input muß aus einer Datei einlesbar sein; andere Eingabemethoden sind optional
    2. Die erste Zeile beinhaltet einen Text, der ausgegeben werden soll. Im Text können sich Variablen im Format %Variablenname% befinden
    3. Alle darauffolgenden Zeilen beinhalten Variablendefinitionen im Format %Variablenname%:Wert|Wert|Wert...
    4. Alle Variablen sind Arrays von Strings. Wenn eine Variable irgendwo verwendet wird, wird ein zufälliger Wert aus der Variablendefinition verwendet
    5. Variablennamen sind alphanumerische Zeichenketten mit einer Länge von 1 bis 255.
    6. Nicht abgeschlossene Variablen sind Fehler. Beispiel: Ich bin ein %ding
    7. % wird vor | ausgewertet
    8. Jede Variable darf nur einmal definiert werden
    9. 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)
    10. Es darf Verweise auf Variablen geben, die nicht definiert sind. In diesem Fall ist der Variablenname mit Prozentzeichen unverändert zu übernehmen
    11. 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 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:

    Code:
    Ich habe eine%Tier%.
    %Tier%:n Hund| Katze
    Diese einfache Datei kann als Output entweder Ich habe einen Hund. oder Ich habe eine Katze. erzeugen.


    Code:
    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


    Code:
    %tot%
    %tot%:%tot%
    Das hier sollte der Interpreter mit einer Fehlermeldung quittieren, weil die Variable in jedem Wert einen Selbstverweis enthält.


    Code:
    Baum
    %tot%:%tot%
    Auch wenn die Variable %tot% nirgends verwendet wird muß der Interpreter den Input zurückweisen, wenn eine derartige Definition drinsteht.


    Code:
    %tot%
    #%tot%:%tot%
    Diese Version funktioniert: Zeilen mit # am Anfang gelten als Kommentare; der Output wäre also %tot%.


    Code:
       %tot%
       #%tot%:%tot%
    Dieser Input ist mit dem letzten identisch, was die Verarbeitung angeht: Whitespace am Anfang von Zeilen wird ignoriert.


    Code:
    %tot%
    %tot:Brot
    In der zweiten Zeile fehlt ein %. Auch davon sollte dem Interpreter schlecht werden.

    Geändert von Jesus_666 (05.04.2005 um 20:34 Uhr) Grund: Escapezeichen überarbeitet

  2. #2
    Ich nehme an lex/flex und yacc/bison dürfen nicht verwendet werden? Ansonsten. Auf ins Gefecht. >:D.

  3. #3
    Zitat Zitat von Dingsi
    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.

  4. #4
    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
    Code:
    Ich habe eine%Tier%.
    %Tier%:n Hund| Katze
    Muss man eine oder beide Varianten ausgeben?

  5. #5
    Zitat Zitat von Crash-Override
    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.

    Zitat Zitat
    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.

    Zitat Zitat
    Und bei
    Code:
    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).

  6. #6
    Zitat Zitat von Jesus_666
    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

  7. #7
    Zitat Zitat von Rolus
    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.


    Zitat Zitat von mr_byte
    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.

  8. #8
    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?

  9. #9
    Zitat Zitat
    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.

  10. #10
    Was ist mit
    Code:
    Ich habe eine Tier%.
    %Tier%:n Hund| Katze
    ? Auch einfach ausgeben, wie bei unbekannten Variablen?

  11. #11
    Schäze mal ja, da die variable nicht abgeschlöossen ist...

  12. #12
    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:
    Code:
    Dies ist eine Zeile %%
    %Bla%:fu
    Zählt die Variable oben als Variable, mit einem leeren Namen, oder ist sowas auch eine fehlerhafte Eingabe?

  13. #13
    Zitat Zitat von MagicMagor
    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.

  14. #14
    Zitat Zitat von MagicMagor
    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.

    Zitat Zitat
    Was mich eher interessiert ist folgender Fall:
    Code:
    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ß.

    Zitat Zitat von Dingsi
    Noch was. Meiner Meinung nach müssen % noch escaped werden können. Damit man auch % um Wörter benutzen kann die eigentlich Variablen sind:
    Code:
    Zum Beispiel: \%var\% ist %var%
    %var%:eins|zwei|drei
    Und dafür mißbrauchen wir jetzt einfach %%. Hach, manchmal ist das Leben so einfach...

  15. #15
    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.

  16. #16
    Noch was. Meiner Meinung nach müssen % noch escaped werden können. Damit man auch % um Wörter benutzen kann die eigentlich Variablen sind:
    Code:
    Zum Beispiel: \%var\% ist %var%
    %var%:eins|zwei|drei

  17. #17
    Zitat Zitat von Dingsi
    Noch was. Meiner Meinung nach müssen % noch escaped werden können. Damit man auch % um Wörter benutzen kann die eigentlich Variablen sind:
    Code:
    Zum Beispiel: \%var\% ist %var%
    %var%:eins|zwei|drei
    Vll noch Datenbank anbindung rein?

    Ist doch eh nur ne Pseudo-Sprache, wer will da schon echt was mit proggen...

  18. #18
    Zitat Zitat von Crash-Override
    Vll noch Datenbank anbindung rein?
    Gute Idee. Eigentlich bräuchte man nur Sockets. Dateiein- und ausgabe kann man dann ja auch über z.b. FTP oder HTTP machen..
    Code:
    # 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

  19. #19
    Was ist mit leeren Variablen?
    Code:
    omg lol lol!11
    %var%:
    Vergesst es. Muss richtig sein, wenn
    Code:
    omg lol%var%
    %var%:1%var|!%var|
    auch richtig ist.

    Geändert von Dingsi (30.03.2005 um 14:51 Uhr)

  20. #20

    Users Awaiting Email Confirmation

    Hallo @all,

    Inwieweit sind libraries erlaubt? C-Runtime? C++-StandardLib?

    Küsschen,
    Feenstaub.

    [EDIT]
    Zitat Zitat von Jesus
    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
    [/EDIT]

    Geändert von Feenstaub (30.03.2005 um 21:59 Uhr)

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •