1
main объявления_и_определения;
5
объявления_и_определения
6
// = упрощённый_оператор_импорта
7
= начало_перечня_контрактов определение_контракта
8
= начало_перечня_контрактов определение_типа
9
= начало_перечня_контрактов определение_типа инициализация_переменной
10
= начало_перечня_контрактов определение_типа ":" список_определений_переменных
11
= начало_перечня_контрактов ":" список_определений_переменных
12
= начало_перечня_контрактов перечень_контрактов определение_контракта
13
= начало_перечня_контрактов перечень_контрактов определение_типа
14
= начало_перечня_контрактов перечень_контрактов определение_типа инициализация_переменной
15
= начало_перечня_контрактов перечень_контрактов определение_типа ":" список_определений_переменных
16
= начало_перечня_контрактов перечень_контрактов ":" список_определений_переменных
19
/// \note Упрощённый оператор создаёт неопределённость для следующего оператора при разборе
20
//упрощённый_оператор_импорта
22
// ast.addNode(ast.sbl.host, ast.sbl.op.Import, 1);
23
// ast.addNode(ast.sbl.host, ast.sbl.op.Announcement, 1);
24
// ast.addNode(ast.sbl.host, ast.sbl.op.Declaration, 1);
28
начало_перечня_контрактов
29
= ключевое_слово_начала_перечня_контрактов контракт
30
= импорт { ast.addNode(ast.sbl.host, ast.sbl.op.Announcement, 0); }
31
= "#" структура_объекта { ast.addNode(ast.sbl.host, ast.sbl.op.Announcement, 0); }
34
ключевое_слово_начала_перечня_контрактов
41
= перечень_контрактов контракт
45
= адрес { ast.addNode(ast.sbl.host, ast.sbl.op.Announcement, 0); }
46
= импорт { ast.addNode(ast.sbl.host, ast.sbl.op.Announcement, 0); }
47
= "#" структура_объекта { ast.addNode(ast.sbl.host, ast.sbl.op.Announcement, 0); }
51
= "import" ANNOTATION { ast.addNode(ast.sbl.host, ast.sbl.op.Import, 1); }
52
= "import" ID { ast.addNode(ast.sbl.host, ast.sbl.op.Import, 1); }
56
= "type" ID { ast.addNode(ast.sbl.host, ast.sbl.op.Type, 1); }
60
= "contract" ID { ast.addNode(ast.sbl.host, ast.sbl.op.Contract, 1); }
63
список_определений_переменных
64
= объявление_или_определение_переменной
65
= список_определений_переменных "," объявление_или_определение_переменной
68
объявление_или_определение_переменной
69
= объявление_переменной
70
= объявление_переменной инициализация_переменной
74
= ID { ast.addNode(ast.sbl.host, ast.sbl.op.Declaration, 0); }
75
/// \note Не уверен, что все впомогательные операторы нужно отражать в синтаксисе - это его перегружает
76
// = "/" ID { ast.addNode(ast.sbl.host, ast.sbl.op.DeclarationOnce, 1); }
79
инициализация_переменной
80
= знак_инициализации правая_часть_присваивания
81
{ ast.goParent(); ast.addNode(ast.sbl.host, ast.sbl.op.PostInitialize, 0); }
85
= "=" { ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.Initialize, 0); }
88
правая_часть_присваивания