Skip to content

Commit

Permalink
address comments
Browse files Browse the repository at this point in the history
  • Loading branch information
teoxoy committed Jun 8, 2022
1 parent fc04553 commit f086748
Show file tree
Hide file tree
Showing 3 changed files with 50 additions and 64 deletions.
73 changes: 48 additions & 25 deletions src/front/wgsl/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ mod construction;
mod conv;
mod lexer;
mod number;
mod number_literals;
#[cfg(test)]
mod tests;

Expand All @@ -22,11 +21,7 @@ use crate::{
ConstantInner, FastHashMap, ScalarValue,
};

use self::{
lexer::Lexer,
number::Number,
number_literals::{parse_generic_non_negative_int_literal, parse_non_negative_i32_literal},
};
use self::{lexer::Lexer, number::Number};
use codespan_reporting::{
diagnostic::{Diagnostic, Label},
files::SimpleFile,
Expand Down Expand Up @@ -194,9 +189,9 @@ impl<'a> Error<'a> {
ExpectedToken::Identifier => "identifier".to_string(),
ExpectedToken::Number(ty) => {
match ty {
NumberType::I32 => "32bit signed integer literal",
NumberType::U32 => "32bit unsigned integer literal",
NumberType::F32 => "32bit floating-point literal",
NumberType::I32 => "32-bit signed integer literal",
NumberType::U32 => "32-bit unsigned integer literal",
NumberType::F32 => "32-bit floating-point literal",
}.to_string()
},
ExpectedToken::Integer => "unsigned/signed integer literal".to_string(),
Expand Down Expand Up @@ -229,8 +224,8 @@ impl<'a> Error<'a> {
},
Error::BadNumber(ref bad_span, ref err) => ParseError {
message: format!(
"`{}` {}",
&source[bad_span.clone()], err,
"{}: `{}`",
err,&source[bad_span.clone()],
),
labels: vec![(bad_span.clone(), err.to_string().into())],
notes: vec![],
Expand Down Expand Up @@ -1183,7 +1178,7 @@ impl BindingParser {
match name {
"location" => {
lexer.expect(Token::Paren('('))?;
self.location = Some(parse_non_negative_i32_literal(lexer)?);
self.location = Some(Parser::parse_non_negative_i32_literal(lexer)?);
lexer.expect(Token::Paren(')'))?;
}
"builtin" => {
Expand Down Expand Up @@ -1382,6 +1377,38 @@ impl Parser {
}
}

/// Parse a non-negative signed integer literal.
/// This is for attributes like `size`, `location` and others.
fn parse_non_negative_i32_literal<'a>(lexer: &mut Lexer<'a>) -> Result<u32, Error<'a>> {
match lexer.next() {
(Token::Number(Ok(Number::I32(num))), span) => {
u32::try_from(num).map_err(|_| Error::NegativeInt(span))
}
(Token::Number(Err(e)), span) => Err(Error::BadNumber(span, e)),
other => Err(Error::Unexpected(
other,
ExpectedToken::Number(NumberType::I32),
)),
}
}

/// Parse a non-negative integer literal that may be either signed or unsigned.
/// This is for the `workgroup_size` attribute and array lengths.
/// Note: these values should be no larger than [`i32::MAX`], but this is not checked here.
fn parse_generic_non_negative_int_literal<'a>(lexer: &mut Lexer<'a>) -> Result<u32, Error<'a>> {
match lexer.next() {
(Token::Number(Ok(Number::I32(num))), span) => {
u32::try_from(num).map_err(|_| Error::NegativeInt(span))
}
(Token::Number(Ok(Number::U32(num))), _) => Ok(num),
(Token::Number(Err(e)), span) => Err(Error::BadNumber(span, e)),
other => Err(Error::Unexpected(
other,
ExpectedToken::Number(NumberType::I32),
)),
}
}

fn parse_atomic_pointer<'a>(
&mut self,
lexer: &mut Lexer<'a>,
Expand Down Expand Up @@ -1923,7 +1950,7 @@ impl Parser {
let _ = lexer.next();
lexer.open_arguments()?;
let component = if let (Token::Number(..), span) = lexer.peek() {
let index = parse_non_negative_i32_literal(lexer)?;
let index = Self::parse_non_negative_i32_literal(lexer)?;
lexer.expect(Token::Separator(','))?;
*crate::SwizzleComponent::XYZW
.get(index as usize)
Expand Down Expand Up @@ -2234,13 +2261,7 @@ impl Parser {
expr
}
(Token::Word("true" | "false") | Token::Number(..), _) => {
let const_handle = self.parse_const_expression_impl(
lexer.next(),
lexer,
None,
ctx.types,
ctx.constants,
)?;
let const_handle = self.parse_const_expression(lexer, ctx.types, ctx.constants)?;
let span = NagaSpan::from(self.pop_scope(lexer));
TypedExpression::non_reference(
ctx.interrupt_emitter(crate::Expression::Constant(const_handle), span),
Expand Down Expand Up @@ -2785,13 +2806,15 @@ impl Parser {
match lexer.next_ident_with_span()? {
("size", _) => {
lexer.expect(Token::Paren('('))?;
let (value, span) = lexer.capture_span(parse_non_negative_i32_literal)?;
let (value, span) =
lexer.capture_span(Self::parse_non_negative_i32_literal)?;
lexer.expect(Token::Paren(')'))?;
size = Some(NonZeroU32::new(value).ok_or(Error::ZeroSizeOrAlign(span))?);
}
("align", _) => {
lexer.expect(Token::Paren('('))?;
let (value, span) = lexer.capture_span(parse_non_negative_i32_literal)?;
let (value, span) =
lexer.capture_span(Self::parse_non_negative_i32_literal)?;
lexer.expect(Token::Paren(')'))?;
align = Some(NonZeroU32::new(value).ok_or(Error::ZeroSizeOrAlign(span))?);
}
Expand Down Expand Up @@ -4167,12 +4190,12 @@ impl Parser {
match lexer.next_ident_with_span()? {
("binding", _) => {
lexer.expect(Token::Paren('('))?;
bind_index = Some(parse_non_negative_i32_literal(lexer)?);
bind_index = Some(Self::parse_non_negative_i32_literal(lexer)?);
lexer.expect(Token::Paren(')'))?;
}
("group", _) => {
lexer.expect(Token::Paren('('))?;
bind_group = Some(parse_non_negative_i32_literal(lexer)?);
bind_group = Some(Self::parse_non_negative_i32_literal(lexer)?);
lexer.expect(Token::Paren(')'))?;
}
("vertex", _) => {
Expand All @@ -4188,7 +4211,7 @@ impl Parser {
lexer.expect(Token::Paren('('))?;
workgroup_size = [1u32; 3];
for (i, size) in workgroup_size.iter_mut().enumerate() {
*size = parse_generic_non_negative_int_literal(lexer)?;
*size = Self::parse_generic_non_negative_int_literal(lexer)?;
match lexer.next() {
(Token::Paren(')'), _) => break,
(Token::Separator(','), _) if i != 2 => (),
Expand Down
4 changes: 2 additions & 2 deletions src/front/wgsl/number.rs
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ enum FloatKind {
// | / 0[xX][0-9a-fA-F]+ \.[0-9a-fA-F]* ([pP][+-]?[0-9]+ [fh]?)? /
// | / 0[xX][0-9a-fA-F]+ [pP][+-]?[0-9]+ [fh]? /

// You could visualize the regex below via https://debuggex.com to get a rough idea what `extract_info` is doing
// You could visualize the regex below via https://debuggex.com to get a rough idea what `parse` is doing
// -?(?:0[xX](?:([0-9a-fA-F]+\.[0-9a-fA-F]*|[0-9a-fA-F]*\.[0-9a-fA-F]+)(?:([pP][+-]?[0-9]+)([fh]?))?|([0-9a-fA-F]+)([pP][+-]?[0-9]+)([fh]?)|([0-9a-fA-F]+)([iu]?))|((?:[0-9]+[eE][+-]?[0-9]+|(?:[0-9]+\.[0-9]*|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?))([fh]?)|((?:[0-9]|[1-9][0-9]+))([iufh]?))

fn parse(input: &str) -> Option<(Result<Number, NumberError>, &str)> {
Expand Down Expand Up @@ -274,7 +274,7 @@ fn parse(input: &str) -> Option<(Result<Number, NumberError>, &str)> {

Some((parse_dec_float(number, kind), rest_to_str!(bytes)))
} else {
// make sure the first digit is not 0
// make sure the multi-digit numbers don't start with zero
if consumed > 1 && is_first_zero {
return None;
}
Expand Down
37 changes: 0 additions & 37 deletions src/front/wgsl/number_literals.rs

This file was deleted.

0 comments on commit f086748

Please sign in to comment.