//! A simple lexer for GLSL. //! //! Adheres to the GLSL 440. Read the spec //! [here](https://registry.khronos.org/OpenGL/specs/gl/GLSLangSpec.4.40.pdf). //! ## Example //! ``` //! use glsl_lexer::*; //! //! fn main() { //! let source = r#" //! #version 440 //! uniform float time; //! void main() { //! gl_FragColor = vec4(1.0, 0.5, 0.2, 1.0); //! } //! "#; //! let mut lexer = glsl_lexer::Lexer::new(&source); //! let tokens = lexer.get_tokens(); //! dbg!("{}", tokens); //! } //! ``` //! # WIP THAT SHIT STILL WONKY AF #![allow(dead_code)] #![forbid(clippy::upper_case_acronyms)] pub mod lex; mod tokens; // #[cfg(test)] // mod tests { // use super::lex::lexer::Lexer; // use super::tokens::Token; // use super::*; // use log::info; // // fn init() { // std::env::set_var("RUST_LOG", "INFO"); // let _ = env_logger::builder().is_test(true).try_init(); // } // // #[test] // fn whitespace() { // init(); // let source_code = " \t\n"; // let mut lexer = Lexer::new(source_code); // let tokens = lexer.get_tokens(); // info!("[Whitespace] Tokens: {:#?}", tokens); // assert_eq!(tokens, vec![Token::Whitespace, Token::EOF].into()); // } // // #[test] // fn identifier() { // init(); // let source_code = "variableName"; // let mut lexer = Lexer::new(source_code); // let tokens = lexer.get_tokens(); // info!("[Identifier] Tokens: {:#?}", tokens); // assert_eq!( // tokens, // vec![Token::Identifier("variableName".to_string()), Token::EOF].into() // ); // } // // #[test] // fn keyword() { // init(); // let source_code = "uniform"; // let mut lexer = Lexer::new(source_code); // let tokens = lexer.get_tokens(); // info!("[Keyword] Tokens: {:#?}", tokens); // assert_eq!( // tokens, // vec![Token::Keyword("uniform".to_string()), Token::EOF].into() // ); // } // // #[test] // fn integer_literal() { // init(); // let source_code = "12345"; // let mut lexer = Lexer::new(source_code); // let tokens = lexer.get_tokens(); // info!("[IntegerLiteral] Tokens: {:#?}", tokens); // assert_eq!( // tokens, // vec![Token::IntegerLiteral(12345), Token::EOF].into() // ); // } // // #[test] // fn float_literal() { // init(); // let source_code = "123.4504"; // let mut lexer = Lexer::new(source_code); // let tokens = lexer.get_tokens(); // info!("[FloatLiteral] Tokens: {:#?}", tokens); // assert_eq!( // tokens, // vec![Token::FloatLiteral(123.4504), Token::EOF].into() // ); // } // // #[test] // fn float_shorthand() { // init(); // let source_code = ".4504"; // let mut lexer = Lexer::new(source_code); // let tokens = lexer.get_tokens(); // info!("[FloatLiteral Shorthand] Tokens: {:#?}", tokens); // assert_eq!(tokens, vec![Token::FloatLiteral(0.4504), Token::EOF].into()); // } // // #[test] // fn swizzling() { // init(); // let source_code = "abcd.xyz"; // let mut lexer = Lexer::new(source_code); // let tokens = lexer.get_tokens(); // info!("[Swizzling] Tokens: {:#?}", tokens); // assert_eq!( // tokens, // vec![ // Token::Identifier("abcd".to_string()), // Token::Symbol('.'), // Token::Identifier("xyz".to_string()), // Token::EOF // ] // .into() // ); // } // // #[test] // fn test_operator() { // init(); // let source = "+-*/%&|^!=<>?"; // let mut lexer = Lexer::new(source); // let tokens = lexer.get_tokens(); // info!("[Operator] Tokens: {:#?}", tokens); // assert_eq!( // tokens, // vec![ // Token::Operator("+".to_string()), // Token::Operator("-".to_string()), // Token::Operator("*".to_string()), // Token::Operator("/".to_string()), // Token::Operator("%".to_string()), // Token::Operator("&".to_string()), // Token::Operator("|".to_string()), // Token::Operator("^".to_string()), // Token::Operator("!".to_string()), // Token::Operator("=".to_string()), // Token::Operator("<".to_string()), // Token::Operator(">".to_string()), // Token::Operator("?".to_string()), // Token::EOF, // ] // .into() // ); // } // // #[test] // fn test_single_line_comment() { // init(); // let source = "// This is a comment\n"; // let mut lexer = Lexer::new(source); // let tokens = lexer.get_tokens(); // info!("[Comment] Tokens: {:#?}", tokens); // assert_eq!( // tokens, // vec![ // Token::Comment("// This is a comment".to_string()), // Token::Whitespace, // Token::EOF, // ] // .into() // ); // } // // // I hope that does it. Writing this test was pain. // #[test] // fn complex_source() { // init(); // let source = r#" // uniform float time; // void main() { // gl_FragColor = vec4(1.0, 0.5, 0.2, 1.0); // } // "#; // let mut lexer = Lexer::new(source); // let tokens = lexer.get_tokens(); // info!("[Complex Source] Tokens: {:#?}", tokens); // assert_eq!( // tokens, // vec![ // Token::Whitespace, // Token::Keyword("uniform".to_string()), // Token::Whitespace, // Token::Keyword("float".to_string()), // Token::Whitespace, // Token::Identifier("time".to_string()), // Token::Symbol(';'), // Token::Whitespace, // Token::Keyword("void".to_string()), // Token::Whitespace, // Token::Identifier("main".to_string()), // Token::Symbol('('), // Token::Symbol(')'), // Token::Whitespace, // Token::Symbol('{'), // Token::Whitespace, // Token::Identifier("gl_FragColor".to_string()), // Token::Whitespace, // Token::Operator('='.to_string()), // Token::Whitespace, // Token::Identifier("vec4".to_string()), // Token::Symbol('('), // Token::FloatLiteral(1.0), // Token::Symbol(','), // Token::Whitespace, // Token::FloatLiteral(0.5), // Token::Symbol(','), // Token::Whitespace, // Token::FloatLiteral(0.2), // Token::Symbol(','), // Token::Whitespace, // Token::FloatLiteral(1.0), // Token::Symbol(')'), // Token::Symbol(';'), // Token::Whitespace, // Token::Symbol('}'), // Token::Whitespace, // Token::EOF, // ] // .into() // ); // } // }