sleigh_rs/semantic/
token.rs1use crate::meaning::Meaning;
2use crate::semantic::{
3 AttachLiteralId, AttachNumberId, AttachVarnodeId, PrintBase, TokenId,
4 ValueFmt,
5};
6use crate::{Endian, FieldBits, NumberNonZeroUnsigned, Sleigh, Span};
7
8#[derive(Clone, Debug)]
9pub struct Token {
10 pub(crate) name: Box<str>,
11 pub location: Span,
12 pub len_bytes: NumberNonZeroUnsigned,
13 pub endian: Endian,
14}
15
16#[derive(Clone, Debug)]
17pub struct TokenField {
18 pub(crate) name: Box<str>,
19 pub location: Span,
20 pub bits: FieldBits,
21 pub token: TokenId,
22 pub attach: TokenFieldAttach,
23}
24
25impl Token {
26 pub fn name(&self) -> &str {
27 &self.name
28 }
29}
30
31impl TokenField {
32 pub fn name(&self) -> &str {
33 &self.name
34 }
35 pub fn raw_value_is_signed(&self) -> bool {
36 match self.attach {
37 TokenFieldAttach::NoAttach(fmt) => fmt.signed,
38 TokenFieldAttach::Varnode(_)
39 | TokenFieldAttach::Literal(_)
40 | TokenFieldAttach::Number(_, _) => false,
41 }
42 }
43 pub fn execution_value_is_signed(&self, sleigh: &Sleigh) -> bool {
44 match self.attach {
45 TokenFieldAttach::NoAttach(fmt) => fmt.signed,
46 TokenFieldAttach::Varnode(_) | TokenFieldAttach::Literal(_) => {
47 false
48 }
49 TokenFieldAttach::Number(_, value) => {
50 sleigh.attach_number(value).is_signed()
51 }
52 }
53 }
54
55 pub fn meaning(&self) -> Meaning {
56 match self.attach {
57 TokenFieldAttach::NoAttach(fmt) => Meaning::NoAttach(fmt),
58 TokenFieldAttach::Varnode(id) => Meaning::Varnode(id),
59 TokenFieldAttach::Literal(id) => Meaning::Literal(id),
60 TokenFieldAttach::Number(base, id) => Meaning::Number(base, id),
61 }
62 }
63}
64
65#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)]
66pub enum TokenFieldAttach {
67 NoAttach(ValueFmt),
69 Varnode(AttachVarnodeId),
70 Literal(AttachLiteralId),
71 Number(PrintBase, AttachNumberId),
72}