futilehdl/src/parser/adt.rs

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)
}