a tree-walk interpreter implemented in Kotlin that was created to learn how programming languages worked
Although not very practical to use in a real project, it is Turing complete and provides basic scripting needs.
Yes, its slow.
Made possible with http://craftinginterpreters.com/
log ("Hello world")loop(var i = 0 as i < 10: i++) {
log("Hello world")
}class A {
}
class littleA from A {
}
task fib(n) {
if (num <= 1) return 1;
return fib(n - 1) + fib( n - 2);
}//Native function asking question and the type of response
var ans = responseTo("What is 10 - 10?", "number")
if (ans != 0) {
log("Idiot")
return;
}
- HashMaps for environments
- Implementation of Visitor Pattern
- separate parser and lexer
- No modes
- primitives
- boolean,
- number (64 bit)
- strings
- Semantic Analysis
- Recursive Descent Parser
- Classes
- Inheritance
- super keyword
- this keyword
- Functions
- Lexical Scoping
- Global variables
- Closures
- Lexically scoped variables
- if / else (No else if)
- Comments and comment blocks
- Short-hands for expressions ( +=, ++, --)
- return statements
- ternary operators
- loops (loop, while)
- Kotlin and JS syntax inspiration
- Object getters and setters
- multi-line strings
- truthy values
- short circuiting evaluation
- Native functions :
- asking for user response in terminal
- stopwatch
- exitProcess
- No implicit primitive type conversions (number to number, string to string only)
- Module system
- multi-file support
- standard library
- type system
- immutability
- speed
- syntax highlighting (yet)
- bitwise operators
typeoforinstanceofoperators- dead code elimination
- static methods in classes
- escape characters
- template literals
- no data structures
As stated above, this language was created to learn language design and is not meant for practical use
-
super -
class -
return -
var -
task -
false -
true -
null -
if -
else -
loop -
while -
from -
super -
this -
NaN -
log -
as -
this -
init -
object
{
}
(
)
;
.
,
:
?
#
!
=
> <= >= < - . + ++ -- " % / /=
And many more! (tokens are similar to C / JS syntax)
declare a variable -> var hi = "Hello"
- declared but not assigned variables are null by default
- variables that have not been declared nor defined but accessed throw undefined variable error
- semicolons are always omitted
declare function -> task name() {}
- returns must end in semicolon
- nested functions are okay (closures)
declare class -> class T {}
- classes have optional init blocks like Kotlin. use
init{ #stmts | expressions #} -
class joeWithInit { init { log("a new joe class was instatiated") //does not have access to 'this' properties //cannot return anything } //constructor object(a,b) { this.a = a this.b = b } eatChicken() { log(this.a + " ate" + " chicken") } }
extending class -> class E from T{}
constructor -> object( #parameters#) {}
while -> while(expression) {}
loop -> loop(as:) #infinite loop#, simple loop ->loop (var i = 0 as i < 10: i++)
comments -> // line specific
comment blocks -> # comments #
print to terminal -> log()
- Automatically appends new line (\n) (equivalent to
println())
declare method in class -> name(#parameters#){}
ternary operators -> condition expression ? expression evaluated if true : expression evaluated if false
- Cannot compound ternary operators
Short Circuiting -> expression || expression
- Evaluates first truthy values
- NaN and null are falsy
- VScode extension in the process
- logo
- a cmdlet or something to make this easier to run then direct jar
- usable download on this repo