devalang_core/core/parser/handler/
bank.rs1use crate::core::{
2 lexer::token::TokenKind,
3 parser::{ statement::{ Statement, StatementKind }, driver::Parser },
4 shared::value::Value,
5 store::global::GlobalStore,
6};
7
8pub fn parse_bank_token(parser: &mut Parser, _global_store: &mut GlobalStore) -> Statement {
9 parser.advance(); let Some(bank_token) = parser.previous_clone() else {
12 return Statement::unknown();
13 };
14
15 let bank_value = if let Some(token) = parser.peek_clone() {
16 match token.kind {
17 TokenKind::Identifier | TokenKind::Number => {
18 parser.advance(); let mut value = token.lexeme.clone();
21
22 if let Some(next) = parser.peek_clone() {
24 if next.kind == TokenKind::Dot {
25 parser.advance(); if let Some(last) = parser.peek_clone() {
27 match last.kind {
28 TokenKind::Identifier | TokenKind::Number => {
29 parser.advance();
30 value = format!("{}.{}", value, last.lexeme);
31 Value::String(value)
32 }
33 _ => Value::Unknown,
34 }
35 } else {
36 Value::Unknown
37 }
38 } else {
39 match token.kind {
40 TokenKind::Identifier => Value::Identifier(value),
41 TokenKind::Number => Value::Number(value.parse::<f32>().unwrap_or(0.0)),
42 _ => Value::Unknown,
43 }
44 }
45 } else {
46 match token.kind {
47 TokenKind::Identifier => Value::Identifier(value),
48 TokenKind::Number => Value::Number(value.parse::<f32>().unwrap_or(0.0)),
49 _ => Value::Unknown,
50 }
51 }
52 }
53 _ => Value::Unknown,
54 }
55 } else {
56 return Statement::error(
57 bank_token,
58 "Expected identifier or number after 'bank'".to_string()
59 );
60 };
61
62 Statement {
63 kind: StatementKind::Bank,
64 value: bank_value,
65 indent: bank_token.indent,
66 line: bank_token.line,
67 column: bank_token.column,
68 }
69}