feat: базовая структура проекта; docs: грамматика формы бэкуса-наура

This commit is contained in:
ShishkaDanil
2026-01-03 19:31:30 +03:00
parent ab2acdc698
commit 06164cff09
20 changed files with 2291 additions and 11 deletions

176
src/comment.rs Normal file
View 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
}