feat: 添加数组字面量和索引访问功能,更新解析器和解释器以支持数组操作

This commit is contained in:
0264408
2026-04-28 10:14:13 +08:00
parent 5dc55c3476
commit dd3f18da6f
7 changed files with 177 additions and 0 deletions
+26
View File
@@ -193,6 +193,7 @@ impl Parser {
return match expr {
Expr::Variable(name) => Expr::Assign { name, value: Box::new(value) },
Expr::Get { object, name } => Expr::Set { object, name, value: Box::new(value) },
Expr::IndexGet { array, index } => Expr::IndexSet { array, index, value: Box::new(value) },
_ => panic!("Invalid assignment target."),
};
}
@@ -354,6 +355,13 @@ impl Parser {
object: Box::new(expr),
name,
};
} else if self.match_kind(&[TokenKind::LeftBracket]) {
let index = self.expression();
self.consume(TokenKind::RightBracket, "Expected ']' after index.").unwrap();
expr = Expr::IndexGet {
array: Box::new(expr),
index: Box::new(index),
};
} else {
break;
}
@@ -410,6 +418,10 @@ impl Parser {
return self.object_literal();
}
if self.match_kind(&[TokenKind::LeftBracket]) {
return self.array_literal();
}
panic!("Expected expression at line {}", self.peek().line);
}
@@ -492,4 +504,18 @@ impl Parser {
self.consume(TokenKind::RightBrace, "Expected '}' after object literal").unwrap();
Expr::ObjectLiteral { properties }
}
fn array_literal(&mut self) -> Expr {
let mut elements = Vec::new();
if !self.check(&TokenKind::RightBracket) {
loop {
elements.push(self.expression());
if !self.match_kind(&[TokenKind::Comma]) {
break;
}
}
}
self.consume(TokenKind::RightBracket, "Expected ']' after array literal").unwrap();
Expr::ArrayLiteral { elements }
}
}