//! Модуль обработки вложенных комментариев. //! //! Обеспечивает распознавание и обработку комментариев с парными ограничителями //! `<[` и `]>` с поддержкой рекурсивной вложенности без жесткого ограничения //! уровня вложенности. 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 }