EBNF für reelle Zahlen - kann mal wer drüberschauen?

  • Ich bin grad dabei reelle Zahlen in einer EBNF darzustellen.
    Ich habe mich vorher noch nie wirklich intensiv damit beschäftigt und deshalb wollte ich mal fragen ob einer mal drüber schauen kann.

    Habe mich hiernach gerichtet: http://www.mathematik.uni-marburg.de/~horstmey/tut/EBNF.pdf

    Gültige Zahlen sollen sein:
    z.B.
    3,5
    +3,5
    -3,5

    aber nicht:
    03,5
    3,50

    /* EBNF

    Vorkommateil ::= [ '+' |' -' ] ( 0 | ( [1|…|9] {0|…|9} ) )

    Nachkommateil ::= <0|...|9> (1|…|9)

    Zahl ::= (Vorkommateil) , (Nachkommateil)

    /* EBNF

    Ich lese das ungefähr so:

    Vorkommateil:
    entweder kein Vorzeichen oder +, oder minus
    entweder 0 oder eine Ziffernreihe (erste Ziffer != 0)


    Nachkommateil:
    mindestens eine Ziffer zw. 0-9 oder mehr
    letzte Ziffer != 0 (Vermeidung von 5.8420)

    Kann das jemand bestätigen oder widerlegen?

    Vielen Dank

    Einmal editiert, zuletzt von N0THING (14. November 2014 um 17:27)

  • Das Thema hatte ich zuletzt im Informatik-Leistungskurs im Bereich der theoretischen Informatik... eigentlich ganz witzig! :)

    Digit ::= ["-","+"] ("0"|(["1"|…|"9"]{"0"|…|"9"}))

    Anführungszeichen, da du die Zahlen nicht als nichtterminale, sondern als terminale Zeichen verwenden möchtest. Bin mir unsicher, ob das mit der Wiederholung an der Stelle so "erlaubt" war. Habe meine Materialien leider nicht mehr hier. Ich betrachte die "..." als reines "Hier war ich zu faul zum tippen" - denn eigentlich gehören sie dazu. ;)

    Komma ::= ","["0"|...|"9"]{"0"|...|"9"})

    Spitzklammern sind mir überhaupt nicht bekannt... kann sein, dass wir die nicht verwendet haben, da wir eine andere Notationsform verwendeten... ;) Diese "Aussage" bezeichnet alle Wörter, die mit "," beginnen und mindestens eine Zahl zwischen 0 und 9 folgend haben.

    Zahl ::= Digit[Komma]

    Dieser Grammatikteil behandelt alle Zahlen. Digit kann eine beliebige ganzzahlige Zahl sein (egal ob + oder - oder ohne Vorzeichen) und hat dann ein optionales Komma mit mindestens einer Zahl dahinter. Daher deckt es alle Zahlen - insbesondere deiner genannten - ab.

    Meine komplette Fassung:

    Digit ::= ["-","+"] ("0"|(["1"|…|"9"]{"0"|…|"9"}))
    Komma ::= ","["0"|...|"9"]{"0"|...|"9"})
    Zahl ::= Digit[Komma]

    Die von dir genannte Grammatik umfasst momentan nichts, ein +, ein - [wobei ich mir hier nicht sicher bin, ob ein einzelnes Anführungszeichen erlaubt ist :P] und daraufhin beliebig viele Nichtterminale, die niemals terminiert werden. Daher würde dir ein Programm der theoretischen Informatik (wie Prolog) wird dir zwar sagen "true", allerdings wird es das auch bei "+Hallo!", einfach weil die Nichtterminalen alles sein könnten. Auch muss deine Zahl aus der Nichtterminalen ( der Nichtterminalen Vorkommateil, der Nichtterminalen ), der Nichtterminalen und der Nichtterminalen Nachkommateil zusammengesetzt werden. Die einzige *vielleicht* Terminale in dem ganzen ist meines Wissenstandes her das optionale "+" bzw. "-".

    Ich hoffe, dass das aufschlussreich war, obwohl ich das Thema mit einer anderen Form hatte und hierzu nur spärliche Internetartikel verwenden konnte, um zu prüfen, inwieweit dass von den von mir behandelten Chromsky-Grammatiken abweicht... ;)

    Es gibt Tage, da trete ich nicht ins Fettnäpfchen. Ich falle in die Friteuse.