1(* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi *)
2
3(* functor Join creates a user parser by putting together a Lexer structure,
4   an LrValues structure, and a polymorphic parser structure.  Note that
5   the Lexer and LrValues structure must share the type pos (i.e. the type
6   of line numbers), the type svalues for semantic values, and the type
7   of tokens.
8*)
9
10functor Join(structure Lex : LEXER
11	     structure ParserData: PARSER_DATA
12	     structure LrParser : LR_PARSER
13	     sharing ParserData.LrTable = LrParser.LrTable
14	     sharing ParserData.Token = LrParser.Token
15	     sharing type Lex.UserDeclarations.svalue = ParserData.svalue
16	     sharing type Lex.UserDeclarations.pos = ParserData.pos
17	     sharing type Lex.UserDeclarations.token = ParserData.Token.token)
18		 : PARSER =
19struct
20    structure Token = ParserData.Token
21    structure Stream = LrParser.Stream
22 
23    exception ParseError = LrParser.ParseError
24
25    type arg = ParserData.arg
26    type pos = ParserData.pos
27    type result = ParserData.result
28    type svalue = ParserData.svalue
29    val makeLexer = LrParser.Stream.streamify o Lex.makeLexer
30    val parse = fn (lookahead,lexer,error,arg) =>
31	(fn (a,b) => (ParserData.Actions.extract a,b))
32     (LrParser.parse {table = ParserData.table,
33	        lexer=lexer,
34		lookahead=lookahead,
35		saction = ParserData.Actions.actions,
36		arg=arg,
37		void= ParserData.Actions.void,
38	        ec = {is_keyword = ParserData.EC.is_keyword,
39		      noShift = ParserData.EC.noShift,
40		      preferred_change = ParserData.EC.preferred_change,
41		      errtermvalue = ParserData.EC.errtermvalue,
42		      error=error,
43		      showTerminal = ParserData.EC.showTerminal,
44		      terms = ParserData.EC.terms}}
45      )
46     val sameToken = Token.sameToken
47end
48
49(* functor JoinWithArg creates a variant of the parser structure produced 
50   above.  In this case, the makeLexer take an additional argument before
51   yielding a value of type unit -> (svalue,pos) token
52 *)
53
54functor JoinWithArg(structure Lex : ARG_LEXER
55	     structure ParserData: PARSER_DATA
56	     structure LrParser : LR_PARSER
57	     sharing ParserData.LrTable = LrParser.LrTable
58	     sharing ParserData.Token = LrParser.Token
59	     sharing type Lex.UserDeclarations.svalue = ParserData.svalue
60	     sharing type Lex.UserDeclarations.pos = ParserData.pos
61	     sharing type Lex.UserDeclarations.token = ParserData.Token.token)
62		 : ARG_PARSER  =
63struct
64    structure Token = ParserData.Token
65    structure Stream = LrParser.Stream
66
67    exception ParseError = LrParser.ParseError
68
69    type arg = ParserData.arg
70    type lexarg = Lex.UserDeclarations.arg
71    type pos = ParserData.pos
72    type result = ParserData.result
73    type svalue = ParserData.svalue
74
75    val makeLexer = fn s => fn arg =>
76		 LrParser.Stream.streamify (Lex.makeLexer s arg)
77    val parse = fn (lookahead,lexer,error,arg) =>
78	(fn (a,b) => (ParserData.Actions.extract a,b))
79     (LrParser.parse {table = ParserData.table,
80	        lexer=lexer,
81		lookahead=lookahead,
82		saction = ParserData.Actions.actions,
83		arg=arg,
84		void= ParserData.Actions.void,
85	        ec = {is_keyword = ParserData.EC.is_keyword,
86		      noShift = ParserData.EC.noShift,
87		      preferred_change = ParserData.EC.preferred_change,
88		      errtermvalue = ParserData.EC.errtermvalue,
89		      error=error,
90		      showTerminal = ParserData.EC.showTerminal,
91		      terms = ParserData.EC.terms}}
92      )
93    val sameToken = Token.sameToken
94end;
95