<?ZBNF-www.vishia.de version="1.0" encoding="iso-8859-1" ?>
$xmlns:topics="http://www.vishia.de/2006/Topics".
$xmlns:xhtml="http://www.w3.org/1999/xhtml".
$inputEncodingKeyword="encoding".
$comment=/*...*/.
$endlineComment=//.
##Top level Syntax for the C++ statemachine source:
##
StateMachine::=
{ #include <* \n?includeLine>
}
##argument for each state subroutine are written as static variable declaration.
##Therewith they are seen if they are used as arguments in bodies of the state methods.
{ static <*;?statefnarg>;
}
##This method should be defined here or alternatively contained in a special included header. It is the key method
##in the C++ state machine's syntax to define the destination state. See pattern.
[
void switchTo(void* <*)?>);
]
##All state should contain in a C++ environment class:
class States \{
##this special method should define values used for code generation for:
inline void variables ( ) \{ { <variable> } \}
##All states defined after them, a zbnf component
{ <state> }
\} ;
\e.
##end top level syntax.
##Syntax definition for the code generation values:
variable::= char * <$?name> = <""?value> ;.
##Syntax definition for a state class in the C++ statemachine's source:
state::=
[ /**<* |\.|*/?shortdescription><* |*/?description> */]
[public : |] class <$?@stateName> [| : public | : protected <*\{?> ] ##after : some super states for access in C++
\{
{ int statenr_<* ;?stateNr> ; ##variable defines the state number as part of that int variable.
Mandatory.
| int parallel<?stateParallel> ; ##if this variable exists it is a parallel state.
| public : class History \{ \} ; <?hasHistory>
| [/**<* |\.|*/?-shortdescription><* |*/?-description> */]
[ void entry ( ) \{<action?+entry> \} ##method for entry the state, obligatory, but only one time per state.
| void exit ( ) \{<action?+exit> \} ##method for entry the state, obligatory, but only one time per state.
| void trans <trans?+trans> ##method describes a transition, more as one possible.
| void join <join?+trans> ##method describes
| void inState ( ) \{<action?+instate> \} ##method for action in state, obligatory, but only one time per state.
| <state> ##sub state in a composite state.
] }
\} ;
.
##Syntax for the code of actions. The code is all till }//.
##This special designation is necessary to detect the end of the action method and distinguish from inner {...} parts.
##The action can contain any C code or C++ code for C++ state machine code generation.
action::= <*|\}//\.?code>.
##A transition method:
trans::= [<#?nrTrans>]( ##can start with a number only for correct C++ syntax, different names for
transition
[ bool cond = <*\{?condP> ##The default value for a 'cond' argument is the condition really
| int time = <*\{?timeP> ##The default value for a optional 'time' argument is the timer value really.
| { class <$?joinState> [*] join[<$?>] ? , } ) ##The type name of a 'joinxyz' argument is a join state really.
]
[ \{ if ( { <*\{?condP> <transbody?> ? else if ( }
[ else <transbody?> ]
\}
| <transbody?>.
]
##Body of a transition method in the primary C++ source.
##
transbody::= \{
<* |switchTo?code> ##any C-code till switchTo for the transition code.
switchTo (
{ new { History<?history> | <$?dstState> ? :: } [ ( )] ##Note: last of State::State is dstState
? , <?fork> ##Note: if more as one state then it is a fork. Mark it.
} ) ;
\}.
cond::=<*\{?cond>.
##A join transition.
##
join::= ( {<?joinState> class {<$?name>?::} * ? , } )<transbody?>.