Glsl new multi line comments (#103)

* Add multi line comment support to glsl-new

* Fix glsl-new TokenMetadata for multi line comments
This commit is contained in:
Pelle Johnsen
2020-07-05 15:35:20 +02:00
committed by GitHub
parent 4a769c10b5
commit cf62dc3d8c
3 changed files with 53 additions and 15 deletions

View File

@@ -181,13 +181,10 @@ pub fn consume_token(mut input: &str) -> (Option<Token>, &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<Token>, &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()?;

View File

@@ -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<Token> = 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好";

View File

@@ -25,6 +25,9 @@ pomelo! {
}
%type Unknown char;
%type CommentStart ();
%type CommentEnd ();
%type Identifier String;
%type IntConstant i64;
%type UintConstant u64;