Add parsing for setting indexed values

This commit is contained in:
Sofia 2025-07-13 18:02:27 +03:00
parent df6b5ef34b
commit bf8baa7cd4
4 changed files with 55 additions and 24 deletions

View File

@ -7,7 +7,9 @@ fn array() -> [u16; 4] {
fn main() -> u16 {
let heehoo = 10;
let list = array();
let mut list = array();
list[1] = 5;
return list[0];
}

View File

@ -132,11 +132,17 @@ pub struct Block(
pub TokenRange,
);
#[derive(Debug, Clone)]
pub enum VariableReference {
Name(String),
Index(Box<VariableReference>, u64),
}
#[derive(Debug, Clone)]
pub enum BlockLevelStatement {
Let(LetStatement),
/// Try to set a variable to a specified expression value
Set(String, Expression, TokenRange),
Set(VariableReference, Expression, TokenRange),
Import {
_i: ImportStatement,
},

View File

@ -115,17 +115,11 @@ impl Parse for PrimaryExpression {
Err(stream.expected_err("expression")?)?
};
while let Some(Token::BracketOpen) = stream.peek() {
stream.next(); // Consume BracketOpen
if let Some(Token::DecimalValue(idx)) = stream.next() {
stream.expect(Token::BracketClose)?;
expr = Expression(
ExpressionKind::Index(Box::new(expr), idx),
stream.get_range().unwrap(),
);
} else {
return Err(stream.expected_err("array index (number)")?);
}
while let Ok(ValueIndex(idx)) = stream.parse() {
expr = Expression(
ExpressionKind::Index(Box::new(expr), idx),
stream.get_range().unwrap(),
);
}
Ok(PrimaryExpression(expr))
@ -360,7 +354,6 @@ impl Parse for Block {
// Special list of expressions that are simply not warned about,
// if semicolon is missing.
if !matches!(e, Expression(ExpressionKind::IfExpr(_), _)) {
dbg!(r_type, &e);
println!("Oh no, does this statement lack ;");
}
@ -387,6 +380,39 @@ impl Parse for Block {
}
}
impl Parse for VariableReference {
fn parse(mut stream: TokenStream) -> Result<Self, Error> {
if let Some(Token::Identifier(ident)) = stream.next() {
let mut var_ref = VariableReference::Name(ident);
dbg!(&var_ref);
while let Ok(ValueIndex(idx)) = stream.parse() {
dbg!(idx);
var_ref = VariableReference::Index(Box::new(var_ref), idx);
}
Ok(var_ref)
} else {
Err(stream.expected_err("identifier")?)?
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct ValueIndex(u64);
impl Parse for ValueIndex {
fn parse(mut stream: TokenStream) -> Result<Self, Error> {
stream.expect(Token::BracketOpen)?;
if let Some(Token::DecimalValue(idx)) = stream.next() {
stream.expect(Token::BracketClose)?;
Ok(ValueIndex(idx))
} else {
return Err(stream.expected_err("array index (number)")?);
}
}
}
impl Parse for BlockLevelStatement {
fn parse(mut stream: TokenStream) -> Result<Self, Error> {
use BlockLevelStatement as Stmt;
@ -421,18 +447,15 @@ impl Parse for BlockLevelStatement {
}
#[derive(Debug)]
pub struct SetStatement(String, Expression, TokenRange);
pub struct SetStatement(VariableReference, Expression, TokenRange);
impl Parse for SetStatement {
fn parse(mut stream: TokenStream) -> Result<Self, Error> {
if let Some(Token::Identifier(ident)) = stream.next() {
stream.expect(Token::Equals)?;
let expr = stream.parse()?;
stream.expect(Token::Semi)?;
Ok(Self(ident, expr, stream.get_range().unwrap()))
} else {
Err(stream.expected_err("identifier")?)?
}
let var_ref = stream.parse()?;
stream.expect(Token::Equals)?;
let expr = stream.parse()?;
stream.expect(Token::Semi)?;
Ok(SetStatement(var_ref, expr, stream.get_range().unwrap()))
}
}

View File

@ -79,7 +79,7 @@ impl ast::Block {
StmtKind::Set(
VariableReference(
mir::TypeKind::Vague(mir::VagueType::Unknown),
name.clone(),
todo!(), // was name.clone()
(*range).into(),
),
expression.process(),