loom

Форк
0
/
sbl-script.fuze 
814 строк · 32.9 Кб
1
/*  Описание грамматики базового языка сценариев SIMODO
2

3
    SIMODO Base Language for scripts
4

5
    Базовый вариант без объявления интерфейсной части модуля и пользовательских типов
6
    (структур, функций и т.д.)
7
*/
8

9
main список_операторов;
10

11
include "expression";
12

13
/*  Дополняем выражение структурами данных
14
******************************************************************************/
15
выражение
16
    = структура_массива
17
    = структура_кортежа
18
    ;
19

20
/*  Начальные определения операторов
21
******************************************************************************/
22

23
список_операторов
24
    = оператор
25
    = список_операторов оператор
26
    ;
27

28
оператор
29
    = оператор_описания
30
    = оператор_выполнения
31
    ;
32

33
список_операторов_выполнения
34
    = оператор_выполнения
35
    = список_операторов_выполнения оператор_выполнения
36
    ;
37

38
/*  Пустой оператор
39
******************************************************************************/
40
оператор_выполнения
41
    = пустой_оператор
42
    ;
43

44
пустой_оператор
45
    = ";"                       { ast.addNode(ast.op.Statement_Blank, 0); }
46
    ;
47

48
/*  Оператор метки
49
******************************************************************************/
50
//оператор_описания
51
//    = оператор_метки
52
//    ;
53

54
//оператор_метки
55
//    = начало_оператора_метки оператор_выполнения
56
//    ;
57

58
//начало_оператора_метки
59
//    = ID ":"
60
//    ;
61

62
/*  Оператор goto
63
******************************************************************************/
64
//оператор_выполнения
65
//    = оператор_goto
66
//    ;
67

68
//оператор_goto
69
//    = "goto" ID ";"
70
//    ;
71

72
/*  Оператор объявления пространства имён
73
******************************************************************************/
74
оператор_описания
75
    = оператор_объявления_пространства_имён
76
    ;
77

78
оператор_объявления_пространства_имён
79
    = наименование_пространства_имён блок_операторов
80
    ;
81

82
наименование_пространства_имён
83
    = ID
84
    ;
85

86
/*  Оператор импорта
87
******************************************************************************/
88
оператор_описания
89
    = оператор_импорта ";"
90
    ;
91

92
оператор_импорта
93
    = начало_оператора_импорта импорт_фрагмент_from импорт_фрагмент_grammar импорт_фрагмент_type
94
    = начало_оператора_импорта импорт_фрагмент_from импорт_фрагмент_type
95
    = начало_оператора_импорта импорт_фрагмент_from импорт_фрагмент_grammar импорт_список_переменных
96
    = начало_оператора_импорта импорт_фрагмент_from импорт_список_переменных
97
    ;
98

99
начало_оператора_импорта
100
    = "import"
101
    ;
102

103
импорт_фрагмент_type
104
    = "type" ID
105
    ;
106

107
импорт_фрагмент_from
108
    = "from" ANNOTATION
109
    = ANNOTATION
110
    ;
111

112
импорт_фрагмент_grammar
113
    = "grammar" "(" импорт_имя_грамматики ")"
114
    = "(" импорт_имя_грамматики ")"
115
    ;
116

117
импорт_имя_грамматики
118
    = ID
119
    = ANNOTATION
120
    ;
121

122
импорт_список_переменных
123
    = импорт_переменная
124
    = импорт_список_переменных "," импорт_переменная
125
    ;
126

127
импорт_переменная
128
    = ID "(" структура_кортежа ")"
129
    = ID "(" ")"
130
    = ID
131
    ;
132

133
/*  Оператор using
134
******************************************************************************/
135
оператор_описания
136
    = оператор_using ";"
137
    ;
138
    оператор_using
139
        = "using" ID        { ast.addNode(ast.op.Statement_Using, 1); }
140
        ;
141

142
/*  Оператор use
143
******************************************************************************/
144
//оператор_описания
145
//    = оператор_use ";"
146
//    ;
147
//    оператор_use
148
//        = перечень_внешних_интерфейсов
149
//        ;
150

151
/*  Оператор описания интерфейса
152
******************************************************************************/
153
оператор_описания
154
    = оператор_описания_интерфейса ";"
155
    ;
156

157
оператор_описания_интерфейса
158
    = начало_описания_интерфейса перечень_внешних_интерфейсов наименование_интерфейса описание_интерфейса
159
    = начало_описания_интерфейса перечень_внешних_интерфейсов
160
    = начало_описания_интерфейса наименование_интерфейса описание_интерфейса
161
    ;
162

163
начало_описания_интерфейса
164
    = "interface"
165
    ;
166

167
перечень_внешних_интерфейсов
168
    = "use" "(" список_внешних_интерфейсов ")"
169
    = "use" список_внешних_интерфейсов
170
    ;
171

172
список_внешних_интерфейсов
173
    = наименование_внешнего_интерфейса
174
    = список_внешних_интерфейсов "," наименование_внешнего_интерфейса
175
    ;
176

177
наименование_внешнего_интерфейса
178
    = ANNOTATION
179
    = ID
180
    ;
181

182
описание_интерфейса
183
    = перечень_контрактов_интерфейса "{" список_элементов_интерфейса "}"
184
    = "{" список_элементов_интерфейса "}"
185
    = "{" "}"
186
    ;
187

188
наименование_интерфейса
189
    = ID
190
    ;
191

192
перечень_контрактов_интерфейса
193
    = список_контрактов_интерфейса
194
    = "(" список_контрактов_интерфейса ")"
195
    ;
196

197
список_контрактов_интерфейса
198
    = контракт_интерфейса
199
    = список_контрактов_интерфейса "," контракт_интерфейса
200
    ;
201

202
контракт_интерфейса
203
    = тип_контракта_интерфейса "(" список_выражений ")"
204
    = тип_контракта_интерфейса "(" ")"
205
    = тип_контракта_интерфейса
206
    ;
207

208
тип_контракта_интерфейса
209
    = "immutable"
210
    = "uncopyable"
211
    = "not" "copyable"
212
    = "deterministic"
213
    = "idempotent"
214
    = "throw"
215
    ;
216

217
список_элементов_интерфейса
218
    = элемент_интерфейса
219
    = список_элементов_интерфейса элемент_интерфейса
220
    ;
221

222
элемент_интерфейса
223
    = начало_объявления_функции часть_объявления_функции ";"
224
    ;
225

226
/*  Оператор определения функции
227
******************************************************************************/
228
оператор_описания
229
    = определение_функции
230
    ;
231

232
определение_функции
233
    = начало_объявления_функции перечень_замыканий часть_объявления_функции тело_функции
234
    = начало_объявления_функции часть_объявления_функции тело_функции
235
    ;
236

237
начало_объявления_функции
238
    = "override"
239
    = "function"
240
    = "func"
241
    = "pure"
242
    ;
243

244
перечень_замыканий
245
    = "[" список_замыканий "]"
246
    = "[" "]"
247
    ;
248
    список_замыканий
249
        = замыкание
250
        = список_замыканий "," замыкание
251
        ;
252
        замыкание
253
            = ID "var"
254
            = ID
255
            ;
256

257
часть_объявления_функции
258
    = наименование_функции определение_аргументов возвращаемые_типы перечень_контрактов_функции
259
    = наименование_функции определение_аргументов перечень_контрактов_функции
260
    = наименование_функции определение_аргументов возвращаемые_типы
261
    = наименование_функции определение_аргументов
262
    = определение_аргументов возвращаемые_типы перечень_контрактов_функции
263
    = определение_аргументов перечень_контрактов_функции
264
    = определение_аргументов возвращаемые_типы
265
    = определение_аргументов
266
    ;
267

268
наименование_функции
269
    = ID
270
    ;
271

272
возвращаемые_типы
273
    = "->" список_возвращаемых_типов
274
    ;
275

276
список_возвращаемых_типов
277
    = описание_возвращаемого_типа
278
    = список_возвращаемых_типов "," описание_возвращаемого_типа
279
    ;
280

281
описание_возвращаемого_типа
282
    = возвращаемый_тип
283
    = возвращаемый_тип ID
284
    ;
285

286
возвращаемый_тип
287
    = "auto"
288
    = ID
289
    = ID "[" "]"
290
    ;
291

292
определение_аргументов
293
    = "(" ")"
294
    = "(" список_аргументов ")"
295
    ;
296

297
список_аргументов
298
    = определение_аргумента
299
    = список_аргументов "," определение_аргумента
300
    ;
301

302
определение_аргумента
303
    = тип_аргумента
304
    = тип_аргумента ID
305
    = тип_аргумента контракт_аргумента
306
    = тип_аргумента ID контракт_аргумента
307
    = тип_аргумента "(" список_контрактов_аргумента ")"
308
    = тип_аргумента ID "(" список_контрактов_аргумента ")"
309
    ;
310

311
тип_аргумента
312
    = ID
313
    = ID "[" "]"
314
    ;
315

316
перечень_контрактов_функции
317
    = список_контрактов_функции
318
    = "(" список_контрактов_функции ")"
319
    ;
320

321
список_контрактов_функции
322
    = контракт_функции
323
    = список_контрактов_функции "," контракт_функции
324
    = список_контрактов_функции контракт_функции
325
    ;
326

327
контракт_функции
328
    = тип_контракта_функции "(" список_выражений ")"
329
    = тип_контракта_функции "(" ")"
330
    = тип_контракта_функции
331
    ;
332

333
тип_контракта_функции
334
    = "invariant"
335
    = "inv"
336
    = "precondition"
337
    = "pre"
338
    = "postcondition"
339
    = "post"
340
    = "throw"
341
    = "assert"
342
    = "option"
343
    = "opt"
344
    = "pure"
345
    = "deterministic"
346
    = "idempotent"
347
    ;
348

349
список_контрактов_аргумента
350
    = контракт_аргумента
351
    = список_контрактов_аргумента "," контракт_аргумента
352
    = список_контрактов_аргумента контракт_аргумента
353
    ;
354

355
контракт_аргумента
356
    = тип_контракта_аргумента "(" список_выражений ")"
357
    = тип_контракта_аргумента "(" ")"
358
    = тип_контракта_аргумента
359
    ;
360

361
тип_контракта_аргумента
362
    = "invariant"
363
    = "inv"
364
    = "precondition"
365
    = "pre"
366
    = "postcondition"
367
    = "post"
368
    = "option"
369
    = "opt"
370
    = "var"
371
    ;
372

373
тело_функции
374
    = начало_тела_функции список_операторов "}"
375
                        { ast.addNode(ast.op.None, 2); ast.goParent(); }
376
    = начало_тела_функции "}"
377
                        { ast.addNode(ast.op.None, 1); ast.goParent(); }
378
    ;
379
    начало_тела_функции
380
        = "{"           { ast.addNode_StepInto(ast.op.Function_Body, 0); }
381
        ;
382

383
/*  Специальные определения для функций, расширяющие грамматику выражений
384
******************************************************************************/
385
//адрес
386
//    = "f" "(" список_аргументов_функции ")" тело_функции
387
//    ;
388

389
элемент_массива
390
    = определение_функции
391
    ;
392
значение_элемента_кортежа
393
    = определение_функции
394
    ;
395
аргумент_функции
396
    = определение_функции
397
    ;
398

399
выражение_или_определение_функции
400
    = выражение
401
    = определение_функции
402
    ;
403

404
список_выражений_и_определений_функций
405
    = выражение_или_определение_функции
406
    = список_выражений_и_определений_функций "," выражение_или_определение_функции
407
    ;
408

409
/*  Оператор вызова процедуры
410
******************************************************************************/
411
оператор_выполнения
412
    = вызов_процедуры ";"
413
    ;
414
    вызов_процедуры
415
        = адрес                 { ast.resetOperation_ProcedureCalling(); }
416
//        = "call" адрес          { ast.resetOperation_ProcedureCalling(); }
417
//        = "emit" адрес
418
        = "run" адрес
419
//        = "join" адрес
420
        ;
421

422
/*  Оператор итерации
423
******************************************************************************/
424
оператор_выполнения
425
    = оператор_итерации ";"
426
    ;
427
    оператор_итерации
428
        = итерация
429
                                { ast.addNode(ast.op.InternalPop, 1); }
430
        ;
431

432
/*  Оператор объявления переменной
433
******************************************************************************/
434
оператор_описания
435
    = объявление_переменных ";"
436
    ;
437

438
объявление_переменных
439
    = "[" список_объявлений_переменных "]" "=" выражение
440
    = наименование_типа список_объявлений_и_определений_переменных
441
    ;
442

443
список_объявлений_и_определений_переменных
444
    = объявление_или_определение_переменной
445
    = список_объявлений_и_определений_переменных "," объявление_или_определение_переменной
446
    ;
447

448
объявление_или_определение_переменной
449
    = наименование_объявляемой_переменной размерность_массива "var" инициализация_переменной
450
    = наименование_объявляемой_переменной "var" инициализация_переменной
451
    = наименование_объявляемой_переменной размерность_массива "var" "(" выражение_или_определение_функции ")"
452
    = наименование_объявляемой_переменной "var" "(" выражение_или_определение_функции ")"
453
    = наименование_объявляемой_переменной "var" размерность_массива
454
    = наименование_объявляемой_переменной "var"
455
    = наименование_объявляемой_переменной размерность_массива инициализация_переменной
456
    = наименование_объявляемой_переменной инициализация_переменной
457
    = наименование_объявляемой_переменной размерность_массива "(" выражение_или_определение_функции ")"
458
    = наименование_объявляемой_переменной "(" выражение_или_определение_функции ")"
459
    = наименование_объявляемой_переменной размерность_массива
460
    = наименование_объявляемой_переменной
461
    ;
462

463
наименование_объявляемой_переменной
464
    = ID
465
    ;
466

467
размерность_массива
468
    = "[" список_выражений "]"
469
    = "[" "]"
470
    ;
471

472
наименование_типа
473
    = ID
474
    = "auto"
475
    ;
476

477
// Возможно, нужно отказаться от инициализации через присваивание,
478
// чтобы усилить единообразие и инициализацию выполнять через конструктор
479
// Это было бы непривычно, но правильно!!!
480
инициализация_переменной
481
    = "=" выражение_или_определение_функции
482
    ;
483

484
список_объявлений_переменных
485
    = объявление_переменной
486
    = "," объявление_переменной
487
    = ","
488
    = список_объявлений_переменных объявление_переменной_или_пропуск
489
    ;
490

491
объявление_переменной_или_пропуск
492
    = "," объявление_переменной
493
    = ","
494
    ;
495

496
объявление_переменной
497
    = наименование_объявляемой_переменной размерность_массива "var"
498
    = наименование_объявляемой_переменной "var"
499
    = наименование_объявляемой_переменной размерность_массива
500
    = наименование_объявляемой_переменной
501
    ;
502

503
/*  Оператор присваивания
504
******************************************************************************/
505
оператор_выполнения
506
    = оператор_присваивания ";"
507
    ;
508
    оператор_присваивания
509
        = адрес символ_присваивания выражение_или_определение_функции
510
                                {
511
                                    ast.goParent();
512
                                    ast.goParent();
513
                                }
514
        = адрес символ_итерационного_присваивания выражение
515
                                {
516
                                    ast.goParent();
517
                                    ast.goParent();
518
                                }
519
        ;
520
        символ_присваивания
521
            = "="               { ast.addNode_Assignment(ast.op.Statement_Assign, 0); }
522
            ;
523
        символ_итерационного_присваивания
524
            = "+="              { ast.addNode_Assignment(ast.op.Statement_Assign_Addition, 0); }
525
            = "-="              { ast.addNode_Assignment(ast.op.Statement_Assign_Substruction, 0); }
526
            = "*="              { ast.addNode_Assignment(ast.op.Statement_Assign_Multiplication, 0); }
527
            = "/="              { ast.addNode_Assignment(ast.op.Statement_Assign_Division, 0); }
528
            = "%="              { ast.addNode_Assignment(ast.op.Statement_Assign_Modulo, 0); }
529
            ;
530

531
/*  Оператор управления
532
******************************************************************************/
533
оператор_выполнения
534
    = оператор_управления ";"
535
    ;
536
    оператор_управления
537
        = "break"
538
                                { ast.addNode(ast.op.Statement_Break, 0); }
539
        = "continue"
540
                                { ast.addNode(ast.op.Statement_Continue, 0); }
541
        ;
542

543
/*  Оператор возврата
544
******************************************************************************/
545
оператор_выполнения
546
    = оператор_return ";"
547
    ;
548
    оператор_return
549
        = слово_return
550
                                { ast.goParent(); }
551
        = слово_return список_выражений_и_определений_функций
552
                                { ast.goParent(); }
553
        ;
554
    слово_return
555
        = "return"
556
                                { ast.addNode_StepInto(ast.op.Statement_Return, 0); }
557
        ;
558

559
/*  Условный оператор
560
******************************************************************************/
561
оператор_выполнения
562
    = условный_оператор
563
    ;
564
    условный_оператор
565
        = "if" "(" условие_if ")" оператор_выполнения >
566
                                { ast.goParent(); }
567
        = "if" "(" условие_if ")" оператор_выполнения условие_else
568
                                { ast.goParent(); }
569
        ;
570
        условие_if
571
            = выражение         { ast.addNode_StepInto(ast.op.Statement_If_True, 0); }
572
            ;
573
        условие_else
574
            = слово_else оператор_выполнения
575
            ;
576
            слово_else
577
                = "else"        { ast.addNode_Parent_StepInto(ast.op.Statement_If_False, 0); }
578
                ;
579

580
/*  Оператор цикла while
581
******************************************************************************/
582
оператор_выполнения
583
    = цикл_while
584
    ;
585
    цикл_while
586
        = слово_while "(" условие_while ")" оператор_выполнения
587
                                {
588
                                    ast.goParent();
589
                                    ast.goParent();
590
                                }
591
        ;
592
        слово_while
593
            = "while"           {
594
                                    ast.addNode_StepInto(ast.op.Statement_While, 0);
595
                                    ast.addNode_StepInto(ast.op.None, 0);
596
                                }
597
            ;
598
        условие_while
599
            = выражение         { ast.addNode_Parent_StepInto(ast.op.Statement_While_Body, 0); }
600
            ;
601

602
/*  Оператор цикла do-while
603
******************************************************************************/
604
оператор_выполнения
605
    = цикл_do_while
606
    ;
607
    цикл_do_while
608
        = слово_do оператор_DoWhile "while" "(" выражение ")" ";"
609
                                {
610
                                    ast.goParent();
611
                                    ast.goParent();
612
                                }
613
        ;
614
        слово_do
615
            = "do"              {
616
                                    ast.addNode_StepInto(ast.op.Statement_DoWhile, 0);
617
                                    ast.addNode_StepInto(ast.op.Statement_DoWhile_Body, 0);
618
                                }
619
            ;
620
        оператор_DoWhile
621
            = оператор_выполнения      { ast.addNode_Parent_StepInto(ast.op.None, 0); }
622
            ;
623

624
/*  Оператор цикла for
625
******************************************************************************/
626
оператор_выполнения
627
    = цикл_for
628
    ;
629
    цикл_for
630
        = слово_for "(" варианты_for
631
                                {
632
                                    ast.goParent();
633
                                    ast.goParent();
634
                                }
635
        ;
636
        слово_for
637
            = "for"             {
638
                                    ast.addNode_StepInto(ast.op.Statement_For, 0);
639
                                    ast.addNode_StepInto(ast.op.None, 0);
640
                                }
641
            ;
642
        варианты_for
643
            = цикл_for_блок_переменные_цикла цикл_for_проверка цикл_for_итерация оператор_for
644
            ;
645
        цикл_for_блок_переменные_цикла
646
            = объявление_переменных ";"
647
                                { ast.addNode_Parent_StepInto(ast.op.None, 0); }
648
            = оператор_присваивания ";"
649
                                { ast.addNode_Parent_StepInto(ast.op.None, 0); }
650
            = список_объявлений_и_присваиваний ";"
651
                                { ast.addNode_Parent_StepInto(ast.op.None, 0); }
652
            = ";"
653
                                { ast.addNode_Parent_StepInto(ast.op.None, 0); }
654
            ;
655
            список_объявлений_и_присваиваний
656
                = объявление_или_присваивание
657
                = список_объявлений_и_присваиваний "," объявление_или_присваивание
658
                ;
659
                объявление_или_присваивание
660
                    = "(" объявление_переменных ")"
661
                    = "(" оператор_присваивания ")"
662
                    ;
663

664
        цикл_for_проверка
665
            = выражение ";"
666
                                { ast.addNode_Parent_StepInto(ast.op.None, 0); }
667
            = ";"
668
                                { ast.addNode_Parent_StepInto(ast.op.None, 0); }
669
            ;
670
        цикл_for_итерация
671
            = выражение ")"     { ast.addNode_Parent_StepInto(ast.op.Statement_For_Body, 0); }
672
            = ")"               { ast.addNode_Parent_StepInto(ast.op.Statement_For_Body, 0); }
673
            ;
674
        оператор_for
675
            = оператор_выполнения
676
            ;
677

678
/*  Оператор цикла each
679
******************************************************************************/
680
оператор_выполнения
681
    = цикл_each
682
    ;
683
    цикл_each
684
        = слово_each "(" наименование_типа ID "in" выражение "if" выражение ")" оператор_выполнения
685
        = слово_each "(" наименование_типа ID "in" выражение ")" оператор_выполнения
686
        = слово_each "(" наименование_типа ID "in" "range" цикл_each_знак_левой_границы выражение "," выражение цикл_each_знак_правой_границы "if" выражение ")" оператор_выполнения
687
        = слово_each "(" наименование_типа ID "in" "range" цикл_each_знак_левой_границы выражение "," выражение цикл_each_знак_правой_границы ")" оператор_выполнения
688
        ;
689
        слово_each
690
            = "each"
691
            ;
692
        цикл_each_знак_левой_границы
693
            = "["
694
            = "("
695
            ;
696
        цикл_each_знак_правой_границы
697
            = "]"
698
            = ")"
699
            ;
700

701
/*  Оператор ветвления
702
******************************************************************************/
703
оператор_выполнения
704
    = оператор_ветвления
705
    ;
706
    оператор_ветвления
707
        = "switch" "(" выражение_switch ")" "{" перечень_случаев_switch "}"
708
        = "switch" "(" выражение_switch ")" "{" перечень_случаев_switch дефолтный_случай_switch "}"
709
        ;
710
        выражение_switch
711
            = выражение
712
            ;
713
        перечень_случаев_switch
714
            = случай_switch
715
            = перечень_случаев_switch случай_switch
716
            ;
717
        случай_switch
718
            = "case" выражение ":" список_операторов_выполнения
719
            ;
720
        дефолтный_случай_switch
721
            = "default" ":" список_операторов_выполнения
722
            ;
723

724
/*  Блок операторов
725
******************************************************************************/
726
оператор_выполнения
727
    = блок_операторов
728
    ;
729
    блок_операторов
730
        = начало_блока_операторов список_операторов "}"
731
                                { ast.addNode(ast.op.None, 2); ast.goParent(); }
732
        = начало_блока_операторов "}"
733
                                { ast.addNode(ast.op.None, 1); ast.goParent(); }
734
        ;
735
        начало_блока_операторов
736
            = "{"               { ast.addNode_StepInto(ast.op.Statement_Block, 0); }
737
            ;
738

739
/*  Оператор проверки состояния (assert)
740
******************************************************************************/
741
оператор_описания
742
    = оператор_проверки_состояния
743
    ;
744
    оператор_проверки_состояния
745
        = начало_оператора_проверки_состояния список_выражений ";"
746
        ;
747
        начало_оператора_проверки_состояния
748
            = "assert"
749
            ;
750

751
/*  Описание грамматики структур данных
752
******************************************************************************/
753
структура_массива
754
    = знак_начала_массива перечень_элементов_массива "]" {
755
                                ast.goParent();
756
                            }
757
    = знак_начала_массива "]" {
758
                                ast.goParent();
759
                            }
760
    ;
761
    знак_начала_массива
762
        = "["               {
763
                                ast.addNode_StepInto(ast.op.DataStructure_Array, 0);
764
                            }
765
        ;
766
    перечень_элементов_массива
767
        = список_значений_массива
768
        = список_значений_массива ","
769
        ;
770
        список_значений_массива
771
            = элемент_массива
772
            = список_значений_массива "," элемент_массива
773
            ;
774
            элемент_массива
775
                = выражение
776
                ;
777

778
структура_кортежа
779
    = знак_начала_кортежа перечень_элементов_кортежа "}" {
780
                                ast.goParent();
781
                            }
782
    = знак_начала_кортежа "}" {
783
                                ast.goParent();
784
                            }
785
    ;
786
    знак_начала_кортежа
787
        = "{"               {
788
                                ast.addNode_StepInto(ast.op.DataStructure_Tuple, 0);
789
                            }
790
        ;
791
    перечень_элементов_кортежа
792
        = список_элементов_кортежа
793
        = список_элементов_кортежа ","
794
        ;
795
        список_элементов_кортежа
796
            = элемент_кортежа
797
            = список_элементов_кортежа "," элемент_кортежа
798
            ;
799
            элемент_кортежа
800
                = наименование_элемента_кортежа ":" значение_элемента_кортежа {
801
                                ast.goParent();
802
                            }
803
                ;
804
                наименование_элемента_кортежа
805
                    = ANNOTATION {
806
                                ast.addNode_StepInto(ast.op.None, 0);
807
                            }
808
                    = ID    {
809
                                ast.addNode_StepInto(ast.op.None, 0);
810
                            }
811
                    ;
812
                значение_элемента_кортежа
813
                    = выражение
814
                    ;
815

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

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

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

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