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 { fn main() -> u16 {
let heehoo = 10; let heehoo = 10;
let list = array(); let mut list = array();
list[1] = 5;
return list[0]; return list[0];
} }

View File

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

View File

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

View File

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