Gebalang is programming language invented for the purpose of Formal Languages and Translation Theory
course conducted at Wroclaw University of Science and Technology.
Lecture is taught by dr. Maciej Gębala
. Compiler provides basic optimisation.
For information about language see bottom of this file.
Simply clone this repo and
make all
Compile using
./compiler <input_path> <compiled_path>
- GNU Bison
- Flex
- gcc
Makefile
makefilegebalang_y.ypp
bison file, contains main()gebalang_l.l
flex fileutils.hpp
file containing type declarations for the translation of procedures and the program, as well as function declarations for the translation of the program.utils.cpp
file containg definitions for utils.hppprocedure.hpp
file containing function declarations for the translation of procedures.procedure.cpp
file containing function definitions for procedure.hpp
Virtual machine was created by dr. Maciej Gębala
and can parse following assembler directives:
Directive | Interpretation | Time |
---|---|---|
GET i | gets number from input and saves it in p_i and k <- k+1 | 100 |
PUT i | Prints p_i and k <- k+1 | 100 |
LOAD i | p_0 <- p_i and k <- k+1 | 10 |
STORE i | p_i <- p_0 and k <- k+1 | 10 |
LOADI i | p_0 <- p_{p_i} and k <- k+1 | 10 |
STOREI i | p_{p_i} <- p_0 and k <- k+1 | 10 |
ADD i | p_0 <- p_0 + p_i and k <- k+1 | 10 |
SUB i | p_0 <- p_0 - p_i and k <- k+1 | 10 |
ADDI i | p_0 <- p_0 + p_{p_i} and k <- k+1 | 10 |
SUBI i | p_0 <- p_0 - p_{p_i} and k <- k+1 | 10 |
SET x | p_0 <- x and k <- k+1 | 10 |
HALF | p_0 <- floor{p_0 / 2} and k <- k+1 | 5 |
JUMP j | k <- j | 1 |
JPOS j | If p_0 > 0 then k <- j else k <- k+1 | 1 |
JZERO j | If p_0 = 0 then k <- j else k <- k+1 | 1 |
JUMPI i | k <- p_i | 1 |
HALT | Exit program execution | 0 |
Gebalang supports following grammar:
program_all | procedures main |
procedures | procedures PROCEDURE proc_head IS VAR declarations BEGIN commands END |
procedures PROCEDURE proc_head IS BEGNI commands END | |
%empty | |
main | PROGRAM IS VAR declarations BEGIN commands END |
PROGRAM IS BEGIN commands END | |
commands | commands command |
command | |
command | identifier := expression; |
IF condition THEN commands ELSE commands ENDIF | |
IF condition THEN commands ENDIF | |
WHILE condition DO commands ENDWHILE | |
REPEAT commands UNTIL condition; | |
proc_head; | |
READ identifier; | |
WRITE value; | |
proc_head | identifier ( declarations ) |
declarations | declarations, identifier |
identifier | |
expression | value |
value + value | |
value - value | |
value * value | |
value / value | |
value % value | |
condition | value = value |
value != value | |
value > value | |
value < value | |
value >= value | |
value <= value | |
value | num |
identifier |
Sample Gebalang file looks like this:
[ program to calculate gcd of 4 numbers ]
PROCEDURE swap(a,b) IS
VAR c
BEGIN
c:=a;
a:=b;
b:=c;
END
PROCEDURE gcd(a,b,c) IS
VAR x,y
BEGIN
x:=a;
y:=b;
WHILE y!=0 DO
IF x>=y THEN
x:=x-y;
ELSE
swap(x,y);
ENDIF
ENDWHILE
c:=x;
END
PROGRAM IS
VAR a,b,c,d,x,y,z
BEGIN
READ a;
READ b;
READ c;
READ d;
gcd(a,b,x);
gcd(c,d,y);
gcd(x,y,z);
WRITE z;
END
Compiled:
SET 1
STORE 1
SET 0
STORE 2
SET 2
STORE 3
JUMP 148
SET 0
STOREI 5
LOADI 7
STORE 16
LOADI 6
STORE 17
JZERO 14
SET 0
STORE 15
LOAD 17
SUB 16
JPOS 46
SET 1
STORE 14
LOAD 17
STORE 13
LOAD 16
SUB 13
SUB 13
JZERO 37
LOAD 14
ADD 14
STORE 14
LOAD 13
ADD 13
STORE 13
LOAD 16
SUB 13
SUB 13
JPOS 27
LOAD 14
ADD 15
STORE 15
LOAD 16
SUB 13
STORE 16
LOAD 17
SUB 16
JZERO 19
LOAD 16
STORE 8
SET 0
STORE 13
LOAD 8
SUB 13
STORE 13
SET 0
SUB 8
ADD 13
JPOS 138
LOADI 7
STORE 16
LOADI 6
STORE 17
JZERO 62
SET 0
STORE 15
LOAD 17
SUB 16
JPOS 94
SET 1
STORE 14
LOAD 17
STORE 13
LOAD 16
SUB 13
SUB 13
JZERO 85
LOAD 14
ADD 14
STORE 14
LOAD 13
ADD 13
STORE 13
LOAD 16
SUB 13
SUB 13
JPOS 75
LOAD 14
ADD 15
STORE 15
LOAD 16
SUB 13
STORE 16
LOAD 17
SUB 16
JZERO 67
LOAD 15
STOREI 7
SET 1
ADDI 5
STOREI 5
LOADI 7
STORE 16
LOADI 6
STORE 17
JZERO 104
SET 0
STORE 15
LOAD 17
SUB 16
JPOS 136
SET 1
STORE 14
LOAD 17
STORE 13
LOAD 16
SUB 13
SUB 13
JZERO 127
LOAD 14
ADD 14
STORE 14
LOAD 13
ADD 13
STORE 13
LOAD 16
SUB 13
SUB 13
JPOS 117
LOAD 14
ADD 15
STORE 15
LOAD 16
SUB 13
STORE 16
LOAD 17
SUB 16
JZERO 109
LOAD 16
STORE 8
SET 0
STORE 13
LOAD 8
SUB 13
STORE 13
SET 0
SUB 8
ADD 13
JZERO 48
JUMPI 4
GET 12
LOAD 3
STORE 9
LOAD 9
STORE 15
LOAD 9
STORE 16
SET 0
STORE 13
LOAD 16
JZERO 179
LOAD 16
HALF
STORE 14
ADD 14
STORE 14
LOAD 16
SUB 14
JZERO 170
LOAD 13
ADD 15
STORE 13
LOAD 15
ADD 15
STORE 15
LOAD 16
HALF
STORE 16
LOAD 16
JPOS 157
LOAD 13
STORE 11
LOAD 11
SUB 12
JPOS 229
SET 10
STORE 5
SET 9
STORE 6
SET 12
STORE 7
SET 192
STORE 4
JUMP 7
LOAD 10
SUB 2
JZERO 197
PUT 9
PUT 10
LOAD 9
ADD 1
STORE 9
LOAD 9
STORE 15
LOAD 9
STORE 16
SET 0
STORE 13
LOAD 16
JZERO 228
LOAD 16
HALF
STORE 14
ADD 14
STORE 14
LOAD 16
SUB 14
JZERO 219
LOAD 13
ADD 15
STORE 13
LOAD 15
ADD 15
STORE 15
LOAD 16
HALF
STORE 16
LOAD 16
JPOS 206
LOAD 13
STORE 11
LOAD 11
SUB 12
JZERO 180
LOAD 12
SUB 1
STORE 13
LOAD 1
SUB 12
ADD 13
JZERO 241
PUT 12
PUT 1
HALT