Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 6 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,9 @@ Defining complex data structures is possible via the `struct` notation (like `st
```gom
import io;

type ArrInt = int[10]; // int | int[10] | struct {} | Temp[10]
type ArrInt = int[10]; // int | int[10] | {} | Temp[10]

type Temperature = struct {
type Temperature = {
high: int,
low: int,
avg: int
Expand Down Expand Up @@ -70,8 +70,10 @@ type Name = str;
| Lexical Analysis | ✅ Done |
| Syntactic Analysis (parsing) | ✅ Done |
| Semantic Analysis & preliminary type system | ✅ Done |
| C Code Generation | ⚙️ In progress |
| Complex data structures | ⏳ Not started |
| LLVM IR Generation | ✅ Done |
| Complex data structures - structs | ✅ Done |
| Modules | ⚙️ In progress |
| Complex data structures - arrays | ⏳ Not started |

## Trying out Gom

Expand Down
25 changes: 15 additions & 10 deletions examples/test_2.gom
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
import io;

type Point = struct {
type Point = {
x: int,
y: int
};

type Line = {
p1: Point,
p2: Point
};

let GLOBAL = 1;

fn square(x: int): int {
Expand All @@ -15,15 +20,15 @@ fn add(a: int, b: int): int {
return a + b;
}

fn main() {
let a = 1 + 2, b = 2;

add(1, (1 + b / 2));
fn distance(p1: Point, p2: Point): int {
return square(p1.x - p2.x) + square(p1.y - p2.y);
}

a = 2;
let sq = square(a);
let i = 3;
io.log("Sum: ", add(i, 1));
fn main() {
let p1 = Point { x: 1, y: 2 }, p2 = Point { x: 3, y: 4 };
let d = distance(p1, p2);
io.log("Distance between p1 and p2: ", d);

i = i + 1;
let l = Line { p1: p1, p2: p2 };
io.log("Distance between l.p1 and l.p2: ", distance(l.p1, l.p2));
}
96 changes: 96 additions & 0 deletions examples/test_2.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
; ModuleID = 'mod'
source_filename = "mod"

%Point = type { i32, i32 }
%Line = type { %Point, %Point }

@GLOBAL = external global i32
@.strliteral = private unnamed_addr constant [29 x i8] c"Distance between p1 and p2: \00", align 1
@fmt.int = private unnamed_addr constant [3 x i8] c"%d\00", align 1
@newline = private unnamed_addr constant [2 x i8] c"\0A\00", align 1
@.strliteral.1 = private unnamed_addr constant [33 x i8] c"Distance between l.p1 and l.p2: \00", align 1

define i32 @square(i32 %0) {
entry:
%1 = alloca i32, align 4
store i32 %0, i32* %1, align 4
%x.load = load i32, i32* %1, align 4
%x.load1 = load i32, i32* %1, align 4
%multmp = mul i32 %x.load, %x.load1
ret i32 %multmp
}

define i32 @add(i32 %0, i32 %1) {
entry:
%2 = alloca i32, align 4
store i32 %0, i32* %2, align 4
%3 = alloca i32, align 4
store i32 %1, i32* %3, align 4
%a.load = load i32, i32* %2, align 4
%b.load = load i32, i32* %3, align 4
%addtmp = add i32 %a.load, %b.load
ret i32 %addtmp
}

define i32 @distance(%Point %0, %Point %1) {
entry:
%2 = alloca %Point, align 8
store %Point %0, %Point* %2, align 4
%3 = alloca %Point, align 8
store %Point %1, %Point* %3, align 4
%fieldptr = getelementptr %Point, %Point* %2, i32 0, i32 0
%fieldload = load i32, i32* %fieldptr, align 4
%fieldptr1 = getelementptr %Point, %Point* %3, i32 0, i32 0
%fieldload2 = load i32, i32* %fieldptr1, align 4
%subtmp = sub i32 %fieldload, %fieldload2
%calltmp = call i32 @square(i32 %subtmp)
%fieldptr3 = getelementptr %Point, %Point* %2, i32 0, i32 1
%fieldload4 = load i32, i32* %fieldptr3, align 4
%fieldptr5 = getelementptr %Point, %Point* %3, i32 0, i32 1
%fieldload6 = load i32, i32* %fieldptr5, align 4
%subtmp7 = sub i32 %fieldload4, %fieldload6
%calltmp8 = call i32 @square(i32 %subtmp7)
%addtmp = add i32 %calltmp, %calltmp8
ret i32 %addtmp
}

define void @main() {
entry:
%p1 = alloca %Point, align 8
%fieldptr = getelementptr %Point, %Point* %p1, i32 0, i32 0
store i32 1, i32* %fieldptr, align 4
%fieldptr1 = getelementptr %Point, %Point* %p1, i32 0, i32 1
store i32 2, i32* %fieldptr1, align 4
%p2 = alloca %Point, align 8
%fieldptr2 = getelementptr %Point, %Point* %p2, i32 0, i32 0
store i32 3, i32* %fieldptr2, align 4
%fieldptr3 = getelementptr %Point, %Point* %p2, i32 0, i32 1
store i32 4, i32* %fieldptr3, align 4
%d = alloca i32, align 4
%p1.load = load %Point, %Point* %p1, align 4
%p2.load = load %Point, %Point* %p2, align 4
%calltmp = call i32 @distance(%Point %p1.load, %Point %p2.load)
store i32 %calltmp, i32* %d, align 4
%d.load = load i32, i32* %d, align 4
%calltmp0 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([29 x i8], [29 x i8]* @.strliteral, i32 0, i32 0))
%calltmp1 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @fmt.int, i32 0, i32 0), i32 %d.load)
%newline = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @newline, i32 0, i32 0))
%l = alloca %Line, align 8
%p1.load4 = load %Point, %Point* %p1, align 4
%fieldptr5 = getelementptr %Line, %Line* %l, i32 0, i32 0
store %Point %p1.load4, %Point* %fieldptr5, align 4
%p2.load6 = load %Point, %Point* %p2, align 4
%fieldptr7 = getelementptr %Line, %Line* %l, i32 0, i32 1
store %Point %p2.load6, %Point* %fieldptr7, align 4
%fieldptr8 = getelementptr %Line, %Line* %l, i32 0, i32 0
%fieldload = load %Point, %Point* %fieldptr8, align 4
%fieldptr9 = getelementptr %Line, %Line* %l, i32 0, i32 1
%fieldload10 = load %Point, %Point* %fieldptr9, align 4
%calltmp11 = call i32 @distance(%Point %fieldload, %Point %fieldload10)
%calltmp012 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([33 x i8], [33 x i8]* @.strliteral.1, i32 0, i32 0))
%calltmp113 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @fmt.int, i32 0, i32 0), i32 %calltmp11)
%newline14 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @newline, i32 0, i32 0))
ret void
}

declare i32 @printf(i8*, ...)
2 changes: 1 addition & 1 deletion gom.ebnf
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ gomType = typeIdOrArray | structType;

typeIdOrArray = typeId ("[" , numLiteral , "]")?;

structType = "struct" , "{" , structTypeItem+ , "}";
structType = "{" , structTypeItem+ , "}";

structTypeItem = identifier , ":" , gomType , ","?;

Expand Down
Loading
Loading