From 08cb1109c7c53b5c896037339e8d399a3a7bbad7 Mon Sep 17 00:00:00 2001 From: me Date: Fri, 19 Dec 2025 10:48:31 +0200 Subject: [PATCH] lexer positions --- readme.md | 10 ++-- src/parser/parser.rs | 4 +- src/parser/scanner.rs | 49 ++++++++++++++++--- ...__parser__parser__tests__full_program.snap | 4 +- ...__parser__scanner__tests__scaffolding.snap | 17 ++++--- src/parser/types.rs | 15 +++++- 6 files changed, 74 insertions(+), 25 deletions(-) diff --git a/readme.md b/readme.md index dbb44ba..a3e4a2c 100644 --- a/readme.md +++ b/readme.md @@ -13,14 +13,14 @@ Ayin - first class functions ``` -let init = fn() { +let setup = fn() { return { - player: { position: { x: 10, y: 20 }, }, - } + .player: { .position: { .x: 10, .y: 20 }, }, + }; }; let update = fn(state, events) { - return state'; + return state; }; let draw = fn(frame, state) { @@ -28,7 +28,7 @@ let draw = fn(frame, state) { }; let migrate = fn(state) { - return { player: { pos: state.player.position } }; + return { .player: { .pos: state.player.position } }; }; ``` diff --git a/src/parser/parser.rs b/src/parser/parser.rs index bd37e91..0f591f4 100644 --- a/src/parser/parser.rs +++ b/src/parser/parser.rs @@ -395,14 +395,14 @@ mod tests { #[test] fn full_program() { let program = " -let init = fn() { +let setup = fn() { return { .player: { .position: { .x: 10, .y: 20 }, }, }; }; let update = fn(state, events) { - return state2; + return state; }; let draw = fn(frame, state) { diff --git a/src/parser/scanner.rs b/src/parser/scanner.rs index a4eb480..d137256 100644 --- a/src/parser/scanner.rs +++ b/src/parser/scanner.rs @@ -1,7 +1,44 @@ use super::types::*; use chumsky::text::Char; use log; -use lyn::Scanner; +use lyn; + +pub struct Scanner { + scanner: lyn::Scanner, + cursor: Pos, +} + +impl Scanner { + pub fn new(string: &str) -> Scanner { + let scanner = lyn::Scanner::new(string); + Scanner { + scanner, + cursor: Pos { line: 1, column: 1 }, + } + } + pub fn peek(&self) -> Option<&char> { + self.scanner.peek() + } + pub fn pop(&mut self) -> Option<&char> { + let ch = self.scanner.pop(); + match ch { + Some(&'\n') => { + self.cursor.line += 1; + self.cursor.column = 1; + } + _ => { + self.cursor.column += 1; + } + } + //if let Some(chr) = ch { + // println!("'{}' {}", chr, self.cursor); + //} + ch + } + pub fn cursor(&self) -> Pos { + self.cursor.clone() + } +} pub fn scan(source: String) -> Tokens { let mut scanner = Scanner::new(&source); @@ -214,14 +251,14 @@ let main = fn (x) { #[test] fn scaffolding() { let program = " -let init = fn() { +let setup = fn() { return { - player: { position: { x: 10, y: 20 }, }, - } + .player: { .position: { .x: 10, .y: 20 }, }, + }; }; let update = fn(state, events) { - return state'; + return state; }; let draw = fn(frame, state) { @@ -229,7 +266,7 @@ let draw = fn(frame, state) { }; let migrate = fn(state) { - return { player: { pos: state.player.position } }, + return { .player: { .pos: state.player.position } }; }; " .to_string(); diff --git a/src/parser/snapshots/ayin__parser__parser__tests__full_program.snap b/src/parser/snapshots/ayin__parser__parser__tests__full_program.snap index b4ce559..f1624ae 100644 --- a/src/parser/snapshots/ayin__parser__parser__tests__full_program.snap +++ b/src/parser/snapshots/ayin__parser__parser__tests__full_program.snap @@ -7,7 +7,7 @@ Ok( Definition { mutable: false, name: Name( - "init", + "setup", ), expr: Func( Fn { @@ -78,7 +78,7 @@ Ok( Some( Var( Name( - "state2", + "state", ), ), ), diff --git a/src/parser/snapshots/ayin__parser__scanner__tests__scaffolding.snap b/src/parser/snapshots/ayin__parser__scanner__tests__scaffolding.snap index 28ceab5..253c9ad 100644 --- a/src/parser/snapshots/ayin__parser__scanner__tests__scaffolding.snap +++ b/src/parser/snapshots/ayin__parser__scanner__tests__scaffolding.snap @@ -5,7 +5,7 @@ expression: result [ Let, Identifier( - "init", + "setup", ), Equals, Fn, @@ -14,17 +14,17 @@ expression: result OpenCurly, Return, OpenCurly, - Identifier( + Label( "player", ), Colon, OpenCurly, - Identifier( + Label( "position", ), Colon, OpenCurly, - Identifier( + Label( "x", ), Colon, @@ -32,7 +32,7 @@ expression: result 10, ), Comma, - Identifier( + Label( "y", ), Colon, @@ -44,6 +44,7 @@ expression: result CloseCurly, Comma, CloseCurly, + Semicolon, CloseCurly, Semicolon, Let, @@ -121,12 +122,12 @@ expression: result OpenCurly, Return, OpenCurly, - Identifier( + Label( "player", ), Colon, OpenCurly, - Identifier( + Label( "pos", ), Colon, @@ -141,7 +142,7 @@ expression: result ), CloseCurly, CloseCurly, - Comma, + Semicolon, CloseCurly, Semicolon, ] diff --git a/src/parser/types.rs b/src/parser/types.rs index 7b9d9e4..28d9c0a 100644 --- a/src/parser/types.rs +++ b/src/parser/types.rs @@ -1,10 +1,21 @@ #[derive(Debug, Clone, PartialEq, Eq)] pub struct LocatedToken { - pub start: usize, - pub end: usize, + pub start: Pos, + pub end: Pos, pub token: Token, } +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct Pos { + pub line: usize, + pub column: usize, +} +impl std::fmt::Display for Pos { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + write!(f, "{}:{}", self.line, self.column) + } +} + #[derive(Debug, Clone, PartialEq, Eq)] pub enum Token { Let,