[(F)LEX] RegEx erfasst zu viel

mueslirocker

Mitglied
Hallo,

Ich arbeite mit Cygwin unter Windows und benutze somit flex für lexikalische Analyse und gcc bzw g++ als Compiler und Linker.

Bei dem regulären Ausdruck geht es um die "gefolgt von" Funktion.

a/bc
findet ein a, wenn ein bc dahinter steht.

Mein Problem ist, dass ich eine RegEx habe, die "a" und "ab" erfassen könnte.
Wenn ich also nur den RegEx nehme, findet er zu viel.
Darum das /bc dahinter... da nur ein b da ist, sollte flex doch eigentlich das b nicht zum gefundenen Ausdruck hinzufügen, richtig?
Das klappt bei mir aber nicht immer.

Ich gebe ein Beispiel:

Mein RegEx sieht so aus:
Code:
([0-9a-zA-Z]("_")?)+
Ich habe "name" als Shortcut benutzt.
Ich suche also einen Namen, der aus Unterstrichen, Zahlen und Buchstaben besteht, aber keine zwei Unterstriche am Anfang hat und keine zwei Unterstriche hinter einander hat.

Mein Input ist "ABC__XYZ."
Ich suche nach {name}/"__"{name}

Wenn ich nur nach {name} suchen würde, so würde ich "ABC_" erhalten.

Hier das Testprogramm dazu:
Code:
%{
#include <iostream>
#include <string>
using namespace std;
%}
%option noyywrap
%Start XY
name       ([0-9a-zA-Z]("_")?)+
%%
{name}/"__"{name}  { cout << yytext << endl; }
"__"               {}
.|\n               {}
%%
int main()
{
  yy_scan_string("ABC__XYZ");
  yylex();
  return 0;
}

Als Ausgabe erhalte ich aber leider "ABC_"... also genau das, was ich vermeiden wollte.

Wenn ich als Folgezeichen nur zwei Unterstriche angebe, funktioniert es komischerweise.
Mir genügt das eigentlich, aber ich verstehe nicht, warum das so ist.

Flex gibt auch eine Warnung aus:
"warning, dangerous trailing context"

Das passiert normalerweise, wenn ein RegEx nicht eindeutig ist, oder?
Kann ich aber hier nicht nachvollziehen.

Den RegEx nochmal ausgeschrieben
Code:
([0-9a-zA-Z]("_")?)+/"__"([0-9a-zA-Z]("_")?)+

Kann mir jemand erklären, warum das ein "dangerous trailing context" ist?
Ich meine, dass man den Ausdruck immer eindeutig bestimmen kann... also einmal, ob es ein Match gibt und außerdem, wo der Schnitt ist, also wo der Folgetext anfängt.
Lieg ich da falsch?

/edit

RTFM... http://wwwwbs.cs.tu-berlin.de/user-taipan/kraxel/gnuinfo/flex/Deficiencies.html
Der Bug ist bekannt. :(
 
Zuletzt bearbeitet:
Zurück