Frage

Ich mag eine Dezimalzahl zwischen 0 akzeptieren und 255. Dies ist das Beste, was ich mit oben kommen kann:

fragment my_token :
  ('0'..'9') |                    // 0 -> 9
  ('1'..'9' '0'..'9') |           // 0 -> 99
  ('1' '0'..'9' '0'..'9')  |      // 100 -> 199
  ('2' '0'..'4' '0'..'9') |       // 200 -> 249
  ('25' '0'..'5');                // 250 -> 255

, aber ich bin nur ein ahnungsloser n00b. Surelry gibt es einen besseren Weg?

War es hilfreich?

Lösung

Sie werden viel bessere Ergebnisse, wenn Sie die Lexer entspannen und die Überprüfung zu einem späteren Zeitpunkt verschieben. Lex NUMBER, dann, wenn Sie es konvertieren später können Sie eine sehr spezifische Fehlermeldung geben, wenn der Wert außerhalb des zulässigen Bereichs. Wenn Sie die Lexer strenge machen und jemand betritt 256, die Fehlermeldung, die jemand ist unleserlich führt, die eine Grammatik, bevor nicht gemacht hat.

NUMBER
    :    '0'..'9'+
    ;

Andere Tipps

up'ed ich 280Z28 Antwort - tun, was dort vorgeschlagen wurde. Aber wenn Sie eine andere Art und Weise wollen die Muster zu schreiben, können Sie versuchen:

0|1([0-9][0-9]?)?|2([0-4][0-9]?|5[0-5]?)?|[3-9][0-9]?

Es ist mehr mir vorführt als alles andere. Es ist schwer zu überprüfen (das erste Mal, dass ich dies schrieb ich einen Fehler gemacht wurde, ohne gefangen, bis ich es getestet), und nicht etwas, das Sie in Ihrem Code verwenden sollten.

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