use crate::{ParseError, Span, Token, TokenKind};
use super::types::Command;
use super::commandparser_type::CommandParser;
impl CommandParser {
pub(super) fn current(&self) -> Option<&Token> {
self.tokens.get(self.pos)
}
pub(super) fn check(&self, kind: &TokenKind) -> bool {
self.current().is_some_and(|t| &t.kind == kind)
}
pub(super) fn check_ident(&self, name: &str) -> bool {
self.current()
.is_some_and(|t| matches!(& t.kind, TokenKind::Ident(s) if s == name))
}
pub(super) fn current_span(&self) -> Span {
self.current()
.map(|t| t.span.clone())
.unwrap_or_else(|| self.eof_span())
}
pub(super) fn parse_syntax(&mut self) -> Result<Command, ParseError> {
let start_span = self.current_span();
self.advance();
let name = self.parse_ident()?;
let prec = if let Some(token) = self.current() {
if let TokenKind::Nat(n) = &token.kind {
let p = *n as u32;
self.advance();
Some(p)
} else {
None
}
} else {
None
};
self.expect(&TokenKind::Assign)?;
let pattern = self.collect_rest_as_string();
let span = start_span.merge(&self.current_span());
Ok(Command::Syntax {
name,
prec,
pattern,
span,
})
}
pub(super) fn check_keyword(&self, keyword: &str) -> bool {
self.current()
.is_some_and(|t| matches!(& t.kind, TokenKind::Ident(s) if s == keyword))
}
pub(super) fn at_end(&self) -> bool {
self.current().is_none() || self.check(&TokenKind::Eof)
}
}