onescript_preprocessor/
token.rs

1use std::collections::HashMap;
2
3/// Перечисление возможных типов токена
4#[derive(Debug, PartialEq, Clone, Copy)]
5pub enum TokenKind {
6    /// Тип для токена символа "#"
7    Hash,
8    /// Тип для токена символа "#!"
9    Shebang,
10    /// Тип для токена представляющего имена областей кода и названия импортируемых библиотек
11    Identifier,
12    /// Тип для токена представляющего собой простой исходный текст
13    Text,
14    /// Тип для токенов ключевых слов инструкций препроцессора
15    Keyword(Keyword),
16    /// Тип для токена который является представлением пути библиотеки в директиве "#Использовать"
17    Path,
18    /// Тип для токена представляющего текст shebang директивы
19    ShebangText,
20}
21
22/// Перечисление для ключевых слов директив препроцессора
23#[derive(Debug, PartialEq, Clone, Copy)]
24pub enum Keyword {
25    /// Ключевое слово "Использовать"
26    Use,
27    /// Ключеовое слово "Область"
28    Region,
29    /// Ключеовое слово "КонецОбласти"
30    EndRegion,
31}
32
33/// Представление токена разбора исходного текста
34#[derive(Debug)]
35pub struct Token {
36    /// Тип токена
37    pub token_kind: TokenKind,
38    /// лексема (текст) токена
39    pub lexeme: String,
40    /// начальный номер строки токена (начинается с 1)
41    pub start_line: u16,
42    /// Конечный номер строки токена
43    pub end_line: u16,
44}
45
46/// Представление для соответствия строки ключевого слово к соответствующему типу токена
47pub struct KeywordTable {
48    /// Таблица соответствия строки ключевого слово к соответствующему типу токена
49    pub table: HashMap<String, TokenKind>,
50}
51
52impl KeywordTable {
53    /// Возвращает таблицу соответствия строки ключевого слово к соответствующему типу токена.
54    /// Ключом является строка ключевого слова в верхнем регистре, на русском или английском языке.
55    /// Значением является соответствующий [тип](TokenKind) токена
56    pub fn new() -> Self {
57        let mut table = HashMap::new();
58        table.insert("REGION".to_string(), TokenKind::Keyword(Keyword::Region));
59        table.insert("ENDREGION".to_string(), TokenKind::Keyword(Keyword::EndRegion));
60        table.insert("USE".to_string(), TokenKind::Keyword(Keyword::Use));
61        table.insert("ОБЛАСТЬ".to_string(), TokenKind::Keyword(Keyword::Region));
62        table.insert("КОНЕЦОБЛАСТИ".to_string(), TokenKind::Keyword(Keyword::EndRegion));
63        table.insert("ИСПОЛЬЗОВАТЬ".to_string(), TokenKind::Keyword(Keyword::Use));
64
65        return KeywordTable { table };
66    }
67}
68
69impl Token {
70    /// Конструктор токена
71    /// 
72    /// # Аргументы 
73    /// 
74    /// * `token_kind`: тип токена
75    /// * `lexeme`: текст токена
76    /// * `start_line`: начальная строка токена
77    /// * `end_line`: конечная строка токена
78    /// 
79    /// возвращает: Token 
80    ///
81    /// 
82    /// ```
83    pub fn new(token_kind: TokenKind, lexeme: String, start_line: u16, end_line: u16) -> Token {
84        Token { token_kind, lexeme, start_line, end_line }
85    }
86}