diff --git a/src/main.rs b/src/main.rs index 814bebb..5d8f61a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,10 @@ -extern crate clap; -use clap::{App, Arg}; - mod base_55; mod parser; -pub mod tokens; +mod scanner; +mod tokens; -use logos::Logos; +use clap::{App, Arg}; +use scanner::Scanner; fn main() { let matches = App::new("AbleScript") @@ -27,10 +26,8 @@ fn main() { let source = std::fs::read_to_string(file_path).unwrap(); // Print token type: `value` - let mut lex = tokens::Token::lexer(&source); - while let Some(token) = lex.next() { - println!("{:?}: `{}`", token, lex.slice()); - } + let mut scanner = Scanner::new(&source); + scanner.scan(); } None => { println!("hi"); diff --git a/src/parser.rs b/src/parser.rs index 56fa18f..1c4be80 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -1,4 +1,4 @@ -use crate::tokens::{Abool, Token}; +use crate::tokens::Abool; pub fn abool2num(abool: Abool) -> i32 { match abool { diff --git a/src/scanner.rs b/src/scanner.rs index e69de29..1e96826 100644 --- a/src/scanner.rs +++ b/src/scanner.rs @@ -0,0 +1,33 @@ +use std::ops::Range; + +use logos::Logos; + +use crate::tokens::{self, Token}; +pub struct Scanner<'a> { + source: &'a str, + lexer: logos::Lexer<'a, Token>, +} + +impl<'a> Scanner<'a> { + pub fn new(source: &'a str) -> Self { + Self { + source, + lexer: tokens::Token::lexer(source), + } + } + + pub fn scan(&mut self) { + while let Some(tok) = self.lexer.next() { + if matches!(tok, Token::Error) { + self.throw_err(&self.lexer.span()); + } else { + println!("Token: {:?}", tok); + } + } + } + + fn throw_err(&self, location: &Range) { + let part = &self.source[location.clone()]; + println!("Unknown keyword `{}` found on {:?}", part, location); + } +}