Initial commit. Very rudimentary lexer.
This commit is contained in:
commit
b3177a612f
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
/target
|
||||
.idea
|
7
Cargo.lock
generated
Normal file
7
Cargo.lock
generated
Normal file
@ -0,0 +1,7 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "deimos-lang"
|
||||
version = "0.1.0"
|
6
Cargo.toml
Normal file
6
Cargo.toml
Normal file
@ -0,0 +1,6 @@
|
||||
[package]
|
||||
name = "deimos-lang"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
103
src/lexer/mod.rs
Normal file
103
src/lexer/mod.rs
Normal file
@ -0,0 +1,103 @@
|
||||
#[derive(Debug, PartialEq, Eq)]
|
||||
pub enum Token {
|
||||
Namespace,
|
||||
Identifier(String),
|
||||
Public,
|
||||
Module,
|
||||
CurlyOpen,
|
||||
CurlyClose,
|
||||
Interface,
|
||||
}
|
||||
|
||||
pub fn tokenize(input: &String) -> Vec<Token> {
|
||||
let mut tokens: Vec<Token> = Vec::new();
|
||||
let mut buffer = String::new();
|
||||
let mut peekable = input.chars().peekable();
|
||||
while let Some(c) = peekable.next() {
|
||||
// if not whitespace, append to buffer
|
||||
// else, we should match a token
|
||||
if !c.is_whitespace() {
|
||||
buffer.push(c);
|
||||
} else {
|
||||
tokens.push(match_buffer(&mut buffer));
|
||||
buffer.clear();
|
||||
}
|
||||
|
||||
// check if eof
|
||||
if peekable.peek().is_none() {
|
||||
tokens.push(match_buffer(&mut buffer));
|
||||
}
|
||||
}
|
||||
tokens
|
||||
}
|
||||
|
||||
fn match_buffer(buffer: &mut String) -> Token {
|
||||
match buffer.as_str() {
|
||||
"int" => Token::Interface,
|
||||
"mod" => Token::Module,
|
||||
"ns" => Token::Namespace,
|
||||
"pub" => Token::Public,
|
||||
"{" => Token::CurlyOpen,
|
||||
"}" => Token::CurlyClose,
|
||||
identifier => Token::Identifier(identifier.to_string()),
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
use std::fs::File;
|
||||
use std::io::Read;
|
||||
use std::path::Path;
|
||||
|
||||
#[test]
|
||||
fn simple_ns() {
|
||||
let result = tokenize(&String::from("ns simple"));
|
||||
assert_eq!(Token::Namespace, result[0]);
|
||||
assert_eq!(Token::Identifier(String::from("simple")), result[1]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn simple_ns_file() {
|
||||
let mut src_file = File::open(Path::new("test-data/lexer/simple_ns.dm")).unwrap();
|
||||
let mut src = String::new();
|
||||
let _ = src_file.read_to_string(&mut src);
|
||||
let result = tokenize(&src);
|
||||
assert_eq!(Token::Namespace, result[0]);
|
||||
assert_eq!(Token::Identifier(String::from("simple")), result[1]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn pub_mod_simple() {
|
||||
let result = tokenize(&String::from("pub mod simple"));
|
||||
assert_eq!(Token::Public, result[0]);
|
||||
assert_eq!(Token::Module, result[1]);
|
||||
assert_eq!(Token::Identifier(String::from("simple")), result[2]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn curly_open_and_close() {
|
||||
let result = tokenize(&String::from("{ }"));
|
||||
assert_eq!(Token::CurlyOpen, result[0]);
|
||||
assert_eq!(Token::CurlyClose, result[1]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn simple_int() {
|
||||
let result = tokenize(&String::from("int simple"));
|
||||
assert_eq!(Token::Interface, result[0]);
|
||||
assert_eq!(Token::Identifier(String::from("simple")), result[1]);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn ns_pub_mod_simple() {
|
||||
let result = tokenize(&String::from("ns simple_ns\npub mod simple { }"));
|
||||
assert_eq!(Token::Namespace, result[0]);
|
||||
assert_eq!(Token::Identifier(String::from("simple_ns")), result[1]);
|
||||
assert_eq!(Token::Public, result[2]);
|
||||
assert_eq!(Token::Module, result[3]);
|
||||
assert_eq!(Token::Identifier(String::from("simple")), result[4]);
|
||||
assert_eq!(Token::CurlyOpen, result[5]);
|
||||
assert_eq!(Token::CurlyClose, result[6]);
|
||||
}
|
||||
}
|
1
src/lib.rs
Normal file
1
src/lib.rs
Normal file
@ -0,0 +1 @@
|
||||
mod lexer;
|
1
test-data/lexer/simple_ns.dm
Normal file
1
test-data/lexer/simple_ns.dm
Normal file
@ -0,0 +1 @@
|
||||
ns simple
|
Loading…
Reference in New Issue
Block a user