refactor(parser): clean up some lexer code

This commit is contained in:
Boshen 2023-02-12 21:33:56 +08:00
parent 204ea12d6a
commit 85955d7147
No known key found for this signature in database
GPG key ID: 6AC90C77AAAA6ABC
3 changed files with 143 additions and 139 deletions

View file

@ -186,18 +186,18 @@ impl<'a> Parser<'a> {
/// Expect the next next token to be a `JsxChild`, i.e. `<` or `{` or `JSXText`
/// # Errors
pub fn expect_jsx_child(&mut self, kind: Kind) -> Result<()> {
self.lexer.context = LexerContext::JsxChild;
self.lexer.set_context(LexerContext::JsxChild);
self.expect(kind)?;
self.lexer.context = LexerContext::Regular;
self.lexer.set_context(LexerContext::Regular);
Ok(())
}
/// Expect the next next token to be a `JsxString` or any other token
/// # Errors
pub fn expect_jsx_attribute_value(&mut self, kind: Kind) -> Result<()> {
self.lexer.context = LexerContext::JsxAttributeValue;
self.lexer.set_context(LexerContext::JsxAttributeValue);
self.expect(kind)?;
self.lexer.context = LexerContext::Regular;
self.lexer.set_context(LexerContext::Regular);
Ok(())
}

View file

@ -83,132 +83,132 @@ pub fn is_identifier_part(c: char) -> bool {
}
pub const SINGLE_CHAR_TOKENS: &[Kind; 128] = &[
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::LParen, // 0x28
Kind::RParen, // 0x29
Kind::Undetermined,
Kind::Undetermined,
Kind::Comma, // 0x2C
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Colon, // 0x3A
Kind::Semicolon, // 0x3B
Kind::Undetermined,
Kind::Undetermined,
Kind::RAngle, // 0x3E
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::LBrack, // 0x5B
Kind::Undetermined,
Kind::RBrack, // 0x5D
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::Undetermined,
Kind::LCurly, // 0x7B
Kind::Undetermined,
Kind::RCurly, // 0x7D
Kind::Tilde, // 0x7E
Kind::Undetermined,
/* 0 */ Kind::Undetermined,
/* 1 */ Kind::Undetermined,
/* 2 */ Kind::Undetermined,
/* 3 */ Kind::Undetermined,
/* 4 */ Kind::Undetermined,
/* 5 */ Kind::Undetermined,
/* 6 */ Kind::Undetermined,
/* 7 */ Kind::Undetermined,
/* 8 */ Kind::Undetermined,
/* 9 */ Kind::Undetermined,
/* 10 */ Kind::Undetermined,
/* 11 */ Kind::Undetermined,
/* 12 */ Kind::Undetermined,
/* 13 */ Kind::Undetermined,
/* 14 */ Kind::Undetermined,
/* 15 */ Kind::Undetermined,
/* 16 */ Kind::Undetermined,
/* 17 */ Kind::Undetermined,
/* 18 */ Kind::Undetermined,
/* 19 */ Kind::Undetermined,
/* 20 */ Kind::Undetermined,
/* 21 */ Kind::Undetermined,
/* 22 */ Kind::Undetermined,
/* 23 */ Kind::Undetermined,
/* 24 */ Kind::Undetermined,
/* 25 */ Kind::Undetermined,
/* 26 */ Kind::Undetermined,
/* 27 */ Kind::Undetermined,
/* 28 */ Kind::Undetermined,
/* 29 */ Kind::Undetermined,
/* 30 */ Kind::Undetermined,
/* 31 */ Kind::Undetermined,
/* 32 */ Kind::Undetermined,
/* 33 */ Kind::Undetermined,
/* 34 */ Kind::Undetermined,
/* 35 */ Kind::Undetermined,
/* 36 */ Kind::Undetermined,
/* 37 */ Kind::Undetermined,
/* 38 */ Kind::Undetermined,
/* 39 */ Kind::Undetermined,
/* 40 */ Kind::LParen, // 0x28
/* 41 */ Kind::RParen, // 0x29
/* 42 */ Kind::Undetermined,
/* 43 */ Kind::Undetermined,
/* 44 */ Kind::Comma, // 0x2C
/* 45 */ Kind::Undetermined,
/* 46 */ Kind::Undetermined,
/* 47 */ Kind::Undetermined,
/* 48 */ Kind::Undetermined,
/* 49 */ Kind::Undetermined,
/* 50 */ Kind::Undetermined,
/* 51 */ Kind::Undetermined,
/* 52 */ Kind::Undetermined,
/* 53 */ Kind::Undetermined,
/* 54 */ Kind::Undetermined,
/* 55 */ Kind::Undetermined,
/* 56 */ Kind::Undetermined,
/* 57 */ Kind::Undetermined,
/* 58 */ Kind::Colon, // 0x3A
/* 59 */ Kind::Semicolon, // 0x3B
/* 60 */ Kind::Undetermined,
/* 61 */ Kind::Undetermined,
/* 62 */ Kind::RAngle, // 0x3E
/* 63 */ Kind::Undetermined,
/* 64 */ Kind::At,
/* 65 */ Kind::Undetermined,
/* 66 */ Kind::Undetermined,
/* 67 */ Kind::Undetermined,
/* 68 */ Kind::Undetermined,
/* 69 */ Kind::Undetermined,
/* 70 */ Kind::Undetermined,
/* 71 */ Kind::Undetermined,
/* 72 */ Kind::Undetermined,
/* 73 */ Kind::Undetermined,
/* 74 */ Kind::Undetermined,
/* 75 */ Kind::Undetermined,
/* 76 */ Kind::Undetermined,
/* 77 */ Kind::Undetermined,
/* 78 */ Kind::Undetermined,
/* 79 */ Kind::Undetermined,
/* 80 */ Kind::Undetermined,
/* 81 */ Kind::Undetermined,
/* 82 */ Kind::Undetermined,
/* 83 */ Kind::Undetermined,
/* 84 */ Kind::Undetermined,
/* 85 */ Kind::Undetermined,
/* 86 */ Kind::Undetermined,
/* 87 */ Kind::Undetermined,
/* 88 */ Kind::Undetermined,
/* 89 */ Kind::Undetermined,
/* 90 */ Kind::Undetermined,
/* 91 */ Kind::LBrack, // 0x5B
/* 92 */ Kind::Undetermined,
/* 93 */ Kind::RBrack, // 0x5D
/* 94 */ Kind::Undetermined,
/* 95 */ Kind::Undetermined,
/* 96 */ Kind::Undetermined,
/* 97 */ Kind::Undetermined,
/* 98 */ Kind::Undetermined,
/* 99 */ Kind::Undetermined,
/* 100 */ Kind::Undetermined,
/* 101 */ Kind::Undetermined,
/* 102 */ Kind::Undetermined,
/* 103 */ Kind::Undetermined,
/* 104 */ Kind::Undetermined,
/* 105 */ Kind::Undetermined,
/* 106 */ Kind::Undetermined,
/* 107 */ Kind::Undetermined,
/* 108 */ Kind::Undetermined,
/* 109 */ Kind::Undetermined,
/* 110 */ Kind::Undetermined,
/* 111 */ Kind::Undetermined,
/* 112 */ Kind::Undetermined,
/* 113 */ Kind::Undetermined,
/* 114 */ Kind::Undetermined,
/* 115 */ Kind::Undetermined,
/* 116 */ Kind::Undetermined,
/* 117 */ Kind::Undetermined,
/* 118 */ Kind::Undetermined,
/* 119 */ Kind::Undetermined,
/* 120 */ Kind::Undetermined,
/* 121 */ Kind::Undetermined,
/* 122 */ Kind::Undetermined,
/* 123 */ Kind::LCurly, // 0x7B
/* 124 */ Kind::Undetermined,
/* 125 */ Kind::RCurly, // 0x7D
/* 126 */ Kind::Tilde, // 0x7E
/* 127 */ Kind::Undetermined,
];

View file

@ -28,9 +28,9 @@ pub use token::{RegExp, Token, TokenValue};
#[derive(Debug, Clone)]
pub struct LexerCheckpoint<'a> {
/// Remaining chars to be tokenized
pub(crate) chars: Chars<'a>,
chars: Chars<'a>,
pub(crate) token: Token,
token: Token,
errors_pos: usize,
}
@ -45,19 +45,19 @@ pub enum LexerContext {
}
pub struct Lexer<'a> {
pub(crate) allocator: &'a Allocator,
allocator: &'a Allocator,
source: &'a str,
source_type: SourceType,
pub(crate) current: LexerCheckpoint<'a>,
current: LexerCheckpoint<'a>,
errors: Diagnostics,
lookahead: VecDeque<LexerCheckpoint<'a>>,
pub context: LexerContext,
context: LexerContext,
}
#[allow(clippy::unused_self)]
@ -87,13 +87,13 @@ impl<'a> Lexer<'a> {
}
}
/// Remaining string from `Chars`
#[must_use]
pub fn remaining(&self) -> &'a str {
self.current.chars.as_str()
}
/// Creates a checkpoint storing the current lexer state.
///
/// Use `rewind` to restore the lexer to the state stored in the checkpoint.
#[must_use]
pub fn checkpoint(&self) -> LexerCheckpoint<'a> {
@ -145,6 +145,11 @@ impl<'a> Lexer<'a> {
&self.lookahead[n - 1].token
}
/// Set context
pub fn set_context(&mut self, context: LexerContext) {
self.context = context;
}
/// Main entry point
pub fn next_token(&mut self) -> Token {
if let Some(checkpoint) = self.lookahead.pop_front() {
@ -414,7 +419,6 @@ impl<'a> Lexer<'a> {
self.private_identifier(builder)
}
}
'@' => Kind::At,
'\\' => {
builder.force_allocation_without_current_ascii_char(self);
self.identifier_unicode_escape_sequence(&mut builder, true);