sleigh_rs/syntax/define/
mod.rs1mod 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 map(Varnode::parse, Define::Varnode),
67 )),
68 pair(tag!(";"), eof),
69 )),
70 )(input)?;
71 Ok(define)
72 }
73}