From 4accaa2edc8be1eea667be842de2f7f52373dc99 Mon Sep 17 00:00:00 2001 From: YannAhlgrim Date: Fri, 22 May 2026 15:20:05 +0200 Subject: [PATCH] parser --- src/ast/mod.rs | 47 ++++++++++++++++++++++++++++++++++++++++++++++- src/main.rs | 1 + src/parser/mod.rs | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+), 1 deletion(-) create mode 100644 src/parser/mod.rs diff --git a/src/ast/mod.rs b/src/ast/mod.rs index 2196ca2..fd94bc7 100644 --- a/src/ast/mod.rs +++ b/src/ast/mod.rs @@ -1,3 +1,5 @@ +use crate::token; + trait NodeTrait { fn token_literal(&self) -> String; } @@ -9,6 +11,14 @@ trait StatementTrait: NodeTrait { trait ExpressionTrait: NodeTrait { fn expression_node(&self); } +struct Expression { + // +} +impl NodeTrait for Expression { + fn token_literal(&self) -> String { + todo!() + } +} struct Statement { // @@ -23,7 +33,7 @@ impl StatementTrait for Statement { fn statement_node(&self) {} } -struct Program { +pub struct Program { statements: Vec, } @@ -36,3 +46,38 @@ impl NodeTrait for Program { } } } + +struct LetStatement { + token: token::Token, + name: Identifier, + value: Expression, +} + +impl NodeTrait for LetStatement { + fn token_literal(&self) -> String { + String::from(&self.token.literal) + } +} + +impl StatementTrait for LetStatement { + fn statement_node(&self) { + todo!() + } +} + +struct Identifier { + token: token::Token, + value: String, +} + +impl NodeTrait for Identifier { + fn token_literal(&self) -> String { + String::from(&self.token.literal) + } +} + +impl ExpressionTrait for Identifier { + fn expression_node(&self) { + todo!() + } +} diff --git a/src/main.rs b/src/main.rs index 0e0430b..0079669 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,5 +1,6 @@ mod ast; mod lexer; +mod parser; mod repl; mod token; diff --git a/src/parser/mod.rs b/src/parser/mod.rs new file mode 100644 index 0000000..9e6a00c --- /dev/null +++ b/src/parser/mod.rs @@ -0,0 +1,47 @@ +use crate::{ + ast, + lexer::{self, LexerTraits}, + token, +}; + +pub struct Parser { + lexer: lexer::Lexer, + cur_token: token::Token, + peek_token: token::Token, +} + +trait PaserTrait { + fn next_token(&mut self); + fn parse_program(&self) -> ast::Program; +} + +pub fn new(l: lexer::Lexer) -> Parser { + let mut p: Parser = Parser { + lexer: l, + cur_token: token::Token { + literal: String::new(), + type_: String::new(), + }, + peek_token: token::Token { + literal: String::new(), + type_: String::new(), + }, + }; + p.next_token(); + p.next_token(); + p +} + +impl PaserTrait for Parser { + fn next_token(&mut self) { + self.cur_token = token::Token { + literal: String::from(&self.peek_token.literal), + type_: String::from(&self.peek_token.type_), + }; + self.peek_token = self.lexer.next_token(); + } + + fn parse_program(&self) -> ast::Program { + todo!() + } +}