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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cda030af5d597bad4202bfb153eb6fd35b7d0d79
4
- data.tar.gz: 5ca3d822978e7008a672f46c302ea3ff0aee8666
3
+ metadata.gz: dc530b0273edb562c2c034db5ddc1a5b249c432c
4
+ data.tar.gz: e646c0873675104a2c4329c1e7219b359c0f57a0
5
5
  SHA512:
6
- metadata.gz: 50172cc578133afd458336c3a81b10f276531c2ed91fc1f946e9e5ce0a972c8bfef67d6d3e315bdd84688a0f5b7666add153e6c901284df70bb4a3fa2eb88453
7
- data.tar.gz: 87c7676cf9c776dfce85a64d467e2a9f6987d8549bc908603e5783b71f5405755e8c3830f6a19b45b6ec42e3dd72d4e9f5c14e942d40342d34bb62187a86c621
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 */ { result = Nodes.new([]) }
25
- | Expressions EOF { result = val[0] }
24
+ /* nothing */ { result = Nodes.new([]) }
25
+ | Expressions EOF { result = val[0] }
26
26
  ;
27
27
 
28
28
  Expressions:
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([]) }
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 { result = SelfNode.new }
45
- | NEXT { result = NextNode.new }
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 ')' { result = val[1] }
61
+ | '(' Expression ')' { result = val[1] }
62
62
  ;
63
63
 
64
64
  GetVariable:
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]) }
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 { 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 }
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 { result = SymbolNode.new(val[0]) }
80
+ | SYMBOL { result = SymbolNode.new(val[0]) }
81
81
  ;
82
82
 
83
83
  Regex:
84
- REGEX REGEX_FLAGS { result = RegexNode.new(val[0], val[1]) }
85
- | REGEX { result = RegexNode.new(val[0], "") }
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 { result = CallNode.new(val[0], "[]=", [val[2], val[5]], nil) }
91
- | Expression '[' Expression ']' { result = CallNode.new(val[0], "[]", [val[2]], nil) }
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
- '[' ']' { 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) }
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 { 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] }
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 { result = CallNode.new(GetConstantNode.new("Pair"), "new", [val[0], val[2]], nil) }
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 { result = CallNode.new(val[0], "#{val[2]}=", [val[4]], nil) }
125
+ Expression '.' IDENTIFIER '=' Expression { result = CallNode.new(val[0], "#{val[2]}=", [val[4]], nil) }
126
126
  ;
127
127
 
128
128
  Call:
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) }
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
- '(' ')' { result = [] }
142
- | '(' ArgList ')' { result = val[1] }
141
+ '(' ')' { result = [] }
142
+ | '(' ArgList ')' { result = val[1] }
143
143
  ;
144
144
 
145
145
  ArgList:
146
- Expression { result = val }
147
- | ArgList ',' Expression { result = val[0] << val[2] }
146
+ Expression { result = val }
147
+ | ArgList ',' Expression { result = val[0] << val[2] }
148
148
  ;
149
149
 
150
150
  Lambda:
151
- '->' '{' '}' { result = LambdaNode.new([], Nodes.new([])) }
152
- | '->' '{' Terminator '}' { result = LambdaNode.new([], Nodes.new([])) }
153
- | '->' '{' Parameters Expressions '}' { result = LambdaNode.new(val[2], val[3]) }
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 ')' { result = DefinedNode.new(val[2]) }
157
+ DEFINED '(' GetVariable ')' { result = DefinedNode.new(val[2]) }
158
158
  ;
159
159
 
160
160
  NamespaceAccess:
161
- CONSTANT '::' Expression { result = NamespaceAccessNode.new(val[0], val[2]) }
162
- | '::' Expression { result = NamespaceAccessNode.new(nil, val[1]) }
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 { 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) }
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 { 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) }
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 { 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)) }
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 { 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]) }
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 { 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]) }
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 { result = MethodNode.new(val[1], val[2]) }
240
- | DO Parameters END { result = MethodNode.new(val[1], Nodes.new([])) }
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 */ { result = [] }
266
- | Terminator { result = [] }
267
- | '|' ParamList '|' Terminator { result = val[1] }
268
- | '|' ParamList '|' { result = val[1] }
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 { result = val }
273
- | ParamList ',' Parameter { result = val[0] << val[2] }
272
+ Parameter { result = val }
273
+ | ParamList ',' Parameter { result = val[0] << val[2] }
274
274
  ;
275
275
 
276
276
  Parameter:
277
- IDENTIFIER { result = val[0] }
278
- | INSTANCE_IDENTIFIER { result = val[0] }
279
- | CLASS_IDENTIFIER { result = val[0] }
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 { 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([])) }
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 CONSTANT Expressions END { result = ClassNode.new(val[1], nil, val[2]) }
290
- | CLASS CONSTANT Terminator Expressions END { result = ClassNode.new(val[1], nil, val[3]) }
291
- | CLASS CONSTANT END { result = ClassNode.new(val[1], nil, Nodes.new([])) }
292
- | CLASS CONSTANT Terminator END { result = ClassNode.new(val[1], nil, Nodes.new([])) }
293
- | CLASS CONSTANT '<' CONSTANT Expressions END { result = ClassNode.new(val[1], val[3], val[4]) }
294
- | CLASS CONSTANT '<' CONSTANT Terminator Expressions END { result = ClassNode.new(val[1], val[3], val[5]) }
295
- | CLASS CONSTANT '<' CONSTANT END { result = ClassNode.new(val[1], val[3], Nodes.new([])) }
296
- | CLASS CONSTANT '<' CONSTANT Terminator END { result = ClassNode.new(val[1], val[3], Nodes.new([])) }
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 { result = IfNode.new(val[1], val[3], nil) }
301
- | IF Expression Terminator Expressions Else { result = IfNode.new(val[1], val[3], val[4]) }
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 { result = ElseNode.new(val[2]) }
306
- | ELSE Terminator Expressions END { result = ElseNode.new(val[2]) }
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 { result = ElseNode.new(IfNode.new(val[1], val[3], nil)) }
312
- | ELSIF Expression Terminator Expressions Else { result = ElseNode.new(IfNode.new(val[1], val[3], val[4])) }
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 { result = WhileNode.new(val[1], val[3]) }
321
+ WHILE Expression Terminator Expressions END { result = WhileNode.new(val[1], val[3]) }
317
322
  ;
318
323
 
319
324
  Return:
320
- RETURN Expression { result = ReturnNode.new(val[1]) }
321
- | RETURN { result = ReturnNode.new(nil) }
325
+ RETURN Expression { result = ReturnNode.new(val[1]) }
326
+ | RETURN { result = ReturnNode.new(nil) }
322
327
  ;
323
328
 
324
329
  Property:
325
- PROPERTY IDENTIFIER { result = PropertyNode.new([val[1]]) }
326
- | PROPERTY PropertyList { result = PropertyNode.new(val[1]) }
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 { result = [val[0], val[1]] }
331
- | PropertyList IDENTIFIER { result = val[0] << val[1] }
335
+ IDENTIFIER IDENTIFIER { result = [val[0], val[1]] }
336
+ | PropertyList IDENTIFIER { result = val[0] << val[1] }
332
337
  ;
333
338
 
334
339
  end
@@ -244,21 +244,49 @@ module EleetScript
244
244
 
245
245
  class ClassNode
246
246
  def eval(context)
247
- cls = context[name]
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 = context[parent]
251
- throw "Cannot extend undefined class \"#{parent}\"." if parent_cls == context.es_nil
252
- EleetScriptClass.create(context, name, parent_cls)
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, name)
260
+ EleetScriptClass.create(context, cls_name)
255
261
  end
256
- context[name] = cls
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