devalang_core/core/parser/handler/identifier/
print.rs1use crate::core::{
2 lexer::token::{Token, TokenKind},
3 parser::{
4 driver::Parser,
5 statement::{Statement, StatementKind},
6 },
7 store::global::GlobalStore,
8};
9
10pub fn parse_print_token(
11 parser: &mut Parser,
12 current_token: Token,
13 _global_store: &mut GlobalStore,
14) -> Statement {
15 parser.advance();
17
18 let collected = parser.collect_until(|t| matches!(t.kind, TokenKind::Newline | TokenKind::EOF));
19 let value = if collected.len() == 1 {
21 match collected[0].kind {
22 TokenKind::Identifier => {
23 crate::core::shared::value::Value::Identifier(collected[0].lexeme.clone())
24 }
25 TokenKind::String => {
26 crate::core::shared::value::Value::String(collected[0].lexeme.clone())
27 }
28 TokenKind::Number => {
29 let n = collected[0].lexeme.parse::<f32>().unwrap_or(0.0);
30 crate::core::shared::value::Value::Number(n)
31 }
32 _ => crate::core::shared::value::Value::String(collected[0].lexeme.clone()),
33 }
34 } else {
35 let text = collected
37 .iter()
38 .filter(|t| !matches!(t.kind, TokenKind::Newline | TokenKind::EOF))
39 .map(|t| t.lexeme.clone())
40 .collect::<Vec<_>>()
41 .join(" ");
42 crate::core::shared::value::Value::String(text.trim().to_string())
43 };
44
45 Statement {
46 kind: StatementKind::Print,
47 value,
48 indent: current_token.indent,
49 line: current_token.line,
50 column: current_token.column,
51 }
52}