Hoi Jurjen/JP,

Mooi plan, maar 't werkt niet goed. Hier is 't tegenvoorbeeld:

    a+/aaa

Wanneer je 1 ch. van de gematchte tekst afhaalt (input bv. 5xa: aaaaa)
dan matcht de lhs (a+) dus aaaa, maar de rest matcht de rhs (aaa) niet meer.

Kortom, de uitvoering moet iets anders.

Hier is 't alternatief, dat tegelijkertijd per def. recht doet aan de eis voor
een `minimal match' voor de tail.

Regex is a/b. Net zoals bij 't voorstel van gisteren: match de input met ab.

    ab  matcht XaXb, waarbij Xa de tekst is die correspondeert met a, Xb de
                     tekst die correspondeert met b


Bewaar de volledig gematchte tekst (S = XaXb), en plaats successief 

    S_tail = S.substr(S.length() - size, string::npos) [size = 0, 1, 2, ...] 

terug in de input, totdat b is gematcht.

    1. Dat lukt gegarandeerd, want S matcht al met ab
    2. Het levert ook de kortste match, want het is de eerste, dus kortste,
        S_tail die matcht op b.
    3. Plaats S_head = S.substr(0, size) terug in de input, en match a. Dat
        lukt, want S matcht ab, en we hebben een minimale match voor b in
        S_tail. Bij 't matchen van S_head aan a vinden we S_a: de feitelijk
        gematchte tekst. 
        Vooorbeeld: match a+/(ba)+ aan aababa. S_tail is ba, S_head is aaba,
        en S_a is aa.
    4. Plaats S - S_a terug in de input, en retournerd de gematchte tekst S_a.

De initiele size = 0 waarde begint dus met 't matchen van een lege string aan
b. Dat maakt 't mogelijk om bv * patronen als a+/a* te matchen: de kortste
tail is een lege string. Een alternatief is te kijken of b een lege transitie
naar z'n final state heeft, en dan b gewoon te negeren. Dat maakt de
implementatie in de gegenereerde code een stuk(je) kleiner.

Deze procedure lijkt misschien een beetje omslachtig, maar 't is bekend dat de
LOP duur is. Zo duur is-ie ook weer niet, en de ombouw van flexc++ zou
redelijk snel moeten kunnen worden uitgevoerd, terwijl we voldoen aan de eis
dat de |S_tail| minimaal moet zijn.

Finesse: bij 't matchen van de tail moet ervoor worden gewaakt dat er geen
nieuwe chars. uit de input worden gelezen, en dat alleen substrings van 
de oorspronkelijk gematchte tekst S worden gebruikt. 

Schiet 't maar lek.

Op naar flexc++ 2.00 !

F.
