sleigh_rs/syntax/define/
space.rs

1use nom::branch::alt;
2use nom::combinator::{cut, map, value};
3use nom::multi::many0;
4use nom::sequence::{pair, preceded};
5use nom::IResult;
6
7use crate::preprocessor::token::Token;
8use crate::semantic::space::SpaceType;
9use crate::syntax::parser::{ident, number, this_ident};
10use crate::{NumberUnsigned, SleighError, Span};
11
12impl SpaceType {
13    fn parse(input: &[Token]) -> IResult<&[Token], SpaceType, SleighError> {
14        alt((
15            value(SpaceType::Ram, this_ident("ram_space")),
16            value(SpaceType::Rom, this_ident("rom_space")),
17            value(SpaceType::Register, this_ident("register_space")),
18        ))(input)
19    }
20}
21
22#[derive(Clone, Copy, Debug, Eq, PartialEq, Hash)]
23pub enum Attribute {
24    Type(SpaceType),
25    Size(NumberUnsigned),
26    WordSize(NumberUnsigned),
27    Default,
28}
29impl Attribute {
30    fn parse(input: &[Token]) -> IResult<&[Token], Attribute, SleighError> {
31        alt((
32            value(Attribute::Default, this_ident("default")),
33            map(
34                preceded(pair(this_ident("type"), tag!("=")), SpaceType::parse),
35                Attribute::Type,
36            ),
37            map(
38                preceded(pair(this_ident("size"), tag!("=")), number),
39                |(x, _span)| Attribute::Size(x),
40            ),
41            map(
42                preceded(pair(this_ident("wordsize"), tag!("=")), number),
43                |(x, _span)| Attribute::WordSize(x),
44            ),
45        ))(input)
46    }
47}
48
49#[derive(Clone, Debug)]
50pub struct Space {
51    pub name: String,
52    pub src: Span,
53    pub attributes: Vec<Attribute>,
54}
55
56impl Space {
57    pub fn parse(input: &[Token]) -> IResult<&[Token], Self, SleighError> {
58        map(
59            preceded(
60                this_ident("space"),
61                cut(pair(ident, many0(Attribute::parse))),
62            ),
63            |((name, name_span), attributes)| Space {
64                name,
65                src: name_span.clone(),
66                attributes,
67            },
68        )(input)
69    }
70}