Program.fs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. module Program
  2. open System
  3. open System.IO
  4. let genOp () =
  5. #if INTERACTIVE
  6. #r "C:\Program Files\FSharpPowerPack-2.0.0.0\\bin\FSharp.PowerPack.dll"
  7. #load "QS.fs"
  8. #load "QSParser.fs"
  9. #load "QSLexer.fs"
  10. #endif
  11. let join sep (xs:string list) = System.String.Join(sep, xs)
  12. QSLexer.ops |> Map.toList |> List.map (fun (s, _) -> "\"" + s + "\"") |> join " | " |> printfn "%s"
  13. let parseFile path =
  14. let read = File.ReadAllText path
  15. let lexbuf = Lexing.LexBuffer<_>.FromString read
  16. QSParser.start QSLexer.tokenize lexbuf
  17. let parse (str:string) =
  18. let stri = string str // так надо, без нее f# interactive выдает нечто непонятное
  19. let lexbuf = Lexing.LexBuffer<char>.FromString str
  20. QSParser.parseStatements QSLexer.tokenize lexbuf
  21. let lextest path =
  22. let read = File.ReadAllText path
  23. let listTokens = System.Collections.Generic.List<(QSParser.token*int)>(10000)
  24. let lexbuf = Lexing.LexBuffer<_>.FromString read
  25. //let string_buff = new System.Text.StringBuilder(4000)
  26. let rec f currIdx =
  27. let exnf (e:exn) =
  28. let count = 15
  29. let lower = let n = currIdx - count - 1 in if n < 0 then 0 else n
  30. let xs = listTokens.GetRange(lower, currIdx - lower)
  31. xs |> Seq.iter (printfn "%A")
  32. printfn "%s" e.Message
  33. printfn "line %d" lexbuf.StartPos.Line
  34. printfn "%A" lexbuf.Lexeme
  35. failwithf "%A" e
  36. if not lexbuf.IsPastEndOfStream then
  37. try
  38. (QSLexer.tokenize lexbuf, lexbuf.StartPos.Line) |> listTokens.Add
  39. with
  40. | :? QSLexer.Lexical_error as e -> exnf e
  41. | e -> exnf e
  42. f (currIdx + 1)
  43. f 0
  44. printfn "lex ok"
  45. let rec y () =
  46. printfn "parse"
  47. let read = File.ReadAllText("input")
  48. let lexbuf = Lexing.LexBuffer<_>.FromString read
  49. try
  50. QSParser.start QSLexer.tokenize lexbuf
  51. with | e ->
  52. printfn "%A" e.Message
  53. let x = System.Console.ReadKey()
  54. y()
  55. let writer = new StreamWriter("output")
  56. let writen t s = let s:string = sprintf t s in writer.WriteLine s
  57. QS.printLocs (y()) |> writer.Write
  58. writer.Close()
  59. printfn "Done!"
  60. Console.ReadKey () |> ignore