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