Advertisement
Guest User

Untitled

a guest
Mar 25th, 2015
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 1.08 KB | None | 0 0
  1. module Compiler
  2. open Syntax
  3.  
  4. type PrimValue =
  5.     | BoolVal of bool
  6.     | IntVal of int
  7.  
  8. type BinaryOps =
  9.     | ADD
  10.     | MIN
  11.     | MUL
  12.     | DIV
  13.  
  14. let pushNum i =
  15.     match i with
  16.     | IntVal x -> "ldc.i4.s " + string x
  17.     | _        -> failwith "Syntax error"    
  18.    
  19. let pushOperation op =
  20.     match op with
  21.     | ADD -> "add"
  22.     | MIN -> "sub"
  23.     | MUL -> "mul"
  24.     | DIV -> "div"
  25.  
  26.  
  27. let rec eval expr lst =
  28.     match expr with
  29.     | ConstInt i                  -> (pushNum (IntVal i)) :: lst
  30.     | PrimOp ("+", lOper, rOper)  -> evalNumericExpr ADD lOper rOper lst
  31.     | PrimOp ("-", lOper, rOper)  -> evalNumericExpr MIN lOper rOper lst
  32.     | PrimOp ("*", lOper, rOper)  -> evalNumericExpr MUL lOper rOper lst
  33.     | PrimOp ("/", lOper, rOper)  -> evalNumericExpr DIV lOper rOper lst
  34.     | _                 -> failwith "Syntax error"  
  35.  
  36. and evalNumericExpr op lOper rOper lst =
  37.     let left = eval lOper lst
  38.     let right = eval rOper lst
  39.     let operation = pushOperation op
  40.     lst @ left @ right @ [operation]
  41.  
  42. let compile expr =
  43.     eval expr []
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement