如何在自定义极简语法语言中建模C/Rust指针与解引用语法
自定义语言中指针/解引用语法的对应转换问题
我正在开发一款语法极简的自定义编程语言,希望理清如何将C或Rust中的各类指针、解引用语法,对应转换到自己的语言逻辑里。
自定义语言的指针类型设定
所有变量默认是pointer类型,直接书写变量名即代表该类型:
save x, 10
这个pointer类型包含三个核心属性:
x:指针本身x.bond:指针指向的实际值x.slot:指针对应的内存地址
基于C示例的初步推导(我的尝试)
因为我对C和Rust的实际使用仅停留在基础层面,先尝试用C代码推导对应关系:
C引用 vs 自定义语言
// C代码 int a = 10; int &b = a; // b的值等于10,修改b会同步修改a
我尝试转换成自定义语言的写法:
save a, 10 // 将b的内存地址设为a的内存地址 save b.slot, a.slot // 此时修改b会同步修改a save b, 20
C指针 vs 自定义语言
// C代码 int *p = &a;
我尝试的自定义语言写法:
// 将p指向的值设为a的内存地址?这样对吗? save p.bond, a.slot // 那p.bond.bond是不是就等于a的值10?对应C里的**p?
核心疑问:指针操作的全排列对应关系
我想明确所有指针相关操作的对应逻辑,下面列出了各种排列组合的写法,想知道它们分别对应C/Rust中的什么操作,或者是否合法:
先初始化基础变量:
save a, 10
已尝试的对应写法
- 对应C的
int &b = a;:save b.slot, a.slot - 对应C的
int *p = &a;:save p.bond, a.slot
其他待明确的组合
save b.slot, a—— 这样写可行吗?对应什么逻辑?save b.slot, a.bond—— 这样做会有什么效果?save b.bond, a—— 这种写法合法吗?save b.bond, a.bond—— 这个对应什么操作?save b, a—— 这句的语义是什么?save b, a.slot—— 对应C/Rust里的什么操作?save b, a.bond—— 这个又代表什么?
我整理了更清晰的排列组合,想逐个明确语义:
save b.slot, a.slot:b的地址等于a的地址(对应C的引用绑定)save b.slot, a:把指针a本身赋值给b的地址?这看起来不合理或无效?save b.slot, a.bond:把a的实际值作为b的内存地址?save b.bond, a.slot:把a的地址作为b指向的值(对应C的指针赋值int* p = &a)save b.bond, a:把指针a本身赋值给b指向的值?这合理吗?save b.bond, a.bond:把a的实际值赋值给b指向的值(对应普通的值传递)save b, a:直接把指针a赋值给b?save b, a.slot:把a的地址赋值给指针b?save b, a.bond:把a的实际值赋值给指针b?
本质上我希望明确:如何把C/Rust中的指针、解引用、引用传递等语法功能,转换为自定义语言这种更冗余的属性式语法。不需要100%精确,只要能大致对应核心逻辑即可。
内容的提问来源于stack exchange,提问作者Lance Pollard
相关产品推荐
相关产品推荐

