[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