From 4fb7ada6b801237b34001e63fda23bb452251951 Mon Sep 17 00:00:00 2001 From: Jesse Brault Date: Fri, 29 Nov 2024 21:25:21 -0600 Subject: [PATCH] Very skeleton work on parser. --- src/bin/compiler/main.rs | 17 +++++++++++++---- src/lexer/mod.rs | 20 ++++++++++++++++++++ src/lib.rs | 1 + src/parser/mod.rs | 8 ++++++++ src/parser/types.rs | 11 +++++++++++ 5 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 src/parser/mod.rs create mode 100644 src/parser/types.rs diff --git a/src/bin/compiler/main.rs b/src/bin/compiler/main.rs index 0661eb6..093b5f4 100644 --- a/src/bin/compiler/main.rs +++ b/src/bin/compiler/main.rs @@ -1,13 +1,22 @@ use deimos::lexer::tokenize; use std::process::exit; +use deimos::parser::parse; fn main() { - let src = String::from("print 'Hello, World!'"); - let r = tokenize(&src); - if let Err(e) = r { + let src = String::from("print 42"); + let tokenize_result = tokenize(&src); + if let Err(e) = tokenize_result { eprintln!("{}", e); exit(1); } - let tokens = r.unwrap(); + let tokens = tokenize_result.unwrap(); println!("{:?}", tokens); + let parse_result = parse(&tokens); + if let Err(e) = parse_result { + eprintln!("{}", e); + exit(1); + } + let compilation_unit = parse_result.unwrap(); + println!("{:?}", compilation_unit); + // TODO: compilation_unit to DmModule } \ No newline at end of file diff --git a/src/lexer/mod.rs b/src/lexer/mod.rs index be86a3d..d39a23e 100644 --- a/src/lexer/mod.rs +++ b/src/lexer/mod.rs @@ -29,6 +29,7 @@ pub enum Token { Dot, Ellipsis, Abstract, + NumberLiteral(String), } pub fn tokenize(input: &String) -> Result, String> { @@ -75,6 +76,19 @@ pub fn tokenize(input: &String) -> Result, String> { _ => return Err(String::from("Unexpected number of tokens after '.'")), } } + '0'..='9' => { + let mut buffer = String::new(); + buffer.push(c); + while let Some(num_char) = peekable.next_if(|c| { + c.is_digit(10) || match c { + '_' | 'x' | 'L' | 'd' => true, + _ => false, + } + }) { + buffer.push(num_char); + } + tokens.push(Token::NumberLiteral(buffer)); + } _ => { if let Some(token) = match_identifier_or_keyword(c, &mut peekable) { tokens.push(token); @@ -230,4 +244,10 @@ mod tests { assert_eq!(Token::Identifier(String::from("props")), result[2]); assert_eq!(Token::CurlyClose, result[3]); } + + #[test] + fn simple_number() { + let result = tokenize(&String::from("123456")).unwrap(); + assert_eq!(Token::NumberLiteral(String::from("123456")), result[0]); + } } diff --git a/src/lib.rs b/src/lib.rs index d273cf0..5e5580c 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,2 +1,3 @@ pub mod lexer; pub mod vm; +pub mod parser; diff --git a/src/parser/mod.rs b/src/parser/mod.rs new file mode 100644 index 0000000..2fe77cf --- /dev/null +++ b/src/parser/mod.rs @@ -0,0 +1,8 @@ +mod types; + +use crate::lexer::Token; +use crate::parser::types::AstNode; + +pub fn parse(tokens: &Vec) -> Result { + todo!() +} \ No newline at end of file diff --git a/src/parser/types.rs b/src/parser/types.rs new file mode 100644 index 0000000..a158e8d --- /dev/null +++ b/src/parser/types.rs @@ -0,0 +1,11 @@ +use std::fmt::Debug; + +pub type NodeChildren = Vec>; + +#[derive(Debug)] +pub enum AstNode { + CompilationUnit(NodeChildren), + BlockStatement(NodeChildren), + Statement(NodeChildren), + Expression(NodeChildren), +}