Feature/better errors See merge request mkais001/klang!10
Klang - The Kaiser language
This is the project for Klang - the Kaiser language.
Authors
This code was in equal parts developed by Dennis Kaiser and Marvin Kaiser at the RheinMain University of Applied Sciences for the Compilers course.
Usage
Pass source code via stdin
example call to print help java -cp target/klang-1.0-jar-with-dependencies.jar de.hsrm.compiler.Klang.Klang -h
Arguments:
- -h Print this help
- --evaluate: Evaluates the given source code
- --pretty: Pretty print the given source code
- --no-compile: Do not compile the source code
- --no-main: Do not generate main function, will be generated as 'start'. Useful for testing
The makefile can be used to perform various functions more easily:
make buildsimply builds the compilermake cleancleans up all generated outputmakegenerates code.s from code.k in root foldermake prettyprettifies code.k and writes to pretty.kmake evalevaluates code.kmake testruns tests from src/test/make cleanTestscleans files generated from tests
Functionality
The KLang compiler supports generation of AMD64 assembly code, as well as prettifying and evaluating the KLang code.
Data Types
- Integer
Simple Expressions
The following simple expressions are supported. Expressions need to be put in paranthesis. When using comparison operators, the expressions evaluate to 0 for false and 1 for true.
- Addition (+)
- Subtraction (-)
- Multiplication (*)
- Division (/)
- Modulo (%)
- Equality (==)
- Less Than (<)
- Less Than Or Equal (<=)
- Greater Than (>)
- Greater Than Or Equal (>=)
- Number Negation (-)
Examples:
(5 + 4)
(8 % 2)
(8 == 0)
Functions
Functions can be defined and called. A function call can be used like any other expression. Recusion is supported
Examples
function fun(x, y, z) {
return x;
}
fun(1, 2, 3);
Statements
Several statements are supported:
- if
- variable declaration
- variable assignment
- return
- while
- do while
- for
Examples
function example(x, y, z) {
let a;
let b = 0;
if ((x == y)) {
a = y;
} else if ((x == z)) {
a = z;
} else {
return b;
}
return a;
}
function whileExample(end) {
let x = 0;
while ((x < end)) {
x = (x + 1);
}
return x;
}
function doWhileExample(end) {
let x = 0;
do {
x = (x + 1);
} while((x < end));
}
function forExample(end) {
let x = 0;
for (let i = 0; (i < end); i = (i + 1)) {
x = (x + 1);
}
return x;
}