Skip to main content

Tokenizer

Struct Tokenizer 

Source
pub struct Tokenizer {
    pub source_file: SourceFile,
    pub source: Vec<char>,
    pub tokens: Vec<Token>,
    pub current: usize,
    pub start: usize,
    pub line: usize,
}
Expand description

Converts raw source text into a flat list of Tokens.

Operates character by character, grouping lexemes into tokens. The main entry point is Tokenizer::lex.

Fields§

§source_file: SourceFile

The source file (text + name) used for error reporting.

§source: Vec<char>

The source text as a sequence of characters.

§tokens: Vec<Token>

The accumulated token list built during lexing.

§current: usize

Index of the current character being examined.

§start: usize

Index of the first character of the current token.

§line: usize

Current line number, incremented on every \n.

Implementations§

Source§

impl Tokenizer

Source

pub fn scan_tokens(&mut self) -> Result<(), Error>

Scans the source file and return token stream

Iterates over every character in the source file, identifies lexemes, and returns a flat list of [Token]s terminated by [TokenType::EOF].

For multi-character tokens (e.g. ==, !=, <=) the scanner peeks ahead one character to decide which token to emit.

§Tokens
categoryexamples
literals1, 3.14, 'a', "hello"
identifiersfoo, my_var, _private
arithmetic+, -, *, /
comparison==, !=, <, >, <=, >=
assignment=, +=, -=, *=, /=
delimiters(, ), {, }, [, ]
punctuation,, ;, ., .., :, ::
special#, !#, ->, // (comment)
whitespacenewlines (emitted), spaces/tabs (skipped)
§Errors
  • unterminated character literal
  • unknown escape sequence
  • unterminated string
  • unexpected character
Source§

impl Tokenizer

Source

pub fn lex(source_file: SourceFile) -> Result<Vec<Token>, Error>

The main entry point: lexes a SourceFile into a Vec<Token>.

Drives Tokenizer::scan_tokens in a loop until the source is exhausted, then appends a TokenType::Eof so the parser always has a clean terminator.

§Errors

Returns Error if the source contains an unrecognized character, unterminated string, or invalid literal.

§Examples
use rl_lang::{
    lexer::{
        tokenizer::Tokenizer,
        tokentypes::TokenType,
    },
    utils::source::SourceFile,
};

let tokens = match Tokenizer::lex(SourceFile::new("source", "1 == 1".to_string())) {
    Ok(tokens) => tokens,
    Err(error) => {
        error.report_to_stderr();
        std::process::exit(1);
    },
};

assert_eq!(tokens[0].token, TokenType::NumberLiteral(1));
assert_eq!(tokens[1].token, TokenType::Compare);
assert_eq!(tokens[2].token, TokenType::NumberLiteral(1));
assert_eq!(tokens[3].token, TokenType::Eof);
Source

pub fn current_span(&self) -> Span

Returns a Span covering the current token in character indices.

Ariadne’s Source::from(&str) indexes by character, so spans must be char-indexed - passing byte offsets misaligns reports for multi-byte characters.

Source

pub fn err(&self, message: impl Into<String>, span: Span) -> Error

Builds a [Reason::Lexer] error anchored at span.

Attaches the source file so Ariadne can render the relevant source line alongside the error message.

Source§

impl Tokenizer

Source

pub fn character_literal(&mut self) -> Result<(), Error>

Scans a single-quoted character literal and emits TokenType::CharacterLiteral.

Only a single character is allowed between the quotes. Supports the following escape sequences:

SequenceMeaning
\nnewline
\ttab
\rcarriage return
\0null
\\backslash
‘"’double quote
\'single quote
§Errors
  • unterminated character literal -> if EOF is reached or no closing ' is found
  • unknown escape sequence -> if \ is followed by an unrecognized character
Source§

impl Tokenizer

Source

pub fn identifier(&mut self)

Scans an identifier or keyword starting at the current position.

Consumes alphanumeric characters and underscores, then checks if the result is a reserved word. If not, emits TokenType::Identifier.

§Reserved Words
CategoryKeywords
Control flowif, else, for, while, return, break, continue
Functionsfn
Importsget, from, in
Logicaland, or
Typesint, float, bool, string, byte, char, arr, error
Declarationsdec, CONST
Literalstrue, false, null
Specialas

CONST in uppercase in intentional

Source§

impl Tokenizer

Source

pub fn number_literal(&mut self)

Scans an integer or float literal starting at the current position.

A . followed by a digit switches to float parsing. Integers in the range 0..=255 are emitted as TokenType::ByteLiteral, larger integers as TokenType::NumberLiteral, and decimals as TokenType::FloatLiteral.

InputEmitted token
1ByteLiteral(1)
1000NumberLiteral(1000)
3.14FloatLiteral(3.14)
Source§

impl Tokenizer

Source

pub fn string_literal(&mut self) -> Result<(), Error>

Scans a double-quoted string literal and emits TokenType::StringLiteral.

Supports multi-line strings and the following escape sequences:

SequenceMeaning
\nnewline
\ttab
\rcarriage return
\0null
\\backslash
\"double quote
\'single quote
§Errors
  • unterminated string -> if EOF is reached before the closing "
  • unknown escape sequence -> if \ is followed by an unrecognized character
Source§

impl Tokenizer

Source

pub fn is_at_end(&self) -> bool

Returns true if all characters have been consumed.

Source

pub fn peek(&mut self) -> char

Returns the current character without consuming it.

Returns '\0' if at end of source.

Source

pub fn peek_next(&mut self) -> char

Returns the character after the current one without consuming it.

Returns '\0' if at end of source.

Source

pub fn advance(&mut self) -> char

Consumes and returns the current character, advancing the cursor.

Returns '\0' if at end of source.

Source

pub fn add_token(&mut self, tokentype: TokenType)

Constructs a Token from start..current and pushes it onto the token list.

Auto Trait Implementations§

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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

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

§

fn fg(&self, value: Color) -> Painted<&T>

Returns a styled value derived from self with the foreground set to value.

This method should be used rarely. Instead, prefer to use color-specific builder methods like red() and green(), which have the same functionality but are pithier.

§Example

Set foreground color to white using fg():

use yansi::{Paint, Color};

painted.fg(Color::White);

Set foreground color to white using white().

use yansi::Paint;

painted.white();
§

fn primary(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Primary].

§Example
println!("{}", value.primary());
§

fn fixed(&self, color: u8) -> Painted<&T>

Returns self with the fg() set to [Color :: Fixed].

§Example
println!("{}", value.fixed(color));
§

fn rgb(&self, r: u8, g: u8, b: u8) -> Painted<&T>

Returns self with the fg() set to [Color :: Rgb].

§Example
println!("{}", value.rgb(r, g, b));
§

fn black(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Black].

§Example
println!("{}", value.black());
§

fn red(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Red].

§Example
println!("{}", value.red());
§

fn green(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Green].

§Example
println!("{}", value.green());
§

fn yellow(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Yellow].

§Example
println!("{}", value.yellow());
§

fn blue(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Blue].

§Example
println!("{}", value.blue());
§

fn magenta(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Magenta].

§Example
println!("{}", value.magenta());
§

fn cyan(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: Cyan].

§Example
println!("{}", value.cyan());
§

fn white(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: White].

§Example
println!("{}", value.white());
§

fn bright_black(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightBlack].

§Example
println!("{}", value.bright_black());
§

fn bright_red(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightRed].

§Example
println!("{}", value.bright_red());
§

fn bright_green(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightGreen].

§Example
println!("{}", value.bright_green());
§

fn bright_yellow(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightYellow].

§Example
println!("{}", value.bright_yellow());
§

fn bright_blue(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightBlue].

§Example
println!("{}", value.bright_blue());
§

fn bright_magenta(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightMagenta].

§Example
println!("{}", value.bright_magenta());
§

fn bright_cyan(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightCyan].

§Example
println!("{}", value.bright_cyan());
§

fn bright_white(&self) -> Painted<&T>

Returns self with the fg() set to [Color :: BrightWhite].

§Example
println!("{}", value.bright_white());
§

fn bg(&self, value: Color) -> Painted<&T>

Returns a styled value derived from self with the background set to value.

This method should be used rarely. Instead, prefer to use color-specific builder methods like on_red() and on_green(), which have the same functionality but are pithier.

§Example

Set background color to red using fg():

use yansi::{Paint, Color};

painted.bg(Color::Red);

Set background color to red using on_red().

use yansi::Paint;

painted.on_red();
§

fn on_primary(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Primary].

§Example
println!("{}", value.on_primary());
§

fn on_fixed(&self, color: u8) -> Painted<&T>

Returns self with the bg() set to [Color :: Fixed].

§Example
println!("{}", value.on_fixed(color));
§

fn on_rgb(&self, r: u8, g: u8, b: u8) -> Painted<&T>

Returns self with the bg() set to [Color :: Rgb].

§Example
println!("{}", value.on_rgb(r, g, b));
§

fn on_black(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Black].

§Example
println!("{}", value.on_black());
§

fn on_red(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Red].

§Example
println!("{}", value.on_red());
§

fn on_green(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Green].

§Example
println!("{}", value.on_green());
§

fn on_yellow(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Yellow].

§Example
println!("{}", value.on_yellow());
§

fn on_blue(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Blue].

§Example
println!("{}", value.on_blue());
§

fn on_magenta(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Magenta].

§Example
println!("{}", value.on_magenta());
§

fn on_cyan(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: Cyan].

§Example
println!("{}", value.on_cyan());
§

fn on_white(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: White].

§Example
println!("{}", value.on_white());
§

fn on_bright_black(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightBlack].

§Example
println!("{}", value.on_bright_black());
§

fn on_bright_red(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightRed].

§Example
println!("{}", value.on_bright_red());
§

fn on_bright_green(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightGreen].

§Example
println!("{}", value.on_bright_green());
§

fn on_bright_yellow(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightYellow].

§Example
println!("{}", value.on_bright_yellow());
§

fn on_bright_blue(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightBlue].

§Example
println!("{}", value.on_bright_blue());
§

fn on_bright_magenta(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightMagenta].

§Example
println!("{}", value.on_bright_magenta());
§

fn on_bright_cyan(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightCyan].

§Example
println!("{}", value.on_bright_cyan());
§

fn on_bright_white(&self) -> Painted<&T>

Returns self with the bg() set to [Color :: BrightWhite].

§Example
println!("{}", value.on_bright_white());
§

fn attr(&self, value: Attribute) -> Painted<&T>

Enables the styling [Attribute] value.

This method should be used rarely. Instead, prefer to use attribute-specific builder methods like bold() and underline(), which have the same functionality but are pithier.

§Example

Make text bold using attr():

use yansi::{Paint, Attribute};

painted.attr(Attribute::Bold);

Make text bold using using bold().

use yansi::Paint;

painted.bold();
§

fn bold(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Bold].

§Example
println!("{}", value.bold());
§

fn dim(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Dim].

§Example
println!("{}", value.dim());
§

fn italic(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Italic].

§Example
println!("{}", value.italic());
§

fn underline(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Underline].

§Example
println!("{}", value.underline());

Returns self with the attr() set to [Attribute :: Blink].

§Example
println!("{}", value.blink());

Returns self with the attr() set to [Attribute :: RapidBlink].

§Example
println!("{}", value.rapid_blink());
§

fn invert(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Invert].

§Example
println!("{}", value.invert());
§

fn conceal(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Conceal].

§Example
println!("{}", value.conceal());
§

fn strike(&self) -> Painted<&T>

Returns self with the attr() set to [Attribute :: Strike].

§Example
println!("{}", value.strike());
§

fn quirk(&self, value: Quirk) -> Painted<&T>

Enables the yansi [Quirk] value.

This method should be used rarely. Instead, prefer to use quirk-specific builder methods like mask() and wrap(), which have the same functionality but are pithier.

§Example

Enable wrapping using .quirk():

use yansi::{Paint, Quirk};

painted.quirk(Quirk::Wrap);

Enable wrapping using wrap().

use yansi::Paint;

painted.wrap();
§

fn mask(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Mask].

§Example
println!("{}", value.mask());
§

fn wrap(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Wrap].

§Example
println!("{}", value.wrap());
§

fn linger(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Linger].

§Example
println!("{}", value.linger());
§

fn clear(&self) -> Painted<&T>

👎Deprecated since 1.0.1:

renamed to resetting() due to conflicts with Vec::clear(). The clear() method will be removed in a future release.

Returns self with the quirk() set to [Quirk :: Clear].

§Example
println!("{}", value.clear());
§

fn resetting(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Resetting].

§Example
println!("{}", value.resetting());
§

fn bright(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: Bright].

§Example
println!("{}", value.bright());
§

fn on_bright(&self) -> Painted<&T>

Returns self with the quirk() set to [Quirk :: OnBright].

§Example
println!("{}", value.on_bright());
§

fn whenever(&self, value: Condition) -> Painted<&T>

Conditionally enable styling based on whether the [Condition] value applies. Replaces any previous condition.

See the crate level docs for more details.

§Example

Enable styling painted only when both stdout and stderr are TTYs:

use yansi::{Paint, Condition};

painted.red().on_yellow().whenever(Condition::STDOUTERR_ARE_TTY);
§

fn new(self) -> Painted<Self>
where Self: Sized,

Create a new [Painted] with a default [Style]. Read more
§

fn paint<S>(&self, style: S) -> Painted<&Self>
where S: Into<Style>,

Apply a style wholesale to self. Any previous style is replaced. Read more
Source§

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

Source§

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>,

Source§

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.