feat: 添加数组字面量和索引访问功能,更新解析器和解释器以支持数组操作
This commit is contained in:
@@ -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 }
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user