From cf62dc3d8c9694f9fdf4105c8590ba7cdebed9b1 Mon Sep 17 00:00:00 2001 From: Pelle Johnsen Date: Sun, 5 Jul 2020 15:35:20 +0200 Subject: [PATCH] Glsl new multi line comments (#103) * Add multi line comment support to glsl-new * Fix glsl-new TokenMetadata for multi line comments --- src/front/glsl_new/lex.rs | 39 ++++++++++++++++++++------------- src/front/glsl_new/lex_tests.rs | 26 ++++++++++++++++++++++ src/front/glsl_new/parser.rs | 3 +++ 3 files changed, 53 insertions(+), 15 deletions(-) diff --git a/src/front/glsl_new/lex.rs b/src/front/glsl_new/lex.rs index 0b6d675025..eb05603e24 100644 --- a/src/front/glsl_new/lex.rs +++ b/src/front/glsl_new/lex.rs @@ -181,13 +181,10 @@ pub fn consume_token(mut input: &str) -> (Option, &str) { meta.chars.end = start + 2; (Some(Token::MulAssign(meta)), chars.as_str()) } - //TODO: multi-line comments - // Some('/') => ( - // Token::MultiLineCommentClose, - // chars.as_str(), - // start, - // start + 2, - // ), + Some('/') => { + meta.chars.end = start + 2; + (Some(Token::CommentEnd((meta, ()))), chars.as_str()) + } _ => (Some(Token::MulAssign(meta)), input), } } @@ -199,13 +196,10 @@ pub fn consume_token(mut input: &str) -> (Option, &str) { (Some(Token::DivAssign(meta)), chars.as_str()) } Some('/') => (None, ""), - //TODO: multi-line comments - // Some('*') => ( - // Token::MultiLineCommentOpen, - // chars.as_str(), - // start, - // start + 2, - // ), + Some('*') => { + meta.chars.end = start + 2; + (Some(Token::CommentStart((meta, ()))), chars.as_str()) + } _ => (Some(Token::Slash(meta)), input), } } @@ -237,6 +231,7 @@ pub struct Lexer<'a> { input: String, line: usize, offset: usize, + inside_comment: bool, } impl<'a> Lexer<'a> { @@ -259,6 +254,7 @@ impl<'a> Lexer<'a> { input, line, offset: 0, + inside_comment: false, } } @@ -274,7 +270,20 @@ impl<'a> Lexer<'a> { meta.chars.start += self.offset; meta.chars.end += self.offset; self.offset += end; - Some(token) + if !self.inside_comment { + match token { + Token::CommentStart(_) => { + self.inside_comment = true; + self.next() + } + _ => Some(token), + } + } else { + if let Token::CommentEnd(_) = token { + self.inside_comment = false; + } + self.next() + } } else { let (line, input) = self.lines.next()?; diff --git a/src/front/glsl_new/lex_tests.rs b/src/front/glsl_new/lex_tests.rs index 377f17f5fa..1da89d80f3 100644 --- a/src/front/glsl_new/lex_tests.rs +++ b/src/front/glsl_new/lex_tests.rs @@ -61,6 +61,32 @@ fn glsl_lex_line_comment() { ); } +#[test] +fn glsl_lex_multi_line_comment() { + let source = "void main /* comment [] {}\n/**\n{}*/{}"; + let lex = Lexer::new(source); + let tokens: Vec = lex.collect(); + assert_eq!(tokens.len(), 4); + + let mut iter = tokens.iter(); + assert_eq!( + format!("{:?}", iter.next().unwrap()), + "Void(TokenMetadata { line: 0, chars: 0..4 })" + ); + assert_eq!( + format!("{:?}", iter.next().unwrap()), + "Identifier((TokenMetadata { line: 0, chars: 5..9 }, \"main\"))" + ); + assert_eq!( + format!("{:?}", iter.next().unwrap()), + "LeftBrace(TokenMetadata { line: 2, chars: 4..5 })" + ); + assert_eq!( + format!("{:?}", iter.next().unwrap()), + "RightBrace(TokenMetadata { line: 2, chars: 5..6 })" + ); +} + #[test] fn glsl_lex_identifier() { let source = "id123_OK 92No æNoø No¾ No好"; diff --git a/src/front/glsl_new/parser.rs b/src/front/glsl_new/parser.rs index 10ac3af5c8..194dca93d7 100644 --- a/src/front/glsl_new/parser.rs +++ b/src/front/glsl_new/parser.rs @@ -25,6 +25,9 @@ pomelo! { } %type Unknown char; + %type CommentStart (); + %type CommentEnd (); + %type Identifier String; %type IntConstant i64; %type UintConstant u64;