use std::ops::Range;
mod boolean_expression;
mod common;
mod for_expression;
mod identifier;
mod primary_expression;
mod read_integer;
mod string_expression;
use crate::regex::Regex;
pub(crate) use boolean_expression::boolean_expression as expression;
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub enum ReadIntegerType {
Int8,
Uint8,
Int16,
Int16BE,
Uint16,
Uint16BE,
Int32,
Int32BE,
Uint32,
Uint32BE,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Identifier {
pub name: String,
pub name_span: Range<usize>,
pub operations: Vec<IdentifierOperation>,
}
#[derive(Clone, Debug, PartialEq)]
pub struct IdentifierOperation {
pub op: IdentifierOperationType,
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq)]
pub enum IdentifierOperationType {
Subscript(Box<Expression>),
Subfield(String),
FunctionCall(Vec<Expression>),
}
#[derive(Clone, Debug, PartialEq)]
pub enum ExpressionKind {
Filesize,
Entrypoint,
ReadInteger {
ty: ReadIntegerType,
addr: Box<Expression>,
},
Integer(i64),
Double(f64),
Count(String),
CountInRange {
variable_name: String,
variable_name_span: Range<usize>,
from: Box<Expression>,
to: Box<Expression>,
},
Offset {
variable_name: String,
occurence_number: Box<Expression>,
},
Length {
variable_name: String,
occurence_number: Box<Expression>,
},
Neg(Box<Expression>),
Add(Box<Expression>, Box<Expression>),
Sub(Box<Expression>, Box<Expression>),
Mul(Box<Expression>, Box<Expression>),
Div(Box<Expression>, Box<Expression>),
Mod(Box<Expression>, Box<Expression>),
BitwiseXor(Box<Expression>, Box<Expression>),
BitwiseAnd(Box<Expression>, Box<Expression>),
BitwiseOr(Box<Expression>, Box<Expression>),
BitwiseNot(Box<Expression>),
ShiftLeft(Box<Expression>, Box<Expression>),
ShiftRight(Box<Expression>, Box<Expression>),
And(Vec<Expression>),
Or(Vec<Expression>),
Not(Box<Expression>),
Cmp {
left: Box<Expression>,
right: Box<Expression>,
less_than: bool,
can_be_equal: bool,
},
Eq(Box<Expression>, Box<Expression>),
NotEq(Box<Expression>, Box<Expression>),
Contains {
haystack: Box<Expression>,
needle: Box<Expression>,
case_insensitive: bool,
},
StartsWith {
expr: Box<Expression>,
prefix: Box<Expression>,
case_insensitive: bool,
},
EndsWith {
expr: Box<Expression>,
suffix: Box<Expression>,
case_insensitive: bool,
},
IEquals(Box<Expression>, Box<Expression>),
Matches(Box<Expression>, Regex),
Defined(Box<Expression>),
Boolean(bool),
Variable(String),
VariableAt {
variable_name: String,
variable_name_span: Range<usize>,
offset: Box<Expression>,
},
VariableIn {
variable_name: String,
variable_name_span: Range<usize>,
from: Box<Expression>,
to: Box<Expression>,
},
For {
selection: ForSelection,
set: VariableSet,
body: Option<Box<Expression>>,
},
ForIn {
selection: ForSelection,
set: VariableSet,
from: Box<Expression>,
to: Box<Expression>,
},
ForAt {
selection: ForSelection,
set: VariableSet,
offset: Box<Expression>,
},
ForIdentifiers {
selection: ForSelection,
identifiers: Vec<String>,
identifiers_span: Range<usize>,
iterator: ForIterator,
iterator_span: Range<usize>,
body: Box<Expression>,
},
ForRules {
selection: ForSelection,
set: RuleSet,
},
Identifier(Identifier),
Bytes(Vec<u8>),
Regex(Regex),
}
#[derive(Clone, Debug, PartialEq)]
pub enum ForSelection {
Any,
All,
None,
Expr {
expr: Box<Expression>,
as_percent: bool,
},
}
#[derive(Clone, Debug, PartialEq)]
pub enum ForIterator {
Identifier(Identifier),
Range {
from: Box<Expression>,
to: Box<Expression>,
},
List(Vec<Expression>),
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct VariableSet {
pub elements: Vec<SetElement>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct SetElement {
pub name: String,
pub is_wildcard: bool,
pub span: Range<usize>,
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct RuleSet {
pub elements: Vec<SetElement>,
}
#[derive(Clone, Debug, PartialEq)]
pub struct Expression {
pub expr: ExpressionKind,
pub span: Range<usize>,
}