progs/glue.sc
author Christian Urban <christian.urban@kcl.ac.uk>
Fri, 24 Oct 2025 10:45:17 +0100
changeset 1016 3a431a78499d
parent 902 d516888e5878
permissions -rw-r--r--
updated
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
861
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     1
// Glue code for CW4
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     2
//===================
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     3
// generates j-files and runs class-files
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     4
//
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     5
//
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     6
// needs 
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     7
//
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     8
//  tokenise(s: String) : List[Token]
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
     9
//
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    10
//  Stmts - parser consuming Tokens
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    11
//
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    12
//  compile(bl: Block, class_name: String) : String
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    13
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    14
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    15
902
d516888e5878 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 863
diff changeset
    16
//import ammonite.ops._
d516888e5878 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 863
diff changeset
    17
import os._
861
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    18
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    19
def parse_tks(tks : List[Token]) = {
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    20
  Stmts.parse_all(tks).head
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    21
}
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    22
   
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    23
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    24
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    25
def compile_to_file(bl: Block, class_name: String) : Unit = {
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    26
  println(s"Start of compilation")
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    27
  write.over(pwd / s"$class_name.j", compile(bl, class_name))  
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    28
  println(s"generated $class_name.j file")
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    29
  os.proc("java", "-jar", "jasmin.jar", s"$class_name.j").call()
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    30
  println(s"generated $class_name.class file ")
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    31
}
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    32
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    33
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    34
@main
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    35
def main(fname: String) = {
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    36
    val path = os.pwd / fname
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    37
    val class_name = fname.stripSuffix("." ++ path.ext)
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    38
    val tks = tokenise(os.read(path))
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    39
    val ast = parse_tks(tks)
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    40
    compile_to_file(ast, class_name)
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    41
}
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    42
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    43
@main
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    44
def run(fname: String) = {
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    45
    val path = os.pwd / fname
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    46
    val class_name = fname.stripSuffix("." ++ path.ext)
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    47
    val tks = tokenise(os.read(path))
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    48
    val ast = parse_tks(tks)
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    49
    compile_to_file(ast, class_name)
863
00318ffa4676 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 861
diff changeset
    50
    os.proc("java", s"${class_name}/${class_name}").call(stdout = os.Inherit, stdin = os.Inherit)
861
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    51
    println(s"done.")
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    52
}
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    53
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    54