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