Skip to content

alexprut/sca-lang

Repository files navigation

Sca Language

Project created during my Master's Degree in Computer Science for the Languages and Compilers class.

(please do not judge the code quality, it was written in 1 week of rush and hurry)


Project Goals

Project a suitable abstract syntax similar to Scala language, and write in Haskell a compiler for the new engineered language.

Sub-Goals

  • Project an Abstract Syntax
  • Type-System
  • Lexer (using Alex)
  • Parser (using Happy)
  • Type-Checker
  • Three-address code (intermediate code generation)

Usage

Type and run from you terminal make demo, it will automatically create a demo. Or simply run ./Compiler filename.sca to compile the source code from filename.sca, there is also a verbose debug mode: ./Compiler -d filename.sca.

Sca language syntax

// Basic Declaration
var k: Boolean = ! true;
var w: Boolean = (1 <= 5) && (true || false); 
var c: Char = 'c';
var c: Int = -1;
var x: Int = 5 + 6;
var y: Int = 5 * 4;
var z: Int = 5 / 4;
var p: *Int = &c;
var kk: *Int = p;
var zza: Float = 5.0;
var zzzz: Int = zza;

// Compound Declaration
var s: Array[Array[Char](2)](2) = Array(Array('a', 'b'), Array('a', 'b'));
var i: Array[Array[Int](2)](2) = Array(Array(1+2,3), Array(5+3/7,1));
var a: Boolean = true;

def proc(valres c: Int, b: Boolean): Int = {
    return (c);
}

// Function Declaration
def func(a: Int, b: Boolean, d: Char, n: Float, l: Boolean, m: Array[Array[Char](2)](2)): Int = {
    // Basic Declaration
    var counter: Int = a;
    var z: Int = proc(counter, b);
    zza = 5;
    counter = a;
    counter += a;
    x = ++x + x;

    // Iteration Statement
    while (b == true) {
        // Function Call
        var z: Int = proc(counter, b);
        break;
        continue;
        proc(counter, b);
    }

    // Selection Statement
    if ((10 >= 8) || (counter > 5)) {
        var counter: Int = 2;
    } else {
        var counter: Int = 4;
    }

    if ((!true) || (counter > 5)) {
        var counter: Int = 2;
    }

    // Left Expression Declaration
    ++counter;
    --counter;

    // Primitive function call
    writeInt(a);

    x = readInt("anything");

    x = ++(++x) + ++x;
    x = ++x + x;
    y-- = x-- - ++x--;
    y-- = x;
    y++;

    s[1][2];
    d = s[1][1];
    s[1][0] = 'a';

    *p = 5;


    for (c <- 1 to 10){
        c = 5;
        if (x>5) {
            x++;
        }
        
        continue;
        break;
    }

    // Try Catch
    try {
        x=5;
    } catch {
        case ex: Exception => {

        }
    }

    // Jump Statement
    return (1+1);
}

def main(): Unit = {
    val z: Int = func(1, true, 'a', 3, false, s);
    return;
}

// Program execution
val run: Unit = main();

License

Do whatever you want to.

About

Project a suitable abstract syntax similar to Scala language, and write in Haskell a compiler for the new engineered language.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published