Import Debian changes 20180207-1
[hcoop/debian/mlton.git] / lib / mlyacc-lib / join.sml
CommitLineData
7f918cf1
CE
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;