#![doc = include_str!("readme.md")]
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PerlRoot {
pub items: Vec<PerlItem>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PerlItem {
Package(PerlPackage),
Use(PerlUse),
Subroutine(PerlSubroutine),
Variable(PerlVariable),
Expression(PerlExpression),
Comment(String),
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PerlPackage {
pub name: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PerlUse {
pub module: String,
pub imports: Option<Vec<String>>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PerlSubroutine {
pub name: String,
pub parameters: Vec<String>,
pub body: Vec<PerlStatement>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PerlVariable {
pub scope: PerlScope,
pub name: String,
pub value: Option<PerlExpression>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PerlScope {
My,
Our,
Local,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PerlStatement {
Expression(PerlExpression),
If(PerlIf),
Loop(PerlLoop),
Return(Option<PerlExpression>),
Control(PerlControl),
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PerlIf {
pub condition: PerlExpression,
pub then_block: Vec<PerlStatement>,
pub elsif_blocks: Vec<(PerlExpression, Vec<PerlStatement>)>,
pub else_block: Option<Vec<PerlStatement>>,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PerlLoop {
While {
condition: PerlExpression,
body: Vec<PerlStatement>,
},
Until {
condition: PerlExpression,
body: Vec<PerlStatement>,
},
For {
init: Option<PerlExpression>,
condition: Option<PerlExpression>,
update: Option<PerlExpression>,
body: Vec<PerlStatement>,
},
Foreach {
variable: String,
iterable: PerlExpression,
body: Vec<PerlStatement>,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PerlControl {
Last,
Next,
Redo,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PerlExpression {
Literal(PerlLiteral),
Variable(PerlVariableRef),
Binary {
left: Box<PerlExpression>,
operator: PerlBinaryOp,
right: Box<PerlExpression>,
},
Unary {
operator: PerlUnaryOp,
operand: Box<PerlExpression>,
},
Call {
function: String,
arguments: Vec<PerlExpression>,
},
ArrayAccess {
array: Box<PerlExpression>,
index: Box<PerlExpression>,
},
HashAccess {
hash: Box<PerlExpression>,
key: Box<PerlExpression>,
},
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PerlLiteral {
String(String),
Number(String),
Array(Vec<PerlExpression>),
Hash(Vec<(PerlExpression, PerlExpression)>),
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct PerlVariableRef {
pub sigil: PerlSigil,
pub name: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PerlSigil {
Scalar,
Array,
Hash,
Code,
Glob,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PerlBinaryOp {
Add,
Subtract,
Multiply,
Divide,
Modulo,
Power,
Concat,
Repeat,
Equal,
NotEqual,
LessThan,
LessEqual,
GreaterThan,
GreaterEqual,
Spaceship,
LogicalAnd,
LogicalOr,
BitwiseAnd,
BitwiseOr,
BitwiseXor,
LeftShift,
RightShift,
Assign,
Match,
NotMatch,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PerlUnaryOp {
Plus,
Minus,
LogicalNot,
BitwiseNot,
Increment,
Decrement,
Reference,
Dereference,
}