hiho,
ich bau mir grad nen Scanner für kontextfreie Grammatiken .. der einigermaßen universal zumindest unterscheiden soll ob es sich um Terminale, Kommentare oder diverse Spezialdaten handelt, welche dynamisch im Scanner eingebracht werden können.
Nach den der Scanner Token nur Anhand von definierten Trennzeichen erkennen kann ergibt sich also das bspw solche Strings enstehen:
1234.5678E-5 .. sowas soll bspw. bei meinem Editor als Float erlaubt sein. Dezimalzahlen sind ebenfalls erlaubt .. und werden nicht als Teil der Grammatik formuliert sondern per Platzhalter eingebunden, sprich eine Regel in der Grammatik könnte so aussehen:
Number = INT | FLOAT
wenn man Dezimalzahlen und Gleitkommazahlen in der Grammatik verwenden möchte.
Diese kann ich selbstverständlich nur mittels regulärer Ausdrücke definieren.
nun passiert im Scanner folgendes: ich splitte den Eingabestring gemäß der Trennzeichen die eingestellt sind, erhalte also zum Beispiel einen Teilstring der Form
Der Scanner prüft nun seine bekannten Daten und kommt nun zu den Dezimalzahlen. Diese matchen 3x auf diesen String. Das ist natürlich verkehrt, denn es handelt sich um eine Gleitkommazahl. Nun habe ich mal folgendes in einem TestApplet für reguläre Ausdrücke probiert:
: das würde nicht mehr auf diesen String matchen, die Frage die ich mir Stelle ob das eine sichere Option wäre im Scanner, um den definierten regulären Ausdrücke herum jeweils diese Zeichen zu setzen und dann zu prüfen ob auch wirklich der komplette String als übereinstimmend erkannt wird.
Kann man dabei auf die Nase fallen, wenn man das implizit bei allen regulären Ausdrücken macht, die NICHT zeilenübergreifend sind.
Zeilenübergreifend wäre zB ein Blockkommentar, da würde das natürlich nicht klappen (da der Scanner den Text des Kommentars ja auch per Delimiter trennt)
ich bau mir grad nen Scanner für kontextfreie Grammatiken .. der einigermaßen universal zumindest unterscheiden soll ob es sich um Terminale, Kommentare oder diverse Spezialdaten handelt, welche dynamisch im Scanner eingebracht werden können.
Nach den der Scanner Token nur Anhand von definierten Trennzeichen erkennen kann ergibt sich also das bspw solche Strings enstehen:
1234.5678E-5 .. sowas soll bspw. bei meinem Editor als Float erlaubt sein. Dezimalzahlen sind ebenfalls erlaubt .. und werden nicht als Teil der Grammatik formuliert sondern per Platzhalter eingebunden, sprich eine Regel in der Grammatik könnte so aussehen:
Number = INT | FLOAT
wenn man Dezimalzahlen und Gleitkommazahlen in der Grammatik verwenden möchte.
Diese kann ich selbstverständlich nur mittels regulärer Ausdrücke definieren.
Code:
INT = \\d+
FLOAT = (\\d+\\.\\d+([eE]?[-+]?\\d+)?)
nun passiert im Scanner folgendes: ich splitte den Eingabestring gemäß der Trennzeichen die eingestellt sind, erhalte also zum Beispiel einen Teilstring der Form
Code:
1234.567e+10
Der Scanner prüft nun seine bekannten Daten und kommt nun zu den Dezimalzahlen. Diese matchen 3x auf diesen String. Das ist natürlich verkehrt, denn es handelt sich um eine Gleitkommazahl. Nun habe ich mal folgendes in einem TestApplet für reguläre Ausdrücke probiert:
Code:
^\\d+$
Kann man dabei auf die Nase fallen, wenn man das implizit bei allen regulären Ausdrücken macht, die NICHT zeilenübergreifend sind.
Zeilenübergreifend wäre zB ein Blockkommentar, da würde das natürlich nicht klappen (da der Scanner den Text des Kommentars ja auch per Delimiter trennt)