1
/* Описание грамматики базового языка сценариев SIMODO
3
SIMODO Base Language for scripts
5
Базовый вариант без объявления интерфейсной части модуля и пользовательских типов
6
(структур, функций и т.д.)
13
/* Дополняем выражение структурами данных
14
******************************************************************************/
20
/* Начальные определения операторов
21
******************************************************************************/
25
= список_операторов оператор
33
список_операторов_выполнения
35
= список_операторов_выполнения оператор_выполнения
39
******************************************************************************/
45
= ";" { ast.addNode(ast.op.Statement_Blank, 0); }
49
******************************************************************************/
55
// = начало_оператора_метки оператор_выполнения
58
//начало_оператора_метки
63
******************************************************************************/
72
/* Оператор объявления пространства имён
73
******************************************************************************/
75
= оператор_объявления_пространства_имён
78
оператор_объявления_пространства_имён
79
= наименование_пространства_имён блок_операторов
82
наименование_пространства_имён
87
******************************************************************************/
89
= оператор_импорта ";"
93
= начало_оператора_импорта импорт_фрагмент_from импорт_фрагмент_grammar импорт_фрагмент_type
94
= начало_оператора_импорта импорт_фрагмент_from импорт_фрагмент_type
95
= начало_оператора_импорта импорт_фрагмент_from импорт_фрагмент_grammar импорт_список_переменных
96
= начало_оператора_импорта импорт_фрагмент_from импорт_список_переменных
99
начало_оператора_импорта
112
импорт_фрагмент_grammar
113
= "grammar" "(" импорт_имя_грамматики ")"
114
= "(" импорт_имя_грамматики ")"
122
импорт_список_переменных
124
= импорт_список_переменных "," импорт_переменная
128
= ID "(" структура_кортежа ")"
134
******************************************************************************/
139
= "using" ID { ast.addNode(ast.op.Statement_Using, 1); }
143
******************************************************************************/
148
// = перечень_внешних_интерфейсов
151
/* Оператор описания интерфейса
152
******************************************************************************/
154
= оператор_описания_интерфейса ";"
157
оператор_описания_интерфейса
158
= начало_описания_интерфейса перечень_внешних_интерфейсов наименование_интерфейса описание_интерфейса
159
= начало_описания_интерфейса перечень_внешних_интерфейсов
160
= начало_описания_интерфейса наименование_интерфейса описание_интерфейса
163
начало_описания_интерфейса
167
перечень_внешних_интерфейсов
168
= "use" "(" список_внешних_интерфейсов ")"
169
= "use" список_внешних_интерфейсов
172
список_внешних_интерфейсов
173
= наименование_внешнего_интерфейса
174
= список_внешних_интерфейсов "," наименование_внешнего_интерфейса
177
наименование_внешнего_интерфейса
183
= перечень_контрактов_интерфейса "{" список_элементов_интерфейса "}"
184
= "{" список_элементов_интерфейса "}"
188
наименование_интерфейса
192
перечень_контрактов_интерфейса
193
= список_контрактов_интерфейса
194
= "(" список_контрактов_интерфейса ")"
197
список_контрактов_интерфейса
198
= контракт_интерфейса
199
= список_контрактов_интерфейса "," контракт_интерфейса
203
= тип_контракта_интерфейса "(" список_выражений ")"
204
= тип_контракта_интерфейса "(" ")"
205
= тип_контракта_интерфейса
208
тип_контракта_интерфейса
217
список_элементов_интерфейса
219
= список_элементов_интерфейса элемент_интерфейса
223
= начало_объявления_функции часть_объявления_функции ";"
226
/* Оператор определения функции
227
******************************************************************************/
229
= определение_функции
233
= начало_объявления_функции перечень_замыканий часть_объявления_функции тело_функции
234
= начало_объявления_функции часть_объявления_функции тело_функции
237
начало_объявления_функции
245
= "[" список_замыканий "]"
250
= список_замыканий "," замыкание
257
часть_объявления_функции
258
= наименование_функции определение_аргументов возвращаемые_типы перечень_контрактов_функции
259
= наименование_функции определение_аргументов перечень_контрактов_функции
260
= наименование_функции определение_аргументов возвращаемые_типы
261
= наименование_функции определение_аргументов
262
= определение_аргументов возвращаемые_типы перечень_контрактов_функции
263
= определение_аргументов перечень_контрактов_функции
264
= определение_аргументов возвращаемые_типы
265
= определение_аргументов
273
= "->" список_возвращаемых_типов
276
список_возвращаемых_типов
277
= описание_возвращаемого_типа
278
= список_возвращаемых_типов "," описание_возвращаемого_типа
281
описание_возвращаемого_типа
283
= возвращаемый_тип ID
292
определение_аргументов
294
= "(" список_аргументов ")"
298
= определение_аргумента
299
= список_аргументов "," определение_аргумента
305
= тип_аргумента контракт_аргумента
306
= тип_аргумента ID контракт_аргумента
307
= тип_аргумента "(" список_контрактов_аргумента ")"
308
= тип_аргумента ID "(" список_контрактов_аргумента ")"
316
перечень_контрактов_функции
317
= список_контрактов_функции
318
= "(" список_контрактов_функции ")"
321
список_контрактов_функции
323
= список_контрактов_функции "," контракт_функции
324
= список_контрактов_функции контракт_функции
328
= тип_контракта_функции "(" список_выражений ")"
329
= тип_контракта_функции "(" ")"
330
= тип_контракта_функции
349
список_контрактов_аргумента
351
= список_контрактов_аргумента "," контракт_аргумента
352
= список_контрактов_аргумента контракт_аргумента
356
= тип_контракта_аргумента "(" список_выражений ")"
357
= тип_контракта_аргумента "(" ")"
358
= тип_контракта_аргумента
361
тип_контракта_аргумента
374
= начало_тела_функции список_операторов "}"
375
{ ast.addNode(ast.op.None, 2); ast.goParent(); }
376
= начало_тела_функции "}"
377
{ ast.addNode(ast.op.None, 1); ast.goParent(); }
380
= "{" { ast.addNode_StepInto(ast.op.Function_Body, 0); }
383
/* Специальные определения для функций, расширяющие грамматику выражений
384
******************************************************************************/
386
// = "f" "(" список_аргументов_функции ")" тело_функции
390
= определение_функции
392
значение_элемента_кортежа
393
= определение_функции
396
= определение_функции
399
выражение_или_определение_функции
401
= определение_функции
404
список_выражений_и_определений_функций
405
= выражение_или_определение_функции
406
= список_выражений_и_определений_функций "," выражение_или_определение_функции
409
/* Оператор вызова процедуры
410
******************************************************************************/
412
= вызов_процедуры ";"
415
= адрес { ast.resetOperation_ProcedureCalling(); }
416
// = "call" адрес { ast.resetOperation_ProcedureCalling(); }
423
******************************************************************************/
425
= оператор_итерации ";"
429
{ ast.addNode(ast.op.InternalPop, 1); }
432
/* Оператор объявления переменной
433
******************************************************************************/
435
= объявление_переменных ";"
439
= "[" список_объявлений_переменных "]" "=" выражение
440
= наименование_типа список_объявлений_и_определений_переменных
443
список_объявлений_и_определений_переменных
444
= объявление_или_определение_переменной
445
= список_объявлений_и_определений_переменных "," объявление_или_определение_переменной
448
объявление_или_определение_переменной
449
= наименование_объявляемой_переменной размерность_массива "var" инициализация_переменной
450
= наименование_объявляемой_переменной "var" инициализация_переменной
451
= наименование_объявляемой_переменной размерность_массива "var" "(" выражение_или_определение_функции ")"
452
= наименование_объявляемой_переменной "var" "(" выражение_или_определение_функции ")"
453
= наименование_объявляемой_переменной "var" размерность_массива
454
= наименование_объявляемой_переменной "var"
455
= наименование_объявляемой_переменной размерность_массива инициализация_переменной
456
= наименование_объявляемой_переменной инициализация_переменной
457
= наименование_объявляемой_переменной размерность_массива "(" выражение_или_определение_функции ")"
458
= наименование_объявляемой_переменной "(" выражение_или_определение_функции ")"
459
= наименование_объявляемой_переменной размерность_массива
460
= наименование_объявляемой_переменной
463
наименование_объявляемой_переменной
468
= "[" список_выражений "]"
477
// Возможно, нужно отказаться от инициализации через присваивание,
478
// чтобы усилить единообразие и инициализацию выполнять через конструктор
479
// Это было бы непривычно, но правильно!!!
480
инициализация_переменной
481
= "=" выражение_или_определение_функции
484
список_объявлений_переменных
485
= объявление_переменной
486
= "," объявление_переменной
488
= список_объявлений_переменных объявление_переменной_или_пропуск
491
объявление_переменной_или_пропуск
492
= "," объявление_переменной
497
= наименование_объявляемой_переменной размерность_массива "var"
498
= наименование_объявляемой_переменной "var"
499
= наименование_объявляемой_переменной размерность_массива
500
= наименование_объявляемой_переменной
503
/* Оператор присваивания
504
******************************************************************************/
506
= оператор_присваивания ";"
508
оператор_присваивания
509
= адрес символ_присваивания выражение_или_определение_функции
514
= адрес символ_итерационного_присваивания выражение
521
= "=" { ast.addNode_Assignment(ast.op.Statement_Assign, 0); }
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); }
531
/* Оператор управления
532
******************************************************************************/
534
= оператор_управления ";"
538
{ ast.addNode(ast.op.Statement_Break, 0); }
540
{ ast.addNode(ast.op.Statement_Continue, 0); }
544
******************************************************************************/
546
= оператор_return ";"
551
= слово_return список_выражений_и_определений_функций
556
{ ast.addNode_StepInto(ast.op.Statement_Return, 0); }
560
******************************************************************************/
565
= "if" "(" условие_if ")" оператор_выполнения >
567
= "if" "(" условие_if ")" оператор_выполнения условие_else
571
= выражение { ast.addNode_StepInto(ast.op.Statement_If_True, 0); }
574
= слово_else оператор_выполнения
577
= "else" { ast.addNode_Parent_StepInto(ast.op.Statement_If_False, 0); }
580
/* Оператор цикла while
581
******************************************************************************/
586
= слово_while "(" условие_while ")" оператор_выполнения
594
ast.addNode_StepInto(ast.op.Statement_While, 0);
595
ast.addNode_StepInto(ast.op.None, 0);
599
= выражение { ast.addNode_Parent_StepInto(ast.op.Statement_While_Body, 0); }
602
/* Оператор цикла do-while
603
******************************************************************************/
608
= слово_do оператор_DoWhile "while" "(" выражение ")" ";"
616
ast.addNode_StepInto(ast.op.Statement_DoWhile, 0);
617
ast.addNode_StepInto(ast.op.Statement_DoWhile_Body, 0);
621
= оператор_выполнения { ast.addNode_Parent_StepInto(ast.op.None, 0); }
625
******************************************************************************/
630
= слово_for "(" варианты_for
638
ast.addNode_StepInto(ast.op.Statement_For, 0);
639
ast.addNode_StepInto(ast.op.None, 0);
643
= цикл_for_блок_переменные_цикла цикл_for_проверка цикл_for_итерация оператор_for
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); }
653
{ ast.addNode_Parent_StepInto(ast.op.None, 0); }
655
список_объявлений_и_присваиваний
656
= объявление_или_присваивание
657
= список_объявлений_и_присваиваний "," объявление_или_присваивание
659
объявление_или_присваивание
660
= "(" объявление_переменных ")"
661
= "(" оператор_присваивания ")"
666
{ ast.addNode_Parent_StepInto(ast.op.None, 0); }
668
{ ast.addNode_Parent_StepInto(ast.op.None, 0); }
671
= выражение ")" { ast.addNode_Parent_StepInto(ast.op.Statement_For_Body, 0); }
672
= ")" { ast.addNode_Parent_StepInto(ast.op.Statement_For_Body, 0); }
675
= оператор_выполнения
678
/* Оператор цикла each
679
******************************************************************************/
684
= слово_each "(" наименование_типа ID "in" выражение "if" выражение ")" оператор_выполнения
685
= слово_each "(" наименование_типа ID "in" выражение ")" оператор_выполнения
686
= слово_each "(" наименование_типа ID "in" "range" цикл_each_знак_левой_границы выражение "," выражение цикл_each_знак_правой_границы "if" выражение ")" оператор_выполнения
687
= слово_each "(" наименование_типа ID "in" "range" цикл_each_знак_левой_границы выражение "," выражение цикл_each_знак_правой_границы ")" оператор_выполнения
692
цикл_each_знак_левой_границы
696
цикл_each_знак_правой_границы
702
******************************************************************************/
707
= "switch" "(" выражение_switch ")" "{" перечень_случаев_switch "}"
708
= "switch" "(" выражение_switch ")" "{" перечень_случаев_switch дефолтный_случай_switch "}"
713
перечень_случаев_switch
715
= перечень_случаев_switch случай_switch
718
= "case" выражение ":" список_операторов_выполнения
720
дефолтный_случай_switch
721
= "default" ":" список_операторов_выполнения
725
******************************************************************************/
730
= начало_блока_операторов список_операторов "}"
731
{ ast.addNode(ast.op.None, 2); ast.goParent(); }
732
= начало_блока_операторов "}"
733
{ ast.addNode(ast.op.None, 1); ast.goParent(); }
735
начало_блока_операторов
736
= "{" { ast.addNode_StepInto(ast.op.Statement_Block, 0); }
739
/* Оператор проверки состояния (assert)
740
******************************************************************************/
742
= оператор_проверки_состояния
744
оператор_проверки_состояния
745
= начало_оператора_проверки_состояния список_выражений ";"
747
начало_оператора_проверки_состояния
751
/* Описание грамматики структур данных
752
******************************************************************************/
754
= знак_начала_массива перечень_элементов_массива "]" {
757
= знак_начала_массива "]" {
763
ast.addNode_StepInto(ast.op.DataStructure_Array, 0);
766
перечень_элементов_массива
767
= список_значений_массива
768
= список_значений_массива ","
770
список_значений_массива
772
= список_значений_массива "," элемент_массива
779
= знак_начала_кортежа перечень_элементов_кортежа "}" {
782
= знак_начала_кортежа "}" {
788
ast.addNode_StepInto(ast.op.DataStructure_Tuple, 0);
791
перечень_элементов_кортежа
792
= список_элементов_кортежа
793
= список_элементов_кортежа ","
795
список_элементов_кортежа
797
= список_элементов_кортежа "," элемент_кортежа
800
= наименование_элемента_кортежа ":" значение_элемента_кортежа {
804
наименование_элемента_кортежа
806
ast.addNode_StepInto(ast.op.None, 0);
809
ast.addNode_StepInto(ast.op.None, 0);
812
значение_элемента_кортежа