File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -40,7 +40,7 @@ let private epilogue context typeBuilder (ilGen : ILGenerator) =
4040 ilGen.Emit OpCodes.Ret
4141 ilGen.EndScope()
4242
43- let compile ( source : StreamReader ) ( assemblyName : string ) ( fileName : string ) ( asmRefs : string list ): unit =
43+ let compile ( source : Stream ) ( assemblyName : string ) ( fileName : string ) ( asmRefs : string list ): unit =
4444 let assemblyName = new AssemblyName( assemblyName)
4545 let assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly( assemblyName, AssemblyBuilderAccess.Save)
4646 let moduleBuilder = assemblyBuilder.DefineDynamicModule( assemblyBuilder.GetName() .Name, fileName)
@@ -61,13 +61,12 @@ let compile (source : StreamReader) (assemblyName : string) (fileName : string)
6161 List.iter context.loadAssembly ( List.map Assembly.LoadFrom asmRefs)
6262
6363 prologue ilGenerator
64- while not source.EndOfStream do
65- try
66- let sexp = Reader.parse source
67- let gen = gf.MakeGenerator context sexp
68- gen.Generate ilGenerator
69- with
70- | ex -> printfn " File: %A \n Form: %A \n Error: %A " fileName sexp ex.Source
64+ try
65+ Reader.parse fileName source |> List.iter ( fun sexp ->
66+ let gen = gf.MakeGenerator context sexp
67+ gen.Generate ilGenerator)
68+ with
69+ | ex -> printfn " File: %A \n Form: %A \n Error: %A " fileName sexp ex.Source
7170
7271 epilogue context typeBuilder ilGenerator
7372
Original file line number Diff line number Diff line change @@ -33,6 +33,7 @@ for arg in (List.tail args) do
3333 else
3434 sources <- arg :: sources
3535for fileName in sources do
36- let source = new StreamReader ( File.Open ( fileName, FileMode.Open))
36+ let source = File.Open ( fileName, FileMode.Open) :> Stream
3737 let assemblyName = Path.GetFileNameWithoutExtension fileName
3838 Generator.compile source assemblyName ( assemblyName + " .exe" ) asmRefs
39+ source.Close()
Original file line number Diff line number Diff line change @@ -78,28 +78,11 @@ let atom = (pnumber <|> string <|> symbol) |>> Atom
7878
7979let listElement = choice [ atom; list]
8080let sexp = ws ( pstring " (" ) >>. many ( ws listElement) .>> ws ( pstring " )" ) |>> List
81- let parser = choice [ atom; sexp]
81+ let parser = many1 ( choice [ atom; sexp])
8282do listRef := sexp
8383
84- let rec read_form ( stream : TextReader ) ( acc : string ) balance =
85- let line = stream.ReadLine()
86- let delta = balance
87- String.iter ( fun ( c ) ->
88- match ( c) with
89- | '(' -> delta := ! delta + 1
90- | ')' -> delta := ! delta - 1
91- |_ -> delta := ! delta)
92- line
93- if ! delta = 0 && not ( acc.Trim() = " " ) then
94- String.concat " " [ acc; line]
95- else read_ form stream ( String.concat " " [ acc; line]) delta
96-
97- let read stream =
98- let form = ( read_ form stream " " ( ref 0 )) .Trim()
99- run parser form
100-
101- let parse ( source : StreamReader ) =
102- let form = read source
84+ let parse ( sourceName : string ) ( source : Stream ) =
85+ let form = runParserOnStream parser () sourceName source Text.Encoding.UTF8
10386 match form with
10487 | Success( result, _, _) -> result
10588 | Failure( errorMsg, _, _) -> failwithf " Failure: %s " errorMsg
You can’t perform that action at this time.
0 commit comments