Hallo, ich habe ein vermutlich kleines Problem mit dem Parsen von geklammerten Ausdrücken. Vermutlich verstehe ich die div. Dokus nicht richtig. Ich will geklammerte Ausdrücke in Fließtext erkennen, ohne dass zwischen den Klammern und dem Schlüsselwort ein Leerzeichen stehen muss. Dabei brauche ich für die Klammern einen eigenen Returnwert. zur Zeit sieht es etwa so aus: NOWHITE [^ \t\n]+ ... <getquery> "(" { ... return '(' ; } ")" { ... return ')' ; } SCHLÜSSEL1 { ... return 1 ; } SCHLÜSSEL2 { ... return 2 ; } NOWHITE { ... return ERROR;} <...> Leider erkennt die letzte Zeile auch ein geklammertes Schlüsselwort und gibt daher ERROR zurück. Wenn ich die Definition NOWHITE [^(][^ \t\n]+[^)] schreibe gibt es div. andere Fehlermeldungen aus meiner Anwendung. Habt Ihr einen Tipp ? Danke, Thomas Roesner
Hi! On Thursday 13 February 2003 08:51, Roesner Thomas wrote:
Hallo,
ich habe ein vermutlich kleines Problem mit dem Parsen von geklammerten Ausdrücken. Vermutlich verstehe ich die div. Dokus nicht richtig. Ich will geklammerte Ausdrücke in Fließtext erkennen, ohne dass zwischen den Klammern und dem Schlüsselwort ein Leerzeichen stehen muss. [...]
Kannst du mal ein paar Beispiele geben, was wie erkannt werden soll? Ciao
Hi, On Thu, 13 Feb 2003, Roesner Thomas wrote:
ich habe ein vermutlich kleines Problem mit dem Parsen von geklammerten Ausdrücken. Vermutlich verstehe ich die div. Dokus nicht richtig. Ich will geklammerte Ausdrücke in Fließtext erkennen, ohne dass zwischen den Klammern und dem Schlüsselwort ein Leerzeichen stehen muss.
Irgendwie fehlt bei dir noch das input-file fuer bison (oder yacc), oder der handgeschriebene Parser. flex erkennt regulaere Sprachen, geklammerte Ausdruecke sind nicht Element irgendeiner regulaeren Sprache. Mithin kann man mit ausschliesslich flex keine allgemeinen geklammerten Ausdruecke erkennen. Ciao, Micha.
Am Don, 2003-02-13 um 12.08 schrieb Michael Matz:
Hi,
On Thu, 13 Feb 2003, Roesner Thomas wrote:
ich habe ein vermutlich kleines Problem mit dem Parsen von geklammerten Ausdrücken. Vermutlich verstehe ich die div. Dokus nicht richtig. Ich will geklammerte Ausdrücke in Fließtext erkennen, ohne dass zwischen den Klammern und dem Schlüsselwort ein Leerzeichen stehen muss.
Irgendwie fehlt bei dir noch das input-file fuer bison (oder yacc), oder der handgeschriebene Parser. flex erkennt regulaere Sprachen, geklammerte Ausdruecke sind nicht Element irgendeiner regulaeren Sprache. Mithin kann man mit ausschliesslich flex keine allgemeinen geklammerten Ausdruecke erkennen. s/flex/lex/g
Mit lex allein geht's nicht. Mit flex unter Verwendung von "conditions" schon (Zustandsbehafteter lexer) würde es gehen. Ralf
Hi, On 13 Feb 2003, Ralf Corsepius wrote:
Irgendwie fehlt bei dir noch das input-file fuer bison (oder yacc), oder der handgeschriebene Parser. flex erkennt regulaere Sprachen, geklammerte Ausdruecke sind nicht Element irgendeiner regulaeren Sprache. Mithin kann man mit ausschliesslich flex keine allgemeinen geklammerten Ausdruecke erkennen. s/flex/lex/g
Mit lex allein geht's nicht. Mit flex unter Verwendung von "conditions" schon (Zustandsbehafteter lexer) würde es gehen.
Jein. Nur conditions reichen nicht aus, da sie die Maechtigkeit der Sprache nicht erhoehen. Versuch's wenn du es nicht glaubst. Der Automat muss zaehlen koennen, was ein Automat nicht kann (er kann endlich "zaehlen", aber fuer allgemeine Ausdruecke reicht das nicht). Was man mindestens braucht, ist ein Stack von Zustaenden, und in der Tat stellt flex einen bereit (zusammen mit yy_push_state, yy_pop_state und yy_top_state). Das man dann geklammerte Ausdruecke erkennen kann ist nicht verwunderlich, da ein regulaerer Automat zusammen mit einem Stack gerade die kontextfreien Sprachen erkennen kann (wie z.B. auch yacc, bison usw. implementiert sind). Es gibt da noch Unterteilungen, wie LR(n), aber das ist hier nicht von Belang. Ciao, Micha.
Am Don, 2003-02-13 um 15.52 schrieb Michael Matz:
Hi,
On 13 Feb 2003, Ralf Corsepius wrote:
Irgendwie fehlt bei dir noch das input-file fuer bison (oder yacc), oder der handgeschriebene Parser. flex erkennt regulaere Sprachen, geklammerte Ausdruecke sind nicht Element irgendeiner regulaeren Sprache. Mithin kann man mit ausschliesslich flex keine allgemeinen geklammerten Ausdruecke erkennen. s/flex/lex/g
Mit lex allein geht's nicht. Mit flex unter Verwendung von "conditions" schon (Zustandsbehafteter lexer) würde es gehen.
Jein. Nur conditions reichen nicht aus, Ja. Sie sind aber notwendige Voraussetzung.
da sie die Maechtigkeit der Sprache nicht erhoehen. Versuch's wenn du es nicht glaubst. Der Automat muss zaehlen koennen, was ein Automat nicht kann (er kann endlich "zaehlen", aber fuer allgemeine Ausdruecke reicht das nicht). Ja.
Was man mindestens braucht, ist ein Stack von Zustaenden, Wenn die Sprache rekursiv ist, ja.
Wenn die Sprache nicht-rekursiv ist, nein (Die gesuchte "Klammerungserkennung" degeneriert dann zu einem Sonderfall der "C-Kommentarerkennung").
und in der Tat stellt flex einen bereit (zusammen mit yy_push_state, yy_pop_state und yy_top_state).
Nur braucht es den Flex-eigenen Stack dazu nicht unbedingt. Man kann stattdessen auch einen eigenen Stack verwenden, wenn man will. In Lex kann man zwar auch einen Stack implementieren, doch mittels lex zustandsbehaftete Scanner zu realisieren erscheint mir kaum möglich.
Das man dann geklammerte Ausdruecke erkennen kann ist nicht verwunderlich, da ein regulaerer Automat zusammen mit einem Stack gerade die kontextfreien Sprachen erkennen kann (wie z.B. auch yacc, bison usw. implementiert sind). Es gibt da noch Unterteilungen, wie LR(n), aber das ist hier nicht von Belang. Ja. Siehe Aho/Sethi/Ullman ;)
Ralf
Hi, On 14 Feb 2003, Ralf Corsepius wrote:
Was man mindestens braucht, ist ein Stack von Zustaenden, Wenn die Sprache rekursiv ist, ja.
Nein. Fuer rekursive Sprachen braucht man schon eine Turingmaschine. Ein Kellerautomat kann kontextfreie Sprachen erkennen. (kontextfreie Sprachen sind eine echte Untermenge von rekursiven Sprachen)
Wenn die Sprache nicht-rekursiv ist, nein (Die gesuchte "Klammerungserkennung" degeneriert dann zu einem Sonderfall der "C-Kommentarerkennung").
Nein. C-Kommentare sind nicht geschachtelt. Mit nicht-rekursiv meinst du regulaer, ja? Das haben wir schon abgegessen, das Klammerausdruecke eben zu keiner regulaeren Sprache gehoeren.
und in der Tat stellt flex einen bereit (zusammen mit yy_push_state, yy_pop_state und yy_top_state).
Nur braucht es den Flex-eigenen Stack dazu nicht unbedingt. Man kann stattdessen auch einen eigenen Stack verwenden, wenn man will.
Oehh, ja, na gut. Aber wenn ich schon so viel selber in den Actions programmieren will, dann kann ich auch gleich ganz davon absehen, ueberhaupt flex zu benutzen. Das Ziel war ja in flex selbst mit Bordmitteln Klammerausdruecke zu erkennen. Das ich das mit C-Code kann ist klar. Und wenn es den Stack nicht anbieten wuerde, ginge es in flex nicht. Ich wundere mich sowieso, wieso sie sowas drin haben. Fuer kontextfreie Sprachen hat man bison, der Stack in flex scheint mir reichlich nutzlos (wird ehh nur aktiviert, wenn man "%option stack" benutzt). Ciao, Micha.
Am Don, 2003-02-13 um 08.51 schrieb Roesner Thomas:
Hallo,
ich habe ein vermutlich kleines Problem mit dem Parsen von geklammerten Ausdrücken. Vermutlich verstehe ich die div. Dokus nicht richtig. Ich will geklammerte Ausdrücke in Fließtext erkennen, ohne dass zwischen den Klammern und dem Schlüsselwort ein Leerzeichen stehen muss.
Dabei brauche ich für die Klammern einen eigenen Returnwert. zur Zeit sieht es etwa so aus:
NOWHITE [^ \t\n]+ ...
<getquery>
"(" { ... return '(' ; } ")" { ... return ')' ; }
SCHLÜSSEL1 { ... return 1 ; } SCHLÜSSEL2 { ... return 2 ; }
NOWHITE { ... return ERROR;} Das verstehe ich nicht. Du definierst dir ein Muster NOWHITE und greifst dann mit NOWHITE darauf zu ?
Damit würdest Du versuchen auf den String NOWHITE zu matchen. Vermutlich willst Du aber auf das Muster NOWHITE matchen. Dazu wäre Klammerung in geschweifte Klammern notwenig also {NOWHITE} { return ... } und nicht NOWHITE { return ... } Ralf
participants (4)
-
Michael Matz
-
Ralf Corsepius
-
Roesner Thomas
-
Sebastian Huber