31 lines
750 B
Rust
31 lines
750 B
Rust
|
use super::declaration::{declaration, NetDecl};
|
||
|
use super::tokens::{token, Token, TokenKind as tk, TokenSpan};
|
||
|
use super::IResult;
|
||
|
use nom::multi::many0;
|
||
|
use nom::sequence::tuple;
|
||
|
use nom::{
|
||
|
combinator::{cut, map},
|
||
|
sequence::{delimited, preceded},
|
||
|
};
|
||
|
|
||
|
pub struct StateBlock<'a> {
|
||
|
name: Token<'a>,
|
||
|
items: Vec<NetDecl<'a>>,
|
||
|
}
|
||
|
|
||
|
pub fn state(input: TokenSpan) -> IResult<TokenSpan, StateBlock> {
|
||
|
map(
|
||
|
preceded(
|
||
|
token(tk::State),
|
||
|
cut(tuple((
|
||
|
token(tk::Ident),
|
||
|
delimited(token(tk::LBrace), many0(declaration), token(tk::RBrace)),
|
||
|
))),
|
||
|
),
|
||
|
|(name, items)| StateBlock {
|
||
|
name: name.clone(),
|
||
|
items,
|
||
|
},
|
||
|
)(input)
|
||
|
}
|