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}