Improved Scanner

This commit is contained in:
Erin 2021-04-13 17:40:20 +02:00 committed by ondra05
parent d13d72ad89
commit 81ff84ad73
2 changed files with 37 additions and 4 deletions

View file

@ -4,8 +4,10 @@ use clap::{App, Arg};
mod base_55; mod base_55;
mod parser; mod parser;
pub mod tokens; pub mod tokens;
mod scanner;
use logos::Logos; use logos::Logos;
use scanner::Scanner;
fn main() { fn main() {
let matches = App::new("AbleScript") let matches = App::new("AbleScript")
@ -27,10 +29,8 @@ fn main() {
let source = std::fs::read_to_string(file_path).unwrap(); let source = std::fs::read_to_string(file_path).unwrap();
// Print token type: `value` // Print token type: `value`
let mut lex = tokens::Token::lexer(&source); let mut scanner = Scanner::new(&source);
while let Some(token) = lex.next() { scanner.scan();
println!("{:?}: `{}`", token, lex.slice());
}
} }
None => { None => {
println!("hi"); println!("hi");

View file

@ -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<usize>) {
let part = &self.source[location.clone()];
println!("Unknown keyword `{}` found on {:?}", part, location);
}
}