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}