Skip to content
This repository was archived by the owner on Mar 12, 2025. It is now read-only.

Commit 65ca2e2

Browse files
committed
Add documentation and update README.md
1 parent 1450e41 commit 65ca2e2

File tree

7 files changed

+321
-1
lines changed

7 files changed

+321
-1
lines changed

README.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
![Giraffe](images/Giraffe.png)
44

5-
**Giraffe-Language** — это язык программирования, ориентированный на создание скриптов для автоматизации процессов и разработки удобных интерфейсов для сложных проектов.
5+
**Giraffe-Language** — это интерпритуруемый язык программирования, ориентированный на создание скриптов для автоматизации процессов и разработки удобных интерфейсов для сложных проектов.
66

77

88
## Текущий статус
@@ -13,6 +13,8 @@
1313

1414
- Разработка интерпретатора
1515

16+
- Разработка хранилищя состояния
17+
1618
- Оптимизация производительности и добавление новых функций
1719

1820

documentation/ast.md

+154
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
# Документация для абстрактного синтаксического дерева (AST)
2+
3+
Абстрактное синтаксическое дерево (AST) — это иерархическое представление структуры исходного кода. Оно используется для представления синтаксической структуры кода в более удобном для обработки виде. Эта документация описывает основные компоненты AST, их связи и поля.
4+
5+
## Обзор
6+
7+
AST состоит из трех основных компонентов:
8+
9+
- **AstNode**: Представляет корневой узел AST.
10+
- **Statement**: Представляет различные типы операторов, которые выполняются в программе.
11+
- **Expression**: Представляет выражения, используемые в операторах и вычислениях.
12+
13+
### AstNode
14+
15+
Перечисление `AstNode` является корневым узлом AST и содержит структуру программы с операторами.
16+
17+
#### Варианты:
18+
19+
- `Program { statements: Vec<Statement> }`:
20+
- Представляет всю программу, состоящую из списка операторов.
21+
- `Statement(Statement)`:
22+
- Содержит один оператор, который является частью программы.
23+
- `Expression(Expression)`:
24+
- Содержит выражение, которое может быть частью оператора или отдельным элементом.
25+
26+
#### Методы:
27+
- `build_program(statements: Vec<Statement>) -> AstNode`:
28+
- Создает узел `Program` с набором операторов.
29+
30+
### Statement
31+
32+
Перечисление `Statement` представляет различные типы операторов в программе. Операторы выполняются и обычно выполняют действие в программе.
33+
34+
#### Варианты:
35+
36+
- `FunctionDeclaration(FunctionDeclaration)`:
37+
- Представляет объявление функции в программе.
38+
- `VariableDeclaration(VariableDeclaration)`:
39+
- Представляет объявление переменной.
40+
- `IfStatement(IfStatement)`:
41+
- Представляет оператор if с условием, телом и опциональными ветвями elif и else.
42+
- `WhileStatement(WhileStatement)`:
43+
- Представляет оператор while с условием и телом.
44+
- `PrintStatement(PrintStatement)`:
45+
- Представляет оператор вывода (print).
46+
- `ReturnStatement(ReturnStatement)`:
47+
- Представляет оператор возврата.
48+
- `Assignment(Assignment)`:
49+
- Представляет оператор присваивания, который присваивает значение переменной.
50+
- `ExpressionStatement(Expression)`:
51+
- Представляет оператор, который является выражением (без побочных эффектов).
52+
- `Block(Vec<Statement>)`:
53+
- Представляет блок операторов.
54+
- `ForInStatement(String, Expression, Vec<Statement>)`:
55+
- Представляет цикл `for`, который перебирает коллекцию.
56+
57+
#### Методы:
58+
- Доступны различные методы для создания конкретных типов операторов, таких как `function_declaration()`, `variable_declaration()`, `if_statement()` и др.
59+
60+
### Expression
61+
62+
Перечисление `Expression` представляет выражения, которые вычисляются для получения значения. Оно используется как часть операторов или в расчетах.
63+
64+
#### Варианты:
65+
66+
- `Literal(Literal)`:
67+
- Представляет литеральное значение, такое как числа, строки, булевы значения и т. д.
68+
- `Variable(String)`:
69+
- Представляет переменную (то есть ссылку на переменную по имени).
70+
- `BinaryOperation(Box<Expression>, Operator, Box<Expression>)`:
71+
- Представляет бинарную операцию с левым операндом, оператором и правым операндом.
72+
- `FunctionCall(String, Vec<Expression>)`:
73+
- Представляет вызов функции с именем функции и списком аргументов.
74+
- `List(Vec<Expression>)`:
75+
- Представляет список выражений.
76+
- `Dictionary(Vec<(Expression, Expression)>)`:
77+
- Представляет словарь с парами ключ-значение, где как ключи, так и значения являются выражениями.
78+
- `Tuple(Vec<Expression>)`:
79+
- Представляет кортеж из выражений.
80+
- `Null`:
81+
- Представляет значение null.
82+
83+
#### Методы:
84+
- Доступны различные методы для создания выражений, такие как `literal()`, `variable()`, `binary_operation()`, `function_call()` и др.
85+
86+
### Literal
87+
88+
Перечисление `Literal` представляет литеральные значения, которые могут быть использованы напрямую в исходном коде.
89+
90+
#### Варианты:
91+
92+
- `Integer(i64)`:
93+
- Представляет литеральное целое число.
94+
- `Float(f64)`:
95+
- Представляет литеральное число с плавающей запятой.
96+
- `Boolean(bool)`:
97+
- Представляет литеральное булево значение (`true` или `false`).
98+
- `String(String)`:
99+
- Представляет литеральную строку.
100+
- `Null`:
101+
- Представляет значение null.
102+
103+
### Operator
104+
105+
Перечисление `Operator` представляет различные операторы, которые могут быть использованы в выражениях, такие как арифметические и операторы сравнения.
106+
107+
#### Варианты:
108+
109+
- `Add`: Сложение (`+`)
110+
- `Subtract`: Вычитание (`-`)
111+
- `Multiply`: Умножение (`*`)
112+
- `Divide`: Деление (`/`)
113+
- `GreaterThan`: Больше чем (`>`)
114+
- `LessThan`: Меньше чем (`<`)
115+
- `Equal`: Равно (`==`)
116+
- `NotEqual`: Не равно (`!=`)
117+
- `And`: Логическое И (`&&`)
118+
- `Or`: Логическое ИЛИ (`||`)
119+
120+
#### Методы:
121+
- Доступны различные методы для создания операторов, такие как `add()`, `subtract()`, `multiply()` и др.
122+
123+
### TokenType
124+
125+
Перечисление `TokenType` представляет типы токенов, которые распознаются лексером. Это перечисление используется в процессе лексического анализа для классификации элементов кода.
126+
127+
#### Варианты:
128+
129+
- `COMMENT_MULTILINE`, `COMMENT_SINGLELINE`: Представляют комментарии.
130+
- `KEYWORD`: Представляет ключевое слово.
131+
- `IDENTIFIER`: Представляет идентификатор.
132+
- `INTEGER`, `FLOAT`, `STRING`, `BOOLEAN`: Представляют примитивные типы.
133+
- `LIST`, `DICT`, `SET`, `TUPLE`: Представляют сложные типы данных.
134+
- `NULL`, `OPTION`: Представляют специальные типы.
135+
- `ERROR`: Представляет нераспознанный токен.
136+
- `FUNCTION`: Представляет функцию.
137+
- `OPERATOR`, `SYMBOL`, `BRACKET`, `PUNCTUATION`: Представляют операторы, символы и знаки препинания.
138+
- `PRINT`: Представляет оператор вывода (print).
139+
- `EOF`: Представляет конец файла.
140+
141+
### Token
142+
143+
Структура `Token` представляет токен в исходном коде. Каждый токен имеет тип (из `TokenType`) и значение (строку, которое этот токен представляет).
144+
145+
#### Поля:
146+
- `token_type`: Тип токена (из `TokenType`).
147+
- `value`: Строковое значение токена.
148+
149+
#### Методы:
150+
- `new(token_type: TokenType, value: &str) -> Self`: Создает новый токен с заданным типом и значением.
151+
152+
## Заключение
153+
154+
В этой документации описана структура абстрактного синтаксического дерева (AST), которое используется для представления исходного кода в виде иерархической модели. Мы рассмотрели основные компоненты AST, такие как узлы программы, операторы и выражения, а также различные типы данных, которые могут быть использованы в процессе анализа и выполнения программы.

documentation/interpreter.md

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Документация для интерпретатора
2+
3+
### ***В разработке...***

documentation/lexer.md

+90
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
# Документация для лексера (токенайзера)
2+
3+
## Обзор
4+
5+
Лексер — это компонент интерпретатора, который выполняет разбиение исходного кода на последовательность токенов. Токены — это атомарные элементы программы, такие как ключевые слова, операторы, идентификаторы и литералы. Лексер находит эти токены с использованием регулярных выражений и классифицирует их по типу.
6+
7+
Он использует регулярные выражения для анализа строк и выявления различных токенов.
8+
9+
## Структуры данных
10+
11+
### `TokenType`
12+
13+
Перечисление, которое описывает типы токенов, которые могут быть распознаны лексером. Включает в себя:
14+
15+
- **COMMENT_MULTILINE**: Многострочные комментарии.
16+
- **COMMENT_SINGLELINE**: Однострочные комментарии.
17+
- **KEYWORD**: Ключевые слова языка.
18+
- **IDENTIFIER**: Идентификаторы (имена переменных, функций и т.д.).
19+
- **INTEGER**: Целые числа.
20+
- **FLOAT**: Числа с плавающей точкой.
21+
- **STRING**: Строки (с двойными кавычками).
22+
- **BOOLEAN**: Логические значения (true, false).
23+
- **ANNOTATION_TYPE**: Аннотации типов (например, int, str, bool).
24+
- **LIST, DICT, SET, TUPLE**: Сложные типы данных (списки, множества, кортежи).
25+
- **NULL**: Тип данных Null.
26+
- **OPTION**: Тип данных Option.
27+
- **ERROR**: Ошибки в исходном коде.
28+
- **FUNCTION**: Функции.
29+
- **OPERATOR**: Операторы (например, +, -, =).
30+
- **SYMBOL**: Символы (например, $, #).
31+
- **BRACKET**: Скобки (круглые, фигурные, квадратные).
32+
- **PUNCTUATION**: Пунктуация (например, ;, :, .).
33+
- **PRINT**: Специальный токен для команды "print!".
34+
- **EOF**: Конец файла.
35+
36+
### `Token`
37+
38+
Структура, которая представляет собой токен. Каждый токен состоит из:
39+
40+
- **token_type**: Тип токена (например, `KEYWORD`, `IDENTIFIER` и т.д.).
41+
- **value**: Строковое значение токена, которое может быть ключевым словом, идентификатором, числом и т.д.
42+
43+
Метод `new` создает новый токен с указанным типом и значением.
44+
45+
### `Lexer`
46+
47+
Лексер, который выполняет разбиение исходного кода на токены с использованием регулярных выражений. В нем содержатся:
48+
49+
- **keywords**: Хеш-таблица ключевых слов, где ключ — строка, а значение — тип токена (`KEYWORD`).
50+
- **regex_patterns**: Список пар, каждая из которых состоит из регулярного выражения и соответствующего типа токена (или `None`, если токен не создается).
51+
52+
Метод `new` инициализирует лексер, добавляет ключевые слова и регулярные выражения для распознавания различных токенов.
53+
54+
Метод `tokenize` выполняет разбор строки исходного кода на токены, проверяя каждый символ с помощью регулярных выражений. Он возвращает результат в виде вектора токенов.
55+
56+
## Регулярные выражения
57+
58+
Лексер использует регулярные выражения для распознавания токенов в исходном коде. Некоторые из них:
59+
60+
- **Комментарии**:
61+
- Однострочные комментарии: `//[^\n]*`
62+
- Многострочные комментарии: `/\*[\s\S]*?\*/`
63+
- **Типы данных**:
64+
- Примитивные типы: `\b(int|str|bool)\b`
65+
- Сложные типы: `\b(list|dict|set|tuple)\b`
66+
- **Ключевые слова**:
67+
- Множество ключевых слов (например, `const`, `func`, `if`, `while`): `\b(?:const|func|var|if|elif|else|while|for|loop|continue|exit|break|return|is|in|and|or|not|try|handle)\b`
68+
- **Числа**:
69+
- Целые числа: `\b\d+\b`
70+
- Числа с плавающей точкой: `\b\d+\.\d+\b`
71+
- **Строки**: `#""([^"\\]|\\.)*""#`
72+
- **Операторы**: `[+\-*/%=<>!&|^]=?|==|!=|&&|\|\|`
73+
- **Скобки**: `[\(\)\{\}\[\]]`
74+
- **Пунктуация**: `[;,:.]`
75+
76+
Каждое регулярное выражение привязывается к соответствующему типу токена или игнорируется (например, пробелы).
77+
78+
## Алгоритм работы
79+
80+
1. Лексер получает строку исходного кода.
81+
2. Проходит по строке символ за символом, пытаясь найти подходящие регулярные выражения.
82+
3. Когда выражение находит совпадение, создается токен, который добавляется в список.
83+
4. Если регулярное выражение не находит совпадений, лексер генерирует ошибку.
84+
5. Лексер продолжает до тех пор, пока не обработает всю строку.
85+
6. После завершения обработки добавляется специальный токен `EOF` для обозначения конца файла.
86+
87+
88+
## Заключение
89+
90+
Лексер является важным элементом системы анализа исходного кода. Он преобразует строку текста в структуру токенов, которую затем может обработать синтаксический анализатор. Этот лексер поддерживает множество типов токенов, включая комментарии, ключевые слова, типы данных, операторы и другие элементы синтаксиса языка.

documentation/parser.md

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Документация для парсера
2+
3+
### ***В разработке...***

documentation/state_storage.md

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Документация для хранилищя состояния
2+
3+
### ***В разработке...***

0 commit comments

Comments
 (0)