You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
2.6 KiB
105 lines
2.6 KiB
package project3
|
|
|
|
import java.io._
|
|
import scala.io._
|
|
|
|
trait CodeGenerator {
|
|
// Define the PrintWriter used to emit
|
|
// the code.
|
|
val out = new ByteArrayOutputStream
|
|
val pOut = new PrintWriter(out, true)
|
|
def stream = pOut
|
|
|
|
def emitCode(ast: Language.Exp): Unit
|
|
|
|
// Emit the code and return the String
|
|
// representation of the code
|
|
def code(ast: Language.Exp) = {
|
|
emitCode(ast)
|
|
out.toString.stripLineEnd
|
|
}
|
|
}
|
|
|
|
object Runner {
|
|
import Language._
|
|
|
|
def printUsage: Unit = {
|
|
println("""Usage: run PROG [OPTION]
|
|
or: run FILE [OPTION]
|
|
OPTION: intStack""")
|
|
}
|
|
|
|
def main(args: Array[String]): Unit = {
|
|
if (args.size == 0) {
|
|
printUsage
|
|
return
|
|
}
|
|
|
|
val src = if (new File(args(0)).exists) {
|
|
val source = Source.fromFile(args(0))
|
|
try source.getLines mkString "\n" finally source.close()
|
|
} else {
|
|
args(0)
|
|
}
|
|
println("============ SRC CODE ============")
|
|
println(src)
|
|
println("==================================\n")
|
|
|
|
val reader = new BaseReader(src, '\u0000')
|
|
val scanner = new Scanner(reader)
|
|
|
|
// Parser to test!
|
|
// TODO: Change this as you finish parsers
|
|
val parser = new ArrayParser(scanner)
|
|
val ast = try {
|
|
parser.parseCode
|
|
} catch {
|
|
case e: AbortException => return
|
|
case e: Throwable => throw e
|
|
}
|
|
|
|
println("============= AST ================")
|
|
println(ast)
|
|
println("==================================\n")
|
|
|
|
val analyzer = new SemanticAnalyzer(parser)
|
|
println("======= Semantic Analyzer ========")
|
|
val (nast, numWarning, numError) = analyzer.run(ast)
|
|
if (numError > 0) {
|
|
println("==================================\n")
|
|
return
|
|
}
|
|
println("=========== Typed AST ============")
|
|
print(nast)
|
|
println(s": ${nast.tp}")
|
|
println("==================================\n")
|
|
|
|
|
|
|
|
val interpreter = if (args.contains("intStack"))
|
|
new StackInterpreter
|
|
else
|
|
new ValueInterpreter
|
|
println("========== Interpreter ===========")
|
|
println(s"Exit Code: ${interpreter.run(nast)}")
|
|
println("==================================\n")
|
|
|
|
// Generator to test
|
|
val generator = new X86Compiler with CodeGenerator
|
|
val code = generator.code(nast)
|
|
|
|
val runner = new ASMRunner(code)
|
|
println("============ OUTPUT ==============")
|
|
println(runner.code)
|
|
println("==================================\n")
|
|
|
|
if (runner.assemble != 0) {
|
|
println("Compilation error!")
|
|
} else {
|
|
println("============ RESULT ==============")
|
|
println(s"Exit Code: ${runner.run}")
|
|
println("==================================")
|
|
}
|
|
}
|
|
}
|