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: SourceFileThe 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: usizeIndex of the current character being examined.
start: usizeIndex of the first character of the current token.
line: usizeCurrent line number, incremented on every \n.
Implementations§
Source§impl Tokenizer
impl Tokenizer
Sourcepub fn scan_tokens(&mut self) -> Result<(), Error>
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
| category | examples |
|---|---|
| literals | 1, 3.14, 'a', "hello" |
| identifiers | foo, my_var, _private |
| arithmetic | +, -, *, / |
| comparison | ==, !=, <, >, <=, >= |
| assignment | =, +=, -=, *=, /= |
| delimiters | (, ), {, }, [, ] |
| punctuation | ,, ;, ., .., :, :: |
| special | #, !#, ->, // (comment) |
| whitespace | newlines (emitted), spaces/tabs (skipped) |
§Errors
- unterminated character literal
- unknown escape sequence
- unterminated string
- unexpected character
Source§impl Tokenizer
impl Tokenizer
Sourcepub fn lex(source_file: SourceFile) -> Result<Vec<Token>, Error>
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);Sourcepub fn current_span(&self) -> Span
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§impl Tokenizer
impl Tokenizer
Sourcepub fn character_literal(&mut self) -> Result<(), Error>
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:
| Sequence | Meaning |
|---|---|
\n | newline |
\t | tab |
\r | carriage return |
\0 | null |
\\ | backslash |
| ‘"’ | double quote |
\' | single quote |
§Errors
unterminated character literal-> if EOF is reached or no closing'is foundunknown escape sequence-> if\is followed by an unrecognized character
Source§impl Tokenizer
impl Tokenizer
Sourcepub fn identifier(&mut self)
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
| Category | Keywords |
|---|---|
| Control flow | if, else, for, while, return, break, continue |
| Functions | fn |
| Imports | get, from, in |
| Logical | and, or |
| Types | int, float, bool, string, byte, char, arr, error |
| Declarations | dec, CONST |
| Literals | true, false, null |
| Special | as |
CONST in uppercase in intentional
Source§impl Tokenizer
impl Tokenizer
Sourcepub fn number_literal(&mut self)
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.
| Input | Emitted token |
|---|---|
1 | ByteLiteral(1) |
1000 | NumberLiteral(1000) |
3.14 | FloatLiteral(3.14) |
Source§impl Tokenizer
impl Tokenizer
Sourcepub fn string_literal(&mut self) -> Result<(), Error>
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:
| Sequence | Meaning |
|---|---|
\n | newline |
\t | tab |
\r | carriage return |
\0 | null |
\\ | 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
impl Tokenizer
Sourcepub fn peek(&mut self) -> char
pub fn peek(&mut self) -> char
Returns the current character without consuming it.
Returns '\0' if at end of source.
Sourcepub fn peek_next(&mut self) -> char
pub fn peek_next(&mut self) -> char
Returns the character after the current one without consuming it.
Returns '\0' if at end of source.
Auto Trait Implementations§
impl Freeze for Tokenizer
impl RefUnwindSafe for Tokenizer
impl Send for Tokenizer
impl Sync for Tokenizer
impl Unpin for Tokenizer
impl UnsafeUnpin for Tokenizer
impl UnwindSafe for Tokenizer
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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 Twhere
T: ?Sized,
impl<T> Paint for Twhere
T: ?Sized,
§fn fg(&self, value: Color) -> Painted<&T>
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 bright_black(&self) -> Painted<&T>
fn bright_black(&self) -> Painted<&T>
§fn bright_red(&self) -> Painted<&T>
fn bright_red(&self) -> Painted<&T>
§fn bright_green(&self) -> Painted<&T>
fn bright_green(&self) -> Painted<&T>
§fn bright_yellow(&self) -> Painted<&T>
fn bright_yellow(&self) -> Painted<&T>
§fn bright_blue(&self) -> Painted<&T>
fn bright_blue(&self) -> Painted<&T>
§fn bright_magenta(&self) -> Painted<&T>
fn bright_magenta(&self) -> Painted<&T>
§fn bright_cyan(&self) -> Painted<&T>
fn bright_cyan(&self) -> Painted<&T>
§fn bright_white(&self) -> Painted<&T>
fn bright_white(&self) -> Painted<&T>
§fn bg(&self, value: Color) -> Painted<&T>
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>
fn on_primary(&self) -> Painted<&T>
§fn on_magenta(&self) -> Painted<&T>
fn on_magenta(&self) -> Painted<&T>
§fn on_bright_black(&self) -> Painted<&T>
fn on_bright_black(&self) -> Painted<&T>
§fn on_bright_red(&self) -> Painted<&T>
fn on_bright_red(&self) -> Painted<&T>
§fn on_bright_green(&self) -> Painted<&T>
fn on_bright_green(&self) -> Painted<&T>
§fn on_bright_yellow(&self) -> Painted<&T>
fn on_bright_yellow(&self) -> Painted<&T>
§fn on_bright_blue(&self) -> Painted<&T>
fn on_bright_blue(&self) -> Painted<&T>
§fn on_bright_magenta(&self) -> Painted<&T>
fn on_bright_magenta(&self) -> Painted<&T>
§fn on_bright_cyan(&self) -> Painted<&T>
fn on_bright_cyan(&self) -> Painted<&T>
§fn on_bright_white(&self) -> Painted<&T>
fn on_bright_white(&self) -> Painted<&T>
§fn attr(&self, value: Attribute) -> Painted<&T>
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 rapid_blink(&self) -> Painted<&T>
fn rapid_blink(&self) -> Painted<&T>
§fn quirk(&self, value: Quirk) -> Painted<&T>
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 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.
fn clear(&self) -> Painted<&T>
renamed to resetting() due to conflicts with Vec::clear().
The clear() method will be removed in a future release.
§fn whenever(&self, value: Condition) -> Painted<&T>
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);