tutorials.de Buch-Aktion 02/2012
Like Tree1Danke
  • 1 Beitrag von Vereth
ERLEDIGT
NEIN
ANTWORTEN
2
ZUGRIFFE
526
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    kleinevroni kleinevroni ist offline Mitglied Bronze
    Registriert seit
    Oct 2005
    Beiträge
    32
    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 :
    1
    
    | 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 :
    1
    
    | KAUF_PREIS  EQUALS MINUS DOUBLE:v   {: this.getDing().setPreis(-v); :}
    also kaufpreis=-v;

    Die Frage ist: Geht das auch anders? 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
     

  2. #2
    Avatar von Vereth
    Vereth Vereth ist offline Mitglied Brokat
    Registriert seit
    Nov 2009
    Ort
    Dortmund
    Beiträge
    372
    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.
    Geändert von Vereth (07.03.10 um 02:12 Uhr)
    kleinevroni bedankt sich. 
    Vielen Dank für die Nutzung des Bewerten- und Danke-Buttons

    Wenn man sieht, dass man einen anderen glücklich gemacht hat, ist die Welt um zwei glückliche Menschen reicher.

  3. #3
    kleinevroni kleinevroni ist offline Mitglied Bronze
    Registriert seit
    Oct 2005
    Beiträge
    32
    Zitat Zitat von Vereth Beitrag anzeigen
    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?
     

Ähnliche Themen

  1. Antworten: 10
    Letzter Beitrag: 06.03.10, 20:51
  2. VBA Code / negative Zahlen rot!
    Von fonds im Forum Office-Anwendungen
    Antworten: 0
    Letzter Beitrag: 03.09.08, 14:35
  3. auf negative Zahlen prüfen
    Von aTa im Forum Javascript & Ajax
    Antworten: 6
    Letzter Beitrag: 23.10.06, 15:50
  4. Exceltabelle negative Zahlen
    Von M155P3RF3K7 im Forum Office-Anwendungen
    Antworten: 0
    Letzter Beitrag: 17.05.06, 07:59
  5. negative Zahlen
    Von bizza im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 23.02.05, 17:23

Stichworte