Number value literal lookahead restrictions - [GraphQL - October 2021] #685

This commit is contained in:
Sunli 2021-11-02 19:37:21 +08:00
parent 9ce89683d3
commit c77de81194
2 changed files with 21 additions and 2 deletions

View File

@ -116,7 +116,7 @@ value = { variable | number | string | boolean | null | enum_value |
variable = { "$" ~ name }
number = @{ float | int }
number = @{ (float | int) ~ !name_start }
float = { int ~ ((fractional ~ exponent) | fractional | exponent) }
fractional = { "." ~ ASCII_DIGIT+ }
exponent = { ("E" | "e") ~ ("+" | "-")? ~ ASCII_DIGIT+ }
@ -165,4 +165,5 @@ arguments = { "(" ~ argument+ ~ ")" }
const_argument = { name ~ ":" ~ const_value }
argument = { name ~ ":" ~ value }
name = @{ (ASCII_ALPHA | "_") ~ (ASCII_ALPHA | ASCII_DIGIT | "_")* }
name_start = @{ (ASCII_ALPHA | "_") }
name = @{ name_start ~ (ASCII_ALPHA | ASCII_DIGIT | "_")* }

View File

@ -312,3 +312,21 @@ fn parse_name(pair: Pair<Rule>, pc: &mut PositionCalculator) -> Result<Positione
debug_assert_eq!(pair.as_rule(), Rule::name);
Ok(Positioned::new(Name::new(pair.as_str()), pc.step(&pair)))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_number_lookahead_restrictions() {
GraphQLParser::parse(Rule::const_list, "[123 abc]").unwrap();
GraphQLParser::parse(Rule::const_list, "[123.0123 abc]").unwrap();
GraphQLParser::parse(Rule::const_list, "[123.0123e7 abc]").unwrap();
GraphQLParser::parse(Rule::const_list, "[123.0123e77 abc]").unwrap();
assert!(GraphQLParser::parse(Rule::const_list, "[123abc]").is_err());
assert!(GraphQLParser::parse(Rule::const_list, "[123.0123abc]").is_err());
assert!(GraphQLParser::parse(Rule::const_list, "[123.0123e7abc]").is_err());
assert!(GraphQLParser::parse(Rule::const_list, "[123.0123e77abc]").is_err());
}
}