onescript_preprocessor/
preprocessor.rs

1use crate::lexer::Lexer;
2use crate::token::TokenKind;
3
4/// Представление препроцессора
5pub struct Preprocessor {}
6
7impl Preprocessor {
8    /// Возвращает новый экземпляр препроцессора
9    pub fn new() -> Self {
10        return Preprocessor {};
11    }
12
13    /// Обрабатывает переданный исходный текст, разбирая его на токены. Токены инструкций препроцессора
14    /// заменяются на пробелы. Остальной текст добавляется без изменений
15    ///
16    /// # Arguments
17    ///
18    /// * `source`: исходный текст для разбора
19    ///
20    /// returns: String исходный текст с удаленными директивами препроцессора
21    ///
22    /// # Examples
23    ///
24    /// ```
25    ///     use onescript_preprocessor::preprocessor::Preprocessor;
26    ///     let example = "#region Test\nProcedure Test()\nEndProcedure\n#EndRegion";
27    ///     let expected = " \nProcedure Test()\nEndProcedure\n ";
28    ///
29    ///     let preprocessor = Preprocessor::new();
30    ///     let result = preprocessor.preprocess(example);
31    ///     assert_eq!(expected, result);
32    /// ```
33    pub fn preprocess(&self, source: &str) -> String {
34        let mut lexer = Lexer::new();
35        let tokens = lexer.lex(source);
36        let mut result: String = String::new();
37
38        for token in &tokens {
39            match token.token_kind {
40                TokenKind::Hash => { result.push(' ') }
41                TokenKind::Shebang => { result.push(' ') }
42                TokenKind::Text => { result.push_str(&token.lexeme) }
43                TokenKind::Keyword(_) => {}
44                TokenKind::Path => {}
45                TokenKind::ShebangText => {}
46                TokenKind::Identifier => {}
47            }
48        };
49
50        result
51    }
52}