From 95fedac802226f9de85bd5e788eafb938535f444 Mon Sep 17 00:00:00 2001 From: LunarAkai Date: Thu, 7 Aug 2025 13:19:26 +0200 Subject: [PATCH] hmm --- .../abstract_syntax_tree/ast.rs | 2 +- .../abstract_syntax_tree/parser.rs | 28 +++++++++++++++++-- src/language_frontend/lexer/tokens.rs | 14 ++++++++-- 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/src/language_frontend/abstract_syntax_tree/ast.rs b/src/language_frontend/abstract_syntax_tree/ast.rs index 53603de..eac5c97 100644 --- a/src/language_frontend/abstract_syntax_tree/ast.rs +++ b/src/language_frontend/abstract_syntax_tree/ast.rs @@ -1,6 +1,6 @@ /// Abstract Syntax Tree -#[derive(Debug)] +#[derive(Debug, Clone)] pub enum Expression<'src> { // Identifier Ident(&'src str), diff --git a/src/language_frontend/abstract_syntax_tree/parser.rs b/src/language_frontend/abstract_syntax_tree/parser.rs index aabcdf1..1579832 100644 --- a/src/language_frontend/abstract_syntax_tree/parser.rs +++ b/src/language_frontend/abstract_syntax_tree/parser.rs @@ -1,5 +1,5 @@ use chumsky::{ - combinator::Or, error::Rich, extra, input::ValueInput, prelude::{choice, just, recursive}, primitive::select, recursive, select, select_ref, span::SimpleSpan, text::{self, ascii::{ident, keyword}, whitespace}, Boxed, IterParser, Parser + combinator::Or, error::Rich, extra, input::ValueInput, prelude::{choice, just, nested_delimiters, recursive, via_parser}, primitive::select, recursive, select, select_ref, span::{self, SimpleSpan}, text::{self, ascii::{ident, keyword}, whitespace}, Boxed, ConfigIterParser, IterParser, Parser }; use crate::{language_frontend::abstract_syntax_tree::ast::Expression, language_frontend::lexer::tokens::Token}; @@ -22,16 +22,38 @@ where Token::Keyword(k) if k == kw => (), } }; + + let eq = just(Token::Equals).labelled("="); + /* + let block = recursive(|block| { + let indent = just(Token::NewLine) + .ignore_then(just(Token::Indent)) + .ignore_then(block.clone().separated_by(just(Token::NewLine)).at_least(1)) + .then_ignore(just(Token::Dedent)); + + block.with_ctx(0) + }); + + */ + let expr = recursive(|expr| { + let block = expr + .clone() + .delimited_by(just(Token::BraceBegin), just(Token::BraceEnd)); + + // 'Atoms' are expressions that contain no ambiguity let atom = select! { Token::Float(x) => Expression::Float(x), Token::Integer(x) => Expression::Integer(x), - }.or(expr.clone().delimited_by(just(Token::ParenBegin), just(Token::ParenEnd))); + }.or( + expr.clone().delimited_by(just(Token::ParenBegin), + just(Token::ParenEnd)) + ).or(block); let unary = just(Token::Substract) @@ -59,6 +81,8 @@ where add_sub }); + + let decl = recursive(|decl| { let var = keyword("var") .ignore_then(ident) diff --git a/src/language_frontend/lexer/tokens.rs b/src/language_frontend/lexer/tokens.rs index 67ba1ac..7a428af 100644 --- a/src/language_frontend/lexer/tokens.rs +++ b/src/language_frontend/lexer/tokens.rs @@ -3,9 +3,14 @@ use std::fmt; use logos::{Lexer, Logos}; #[derive(Logos, Debug, Clone, PartialEq)] -#[logos(skip r"[ \t\r\n\f]+")] // Skip whitespace +#[logos(skip r"[ \r\f]+")] // Skip whitespace pub enum Token<'src> { Error, + Null, + + Indent, + NewLine, + Dedent, #[token("false", |_| false)] #[token("true", |_| true)] @@ -66,6 +71,10 @@ impl fmt::Display for Token<'_> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { match self { Token::Float(s) => write!(f, "{s}"), + Token::Null => write!(f, ""), + Token::Indent => write!(f, ""), + Token::NewLine => write!(f, ""), + Token::Dedent => write!(f, ""), Token::Add => write!(f, "+"), Token::Bool(_) => write!(f, "+"), Token::Substract => write!(f, "-"), @@ -81,7 +90,8 @@ impl fmt::Display for Token<'_> { Token::Ident(s) => write!(f, "{s}"), Token::String(s) => write!(f, "{s}"), Token::Keyword(s) => write!(f, "{s}"), - Token::Error => write!(f, "") + Token::Error => write!(f, ""), + } } }