Struct pattern_lexer::Lexer

source ·
pub struct Lexer<'a> { /* private fields */ }
Expand description

A plugin based Lexer A plugin-based Lexer. It perform lexical analysis on strings

Implementations§

source§

impl<'a> Lexer<'a>

source

pub fn builder() -> LexerBuilder<'a>

Create a builder

Example
use lexer::Lexer;
use lexer::token::{TokenKind, Tokenizer};

let int = Tokenizer::new(TokenKind::LITERAL("INT"), |s: &str| { s.chars().all(|c| c.is_digit(10)) });
let lex = Lexer::builder().add(int).build();
source

pub fn tokenize(&self, value: &'a str) -> Result<Vec<Token<'a>>>

Return a vector of Token from the given string

Errors

Return an Error if a part of the string doesn’t match any token

Example
use regex::Regex;
use lexer::Lexer;
use lexer::token::{TokenKind, Tokenizer};

// Simple math lexer example
let plus = Tokenizer::new(TokenKind::OPERATOR("PLUS"), '+');
let minus = Tokenizer::new(TokenKind::OPERATOR("MINUS"), '-');
let star = Tokenizer::new(TokenKind::OPERATOR("STAR"), '*');
let slash = Tokenizer::new(TokenKind::OPERATOR("SLASH"), '/');
let equal = Tokenizer::new(TokenKind::OPERATOR("EQUAL"), '=');
let number = Tokenizer::new(TokenKind::LITERAL("NUMBER"), |s: &str| {
  let mut dot_seen = false;

  for ch in s.chars() {
    if !ch.is_digit(10) && (ch != '.' || dot_seen) {
      return false;
    } else if ch == '.' {
      dot_seen = true;
    }
  }
   
  true
});
let id_regex = Regex::new(r"[a-zA-Z_$][a-zA-Z_$0-9]*").unwrap();
let id = Tokenizer::new(TokenKind::IDENTIFIER, id_regex);
let whitespace = Tokenizer::new(TokenKind::WHITESPACE("SPACE"), ' ');
let lexer = Lexer::builder()
  .extend(vec![plus, minus, star, slash, equal, number, id, whitespace])
  .build();

assert!(lexer.tokenize("x_4 = 1 + 3 = 8 * 0.25").is_ok());
// Our lexer doesn't handle parenthesis...
assert!(lexer.tokenize("x_4 = (1 + 3)").is_err());

Auto Trait Implementations§

§

impl<'a> !RefUnwindSafe for Lexer<'a>

§

impl<'a> !Send for Lexer<'a>

§

impl<'a> !Sync for Lexer<'a>

§

impl<'a> Unpin for Lexer<'a>

§

impl<'a> !UnwindSafe for Lexer<'a>

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.