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