progs/fun_parser.scala
changeset 645 30943d5491b6
parent 644 b4f5714485e1
child 655 3d04ee04966d
equal deleted inserted replaced
644:b4f5714485e1 645:30943d5491b6
     1 // A Small Compiler for a Simple Functional Language
     1 // A parser for the Fun language
     2 // (includes a lexer and a parser)
     2 //================================
       
     3 //
       
     4 // call with 
       
     5 //
       
     6 //     scala fun_parser.scala fact.tks
       
     7 //
       
     8 //     scala fun_parser.scala defs.tks
       
     9 //
       
    10 // this will generate a .prs file that can be deserialised back
       
    11 // into a list of declarations
     3 
    12 
     4 object Fun_Parser {
    13 object Fun_Parser {
     5 
    14 
     6 import scala.language.implicitConversions    
    15 import scala.language.implicitConversions    
     7 import scala.language.reflectiveCalls
    16 import scala.language.reflectiveCalls
       
    17 import scala.util._ 
     8 import java.io._
    18 import java.io._
     9 
    19 
    10 abstract class Token extends Serializable 
    20 abstract class Token extends Serializable 
    11 case object T_SEMI extends Token
    21 case object T_SEMI extends Token
    12 case object T_COMMA extends Token
    22 case object T_COMMA extends Token
   160 
   170 
   161 
   171 
   162 // Reading tokens and Writing parse trees
   172 // Reading tokens and Writing parse trees
   163 
   173 
   164 def serialise[T](fname: String, data: T) = {
   174 def serialise[T](fname: String, data: T) = {
   165   val out = new ObjectOutputStream(new FileOutputStream(fname))
   175   import scala.util.Using
   166   out.writeObject(data)
   176   Using(new ObjectOutputStream(new FileOutputStream(fname))) {
   167   out.close
   177     out => out.writeObject(data)
   168 }
   178   }
   169 
   179 }
   170 def deserialise[T](fname: String) : T = {
   180 
   171   val in = new ObjectInputStream(new FileInputStream(fname))
   181 def deserialise[T](fname: String) : Try[T] = {
   172   val data = in.readObject.asInstanceOf[T]
   182   import scala.util.Using
   173   in.close
   183   Using(new ObjectInputStream(new FileInputStream(fname))) {
   174   data
   184     in => in.readObject.asInstanceOf[T]
   175 }
   185   }
   176 
   186 }
   177 
   187 
   178 def main(args: Array[String]) = {
   188 
       
   189 def main(args: Array[String]) : Unit= {
   179   val fname = args(0)
   190   val fname = args(0)
   180   val pname = fname.stripSuffix(".tks") ++ ".prs"
   191   val pname = fname.stripSuffix(".tks") ++ ".prs"
   181   val tks = deserialise[List[Token]](fname)
   192   val tks = deserialise[List[Token]](fname).getOrElse(Nil)
   182   serialise(pname, Prog.parse_single(tks))
   193   serialise(pname, Prog.parse_single(tks))
   183 
   194 
   184   // testing whether read-back is working
   195   // testing whether read-back is working
   185   //val ptree = deserialise[List[Decl]](pname)
   196   //val ptree = deserialise[List[Decl]](pname).get
   186   //println(s"Reading back from ${pname}:\n${ptree.mkString("\n")}")  
   197   //println(s"Reading back from ${pname}:\n${ptree.mkString("\n")}")  
   187 }
   198 }
   188 
   199 
   189 }
   200 }