Advertisement
Guest User

Untitled

a guest
Sep 18th, 2013
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 1.94 KB | None | 0 0
  1. (* File Expr/Parse.fs *)
  2. (* Lexing and parsing of simple expressions using fslex and fsyacc *)
  3.  
  4. module Parse
  5.  
  6. open System
  7. open System.IO
  8. open System.Text
  9. open Microsoft.FSharp.Text.Lexing
  10. open Absyn
  11.  
  12. type sinstr =
  13.   | SCstI of int                        (* push integer           *)
  14.   | SVar of int                         (* push variable from env *)
  15.   | SAdd                                (* pop args, push sum     *)
  16.   | SSub                                (* pop args, push diff.   *)
  17.   | SMul                                (* pop args, push product *)
  18.   | SPop                                (* pop value/unbind var   *)
  19.   | SSwap                               (* exchange top and next  *)
  20.  
  21. (* Plain parsing from a string, with poor error reporting *)
  22.  
  23. let fromString (str : string) : expr =
  24.     let lexbuf = Lexing.LexBuffer<char>.FromString(str)
  25.     try
  26.       ExprPar.Main ExprLex.Token lexbuf
  27.     with
  28.       | exn -> let pos = lexbuf.EndPos
  29.                failwithf "%s near line %d, column %d\n"
  30.                   (exn.Message) (pos.Line+1) pos.Column
  31.              
  32. (* Parsing from a text file *)
  33.  
  34. let fromFile (filename : string) =
  35.     use reader = new StreamReader(filename)
  36.     let lexbuf = Lexing.LexBuffer<char>.FromTextReader reader
  37.     try
  38.       ExprPar.Main ExprLex.Token lexbuf
  39.     with
  40.       | exn -> let pos = lexbuf.EndPos
  41.                failwithf "%s in file %s near line %d, column %d\n"
  42.                   (exn.Message) filename (pos.Line+1) pos.Column
  43.  
  44.  
  45. let compString s : list<sinstr> =
  46.     let rec r e (a:list<sinstr>) (x:int) =
  47.         match e with
  48.         | CstI(i) -> SCstI(i)::a
  49.         | Var(s) -> SVar(x)::a
  50.         | Let(s,e1,e2) -> (r e1 a 0)@(r e2 a 0)@SSwap::SPop::a
  51.         | Prim("+",e1,e2) -> (r e1 a x)@(r e2 a (x+1))@SAdd::a
  52.         | Prim("-",e1,e2) -> (r e1 a x)@(r e2 a (x+1))@SSub::a
  53.         | Prim("*",e1,e2) -> (r e1 a x)@(r e2 a (x+1))@SMul::a
  54.     r (fromString s) [] 0
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement