progs/glue.sc
author Christian Urban <christian.urban@kcl.ac.uk>
Tue, 14 Dec 2021 11:40:31 +0000
changeset 863 00318ffa4676
parent 861 ac23f18ef078
child 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
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    16
import ammonite.ops._
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    17
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    18
def parse_tks(tks : List[Token]) = {
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    19
  Stmts.parse_all(tks).head
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    20
}
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
def compile_to_file(bl: Block, class_name: String) : Unit = {
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    25
  println(s"Start of compilation")
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    26
  write.over(pwd / s"$class_name.j", compile(bl, class_name))  
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    27
  println(s"generated $class_name.j file")
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    28
  os.proc("java", "-jar", "jasmin.jar", s"$class_name.j").call()
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    29
  println(s"generated $class_name.class file ")
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    30
}
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
@main
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    34
def main(fname: String) = {
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    35
    val path = os.pwd / fname
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    36
    val class_name = fname.stripSuffix("." ++ path.ext)
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    37
    val tks = tokenise(os.read(path))
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    38
    val ast = parse_tks(tks)
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    39
    compile_to_file(ast, class_name)
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    40
}
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
@main
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    43
def run(fname: String) = {
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    44
    val path = os.pwd / fname
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    45
    val class_name = fname.stripSuffix("." ++ path.ext)
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    46
    val tks = tokenise(os.read(path))
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    47
    val ast = parse_tks(tks)
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    48
    compile_to_file(ast, class_name)
863
00318ffa4676 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents: 861
diff changeset
    49
    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
    50
    println(s"done.")
ac23f18ef078 updated
Christian Urban <christian.urban@kcl.ac.uk>
parents:
diff changeset
    51
}
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