loom

Форк
0
/
expression.fuze 
144 строки · 7.2 Кб
1
/*  Описание грамматики выражений
2

3
    SIMODO Base Language.
4

5
    MIT License
6

7
    Copyright (c) 2021 МГТУ им. Н.Э. Баумана, кафедра ИУ-6, Михаил Фетисов,
8

9
    https://bmstu.codes/lsx/simodo/stars
10
*/
11

12
// Описание грамматики выражений
13

14
lex {
15
    lex.addMarkup("/*", "*/", "", lex.LexemeType.Comment);
16
    lex.addMarkup("//", "", "", lex.LexemeType.Comment);
17
    lex.addMarkup("\"", "\"", "\\", lex.LexemeType.Annotation);
18

19
    lex.clearMasks();
20
    lex.addMask("0bN", lex.LexemeType.Number, 2); 
21
    lex.addMask("0oN", lex.LexemeType.Number, 8); 
22
    lex.addMask("0xN", lex.LexemeType.Number, 16); 
23
    lex.addMask("@BUILDING_NUMBER_MASK", lex.LexemeType.Number, 10); 
24
}
25

26
выражение
27
    = оператор_ИЛИ
28
    = выражение тернарная_операция
29
    ;
30
тернарная_операция
31
    = тернарная_операция_знак_1 выражение тернарная_операция_знак_2 выражение >
32
                                    { ast.goParent(); ast.goParent(); }
33
    ;
34
    тернарная_операция_знак_1
35
        = "?"                       {
36
                                        ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.Ternary, 0);
37
                                        ast.addNode_StepInto(ast.sbl.host, ast.sbl1.op.If_True_Body, 0);
38
                                    }
39
        ;
40
    тернарная_операция_знак_2
41
        = ":"                       { ast.goParent(); ast.addNode_StepInto(ast.sbl.host, ast.sbl1.op.If_Else_Body, 0); }
42
        ;
43
оператор_ИЛИ
44
    = оператор_И
45
    = оператор_ИЛИ "||" оператор_И
46
                                    { ast.addNode(ast.sbl.host, ast.sbl.op.Or, 1); }
47
    ;
48
оператор_И
49
    = оператор_сравнения
50
    = оператор_И "&&" оператор_сравнения
51
                                    { ast.addNode(ast.sbl.host, ast.sbl.op.And, 1); }
52
    ;
53
оператор_сравнения
54
    = арифметический_оператор
55
    = оператор_сравнения "==" арифметический_оператор
56
                                    { ast.addNode(ast.sbl.host, ast.sbl.op.Equal, 1); }
57
    = оператор_сравнения "!=" арифметический_оператор
58
                                    { ast.addNode(ast.sbl.host, ast.sbl.op.NotEqual, 1); }
59
    = оператор_сравнения "<" арифметический_оператор
60
                                    { ast.addNode(ast.sbl.host, ast.sbl.op.Less, 1); }
61
    = оператор_сравнения "<=" арифметический_оператор
62
                                    { ast.addNode(ast.sbl.host, ast.sbl.op.LessOrEqual, 1); }
63
    = оператор_сравнения ">" арифметический_оператор
64
                                    { ast.addNode(ast.sbl.host, ast.sbl.op.More, 1); }
65
    = оператор_сравнения ">=" арифметический_оператор
66
                                    { ast.addNode(ast.sbl.host, ast.sbl.op.MoreOrEqual, 1); }
67
    ;
68
арифметический_оператор
69
    = арифметический_оператор_мультипликатор
70
    = арифметический_оператор "+" арифметический_оператор_мультипликатор
71
                                    { ast.addNode(ast.sbl.host, ast.sbl.op.Addition, 1); }
72
    = арифметический_оператор "-" арифметический_оператор_мультипликатор
73
                                    { ast.addNode(ast.sbl.host, ast.sbl.op.Subtraction, 1); }
74
    ;
75
арифметический_оператор_мультипликатор
76
    = возведение_в_степень
77
    = арифметический_оператор_мультипликатор "*" возведение_в_степень
78
                                    { ast.addNode(ast.sbl.host, ast.sbl.op.Multiplication, 1); }
79
    = арифметический_оператор_мультипликатор "/" возведение_в_степень
80
                                    { ast.addNode(ast.sbl.host, ast.sbl.op.Division, 1); }
81
    = арифметический_оператор_мультипликатор "%" возведение_в_степень
82
                                    { ast.addNode(ast.sbl.host, ast.sbl.op.Modulo, 1); }
83
    ;
84
возведение_в_степень
85
    = унарный_оператор
86
    = возведение_в_степень "^" унарный_оператор
87
                                    { ast.addNode(ast.sbl.host, ast.sbl.op.Power, 1); }
88
    ;
89
унарный_оператор
90
    = величина
91
    = "+" величина                  { ast.addNode(ast.sbl.host, ast.sbl.op.Plus, 0); }
92
    = "-" величина                  { ast.addNode(ast.sbl.host, ast.sbl.op.Minus, 0); }
93
    = "!" величина                  { ast.addNode(ast.sbl.host, ast.sbl.op.Not, 0); }
94
    ;
95
величина
96
    = "(" выражение ")"
97
    = базовая_константа >           { ast.goParent(); }
98
    = "true"                        { ast.addNode(ast.sbl.host, ast.sbl.op.PushConstant, 0); }
99
    = "false"                       { ast.addNode(ast.sbl.host, ast.sbl.op.PushConstant, 0); }
100
//    = "undef"                       { ast.addNode(ast.sbl.host, ast.sbl.op.PushConstant, 0); }
101
    = "null"                        { ast.addNode(ast.sbl.host, ast.sbl.op.PushConstant, 0); }
102
    = адрес
103
    ;
104
    
105
базовая_константа
106
    = NUMBER                        { ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.PushConstant, 0); }
107
    = ANNOTATION                    { ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.PushConstant, 0); }
108
    ;
109

110
адрес
111
    = переменная
112
    = переменная операторы_адреса
113
    ;
114
    
115
переменная
116
    = ID                            { ast.addNode(ast.sbl.host, ast.sbl.op.PushVariable, 0); }
117
    ;
118

119
операторы_адреса
120
    = оператор_адреса
121
    = операторы_адреса оператор_адреса
122
    ;
123

124
оператор_адреса
125
    = "." ID                        { ast.addNode(ast.sbl.host, ast.sbl.op.ObjectElement, 1); }
126
    = знак_массива список_выражений "]"
127
                                    { ast.goParent(); }
128
    = знак_функции список_выражений ")"
129
                                    { ast.goParent(); }
130
    = знак_функции ")"
131
                                    { ast.goParent(); }
132
    ;
133
    знак_массива
134
        = "["                       { ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.ArrayElement, 0); }
135
        ;
136
    знак_функции
137
        = "("                       { ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.FunctionCall, 0); }
138
        ;
139
    список_выражений
140
        = элемент_списка_выражений
141
        = список_выражений "," элемент_списка_выражений
142
        ;
143
        элемент_списка_выражений = выражение;
144
    ;
145

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

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

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

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