feat: базовая структура проекта; docs: грамматика формы бэкуса-наура
This commit is contained in:
176
src/comment.rs
Normal file
176
src/comment.rs
Normal file
@@ -0,0 +1,176 @@
|
||||
//! Модуль обработки вложенных комментариев.
|
||||
//!
|
||||
//! Обеспечивает распознавание и обработку комментариев с парными ограничителями
|
||||
//! `<[` и `]>` с поддержкой рекурсивной вложенности без жесткого ограничения
|
||||
//! уровня вложенности.
|
||||
|
||||
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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user