社区精选 | 手写编程语言-实现运算符重载
今天小编为大家带来的是社区作者 crossoverJie 的文章,让我们一起来学习手写编程语言-实现运算符重载。
前言
先带来日常的 GScript 更新:新增了可变参数的特性,语法如下:
int add(string s, int ...num){
println(s);
int sum = 0;
for(int i=0;i<len(num);i++){
int v = num[i];
sum = sum+v;
}
return sum;
}
int x = add("abc", 1,2,3,4);
println(x);
assertEqual(x, 10);
//formats according to a format specifier and writes to standard output.
printf(string format, any ...a){}
//formats according to a format specifier and returns the resulting string.
string sprintf(string format, any ...a){}
使用
println(100+2*2);
class Person{
int age;
Person(int a){
age = a;
}
}
Person p1 = Person(10);
Person p2 = Person(20);
Person p3 = p1+p2;
Person operator + (Person p1, Person p2){
Person pp = Person(p1.age+p2.age);
return pp;
}
Person p3 = p1+p2;
println("p3.age="+p3.age);
assertEqual(p3.age, 30);
函数名必须是 operator 名称后跟上运算符即可。
实现
编译期间:记录所有的重载函数和运算符的关系。 运行期:根据当前的运算找到声明的函数,直接运行即可。
// OpOverload 重载符
type OpOverload struct {
function *Func
tokenType int
}
// 运算符重载自定义函数
opOverloads []*symbol.OpOverload

// GetOpFunction 获取运算符重载函数
// 通过返回值以及运算符号(+-*/) 匹配重载函数
func (a *AnnotatedTree) GetOpFunction(returnType symbol.Type, tokenType int) *symbol.Func {
for _, overload := range a.opOverloads {
isType := overload.GetFunc().GetReturnType().IsType(returnType)
if isType && overload.GetTokenType() == tokenType {
return overload.GetFunc()
}
}
return nil
}
编译期: https://github.com/crossoverJie/gscript/blob/ae729ce7d4cf39fe115121993fcd2222716755e5/resolver/type_scope_resolver.go#L127 运行期: https://github.com/crossoverJie/gscript/blob/499236af549be47ff827c6d55de1fc8e5600b9b3/visitor.go#L387
总结
a5 = (a1.Add(a2).Add(a3)).Mul(a4);
a5 = (a1+a2+a3)*a4;


关注公众号:拾黑(shiheibook)了解更多
赞助链接:
关注数据与安全,洞悉企业级服务市场:https://www.ijiandao.com/
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

随时掌握互联网精彩
- SSL证书和域名不匹配如何解决?
- allinssl开源免费的SSL证书管理利器
- ncbi是什么数据库
- iQOO Z9 Turbo一图评测:中端机卷王全面升级
- 日币兑换人民币汇率多少2023年6月30日
- 美元兑人民币汇率2023年5月29日
- 【杂谈快报】网传微软苏州大裁员:赔偿N+12个月,知情人士:纯属谣言;英特尔进行大规模降薪:CEO最高降25%
- 中端机用旗舰屏幕?Redmi Note 11T系列要重振LCD荣光!
- 《我的姐姐》1.41亿居榜首;清明节假期第二天各地祭扫活动安全有序|Do早报
- 叮咚买菜拟赴美上市,筹资最多3亿美元;理想汽车累计交付量突破40000辆;传LG为苹果开发可折叠屏 | Do晚报
- 春节档实时预售总票房突破6亿;石家庄站时隔34天重新开启进站|Do早报
- “傲娇”的新消费创始人:我可以随时把某些头部机构叫来聊半小时
赞助链接