do-lang

所属分类:编译器/解释器
开发工具:Rust
文件大小:24KB
下载次数:0
上传日期:2019-04-27 01:35:10
上 传 者sh-1993
说明:  基于LLVM的玩具编程语言
(A toy programming language on LLVM)

文件列表:
Cargo.lock (35205, 2019-04-27)
Cargo.toml (273, 2019-04-27)
Makefile (63, 2019-04-27)
build.rs (75, 2019-04-27)
src (0, 2019-04-27)
src\ast.rs (3366, 2019-04-27)
src\codegen.rs (19902, 2019-04-27)
src\env.rs (2454, 2019-04-27)
src\error.rs (0, 2019-04-27)
src\grammar.lalrpop (5934, 2019-04-27)
src\main.rs (857, 2019-04-27)
src\semantic.rs (6194, 2019-04-27)
tests (0, 2019-04-27)
tests\function.ds (756, 2019-04-27)
tests\function.ds.ll (3436, 2019-04-27)
tests\function.ds.s (3751, 2019-04-27)
tests\if.ds (133, 2019-04-27)
tests\if.ds.ll (596, 2019-04-27)
tests\if.ds.s (597, 2019-04-27)
tests\while.ds (262, 2019-04-27)
tests\while.ds.ll (1577, 2019-04-27)
tests\while.ds.s (1902, 2019-04-27)

# Dolang a toy programming language ## example * code ```rust fn foo1(a: int, b: int) -> int { let c = a + 1001; let d: int; let ok = 123.456; if ok > 100.123 { let val = 123.24; d = b + 1992 + c + a; val = val + 0.87; } if c > 100 { let bv = 1002; c = bv + c; } a = c + d; return a; } fn foo2(a: int) -> bool { return a == 100; } fn fact(n: int) -> int { if n == 1 { return 1; } else { return fact(n - 1) * n; } } fn main() -> int { let a = 1001 + 92; let b: int; a = foo1(a, 100) + 123 + foo1(a, 12); b = foo1(123, a + 120); while a > b + 100 { b = a + foo1(a, b); } return 0; } ``` * LLVM IR ```llvm ; ModuleID = '__module' source_filename = "__module" define i*** @foo1(i***, i***) { entry: %a = alloca i*** store i*** %0, i**** %a %b = alloca i*** store i*** %1, i**** %b %c = alloca i*** %2 = load i***, i**** %a %3 = add i*** %2, 1001 store i*** %3, i**** %c %d = alloca i*** %ok = alloca float store float 0x405EDD2F20000000, float* %ok %4 = load float, float* %ok %5 = fcmp ogt float %4, 0x405907DF40000000 br i1 %5, label %"if:then", label %"if:else" "if:then": ; preds = %entry %val = alloca float store float 0x405ECF5C20000000, float* %val %6 = load i***, i**** %b %7 = add i*** %6, 1992 %8 = load i***, i**** %c %9 = add i*** %7, %8 %10 = load i***, i**** %a %11 = add i*** %9, %10 store i*** %11, i**** %d %12 = load float, float* %val %13 = fadd float %12, 0x3FEBD70A40000000 store float %13, float* %val br label %"if:merge" "if:else": ; preds = %entry br label %"if:merge" "if:merge": ; preds = %"if:else", %"if:then" %14 = load i***, i**** %c %15 = icmp sgt i*** %14, 100 br i1 %15, label %"if:then1", label %"if:else2" "if:then1": ; preds = %"if:merge" %bv = alloca i*** store i*** 1002, i**** %bv %16 = load i***, i**** %bv %17 = load i***, i**** %c %18 = add i*** %16, %17 store i*** %18, i**** %c br label %"if:merge3" "if:else2": ; preds = %"if:merge" br label %"if:merge3" "if:merge3": ; preds = %"if:else2", %"if:then1" %19 = load i***, i**** %c %20 = load i***, i**** %d %21 = add i*** %19, %20 store i*** %21, i**** %a %22 = load i***, i**** %a ret i*** %22 } define i1 @foo2(i***) { entry: %a = alloca i*** store i*** %0, i**** %a %1 = load i***, i**** %a %2 = icmp eq i*** %1, 100 ret i1 %2 } define i*** @fact(i***) { entry: %n = alloca i*** store i*** %0, i**** %n %1 = load i***, i**** %n %2 = icmp eq i*** %1, 1 br i1 %2, label %"if:then", label %"if:else" "if:then": ; preds = %entry ret i*** 1 "if:else": ; preds = %entry %3 = load i***, i**** %n %4 = sub i*** %3, 1 %5 = call i*** @fact(i*** %4) %6 = load i***, i**** %n %7 = mul i*** %5, %6 ret i*** %7 } define i*** @main() { entry: %a = alloca i*** store i*** 1093, i**** %a %b = alloca i*** %0 = load i***, i**** %a %1 = call i*** @foo1(i*** %0, i*** 100) %2 = add i*** %1, 123 %3 = load i***, i**** %a %4 = call i*** @foo1(i*** %3, i*** 12) %5 = add i*** %2, %4 store i*** %5, i**** %a %6 = load i***, i**** %a %7 = add i*** %6, 120 %8 = call i*** @foo1(i*** 123, i*** %7) store i*** %8, i**** %b br label %"while:cond" "while:cond": ; preds = %"while:body", %entry %9 = load i***, i**** %b %10 = add i*** %9, 100 %11 = load i***, i**** %a %12 = icmp sgt i*** %11, %10 br i1 %12, label %"while:body", label %"while:merge" "while:body": ; preds = %"while:cond" %13 = load i***, i**** %a %14 = load i***, i**** %b %15 = call i*** @foo1(i*** %13, i*** %14) %16 = load i***, i**** %a %17 = add i*** %16, %15 store i*** %17, i**** %b br label %"while:cond" "while:merge": ; preds = %"while:cond" ret i*** 0 } ```

近期下载者

相关文件


收藏者