Hello,


Consider the following test program:


#include <stdlib.h>
#include <string.h>
#include <stdio.h>

%%{
        machine chart;
        write data;
}%%

void test( char *str )
{
        char *p = str, *pe = str + strlen( str ), *eof = pe;
        int cs;

        %%{
                action s { putchar('s'); }
                action e { putchar('e'); }
                action nl { putchar('\n'); }

                main := (
                        start: '' -> a,
                        a: 'aa' >s %e -> b,
                        b: 'bb' >s %e -> a
                ) $/nl;

                # Initialize and execute.
                write init;
                write exec;
        }%%
};

int main()
{
        test( "aabba" );
        return 0;
}



Intuitively I expected the above program to print "seses", but it prints sesse".

From the Ragel manual:

"""
We associate with the embedding of each action a unique timestamp that is used to order actions that appear together on a single transition in the final state machine. To accomplish this we recursively traverse the parse tree of regular expressions and assign timestamps to action embeddings. References to machine definitions are followed in the traversal. When we visit a parse tree node we assign timestamps to all entering action embeddings, recurse on the parse tree, then assign timestamps to the remaining al l, finishing, and leaving embeddings in the order in which
they appear.
"""

So what I am guessing is happening is that the action '>s' in state 'a' is getting a timestamp earlier than action '%e' in state 'b', and will therefore always execute before '%e' in state 'b'.

Logically, shouldn't '%' actions execute before '>' actions?

Cheers,
Murray

_______________________________________________
ragel-users mailing list
[email protected]
http://www.complang.org/mailman/listinfo/ragel-users

Reply via email to