eleetscript 0.0.17a → 0.0.18a
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/lang/grammar.y +155 -150
- data/lib/lang/interpreter.rb +34 -6
- data/lib/lang/parser.output +8044 -7815
- data/lib/lang/parser.rb +779 -764
- data/lib/lang/runtime/class.rb +0 -4
- data/lib/lang/runtime/class_instance.rb +5 -2
- data/lib/lang/runtime/class_skeleton.rb +1 -1
- data/lib/lang/runtime/context.rb +8 -3
- data/lib/lang/runtime/eleetscript/random.es +57 -0
- data/lib/lang/runtime/memory.rb +2 -1
- data/lib/lang/runtime/ruby/float_methods.rb +23 -0
- data/lib/lang/runtime/ruby/integer_methods.rb +13 -0
- data/lib/lang/runtime/ruby/random_methods.rb +57 -0
- data/lib/lang/runtime/ruby/string_methods.rb +9 -1
- metadata +6 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dc530b0273edb562c2c034db5ddc1a5b249c432c
|
4
|
+
data.tar.gz: e646c0873675104a2c4329c1e7219b359c0f57a0
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5deb5a637ceed11d5b3a9366e20477d5427516be91bfc062867d22e821385f76b44e468565feb6e534f7738fec2bfb7dc37559582765cf8ffb95b6988e680aff
|
7
|
+
data.tar.gz: 35b8eca3dceec5a9d81035aeb2d7455b2aea8c77e8dea20b1470ff1b9804a24e6073eb4bf2bd7b2dec7e5220484082ba9edd4a70b68693eb0a4d7250ddfd5d31
|
data/lib/lang/grammar.y
CHANGED
@@ -21,19 +21,19 @@ preclow
|
|
21
21
|
|
22
22
|
rule
|
23
23
|
Program:
|
24
|
-
/* nothing */
|
25
|
-
| Expressions EOF
|
24
|
+
/* nothing */ { result = Nodes.new([]) }
|
25
|
+
| Expressions EOF { result = val[0] }
|
26
26
|
;
|
27
27
|
|
28
28
|
Expressions:
|
29
|
-
Expression
|
30
|
-
| Expressions Terminator Expression
|
31
|
-
| Expressions Terminator
|
32
|
-
| Terminator
|
29
|
+
Expression { result = Nodes.new(val) }
|
30
|
+
| Expressions Terminator Expression { result = val[0] << val[2] }
|
31
|
+
| Expressions Terminator { result = val[0] }
|
32
|
+
| Terminator { result = Nodes.new([]) }
|
33
33
|
;
|
34
34
|
|
35
35
|
Terminator:
|
36
|
-
TERMINATOR Terminator
|
36
|
+
TERMINATOR Terminator { result = val[1] }
|
37
37
|
| TERMINATOR
|
38
38
|
;
|
39
39
|
|
@@ -41,8 +41,8 @@ rule
|
|
41
41
|
Literal
|
42
42
|
| AssignmentFunction
|
43
43
|
| Call
|
44
|
-
| SELF
|
45
|
-
| NEXT
|
44
|
+
| SELF { result = SelfNode.new }
|
45
|
+
| NEXT { result = NextNode.new }
|
46
46
|
| KeyValExpression
|
47
47
|
| ListExpression
|
48
48
|
| NamespaceAccess
|
@@ -58,55 +58,55 @@ rule
|
|
58
58
|
| Return
|
59
59
|
| Property
|
60
60
|
| Lambda
|
61
|
-
| '(' Expression ')'
|
61
|
+
| '(' Expression ')' { result = val[1] }
|
62
62
|
;
|
63
63
|
|
64
64
|
GetVariable:
|
65
|
-
CONSTANT
|
66
|
-
| GLOBAL
|
67
|
-
| CLASS_IDENTIFIER
|
68
|
-
| INSTANCE_IDENTIFIER
|
69
|
-
| IDENTIFIER
|
65
|
+
CONSTANT { result = GetConstantNode.new(val[0]) }
|
66
|
+
| GLOBAL { result = GetGlobalNode.new(val[0]) }
|
67
|
+
| CLASS_IDENTIFIER { result = GetClassVarNode.new(val[0]) }
|
68
|
+
| INSTANCE_IDENTIFIER { result = GetInstanceVarNode.new(val[0]) }
|
69
|
+
| IDENTIFIER { result = GetLocalNode.new(val[0]) }
|
70
70
|
;
|
71
71
|
|
72
72
|
Literal:
|
73
|
-
NUMBER
|
74
|
-
| FLOAT
|
75
|
-
| STRING
|
76
|
-
| True
|
77
|
-
| False
|
78
|
-
| NIL
|
73
|
+
NUMBER { result = IntegerNode.new(val[0].to_i) }
|
74
|
+
| FLOAT { result = FloatNode.new(val[0].to_f) }
|
75
|
+
| STRING { result = StringNode.new(val[0]) }
|
76
|
+
| True { result = TrueNode.new }
|
77
|
+
| False { result = FalseNode.new }
|
78
|
+
| NIL { result = NilNode.new }
|
79
79
|
| Regex
|
80
|
-
| SYMBOL
|
80
|
+
| SYMBOL { result = SymbolNode.new(val[0]) }
|
81
81
|
;
|
82
82
|
|
83
83
|
Regex:
|
84
|
-
REGEX REGEX_FLAGS
|
85
|
-
| REGEX
|
84
|
+
REGEX REGEX_FLAGS { result = RegexNode.new(val[0], val[1]) }
|
85
|
+
| REGEX { result = RegexNode.new(val[0], "") }
|
86
86
|
;
|
87
87
|
|
88
88
|
ListExpression:
|
89
89
|
List
|
90
|
-
| Expression '[' Expression ']' '=' Expression
|
91
|
-
| Expression '[' Expression ']'
|
90
|
+
| Expression '[' Expression ']' '=' Expression { result = CallNode.new(val[0], "[]=", [val[2], val[5]], nil) }
|
91
|
+
| Expression '[' Expression ']' { result = CallNode.new(val[0], "[]", [val[2]], nil) }
|
92
92
|
;
|
93
93
|
|
94
94
|
List:
|
95
|
-
'[' ']'
|
96
|
-
| '[' Terminator ExpressionList ']'
|
97
|
-
| '[' Terminator ExpressionList Terminator ']'
|
98
|
-
| '[' ExpressionList ']'
|
95
|
+
'[' ']' { result = CallNode.new(GetConstantNode.new("List"), "new", [], nil) }
|
96
|
+
| '[' Terminator ExpressionList ']' { result = CallNode.new(GetConstantNode.new("List"), "new", val[2], nil) }
|
97
|
+
| '[' Terminator ExpressionList Terminator ']' { result = CallNode.new(GetConstantNode.new("List"), "new", val[2], nil) }
|
98
|
+
| '[' ExpressionList ']' { result = CallNode.new(GetConstantNode.new("List"), "new", val[1], nil) }
|
99
99
|
;
|
100
100
|
|
101
101
|
ExpressionList:
|
102
|
-
Expression
|
103
|
-
| ExpressionList ',' Terminator Expression
|
104
|
-
| ExpressionList Terminator ',' Expression
|
105
|
-
| ExpressionList ',' Expression
|
102
|
+
Expression { result = val }
|
103
|
+
| ExpressionList ',' Terminator Expression { result = val[0] << val[3] }
|
104
|
+
| ExpressionList Terminator ',' Expression { result = val[0] << val[3] }
|
105
|
+
| ExpressionList ',' Expression { result = val[0] << val[2] }
|
106
106
|
;
|
107
107
|
|
108
108
|
KeyValExpression:
|
109
|
-
Expression '=>' Expression
|
109
|
+
Expression '=>' Expression { result = CallNode.new(GetConstantNode.new("Pair"), "new", [val[0], val[2]], nil) }
|
110
110
|
;
|
111
111
|
|
112
112
|
True:
|
@@ -122,122 +122,122 @@ rule
|
|
122
122
|
;
|
123
123
|
|
124
124
|
AssignmentFunction
|
125
|
-
Expression '.' IDENTIFIER '=' Expression
|
125
|
+
Expression '.' IDENTIFIER '=' Expression { result = CallNode.new(val[0], "#{val[2]}=", [val[4]], nil) }
|
126
126
|
;
|
127
127
|
|
128
128
|
Call:
|
129
|
-
IDENTIFIER Lambda
|
130
|
-
| IDENTIFIER Arguments Lambda
|
131
|
-
| IDENTIFIER Arguments
|
132
|
-
| Expression '.' IDENTIFIER Arguments Lambda
|
133
|
-
| Expression '.' IDENTIFIER Arguments
|
134
|
-
| Expression '.' IDENTIFIER Lambda
|
135
|
-
| Expression '.' IDENTIFIER
|
136
|
-
| Expression '.' Operator Arguments
|
137
|
-
| Expression '.' 'not'
|
129
|
+
IDENTIFIER Lambda { result = CallNode.new(nil, val[0], [], val[1]) }
|
130
|
+
| IDENTIFIER Arguments Lambda { result = CallNode.new(nil, val[0], val[1], val[2]) }
|
131
|
+
| IDENTIFIER Arguments { result = CallNode.new(nil, val[0], val[1], nil) }
|
132
|
+
| Expression '.' IDENTIFIER Arguments Lambda { result = CallNode.new(val[0], val[2], val[3], val[4]) }
|
133
|
+
| Expression '.' IDENTIFIER Arguments { result = CallNode.new(val[0], val[2], val[3], nil) }
|
134
|
+
| Expression '.' IDENTIFIER Lambda { result = CallNode.new(val[0], val[2], [], val[3]) }
|
135
|
+
| Expression '.' IDENTIFIER { result = CallNode.new(val[0], val[2], [], nil) }
|
136
|
+
| Expression '.' Operator Arguments { result = CallNode.new(val[0], val[2], val[3], nil) }
|
137
|
+
| Expression '.' 'not' { result = CallNode.new(val[0], val[2], [], nil) }
|
138
138
|
;
|
139
139
|
|
140
140
|
Arguments:
|
141
|
-
'(' ')'
|
142
|
-
| '(' ArgList ')'
|
141
|
+
'(' ')' { result = [] }
|
142
|
+
| '(' ArgList ')' { result = val[1] }
|
143
143
|
;
|
144
144
|
|
145
145
|
ArgList:
|
146
|
-
Expression
|
147
|
-
| ArgList ',' Expression
|
146
|
+
Expression { result = val }
|
147
|
+
| ArgList ',' Expression { result = val[0] << val[2] }
|
148
148
|
;
|
149
149
|
|
150
150
|
Lambda:
|
151
|
-
'->' '{' '}'
|
152
|
-
| '->' '{' Terminator '}'
|
153
|
-
| '->' '{' Parameters Expressions '}'
|
151
|
+
'->' '{' '}' { result = LambdaNode.new([], Nodes.new([])) }
|
152
|
+
| '->' '{' Terminator '}' { result = LambdaNode.new([], Nodes.new([])) }
|
153
|
+
| '->' '{' Parameters Expressions '}' { result = LambdaNode.new(val[2], val[3]) }
|
154
154
|
;
|
155
155
|
|
156
156
|
Defined:
|
157
|
-
DEFINED '(' GetVariable ')'
|
157
|
+
DEFINED '(' GetVariable ')' { result = DefinedNode.new(val[2]) }
|
158
158
|
;
|
159
159
|
|
160
160
|
NamespaceAccess:
|
161
|
-
CONSTANT '::' Expression
|
162
|
-
| '::' Expression
|
161
|
+
CONSTANT '::' Expression { result = NamespaceAccessNode.new(val[0], val[2]) }
|
162
|
+
| '::' Expression { result = NamespaceAccessNode.new(nil, val[1]) }
|
163
163
|
;
|
164
164
|
|
165
165
|
Operation:
|
166
|
-
Expression '+' Expression
|
167
|
-
| Expression '-' Expression
|
168
|
-
| '-' Expression
|
169
|
-
| Expression '*' Expression
|
170
|
-
| Expression '**' Expression
|
171
|
-
| Expression '/' Expression
|
172
|
-
| Expression '%' Expression
|
173
|
-
| Expression '>' Expression
|
174
|
-
| Expression '>=' Expression
|
175
|
-
| Expression '<' Expression
|
176
|
-
| Expression '<=' Expression
|
166
|
+
Expression '+' Expression { result = CallNode.new(val[0], val[1], [val[2]], nil) }
|
167
|
+
| Expression '-' Expression { result = CallNode.new(val[0], val[1], [val[2]], nil) }
|
168
|
+
| '-' Expression { result = CallNode.new(val[1], "negate", [], nil) }
|
169
|
+
| Expression '*' Expression { result = CallNode.new(val[0], val[1], [val[2]], nil) }
|
170
|
+
| Expression '**' Expression { result = CallNode.new(val[0], val[1], [val[2]], nil) }
|
171
|
+
| Expression '/' Expression { result = CallNode.new(val[0], val[1], [val[2]], nil) }
|
172
|
+
| Expression '%' Expression { result = CallNode.new(val[0], val[1], [val[2]], nil) }
|
173
|
+
| Expression '>' Expression { result = CallNode.new(val[0], val[1], [val[2]], nil) }
|
174
|
+
| Expression '>=' Expression { result = CallNode.new(val[0], val[1], [val[2]], nil) }
|
175
|
+
| Expression '<' Expression { result = CallNode.new(val[0], val[1], [val[2]], nil) }
|
176
|
+
| Expression '<=' Expression { result = CallNode.new(val[0], val[1], [val[2]], nil) }
|
177
177
|
| OperatorAssignment
|
178
|
-
| 'not' Expression
|
179
|
-
| Expression 'and' Expression
|
180
|
-
| Expression 'or' Expression
|
181
|
-
| Expression 'is' Expression
|
182
|
-
| Expression 'isnt' Expression
|
183
|
-
| Expression '=~' Expression
|
178
|
+
| 'not' Expression { result = CallNode.new(val[1], val[0], [], nil) }
|
179
|
+
| Expression 'and' Expression { result = CallNode.new(val[0], val[1], [val[2]], nil) }
|
180
|
+
| Expression 'or' Expression { result = CallNode.new(val[0], val[1], [val[2]], nil) }
|
181
|
+
| Expression 'is' Expression { result = CallNode.new(val[0], val[1], [val[2]], nil) }
|
182
|
+
| Expression 'isnt' Expression { result = CallNode.new(val[0], val[1], [val[2]], nil) }
|
183
|
+
| Expression '=~' Expression { result = CallNode.new(val[0], val[1], [val[2]], nil) }
|
184
184
|
;
|
185
185
|
|
186
186
|
OperatorAssignment:
|
187
|
-
CONSTANT '+=' Expression
|
188
|
-
| GLOBAL '+=' Expression
|
189
|
-
| CLASS_IDENTIFIER '+=' Expression
|
190
|
-
| INSTANCE_IDENTIFIER '+=' Expression
|
191
|
-
| IDENTIFIER '+=' Expression
|
192
|
-
| CONSTANT '-=' Expression
|
193
|
-
| GLOBAL '-=' Expression
|
194
|
-
| CLASS_IDENTIFIER '-=' Expression
|
195
|
-
| INSTANCE_IDENTIFIER '-=' Expression
|
196
|
-
| IDENTIFIER '-=' Expression
|
197
|
-
| CONSTANT '*=' Expression
|
198
|
-
| GLOBAL '*=' Expression
|
199
|
-
| CLASS_IDENTIFIER '*=' Expression
|
200
|
-
| INSTANCE_IDENTIFIER '*=' Expression
|
201
|
-
| IDENTIFIER '*=' Expression
|
202
|
-
| CONSTANT '/=' Expression
|
203
|
-
| GLOBAL '/=' Expression
|
204
|
-
| CLASS_IDENTIFIER '/=' Expression
|
205
|
-
| INSTANCE_IDENTIFIER '/=' Expression
|
206
|
-
| IDENTIFIER '/=' Expression
|
207
|
-
| CONSTANT '%=' Expression
|
208
|
-
| GLOBAL '%=' Expression
|
209
|
-
| CLASS_IDENTIFIER '%=' Expression
|
210
|
-
| INSTANCE_IDENTIFIER '%=' Expression
|
211
|
-
| IDENTIFIER '%=' Expression
|
212
|
-
| CONSTANT '**=' Expression
|
213
|
-
| GLOBAL '**=' Expression
|
214
|
-
| CLASS_IDENTIFIER '**=' Expression
|
215
|
-
| INSTANCE_IDENTIFIER '**=' Expression
|
216
|
-
| IDENTIFIER '**=' Expression
|
217
|
-
| IDENTIFIER '.=' IDENTIFIER Arguments Lambda
|
218
|
-
| IDENTIFIER '.=' IDENTIFIER Arguments
|
219
|
-
| IDENTIFIER '.=' IDENTIFIER
|
187
|
+
CONSTANT '+=' Expression { result = SetConstantNode.new(val[0], CallNode.new(GetConstantNode.new(val[0]), "+", [val[2]], nil)) }
|
188
|
+
| GLOBAL '+=' Expression { result = SetGlobalNode.new(val[0], CallNode.new(GetGlobalNode.new(val[0]), "+", [val[2]], nil)) }
|
189
|
+
| CLASS_IDENTIFIER '+=' Expression { result = SetClassVarNode.new(val[0], CallNode.new(GetClassVarNode.new(val[0]), "+", [val[2]], nil)) }
|
190
|
+
| INSTANCE_IDENTIFIER '+=' Expression { result = SetInstanceVarNode.new(val[0], CallNode.new(GetInstanceVarNode.new(val[0]), "+", [val[2]], nil)) }
|
191
|
+
| IDENTIFIER '+=' Expression { result = SetLocalNode.new(val[0], CallNode.new(GetLocalNode.new(val[0]), "+", [val[2]], nil)) }
|
192
|
+
| CONSTANT '-=' Expression { result = SetConstantNode.new(val[0], CallNode.new(GetConstantNode.new(val[0]), "-", [val[2]], nil)) }
|
193
|
+
| GLOBAL '-=' Expression { result = SetGlobalNode.new(val[0], CallNode.new(GetGlobalNode.new(val[0]), "-", [val[2]], nil)) }
|
194
|
+
| CLASS_IDENTIFIER '-=' Expression { result = SetClassVarNode.new(val[0], CallNode.new(GetClassVarNode.new(val[0]), "-", [val[2]], nil)) }
|
195
|
+
| INSTANCE_IDENTIFIER '-=' Expression { result = SetInstanceVarNode.new(val[0], CallNode.new(GetInstanceVarNode.new(val[0]), "-", [val[2]], nil)) }
|
196
|
+
| IDENTIFIER '-=' Expression { result = SetLocalNode.new(val[0], CallNode.new(GetLocalNode.new(val[0]), "-", [val[2]], nil)) }
|
197
|
+
| CONSTANT '*=' Expression { result = SetConstantNode.new(val[0], CallNode.new(GetConstantNode.new(val[0]), "*", [val[2]], nil)) }
|
198
|
+
| GLOBAL '*=' Expression { result = SetGlobalNode.new(val[0], CallNode.new(GetGlobalNode.new(val[0]), "*", [val[2]], nil)) }
|
199
|
+
| CLASS_IDENTIFIER '*=' Expression { result = SetClassVarNode.new(val[0], CallNode.new(GetClassVarNode.new(val[0]), "*", [val[2]], nil)) }
|
200
|
+
| INSTANCE_IDENTIFIER '*=' Expression { result = SetInstanceVarNode.new(val[0], CallNode.new(GetInstanceVarNode.new(val[0]), "*", [val[2]], nil)) }
|
201
|
+
| IDENTIFIER '*=' Expression { result = SetLocalNode.new(val[0], CallNode.new(GetLocalNode.new(val[0]), "*", [val[2]], nil)) }
|
202
|
+
| CONSTANT '/=' Expression { result = SetConstantNode.new(val[0], CallNode.new(GetConstantNode.new(val[0]), "/", [val[2]], nil)) }
|
203
|
+
| GLOBAL '/=' Expression { result = SetGlobalNode.new(val[0], CallNode.new(GetGlobalNode.new(val[0]), "/", [val[2]], nil)) }
|
204
|
+
| CLASS_IDENTIFIER '/=' Expression { result = SetClassVarNode.new(val[0], CallNode.new(GetClassVarNode.new(val[0]), "/", [val[2]], nil)) }
|
205
|
+
| INSTANCE_IDENTIFIER '/=' Expression { result = SetInstanceVarNode.new(val[0], CallNode.new(GetInstanceVarNode.new(val[0]), "/", [val[2]], nil)) }
|
206
|
+
| IDENTIFIER '/=' Expression { result = SetLocalNode.new(val[0], CallNode.new(GetLocalNode.new(val[0]), "/", [val[2]], nil)) }
|
207
|
+
| CONSTANT '%=' Expression { result = SetConstantNode.new(val[0], CallNode.new(GetConstantNode.new(val[0]), "%", [val[2]], nil)) }
|
208
|
+
| GLOBAL '%=' Expression { result = SetGlobalNode.new(val[0], CallNode.new(GetGlobalNode.new(val[0]), "%", [val[2]], nil)) }
|
209
|
+
| CLASS_IDENTIFIER '%=' Expression { result = SetClassVarNode.new(val[0], CallNode.new(GetClassVarNode.new(val[0]), "%", [val[2]], nil)) }
|
210
|
+
| INSTANCE_IDENTIFIER '%=' Expression { result = SetInstanceVarNode.new(val[0], CallNode.new(GetInstanceVarNode.new(val[0]), "%", [val[2]], nil)) }
|
211
|
+
| IDENTIFIER '%=' Expression { result = SetLocalNode.new(val[0], CallNode.new(GetLocalNode.new(val[0]), "%", [val[2]], nil)) }
|
212
|
+
| CONSTANT '**=' Expression { result = SetConstantNode.new(val[0], CallNode.new(GetConstantNode.new(val[0]), "**", [val[2]], nil)) }
|
213
|
+
| GLOBAL '**=' Expression { result = SetGlobalNode.new(val[0], CallNode.new(GetGlobalNode.new(val[0]), "**", [val[2]], nil)) }
|
214
|
+
| CLASS_IDENTIFIER '**=' Expression { result = SetClassVarNode.new(val[0], CallNode.new(GetClassVarNode.new(val[0]), "**", [val[2]], nil)) }
|
215
|
+
| INSTANCE_IDENTIFIER '**=' Expression { result = SetInstanceVarNode.new(val[0], CallNode.new(GetInstanceVarNode.new(val[0]), "**", [val[2]], nil)) }
|
216
|
+
| IDENTIFIER '**=' Expression { result = SetLocalNode.new(val[0], CallNode.new(GetLocalNode.new(val[0]), "**", [val[2]], nil)) }
|
217
|
+
| IDENTIFIER '.=' IDENTIFIER Arguments Lambda { result = SetLocalNode.new(val[0], CallNode.new(GetLocalNode.new(val[0]), val[2], val[3], val[4])) }
|
218
|
+
| IDENTIFIER '.=' IDENTIFIER Arguments { result = SetLocalNode.new(val[0], CallNode.new(GetLocalNode.new(val[0]), val[2], val[3], nil)) }
|
219
|
+
| IDENTIFIER '.=' IDENTIFIER { result = SetLocalNode.new(val[0], CallNode.new(GetLocalNode.new(val[0]), val[2], [], nil)) }
|
220
220
|
;
|
221
221
|
|
222
222
|
SetVariable:
|
223
|
-
CONSTANT '=' Literal
|
224
|
-
| GLOBAL '=' Expression
|
225
|
-
| CLASS_IDENTIFIER '=' Expression
|
226
|
-
| INSTANCE_IDENTIFIER '=' Expression
|
227
|
-
| IDENTIFIER '=' Expression
|
223
|
+
CONSTANT '=' Literal { result = SetConstantNode.new(val[0], val[2]) }
|
224
|
+
| GLOBAL '=' Expression { result = SetGlobalNode.new(val[0], val[2]) }
|
225
|
+
| CLASS_IDENTIFIER '=' Expression { result = SetClassVarNode.new(val[0], val[2]) }
|
226
|
+
| INSTANCE_IDENTIFIER '=' Expression { result = SetInstanceVarNode.new(val[0], val[2]) }
|
227
|
+
| IDENTIFIER '=' Expression { result = SetLocalNode.new(val[0], val[2]) }
|
228
228
|
;
|
229
229
|
|
230
230
|
DefMethod:
|
231
|
-
IDENTIFIER MethodBlock
|
232
|
-
| CLASS_IDENTIFIER MethodBlock
|
233
|
-
| Operator MethodBlock
|
234
|
-
| '[' ']' '=' MethodBlock
|
235
|
-
| '[' ']' MethodBlock
|
231
|
+
IDENTIFIER MethodBlock { result = DefMethodNode.new(val[0], val[1]) }
|
232
|
+
| CLASS_IDENTIFIER MethodBlock { result = DefMethodNode.new(val[0], val[1]) }
|
233
|
+
| Operator MethodBlock { result = DefMethodNode.new(val[0], val[1]) }
|
234
|
+
| '[' ']' '=' MethodBlock { result = DefMethodNode.new("[]=", val[3]) }
|
235
|
+
| '[' ']' MethodBlock { result = DefMethodNode.new("[]", val[2]) }
|
236
236
|
;
|
237
237
|
|
238
238
|
MethodBlock:
|
239
|
-
DO Parameters Expressions END
|
240
|
-
| DO Parameters END
|
239
|
+
DO Parameters Expressions END { result = MethodNode.new(val[1], val[2]) }
|
240
|
+
| DO Parameters END { result = MethodNode.new(val[1], Nodes.new([])) }
|
241
241
|
;
|
242
242
|
|
243
243
|
Operator:
|
@@ -262,73 +262,78 @@ rule
|
|
262
262
|
;
|
263
263
|
|
264
264
|
Parameters:
|
265
|
-
/* nothing */
|
266
|
-
| Terminator
|
267
|
-
| '|' ParamList '|' Terminator
|
268
|
-
| '|' ParamList '|'
|
265
|
+
/* nothing */ { result = [] }
|
266
|
+
| Terminator { result = [] }
|
267
|
+
| '|' ParamList '|' Terminator { result = val[1] }
|
268
|
+
| '|' ParamList '|' { result = val[1] }
|
269
269
|
;
|
270
270
|
|
271
271
|
ParamList:
|
272
|
-
Parameter
|
273
|
-
| ParamList ',' Parameter
|
272
|
+
Parameter { result = val }
|
273
|
+
| ParamList ',' Parameter { result = val[0] << val[2] }
|
274
274
|
;
|
275
275
|
|
276
276
|
Parameter:
|
277
|
-
IDENTIFIER
|
278
|
-
| INSTANCE_IDENTIFIER
|
279
|
-
| CLASS_IDENTIFIER
|
277
|
+
IDENTIFIER { result = val[0] }
|
278
|
+
| INSTANCE_IDENTIFIER { result = val[0] }
|
279
|
+
| CLASS_IDENTIFIER { result = val[0] }
|
280
280
|
;
|
281
281
|
|
282
282
|
Namespace:
|
283
|
-
NAMESPACE CONSTANT Expressions END
|
284
|
-
| NAMESPACE CONSTANT Terminator Expressions END
|
285
|
-
| NAMESPACE CONSTANT END
|
283
|
+
NAMESPACE CONSTANT Expressions END { result = NamespaceNode.new(val[1], val[2]) }
|
284
|
+
| NAMESPACE CONSTANT Terminator Expressions END { result = NamespaceNode.new(val[1], val[3]) }
|
285
|
+
| NAMESPACE CONSTANT END { result = NamespaceNode.new(val[1], Nodes.new([])) }
|
286
286
|
;
|
287
287
|
|
288
288
|
Class:
|
289
|
-
CLASS
|
290
|
-
| CLASS
|
291
|
-
| CLASS
|
292
|
-
| CLASS
|
293
|
-
| CLASS
|
294
|
-
| CLASS
|
295
|
-
| CLASS
|
296
|
-
| CLASS
|
289
|
+
CLASS ClassName Expressions END { result = ClassNode.new(val[1], nil, val[2]) }
|
290
|
+
| CLASS ClassName Terminator Expressions END { result = ClassNode.new(val[1], nil, val[3]) }
|
291
|
+
| CLASS ClassName END { result = ClassNode.new(val[1], nil, Nodes.new([])) }
|
292
|
+
| CLASS ClassName Terminator END { result = ClassNode.new(val[1], nil, Nodes.new([])) }
|
293
|
+
| CLASS ClassName '<' ClassName Expressions END { result = ClassNode.new(val[1], val[3], val[4]) }
|
294
|
+
| CLASS ClassName '<' ClassName Terminator Expressions END { result = ClassNode.new(val[1], val[3], val[5]) }
|
295
|
+
| CLASS ClassName '<' ClassName END { result = ClassNode.new(val[1], val[3], Nodes.new([])) }
|
296
|
+
| CLASS ClassName '<' ClassName Terminator END { result = ClassNode.new(val[1], val[3], Nodes.new([])) }
|
297
|
+
;
|
298
|
+
|
299
|
+
ClassName:
|
300
|
+
CONSTANT
|
301
|
+
| NamespaceAccess
|
297
302
|
;
|
298
303
|
|
299
304
|
If:
|
300
|
-
IF Expression Terminator Expressions END
|
301
|
-
| IF Expression Terminator Expressions Else
|
305
|
+
IF Expression Terminator Expressions END { result = IfNode.new(val[1], val[3], nil) }
|
306
|
+
| IF Expression Terminator Expressions Else { result = IfNode.new(val[1], val[3], val[4]) }
|
302
307
|
;
|
303
308
|
|
304
309
|
Else:
|
305
|
-
ELSE Terminator Expressions Terminator END
|
306
|
-
| ELSE Terminator Expressions END
|
310
|
+
ELSE Terminator Expressions Terminator END { result = ElseNode.new(val[2]) }
|
311
|
+
| ELSE Terminator Expressions END { result = ElseNode.new(val[2]) }
|
307
312
|
| ElseIf
|
308
313
|
;
|
309
314
|
|
310
315
|
ElseIf:
|
311
|
-
ELSIF Expression Terminator Expressions END
|
312
|
-
| ELSIF Expression Terminator Expressions Else
|
316
|
+
ELSIF Expression Terminator Expressions END { result = ElseNode.new(IfNode.new(val[1], val[3], nil)) }
|
317
|
+
| ELSIF Expression Terminator Expressions Else { result = ElseNode.new(IfNode.new(val[1], val[3], val[4])) }
|
313
318
|
;
|
314
319
|
|
315
320
|
While:
|
316
|
-
WHILE Expression Terminator Expressions END
|
321
|
+
WHILE Expression Terminator Expressions END { result = WhileNode.new(val[1], val[3]) }
|
317
322
|
;
|
318
323
|
|
319
324
|
Return:
|
320
|
-
RETURN Expression
|
321
|
-
| RETURN
|
325
|
+
RETURN Expression { result = ReturnNode.new(val[1]) }
|
326
|
+
| RETURN { result = ReturnNode.new(nil) }
|
322
327
|
;
|
323
328
|
|
324
329
|
Property:
|
325
|
-
PROPERTY IDENTIFIER
|
326
|
-
| PROPERTY PropertyList
|
330
|
+
PROPERTY IDENTIFIER { result = PropertyNode.new([val[1]]) }
|
331
|
+
| PROPERTY PropertyList { result = PropertyNode.new(val[1]) }
|
327
332
|
;
|
328
333
|
|
329
334
|
PropertyList:
|
330
|
-
IDENTIFIER IDENTIFIER
|
331
|
-
| PropertyList IDENTIFIER
|
335
|
+
IDENTIFIER IDENTIFIER { result = [val[0], val[1]] }
|
336
|
+
| PropertyList IDENTIFIER { result = val[0] << val[1] }
|
332
337
|
;
|
333
338
|
|
334
339
|
end
|
data/lib/lang/interpreter.rb
CHANGED
@@ -244,21 +244,49 @@ module EleetScript
|
|
244
244
|
|
245
245
|
class ClassNode
|
246
246
|
def eval(context)
|
247
|
-
cls = context
|
247
|
+
cls_name, ns_context, cls = details_from_class_name(context)
|
248
|
+
return context.es_nil if cls_name.nil? && ns_context.nil? && cls.nil?
|
248
249
|
if cls == context.es_nil
|
249
250
|
cls = if parent
|
250
|
-
parent_cls =
|
251
|
-
|
252
|
-
|
251
|
+
parent_cls = if parent.kind_of?(String)
|
252
|
+
context[parent]
|
253
|
+
else
|
254
|
+
parent.eval(context)
|
255
|
+
end
|
256
|
+
# TODO: Add to_source for all nodes
|
257
|
+
Helpers.throw_eleet_error("Attempt to extend undefined class.", context) if parent_cls == context.es_nil
|
258
|
+
EleetScriptClass.create(context, cls_name, parent_cls)
|
253
259
|
else
|
254
|
-
EleetScriptClass.create(context,
|
260
|
+
EleetScriptClass.create(context, cls_name)
|
255
261
|
end
|
256
|
-
|
262
|
+
ns_context[cls_name] = cls
|
257
263
|
end
|
258
264
|
|
259
265
|
body.eval(cls.context)
|
260
266
|
cls
|
261
267
|
end
|
268
|
+
|
269
|
+
def details_from_class_name(context)
|
270
|
+
if name.kind_of?(String)
|
271
|
+
return name, context.namespace_context, context.local_constant(name)
|
272
|
+
else
|
273
|
+
ns = if name.namespace.nil?
|
274
|
+
context.root_ns
|
275
|
+
else
|
276
|
+
context.namespace(name.namespace)
|
277
|
+
end
|
278
|
+
exp = name.expression
|
279
|
+
while exp.kind_of?(NamespaceAccessNode)
|
280
|
+
ns = ns.namespace(exp.namespace)
|
281
|
+
exp = exp.expression
|
282
|
+
end
|
283
|
+
if !exp.kind_of?(GetConstantNode)
|
284
|
+
Helpers.throw_eleet_error("Invalid class name given.", context)
|
285
|
+
return nil, nil, nil
|
286
|
+
end
|
287
|
+
return exp.name, ns, ns.local_constant(exp.name)
|
288
|
+
end
|
289
|
+
end
|
262
290
|
end
|
263
291
|
|
264
292
|
class PropertyNode
|