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
```
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 } };
};
```

View file

@ -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) {

View file

@ -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();

View file

@ -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",
),
),
),

View file

@ -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,
]

View file

@ -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,