Skip to content

Commit ae729ce

Browse files
committed
💡 Documenting source code.
1 parent 8002cd5 commit ae729ce

File tree

3 files changed

+111
-12
lines changed

3 files changed

+111
-12
lines changed

README-ZH.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,9 +273,9 @@ varInner=22, varExternal=14
273273
- `+-*/`
274274
- `== != < <= > >=`
275275

276-
> 重载函数名称必须是 `operator`,名称后跟上运算符即可重载。
276+
> 重载函数名称必须是 **operator**,名称后跟上运算符即可重载。
277277
278-
```c#
278+
```js
279279
class Person{
280280
int age;
281281
Person(int a){

README.md

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,6 +267,101 @@ varInner=22, varExternal=14
267267

268268
```
269269

270+
## Operator overloading
271+
272+
Operator that `Gscript` support:
273+
274+
- `+-*/`
275+
- `== != < <= > >=`
276+
277+
> Overloading function must be **operator**, and append operator.
278+
279+
```js
280+
class Person{
281+
int age;
282+
Person(int a){
283+
age = a;
284+
}
285+
}
286+
Person operator + (Person p1, Person p2){
287+
Person pp = Person(p1.age+p2.age);
288+
return pp;
289+
}
290+
Person operator - (Person p1, Person p2){
291+
Person pp = Person(p1.age-p2.age);
292+
return pp;
293+
}
294+
Person operator * (Person p1, Person p2){
295+
Person pp = Person(p1.age * p2.age);
296+
return pp;
297+
}
298+
Person operator / (Person p1, Person p2){
299+
Person pp = Person(p1.age / p2.age);
300+
return pp;
301+
}
302+
bool operator == (Person p1, Person p2){
303+
return p1.age==p2.age;
304+
}
305+
bool operator != (Person p1, Person p2){
306+
return p1.age!=p2.age;
307+
}
308+
bool operator > (Person p1, Person p2){
309+
return p1.age>p2.age;
310+
}
311+
bool operator >= (Person p1, Person p2){
312+
return p1.age>=p2.age;
313+
}
314+
bool operator < (Person p1, Person p2){
315+
return p1.age<p2.age;
316+
}
317+
bool operator <= (Person p1, Person p2){
318+
return p1.age<=p2.age;
319+
}
320+
Person p1 = Person(10);
321+
Person p2 = Person(20);
322+
//Person p3 = operator(p1,p2);
323+
Person p3 = p1+p2;
324+
println("p3.age="+p3.age);
325+
assertEqual(p3.age, 30);
326+
327+
Person p4 = p1-p2;
328+
println("p4.age="+p4.age);
329+
println(100-10);
330+
331+
Person p5 = p1*p2;
332+
println("p5.age="+p5.age);
333+
assertEqual(p5.age, 200);
334+
335+
Person p6 = p2/p1;
336+
println("p6.age="+p6.age);
337+
assertEqual(p6.age, 2);
338+
339+
bool b1 = p1 == p2;
340+
println("b1=="+b1);
341+
assertEqual(b1,false);
342+
343+
bool b2 = p1 != p2;
344+
println("b2=="+b2);
345+
assertEqual(b2,true);
346+
347+
bool b3 = p1 > p2;
348+
println("b3=="+b3);
349+
assertEqual(b3,false);
350+
351+
bool b4 = p1 >= p2;
352+
println("b4=="+b4);
353+
assertEqual(b4,false);
354+
355+
bool b5 = p1 < p2;
356+
println("b5=="+b5);
357+
assertEqual(b5,true);
358+
359+
bool b6 = p1 <= p2;
360+
println("b6=="+b6);
361+
assertEqual(b6,true);
362+
```
363+
364+
270365
More examples: [https://github.com/crossoverJie/gscript/tree/main/example](https://github.com/crossoverJie/gscript/tree/main/example)
271366

272367
# Standard library

resolver/type_scope_resolver.go

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -126,26 +126,30 @@ func (t *TypeScopeResolver) ExitClassDeclaration(ctx *parser.ClassDeclarationCon
126126
// EnterOperatorOverloading is called when production operatorOverloading is entered.
127127
func (t *TypeScopeResolver) EnterOperatorOverloading(ctx *parser.OperatorOverloadingContext) {
128128
var opOverload *symbol.OpOverload
129+
function, ok := t.currentScope().(*symbol.Func)
130+
if !ok || function.GetName() != symbol.OperName {
131+
return
132+
}
129133
if ctx.PLUS() != nil {
130-
opOverload = symbol.NewOpOverload(t.currentScope().(*symbol.Func), ctx.PLUS().GetSymbol().GetTokenType())
134+
opOverload = symbol.NewOpOverload(function, ctx.PLUS().GetSymbol().GetTokenType())
131135
} else if ctx.SUB() != nil {
132-
opOverload = symbol.NewOpOverload(t.currentScope().(*symbol.Func), ctx.SUB().GetSymbol().GetTokenType())
136+
opOverload = symbol.NewOpOverload(function, ctx.SUB().GetSymbol().GetTokenType())
133137
} else if ctx.MULT() != nil {
134-
opOverload = symbol.NewOpOverload(t.currentScope().(*symbol.Func), ctx.MULT().GetSymbol().GetTokenType())
138+
opOverload = symbol.NewOpOverload(function, ctx.MULT().GetSymbol().GetTokenType())
135139
} else if ctx.DIV() != nil {
136-
opOverload = symbol.NewOpOverload(t.currentScope().(*symbol.Func), ctx.DIV().GetSymbol().GetTokenType())
140+
opOverload = symbol.NewOpOverload(function, ctx.DIV().GetSymbol().GetTokenType())
137141
} else if ctx.EQUAL() != nil {
138-
opOverload = symbol.NewOpOverload(t.currentScope().(*symbol.Func), ctx.EQUAL().GetSymbol().GetTokenType())
142+
opOverload = symbol.NewOpOverload(function, ctx.EQUAL().GetSymbol().GetTokenType())
139143
} else if ctx.NOTEQUAL() != nil {
140-
opOverload = symbol.NewOpOverload(t.currentScope().(*symbol.Func), ctx.NOTEQUAL().GetSymbol().GetTokenType())
144+
opOverload = symbol.NewOpOverload(function, ctx.NOTEQUAL().GetSymbol().GetTokenType())
141145
} else if ctx.GT() != nil {
142-
opOverload = symbol.NewOpOverload(t.currentScope().(*symbol.Func), ctx.GT().GetSymbol().GetTokenType())
146+
opOverload = symbol.NewOpOverload(function, ctx.GT().GetSymbol().GetTokenType())
143147
} else if ctx.LT() != nil {
144-
opOverload = symbol.NewOpOverload(t.currentScope().(*symbol.Func), ctx.LT().GetSymbol().GetTokenType())
148+
opOverload = symbol.NewOpOverload(function, ctx.LT().GetSymbol().GetTokenType())
145149
} else if ctx.GE() != nil {
146-
opOverload = symbol.NewOpOverload(t.currentScope().(*symbol.Func), ctx.GE().GetSymbol().GetTokenType())
150+
opOverload = symbol.NewOpOverload(function, ctx.GE().GetSymbol().GetTokenType())
147151
} else if ctx.LE() != nil {
148-
opOverload = symbol.NewOpOverload(t.currentScope().(*symbol.Func), ctx.LE().GetSymbol().GetTokenType())
152+
opOverload = symbol.NewOpOverload(function, ctx.LE().GetSymbol().GetTokenType())
149153
}
150154
if opOverload != nil {
151155
t.at.AppendOpOverload(opOverload)

0 commit comments

Comments
 (0)