start work on lexer
This commit is contained in:
commit
2c4dbe0971
6 changed files with 132 additions and 0 deletions
69
src/lexer.rs
Normal file
69
src/lexer.rs
Normal file
|
@ -0,0 +1,69 @@
|
|||
use std::iter::Peekable;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum Token {
|
||||
Character(char),
|
||||
CharacterRange(char, char)
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Lexer<I>
|
||||
where
|
||||
I: Iterator<Item = char>
|
||||
{
|
||||
scanner: Peekable<I>
|
||||
}
|
||||
|
||||
impl<I> Lexer<I>
|
||||
where
|
||||
I: Iterator<Item = char>
|
||||
{
|
||||
pub fn new(scanner: I) -> Lexer<I> {
|
||||
Lexer {
|
||||
scanner: scanner.peekable()
|
||||
}
|
||||
}
|
||||
|
||||
fn handle_character(&mut self) -> Option<Token> {
|
||||
let character = self.scanner.next()?;
|
||||
|
||||
if let Some(dash) = self.scanner.peek() {
|
||||
if *dash == '-' {
|
||||
return Some(Token::CharacterRange(character, self.scanner.nth(1)?));
|
||||
}
|
||||
}
|
||||
|
||||
Some(Token::Character(character))
|
||||
}
|
||||
}
|
||||
|
||||
impl<I> Iterator for Lexer<I>
|
||||
where
|
||||
I: Iterator<Item = char>
|
||||
{
|
||||
type Item = Token;
|
||||
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
let symbol = self.scanner.peek()?;
|
||||
|
||||
match symbol {
|
||||
'-' => todo!(),
|
||||
'^' => todo!(),
|
||||
'$' => todo!(),
|
||||
'\\' => todo!(),
|
||||
'.' => todo!(),
|
||||
'*' => todo!(),
|
||||
'+' => todo!(),
|
||||
'?' => todo!(),
|
||||
'(' => todo!(),
|
||||
')' => todo!(),
|
||||
'[' => todo!(),
|
||||
']' => todo!(),
|
||||
'{' => todo!(),
|
||||
'}' => todo!(),
|
||||
'|' => todo!(),
|
||||
|
||||
_ => self.handle_character()
|
||||
}
|
||||
}
|
||||
}
|
11
src/main.rs
Normal file
11
src/main.rs
Normal file
|
@ -0,0 +1,11 @@
|
|||
mod parser;
|
||||
mod lexer;
|
||||
|
||||
fn main() {
|
||||
let output = match parser::parse_string("Hello A-Ztesting!") {
|
||||
Ok(val) => val,
|
||||
Err(e) => panic!("{e}")
|
||||
};
|
||||
|
||||
|
||||
}
|
35
src/parser.rs
Normal file
35
src/parser.rs
Normal file
|
@ -0,0 +1,35 @@
|
|||
use std::iter::Peekable;
|
||||
|
||||
use crate::lexer::Lexer;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct Parser<I>
|
||||
where
|
||||
I: Iterator<Item = char>
|
||||
{
|
||||
lexer: Peekable<Lexer<I>>
|
||||
}
|
||||
|
||||
impl<I> Parser<I>
|
||||
where
|
||||
I: Iterator<Item = char>
|
||||
{
|
||||
fn new(scanner: I) -> Parser<I> {
|
||||
Parser {
|
||||
lexer: Lexer::new(scanner).peekable()
|
||||
}
|
||||
}
|
||||
|
||||
fn parse(self) -> Result<(), String> {
|
||||
self.lexer.for_each(|token| println!("{token:?}",));
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
pub fn parse_string(input: &str) -> Result<(), String> {
|
||||
let scanner = input.chars();
|
||||
|
||||
Parser::new(scanner).parse()?;
|
||||
|
||||
Ok(())
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue