[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: Features you would like to see
- From: Bret Victor <bret@...>
- Date: Sun, 19 Aug 2007 22:37:53 +0000 (UTC)
David Given <dg <at> cowlark.com> writes:
> > I thought coroutines were entirely the right construct for state machines.
>
> Depends on the state machine.
>
> For example (this is a classic example by David Tribble, not my own):
>
> int parse()
> {
> Token tok;
>
> reading:
> tok = gettoken();
> if (tok == END)
> return ACCEPT;
> shifting:
> if (shift(tok))
> goto reading;
> reducing:
> if (reduce(tok))
> goto shifting;
> return ERROR;
> }
That code can be translated fairly directly into Lua using tailcalls:
function parse ()
local tok, reading, shifting, reducing
reading = function ()
tok = gettoken()
if tok == END then return ACCEPT end
return shifting()
end
shifting = function ()
if shift(tok) then return reading() end
return reducing()
end
reducing = function ()
if reduce(tok) then return shifting() end
return ERROR
end
return reading()
end
As Rici said, whether the code is correct or good is another matter. ;)