mirror of
https://github.com/gfx-rs/wgpu.git
synced 2026-04-22 03:02:01 -04:00
Fix double constant lexing and lex uint constants
This commit is contained in:
committed by
Dzmitry Malyshau
parent
9f88c3e986
commit
df3759ebff
@@ -93,21 +93,24 @@ impl<'a> Lexer<'a> {
|
||||
}
|
||||
}
|
||||
'0'..='9' => {
|
||||
let (number, _, pos) =
|
||||
let (number, remainder, pos) =
|
||||
consume_any(input, |c| (('0'..='9').contains(&c) || c == '.'));
|
||||
let mut remainder_chars = remainder.chars();
|
||||
let first = remainder_chars.next().and_then(|c| c.to_lowercase().next());
|
||||
|
||||
if number.find('.').is_some() {
|
||||
if (
|
||||
chars.next().map(|c| c.to_lowercase().next().unwrap()),
|
||||
chars.next().map(|c| c.to_lowercase().next().unwrap()),
|
||||
) == (Some('l'), Some('f'))
|
||||
{
|
||||
let second = remainder_chars.next().and_then(|c| c.to_lowercase().next());
|
||||
|
||||
if (first, second) == (Some('l'), Some('f')) {
|
||||
meta.chars.end = start + pos + 2;
|
||||
Some(Token::DoubleConstant((meta, number.parse().unwrap())))
|
||||
} else {
|
||||
meta.chars.end = start + pos;
|
||||
|
||||
Some(Token::FloatConstant((meta, number.parse().unwrap())))
|
||||
}
|
||||
} else if first == Some('u') {
|
||||
meta.chars.end = start + pos + 1;
|
||||
Some(Token::UintConstant((meta, number.parse().unwrap())))
|
||||
} else {
|
||||
meta.chars.end = start + pos;
|
||||
Some(Token::IntConstant((meta, number.parse().unwrap())))
|
||||
|
||||
@@ -343,4 +343,92 @@ fn tokens() {
|
||||
})
|
||||
);
|
||||
assert_eq!(lex.next(), None);
|
||||
|
||||
// float constants
|
||||
let mut lex = Lexer::new("120.0 130.0lf 140.0Lf 150.0LF");
|
||||
assert_eq!(
|
||||
lex.next().unwrap(),
|
||||
FloatConstant((
|
||||
TokenMetadata {
|
||||
line: 0,
|
||||
chars: 0..5
|
||||
},
|
||||
120.0,
|
||||
))
|
||||
);
|
||||
assert_eq!(
|
||||
lex.next().unwrap(),
|
||||
DoubleConstant((
|
||||
TokenMetadata {
|
||||
line: 0,
|
||||
chars: 6..13
|
||||
},
|
||||
130.0,
|
||||
))
|
||||
);
|
||||
assert_eq!(
|
||||
lex.next().unwrap(),
|
||||
DoubleConstant((
|
||||
TokenMetadata {
|
||||
line: 0,
|
||||
chars: 14..21
|
||||
},
|
||||
140.0,
|
||||
))
|
||||
);
|
||||
assert_eq!(
|
||||
lex.next().unwrap(),
|
||||
DoubleConstant((
|
||||
TokenMetadata {
|
||||
line: 0,
|
||||
chars: 22..29
|
||||
},
|
||||
150.0,
|
||||
))
|
||||
);
|
||||
assert_eq!(lex.next(), None);
|
||||
|
||||
// Integer constants
|
||||
let mut lex = Lexer::new("120 130u 140U 150");
|
||||
assert_eq!(
|
||||
lex.next().unwrap(),
|
||||
IntConstant((
|
||||
TokenMetadata {
|
||||
line: 0,
|
||||
chars: 0..3
|
||||
},
|
||||
120,
|
||||
))
|
||||
);
|
||||
assert_eq!(
|
||||
lex.next().unwrap(),
|
||||
UintConstant((
|
||||
TokenMetadata {
|
||||
line: 0,
|
||||
chars: 4..8
|
||||
},
|
||||
130,
|
||||
))
|
||||
);
|
||||
assert_eq!(
|
||||
lex.next().unwrap(),
|
||||
UintConstant((
|
||||
TokenMetadata {
|
||||
line: 0,
|
||||
chars: 9..13
|
||||
},
|
||||
140,
|
||||
))
|
||||
);
|
||||
assert_eq!(
|
||||
lex.next().unwrap(),
|
||||
IntConstant((
|
||||
TokenMetadata {
|
||||
line: 0,
|
||||
chars: 14..17
|
||||
},
|
||||
150,
|
||||
))
|
||||
);
|
||||
assert_eq!(lex.next(), None);
|
||||
}
|
||||
|
||||
@@ -180,7 +180,19 @@ pomelo! {
|
||||
extra.context.expressions.append(Expression::Constant(ch))
|
||||
)
|
||||
}
|
||||
// primary_expression ::= UintConstant;
|
||||
primary_expression ::= UintConstant(i) {
|
||||
let ch = extra.module.constants.fetch_or_append(Constant {
|
||||
name: None,
|
||||
specialization: None,
|
||||
inner: ConstantInner::Scalar {
|
||||
width: 4,
|
||||
value: ScalarValue::Uint(i.1),
|
||||
},
|
||||
});
|
||||
ExpressionRule::from_expression(
|
||||
extra.context.expressions.append(Expression::Constant(ch))
|
||||
)
|
||||
}
|
||||
primary_expression ::= FloatConstant(f) {
|
||||
let ch = extra.module.constants.fetch_or_append(Constant {
|
||||
name: None,
|
||||
@@ -207,7 +219,19 @@ pomelo! {
|
||||
extra.context.expressions.append(Expression::Constant(ch))
|
||||
)
|
||||
}
|
||||
// primary_expression ::= DoubleConstant;
|
||||
primary_expression ::= DoubleConstant(f) {
|
||||
let ch = extra.module.constants.fetch_or_append(Constant {
|
||||
name: None,
|
||||
specialization: None,
|
||||
inner: ConstantInner::Scalar {
|
||||
width: 8,
|
||||
value: ScalarValue::Float(f.1),
|
||||
},
|
||||
});
|
||||
ExpressionRule::from_expression(
|
||||
extra.context.expressions.append(Expression::Constant(ch))
|
||||
)
|
||||
}
|
||||
primary_expression ::= LeftParen expression(e) RightParen {
|
||||
e
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user