Finite state machines in rust; bendns fork to add types.
Diffstat (limited to 'rust-fsm-dsl/src/parser.rs')
| -rw-r--r-- | rust-fsm-dsl/src/parser.rs | 31 |
1 files changed, 14 insertions, 17 deletions
diff --git a/rust-fsm-dsl/src/parser.rs b/rust-fsm-dsl/src/parser.rs index d4a9c2e..b0fe02e 100644 --- a/rust-fsm-dsl/src/parser.rs +++ b/rust-fsm-dsl/src/parser.rs @@ -1,12 +1,11 @@ +use super::variant::Variant; use syn::{ - braced, bracketed, parenthesized, parse::{Error, Parse, ParseStream, Result}, - token::{Bracket, Paren}, - Attribute, Ident, Path, Token, Visibility, + token::Bracket, + *, }; - /// The output of a state transition -pub struct Output(Option<Ident>); +pub struct Output(Option<Variant>); impl Parse for Output { fn parse(input: ParseStream) -> Result<Self> { @@ -20,7 +19,7 @@ impl Parse for Output { } } -impl From<Output> for Option<Ident> { +impl From<Output> for Option<Variant> { fn from(output: Output) -> Self { output.0 } @@ -29,9 +28,9 @@ impl From<Output> for Option<Ident> { /// Represents a part of state transition without the initial state. The `Parse` /// trait is implemented for the compact form. pub struct TransitionEntry { - pub input_value: Ident, - pub final_state: Ident, - pub output: Option<Ident>, + pub input_value: Variant, + pub final_state: Variant, + pub output: Option<Variant>, } impl Parse for TransitionEntry { @@ -50,19 +49,18 @@ impl Parse for TransitionEntry { /// Parses the transition in any of the possible formats. pub struct TransitionDef { - pub initial_state: Ident, + pub initial_state: Variant, pub transitions: Vec<TransitionEntry>, } impl Parse for TransitionDef { fn parse(input: ParseStream) -> Result<Self> { let initial_state = input.parse()?; + input.parse::<Token![=>]>()?; // Parse the transition in the simple format - // InitialState(Input) => ResultState [Output] - let transitions = if input.lookahead1().peek(Paren) { - let input_content; - parenthesized!(input_content in input); - let input_value = input_content.parse()?; + // InitialState => Input => ResultState + let transitions = if !input.lookahead1().peek(token::Brace) { + let input_value = input.parse()?; input.parse::<Token![=>]>()?; let final_state = input.parse()?; let output = input.parse::<Output>()?.into(); @@ -78,7 +76,6 @@ impl Parse for TransitionDef { // Input1 => State1, // Input2 => State2 [Output] // } - input.parse::<Token![=>]>()?; let entries_content; braced!(entries_content in input); @@ -120,7 +117,7 @@ pub struct StateMachineDef { /// The visibility modifier (applies to all generated items) pub visibility: Visibility, pub name: Ident, - pub initial_state: Ident, + pub initial_state: Variant, pub transitions: Vec<TransitionDef>, pub attributes: Vec<Attribute>, pub input_type: Option<Path>, |