1 (* Uses the generated lexer
and parser to export parsing functions
7 structure Absyn
: ABSYN
9 (* parse a program from a
string *)
11 val prog_parse
: string -> Absyn
.absyn
13 (* parse a query from a
string *)
15 val query_parse
: string -> Absyn
.absyn
17 (* parse a program
in a file
*)
19 val file_parse
: string -> Absyn
.absyn
21 (* parse a query from the standard input
*)
23 val top_parse
: unit
-> Absyn
.absyn
25 end (* signature PARSE
*)
28 functor Parse (structure Absyn
: ABSYN
29 structure Interface
: INTERFACE
30 structure Parser
: PARSER
31 sharing type Parser
.arg
= Interface
.arg
32 sharing type Parser
.pos
= Interface
.pos
33 sharing type Parser
.result
= Absyn
.absyn
34 structure Tokens
: Fol_TOKENS
35 sharing type Tokens
.token
= Parser
.Token
.token
36 sharing type Tokens
.svalue
= Parser
.svalue
40 structure Absyn
= Absyn
42 fun parse (dummyToken
,lookahead
,reader
: int -> string) =
43 let val _
= Interface
.init_line()
44 val empty
= !Interface
.line
45 val dummyEOF
= Tokens
.EOF(empty
,empty
)
46 val dummyTOKEN
= dummyToken(empty
,empty
)
48 let val newLexer
= Parser
.Stream
.cons(dummyTOKEN
,lexer
)
49 in Parser
.parse(lookahead
,newLexer
,Interface
.error
,
53 let val (result
,lexer
) = invoke lexer
54 val (nextToken
,lexer
) = Parser
.Stream
.get lexer
55 in if Parser
.sameToken(nextToken
,dummyEOF
) then result
58 in loop (Parser
.makeLexer reader
)
63 in fn _
=> !next
before next
:= ""
66 fun prog_parse s
= parse (Tokens
.PARSEPROG
,15,string_reader s
)
68 fun query_parse s
= parse (Tokens
.PARSEQUERY
,15,string_reader s
)
71 let val dev
= TextIO.openIn name
72 in (parse (Tokens
.PARSEPROG
,15,fn i
=> TextIO.inputN(dev
,i
)))
73 before TextIO.closeIn dev
77 parse (Tokens
.PARSEQUERY
,0,(fn i
=>
78 (case TextIO.inputLine
TextIO.stdIn
82 end (* functor Parse
*)