-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathparsetest.sml
47 lines (44 loc) · 1.69 KB
/
parsetest.sml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
structure Parse : sig val parse : string -> unit end =
struct
structure TigerLrVals = TigerLrValsFun(structure Token = LrParser.Token)
structure Lex = TigerLexFun(structure Tokens = TigerLrVals.Tokens)
structure TigerP = Join(structure ParserData = TigerLrVals.ParserData
structure Lex=Lex
structure LrParser = LrParser)
fun parse filename =
let val _ = (ErrorMsg.reset(); ErrorMsg.fileName := filename)
val file = TextIO.openIn filename
fun get _ = TextIO.input file
fun parseerror(s,p1,p2) = ErrorMsg.error p1 s
val lexer = LrParser.Stream.streamify (Lex.makeLexer get)
val (absyn, _) = TigerP.parse(30,lexer,parseerror,())
in TextIO.closeIn file;
absyn
end handle LrParser.ParseError => raise ErrorMsg.Error
fun invoke lexstream =
let fun print_error (s,i:int,_) =
TextIO.output(TextIO.stdOut,
"Error, line " ^ (Int.toString i) ^ ", " ^ s ^ "\n")
in TigerP.parse(0,lexstream,print_error,())
end
(*fun calc filename =
let
val file = TextIO.openIn filename
fun get _ = TextIO.input file
val lexer = TigerP.makeLexer get
val dummyEOF = TigerLrVals.Tokens.EOF(0,0)
val dummySEMI = TigerLrVals.Tokens.SEMICOLON(0,0)
fun loop lexer =
let val (result,lexer) = invoke lexer
val (nextToken,lexer) = TigerP.Stream.get lexer
in case result
of SOME r =>
TextIO.output(TextIO.stdOut,
"result = " ^ (Int.toString r) ^ "\n")
| NONE => ();
if TigerP.sameToken(nextToken,dummyEOF) then ()
else loop lexer
end
in loop lexer
end*)
end