Advertisement
Guest User

Untitled

a guest
Jun 8th, 2014
244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scala 8.32 KB | None | 0 0
  1. import scala.util.parsing.combinator._
  2.  
  3. import scala.collection.Map
  4. import scala.io.StdIn
  5.  
  6. object Keywords {
  7.     val Define = "define"
  8.  
  9.     val True = "true"
  10.     val False = "false"
  11.  
  12.     val If = "if"
  13.     val Then = "then"
  14.     val Else = "else"
  15.  
  16.     val Return = "return"
  17.     val Pass = "pass"
  18.  
  19.     val Conj = ";"
  20.     val OpenParen = "("
  21.     val CloseParen = ")"
  22.     val OpenBrack = "{"
  23.     val CloseBrack = "}"
  24.     val Comma = ","
  25.  
  26.     val Plus = "+"
  27.     val Minus = "-"
  28.     val Times = "*"
  29.     val Divide = "/"
  30.     val Pow = "**"
  31.  
  32.     val And = "&&"
  33.     val Or = "||"
  34.     val Xor = "^^"
  35.     val Not = "!"
  36.  
  37.     val Equals = "=="
  38.     val NotEquals = "!="
  39.    
  40.     val Assignment = "="
  41. }
  42.  
  43. //---------------------------------------------------------------------------------
  44.  
  45. sealed abstract class Op
  46.  
  47. case object Plus extends Op
  48. case object Minus extends Op
  49. case object Times extends Op
  50. case object Divide extends Op
  51. case object Pow extends Op
  52. case object And extends Op
  53. case object Or extends Op
  54. case object Xor extends Op
  55. case object Not extends Op
  56. case object Equals extends Op
  57. case object NotEquals extends Op
  58. case object Assignment extends Op
  59.  
  60. //---------------------------------------------------------------------------------
  61.  
  62. sealed abstract class Term
  63.  
  64. case object TrueTerm extends Term
  65. case object FalseTerm extends Term
  66.  
  67. case class FloatTerm(value : Float) extends Term
  68. case class StringTerm(value : String) extends Term
  69. case class Identifier(name : String) extends Term
  70.  
  71. //---------------------------------------------------------------------------------
  72.  
  73. sealed abstract class Expression
  74.  
  75. case class TermExp(term : Term) extends Expression
  76.  
  77. case class UnaryOp(op : Op, exp : Expression) extends Expression
  78. case class BinaryOp(op : Op, left : Expression, right : Expression) extends Expression
  79.  
  80. case class FuncApp(funcName : Term, args : List[Expression]) extends Expression
  81.  
  82. //---------------------------------------------------------------------------------
  83.  
  84. sealed abstract class Statement
  85.  
  86. case class ExpressionStatement(exp : Expression) extends Statement
  87.  
  88. case class Pass() extends Statement
  89.  
  90. case class Return(value : Expression) extends Statement
  91.  
  92. case class AssignmentVar(variable : Term, exp : Expression) extends Statement
  93.  
  94. case class IfThenElse(testBody : Expression, thenBody : Statement, elseBody : Statement) extends Statement
  95. case class Conjunction(left : Statement, right : Statement) extends Statement
  96.  
  97. case class AssignmentFunc(functionName : Term, args : List[Term], body : Statement) extends Statement
  98.  
  99. //---------------------------------------------------------------------------------
  100.  
  101. class myParser extends JavaTokenParsers {
  102.  
  103.     val keywordMap : Map[String, Op] = Map(
  104.         Keywords.Plus -> Plus,
  105.         Keywords.Minus -> Minus,
  106.         Keywords.Times -> Times,
  107.         Keywords.Divide -> Divide,
  108.         Keywords.Pow -> Pow,
  109.         Keywords.And -> And,
  110.         Keywords.Or -> Or,
  111.         Keywords.Xor -> Xor,
  112.         Keywords.Not -> Not,
  113.         Keywords.Equals -> Equals,
  114.         Keywords.NotEquals -> NotEquals,
  115.         Keywords.Assignment -> Assignment
  116.     )
  117.  
  118.     def floatTerm : Parser[Term] = decimalNumber ^^ {
  119.         case x => FloatTerm( x.toFloat )
  120.     }
  121.  
  122.     def stringTerm : Parser[Term] = stringLiteral ^^ {
  123.         case str => StringTerm(str)
  124.     }
  125.  
  126.     def identifier : Parser[Term] = ident ^^ {
  127.         case value => Identifier(value)
  128.     }
  129.  
  130.     def boolTerm : Parser[Term] = (Keywords.True | Keywords.False) ^^ {
  131.         case Keywords.True => TrueTerm
  132.         case Keywords.False => FalseTerm
  133.     }
  134.  
  135.     def simpleTerm : Parser[Expression] = (boolTerm | floatTerm | stringTerm) ^^ {
  136.         case term => TermExp(term)
  137.     }
  138.  
  139.     def argument = expression
  140.  
  141.     def arguments_aux : Parser[List[Expression]] = (argument <~ Keywords.Comma) ~ arguments ^^ {
  142.         case arg ~ argList => arg :: argList
  143.     }
  144.  
  145.     def arguments  = arguments_aux | { argument ^^ { case arg => List(arg) } }
  146.  
  147.     def funcAppArgs : Parser[List[Expression]] = funcEmptyArgs | ( Keywords.OpenParen ~> arguments <~ Keywords.CloseParen ^^ {
  148.         case args => args.foldRight(List[Expression]()) ( (a,b) => a :: b )
  149.     } )
  150.  
  151.     def funcApp = identifier ~ funcAppArgs ^^ {
  152.         case funcName ~ argList => FuncApp(funcName, argList)
  153.     }
  154.  
  155.     def variableTerm : Parser[Expression] = identifier ^^ {
  156.         case name => TermExp(name)
  157.     }
  158.  
  159.     def atomic_expression = simpleTerm | funcApp | variableTerm
  160.  
  161.     def paren_expression : Parser[Expression] = Keywords.OpenParen ~> expression <~ Keywords.CloseParen
  162.  
  163.     def unary_operation : Parser[String] = Keywords.Not
  164.  
  165.     def unary_expression : Parser[Expression] = operation(0) ~ expression(0) ^^ {
  166.         case op ~ exp => UnaryOp(keywordMap(op), exp)
  167.     }
  168.  
  169.     def operation(precedence : Int) : Parser[String] = precedence match {
  170.         case 0 => Keywords.Not
  171.         case 1 => Keywords.Pow
  172.         case 2 => Keywords.Times | Keywords.Divide | Keywords.And
  173.         case 3 => Keywords.Plus | Keywords.Minus | Keywords.Or | Keywords.Xor
  174.         case 4 => Keywords.Equals | Keywords.NotEquals
  175.         case _ => throw new Exception("No operations with this precedence.")
  176.     }
  177.  
  178.     def binary_expression(precedence : Int) : Parser[Expression] = precedence match {
  179.         case 0 => throw new Exception("No operation with zero precedence.")
  180.         case n => (expression (n-1)) ~ operation(n) ~ (expression (n)) ^^ {
  181.             case left ~ op ~ right => BinaryOp(keywordMap(op), left, right)
  182.         }
  183.     }
  184.  
  185.     def expression(precedence : Int) : Parser[Expression] = precedence match {
  186.         case 0 => unary_expression | paren_expression | atomic_expression
  187.         case n => binary_expression(n) | expression(n-1)
  188.     }
  189.  
  190.     def expression : Parser[Expression] = expression(4)
  191.  
  192.     def expressionStmt : Parser[Statement] = expression ^^ { case exp => ExpressionStatement(exp) }
  193.  
  194.     def assignment : Parser[Statement] = (identifier <~ Keywords.Assignment) ~ expression ^^ {
  195.         case varName ~ exp => AssignmentVar(varName, exp)
  196.     }
  197.  
  198.     def ifthen : Parser[Statement] = ((Keywords.If ~ Keywords.OpenParen) ~> expression <~ Keywords.CloseParen) ~
  199.         ((Keywords.Then ~ Keywords.OpenBrack) ~> statements <~ Keywords.CloseBrack) ^^ {
  200.             case ifBody ~ thenBody => IfThenElse(ifBody, thenBody, Pass())
  201.         }
  202.  
  203.     def ifthenelse : Parser[Statement] = ((Keywords.If ~ Keywords.OpenParen) ~> expression <~ Keywords.CloseParen) ~
  204.         ((Keywords.Then ~ Keywords.OpenBrack) ~> statements <~ Keywords.CloseBrack) ~
  205.         ((Keywords.Else ~ Keywords.OpenBrack) ~> statements <~ Keywords.CloseBrack) ^^ {
  206.             case ifBody ~ thenBody ~ elseBody => IfThenElse(ifBody, thenBody, elseBody)
  207.         }
  208.  
  209.     def pass : Parser[Statement] = Keywords.Pass ^^^ { Pass() }
  210.  
  211.     def returnStmt : Parser[Statement] = Keywords.Return ~> expression ^^ {
  212.         case exp => Return(exp)
  213.     }
  214.  
  215.     def statement : Parser[Statement] = ((pass | returnStmt | assignment |  expressionStmt) <~ Keywords.Conj) | ifthenelse | ifthen
  216.  
  217.     def statements_aux : Parser[Statement] = statement ~ statements ^^ { case st ~ sts => Conjunction(st, sts) }
  218.  
  219.     def statements : Parser[Statement] = statements_aux | statement
  220.  
  221.     def funcDefBody : Parser[Statement] = Keywords.OpenBrack ~> statements <~ Keywords.CloseBrack
  222.  
  223.     def funcEmptyArgs = Keywords.OpenParen ~ Keywords.CloseParen ^^^ { List() }
  224.  
  225.     def funcDefArgs : Parser[List[Term]] = funcEmptyArgs | Keywords.OpenParen ~> repsep(identifier, Keywords.Comma) <~ Keywords.CloseParen ^^ {
  226.         case args => args.foldRight(List[Term]()) ( (a,b) => a :: b )
  227.     }
  228.  
  229.     def funcDef : Parser[Statement] = (Keywords.Define ~> identifier) ~ funcDefArgs ~ funcDefBody ^^ {
  230.         case funcName ~ funcArgs ~ body => AssignmentFunc(funcName, funcArgs, body)
  231.     }
  232.  
  233.     def funcDefAndStatement : Parser[Statement] = funcDef | statement
  234.  
  235.     def funcDefAndStatements_aux : Parser[Statement] = funcDefAndStatement ~ funcDefAndStatements ^^ {
  236.         case stmt ~ stmts => Conjunction(stmt, stmts)
  237.     }
  238.  
  239.     def funcDefAndStatements : Parser[Statement] = funcDefAndStatements_aux | funcDefAndStatement
  240.  
  241.     def parseProgram : Parser[Statement] = funcDefAndStatements
  242.  
  243.     def eval(input : String) = {
  244.         parseAll(parseProgram, input) match {
  245.             case Success(result, _) => result
  246.             case Failure(m, _) => println(m)
  247.             case _ => println("")
  248.         }
  249.     }
  250. }
  251.  
  252. object Parser {
  253.     def main(args : Array[String]) {
  254.         val x : myParser = new myParser()
  255.  
  256.         println(args(0))
  257.  
  258.         val lines = scala.io.Source.fromFile(args(0)).mkString
  259.  
  260.         println(x.eval(lines))
  261.     }
  262. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement