devalang_core/core/parser/driver/
cursor.rs1use 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}