/lox-java

Lox implementation "following" the book: Crafting Interpreters

Primary LanguageJavaMIT LicenseMIT

Jlox

Lox interpreter written in Java following the book Crafting Interpreters.

Branches:

If you are in the main branch you are looking at the implementation derived from the book.
It has some solved challenges and my own modifications.

Changes:
  • const - declaration for immutable data. Examples:
    // Values
    const x = 1;
    x = 2; // Error at 'x': Cannot reassign a constant.
    
    // Classes
    class A {
        init(b) { this.b = 1; }
    }
    
    const a = A(1);
    a.b = 2; // Error at 'b': Cannot modify a field of a constant object.
    
    // But this is allowed:
    var a_mut = a;
    a.b = 2; // No error
    
  • break - statement for breaking out of loops. Example:
    for (var i = 0; i < 10; i = i + 1) {
        if (i == 5) break;
        print i;
    }
    
    Output:
    // 0
    // 1
    // 2
    // 3
    // 4
    
  • continue - statement for skipping the rest of the loop body. Example:
    for (var i = 0; i < 10; i = i + 1) {
        if (i % 2 == 0) continue;
        print i;
    }
    
    Output:
    // 1
    // 3
    // 5
    // 7
    // 9
    
  • Escape sequences in strings - [ \n, \r, \t, \b, \', \", \\ ]. Note " ' " still works, no need for " \' ". Examples:
    // New line
    print "Hello\nWorld"; // Hello
                          // World
                          // 
    
    // Tab
    print "Hello\tWorld"; // World  World
    
    // Backspace
    print "Hello\b World"; // Hell World
    
  • String and number concatenation using the '+' operator.
    // string + number
    print "123" + 4; // 1234 (string)
    
    // number + string
    print 4 + "123"; // 4123 (string)
    
  • def keyword before method declaration is now required.
    // Before
    class A {
        init() { print "A"; }
    }
    
    // Now
    class A {
        def init() { print "A"; }
    }
    
  • lambda expressions - anonymous functions. Examples:
    // Single line
    const add = lambda(a, b) { return a + b; };
    print add(1, 2); // 3
    
    // Multi line
    const add = lambda(a, b) {
        var c = a + b;
        return c;
    };
    print add(3, 2); // 3
    
  • imports - importing other files. Examples:
    // file1.lox
    import "file2";  // Hello from file2
    import "file3" as math;    
    
    fun foo() {
        print "Hello from foo of file1";
    }
    
    foo();  // Hello from foo of file1
    file2.foo();  // Hello from foo of file2
    
    print math.pow(2, -math.PI);  // 0.0625
    
    // file2.lox
    fun foo() {
        print "Hello from foo of file2";
    }
    
    print "Hello from file2";
    
    // file3.lox
    fun pow(val, exp) {
        if (exp < 0) {
            return 1 / pow(val, -exp);
        }
        var result = 1;
        for (var i = 0; i < exp; i = i + 1) {
            result = result * val;
        }
        return result;
    }
    
    const PI = 3.14;
    
  • modulo operator. Examples:
    print 4 % 2; // 0
    print 5 % 2; // 1
    

If you are in the jlox branch you are looking at the implementation following the book.