1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
5pub struct PerlRoot {
6 pub items: Vec<PerlItem>,
7}
8
9#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
11pub enum PerlItem {
12 Package(PerlPackage),
14 Use(PerlUse),
16 Subroutine(PerlSubroutine),
18 Variable(PerlVariable),
20 Expression(PerlExpression),
22 Comment(String),
24}
25
26#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
28pub struct PerlPackage {
29 pub name: String,
30}
31
32#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
34pub struct PerlUse {
35 pub module: String,
36 pub imports: Option<Vec<String>>,
37}
38
39#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
41pub struct PerlSubroutine {
42 pub name: String,
43 pub parameters: Vec<String>,
44 pub body: Vec<PerlStatement>,
45}
46
47#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
49pub struct PerlVariable {
50 pub scope: PerlScope,
51 pub name: String,
52 pub value: Option<PerlExpression>,
53}
54
55#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
57pub enum PerlScope {
58 My,
59 Our,
60 Local,
61}
62
63#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
65pub enum PerlStatement {
66 Expression(PerlExpression),
68 If(PerlIf),
70 Loop(PerlLoop),
72 Return(Option<PerlExpression>),
74 Control(PerlControl),
76}
77
78#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
80pub struct PerlIf {
81 pub condition: PerlExpression,
82 pub then_block: Vec<PerlStatement>,
83 pub elsif_blocks: Vec<(PerlExpression, Vec<PerlStatement>)>,
84 pub else_block: Option<Vec<PerlStatement>>,
85}
86
87#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
89pub enum PerlLoop {
90 While { condition: PerlExpression, body: Vec<PerlStatement> },
91 Until { condition: PerlExpression, body: Vec<PerlStatement> },
92 For { init: Option<PerlExpression>, condition: Option<PerlExpression>, update: Option<PerlExpression>, body: Vec<PerlStatement> },
93 Foreach { variable: String, iterable: PerlExpression, body: Vec<PerlStatement> },
94}
95
96#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
98pub enum PerlControl {
99 Last,
100 Next,
101 Redo,
102}
103
104#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
106pub enum PerlExpression {
107 Literal(PerlLiteral),
109 Variable(PerlVariableRef),
111 Binary { left: Box<PerlExpression>, operator: PerlBinaryOp, right: Box<PerlExpression> },
113 Unary { operator: PerlUnaryOp, operand: Box<PerlExpression> },
115 Call { function: String, arguments: Vec<PerlExpression> },
117 ArrayAccess { array: Box<PerlExpression>, index: Box<PerlExpression> },
119 HashAccess { hash: Box<PerlExpression>, key: Box<PerlExpression> },
121}
122
123#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
125pub enum PerlLiteral {
126 String(String),
127 Number(String),
128 Array(Vec<PerlExpression>),
129 Hash(Vec<(PerlExpression, PerlExpression)>),
130}
131
132#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
134pub struct PerlVariableRef {
135 pub sigil: PerlSigil,
136 pub name: String,
137}
138
139#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
141pub enum PerlSigil {
142 Scalar, Array, Hash, Code, Glob, }
148
149#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
151pub enum PerlBinaryOp {
152 Add,
154 Subtract,
155 Multiply,
156 Divide,
157 Modulo,
158 Power,
159
160 Concat,
162 Repeat,
163
164 Equal,
166 NotEqual,
167 LessThan,
168 LessEqual,
169 GreaterThan,
170 GreaterEqual,
171 Spaceship,
172
173 LogicalAnd,
175 LogicalOr,
176
177 BitwiseAnd,
179 BitwiseOr,
180 BitwiseXor,
181 LeftShift,
182 RightShift,
183
184 Assign,
186
187 Match,
189 NotMatch,
190}
191
192#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
194pub enum PerlUnaryOp {
195 Plus,
196 Minus,
197 LogicalNot,
198 BitwiseNot,
199 Increment,
200 Decrement,
201 Reference,
202 Dereference,
203}