问题:“大整数表示为(小)整数列表。”
假设有:
type reg = string;; (* "$0" models register set to constant 0 *)
type label = string;; (* empty string models no label *)
type asmistr =
AsmHalt
| AsmNop
| AsmAdd of reg * reg * reg
| AsmAddi of reg * int * reg
| AsmSub of reg * reg * reg
| AsmMul of reg * reg * reg
| AsmLoad of reg * reg * reg
| AsmStore of reg * reg * reg
| AsmJmp of label
| AsmBne of reg * reg * label
| AsmBeq of reg * reg * label
| AsmSlt of reg * reg * reg
;;
type asmprog = AsmProg of (label * asmistr) list;;
type asmline =
AsmIstr of label * asmistr
| AsmComment of string
| AsmDebugReg of reg
| AsmDebugMem of int * int
;;
这组定义用于定义像汇编这样的语言,使用寄存器、指令和标签(用于跳转)
现在我需要实现一个从命令式语言(具有“while”“if”等指令)到 ASM 的编译器
我的老师建议的实现是使用一个列表,其中每个元素都是给定数字的数字(数字只能是整数),例如 11000 是 [1, 1, 0, 0, 0]
第一个差距是:考虑到通用的 O'Caml 程序,我该如何实现呢?假设我必须插入一个大整数,我可以使用什么逻辑来允许“计算”?因为最后一个ASM程序也可以做add、sub mul等可以包含大整数的指令,所以不知道怎么处理寄存器、大整数和指令
我需要的是如何实现大整数的一般方案,可能用 O'Caml 语言,以及如何考虑类似于汇编的语言(在本例中为 ASM)来实现这一点
提前感谢,如果不清楚,对不起我的英语,如果有人可以帮助我,如果需要,我会提供更多细节