5

Ich schaffe einen Parse-Baum, die Ausdrücke ähnlich wieUnary Und Binary Minus in Parse-Baum

3 - 4 * 8

oder

8 * -5

oder

-(10 * 1)

enthalten

Ich brauche eine Möglichkeit, zwischen dem unären und dem binären Minus zu unterscheiden. Die Art, wie meine Grammatik läuft, ist jetzt das binäre Minus, aber ich denke daran, das zu ändern und eine Flag-Variable hinzuzufügen, die die letzte Variable enthält.

Ex: wenn es hält 5 5 - 6

Die Flagge ist und wenn es minus und die Flagge sieht eine Zahl die überspringen einstellige und auf binäre gehen.

Allerdings bin ich nicht sicher, wie dies in C++ würde

Jede Hilfe sehr zu schätzen, zu implementieren.

Dank

+1

Haben Sie eine Art und Weise bedeuten, sie zu unterscheiden, wie Sie das Parsen tun, oder einen Weg, um sie in der Parse zu unterscheiden Baum? In der Parse-Struktur ist es trivial - haben Sie nur separate "UNARY_MINUS" - und "BINARY_MINUS" -Operatoren. Wenn Sie meinen, während Sie analysieren, tritt ein unäres Minus auf, wenn Sie einen Operanden und keinen Operator erwarten. –

+0

In meinem Parser möchte ich zwischen a-5 und 4 -5 unterscheiden. Mein nächster Teil konvertiert die Blätter dieses Baums in einen AST-Baum (der funktioniert), aber mein Parser sieht alles als binäres Minus (4 - 5). – Dfranc3373

Antwort

6

Der einfachste Weg, einen Parser zu implementieren, ist durch das Verfahren von Recursive Descent. Stellen Sie sicher, binär minus eine höhere Priorität als einstellige minus, wie in der genannten Website zu geben:

E --> | E "+" E 
     | E "-" E 
     | "-" E 
     | E "*" E 
     | E "/" E 
     | E "^" E 
     | "(" E ")" 
     | v 
+0

Nach dem Betrachten der Website kann ich meine Grammatikregeln wieder schreiben, um denen der Website zu folgen, aber ein Problem damit ist, dass dieser Parser auch in der Lage sein muss, =, < , <=, >,> = und/oder nicht – Dfranc3373

+0

@ Dfranc3373 siehe http://en.cppreference.com/w/cpp/language/operator_precedence für den vollständigen Operator-Vorrang für C++ – TemplateRex

+0

Vielen Dank! – Dfranc3373