sleigh_rs/syntax/define/
space.rs1use 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}