Files
tverd-plus-tokenizer/src/comment.rs

177 lines
6.3 KiB
Rust
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//! Модуль обработки вложенных комментариев.
//!
//! Обеспечивает распознавание и обработку комментариев с парными ограничителями
//! `<[` и `]>` с поддержкой рекурсивной вложенности без жесткого ограничения
//! уровня вложенности.
use crate::grammar::{COMMENT_END, COMMENT_START};
/// Состояние обработки комментариев.
///
/// Используется для отслеживания уровня вложенности комментариев
/// при лексическом анализе.
#[derive(Debug, Clone, Default)]
pub struct CommentState {
/// Текущий уровень вложенности комментариев (0 = вне комментария)
nesting_level: u32,
}
impl CommentState {
/// Создает новое состояние комментариев (вне комментария).
///
/// # Пример
/// ```
/// use tverd_plus_tokenizer::comment::CommentState;
/// let state = CommentState::new();
/// assert!(!state.is_in_comment());
/// ```
pub fn new() -> Self {
// TODO: Реализовать создание состояния
Self { nesting_level: 0 }
}
/// Проверяет, находится ли анализатор внутри комментария.
///
/// # Возвращает
/// `true`, если текущий уровень вложенности > 0
///
/// # Пример
/// ```
/// use tverd_plus_tokenizer::comment::CommentState;
/// let state = CommentState::new();
/// assert!(!state.is_in_comment());
/// ```
pub fn is_in_comment(&self) -> bool {
// TODO: Реализовать проверку нахождения в комментарии
self.nesting_level > 0
}
/// Обрабатывает начало комментария (`<[`).
///
/// Увеличивает уровень вложенности.
///
/// # Пример
/// ```
/// use tverd_plus_tokenizer::comment::CommentState;
/// let mut state = CommentState::new();
/// state.enter_comment();
/// assert!(state.is_in_comment());
/// ```
pub fn enter_comment(&mut self) {
// TODO: Реализовать вход в комментарий
self.nesting_level += 1;
}
/// Обрабатывает конец комментария (`]>`).
///
/// Уменьшает уровень вложенности.
///
/// # Возвращает
/// `Ok(())` если комментарий закрыт успешно,
/// `Err(())` если попытка закрыть комментарий вне комментария
///
/// # Пример
/// ```
/// use tverd_plus_tokenizer::comment::CommentState;
/// let mut state = CommentState::new();
/// state.enter_comment();
/// assert!(state.exit_comment().is_ok());
/// assert!(!state.is_in_comment());
/// ```
pub fn exit_comment(&mut self) -> Result<(), ()> {
// TODO: Реализовать выход из комментария
if self.nesting_level > 0 {
self.nesting_level -= 1;
Ok(())
} else {
Err(())
}
}
/// Получает текущий уровень вложенности комментариев.
///
/// # Возвращает
/// Текущий уровень вложенности (0 = вне комментария)
///
/// # Пример
/// ```
/// use tverd_plus_tokenizer::comment::CommentState;
/// let mut state = CommentState::new();
/// state.enter_comment();
/// assert_eq!(state.nesting_level(), 1);
/// ```
pub fn nesting_level(&self) -> u32 {
// TODO: Реализовать получение уровня вложенности
self.nesting_level
}
/// Сбрасывает состояние комментариев (выходит из всех вложенных комментариев).
///
/// # Пример
/// ```
/// use tverd_plus_tokenizer::comment::CommentState;
/// let mut state = CommentState::new();
/// state.enter_comment();
/// state.enter_comment();
/// state.reset();
/// assert!(!state.is_in_comment());
/// ```
pub fn reset(&mut self) {
// TODO: Реализовать сброс состояния
self.nesting_level = 0;
}
}
/// Проверяет, является ли строка началом комментария (`<[`).
///
/// # Параметры
/// - `text`: проверяемая строка
///
/// # Возвращает
/// `true`, если строка начинается с `<[`
///
/// # Пример
/// ```
/// use tverd_plus_tokenizer::comment::is_comment_start;
/// assert!(is_comment_start("<[ комментарий ]>"));
/// assert!(!is_comment_start("не комментарий"));
/// ```
pub fn is_comment_start(text: &str) -> bool {
// TODO: Реализовать проверку начала комментария
text.starts_with(COMMENT_START)
}
/// Проверяет, является ли строка концом комментария (`]>`).
///
/// # Параметры
/// - `text`: проверяемая строка
///
/// # Возвращает
/// `true`, если строка начинается с `]>`
///
/// # Пример
/// ```
/// use tverd_plus_tokenizer::comment::is_comment_end;
/// assert!(is_comment_end("]> конец"));
/// assert!(!is_comment_end("не конец"));
/// ```
pub fn is_comment_end(text: &str) -> bool {
// TODO: Реализовать проверку конца комментария
text.starts_with(COMMENT_END)
}
#[cfg(test)]
mod tests {
use super::*;
// TODO: Написать тесты для обработки комментариев
// - Тест создания CommentState
// - Тест is_in_comment
// - Тест enter_comment
// - Тест exit_comment (успешный и неуспешный)
// - Тест вложенных комментариев
// - Тест is_comment_start
// - Тест is_comment_end
}