LARA

package minijava
 
import parser.Parser
import analyzer.Analyzer
import analyzer.TypeChecker
import code.CodeGenerator
 
class Compiler
    extends Reporter
    with Parser
    with Analyzer
    with TypeChecker
    with CodeGenerator {
  import java.io.{File,FileInputStream,IOException,ByteArrayInputStream}
 
  def compile(fileName: String, classDir: String): Unit = {
    import parser.Trees._
    import analyzer.Symbols._
 
    val outputDir = classDir + "/"
 
    val checkDir: File = new File(outputDir)
    if(!checkDir.exists) checkDir.mkdir
    if(!checkDir.isDirectory) fatalError("Cannot find output directory " + outputDir)
 
    // Parsing
    var parsedTree: Option[Tree] = None
    try {
      val in = new FileInputStream(fileName)
      parsedTree = Some(parseInputStream(in))
      in.close()
    } catch {
      case e: IOException => fatalError(e.getMessage)
    }
    terminateIfErrors
 
    val mainProg: Program = parsedTree match {
      case Some(p:Program) => p
      case _ => scala.Predef.error("Main program expected from parser.")
    }
 
    // Name analysis
    val global: GlobalScope = analyzeSymbols(mainProg)
    terminateIfErrors
 
    // Type checking
    typeCheck(mainProg, global)
    terminateIfErrors
 
    // Compile all "non-main" classes
    mainProg.classes foreach {
      ct => generateClassFile(global,ct,outputDir)
    }
 
    // Compile the main class
    // ...
  }
}