lexer positions
This commit is contained in:
parent
eb886688ad
commit
08cb1109c7
6 changed files with 74 additions and 25 deletions
10
readme.md
10
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 } };
|
||||
};
|
||||
```
|
||||
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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();
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
),
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
]
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue