Skip to main content

oak_perl/ast/
mod.rs

1use serde::{Deserialize, Serialize};
2
3/// Perl 程序的根节点
4#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
5pub struct PerlRoot {
6    pub items: Vec<PerlItem>,
7}
8
9/// Perl 程序中的顶级项目
10#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
11pub enum PerlItem {
12    /// 包声明
13    Package(PerlPackage),
14    /// 使用声明
15    Use(PerlUse),
16    /// 子程序定义
17    Subroutine(PerlSubroutine),
18    /// 变量声明
19    Variable(PerlVariable),
20    /// 表达式语句
21    Expression(PerlExpression),
22    /// 注释
23    Comment(String),
24}
25
26/// 包声明
27#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
28pub struct PerlPackage {
29    pub name: String,
30}
31
32/// 使用声明
33#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
34pub struct PerlUse {
35    pub module: String,
36    pub imports: Option<Vec<String>>,
37}
38
39/// 子程序定义
40#[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/// 变量声明
48#[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/// 变量作用域
56#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
57pub enum PerlScope {
58    My,
59    Our,
60    Local,
61}
62
63/// Perl 语句
64#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
65pub enum PerlStatement {
66    /// 表达式语句
67    Expression(PerlExpression),
68    /// 条件语句
69    If(PerlIf),
70    /// 循环语句
71    Loop(PerlLoop),
72    /// 返回语句
73    Return(Option<PerlExpression>),
74    /// 控制流语句
75    Control(PerlControl),
76}
77
78/// 条件语句
79#[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/// 循环语句
88#[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/// 控制流语句
97#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
98pub enum PerlControl {
99    Last,
100    Next,
101    Redo,
102}
103
104/// Perl 表达式
105#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
106pub enum PerlExpression {
107    /// 字面量
108    Literal(PerlLiteral),
109    /// 变量引用
110    Variable(PerlVariableRef),
111    /// 二元操作
112    Binary { left: Box<PerlExpression>, operator: PerlBinaryOp, right: Box<PerlExpression> },
113    /// 一元操作
114    Unary { operator: PerlUnaryOp, operand: Box<PerlExpression> },
115    /// 函数调用
116    Call { function: String, arguments: Vec<PerlExpression> },
117    /// 数组访问
118    ArrayAccess { array: Box<PerlExpression>, index: Box<PerlExpression> },
119    /// 哈希访问
120    HashAccess { hash: Box<PerlExpression>, key: Box<PerlExpression> },
121}
122
123/// 字面量
124#[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/// 变量引用
133#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
134pub struct PerlVariableRef {
135    pub sigil: PerlSigil,
136    pub name: String,
137}
138
139/// 变量符号
140#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
141pub enum PerlSigil {
142    Scalar, // $
143    Array,  // @
144    Hash,   // %
145    Code,   // &
146    Glob,   // *
147}
148
149/// 二元操作符
150#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
151pub enum PerlBinaryOp {
152    // 算术操作符
153    Add,
154    Subtract,
155    Multiply,
156    Divide,
157    Modulo,
158    Power,
159
160    // 字符串操作符
161    Concat,
162    Repeat,
163
164    // 比较操作符
165    Equal,
166    NotEqual,
167    LessThan,
168    LessEqual,
169    GreaterThan,
170    GreaterEqual,
171    Spaceship,
172
173    // 逻辑操作符
174    LogicalAnd,
175    LogicalOr,
176
177    // 位操作符
178    BitwiseAnd,
179    BitwiseOr,
180    BitwiseXor,
181    LeftShift,
182    RightShift,
183
184    // 赋值操作符
185    Assign,
186
187    // 模式匹配
188    Match,
189    NotMatch,
190}
191
192/// 一元操作符
193#[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}