Advertisement
Guest User

Untitled

a guest
Mar 4th, 2014
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 5.28 KB | None | 0 0
  1. import leon.lang._
  2. import leon.annotation._
  3. import leon.collection._
  4. import leon._
  5.  
  6. object Tokens {
  7.   abstract class Token
  8.   case object TPlus extends Token
  9.   case object TTimes extends Token
  10.   case object TLT extends Token
  11.   case object TIf extends Token
  12.   case object TElse extends Token
  13.   case object TLAnd extends Token
  14.   case object TLOr extends Token
  15.   case object TLeftBrace extends Token
  16.   case object TRightBrace extends Token
  17.   case object TLeftPar extends Token
  18.   case object TRightPar extends Token
  19.   case class TInt(v: Int) extends Token
  20.   case class TId(name: Int) extends Token // All variables are : Int
  21. }
  22.  
  23. object Trees {
  24.   abstract class Expr
  25.   case class Times(lhs: Expr, rhs: Expr) extends Expr
  26.   case class Plus(lhs: Expr, rhs: Expr) extends Expr
  27.   case class And(lhs: Expr, rhs: Expr) extends Expr
  28.   case class Or(lhs: Expr, rhs: Expr) extends Expr
  29.   case class Var(id: Int) extends Expr
  30.   case class IntLiteral(v: Int) extends Expr
  31.   case class LessThan(lhs: Expr, rhs: Expr) extends Expr
  32.   case class Ite(cond: Expr, thn: Expr, els: Expr) extends Expr
  33. }
  34.  
  35. object Types {
  36.   abstract class Type
  37.   case object IntType extends Type
  38.   case object BoolType extends Type
  39. }
  40.  
  41. object Parser {
  42.   import Tokens._
  43.   import Trees._
  44.  
  45.   def parsePhrase(ts: List[Token]): Option[Expr] = {
  46.     parseGoal(ts) match {
  47.       case Some((res, Nil())) => Some(res)
  48.       case _ => None()
  49.     }
  50.   }
  51.  
  52.   def parseGoal(ts: List[Token]): Option[(Expr, List[Token])] = {
  53.     parseOr(ts)
  54.   }
  55.  
  56.   def parseOr(ts: List[Token]): Option[(Expr, List[Token])] = {
  57.     parseAnd(ts) match {
  58.       case Some((lhs, Cons(TLOr, r))) =>
  59.         parseAnd(r) match {
  60.           case Some((rhs, ts2)) => Some((Or(lhs, rhs), ts2))
  61.           case None() => None()
  62.         }
  63.       case r => r
  64.     }
  65.   }
  66.  
  67.   def parseAnd(ts: List[Token]): Option[(Expr, List[Token])] = {
  68.     parseLT(ts) match {
  69.       case Some((lhs, Cons(TLAnd, r))) =>
  70.         parseLT(r) match {
  71.           case Some((rhs, ts2)) => Some((And(lhs, rhs), ts2))
  72.           case None() => None()
  73.         }
  74.       case r => r
  75.     }
  76.   }
  77.  
  78.   def parseLT(ts: List[Token]): Option[(Expr, List[Token])] = {
  79.     parsePlus(ts) match {
  80.       case Some((lhs, Cons(TLT, r))) =>
  81.         parsePlus(r) match {
  82.           case Some((rhs, ts2)) => Some((LessThan(lhs, rhs), ts2))
  83.           case None() => None()
  84.         }
  85.       case r => r
  86.     }
  87.   }
  88.  
  89.   def parsePlus(ts: List[Token]): Option[(Expr, List[Token])] = {
  90.     parseTimes(ts) match {
  91.       case Some((lhs, Cons(TPlus, r))) =>
  92.         parsePlus(r) match {
  93.           case Some((rhs, ts2)) => Some((Plus(lhs, rhs), ts2))
  94.           case None() => None()
  95.         }
  96.       case r => r
  97.     }
  98.   }
  99.  
  100.   def parseTimes(ts: List[Token]): Option[(Expr, List[Token])] = {
  101.     parseLits(ts) match {
  102.       case Some((lhs, Cons(t, r))) if (t == TTimes) =>
  103.         parseTimes(r) match {
  104.           case Some((rhs, ts2)) => Some((Plus(lhs, rhs), ts2))
  105.           case None() => None()
  106.         }
  107.       case r => r
  108.     }
  109.   }
  110.  
  111.   def parseLits(ts: List[Token]): Option[(Expr, List[Token])] = ts match {
  112.     case Cons(TInt(v), r) => Some((IntLiteral(v), r))
  113.     case Cons(TId(v), r) => Some((Var(v), r))
  114.     case Cons(TLeftPar, r) =>
  115.       parseGoal(r) match {
  116.         case Some((e, Cons(TRightPar, ts2))) => Some((e, ts2))
  117.         case _ => None()
  118.       }
  119.     case Cons(TIf, Cons(TLeftPar, r)) =>
  120.       parseGoal(r) match {
  121.         case Some((c, Cons(TRightPar, Cons(TLeftBrace, ts2)))) =>
  122.           // Then
  123.           parseGoal(ts2) match {
  124.             case Some((th, Cons(TRightBrace, Cons(TElse, Cons(TLeftBrace, ts3))))) =>
  125.               // Else
  126.               parseGoal(ts3) match {
  127.                 case Some((el, Cons(TRightBrace, ts4))) =>
  128.                   Some((Ite(c, th, el), ts4))
  129.                 case _ => None()
  130.               }
  131.             case _ => None()
  132.           }
  133.         case _ => None()
  134.       }
  135.     case _ => None()
  136.   }
  137. }
  138.  
  139. object TypeChecker {
  140.   import Trees._
  141.   import Types._
  142.  
  143.   def typeChecks(e: Expr, exp: Option[Type]): Boolean = e match {
  144.     case Times(l, r)    => (exp.getOrElse(IntType) == IntType)   && typeChecks(l, Some(IntType))  && typeChecks(r, Some(IntType))
  145.     case Plus(l, r)     => (exp.getOrElse(IntType) == IntType)   && typeChecks(l, Some(IntType))  && typeChecks(r, Some(IntType))
  146.     case And(l, r)      => (exp.getOrElse(BoolType) == BoolType) && typeChecks(l, Some(BoolType)) && typeChecks(r, Some(BoolType))
  147.     case Or(l, r)       => (exp.getOrElse(BoolType) == BoolType) && typeChecks(l, Some(BoolType)) && typeChecks(r, Some(BoolType))
  148.     case LessThan(l, r) => (exp.getOrElse(BoolType) == BoolType) && typeChecks(l, Some(IntType))  && typeChecks(r, Some(IntType))
  149.     case Ite(c, th, el) => typeChecks(c, Some(BoolType)) && typeChecks(th, exp) && typeChecks(el, exp)
  150.     case IntLiteral(_)  => exp.getOrElse(IntType) == IntType
  151.     case Var(_)         => exp.getOrElse(IntType) == IntType
  152.   }
  153.  
  154.   def typeChecks(e: Expr): Boolean = typeChecks(e, None())
  155. }
  156.  
  157. object Compiler {
  158.   import Tokens._
  159.   import Trees._
  160.   import Types._
  161.   import Parser._
  162.   import TypeChecker._
  163.  
  164.  
  165.   def parse(ts: List[Token]): Option[Expr] = {
  166.     parsePhrase(ts)
  167.   } ensuring { _ match {
  168.     case Some(tree) => typeChecks(tree)
  169.     case None()     => true
  170.   }}
  171. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement