[Taschenrechner]

    • Beta
    • Closed Source

    Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von RushDen.

      [Taschenrechner]

      Name:
      Taschenrechner

      Beschreibung:

      Ich hab seit einiger Zeit mich mit dem Thema Compilerbau beschäftigt und damit einen erweiterten Taschenrechner erstellt, der Variablen (also zur Laufzeit), Verzweigungen, Schleifen etc. unterstützt. Außerdem hat er die üblichen Funktionen (*,-,/,+,(),!,%,sin,tan,cos,log,log10,|,&,~,^, >, <, equals, etc.) und auch Kommentare sind möglich (mit ' eingeleitet)

      Ein Beispiel-Code für die Fibonacci Zeichenfolge:

      equals(n, 0) ? n = 7;' Wievielte Fibonacci Zahl? (Anzahl der Iterationen)
      equals(x, 0) ? x = 0;
      equals(y, 0) ? y = 1; 'Variable für Ergebniss
      n#(temp = x) + (x = y) + (y = temp + y); 'Der komplette Algorithmus in einer Zeile
      x;

      Damit wird der 7. Fibonacci Wert angegeben (n), der dazugehörige Syntaxbaum wird ebenfalls ausgegeben (Für jede Zeile ein Syntaxbaum).
      Wenn man die Schleife wegmacht (n#), kriegt man jeden Fibonacci Wert nacheinander.

      Die Methoden und Regelungen stehen alle im Programm drinne (s. Screenshot) (GUI ist jz nich so hübsch, war mir aber unwichtig)

      Wichtig: Dezimalzahlen mit einem PUNKT trennen.
      Außerdem bedeutet Semikolon = Ende der Anweisung. Die Verzweigung kann auch über mehrere Zeilen gehen.
      Zuweisungen sind mit = und : möglich. Genauso kann als Klammer entweder [] oder () genutzt werden (auch beides gemixxt, also "blaabla ( bla ]" geht.)
      Neue Operatoren können leicht hinzugefügt werden (Um ein Enum erweitern und im Syntaxbaum die Berechnungsmethode ergänzen)

      Screenshot(s):



      Verwendete Programmiersprache(n) und IDE(s):
      C#, Visual Studio 2013 Professional

      Systemanforderungen:
      .NET Framework 4.0

      Systemveränderungen:
      Nix
      Dateien

      Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „RushDen“ ()

      Interessanter und vor allem komplett anderer Ansatz.
      Dürfte man sich den Source denn mal anschauen? Wäre sicher ganz interessant und vorteilhaft, wenn es sogar OpenSource wäre.

      Für gewöhnlich werden derartige Parser nämlich ja mit der RPN bewerkstelligt, die recht vorteilhaft ist, um Postfix-Tokens auf dem Stack nacheinander durchzuarbeiten und dann ein Ergebnis zu bekommen. Vor allem ist die Postfix-Notation sehr vorteilhaft, da sie so simpel ist. Hier ist's ja jedoch viel mehr ausgeweitet und ich könnte mir denken, dass da weit mehr Komplexität dahinter steckt.
      Werden die Expressions also durch einen Compiler gejagt und dann entsprechend abgearbeitet oder wie? Ich habe mich noch nie mit dem Thema beschäftigt.

      Auf jeden Fall ist das sicher gute Arbeit. :thumbup:

      Grüße
      #define for for(int z=0;z<2;++z)for // Have fun!
      Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

      Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
      Die ganze Projektmappe ist hochgeladen, also ja der Source ist mitdrin.
      Das ganze ist im Grunde in Phasen eingeteilt:

      Am Anfang wird jedes Zeichen in der lexikalischen Analyse durchgegangen und in Tokens umgewandelt. Dabei werden Kommentare (alles nach '), Leerzeichen etc. entfernt und z.B. Zahlen, Bezeichner erkannt. Dazu hab Ich dann eine einfache Automatenklasse modelliert, wo dann jenach verschiedenen Zuständen, verschiedene Zeichen als solche erkannt werden.
      In der nächsten Phase ist dann die Überführung in einen Syntaxbaum, dazu haben alle Tokens eine Priorität, Beschreibung und manche auch Anzahl der Operatoren. Bis dahin also wie ein Compiler, nur die Codeerzeugung wird übersprungen und stattdessen wird der Baum ausgewertet (Die Knoten rufen die Auswertung ihrer Kinderknoten und die ihrer Kinderknoten.. solange bis der Knoten eine Zahl (d.h. ein Blatt) ist und dieser gibt den Wert zurück, woraufhin die Operationen rückwirkend ausgeführt werden und damit sich das Ergebniss berechnet).
      Bis lang ist das ganze noch ziemlich klein, aber werde auch mal versuchen Schleifen einzufügen, soll ja aber ein Taschenrechner bleiben und keine Programmiersprache werden.