Mit Boost.Regex nur Anfang eines Strings matchen?
-
Hoi,
ich bastle gerade einen kleinen lexikalischen Scanner (Boost.Spirit fällt raus) und würde mir folgende Funktionalität wünschen, die ich so auf der Dokuseite nicht gefunden habe:- Boolean ob der Anfang des Strings dem Regex entspricht.
- Alle gematchten Zeichen als String.
- Am Besten mit wchar_t Support.
- Auf keinen Fall eine normale Regex suche, die Substrigs in der Mitte des Strings matcht.Habe ich da etwas übersehen oder existiert soetwas wirklich nicht?
Danke und Grüße,
Ethon
-
http://www.boost.org/doc/libs/1_51_0/libs/regex/doc/html/boost_regex/syntax/perl_syntax.html#boost_regex.syntax.perl_syntax.anchors
A '^' character shall match the start of a line.Also "^bla" matcht nur, wen "bla" am Anfang der Zeile steht.
-
Bringt mir leider nichts, denn der Anfang des Strings ist NIE ein Zeilenanfang (im Sinne von newline).
-
^ matcht den Beginn des gesamten Inputs; ein vorheriges Newline ist nicht notwendig. Allerdings matcht ^ auch alle anderen Zeilenanfänge.
Boost.Regex bietet, wie man Oberon_Os Link unter "Buffer Boundaries" entnehmen kann, \` und \A, um den Anfang des Buffers zu matchen sowie \' und \z für das Ende. Diese dürften aber Boost.Regex-spezifisch sein, und ich weiß nicht, womit du eigentlich arbeitest (also ob dir das überhaupt weiterhilft). Boost.Spirit.Lex bietet das meines Wissens beispielsweise nicht an.
Die Anforderung ist aber für einen Lexer auch ziemlich ungewöhnlich - so intelligent sollen die eigentlich gar nicht sein, sondern stumpf Tokens an den Parser füttern, der sich dann um den Kontext Gedanken macht. Dort macht es dann Sinn, sich darum zu sorgen, ob zu Anfang der richtige Token kommt.
-
Ethon schrieb:
Bringt mir leider nichts, denn der Anfang des Strings ist NIE ein Zeilenanfang (im Sinne von newline).
Schreib mir mal kurz einen String auf, bei dem Anfang des Strings nicht mit dem Zeilenanfang der erste Zeile ident ist.
PS:
uU ist http://www.boost.org/doc/libs/1_51_0/libs/regex/doc/html/boost_regex/ref/match_flag_type.html speziell match_single_line notwendig fuer dich.
-
seldon schrieb:
Die Anforderung ist aber für einen Lexer auch ziemlich ungewöhnlich - so intelligent sollen die eigentlich gar nicht sein, sondern stumpf Tokens an den Parser füttern, der sich dann um den Kontext Gedanken macht. Dort macht es dann Sinn, sich darum zu sorgen, ob zu Anfang der richtige Token kommt.
Jup, ich wollte halt anhand von regulären Ausdrücken prüfen. Macht doch zb YACC auch so?
Wenn zb [0-9]+\.[0-9]* gematcht wird, soll der Lexer ein Float-Literal Token produzieren. So habe ich mir das gedacht. Nachdem das Token ausgeworfen wurde, muss natürlich der Zeiger hinter den letzten Buchstaben des Matches bewegt werden und ab dieser neuen Zeigerposition soll wieder der Anfang gematcht werden könen.
-
Yacc ist kein Lexer-, sondern ein Parsergenerator. Meinst du flex?
Ansonsten ist logisch, dass der Lexer nicht immer den gleichen Token auswirft. Ich verstehe nicht ganz, wozu das das Matchen des Anfangs des ganzen Inputs erfordert. Bis wohin eine Regex matcht, wird dir jede Regexbibliothek sagen können, und Lexer(bibliotheken|generatoren) kümmern sich eh automatisch darum, dass du die Tokens der Reihe nach kriegst -- dafür sind sie ja da.