Skip to content

Commit

Permalink
Актуализация Readme и перенос файла грамматики в более подходящее место
Browse files Browse the repository at this point in the history
  • Loading branch information
Stepami committed Aug 7, 2024
1 parent 9f379c8 commit 2b44c94
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 52 deletions.
118 changes: 66 additions & 52 deletions Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,16 @@ _Minimum allowed line rate is `80%`_

За основу был взят стандарт [ECMA-262](https://www.ecma-international.org/publications-and-standards/standards/ecma-262/)

[Лексическая структура](HydraScript/TokenTypes.cs)
[Лексическая структура](src/Domain/HydraScript.Domain.FrontEnd/Lexer/TokenTypesJson.cs)

[Грамматика](HydraScript/grammar.txt)
[Грамматика](src/Domain/HydraScript.Domain.FrontEnd/Parser/grammar.txt)

[Рабочие примеры](samples)

### Цель проекта
Реализовать JavaScript с объектами и статической структурной типизацией, избавившись от таких понятий, как `constructor`, `class`, `interface`
### Цели проекта
1. Реализовать JavaScript с объектами и статической структурной типизацией, избавившись от таких понятий, как `constructor`, `class`, `interface`
2. Публично реверс-инжинирить современный статический анализ (вывод типов, форвард рефы, ошибки выполнения на стадии компиляции)
3. Упростить понимание области конструирования компиляторов за счёт исходного кода проекта - собрать понятные реализации алгоритмов и типовых задач в репозитории (Lexer, Parser, CFG, SSA, DCE, etc.)

### Конструкции языка

Expand All @@ -43,17 +45,16 @@ _Minimum allowed line rate is `80%`_
- NullableType (тип, который допускает значение ```null```)
- ObjectType (тип объекта, является NullableType)
- ArrayType (списковый тип)
- FunctionType (тип функции)

##### Значения по умолчанию

| Тип | Значение |
| ----------- | ----------- |
| number | 0 |
| boolean | false |
|string| ""|
|NullableType|null|
|ArrayType|[]|
| Тип | Значение |
|--------------|----------|
| number | 0 |
| boolean | false |
| string | "" |
| NullableType | null |
| ArrayType | [] |
##### type alias
Можно создать свой type alias по типу того, как это сделано в С++

Expand All @@ -65,10 +66,9 @@ type point = {
x: int;
y: int;
}
type handleInts = (ints) => void
type handler = {
items: ints;
handle: handleInts;
type composite = {
p: point;
arr: ints;
}
```
#### Объявление переменных
Expand All @@ -77,18 +77,13 @@ let i = 1 // интерпретатор выведет тип из выраже
let j: number // запишет значение по умолчанию в переменную
let k: number = 1 // полностью явное объявление
```
#### Функции

#### Объекты
```
let v2d = {
// обычное поле
x: 3;
y: 4;
//метод
lengthSquared => () {
// в методе доступны поля объекта
// и указатель this
return x * x + y * y
};
}
```
#### Списки
Expand All @@ -99,18 +94,18 @@ array::1 // удаление элемента по индексу
array = array ++ [5, 7] // конкатенация списков
```
#### Операторы
|Оператор|Вид|Типы операндов|Тип операции|
|---|---|---|---|
|+|бинарный|оба number, оба string|number, string
|*, -, /, %| бинарный|number|number
|||, && |бинарный|boolean|boolean
|!=, ==|бинарный|равный с двух сторон|boolean
|<=, >=, >, <|бинарный|number|boolean
|!|унарный|boolean|boolean
|-|унарный|number|number
|++|бинарный|[]|[]
|::|бинарный|[] и number|void
|~|унарный|[]|number
| Оператор | Вид | Типы операндов | Тип операции |
|------------------|----------|------------------------|----------------|
| + | бинарный | оба number, оба string | number, string |
| *, -, /, % | бинарный | number | number |
| &#124;&#124;, && | бинарный | boolean | boolean |
| !=, == | бинарный | равный с двух сторон | boolean |
| <=, >=, >, < | бинарный | number | boolean |
| ! | унарный | boolean | boolean |
| - | унарный | number | number |
| ++ | бинарный | [] | [] |
| :: | бинарный | [] и number | void |
| ~ | унарный | [] | number |

#### Ветвление
```
Expand Down Expand Up @@ -148,6 +143,29 @@ function add(a: number, b: number): number {
// вызов
let c = add(1, 2)
```
#### Методы
```
// сделаны подобно Go - привязка по имени типа
// шаг 1. Объявить type alias
type Point2 = {
x: number;
y: number;
}
// шаг 2. Объявить переменную этого типа
let v2d: Point2 = {
x: 3;
y: 4;
}
// шаг 3. Указать первым параметром функции - объект типа
function lengthSquared(obj: Point2) {
let x = obj.x
let y = obj.y
return x * x + y * y
}
```
#### Операции доступа
```
// объекты
Expand Down Expand Up @@ -177,26 +195,22 @@ let s = v2d as string

### Запуск

Простой:
```
HydraScript file.js
```
HydraScript 1.2.6
Copyright (C) 2024 HydraScript
USAGE:
Simple interpretation call:
HydraScript file.js
Request dump:
HydraScript --dump file.js
-d, --dump (Default: false) Show dump data of interpreter
--help Display this help screen.
--version Display version information.

InputFilePath (pos. 0) Required. Path to input file
С выводом дебаг инфы (токены, ast, инструкции):
```
HydraScript file.js --dump
```

### Источники:

1. [ECMA-262](https://www.ecma-international.org/publications-and-standards/standards/ecma-262/)
2. [DragonBook](https://suif.stanford.edu/dragonbook/)
3. [Stanford CS143 Lectures](https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/)
1. Курсы "Конструирование Компиляторов" и "Генерация Оптимального Кода" кафедры ИУ-9 МГТУ им. Н.Э. Баумана
2. [ECMA-262](https://www.ecma-international.org/publications-and-standards/standards/ecma-262/)
3. [DragonBook](https://suif.stanford.edu/dragonbook/)
4. [Stanford CS143 Lectures](https://web.stanford.edu/class/archive/cs/cs143/cs143.1128/)
5. [Simple Virtual Machine](https://github.com/parrt/simple-virtual-machine)
6. Ахо А., Ульман Дж. Теория синтаксического анализа, перевода и компиляции
7. Свердлов С.З. Языки программирования и методы трансляции
File renamed without changes.

0 comments on commit 2b44c94

Please sign in to comment.