Negative Zahlen mit YACC-Parser verarbeiten

kleinevroni

Mitglied
Hallo,

ich habe einen Lex/Yacc Parser der verschiedene Regeln auswertet und danach irgendwelche Aktionen ausführt.

Eine solche Aktion ist z.B. "setze den Kaufpreis auf Wert X", wobei X ein nicht-negativer Float ist.:
Code:
| KAUF_PREIS   EQUALS  DOUBLE:v   {: this.getDing().setPreis( v); :}
also kaufpreis=v;

Jetzt würde ich gerne noch eine Aktion erstellen, die den Preis auch auf einen negativen Wert setzen kann.

Mein Ansatz wäre dieser:
Code:
| KAUF_PREIS  EQUALS MINUS DOUBLE:v   {: this.getDing().setPreis(-v); :}
also kaufpreis=-v;

Die Frage ist: Geht das auch anders? :confused: Oder muss ich das Vorzeichen explizit als eigenes Zeichen mitschleppen?
Von der Logik her bin ich mit mir selbst nicht einig, wer da jetzt das Zeichen erkennen muss.

Falls ich hier den Wald vor lauter Bäumen nicht seh - Bitte um Aufklärung.

Vielen Dank

Vroni
 
Normalerweise definiert man das DOUBLE-Token als Fließkommazahl mit optionalem Vorzeichen, dann braucht man es nicht in jedem Pattern extra anzugeben. Wenn du eine Unterscheidung zwischen vorzeichenlosen und vorzeichenbehafteten Fließkommazahlen brauchst, definierst du jeweils ein entsprechendes Pattern dafür. Man kann sich das vereinfachen, indem man in der Definition des vorzeichenbehafteten Patterns auf das vorzeichenlose Pattern verweist.
Anders sieht es aus, wenn du Rechenausdrücke zulassen willst. In dem Fall werden die Zahlen-Tokens ohne Vorzeichen definiert. Das Minus-Zeichen ist dann beim yacc sowohl als unärer Operator (zur Darstellung negativer Zahlen) als auch als binärer Operator (als Rechenzeichen für die Subtraktion) zu definieren. Welche Definition im jeweiligen Kontext anzuwenden ist, entscheidet der Parser dann anhand des Kontextes, also des Syntaxbaumes, der aus der Grammatik erstellt wird. Am besten liest du dir mal diesen Leitfaden zu lex und yacc durch, in dem auch ein Beispielprojekt realisiert wird.
 
Zuletzt bearbeitet:
Normalerweise definiert man das DOUBLE-Token als Fließkommazahl mit optionalem Vorzeichen, dann braucht man es nicht in jedem Pattern extra anzugeben.

Hallo genau das will ich. Ehrlich gesagt hab ich das nicht so genau in dem PDF gefunden. Wahrscheinlich steh ich auf dem Schlauch.

Diese zwei verwende ich für die Zahlen:

[0-9]+ { return new Symbol(sym.NUMBER, new Integer(yytext())); }
[0-9][0-9.]+ { return new Symbol(sym.DOUBLE, new Double(yytext())); }

Wie kriegt ich jetzt das Minus da vorne dran?
 

Neue Beiträge

Zurück