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
|
- 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 } };
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue