1
/* Описание грамматики выражений
7
Copyright (c) 2021 МГТУ им. Н.Э. Баумана, кафедра ИУ-6, Михаил Фетисов,
9
https://bmstu.codes/lsx/simodo/stars
12
// Описание грамматики выражений
15
lex.addMarkup("/*", "*/", "", lex.LexemeType.Comment);
16
lex.addMarkup("//", "", "", lex.LexemeType.Comment);
17
lex.addMarkup("\"", "\"", "\\", lex.LexemeType.Annotation);
20
lex.addMask("'bN", lex.LexemeType.Number, 2);
21
lex.addMask("'oN", lex.LexemeType.Number, 8);
22
lex.addMask("'hN", lex.LexemeType.Number, 16);
23
lex.addMask("@BUILDING_NUMBER_MASK", lex.LexemeType.Number, 10);
28
= выражение тернарная_операция
31
= тернарная_операция_знак_1 выражение тернарная_операция_знак_2 выражение >
32
{ ast.goParent(); ast.goParent(); }
34
тернарная_операция_знак_1
36
ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.Ternary, 0);
37
ast.addNode_StepInto(ast.sbl.host, ast.sbl1.op.If_True_Body, 0);
40
тернарная_операция_знак_2
41
= ":" { ast.goParent(); ast.addNode_StepInto(ast.sbl.host, ast.sbl1.op.If_Else_Body, 0); }
45
= оператор_ИЛИ "||" оператор_И
46
{ ast.addNode(ast.sbl.host, ast.sbl.op.Or, 1); }
50
= оператор_И "&&" оператор_сравнения
51
{ ast.addNode(ast.sbl.host, ast.sbl.op.And, 1); }
54
= арифметический_оператор
55
= оператор_сравнения "==" арифметический_оператор
56
{ ast.addNode(ast.sv.host, ast.sv.op.Equal, 1); }
57
= оператор_сравнения "!=" арифметический_оператор
58
{ ast.addNode(ast.sv.host, ast.sv.op.NotEqual, 1); }
59
= оператор_сравнения "<" арифметический_оператор
60
{ ast.addNode(ast.sv.host, ast.sv.op.Less, 1); }
61
= оператор_сравнения "<=" арифметический_оператор
62
{ ast.addNode(ast.sv.host, ast.sv.op.LessOrEqual, 1); }
63
= оператор_сравнения ">" арифметический_оператор
64
{ ast.addNode(ast.sv.host, ast.sv.op.More, 1); }
65
= оператор_сравнения ">=" арифметический_оператор
66
{ ast.addNode(ast.sv.host, ast.sv.op.MoreOrEqual, 1); }
68
арифметический_оператор
69
= арифметический_оператор_мультипликатор
70
= арифметический_оператор "+" арифметический_оператор_мультипликатор
71
{ ast.addNode(ast.sbl.host, ast.sbl.op.Addition, 1); }
72
= арифметический_оператор "-" арифметический_оператор_мультипликатор
73
{ ast.addNode(ast.sbl.host, ast.sbl.op.Subtraction, 1); }
75
арифметический_оператор_мультипликатор
76
= возведение_в_степень
77
= арифметический_оператор_мультипликатор "*" возведение_в_степень
78
{ ast.addNode(ast.sbl.host, ast.sbl.op.Multiplication, 1); }
79
= арифметический_оператор_мультипликатор "/" возведение_в_степень
80
{ ast.addNode(ast.sbl.host, ast.sbl.op.Division, 1); }
81
= арифметический_оператор_мультипликатор "%" возведение_в_степень
82
{ ast.addNode(ast.sbl.host, ast.sbl.op.Modulo, 1); }
86
= возведение_в_степень "^" унарный_оператор
87
{ ast.addNode(ast.sbl.host, ast.sbl.op.Power, 1); }
91
= "+" величина { ast.addNode(ast.sbl.host, ast.sbl.op.Plus, 0); }
92
= "-" величина { ast.addNode(ast.sbl.host, ast.sbl.op.Minus, 0); }
93
= "!" величина { ast.addNode(ast.sbl.host, ast.sbl.op.Not, 0); }
97
= базовая_константа > { ast.goParent(); }
98
= "true" { ast.addNode(ast.sbl.host, ast.sbl.op.PushConstant, 0); }
99
= "false" { ast.addNode(ast.sbl.host, ast.sbl.op.PushConstant, 0); }
100
// = "undef" { ast.addNode(ast.sbl.host, ast.sbl.op.PushConstant, 0); }
101
= "null" { ast.addNode(ast.sbl.host, ast.sbl.op.PushConstant, 0); }
106
= NUMBER { ast.addNode_StepInto(ast.sv.host, ast.sv.op.PushConst, 0); }
107
= ANNOTATION { ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.PushConstant, 0); }
112
= переменная операторы_адреса
116
= ID { ast.addNode(ast.sbl.host, ast.sbl.op.PushVariable, 0); }
121
= операторы_адреса оператор_адреса
125
= "." ID { ast.addNode(ast.sbl.host, ast.sbl.op.ObjectElement, 1); }
126
= знак_массива список_выражений "]"
128
= знак_функции список_выражений ")"
134
= "[" { ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.ArrayElement, 0); }
137
= "(" { ast.addNode_StepInto(ast.sbl.host, ast.sbl.op.FunctionCall, 0); }
140
= элемент_списка_выражений
141
= список_выражений "," элемент_списка_выражений
143
элемент_списка_выражений = выражение;