loom

Форк
0
/
declarations-definitions.fuze 
90 строк · 4.8 Кб
1
main объявления_и_определения;
2

3
include "json5-object"; 
4

5
объявления_и_определения
6
//    = упрощённый_оператор_импорта
7
    = начало_перечня_контрактов определение_контракта
8
    = начало_перечня_контрактов определение_типа
9
    = начало_перечня_контрактов определение_типа инициализация_переменной
10
    = начало_перечня_контрактов определение_типа ":" список_определений_переменных
11
    = начало_перечня_контрактов ":" список_определений_переменных
12
    = начало_перечня_контрактов перечень_контрактов определение_контракта
13
    = начало_перечня_контрактов перечень_контрактов определение_типа
14
    = начало_перечня_контрактов перечень_контрактов определение_типа инициализация_переменной
15
    = начало_перечня_контрактов перечень_контрактов определение_типа ":" список_определений_переменных
16
    = начало_перечня_контрактов перечень_контрактов ":" список_определений_переменных
17
    ;
18

19
/// \note Упрощённый оператор создаёт неопределённость для следующего оператора при разборе
20
//упрощённый_оператор_импорта
21
//    = "import" ID               { 
22
//                                    ast.addNode(ast.sbl.host, ast.sbl.op.Import, 1);
23
//                                    ast.addNode(ast.sbl.host, ast.sbl.op.Announcement, 1);
24
//                                    ast.addNode(ast.sbl.host, ast.sbl.op.Declaration, 1);
25
//                                }
26
//    ;
27

28
начало_перечня_контрактов 
29
    = ключевое_слово_начала_перечня_контрактов контракт
30
    = импорт                    { ast.addNode(ast.sbl.host, ast.sbl.op.Announcement, 0); }
31
    = "#" структура_объекта     { ast.addNode(ast.sbl.host, ast.sbl.op.Announcement, 0); }
32
    ;
33
    
34
ключевое_слово_начала_перечня_контрактов
35
    = "def" 
36
    = "define" 
37
    ;
38
    
39
перечень_контрактов
40
    = контракт 
41
    = перечень_контрактов контракт
42
    ;
43

44
контракт
45
    = адрес                     { ast.addNode(ast.sbl.host, ast.sbl.op.Announcement, 0); }
46
    = импорт                    { ast.addNode(ast.sbl.host, ast.sbl.op.Announcement, 0); }
47
    = "#" структура_объекта     { ast.addNode(ast.sbl.host, ast.sbl.op.Announcement, 0); }
48
    ;
49

50
импорт
51
    = "import" ANNOTATION       { ast.addNode(ast.sbl.host, ast.sbl.op.Import, 1); }
52
    = "import" ID               { ast.addNode(ast.sbl.host, ast.sbl.op.Import, 1); }
53
    ;
54
    
55
определение_типа
56
    = "type" ID                 { ast.addNode(ast.sbl.host, ast.sbl.op.Type, 1); }
57
    ;
58
    
59
определение_контракта
60
    = "contract" ID             { ast.addNode(ast.sbl.host, ast.sbl.op.Contract, 1); }
61
    ;
62
    
63
список_определений_переменных
64
    = объявление_или_определение_переменной
65
    = список_определений_переменных "," объявление_или_определение_переменной
66
    ;
67

68
объявление_или_определение_переменной
69
    = объявление_переменной
70
    = объявление_переменной инициализация_переменной
71
    ;
72

73
объявление_переменной
74
    = ID                        { ast.addNode(ast.sbl.host, ast.sbl.op.Declaration, 0); }
75
/// \note Не уверен, что все впомогательные операторы нужно отражать в синтаксисе - это его перегружает
76
//    = "/" ID                    { ast.addNode(ast.sbl.host, ast.sbl.op.DeclarationOnce, 1); }
77
    ;
78
    
79
инициализация_переменной
80
    = знак_инициализации правая_часть_присваивания
81
                                { ast.goParent(); ast.addNode(ast.sbl.host, ast.sbl.op.PostInitialize, 0); }
82
    ;
83

84
знак_инициализации
85
    = "="                       { ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.Initialize, 0); }
86
    ;
87

88
правая_часть_присваивания
89
    = выражение
90
    ;
91

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.