moduforge_rules_expression/compiler/
compiler.rs

1use crate::compiler::error::{CompilerError, CompilerResult};
2use crate::compiler::opcode::{FetchFastTarget, Jump};
3use crate::compiler::{Compare, Opcode};
4use crate::functions::registry::FunctionRegistry;
5use crate::functions::{
6    ClosureFunction, FunctionKind, InternalFunction, MethodRegistry,
7};
8use crate::lexer::{
9    ArithmeticOperator, ComparisonOperator, LogicalOperator, Operator,
10};
11use crate::parser::Node;
12use rust_decimal::prelude::ToPrimitive;
13use rust_decimal::Decimal;
14use rust_decimal_macros::dec;
15use std::sync::Arc;
16
17/// 编译器主结构体
18/// 负责将AST编译为虚拟机操作码序列
19#[derive(Debug)]
20pub struct Compiler {
21    bytecode: Vec<Opcode>, // 生成的操作码序列
22}
23
24impl Compiler {
25    /// 创建新的编译器实例
26    pub fn new() -> Self {
27        Self { bytecode: Default::default() }
28    }
29
30    /// 编译AST节点为操作码
31    ///
32    /// # 参数
33    /// * `root` - 要编译的AST根节点
34    ///
35    /// # 返回值
36    /// 返回生成的操作码序列或编译错误
37    pub fn compile(
38        &mut self,
39        root: &Node,
40    ) -> CompilerResult<&[Opcode]> {
41        self.bytecode.clear();
42
43        CompilerInner::new(&mut self.bytecode, root).compile()?;
44        Ok(self.bytecode.as_slice())
45    }
46
47    /// 获取当前的操作码序列
48    pub fn get_bytecode(&self) -> &[Opcode] {
49        self.bytecode.as_slice()
50    }
51}
52
53/// 编译器内部实现结构体
54/// 执行实际的编译工作,管理编译状态
55#[derive(Debug)]
56struct CompilerInner<'arena, 'bytecode_ref> {
57    root: &'arena Node<'arena>,               // AST根节点
58    bytecode: &'bytecode_ref mut Vec<Opcode>, // 操作码向量的可变引用
59}
60
61impl<'arena, 'bytecode_ref> CompilerInner<'arena, 'bytecode_ref> {
62    /// 创建新的编译器内部实例
63    pub fn new(
64        bytecode: &'bytecode_ref mut Vec<Opcode>,
65        root: &'arena Node<'arena>,
66    ) -> Self {
67        Self { root, bytecode }
68    }
69
70    /// 执行编译过程
71    pub fn compile(&mut self) -> CompilerResult<()> {
72        self.compile_node(self.root)?;
73        Ok(())
74    }
75
76    /// 生成一个操作码并返回其位置
77    ///
78    /// # 参数
79    /// * `op` - 要生成的操作码
80    ///
81    /// # 返回值
82    /// 返回操作码在序列中的位置(1-based)
83    fn emit(
84        &mut self,
85        op: Opcode,
86    ) -> usize {
87        self.bytecode.push(op);
88        self.bytecode.len()
89    }
90
91    /// 生成循环结构的操作码
92    ///
93    /// # 参数
94    /// * `body` - 循环体编译函数
95    fn emit_loop<F>(
96        &mut self,
97        body: F,
98    ) -> CompilerResult<()>
99    where
100        F: FnOnce(&mut Self) -> CompilerResult<()>,
101    {
102        let begin = self.bytecode.len();
103        let end = self.emit(Opcode::Jump(Jump::IfEnd, 0)); // 循环结束跳转占位符
104
105        body(self)?; // 编译循环体
106
107        self.emit(Opcode::IncrementIt); // 增加迭代器
108        let e = self.emit(Opcode::Jump(
109            Jump::Backward,
110            self.calc_backward_jump(begin) as u32,
111        )); // 跳回循环开始
112
113        // 回填循环结束跳转的目标地址
114        self.replace(end, Opcode::Jump(Jump::IfEnd, (e - end) as u32));
115        Ok(())
116    }
117
118    /// 生成条件结构的操作码
119    ///
120    /// # 参数
121    /// * `body` - 条件体编译函数
122    fn emit_cond<F>(
123        &mut self,
124        mut body: F,
125    ) where
126        F: FnMut(&mut Self),
127    {
128        let noop = self.emit(Opcode::Jump(Jump::IfFalse, 0)); // 条件为假时跳转
129        self.emit(Opcode::Pop); // 弹出条件值
130
131        body(self); // 编译条件体
132
133        let jmp = self.emit(Opcode::Jump(Jump::Forward, 0)); // 跳过else部分
134        self.replace(noop, Opcode::Jump(Jump::IfFalse, (jmp - noop) as u32));
135        let e = self.emit(Opcode::Pop); // 清理栈
136        self.replace(jmp, Opcode::Jump(Jump::Forward, (e - jmp) as u32));
137    }
138
139    /// 替换指定位置的操作码
140    ///
141    /// # 参数
142    /// * `at` - 要替换的位置(1-based)
143    /// * `op` - 新的操作码
144    fn replace(
145        &mut self,
146        at: usize,
147        op: Opcode,
148    ) {
149        let _ = std::mem::replace(&mut self.bytecode[at - 1], op);
150    }
151
152    /// 计算向后跳转的距离
153    ///
154    /// # 参数
155    /// * `to` - 目标位置
156    ///
157    /// # 返回值
158    /// 返回跳转距离
159    fn calc_backward_jump(
160        &self,
161        to: usize,
162    ) -> usize {
163        self.bytecode.len() + 1 - to
164    }
165
166    /// 编译函数或方法的参数
167    ///
168    /// # 参数
169    /// * `function_kind` - 函数类型(用于错误报告)
170    /// * `arguments` - 参数节点数组
171    /// * `index` - 要编译的参数索引
172    fn compile_argument<T: ToString>(
173        &mut self,
174        function_kind: T,
175        arguments: &[&'arena Node<'arena>],
176        index: usize,
177    ) -> CompilerResult<usize> {
178        let arg = arguments.get(index).ok_or_else(|| {
179            CompilerError::ArgumentNotFound {
180                index,
181                function: function_kind.to_string(),
182            }
183        })?;
184
185        self.compile_node(arg)
186    }
187
188    /// 尝试为成员访问生成快速路径
189    /// 将连续的成员访问优化为单个FetchFast操作
190    ///
191    /// # 参数
192    /// * `node` - 要分析的节点
193    ///
194    /// # 返回值
195    /// 如果可以优化,返回快速访问路径;否则返回None
196    #[cfg_attr(feature = "stack-protection", recursive::recursive)]
197    fn compile_member_fast(
198        &mut self,
199        node: &'arena Node<'arena>,
200    ) -> Option<Vec<FetchFastTarget>> {
201        match node {
202            Node::Root => Some(vec![FetchFastTarget::Root]),
203            Node::Identifier(v) => Some(vec![
204                FetchFastTarget::Root,
205                FetchFastTarget::String(Arc::from(*v)),
206            ]),
207            Node::Member { node, property } => {
208                let mut path = self.compile_member_fast(node)?;
209                match property {
210                    Node::String(v) => {
211                        path.push(FetchFastTarget::String(Arc::from(*v)));
212                        Some(path)
213                    },
214                    Node::Number(v) => {
215                        if let Some(idx) = v.to_u32() {
216                            path.push(FetchFastTarget::Number(idx));
217                            Some(path)
218                        } else {
219                            None
220                        }
221                    },
222                    _ => None,
223                }
224            },
225            _ => None,
226        }
227    }
228
229    /// 编译AST节点为操作码
230    /// 这是编译器的核心方法,递归处理各种类型的AST节点
231    ///
232    /// # 参数
233    /// * `node` - 要编译的AST节点
234    ///
235    /// # 返回值
236    /// 返回最后生成的操作码位置或编译错误
237    #[cfg_attr(feature = "stack-protection", recursive::recursive)]
238    fn compile_node(
239        &mut self,
240        node: &'arena Node<'arena>,
241    ) -> CompilerResult<usize> {
242        match node {
243            // 基本值类型
244            Node::Null => Ok(self.emit(Opcode::PushNull)),
245            Node::Bool(v) => Ok(self.emit(Opcode::PushBool(*v))),
246            Node::Number(v) => Ok(self.emit(Opcode::PushNumber(*v))),
247            Node::String(v) => Ok(self.emit(Opcode::PushString(Arc::from(*v)))),
248            Node::Pointer => Ok(self.emit(Opcode::Pointer)),
249            Node::Root => Ok(self.emit(Opcode::FetchRootEnv)),
250
251            // 数组:编译所有元素,然后创建数组
252            Node::Array(v) => {
253                v.iter().try_for_each(|&n| self.compile_node(n).map(|_| ()))?;
254                self.emit(Opcode::PushNumber(Decimal::from(v.len())));
255                Ok(self.emit(Opcode::Array))
256            },
257
258            // 对象:编译所有键值对,然后创建对象
259            Node::Object(v) => {
260                v.iter().try_for_each(|&(key, value)| {
261                    self.compile_node(key).map(|_| ())?;
262                    // 将键转换为字符串
263                    self.emit(Opcode::CallFunction {
264                        arg_count: 1,
265                        kind: FunctionKind::Internal(InternalFunction::String),
266                    });
267                    self.compile_node(value).map(|_| ())?;
268                    Ok(())
269                })?;
270
271                self.emit(Opcode::PushNumber(Decimal::from(v.len())));
272                Ok(self.emit(Opcode::Object))
273            },
274
275            // 标识符:从环境中获取值
276            Node::Identifier(v) => {
277                Ok(self.emit(Opcode::FetchEnv(Arc::from(*v))))
278            },
279
280            // 闭包和括号表达式:直接编译内部节点
281            Node::Closure(v) => self.compile_node(v),
282            Node::Parenthesized(v) => self.compile_node(v),
283
284            // 成员访问:尝试快速路径,否则使用通用方法
285            Node::Member { node: n, property: p } => {
286                if let Some(path) = self.compile_member_fast(node) {
287                    Ok(self.emit(Opcode::FetchFast(path)))
288                } else {
289                    self.compile_node(n)?;
290                    self.compile_node(p)?;
291                    Ok(self.emit(Opcode::Fetch))
292                }
293            },
294
295            // 模板字符串:编译所有部分并连接
296            Node::TemplateString(parts) => {
297                parts.iter().try_for_each(|&n| {
298                    self.compile_node(n).map(|_| ())?;
299                    // 将每部分转换为字符串
300                    self.emit(Opcode::CallFunction {
301                        arg_count: 1,
302                        kind: FunctionKind::Internal(InternalFunction::String),
303                    });
304                    Ok(())
305                })?;
306
307                self.emit(Opcode::PushNumber(Decimal::from(parts.len())));
308                self.emit(Opcode::Array);
309                self.emit(Opcode::PushString(Arc::from("")));
310                Ok(self.emit(Opcode::Join))
311            },
312
313            // 切片操作:编译对象和边界,然后执行切片
314            Node::Slice { node, to, from } => {
315                self.compile_node(node)?;
316                if let Some(t) = to {
317                    self.compile_node(t)?;
318                } else {
319                    // 如果没有指定结束位置,使用长度-1
320                    self.emit(Opcode::Len);
321                    self.emit(Opcode::PushNumber(dec!(1)));
322                    self.emit(Opcode::Subtract);
323                }
324
325                if let Some(f) = from {
326                    self.compile_node(f)?;
327                } else {
328                    // 如果没有指定开始位置,使用0
329                    self.emit(Opcode::PushNumber(dec!(0)));
330                }
331
332                Ok(self.emit(Opcode::Slice))
333            },
334
335            // 区间:编译左右边界
336            Node::Interval { left, right, left_bracket, right_bracket } => {
337                self.compile_node(left)?;
338                self.compile_node(right)?;
339                Ok(self.emit(Opcode::Interval {
340                    left_bracket: *left_bracket,
341                    right_bracket: *right_bracket,
342                }))
343            },
344
345            // 条件表达式:三元操作符 condition ? on_true : on_false
346            Node::Conditional { condition, on_true, on_false } => {
347                self.compile_node(condition)?;
348                let otherwise = self.emit(Opcode::Jump(Jump::IfFalse, 0)); // 条件为假时跳转
349
350                self.emit(Opcode::Pop); // 清理条件值
351                self.compile_node(on_true)?; // 编译真值分支
352                let end = self.emit(Opcode::Jump(Jump::Forward, 0)); // 跳过假值分支
353
354                // 回填假值分支跳转
355                self.replace(
356                    otherwise,
357                    Opcode::Jump(Jump::IfFalse, (end - otherwise) as u32),
358                );
359                self.emit(Opcode::Pop); // 清理栈
360                let b = self.compile_node(on_false)?; // 编译假值分支
361                self.replace(
362                    end,
363                    Opcode::Jump(Jump::Forward, (b - end) as u32),
364                );
365
366                Ok(b)
367            },
368
369            // 一元操作:+x, -x, !x
370            Node::Unary { node, operator } => {
371                let curr = self.compile_node(node)?;
372                match *operator {
373                    Operator::Arithmetic(ArithmeticOperator::Add) => Ok(curr), // +x 不变
374                    Operator::Arithmetic(ArithmeticOperator::Subtract) => {
375                        Ok(self.emit(Opcode::Negate)) // -x 取负
376                    },
377                    Operator::Logical(LogicalOperator::Not) => {
378                        Ok(self.emit(Opcode::Not))
379                    }, // !x 逻辑非
380                    _ => Err(CompilerError::UnknownUnaryOperator {
381                        operator: operator.to_string(),
382                    }),
383                }
384            },
385
386            // 二元操作:处理各种二元操作符
387            Node::Binary { left, right, operator } => match *operator {
388                // 相等比较
389                Operator::Comparison(ComparisonOperator::Equal) => {
390                    self.compile_node(left)?;
391                    self.compile_node(right)?;
392                    Ok(self.emit(Opcode::Equal))
393                },
394
395                // 不等比较:等于操作后取非
396                Operator::Comparison(ComparisonOperator::NotEqual) => {
397                    self.compile_node(left)?;
398                    self.compile_node(right)?;
399                    self.emit(Opcode::Equal);
400                    Ok(self.emit(Opcode::Not))
401                },
402
403                // 逻辑或:短路求值
404                Operator::Logical(LogicalOperator::Or) => {
405                    self.compile_node(left)?;
406                    let end = self.emit(Opcode::Jump(Jump::IfTrue, 0)); // 左值为真时跳过右值
407                    self.emit(Opcode::Pop);
408                    let r = self.compile_node(right)?;
409                    self.replace(
410                        end,
411                        Opcode::Jump(Jump::IfTrue, (r - end) as u32),
412                    );
413                    Ok(r)
414                },
415
416                // 逻辑与:短路求值
417                Operator::Logical(LogicalOperator::And) => {
418                    self.compile_node(left)?;
419                    let end = self.emit(Opcode::Jump(Jump::IfFalse, 0)); // 左值为假时跳过右值
420                    self.emit(Opcode::Pop);
421                    let r = self.compile_node(right)?;
422                    self.replace(
423                        end,
424                        Opcode::Jump(Jump::IfFalse, (r - end) as u32),
425                    );
426                    Ok(r)
427                },
428
429                // 空值合并:左值为null时使用右值
430                Operator::Logical(LogicalOperator::NullishCoalescing) => {
431                    self.compile_node(left)?;
432                    let end = self.emit(Opcode::Jump(Jump::IfNotNull, 0)); // 左值不为null时跳过右值
433                    self.emit(Opcode::Pop);
434                    let r = self.compile_node(right)?;
435                    self.replace(
436                        end,
437                        Opcode::Jump(Jump::IfNotNull, (r - end) as u32),
438                    );
439                    Ok(r)
440                },
441
442                // 包含检查
443                Operator::Comparison(ComparisonOperator::In) => {
444                    self.compile_node(left)?;
445                    self.compile_node(right)?;
446                    Ok(self.emit(Opcode::In))
447                },
448
449                // 不包含检查:包含检查后取非
450                Operator::Comparison(ComparisonOperator::NotIn) => {
451                    self.compile_node(left)?;
452                    self.compile_node(right)?;
453                    self.emit(Opcode::In);
454                    Ok(self.emit(Opcode::Not))
455                },
456
457                // 各种比较操作
458                Operator::Comparison(ComparisonOperator::LessThan) => {
459                    self.compile_node(left)?;
460                    self.compile_node(right)?;
461                    Ok(self.emit(Opcode::Compare(Compare::Less)))
462                },
463                Operator::Comparison(ComparisonOperator::LessThanOrEqual) => {
464                    self.compile_node(left)?;
465                    self.compile_node(right)?;
466                    Ok(self.emit(Opcode::Compare(Compare::LessOrEqual)))
467                },
468                Operator::Comparison(ComparisonOperator::GreaterThan) => {
469                    self.compile_node(left)?;
470                    self.compile_node(right)?;
471                    Ok(self.emit(Opcode::Compare(Compare::More)))
472                },
473                Operator::Comparison(
474                    ComparisonOperator::GreaterThanOrEqual,
475                ) => {
476                    self.compile_node(left)?;
477                    self.compile_node(right)?;
478                    Ok(self.emit(Opcode::Compare(Compare::MoreOrEqual)))
479                },
480
481                // 算术操作
482                Operator::Arithmetic(ArithmeticOperator::Add) => {
483                    self.compile_node(left)?;
484                    self.compile_node(right)?;
485                    Ok(self.emit(Opcode::Add))
486                },
487                Operator::Arithmetic(ArithmeticOperator::Subtract) => {
488                    self.compile_node(left)?;
489                    self.compile_node(right)?;
490                    Ok(self.emit(Opcode::Subtract))
491                },
492                Operator::Arithmetic(ArithmeticOperator::Multiply) => {
493                    self.compile_node(left)?;
494                    self.compile_node(right)?;
495                    Ok(self.emit(Opcode::Multiply))
496                },
497                Operator::Arithmetic(ArithmeticOperator::Divide) => {
498                    self.compile_node(left)?;
499                    self.compile_node(right)?;
500                    Ok(self.emit(Opcode::Divide))
501                },
502                Operator::Arithmetic(ArithmeticOperator::Modulus) => {
503                    self.compile_node(left)?;
504                    self.compile_node(right)?;
505                    Ok(self.emit(Opcode::Modulo))
506                },
507                Operator::Arithmetic(ArithmeticOperator::Power) => {
508                    self.compile_node(left)?;
509                    self.compile_node(right)?;
510                    Ok(self.emit(Opcode::Exponent))
511                },
512                _ => Err(CompilerError::UnknownBinaryOperator {
513                    operator: operator.to_string(),
514                }),
515            },
516
517            // 函数调用:验证参数数量并生成调用指令
518            Node::FunctionCall { kind, arguments } => match kind {
519                FunctionKind::Internal(_)
520                | FunctionKind::Deprecated(_)
521                | FunctionKind::Custom(_) => {
522                    let function = FunctionRegistry::get_definition(kind)
523                        .ok_or_else(|| CompilerError::UnknownFunction {
524                            name: kind.to_string(),
525                        })?;
526
527                    // 验证参数数量
528                    let min_params = function.required_parameters();
529                    let max_params =
530                        min_params + function.optional_parameters();
531                    if arguments.len() < min_params
532                        || arguments.len() > max_params
533                    {
534                        return Err(CompilerError::InvalidFunctionCall {
535                            name: kind.to_string(),
536                            message: "无效的参数数量".to_string(),
537                        });
538                    }
539
540                    // 编译所有参数
541                    for i in 0..arguments.len() {
542                        self.compile_argument(kind, arguments, i)?;
543                    }
544
545                    Ok(self.emit(Opcode::CallFunction {
546                        kind: kind.clone(),
547                        arg_count: arguments.len() as u32,
548                    }))
549                },
550
551                // 闭包函数:特殊处理各种闭包操作
552                FunctionKind::Closure(c) => match c {
553                    // all函数:检查所有元素是否满足条件
554                    ClosureFunction::All => {
555                        self.compile_argument(kind, arguments, 0)?; // 编译数组参数
556                        self.emit(Opcode::Begin);
557                        let mut loop_break: usize = 0;
558                        self.emit_loop(|c| {
559                            c.compile_argument(kind, arguments, 1)?; // 编译条件表达式
560                            loop_break = c.emit(Opcode::Jump(Jump::IfFalse, 0)); // 条件为假时跳出
561                            c.emit(Opcode::Pop);
562                            Ok(())
563                        })?;
564                        let e = self.emit(Opcode::PushBool(true)); // 默认返回true
565                        self.replace(
566                            loop_break,
567                            Opcode::Jump(
568                                Jump::IfFalse,
569                                (e - loop_break) as u32,
570                            ),
571                        );
572                        Ok(self.emit(Opcode::End))
573                    },
574
575                    // none函数:检查没有元素满足条件
576                    ClosureFunction::None => {
577                        self.compile_argument(kind, arguments, 0)?;
578                        self.emit(Opcode::Begin);
579                        let mut loop_break: usize = 0;
580                        self.emit_loop(|c| {
581                            c.compile_argument(kind, arguments, 1)?;
582                            c.emit(Opcode::Not); // 对条件取非
583                            loop_break = c.emit(Opcode::Jump(Jump::IfFalse, 0));
584                            c.emit(Opcode::Pop);
585                            Ok(())
586                        })?;
587                        let e = self.emit(Opcode::PushBool(true));
588                        self.replace(
589                            loop_break,
590                            Opcode::Jump(
591                                Jump::IfFalse,
592                                (e - loop_break) as u32,
593                            ),
594                        );
595                        Ok(self.emit(Opcode::End))
596                    },
597
598                    // some函数:检查至少有一个元素满足条件
599                    ClosureFunction::Some => {
600                        self.compile_argument(kind, arguments, 0)?;
601                        self.emit(Opcode::Begin);
602                        let mut loop_break: usize = 0;
603                        self.emit_loop(|c| {
604                            c.compile_argument(kind, arguments, 1)?;
605                            loop_break = c.emit(Opcode::Jump(Jump::IfTrue, 0)); // 条件为真时跳出
606                            c.emit(Opcode::Pop);
607                            Ok(())
608                        })?;
609                        let e = self.emit(Opcode::PushBool(false)); // 默认返回false
610                        self.replace(
611                            loop_break,
612                            Opcode::Jump(Jump::IfTrue, (e - loop_break) as u32),
613                        );
614                        Ok(self.emit(Opcode::End))
615                    },
616
617                    // one函数:检查恰好有一个元素满足条件
618                    ClosureFunction::One => {
619                        self.compile_argument(kind, arguments, 0)?;
620                        self.emit(Opcode::Begin);
621                        self.emit_loop(|c| {
622                            c.compile_argument(kind, arguments, 1)?;
623                            c.emit_cond(|c| {
624                                c.emit(Opcode::IncrementCount); // 满足条件时增加计数
625                            });
626                            Ok(())
627                        })?;
628                        self.emit(Opcode::GetCount);
629                        self.emit(Opcode::PushNumber(dec!(1)));
630                        self.emit(Opcode::Equal); // 检查计数是否等于1
631                        Ok(self.emit(Opcode::End))
632                    },
633
634                    // filter函数:过滤满足条件的元素
635                    ClosureFunction::Filter => {
636                        self.compile_argument(kind, arguments, 0)?;
637                        self.emit(Opcode::Begin);
638                        self.emit_loop(|c| {
639                            c.compile_argument(kind, arguments, 1)?;
640                            c.emit_cond(|c| {
641                                c.emit(Opcode::IncrementCount);
642                                c.emit(Opcode::Pointer); // 添加当前元素到结果
643                            });
644                            Ok(())
645                        })?;
646                        self.emit(Opcode::GetCount);
647                        self.emit(Opcode::End);
648                        Ok(self.emit(Opcode::Array))
649                    },
650
651                    // map函数:转换每个元素
652                    ClosureFunction::Map => {
653                        self.compile_argument(kind, arguments, 0)?;
654                        self.emit(Opcode::Begin);
655                        self.emit_loop(|c| {
656                            c.compile_argument(kind, arguments, 1)?; // 应用转换表达式
657                            Ok(())
658                        })?;
659                        self.emit(Opcode::GetLen);
660                        self.emit(Opcode::End);
661                        Ok(self.emit(Opcode::Array))
662                    },
663
664                    // flatMap函数:转换并展平结果
665                    ClosureFunction::FlatMap => {
666                        self.compile_argument(kind, arguments, 0)?;
667                        self.emit(Opcode::Begin);
668                        self.emit_loop(|c| {
669                            c.compile_argument(kind, arguments, 1)?;
670                            Ok(())
671                        })?;
672                        self.emit(Opcode::GetLen);
673                        self.emit(Opcode::End);
674                        self.emit(Opcode::Array);
675                        Ok(self.emit(Opcode::Flatten)) // 展平结果数组
676                    },
677
678                    // count函数:计算满足条件的元素数量
679                    ClosureFunction::Count => {
680                        self.compile_argument(kind, arguments, 0)?;
681                        self.emit(Opcode::Begin);
682                        self.emit_loop(|c| {
683                            c.compile_argument(kind, arguments, 1)?;
684                            c.emit_cond(|c| {
685                                c.emit(Opcode::IncrementCount);
686                            });
687                            Ok(())
688                        })?;
689                        self.emit(Opcode::GetCount);
690                        Ok(self.emit(Opcode::End))
691                    },
692                },
693            },
694
695            // 方法调用:验证参数数量并生成调用指令
696            Node::MethodCall { kind, this, arguments } => {
697                let method =
698                    MethodRegistry::get_definition(kind).ok_or_else(|| {
699                        CompilerError::UnknownFunction {
700                            name: kind.to_string(),
701                        }
702                    })?;
703
704                self.compile_node(this)?; // 编译调用对象
705
706                // 验证参数数量(方法的第一个参数是this,所以减1)
707                let min_params = method.required_parameters() - 1;
708                let max_params = min_params + method.optional_parameters();
709                if arguments.len() < min_params || arguments.len() > max_params
710                {
711                    return Err(CompilerError::InvalidMethodCall {
712                        name: kind.to_string(),
713                        message: "Invalid number of arguments".to_string(),
714                    });
715                }
716
717                // 编译所有参数
718                for i in 0..arguments.len() {
719                    self.compile_argument(kind, arguments, i)?;
720                }
721
722                Ok(self.emit(Opcode::CallMethod {
723                    kind: kind.clone(),
724                    arg_count: arguments.len() as u32,
725                }))
726            },
727
728            // 错误节点:不应该在编译时遇到
729            Node::Error { .. } => Err(CompilerError::UnexpectedErrorNode),
730        }
731    }
732}