From d7bcac6916bff8c8b44cda2b1fd37a1ed7876d85 Mon Sep 17 00:00:00 2001 From: me Date: Fri, 26 Dec 2025 08:35:59 +0200 Subject: [PATCH] include --- src/ast/types.rs | 29 +++++++++++-------- src/interpret/interpret.rs | 2 +- src/parser/parser.rs | 25 +++++++++++++++- src/parser/scanner.rs | 1 + ...parser__parser__tests__let_loop_count.snap | 6 ++-- src/parser/types.rs | 1 + src/runtime/runtime.rs | 3 +- 7 files changed, 48 insertions(+), 19 deletions(-) diff --git a/src/ast/types.rs b/src/ast/types.rs index 1d5b295..1801ee2 100644 --- a/src/ast/types.rs +++ b/src/ast/types.rs @@ -2,6 +2,22 @@ use std::collections::BTreeMap; +/// A Program. +#[derive(PartialEq, PartialOrd, Debug, Clone)] +pub struct Program { + pub defs: Vec, +} + +#[derive(PartialEq, PartialOrd, Debug, Clone)] +pub struct File(pub String); + +#[derive(PartialEq, PartialOrd, Debug, Clone)] +pub struct Definition { + pub mutable: bool, + pub name: Name, + pub expr: Expr, +} + /// An expression. #[derive(PartialEq, PartialOrd, Debug, Clone)] pub enum Expr { @@ -77,13 +93,6 @@ pub enum Statement { Break, } -#[derive(PartialEq, PartialOrd, Debug, Clone)] -pub struct Definition { - pub mutable: bool, - pub name: Name, - pub expr: Expr, -} - /// A reduced value. #[derive(PartialEq, PartialOrd, Debug, Clone)] pub enum Value { @@ -136,10 +145,6 @@ pub struct Record(pub BTreeMap); #[derive(PartialEq, PartialOrd, Debug, Clone)] pub struct Vector(pub Vec); -/// A Program. -#[derive(PartialEq, PartialOrd, Debug, Clone)] -pub struct Program(pub Vec); - // ----- // // Impls // // ----- // @@ -225,7 +230,7 @@ impl From for Expr { impl From> for Program { fn from(defs: Vec) -> Program { - Program(defs) + Program { defs } } } diff --git a/src/interpret/interpret.rs b/src/interpret/interpret.rs index 9cb5bca..357bd1b 100644 --- a/src/interpret/interpret.rs +++ b/src/interpret/interpret.rs @@ -13,7 +13,7 @@ pub fn global_env_name() -> ast::EnvName { pub fn setup(program: ast::Program, prim_funcs: PrimitiveFuncs) -> Result { let mut state = State::new(global_env_name().0.clone(), prim_funcs); - defs_to_env(program.0, &global_env_name(), &mut state)?; + defs_to_env(program.defs, &global_env_name(), &mut state)?; Ok(state) } diff --git a/src/parser/parser.rs b/src/parser/parser.rs index b3cc84c..3b3aaee 100644 --- a/src/parser/parser.rs +++ b/src/parser/parser.rs @@ -15,7 +15,30 @@ pub fn parse(tokens: &mut Tokens, parser: Parser) -> Result { } pub fn parse_program(tokens: &mut Tokens) -> ParseResult { - Ok(parse_definitions(tokens)?.map(ast::Program)) + Ok(parse_definitions(tokens)?.map(|defs| ast::Program { defs })) +} + +fn parse_includes(tokens: &mut Tokens) -> ParseResult> { + tokens.many(parse_include) +} + +fn parse_include(tokens: &mut Tokens) -> ParseResult { + if let Some(_) = tokens.next_if(&Token::Include) { + if let Some(LocatedToken { + token: Token::String(string), + .. + }) = tokens.next_if(&Token::String("".into())) + { + Ok(Some(ast::File(string))) + } else { + Err(Error::UnexpectedToken { + expected: Token::String("".into()), + got: tokens.next(), + }) + } + } else { + Ok(None) + } } fn parse_definitions(tokens: &mut Tokens) -> ParseResult> { diff --git a/src/parser/scanner.rs b/src/parser/scanner.rs index 452e15f..522d332 100644 --- a/src/parser/scanner.rs +++ b/src/parser/scanner.rs @@ -304,6 +304,7 @@ pub fn scan(source: String) -> Tokens { "if" => Token::If, "else" => Token::Else, "return" => Token::Return, + "include" => Token::Include, "loop" => Token::Loop, "break" => Token::Break, "true" => Token::True, diff --git a/src/parser/snapshots/ayin__parser__parser__tests__let_loop_count.snap b/src/parser/snapshots/ayin__parser__parser__tests__let_loop_count.snap index 45abc09..5d87810 100644 --- a/src/parser/snapshots/ayin__parser__parser__tests__let_loop_count.snap +++ b/src/parser/snapshots/ayin__parser__parser__tests__let_loop_count.snap @@ -3,8 +3,8 @@ source: src/parser/parser.rs expression: result --- Ok( - Program( - [ + Program { + defs: [ Definition { mutable: false, name: Name( @@ -124,5 +124,5 @@ Ok( ), }, ], - ), + }, ) diff --git a/src/parser/types.rs b/src/parser/types.rs index 3c77b6c..685115c 100644 --- a/src/parser/types.rs +++ b/src/parser/types.rs @@ -24,6 +24,7 @@ pub enum Token { If, Else, Return, + Include, OpenParen, CloseParen, OpenBracket, diff --git a/src/runtime/runtime.rs b/src/runtime/runtime.rs index d9eb8d7..442ca65 100644 --- a/src/runtime/runtime.rs +++ b/src/runtime/runtime.rs @@ -136,7 +136,7 @@ pub fn fetch_events(state: &mut State) -> Input { input.gamepad1.dpad.up = is_key_down(KeyCode::Up); input.gamepad1.dpad.down = is_key_down(KeyCode::Down); - for gamepad in state.gamepads.all() { + if let Some(gamepad) = state.gamepads.all().next() { //println!("{:#?}", gamepad.all_currently_pressed().collect::>()); // action buttons input.gamepad1.buttons.a = gamepad.is_currently_pressed(gamepads::Button::ActionRight); @@ -165,7 +165,6 @@ pub fn fetch_events(state: &mut State) -> Input { input.gamepad1.right_stick.x = gamepad.right_stick_x(); input.gamepad1.right_stick.y = gamepad.right_stick_y(); - break; } input }