compile.scala
changeset 85 1a4065f965fb
parent 82 06c3ec0b452e
equal deleted inserted replaced
84:719fd738d2a0 85:1a4065f965fb
     1 // A parser and evaluator for teh while language
     1 // A parser and evaluator for teh while language
     2 // 
     2 // 
     3 //:load matcher.scala
     3 import matcher._
     4 //:load parser3.scala
     4 import parser._
     5 
     5 
     6 // some regular expressions
     6 // some regular expressions
     7 val SYM = RANGE("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz_")
     7 val SYM = RANGE("ABCDEFGHIJKLMNOPQRSTUVXYZabcdefghijklmnopqrstuvwxyz_")
     8 val DIGIT = RANGE("0123456789")
     8 val DIGIT = RANGE("0123456789")
     9 val ID = SEQ(SYM, STAR(ALT(SYM, DIGIT))) 
     9 val ID = SEQ(SYM, STAR(ALT(SYM, DIGIT))) 
    30 case class T_ID(s: String) extends Token
    30 case class T_ID(s: String) extends Token
    31 case class T_OP(s: String) extends Token
    31 case class T_OP(s: String) extends Token
    32 case class T_NUM(s: String) extends Token
    32 case class T_NUM(s: String) extends Token
    33 case class T_KWD(s: String) extends Token
    33 case class T_KWD(s: String) extends Token
    34 
    34 
    35 val lexing_rules: List[Rule[Token]] = 
    35 val lexing_rules: List[(Rexp, List[Char] => Token)] = 
    36   List((KEYWORD, (s) => T_KWD(s.mkString)),
    36   List((KEYWORD, (s) => T_KWD(s.mkString)),
    37        (ID, (s) => T_ID(s.mkString)),
    37        (ID, (s) => T_ID(s.mkString)),
    38        (OP, (s) => T_OP(s.mkString)),
    38        (OP, (s) => T_OP(s.mkString)),
    39        (NUM, (s) => T_NUM(s.mkString)),
    39        (NUM, (s) => T_NUM(s.mkString)),
    40        (SEMI, (s) => T_SEMI),
    40        (SEMI, (s) => T_SEMI),
   258 
   258 
   259 
   259 
   260 
   260 
   261 //examples
   261 //examples
   262 
   262 
   263 //compile_to("loops.while", "loops.j")
   263 compile_to("loops.while", "loops.j")
   264 //compile_to("fib.while", "fib.j")
   264 //compile_to("fib.while", "fib.j")
   265 
   265 
   266 
   266 
   267 // testing cases for time measurements
   267 // testing cases for time measurements
   268 
   268 
   313 
   313 
   314 List(1, 5000, 10000, 50000, 100000, 250000, 500000, 750000, 1000000).map(compile_test(_))
   314 List(1, 5000, 10000, 50000, 100000, 250000, 500000, 750000, 1000000).map(compile_test(_))
   315 
   315 
   316 
   316 
   317 
   317 
   318 // javabyte code assmbler
   318 // Javabyte code assmbler
   319 //
   319 //
   320 // java -jar jvm/jasmin-2.4/jasmin.jar loops.j
   320 // java -jar jvm/jasmin-2.4/jasmin.jar loops.j
   321 
   321 
   322 
   322 
   323 
   323 
   324 
   324 
   325 
   325 
   326 
   326 
   327