|
i |
Here is a simple example. It decides whether or not the input properly represents a list of value ranges. The input syntax is approximately:
[[ '!' ] <lo-num>] ['-' [<hi-num>]] \
[',' [[ '!' ] <lo-num>] ['-' [<hi-num>]] ... ]
If there is no hyphen, then a number must be present.
You should not have more than one "bang" operator,
but this FSM does not check for that.
This page contains: The input definitions See the usage page for a description of the attributes supported.
AutoGen Definitions fsm;
#if 0
Here is a simple example. It decides whether or not the input properly
represents a list of value ranges. The input syntax is approximately:
[[ '!' ] <lo-num>] ['-' [<hi-num>]] \
[',' [[ '!' ] <lo-num>] ['-' [<hi-num>]] ... ]
#endif
event = comma, num, dash, bang, eol;
state = lonum, dash, hinum;
type = looping;
method = case;
prefix = ex;
cookie = "void* cookie";
dash = "-";
bang = "!";
eol = "End-Of-Line";
comma = ",";
/*
* Define a transition for every valid transition.
* Specify the Transition_STate, the TransitionEVent and
* what the NEXT state will be. A unique transition
* enumeration will be produced for each defined transition.
*/
transition = { tst = init; tev = num; next = lonum; };
transition = { tst = init; tev = bang; next = init; };
transition = { tst = dash; tev = num; next = hinum; };
/*
* Dash transition. Always go to 'dash' state, except when we are in
* the 'hinum' or 'dash' state. Then, do the 'invalid' transition.
*/
transition = { tst = "*"; tev = dash; next = dash; },
{ tst = hinum, dash; tev = dash; ttype = invalid; next = invalid; };
/*
* Comma transition, other than in 'init'. You cannot have two
* commas together and you cannot start with one. Transitions out of
* "hinum" state require no processing.
*/
transition = { tst = "*"; tev = comma; next = init; },
{ tst = hinum; tev = comma; ttype = noop; next = init; },
{ tst = init; tev = comma; ttype = invalid; next = invalid; };
/*
* End of line transition, other than in 'init'.
* You cannot end with a comma or without any ranges specified.
*/
transition = { tst = "*"; tev = eol; next = done; },
{ tst = hinum; tev = eol; ttype = noop; next = done; },
{ tst = init; tev = eol; ttype = invalid; next = invalid; };
back to top
#ifndef AUTOFSM_EXAMPLE_FSM_H_GUARD
#define AUTOFSM_EXAMPLE_FSM_H_GUARD 1
/*
* Finite State machine States
*
* Count of non-terminal states. The generated states INVALID and DONE
* are terminal, but INIT is not :-).
*/
#define EX_STATE_CT 4
typedef enum {
EX_ST_INIT, EX_ST_LONUM, EX_ST_DASH, EX_ST_HINUM, EX_ST_INVALID,
EX_ST_DONE
} te_ex_state;
/*
* Finite State machine transition Events.
*
* Count of the valid transition events
*/
#define EX_EVENT_CT 5
typedef enum {
EX_EV_COMMA, EX_EV_NUM, EX_EV_DASH, EX_EV_BANG, EX_EV_EOL,
EX_EV_INVALID
} te_ex_event;
/*
* Run the FSM. Will return EX_ST_DONE or EX_ST_INVALID
*/
extern te_ex_state
ex_run_fsm(
void* cookie );
#endif /* AUTOFSM_EXAMPLE_FSM_H_GUARD */
back to topAnd the associated code file: |