Advertisement
Guest User

Untitled

a guest
Dec 10th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 2.87 KB | None | 0 0
  1. // Learn more about F# at http://fsharp.org
  2.  
  3. open System
  4. open System.IO
  5.  
  6. module SnowPlusPlus =
  7.     exception UnknownOperatorException of string
  8.     let removeCommentsFromLine (l: string): string = l.Split("K").GetValue(0).ToString()
  9.     let splitOnLines (str: string) = str.Split("\n")
  10.     let joinToOneLine (stringArray: string list) = String.concat "" stringArray
  11.     let whitespace (list: int list): int list= 31 :: list
  12.     let pipe (list: int list): int list = 3 :: list
  13.     let singlequote (a::b::rest: int list): int list = a + b :: rest
  14.     let dot (a::b::rest: int list): int list = a - b :: b - a :: rest
  15.     let underscore (a::b::rest: int list): int list = a :: a * b :: rest
  16.     let forwardSlash (a::rest: int list): int list = rest
  17.     let i (a::rest: int list) = a :: a :: rest
  18.     let backSlash (a::rest: int list): int list = a + 1 :: rest
  19.     let star (a::b::rest: int list): int list = a / b :: rest
  20.     // These do not work.
  21.     let isEven (x: int): bool = x % 2 = 0;
  22.     let isOdd (x: int): bool = not (isEven x)
  23.     let rightBracket (a::rest: int list): int list = match isEven a with
  24.         | true -> 1 :: rest
  25.         | false -> rest
  26.     let leftBracket (a:: rest: int list): int list = match isOdd a with
  27.         | true -> 1 :: rest
  28.         | false -> rest
  29.     let squiggly (a::b::c::rest: int list): int list = Seq.max [a; b; c] :: rest
  30.     let colon (list: int list): int list = [List.sum list]
  31.     let raiseException (ch: char) (stack: int list): int list =
  32.         printfn "Unknown char %s" (ch.ToString())
  33.         stack
  34.     let parseOperator (ch: char) (stack: int list): int list  = match ch with
  35.         | ':' -> colon stack
  36.         | ''' -> singlequote stack
  37.        | ' ' -> whitespace stack
  38.        | '|' -> pipe stack
  39.        | '.' -> dot stack
  40.        | '_' -> underscore stack
  41.        | '/' -> forwardSlash stack
  42.        | 'i' -> i stack
  43.        | '\\' -> backSlash stack
  44.        | '*' -> star stack
  45.        | ']' -> rightBracket stack
  46.        | '[' -> leftBracket stack
  47.        | '~' -> squiggly stack
  48.        | _ -> raiseException ch stack
  49.  
  50.    let rec parseTree (input: char list) (stack: int list) = match input with
  51.        | [] -> stack
  52.        | head :: tail -> parseTree tail (parseOperator head stack)
  53.    let createAst (stringArray: string[]): char list =
  54.        stringArray
  55.        |> Array.toList
  56.        |> List.map removeCommentsFromLine
  57.        |> joinToOneLine
  58.        |> Seq.toList
  59.  
  60.    let parse (input: char list) = (parseTree input [0])
  61.    let eval (input: string[]) = input |> createAst |> parse
  62.  
  63. let parseTask =
  64.    "input.spp"
  65.    |> File.ReadAllLines
  66.  
  67. [<EntryPoint>]
  68. let main _argv =
  69.    printfn "SnowPlusPlus Starting..."
  70.    // parseTask |> Seq.iter (fun x -> (printfn "%s" (x.ToString())))
  71.    let input =
  72.        parseTask
  73.        |> SnowPlusPlus.eval
  74.  
  75.    printfn "result %s" (input.ToString())
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement