This is a compiler written in Kotlin using an ANTLR parser. The language includes: Global variables, Functions, Classes, Methods, Automatic Memory Management, Type Inference, Calling External Functions, Modules, etc.
Here's some example syntax:
genComplexExpressionsInWhileLoop(a :Int, z :Int, y :Int, x :Int, w :Int)
var i = 0,
var sum = 0,while i < a
var v = 42 + x,let u = 45 + v *67 + 124 - (w *4) / 5,
v = v *2 - z,
var t = 1,if z < 10
t = v * z
else
t = v - z
;let l = 74*3 - v + z * x - w,
i = 5 + u * z * v + t *2* l
;let r = sum * i,
rThis will be parsed into the AST and printed out as:
; Module: genComplexExpressionsInWhileLoop;genComplexExpressionsInWhileLoophas4statementsandareturnexpression.functiongenComplexExpressionsInWhileLoop(a: Int,z: Int,y: Int,x: Int,w: Int)->Int{;VariableDeclarationStatement
variable i: Int=0;VariableDeclarationStatement
variable sum: Int=0;WhileStatementwhile(i<a){;VariableDeclarationStatement
variable v: Int=(42+x);VariableDeclarationStatement
constant u: Int=(((45+(v*67))+124)-((w*4)/5));VariableReassignmentStatementv=((v*2)-z);VariableDeclarationStatement
variable t: Int=1;IfStatementif(z<10){;VariableReassignmentStatementt=(v*z)}elseif(true){;VariableReassignmentStatementt=(v-z)};VariableDeclarationStatement
constant l: Int=((((74*3)-v)+(z*x))-w);VariableReassignmentStatementi=((5+((u*z)*v))+((t*2)*l))};VariableDeclarationStatementconstant r: Int=(sum*i)returnr}(Notice the type inference: variables and return types are inferred and checked in the TypePass.)
The LLVM backend will produce something like:
; ModuleID = 'genComplexExpressionsInWhileLoop'definei32@genComplexExpressionsInWhileLoop(i32, i32, i32, i32, i32) {
entry:
brlabel %"while.c (i < a)""while.c (i < a)": ; preds = %"if.o (z < 10)", %entry%i.0 = phii32 [ 0, %entry ], [ %"((5 + ((u * z) * v)) + ((t * 2) * l))", %"if.o (z < 10)" ]
%"(i < a)" = icmpslti32%i.0, %0bri1 %"(i < a)", label %"while.b (i < a)", label %"while.o (i < a)""while.b (i < a)": ; preds = %"while.c (i < a)"%v = allocai32, align4
%"(42 + x)" = addi32%3, 42storei32 %"(42 + x)", i32*%v, align4
%"(v * 67)" = muli32 %"(42 + x)", 67
%"((45 + (v * 67)) + 124)" = addi32 %"(v * 67)", 169
%"(w * 4)" = shli32%4, 2
%"((w * 4) / 5)" = sdivi32 %"(w * 4)", 5
%"(((45 + (v * 67)) + 124) - ((w * 4) / 5))" = subi32 %"((45 + (v * 67)) + 124)", %"((w * 4) / 5)"
%"(v * 2)" = shli32 %"(42 + x)", 1
%"((v * 2) - z)" = subi32 %"(v * 2)", %1storei32 %"((v * 2) - z)", i32*%v, align4%t = allocai32, align4storei321, i32*%t, align4
%"(z < 10)" = icmpslti32%1, 10bri1 %"(z < 10)", label %"if.t (z < 10)", label %"if.t true""while.o (i < a)": ; preds = %"while.c (i < a)"reti320"if.t (z < 10)": ; preds = %"while.b (i < a)"
%"(v * z)" = muli32 %"((v * 2) - z)", %1storei32 %"(v * z)", i32*%t, align4brlabel %"if.o (z < 10)""if.o (z < 10)": ; preds = %"if.t true", %"if.t (z < 10)"%t8 = phii32 [ %"(v - z)", %"if.t true" ], [ %"(v * z)", %"if.t (z < 10)" ]
%"((74 * 3) - v)" = subi32222, %"((v * 2) - z)"
%"(z * x)" = muli32%1, %3
%"(((74 * 3) - v) + (z * x))" = addi32 %"((74 * 3) - v)", %"(z * x)"
%"((((74 * 3) - v) + (z * x)) - w)" = subi32 %"(((74 * 3) - v) + (z * x))", %4
%"(u * z)" = muli32 %"(((45 + (v * 67)) + 124) - ((w * 4) / 5))", %1
%"((u * z) * v)" = muli32 %"(u * z)", %"((v * 2) - z)"
%"(5 + ((u * z) * v))" = addi32 %"((u * z) * v)", 5
%"(t * 2)" = shli32%t8, 1
%"((t * 2) * l)" = muli32 %"(t * 2)", %"((((74 * 3) - v) + (z * x)) - w)"
%"((5 + ((u * z) * v)) + ((t * 2) * l))" = addi32 %"(5 + ((u * z) * v))", %"((t * 2) * l)"brlabel %"while.c (i < a)""if.t true": ; preds = %"while.b (i < a)"
%"(v - z)" = subi32 %"((v * 2) - z)", %1storei32 %"(v - z)", i32*%t, align4brlabel %"if.o (z < 10)"
}