Frage

Die Frage ist: Angenommen, ich habe eine Eingabefunktion wie sin(2-cos(3*A/B)^2.5)+0.756*(C*D+3-B) mit einem BNF angegeben, werde ich analysieren Eingangs rekursiven Abstiegs-Algorithmus verwendet, und wie kann ich dann verwenden oder ändern Dijkstra-Algorithmus diese bestimmte Funktion zu behandeln? Ich brauche es mit der Sünde ausführen | cos | sqrt | ln, wo Dijkstra-Algorithmus sollte die Arbeit machen.

EDIT: Kann sein, ich bitte auch sollte: Was ist die beste Praxis oder Datenstruktur gegebene Funktion darstellen?

EDIT: Eingabesatz als erworben werden:

C 0.01 .01 .02 .04 .08 .02 .02 .04 
A .016 .008 .116 .124 .147 .155 .039 .023  
D .012 .025 .05 .1 .1 .1 .025 .012000 .012
B .007 .007 .015 .022 .029 .036 .044 .051 .058 .066 .073 .080 

EDIT: Rangierbahnhof ist der Algorithmus Eingabefunktion RPN zu konvertieren, aber wie kann ich es erweitern eine andere Funktion wie die Sünde akzeptieren | cos | sqrt | ln? Hat rekursiven Abstiegs liefert zu Rangierbahnhof erforderliche Erweiterung?

War es hilfreich?

Lösung

Ich nehme an, Sie sprechen über Dijkstra Rangierbahnhof Algorithmus?

Um die umgekehrte polnische Notation (Ausgabe von Rangierbahnhof) auszuwerten, normalerweise ein Stapel verwendet wird.

Rangierbahnhof erdacht wurde die Analyse in Algol Ich glaube, zu tun, und ich glaube, dass es an die Arbeit mit allen möglichen Funktionen soll (entweder feste oder variable Anzahl von Argumenten).

Hier ist ein Blog-Post, die es näher erklärt: http://www.kallisti.net.nz/blog/2008/02/extension-to-the-shunting- Yard-Algorithmus zu ermöglichen variablen-Nummern-of-Argumente-to-Funktionen /

Andere Tipps

Ich sehe Dijkstra hier nicht, da sie dazu verwendet werden, um den kürzesten Weg in einem Graphen mit nicht negativen Gewichten zu finden.

Sie Fall, dass Sie über einen Rekursiver Abstieg zu sprechen, ist die Art LL (k), und es wird durch eine Grammatik ähnlich wie

definiert
expression ::= term + term | term - term
term ::= factor * factor | factor / factor
factor ::= ident | number

number ::= digit | digit number
digit ::= 0 | 1 | 2 ...

die beste Datenstruktur diese Art von Informationen in der Regel zu speichern, ist ein Abstract Syntax-Baum , die ein Baum ist, die die Struktur des Codes repliziert es analysiert. In Ihrem Beispiel müssen Sie eine andere Struktur oder Klasse für verschiedene Teile des Codes: BinaryOperation, Ident, Number, UnaryOperation, FunctionCall enden etwas mit wie

                         BinaryOperation +
                          |            |
                                     BinaryOperation *
                                      |            |
                                    Number       BinaryOperation +
                                      |           |
                                     0.756     BinOp *
                                               |    |
                                             Ident Ident
                                               |    |
                                               C    D

EDIT: Haben Sie nicht wissen, dass Rangieren-Yard von Dijkstra erfunden wurde! Im übrigen ist es ein ganz einfacher Algorithmus wie Moron erklärt .. Sie nie etwas Neues!

aufhören zu lernen

Verwenden Sie ANTLR mit einer Grammatik ähnlich dem Jack zur Verfügung gestellt. Es sollte ausreichen, um einen guten Parser in mehreren Sprachen zu erstellen: Java / C / C ++ / Python / etc. Lesen Sie einige Beispiele und Tutorials. Sie sollten verwenden ANTLRWorks für schnelleren Ausdruck Verifikation.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top