1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
#![feature(pattern)] #![feature(unicode)] extern crate unicode_width; extern crate unicode_xid; extern crate unicode_brackets; mod span; mod token; mod tokens; mod symbol_table; mod lex; pub use span::{TextPos, Span}; pub use token::{TokenKind, Token}; pub use tokens::{TokensBuf, TokensRef}; pub use symbol_table::{InvalidSymbolTableError, validate_symbol_table}; pub use lex::{LexError, lex}; #[cfg(test)] mod test { use token::{Token, TokenKind}; use tokens::TokensBuf; use span::TextPos; use lex::lex; use std::borrow::Cow; #[test] fn test() { let tp = |p| TextPos { col: p, line: 0, byte: p, }; let symbols = [ "!@#", "$%^", ]; let src = r#"()[{}] "wow\"\t\n\x22""floo" !@#$%^hello_123"#; let tokens_buf = lex(src, &symbols).unwrap(); assert_eq!(tokens_buf, TokensBuf { tokens: vec![ Token { kind: TokenKind::Bracket('(', TokensBuf { tokens: vec![], end: tp(1), }), start: tp(0), }, Token { kind: TokenKind::Bracket('[', TokensBuf { tokens: vec![ Token { kind: TokenKind::Bracket('{', TokensBuf { tokens: vec![], end: tp(4), }), start: tp(3), }, ], end: tp(5), }), start: tp(2), }, Token { kind: TokenKind::Whitespace(" "), start: tp(6), }, Token { kind: TokenKind::String(Cow::Owned(String::from("wow\"\t\n\""))), start: tp(7), }, Token { kind: TokenKind::String(Cow::Borrowed("floo")), start: tp(22), }, Token { kind: TokenKind::Whitespace(" "), start: tp(28), }, Token { kind: TokenKind::Symbol("!@#"), start: tp(30), }, Token { kind: TokenKind::Symbol("$%^"), start: tp(33), }, Token { kind: TokenKind::Ident("hello_123"), start: tp(36), }, ], end: tp(45), }); } }