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
}
```
近期下载者:
相关文件:
收藏者: