项目作者: arturbosch

项目描述 :
Just another JVM language
高级语言: Kotlin
项目地址: git://github.com/arturbosch/grovlin.git
创建时间: 2017-02-03T10:27:10Z
项目社区:https://github.com/arturbosch/grovlin

开源协议:Apache License 2.0

下载


Grovlin - Just another JVM language - Learning Compilers

build status

Building an own language I bet is the dream of every programmer who already programmed in a lot of different languages but never was 100% happy with one of them.

In my case I’m nearly 100% happy with Kotlin but missing a bit of the simplicity and java-like syntax of Groovy. After reading the really good blog-series of Frederico Tomasseti, I decided
to merge my favorite features of Kotlin and Groovy. So this project was born :).

In summer semester 2017 I had the chance to continue to work on this project in the Compiler Tool Practical of the
University of Bremen.

Antlr -> AST -> Grovlin -> Java -> Bytecode -> JVM

Build & Run

  • gradle build fatjar
  • java -jar grovlin-compiler/build/libs/grovlin-compiler-0.1.0.jar run [path/to/program.grovlin]

Code examples

  1. def main(String args) {
  2. println("Guess my number (0-9)!")
  3. var number = rand(10).toString()
  4. var input = readline()
  5. if input == number {
  6. println("You guessed my number!")
  7. } else {
  8. println("My number was " + number + " and your number is " + input)
  9. }
  10. }
  1. def main(String args) {
  2. for i : 0..10 {
  3. print(i)
  4. if i != 9 {
  5. print(", ")
  6. }
  7. }
  8. println()
  9. println(loop(5))
  10. }
  11. def loop(Int n): String {
  12. var current = n
  13. while current > 0 {
  14. print(".")
  15. current = current - 1
  16. }
  17. println()
  18. return "I 'have' finished!"
  19. }
  1. trait Node {
  2. def traverse()
  3. }
  4. trait Leaf extends Node {
  5. Int data
  6. override def traverse() {
  7. print(data)
  8. }
  9. }
  10. trait Tree extends Node {
  11. Node left
  12. Node right
  13. Node parent
  14. override def traverse() {
  15. left.traverse()
  16. right.traverse()
  17. }
  18. }
  19. object BinaryTree as Tree {
  20. override Node left
  21. override Node right
  22. override Node parent
  23. }
  24. object LeafImpl as Leaf {
  25. override Int data = 1
  26. }
  27. def main(String args) {
  28. var tree = BinaryTree()
  29. var leaf = LeafImpl()
  30. leaf.data = 5
  31. tree.left = leaf
  32. var tree2 = BinaryTree()
  33. tree2.parent = tree
  34. tree.right = tree2
  35. tree2.left = LeafImpl()
  36. tree2.right = LeafImpl()
  37. tree.traverse()
  38. }