sleigh_rs/syntax/define/
mod.rs

1mod alignment;
2mod bitrange;
3mod context;
4mod space;
5mod token;
6mod user_function;
7mod varnode;
8
9use nom::branch::alt;
10use nom::combinator::{cut, eof, map, value};
11use nom::sequence::{pair, preceded, terminated};
12use nom::IResult;
13
14use crate::{Endian, SleighError};
15
16use crate::preprocessor::token::Token as ParserToken;
17
18pub use self::alignment::Alignment;
19pub use self::bitrange::{BitRangeDef, VarnodeField};
20pub use self::context::{Context, ContextField, ContextFieldAttribute};
21pub use self::space::{Attribute, Space};
22pub use self::token::{Token, TokenField, TokenFieldAttribute};
23pub use self::user_function::UserFunction;
24pub use self::varnode::Varnode;
25
26use super::parser::this_ident;
27
28#[derive(Clone, Debug)]
29pub enum Define {
30    Endian(Endian),
31    Alignment(Alignment),
32    Varnode(Varnode),
33    Bitrange(BitRangeDef),
34    Token(Token),
35    UserFunction(UserFunction),
36    Context(Context),
37    Space(Space),
38}
39
40pub fn parse_endian(
41    input: &[ParserToken],
42) -> IResult<&[ParserToken], Endian, SleighError> {
43    preceded(
44        pair(this_ident("endian"), tag!("=")),
45        cut(alt((
46            value(Endian::Little, this_ident("little")),
47            value(Endian::Big, this_ident("big")),
48        ))),
49    )(input)
50}
51
52impl Define {
53    pub fn parse(input: &[ParserToken]) -> Result<Define, SleighError> {
54        let (_eof, define) = preceded(
55            this_ident("define"),
56            cut(terminated(
57                alt((
58                    map(parse_endian, Define::Endian),
59                    map(Alignment::parse, Define::Alignment),
60                    map(UserFunction::parse, Define::UserFunction),
61                    map(Space::parse, Define::Space),
62                    map(Token::parse, Define::Token),
63                    map(BitRangeDef::parse, Define::Bitrange),
64                    map(Context::parse, Define::Context),
65                    //NOTE Varnode need to be the last
66                    map(Varnode::parse, Define::Varnode),
67                )),
68                pair(tag!(";"), eof),
69            )),
70        )(input)?;
71        Ok(define)
72    }
73}