Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/parser/src/grammar/expressions/atom.rs')
-rw-r--r--crates/parser/src/grammar/expressions/atom.rs36
1 files changed, 28 insertions, 8 deletions
diff --git a/crates/parser/src/grammar/expressions/atom.rs b/crates/parser/src/grammar/expressions/atom.rs
index d7a0691717..c191b5593d 100644
--- a/crates/parser/src/grammar/expressions/atom.rs
+++ b/crates/parser/src/grammar/expressions/atom.rs
@@ -17,19 +17,24 @@ pub(crate) const LITERAL_FIRST: TokenSet = TokenSet::new(&[
T![true],
T![false],
INT_NUMBER,
- FLOAT_NUMBER_PART,
+ FLOAT_NUMBER_START_0,
+ FLOAT_NUMBER_START_1,
+ FLOAT_NUMBER_START_2,
BYTE,
CHAR,
STRING,
BYTE_STRING,
]);
+pub(crate) const FLOAT_LITERAL_FIRST: TokenSet =
+ TokenSet::new(&[FLOAT_NUMBER_START_0, FLOAT_NUMBER_START_1, FLOAT_NUMBER_START_2]);
+
pub(crate) fn literal(p: &mut Parser) -> Option<CompletedMarker> {
if !p.at_ts(LITERAL_FIRST) {
return None;
}
let m = p.start();
- if p.at(FLOAT_NUMBER_PART) {
+ if p.at_ts(FLOAT_LITERAL_FIRST) {
float_literal(p);
} else {
// Everything else is just one token.
@@ -38,15 +43,30 @@ pub(crate) fn literal(p: &mut Parser) -> Option<CompletedMarker> {
Some(m.complete(p, LITERAL))
}
+// test float_literal
+// fn f() {
+// 0.0;
+// 1.;
+// 0e0;
+// 0e0f32;
+// 1.23f64;
+// }
pub(crate) fn float_literal(p: &mut Parser) {
- // Floats can be up to 3 tokens: 2 `FLOAT_NUMBER_PART`s separated by 1 `DOT`
+ // Floats can be up to 3 tokens. The first token indicates how many there are.
+ // We remap the first token to `FLOAT_NUMBER_PART` so that no subsequent code has to deal with
+ // this awful, awful hack.
let f = p.start();
- p.bump(FLOAT_NUMBER_PART);
- if p.at(DOT) {
+ if p.at(FLOAT_NUMBER_START_0) {
+ p.bump_remap(FLOAT_NUMBER_PART);
+ } else if p.at(FLOAT_NUMBER_START_1) {
+ p.bump_remap(FLOAT_NUMBER_PART);
p.bump(DOT);
- if p.at(FLOAT_NUMBER_PART) {
- p.bump(FLOAT_NUMBER_PART);
- }
+ } else if p.at(FLOAT_NUMBER_START_2) {
+ p.bump_remap(FLOAT_NUMBER_PART);
+ p.bump(DOT);
+ p.bump(FLOAT_NUMBER_PART);
+ } else {
+ unreachable!();
}
f.complete(p, FLOAT_LITERAL);
}