[ragel-users] EOF and token termination
Adrian Thurston
thurston at complang.org
Sun Jul 4 19:35:47 UTC 2010
There's no way to change the final-state property of a state. It's
decided at compile time.
The fgoto final won't work because you're jumping out of the scanner and
it's the scanner actions that you want.
-Adrian
On 10-06-29 06:52 AM, Brian Maher wrote:
> On Mon, Jun 28, 2010 at 10:21 AM, Adrian Thurston wrote:
>> Just to be certain, you'd like a token at the end of the input to match even
>> if it is not in a final state?
>
> Yes. Or to put it another way: I want to make eof be a valid final
> state kind of like what the $ in perl compatible regular expressions
> mean.
>
>> If that's the case, I'm sorry I don't have an elegant solution for you. A
>> state is either final or not, and what you need is to make all states final
>> when at the end of the input.
>
> Is there a way to say "make this state final when at the end of the
> input"? `fgoto final;` was my attempt at doing this, but it didn't
> work ;-).
>
> Thanks for your help!
>
> Cheers,
> -Brian
>
>> On 10-06-27 06:46 AM, Brian Maher wrote:
>>>
>>> Hello Ragel Users,
>>>
>>> First, I just want to say that Ragel is an awesome tool, thank you
>>> Adrian for sharing this tool with the open source community!
>>>
>>> Recently I've been trying to write a grammar for which individual
>>> tokens may be pre-maturely terminated by EOF. I came up with the
>>> following rather hacky solution below (emit the same action as though
>>> the token was "recognized", then fbreak so that only one token is
>>> guaranteed to be "seen"). The things that I don't like with this
>>> solution are that:
>>>
>>> * I'm not keen on having to redundantly call the token's action in
>>> two places since a maintainer later on may forget to update one of the
>>> places where $eof(token_action) is done.
>>>
>>> * te is not updated (although this isn't a big deal since I can just
>>> use p instead of relying on te, and if I really wanted to make a fuss
>>> about this I could always add $eof{te=p;}).
>>>
>>> One idea I had was to $eof{fgoto final;}, but that doesn't work since
>>> the "final" label is only defined within the context of state charts
>>> and can't be used as a "normal label".
>>>
>>> --------------example.rl
>>>
>>> #include<stdio.h>
>>>
>>> %% machine t;
>>> %% write data;
>>>
>>> #define INPUT "abcd"
>>>
>>> int main() {
>>> char *ts, *te;
>>> int cs, act, i;
>>> char *input = INPUT;
>>> char *p = input;
>>> char *pe = input + (sizeof(INPUT) - 1);
>>> char *eof = pe;
>>>
>>> fprintf(stderr, "Input[");
>>> fwrite(p, 1, pe-p, stderr);
>>> fprintf(stderr, "]\n");
>>>
>>> %%{
>>> write init;
>>>
>>> action text {
>>> fprintf(stderr, "Text [%c]\n", *p);
>>> }
>>>
>>> action token {
>>> fprintf(stderr, "Token[");
>>> fwrite(ts, 1, p-ts, stderr);
>>> fprintf(stderr, "]\n");
>>> }
>>>
>>> Token = "abc" "def" $eof(token) $eof{fbreak;};
>>>
>>> main := |*
>>> Token => token;
>>> any => text;
>>> *|;
>>> write exec;
>>>
>>> }%%
>>> fprintf(stderr, "end\n");
>>> return 0;
>>> }
>>>
>>> --------------/example.rl
>>>
>>> Thanks!
>>> -Brian
>>>
>>> _______________________________________________
>>> ragel-users mailing list
>>> ragel-users at complang.org
>>> http://www.complang.org/mailman/listinfo/ragel-users
>>>
>>
>> _______________________________________________
>> ragel-users mailing list
>> ragel-users at complang.org
>> http://www.complang.org/mailman/listinfo/ragel-users
>>
>
>
>
> --
> Brian Maher>> Glory to God<<
>
>
>
_______________________________________________
ragel-users mailing list
ragel-users at complang.org
http://www.complang.org/mailman/listinfo/ragel-users
More information about the ragel-users
mailing list