lexer positions

This commit is contained in:
me 2025-12-19 10:48:31 +02:00
parent eb886688ad
commit 08cb1109c7
6 changed files with 74 additions and 25 deletions

View file

@ -13,14 +13,14 @@ Ayin
- first class functions - first class functions
``` ```
let init = fn() { let setup = fn() {
return { return {
player: { position: { x: 10, y: 20 }, }, .player: { .position: { .x: 10, .y: 20 }, },
} };
}; };
let update = fn(state, events) { let update = fn(state, events) {
return state'; return state;
}; };
let draw = fn(frame, state) { let draw = fn(frame, state) {
@ -28,7 +28,7 @@ let draw = fn(frame, state) {
}; };
let migrate = fn(state) { let migrate = fn(state) {
return { player: { pos: state.player.position } }; return { .player: { .pos: state.player.position } };
}; };
``` ```

View file

@ -395,14 +395,14 @@ mod tests {
#[test] #[test]
fn full_program() { fn full_program() {
let program = " let program = "
let init = fn() { let setup = fn() {
return { return {
.player: { .position: { .x: 10, .y: 20 }, }, .player: { .position: { .x: 10, .y: 20 }, },
}; };
}; };
let update = fn(state, events) { let update = fn(state, events) {
return state2; return state;
}; };
let draw = fn(frame, state) { let draw = fn(frame, state) {

View file

@ -1,7 +1,44 @@
use super::types::*; use super::types::*;
use chumsky::text::Char; use chumsky::text::Char;
use log; 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 { pub fn scan(source: String) -> Tokens {
let mut scanner = Scanner::new(&source); let mut scanner = Scanner::new(&source);
@ -214,14 +251,14 @@ let main = fn (x) {
#[test] #[test]
fn scaffolding() { fn scaffolding() {
let program = " let program = "
let init = fn() { let setup = fn() {
return { return {
player: { position: { x: 10, y: 20 }, }, .player: { .position: { .x: 10, .y: 20 }, },
} };
}; };
let update = fn(state, events) { let update = fn(state, events) {
return state'; return state;
}; };
let draw = fn(frame, state) { let draw = fn(frame, state) {
@ -229,7 +266,7 @@ let draw = fn(frame, state) {
}; };
let migrate = fn(state) { let migrate = fn(state) {
return { player: { pos: state.player.position } }, return { .player: { .pos: state.player.position } };
}; };
" "
.to_string(); .to_string();

View file

@ -7,7 +7,7 @@ Ok(
Definition { Definition {
mutable: false, mutable: false,
name: Name( name: Name(
"init", "setup",
), ),
expr: Func( expr: Func(
Fn { Fn {
@ -78,7 +78,7 @@ Ok(
Some( Some(
Var( Var(
Name( Name(
"state2", "state",
), ),
), ),
), ),

View file

@ -5,7 +5,7 @@ expression: result
[ [
Let, Let,
Identifier( Identifier(
"init", "setup",
), ),
Equals, Equals,
Fn, Fn,
@ -14,17 +14,17 @@ expression: result
OpenCurly, OpenCurly,
Return, Return,
OpenCurly, OpenCurly,
Identifier( Label(
"player", "player",
), ),
Colon, Colon,
OpenCurly, OpenCurly,
Identifier( Label(
"position", "position",
), ),
Colon, Colon,
OpenCurly, OpenCurly,
Identifier( Label(
"x", "x",
), ),
Colon, Colon,
@ -32,7 +32,7 @@ expression: result
10, 10,
), ),
Comma, Comma,
Identifier( Label(
"y", "y",
), ),
Colon, Colon,
@ -44,6 +44,7 @@ expression: result
CloseCurly, CloseCurly,
Comma, Comma,
CloseCurly, CloseCurly,
Semicolon,
CloseCurly, CloseCurly,
Semicolon, Semicolon,
Let, Let,
@ -121,12 +122,12 @@ expression: result
OpenCurly, OpenCurly,
Return, Return,
OpenCurly, OpenCurly,
Identifier( Label(
"player", "player",
), ),
Colon, Colon,
OpenCurly, OpenCurly,
Identifier( Label(
"pos", "pos",
), ),
Colon, Colon,
@ -141,7 +142,7 @@ expression: result
), ),
CloseCurly, CloseCurly,
CloseCurly, CloseCurly,
Comma, Semicolon,
CloseCurly, CloseCurly,
Semicolon, Semicolon,
] ]

View file

@ -1,10 +1,21 @@
#[derive(Debug, Clone, PartialEq, Eq)] #[derive(Debug, Clone, PartialEq, Eq)]
pub struct LocatedToken { pub struct LocatedToken {
pub start: usize, pub start: Pos,
pub end: usize, pub end: Pos,
pub token: Token, 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)] #[derive(Debug, Clone, PartialEq, Eq)]
pub enum Token { pub enum Token {
Let, Let,