devalang_core/core/parser/driver/
cursor.rs

1use crate::core::lexer::token::{Token, TokenKind};
2
3pub fn advance_impl(parser: &mut crate::core::parser::driver::parser::Parser) -> Option<&Token> {
4    if is_eof_impl(parser) {
5        return None;
6    }
7
8    parser.previous = parser.tokens.get(parser.token_index).cloned();
9    parser.token_index += 1;
10
11    parser.tokens.get(parser.token_index - 1)
12}
13
14pub fn peek_impl(parser: &crate::core::parser::driver::parser::Parser) -> Option<&Token> {
15    parser.tokens.get(parser.token_index)
16}
17
18pub fn peek_clone_impl(parser: &crate::core::parser::driver::parser::Parser) -> Option<Token> {
19    parser.tokens.get(parser.token_index).cloned()
20}
21
22pub fn peek_nth_impl(
23    parser: &crate::core::parser::driver::parser::Parser,
24    n: usize,
25) -> Option<&Token> {
26    if parser.token_index + n < parser.tokens.len() {
27        parser.tokens.get(parser.token_index + n)
28    } else {
29        None
30    }
31}
32
33pub fn peek_nth_kind_impl(
34    parser: &crate::core::parser::driver::parser::Parser,
35    n: usize,
36) -> Option<TokenKind> {
37    peek_nth_impl(parser, n).map(|t| t.kind.clone())
38}
39
40pub fn is_eof_impl(parser: &crate::core::parser::driver::parser::Parser) -> bool {
41    parser.token_index >= parser.tokens.len()
42}
43
44pub fn previous_clone_impl(parser: &crate::core::parser::driver::parser::Parser) -> Option<Token> {
45    parser.previous.clone()
46}
47
48pub fn match_token_impl(
49    parser: &mut crate::core::parser::driver::parser::Parser,
50    kind: TokenKind,
51) -> bool {
52    if let Some(tok) = peek_impl(parser) {
53        if tok.kind == kind {
54            advance_impl(parser);
55            return true;
56        }
57    }
58    false
59}
60
61pub fn advance_if_impl(
62    parser: &mut crate::core::parser::driver::parser::Parser,
63    kind: TokenKind,
64) -> bool {
65    match_token_impl(parser, kind)
66}
67
68pub fn peek_is_impl(parser: &crate::core::parser::driver::parser::Parser, expected: &str) -> bool {
69    peek_impl(parser).is_some_and(|t| t.lexeme == expected)
70}
71
72pub fn expect_impl(
73    parser: &mut crate::core::parser::driver::parser::Parser,
74    kind: TokenKind,
75) -> Result<&Token, String> {
76    let tok = advance_impl(parser).ok_or("Unexpected end of input")?;
77    if tok.kind == kind {
78        Ok(tok)
79    } else {
80        Err(format!("Expected {:?}, got {:?}", kind, tok.kind))
81    }
82}