Skip to main content

lex_just_parse/
lib.rs

1//! # lex-just-parse
2//!
3//! `lex-just-parse` is a simple and easy-to-use lexing and parsing crate for Rust.
4//! It provides a fast, stream-based lexical analyzer (`Lexer`) and a combinator-style parser (`Parser`)
5//! to assist in developing custom languages, DSLs, or any structured text parsing needs.
6//!
7//! ## Overview
8//!
9//! - **[`lexer`]**: Contains the `Lexer` and token definitions for tokenizing string inputs.
10//! - **[`parser`]**: Contains the `Parser` utilities for building ASTs.
11
12pub mod lexer;
13pub mod parser;
14
15#[cfg(test)]
16mod tests {
17    use crate::lexer::{Lexer, NumberBase, TokenKind};
18
19    #[test]
20    fn test_real_numbers() {
21        let source = "1.0 2.64 89.0 0.123";
22        let mut lex = Lexer::new(source);
23        let t = lex.next();
24        assert_eq!(t.kind, TokenKind::RealNumber);
25        assert_eq!(t.source(), "1.0");
26        let t = lex.next();
27        assert_eq!(t.kind, TokenKind::RealNumber);
28        assert_eq!(t.source(), "2.64");
29        let t = lex.next();
30        assert_eq!(t.kind, TokenKind::RealNumber);
31        assert_eq!(t.source(), "89.0");
32        let t = lex.next();
33        assert_eq!(t.kind, TokenKind::RealNumber);
34        assert_eq!(t.source(), "0.123");
35    }
36
37    #[test]
38    fn test_numbers() {
39        let source = "123 0xFF 0o755 0b0101";
40        let mut lex = Lexer::new(source);
41        let t = lex.next();
42        assert_eq!(t.kind, TokenKind::Number(NumberBase::D));
43        assert_eq!(t.source(), "123");
44        let t = lex.next();
45        assert_eq!(t.kind, TokenKind::Number(NumberBase::X));
46        assert_eq!(t.source(), "FF");
47        let t = lex.next();
48        assert_eq!(t.kind, TokenKind::Number(NumberBase::O));
49        assert_eq!(t.source(), "755");
50        let t = lex.next();
51        assert_eq!(t.kind, TokenKind::Number(NumberBase::B));
52        assert_eq!(t.source(), "0101");
53    }
54}