Reduce size of Token.
This commit is contained in:
parent
61e6403ac6
commit
b17e891b63
@ -1326,7 +1326,7 @@ fn parse_primary(
|
|||||||
segments.push(Expr::StringConstant(s.into(), pos));
|
segments.push(Expr::StringConstant(s.into(), pos));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
(Token::LexError(err @ LexError::UnterminatedString), pos) => {
|
(Token::LexError(err), pos) if matches!(*err, LexError::UnterminatedString) => {
|
||||||
return Err(err.into_err(pos))
|
return Err(err.into_err(pos))
|
||||||
}
|
}
|
||||||
(token, ..) => unreachable!(
|
(token, ..) => unreachable!(
|
||||||
|
@ -19,6 +19,7 @@ fn check_struct_sizes() {
|
|||||||
size_of::<Position>(),
|
size_of::<Position>(),
|
||||||
if cfg!(feature = "no_position") { 0 } else { 4 }
|
if cfg!(feature = "no_position") { 0 } else { 4 }
|
||||||
);
|
);
|
||||||
|
assert_eq!(size_of::<tokenizer::Token>(), 32);
|
||||||
assert_eq!(size_of::<ast::Expr>(), if PACKED { 12 } else { 16 });
|
assert_eq!(size_of::<ast::Expr>(), if PACKED { 12 } else { 16 });
|
||||||
assert_eq!(size_of::<Option<ast::Expr>>(), if PACKED { 12 } else { 16 });
|
assert_eq!(size_of::<Option<ast::Expr>>(), if PACKED { 12 } else { 16 });
|
||||||
assert_eq!(size_of::<ast::Stmt>(), if PACKED { 12 } else { 16 });
|
assert_eq!(size_of::<ast::Stmt>(), if PACKED { 12 } else { 16 });
|
||||||
|
@ -534,7 +534,7 @@ pub enum Token {
|
|||||||
#[cfg(not(feature = "no_module"))]
|
#[cfg(not(feature = "no_module"))]
|
||||||
As,
|
As,
|
||||||
/// A lexer error.
|
/// A lexer error.
|
||||||
LexError(LexError),
|
LexError(Box<LexError>),
|
||||||
/// A comment block.
|
/// A comment block.
|
||||||
Comment(SmartString),
|
Comment(SmartString),
|
||||||
/// A reserved symbol.
|
/// A reserved symbol.
|
||||||
@ -1444,7 +1444,7 @@ fn get_next_token_inner(
|
|||||||
// Within text?
|
// Within text?
|
||||||
if let Some(ch) = state.is_within_text_terminated_by.take() {
|
if let Some(ch) = state.is_within_text_terminated_by.take() {
|
||||||
return parse_string_literal(stream, state, pos, ch, true, false, true).map_or_else(
|
return parse_string_literal(stream, state, pos, ch, true, false, true).map_or_else(
|
||||||
|(err, err_pos)| Some((Token::LexError(err), err_pos)),
|
|(err, err_pos)| Some((Token::LexError(err.into()), err_pos)),
|
||||||
|(result, interpolated, start_pos)| {
|
|(result, interpolated, start_pos)| {
|
||||||
if interpolated {
|
if interpolated {
|
||||||
Some((Token::InterpolatedString(result), start_pos))
|
Some((Token::InterpolatedString(result), start_pos))
|
||||||
@ -1582,7 +1582,9 @@ fn get_next_token_inner(
|
|||||||
.map(|v| v as INT)
|
.map(|v| v as INT)
|
||||||
.map(Token::IntegerConstant)
|
.map(Token::IntegerConstant)
|
||||||
.unwrap_or_else(|_| {
|
.unwrap_or_else(|_| {
|
||||||
Token::LexError(LERR::MalformedNumber(result.into_iter().collect()))
|
Token::LexError(
|
||||||
|
LERR::MalformedNumber(result.into_iter().collect()).into(),
|
||||||
|
)
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
let out: String =
|
let out: String =
|
||||||
@ -1608,7 +1610,9 @@ fn get_next_token_inner(
|
|||||||
});
|
});
|
||||||
|
|
||||||
num.unwrap_or_else(|_| {
|
num.unwrap_or_else(|_| {
|
||||||
Token::LexError(LERR::MalformedNumber(result.into_iter().collect()))
|
Token::LexError(
|
||||||
|
LERR::MalformedNumber(result.into_iter().collect()).into(),
|
||||||
|
)
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
num_pos,
|
num_pos,
|
||||||
@ -1629,7 +1633,7 @@ fn get_next_token_inner(
|
|||||||
('"', ..) => {
|
('"', ..) => {
|
||||||
return parse_string_literal(stream, state, pos, c, false, true, false)
|
return parse_string_literal(stream, state, pos, c, false, true, false)
|
||||||
.map_or_else(
|
.map_or_else(
|
||||||
|(err, err_pos)| Some((Token::LexError(err), err_pos)),
|
|(err, err_pos)| Some((Token::LexError(err.into()), err_pos)),
|
||||||
|(result, ..)| Some((Token::StringConstant(result), start_pos)),
|
|(result, ..)| Some((Token::StringConstant(result), start_pos)),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -1655,7 +1659,7 @@ fn get_next_token_inner(
|
|||||||
}
|
}
|
||||||
|
|
||||||
return parse_string_literal(stream, state, pos, c, true, false, true).map_or_else(
|
return parse_string_literal(stream, state, pos, c, true, false, true).map_or_else(
|
||||||
|(err, err_pos)| Some((Token::LexError(err), err_pos)),
|
|(err, err_pos)| Some((Token::LexError(err.into()), err_pos)),
|
||||||
|(result, interpolated, ..)| {
|
|(result, interpolated, ..)| {
|
||||||
if interpolated {
|
if interpolated {
|
||||||
Some((Token::InterpolatedString(result), start_pos))
|
Some((Token::InterpolatedString(result), start_pos))
|
||||||
@ -1669,21 +1673,21 @@ fn get_next_token_inner(
|
|||||||
// ' - character literal
|
// ' - character literal
|
||||||
('\'', '\'') => {
|
('\'', '\'') => {
|
||||||
return Some((
|
return Some((
|
||||||
Token::LexError(LERR::MalformedChar("".to_string())),
|
Token::LexError(LERR::MalformedChar("".to_string()).into()),
|
||||||
start_pos,
|
start_pos,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
('\'', ..) => {
|
('\'', ..) => {
|
||||||
return Some(
|
return Some(
|
||||||
parse_string_literal(stream, state, pos, c, false, false, false).map_or_else(
|
parse_string_literal(stream, state, pos, c, false, false, false).map_or_else(
|
||||||
|(err, err_pos)| (Token::LexError(err), err_pos),
|
|(err, err_pos)| (Token::LexError(err.into()), err_pos),
|
||||||
|(result, ..)| {
|
|(result, ..)| {
|
||||||
let mut chars = result.chars();
|
let mut chars = result.chars();
|
||||||
let first = chars.next().unwrap();
|
let first = chars.next().unwrap();
|
||||||
|
|
||||||
if chars.next().is_some() {
|
if chars.next().is_some() {
|
||||||
(
|
(
|
||||||
Token::LexError(LERR::MalformedChar(result.to_string())),
|
Token::LexError(LERR::MalformedChar(result.to_string()).into()),
|
||||||
start_pos,
|
start_pos,
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
@ -2020,7 +2024,7 @@ fn get_next_token_inner(
|
|||||||
|
|
||||||
(ch, ..) => {
|
(ch, ..) => {
|
||||||
return Some((
|
return Some((
|
||||||
Token::LexError(LERR::UnexpectedInput(ch.to_string())),
|
Token::LexError(LERR::UnexpectedInput(ch.to_string()).into()),
|
||||||
start_pos,
|
start_pos,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
@ -2062,7 +2066,7 @@ fn get_identifier(
|
|||||||
|
|
||||||
if !is_valid_identifier {
|
if !is_valid_identifier {
|
||||||
return Some((
|
return Some((
|
||||||
Token::LexError(LERR::MalformedIdentifier(identifier)),
|
Token::LexError(LERR::MalformedIdentifier(identifier).into()),
|
||||||
start_pos,
|
start_pos,
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
@ -2243,7 +2247,7 @@ impl<'a> Iterator for TokenIterator<'a> {
|
|||||||
// script it is a syntax error.
|
// script it is a syntax error.
|
||||||
Some((Token::StringConstant(..), pos)) if self.state.is_within_text_terminated_by.is_some() => {
|
Some((Token::StringConstant(..), pos)) if self.state.is_within_text_terminated_by.is_some() => {
|
||||||
self.state.is_within_text_terminated_by = None;
|
self.state.is_within_text_terminated_by = None;
|
||||||
return Some((Token::LexError(LERR::UnterminatedString), pos));
|
return Some((Token::LexError(LERR::UnterminatedString.into()), pos));
|
||||||
}
|
}
|
||||||
// Reserved keyword/symbol
|
// Reserved keyword/symbol
|
||||||
Some((Token::Reserved(s), pos)) => (match
|
Some((Token::Reserved(s), pos)) => (match
|
||||||
@ -2251,36 +2255,36 @@ impl<'a> Iterator for TokenIterator<'a> {
|
|||||||
{
|
{
|
||||||
("===", false) => Token::LexError(LERR::ImproperSymbol(s.to_string(),
|
("===", false) => Token::LexError(LERR::ImproperSymbol(s.to_string(),
|
||||||
"'===' is not a valid operator. This is not JavaScript! Should it be '=='?".to_string(),
|
"'===' is not a valid operator. This is not JavaScript! Should it be '=='?".to_string(),
|
||||||
)),
|
).into()),
|
||||||
("!==", false) => Token::LexError(LERR::ImproperSymbol(s.to_string(),
|
("!==", false) => Token::LexError(LERR::ImproperSymbol(s.to_string(),
|
||||||
"'!==' is not a valid operator. This is not JavaScript! Should it be '!='?".to_string(),
|
"'!==' is not a valid operator. This is not JavaScript! Should it be '!='?".to_string(),
|
||||||
)),
|
).into()),
|
||||||
("->", false) => Token::LexError(LERR::ImproperSymbol(s.to_string(),
|
("->", false) => Token::LexError(LERR::ImproperSymbol(s.to_string(),
|
||||||
"'->' is not a valid symbol. This is not C or C++!".to_string())),
|
"'->' is not a valid symbol. This is not C or C++!".to_string()).into()),
|
||||||
("<-", false) => Token::LexError(LERR::ImproperSymbol(s.to_string(),
|
("<-", false) => Token::LexError(LERR::ImproperSymbol(s.to_string(),
|
||||||
"'<-' is not a valid symbol. This is not Go! Should it be '<='?".to_string(),
|
"'<-' is not a valid symbol. This is not Go! Should it be '<='?".to_string(),
|
||||||
)),
|
).into()),
|
||||||
(":=", false) => Token::LexError(LERR::ImproperSymbol(s.to_string(),
|
(":=", false) => Token::LexError(LERR::ImproperSymbol(s.to_string(),
|
||||||
"':=' is not a valid assignment operator. This is not Go or Pascal! Should it be simply '='?".to_string(),
|
"':=' is not a valid assignment operator. This is not Go or Pascal! Should it be simply '='?".to_string(),
|
||||||
)),
|
).into()),
|
||||||
(":;", false) => Token::LexError(LERR::ImproperSymbol(s.to_string(),
|
(":;", false) => Token::LexError(LERR::ImproperSymbol(s.to_string(),
|
||||||
"':;' is not a valid symbol. Should it be '::'?".to_string(),
|
"':;' is not a valid symbol. Should it be '::'?".to_string(),
|
||||||
)),
|
).into()),
|
||||||
("::<", false) => Token::LexError(LERR::ImproperSymbol(s.to_string(),
|
("::<", false) => Token::LexError(LERR::ImproperSymbol(s.to_string(),
|
||||||
"'::<>' is not a valid symbol. This is not Rust! Should it be '::'?".to_string(),
|
"'::<>' is not a valid symbol. This is not Rust! Should it be '::'?".to_string(),
|
||||||
)),
|
).into()),
|
||||||
("(*", false) | ("*)", false) => Token::LexError(LERR::ImproperSymbol(s.to_string(),
|
("(*", false) | ("*)", false) => Token::LexError(LERR::ImproperSymbol(s.to_string(),
|
||||||
"'(* .. *)' is not a valid comment format. This is not Pascal! Should it be '/* .. */'?".to_string(),
|
"'(* .. *)' is not a valid comment format. This is not Pascal! Should it be '/* .. */'?".to_string(),
|
||||||
)),
|
).into()),
|
||||||
("# {", false) => Token::LexError(LERR::ImproperSymbol(s.to_string(),
|
("# {", false) => Token::LexError(LERR::ImproperSymbol(s.to_string(),
|
||||||
"'#' is not a valid symbol. Should it be '#{'?".to_string(),
|
"'#' is not a valid symbol. Should it be '#{'?".to_string(),
|
||||||
)),
|
).into()),
|
||||||
// Reserved keyword/operator that is custom.
|
// Reserved keyword/operator that is custom.
|
||||||
(.., true) => Token::Custom(s),
|
(.., true) => Token::Custom(s),
|
||||||
// Reserved keyword that is not custom and disabled.
|
// Reserved keyword that is not custom and disabled.
|
||||||
(token, false) if self.engine.disabled_symbols.contains(token) => {
|
(token, false) if self.engine.disabled_symbols.contains(token) => {
|
||||||
let msg = format!("reserved {} '{}' is disabled", if is_valid_identifier(token.chars()) { "keyword"} else {"symbol"}, token);
|
let msg = format!("reserved {} '{}' is disabled", if is_valid_identifier(token.chars()) { "keyword"} else {"symbol"}, token);
|
||||||
Token::LexError(LERR::ImproperSymbol(s.to_string(), msg))
|
Token::LexError(LERR::ImproperSymbol(s.to_string(), msg).into())
|
||||||
},
|
},
|
||||||
// Reserved keyword/operator that is not custom.
|
// Reserved keyword/operator that is not custom.
|
||||||
(.., false) => Token::Reserved(s),
|
(.., false) => Token::Reserved(s),
|
||||||
|
@ -267,7 +267,12 @@ impl From<LexError> for ParseErrorType {
|
|||||||
|
|
||||||
/// Error when parsing a script.
|
/// Error when parsing a script.
|
||||||
#[derive(Debug, Eq, PartialEq, Clone, Hash)]
|
#[derive(Debug, Eq, PartialEq, Clone, Hash)]
|
||||||
pub struct ParseError(pub Box<ParseErrorType>, pub Position);
|
pub struct ParseError(
|
||||||
|
/// Parse error type.
|
||||||
|
pub Box<ParseErrorType>,
|
||||||
|
/// [Position] of the parse error.
|
||||||
|
pub Position,
|
||||||
|
);
|
||||||
|
|
||||||
impl Error for ParseError {}
|
impl Error for ParseError {}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user