loom

Форк
0
/
s-ode.fuze 
246 строк · 8.6 Кб
1
/*  Описание грамматики ПОЯ системы дифференциальных уравнений
2
*/
3
lex {
4
    lex.addMarkup("/*", "*/", "", lex.LexemeType.Comment);
5
    lex.addMarkup("//", "", "", lex.LexemeType.Comment);
6
    lex.setNationalLettersMix(false);
7
    lex.setNewLineSubstitution(";");
8
}
9

10
onStart {
11
    // Номер потока 0 используется для отката к последнему номеру, т.к.
12
    // в языке fuze не предусмотрены отрицательные константы :)
13
    ast.setStream(1);
14
    ast.setStream(2);
15
    ast.addNode("", 20, "");
16
    ast.addNode("", 2, "empty");
17
    ast.addNode("", 15, "");
18
//    ast.addNode_once("", 16, "__ignore_double_declaration");
19
    ast.setStream(0);
20

21
    ast.setStream(3);
22
    ast.addNode("", 20, "");
23
    ast.setStream(0);
24

25
    ast.setStream(4);
26
    ast.addNode("", 2, "auto");
27
    ast.addNode("", 15, "");
28
    ast.addNode("", 2, "tethered");
29
    ast.addNode("", 15, "");
30
    ast.addNode("", 16, "__equetions__");
31
    ast.addNode_StepInto("", 17, "=");
32
        ast.addNode_StepInto("", 31, "");
33
            ast.addNode_StepInto("", 3107, "");
34
                ast.addNode("", 2, "math");
35
                ast.addNode_StepInto("", 92, "");
36
                    ast.addNode_StepInto("", 7, "");
37
                        ast.setStream(0);
38
                
39
    ast.setStream(5);
40
    ast.addNode("", 19, "");
41
    ast.addNode("", 20, "");
42
    ast.addNode("", 2, "auto");
43
    ast.addNode("", 15, "");
44
    ast.addNode("", 16, "__rights__");
45
    ast.addNode_StepInto("", 17, "=");
46
        ast.addNode_StepInto("", 31, "");
47
            ast.addNode_StepInto("", 3103, "");
48
                ast.addNode("", 2, "self");
49
                ast.addNode("", 15, "");
50
                ast.addNode("", 16, "__state");
51
                ast.addNode("", 20, "");
52
                ast.addNode("", 2, "float");
53
                ast.addNode("", 15, "");
54
                ast.addNode("", 16, "t");
55
                ast.addNode("", 20, "");
56
                ast.goParent();
57
            ast.addNode_StepInto("", 3107, "");
58
                ast.addNode("", 2, "object");
59
                ast.addNode("", 15, "");
60
                ast.addNode("", 16, "__d");
61
                ast.addNode("", 20, "");
62
                ast.addNode("", 2, "__state");
63
                ast.addNode_StepInto("", 92, "");
64
                    ast.addNode_StepInto("", 7, "");
65
                        ast.addNode("", 2, "math");
66
                        ast.addNode_StepInto("", 92, "");
67
                            ast.addNode_StepInto("", 7, "");
68
                                ast.setStream(0);
69
             
70
    ast.setStream(0);
71
    ast.setStream(1);
72
}
73

74
onFinish {
75
                        ast.setStream(4);
76
                        ast.addNode("", 0, "");
77
                        ast.goParent();
78
                    ast.goParent();
79
                ast.addNode("", 0, "");
80
                ast.goParent();
81
            ast.goParent();
82
        ast.addNode("", 32, "");
83
        ast.goParent();
84

85
                                ast.setStream(5);
86
                                ast.addNode("", 0, "");
87
                                ast.goParent();
88
                            ast.goParent();
89
                        ast.addNode("", 0, "");
90
                        ast.goParent();
91
                    ast.goParent();
92
                ast.addNode("", 2, "__d");
93
                ast.addNode("", 35, "");
94
                ast.addNode("", 0, "");
95
                ast.goParent();
96
            ast.goParent();
97
        ast.addNode("", 32, "");
98
        ast.goParent();
99
    ast.addNode("", 19, "");
100
    ast.addNode("", 20, "");
101

102
    ast.setStream(0);
103
}
104

105
main программа;
106

107
include "include/expression.fuze";
108
//include "include/declarations-definitions"; 
109

110
remove переменная = ID;
111

112
переменная
113
    = ID { 
114
                    ast.addNode(ast.sbl.host, ast.sbl.op.PushVariable, 0);
115
                    ast.setStream(2); 
116
                    ast.addNode_once(ast.sbl.host, ast.sbl.op.DeclarationOnce, 0);
117
                    ast.setStream(0); 
118
                }
119
    ;
120

121
программа
122
    = список_операторов { 
123
                    ast.setStream(10);
124
                    ast.addNode(ast.sbl.host, ast.sbl.op.CheckState, 0); 
125
                }
126
    = список_операторов ";" { 
127
                    ast.setStream(10);
128
                    ast.addNode(ast.sbl.host, ast.sbl.op.CheckState, 0); 
129
                }
130
    ;
131

132
список_операторов
133
    = оператор
134
    = список_операторов ";" оператор
135
    ;
136

137
оператор
138
    = простое_уравнение
139
    = дифференциальное_уравнение
140
    = оператор_импорта
141
    ;
142

143
простое_уравнение
144
    = левая_часть_простого_уравнения правая_часть_присваивания { 
145
                        ast.goParent();
146
                    ast.setStream(0); 
147
                }
148
    ;
149

150
правая_часть_присваивания
151
    = выражение
152
    ;
153

154
левая_часть_простого_уравнения
155
    = ID "=" { 
156
                    ast.setStream(2); 
157
                    ast.addNode_once(ast.sbl.host, ast.sbl.op.DeclarationOnce, 0);
158
                    ast.setStream(0); 
159
                    
160
                    ast.setStream(4); 
161
                    ast.addNode(ast.sbl.host, 2, 0); 
162
                    ast.addNode_StepInto(ast.sbl.host, 21, 1);
163
                }
164
    ;
165
    
166
дифференциальное_уравнение
167
    = левая_часть_дифференциального_уравнения выражение {
168
                        ast.goParent();
169
                    ast.setStream(0);
170
                }
171
    ;
172

173
левая_часть_дифференциального_уравнения
174
    = ID "'" "=" {
175
                    ast.setStream(2); 
176
                    ast.addNode_once(ast.sbl.host, ast.sbl.op.DeclarationOnce, 0);
177
                    ast.setStream(0); 
178
                    
179
                    ast.setStream(3); 
180
                    ast.addNode("", 2, 0); 
181
                    ast.addNode("", 3, "spec"); 
182
                    ast.addNode_StepInto("", 9, 1);
183
                        ast.addNode("", 1, "differential");
184
                        ast.goParent();
185
                    ast.addNode_StepInto("", 21, 1);
186
                        ast.addNode("", 1, true);
187
                        ast.goParent();
188
                    ast.setStream(0); 
189
                    
190
                    ast.setStream(5); 
191
                    ast.addNode("", 2, "__d"); 
192
                    ast.addNode_StepInto("", 9, 1);
193
                        ast.addNode("", 1, 0);
194
                        ast.goParent();
195
                    ast.addNode_StepInto("", 21, 2);
196
                }
197
    ;
198

199
оператор_импорта
200
    = контракт_импорта ":" список_определений_переменных 
201
    ;
202
    
203
контракт_импорта
204
    = импорт { 
205
                    ast.addNode(ast.sbl.host, ast.sbl.op.Announcement, 0); 
206
                }
207
    ;
208

209
импорт
210
    = импорт_обязательная_часть >
211
                                { ast.goParent(); }
212
    = импорт_обязательная_часть выражение
213
                                { ast.goParent(); }
214
    ;
215

216
импорт_обязательная_часть
217
    = "import" ANNOTATION       { ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.Import, 1); }
218
    = "import" ID               { ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.Import, 1); }
219
    ;
220
    
221
список_определений_переменных
222
    = объявление_или_определение_переменной
223
    = список_определений_переменных "," объявление_или_определение_переменной
224
    ;
225

226
объявление_или_определение_переменной
227
    = объявление_переменной
228
    = объявление_переменной инициализация_переменной
229
    ;
230

231
объявление_переменной
232
    = ID                        { ast.addNode(ast.sbl.host, ast.sbl.op.DeclarationOnce, 0); }
233
    ;
234
    
235
инициализация_переменной
236
    = знак_инициализации правая_часть_присваивания
237
                                { ast.goParent(); ast.addNode(ast.sbl.host, ast.sbl.op.PostInitialize, 0); }
238
    ;
239

240
знак_инициализации
241
    = "="                       { ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.Initialize, 0); }
242
    ;
243

244
правая_часть_присваивания
245
    = выражение
246
    ;
247

248

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

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

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

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