progs/fun_tokens.scala
changeset 645 30943d5491b6
parent 644 b4f5714485e1
child 655 3d04ee04966d
equal deleted inserted replaced
644:b4f5714485e1 645:30943d5491b6
     1 // A tokeniser for the fun language
     1 // A tokeniser for the Fun language
     2 
     2 //==================================
       
     3 //
       
     4 // call with 
       
     5 //
       
     6 //     scala fun_tokens.scala fact.fun
       
     7 //
       
     8 //     scala fun_tokens.scala defs.fun
       
     9 //
       
    10 // this will generate a .tks file that can be deserialised back
       
    11 // into a list of tokens
       
    12 // you can add -Xno-patmat-analysis in order to get rid of the
       
    13 // match-not-exhaustive warning
     3 
    14 
     4 object Fun_Tokens {
    15 object Fun_Tokens {
     5 
    16 
     6 import scala.language.implicitConversions    
    17 import scala.language.implicitConversions    
     7 import scala.language.reflectiveCalls 
    18 import scala.language.reflectiveCalls 
   198 val ALL = SYM | DIGIT | OP | " " | ":" | ";" | "\"" | "=" | "," | "(" | ")"
   209 val ALL = SYM | DIGIT | OP | " " | ":" | ";" | "\"" | "=" | "," | "(" | ")"
   199 val ALL2 = ALL | "\n"
   210 val ALL2 = ALL | "\n"
   200 val COMMENT = ("/*" ~ ALL2.% ~ "*/") | ("//" ~ ALL.% ~ "\n")
   211 val COMMENT = ("/*" ~ ALL2.% ~ "*/") | ("//" ~ ALL.% ~ "\n")
   201 
   212 
   202 
   213 
   203 val WHILE_REGS = (("k" $ KEYWORD) | 
   214 val FUN_REGS = (("k" $ KEYWORD) | 
   204                   ("i" $ ID) | 
   215                   ("i" $ ID) | 
   205                   ("o" $ OP) | 
   216                   ("o" $ OP) | 
   206                   ("n" $ NUM) | 
   217                   ("n" $ NUM) | 
   207                   ("s" $ SEMI) | 
   218                   ("s" $ SEMI) | 
   208                   ("c" $ COMMA) |
   219                   ("c" $ COMMA) |
   237   case ("pr", _) => T_RPAREN
   248   case ("pr", _) => T_RPAREN
   238 }
   249 }
   239 
   250 
   240 
   251 
   241 def tokenise(s: String) : List[Token] = 
   252 def tokenise(s: String) : List[Token] = 
   242   lexing_simp(WHILE_REGS, s).collect(token)
   253   lexing_simp(FUN_REGS, s).collect(token)
   243 
   254 
   244 def serialise[T](fname: String, data: T) = {
   255 def serialise[T](fname: String, data: T) = {
   245   val out = new ObjectOutputStream(new FileOutputStream(fname))
   256   import scala.util.Using
   246   out.writeObject(data)
   257   Using(new ObjectOutputStream(new FileOutputStream(fname))) {
   247   out.close
   258     out => out.writeObject(data)
   248 }
   259   }
   249 
   260 }
   250 def main(args: Array[String]) = {
   261 
       
   262 def main(args: Array[String]) : Unit = {
   251   val fname = args(0)
   263   val fname = args(0)
       
   264   val tname = fname.stripSuffix(".fun") ++ ".tks"
   252   val file = io.Source.fromFile(fname).mkString
   265   val file = io.Source.fromFile(fname).mkString
   253   val tks = fname.stripSuffix(".fun") ++ ".tks"
   266   serialise(tname, tokenise(file))
   254   serialise(tks, tokenise(file))
   267 }
   255 }
   268 
   256 
   269 
   257 
   270 }
   258 }