1
/* Описание грамматики языка сценариев (ЯС)
3
Базовый вариант без списковых выражений и возвратов, объявления структур, функций и т.д.
7
lex.addMarkup("/*", "*/", "", lex.LexemeType.Comment);
8
lex.addMarkup("//", "", "", lex.LexemeType.Comment);
14
main список_операторов_ЯС;
18
= список_операторов_ЯС оператор_ЯС
26
= объявление_переменной
28
= определение_переменной
29
= оператор_присваивания
37
// = оператор_ветвления
43
{ ast.addNode(ast.op.Statement_Blank, 0); }
46
= use_as_type_выражение ";"
49
= "using" ID ";" { ast.addNode(ast.op.Statement_Using, 1); }
52
// = тип имя_переменной1 ";"
54
= имя_типа имя_переменной1 ";"
58
= ID { ast.addNode(ast.op.Statement_Type, 0); }
61
// = тип имя_переменной1 размерность_массива ";"
63
= имя_типа имя_переменной1 размерность_массива ";"
67
= знак_начала_размерности_массива перечень_размерностей_массива "]"
69
= знак_начала_размерности_массива "]"
72
знак_начала_размерности_массива
73
= "[" { ast.addNode_StepInto(ast.op.None, 0); }
75
перечень_размерностей_массива
77
= перечень_размерностей_массива "," выражение
79
определение_переменной
80
// = тип имя_переменной1 присваивание_при_объявлении_переменной правая_часть_объявления ";"
82
// = тип имя_переменной1 размерность_массива присваивание_при_объявлении_переменной правая_часть_объявления ";"
84
= имя_типа имя_переменной1 присваивание_при_объявлении_переменной правая_часть_объявления ";"
86
= имя_типа имя_переменной1 размерность_массива присваивание_при_объявлении_переменной правая_часть_объявления ";"
90
= ID { ast.addNode_ShiftInto(ast.op.Statement_Id, 0); }
92
//TODO: Semantic: Для функций нужно проверять, чтобы их объявления и определения были в самом верхнем уровне вложенности блоков
94
= декларативная_часть ";"
98
= декларативная_часть тело_функции
102
= имя_типа имя_функции1 список_аргументов
105
= начало_списка_аргументов конец_списка_аргументов
106
= начало_списка_аргументов объявление_аргументов_функции конец_списка_аргументов
109
// = "int" { ast.addNode(ast.op.Statement_Type, 0); }
110
// = "float" { ast.addNode(ast.op.Statement_Type, 0); }
111
// = "bool" { ast.addNode(ast.op.Statement_Type, 0); }
112
// = "string" { ast.addNode(ast.op.Statement_Type, 0); }
113
// //TODO: Semantic: Нужно проверять, чтобы у переменной не было типа void, а у функции auto
114
// = "void" { ast.addNode(ast.op.Statement_Type, 0); }
115
// = "auto" { ast.addNode(ast.op.Statement_Type, 0); }
118
= ID { ast.addNode_ShiftInto(ast.op.Statement_Id, 0); }
120
присваивание_при_объявлении_переменной
121
= "=" { ast.addNode_StepInto(ast.op.Statement_Assign, 0); }
123
правая_часть_объявления
124
= выражение { ast.goParent(); }
125
= элементы_массива { ast.goParent(); }
126
= элементы_кортежа { ast.goParent(); }
128
начало_списка_аргументов
129
= "(" { ast.addNode_StepInto(ast.op.Function_Declaration, 0); }
131
конец_списка_аргументов
132
= ")" { ast.goParent(); }
134
объявление_аргументов_функции
136
= объявление_аргументов_функции "," аргумент_функции
140
// = тип ID { ast.addNode_Branch(ast.op.None, 1); }
141
= ID { ast.addNode(ast.op.Statement_Type, 0); }
142
= ID ID { ast.addNode(ast.op.Statement_Type, 0); ast.addNode_Branch(ast.op.None, 1); }
143
// = ID "[" "]" { ast.addNode(ast.op.Statement_Type, 0); ast.addNode(ast.op.Address_Array, 1); }
145
// ast.addNode(ast.op.Statement_Type, 0);
146
// ast.addNode(ast.op.Address_Array, 2);
147
// ast.addNode_Branch(ast.op.None, 1);
150
// ast.addNode(ast.op.Statement_Type, 0);
151
// ast.addNode(ast.op.Address_Array, 1);
152
// ast.addNode_Branch(ast.op.None, 3);
156
= начало_тела_функции список_операторов_ЯС "}"
157
{ ast.addNode(ast.op.None, 2); ast.goParent(); }
158
= начало_тела_функции "}"
159
{ ast.addNode(ast.op.None, 1); ast.goParent(); }
162
= "{" { ast.addNode_StepInto(ast.op.Function_Body, 0); }
165
оператор_присваивания
166
= адрес символ_присваивания выражение ";"
173
= "=" { ast.addNode_Assignment(ast.op.Statement_Assign, 0); }
174
= "+=" { ast.addNode_Assignment(ast.op.Statement_Assign_Addition, 0); }
175
= "-=" { ast.addNode_Assignment(ast.op.Statement_Assign_Substruction, 0); }
176
= "*=" { ast.addNode_Assignment(ast.op.Statement_Assign_Multiplication, 0); }
177
= "/=" { ast.addNode_Assignment(ast.op.Statement_Assign_Division, 0); }
178
= "%=" { ast.addNode_Assignment(ast.op.Statement_Assign_Modulo, 0); }
183
{ ast.resetOperation_ProcedureCalling(); }
188
{ ast.addNode(ast.op.Statement_Break, 0); }
190
{ ast.addNode(ast.op.Statement_Continue, 0); }
196
= слово_return выражение ";"
201
{ ast.addNode_StepInto(ast.op.Statement_Return, 0); }
205
= "if" "(" условие_if ")" оператор_ЯС >
207
= "if" "(" условие_if ")" оператор_ЯС условие_else
211
= выражение { ast.addNode_StepInto(ast.op.Statement_If_True, 0); }
214
= слово_else оператор_ЯС
217
= "else" { ast.addNode_Parent_StepInto(ast.op.Statement_If_False, 0); }
221
= слово_while "(" условие_while ")" оператор_ЯС
229
ast.addNode_StepInto(ast.op.Statement_While, 0);
230
ast.addNode_StepInto(ast.op.None, 0);
234
= выражение { ast.addNode_Parent_StepInto(ast.op.Statement_While_Body, 0); }
238
= слово_do оператор_DoWhile "while" "(" выражение ")" ";"
246
ast.addNode_StepInto(ast.op.Statement_DoWhile, 0);
247
ast.addNode_StepInto(ast.op.Statement_DoWhile_Body, 0);
251
= оператор_ЯС { ast.addNode_Parent_StepInto(ast.op.None, 0); }
255
= слово_for "(" цикл_for_переменная_цикла цикл_for_проверка цикл_for_итерация оператор_for
263
ast.addNode_StepInto(ast.op.Statement_For, 0);
264
ast.addNode_StepInto(ast.op.None, 0);
267
цикл_for_переменная_цикла
268
= определение_переменной
269
{ ast.addNode_Parent_StepInto(ast.op.None, 0); }
270
= оператор_присваивания
271
{ ast.addNode_Parent_StepInto(ast.op.None, 0); }
273
{ ast.addNode_Parent_StepInto(ast.op.None, 0); }
277
{ ast.addNode_Parent_StepInto(ast.op.None, 0); }
279
{ ast.addNode_Parent_StepInto(ast.op.None, 0); }
282
= итерация ")" { ast.addNode_Parent_StepInto(ast.op.Statement_For_Body, 0); }
283
= ")" { ast.addNode_Parent_StepInto(ast.op.Statement_For_Body, 0); }
289
// = "switch" "(" выражение_switch ")" "{" перечень_случаев_switch "}"
290
// = "switch" "(" выражение_switch ")" "{" перечень_случаев_switch дефолтный_случай_switch "}"
295
// перечень_случаев_switch
297
// = перечень_случаев_switch случай_switch
300
// = "case" константа_case ":" список_операторов_ЯС
302
// дефолтный_случай_switch
303
// = "default" ":" список_операторов_ЯС
312
= начало_блока_операторов список_операторов_ЯС "}"
313
{ ast.addNode(ast.op.None, 2); ast.goParent(); }
314
= начало_блока_операторов "}"
315
{ ast.addNode(ast.op.None, 1); ast.goParent(); }
317
начало_блока_операторов
318
= "{" { ast.addNode_StepInto(ast.op.Statement_Block, 0); }
323
{ ast.addNode(ast.op.InternalPop, 1); }
327
= знак_начала_массива перечень_элементов_массива "]" {
330
= знак_начала_массива "]" {
336
ast.addNode_StepInto(ast.op.DataStructure_Array, 0);
339
перечень_элементов_массива
340
= список_значений_массива
341
= список_значений_массива ","
343
список_значений_массива
345
= список_значений_массива "," элемент_массива
354
= знак_начала_кортежа перечень_элементов_кортежа "}" {
357
= знак_начала_кортежа "}" {
363
ast.addNode_StepInto(ast.op.DataStructure_Tuple, 0);
366
перечень_элементов_кортежа
367
= список_элементов_кортежа
368
= список_элементов_кортежа ","
370
список_элементов_кортежа
372
= список_элементов_кортежа "," элемент_кортежа
375
= наименование_элемента_кортежа ":" значение_элемента_кортежа {
379
наименование_элемента_кортежа
381
ast.addNode_StepInto(ast.op.None, 0);
384
ast.addNode_StepInto(ast.op.None, 0);
387
значение_элемента_кортежа
394
= use_as_type_часть_с_типом
397
// приводит к ошибке при определённой последовательности расположении операторов use as type
398
= use_as_type_часть_с_типом ID
399
{ ast.addNode(ast.op.Statement_Id, 1); ast.goParent(); }
401
use_as_type_часть_с_типом
402
= начало_оператора_use имя_модуля "as" "type" ID
403
{ ast.addNode(ast.op.Statement_Type, 4); }
406
= "use" { ast.addNode_StepInto(ast.op.Statement_UseAsType, 0); }
409
= ANNOTATION { ast.addNode(ast.op.None, 0); }
410
= ANNOTATION "(" ANNOTATION ")"
411
{ ast.addNode_StepInto(ast.op.None, 0); ast.addNode(ast.op.None, 2); ast.goParent(); }