A Kotlin implementation of the Lox language (mimics the Java implementation from "Crafting Interpreters").
The implementation follows the book by munificent.
To launch the interpreter or run a file, use ./klox [file]
after building the jar
target with Gradle.
This is the grammar implemented in klox.
It's mostly the grammar as explained in the book, with some of the "challenges" implemented as well.
Both line (//
) and multi-line (/* */
) comments are supported (but not nested multi-line comments, at the moment).
program -> declaration* EOF ;
declaration -> classDecl | funDecl | varDecl | statement ;
classDecl -> "class" IDENTIFIER ( "<" IDENTIFIER )? "{" function* "}" ;
funDecl -> "fun" function ;
function -> IDENTIFIER "(" parameters? ")" block ;
parameters -> IDENTIFIER ( "," IDENTIFIER )* ;
varDecl -> "var" IDENTIFIER ("=" expression)? ";" ;
statement -> exprStmt | forStmt | ifStmt | returnStmt
| whileStmt | block | break | continue ;
exprStmt -> expression ";" ;
forStmt -> "for" "(" ( varDecl | exprStmt | ";" ) expression? ";" expression? ")" statement ;
ifStmt -> "if" "(" expression ")" statement ( "else" statement )? ;
returnStmt -> "return" expression? ";" ;
whileStmt -> "while" "(" expression ")" statement ;
block -> "{" declaration* "}" ;
break -> "break" ";" ;
expression -> comma ;
comma -> assignment ( "," assignment )* ;
arguments -> assignment ( "," assignment )* ;
assignment -> ( call "." )? IDENTIFIER ( "-" | "+" )? "=" assignment | conditional ;
conditional -> logic_or ( "?" expression ":" conditional )? ;
logic_or -> logic_and ( "or" logic_and )* ;
logic_and -> equality ( "and" equality )* ;
equality -> comparison ( ( "!=" | "==" ) comparison )* ;
comparison -> addition ( ( ">" | ">=" | "<" | "<=" ) addition )* ;
addition -> multiplication ( ( "-" | "+" ) multiplication )* ;
multiplication -> unary ( ( "/" | "*" ) unary )* ;
unary -> ( "!" | "-" ) unary | call ;
call -> primary ( "(" arguments? ")" | "." IDENTIFIER )* ;
primary -> NUMBER | STRING | "false" | "true" | "nil"
| "(" expression ")" | IDENTIFIER | funExpr
| "super" "." IDENTIFIER
// Erroneous grammar
| ( "!=" | "==" ) equality
| ( ">" | ">=" | "<" | "<=" ) comparison
| "+" addition
| ( "/" | "*" ) multiplication ;
funExpr -> "fun" "(" parameters? ")" block ;
The implementation contains the built-in functions from the book, as well as some additional ones.
Some of these functions are inspired from their namesakes in the Lua language.
print(value)
- Printsvalue
to stdout (originally a statement).clock()
- Returns current time in seconds since the Unix epoch.read()
- Reads one line from stdin and returns it.type(value)
- Returns the type ofvalue
.tonumber(value)
- Convertsvalue
to a number (ornil
if conversion fails).tostring(value)
- Returns the string representation ofvalue
.
Copyright (c) 2017 by Adam Hellberg.
This project is licensed under the MIT License, following the main repo licensing the code part under MIT.
See the file LICENSE
for more information.