Skip to content

Commit 7c150bc

Browse files
committed
fixed source reading
1 parent 3a11388 commit 7c150bc

3 files changed

Lines changed: 12 additions & 29 deletions

File tree

ngc/Generator.fs

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff 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\nForm: %A\nError: %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\nForm: %A\nError: %A" fileName sexp ex.Source
7170

7271
epilogue context typeBuilder ilGenerator
7372

ngc/Program.fs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ for arg in (List.tail args) do
3333
else
3434
sources <- arg :: sources
3535
for 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()

ngc/Reader.fs

Lines changed: 3 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -78,28 +78,11 @@ let atom = (pnumber <|> string <|> symbol) |>> Atom
7878

7979
let listElement = choice [atom;list]
8080
let sexp = ws (pstring "(") >>. many (ws listElement) .>> ws (pstring ")") |>> List
81-
let parser = choice [atom;sexp]
81+
let parser = many1 (choice [atom;sexp])
8282
do 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

0 commit comments

Comments
 (0)