Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/src/ml-yacc/lib/join.sml
ViewVC logotype

Annotation of /sml/trunk/src/ml-yacc/lib/join.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 652 - (view) (download)

1 : monnier 249 (* ML-Yacc Parser Generator (c) 1989 Andrew W. Appel, David R. Tarditi
2 :     *
3 :     * $Log$
4 : blume 652 * Revision 1.3 2000/06/06 02:14:54 blume
5 :     * merging changes from devel branch; new boot files
6 :     *
7 :     * Revision 1.1.1.10.2.1 2000/06/02 08:11:06 blume
8 :     * added several appendices to CM manual;
9 :     * merged recent changes to main trunk into devel branch
10 :     *
11 : monnier 651 * Revision 1.2 2000/06/01 18:33:44 monnier
12 :     * bring revisions from the vendor branch to the trunk
13 :     *
14 : monnier 249 * Revision 1.1.1.10 1999/04/17 18:56:10 monnier
15 :     * version 110.16
16 :     *
17 :     * Revision 1.1.1.1 1997/01/14 01:38:04 george
18 :     * Version 109.24
19 :     *
20 :     * Revision 1.1.1.1 1996/01/31 16:01:42 george
21 :     * Version 109
22 :     *
23 :     *)
24 :    
25 :     (* functor Join creates a user parser by putting together a Lexer structure,
26 :     an LrValues structure, and a polymorphic parser structure. Note that
27 :     the Lexer and LrValues structure must share the type pos (i.e. the type
28 :     of line numbers), the type svalues for semantic values, and the type
29 :     of tokens.
30 :     *)
31 :    
32 :     functor Join(structure Lex : LEXER
33 :     structure ParserData: PARSER_DATA
34 :     structure LrParser : LR_PARSER
35 :     sharing ParserData.LrTable = LrParser.LrTable
36 :     sharing ParserData.Token = LrParser.Token
37 :     sharing type Lex.UserDeclarations.svalue = ParserData.svalue
38 :     sharing type Lex.UserDeclarations.pos = ParserData.pos
39 :     sharing type Lex.UserDeclarations.token = ParserData.Token.token)
40 :     : PARSER =
41 :     struct
42 :     structure Token = ParserData.Token
43 :     structure Stream = LrParser.Stream
44 :    
45 :     exception ParseError = LrParser.ParseError
46 :    
47 :     type arg = ParserData.arg
48 :     type pos = ParserData.pos
49 :     type result = ParserData.result
50 :     type svalue = ParserData.svalue
51 :     val makeLexer = LrParser.Stream.streamify o Lex.makeLexer
52 :     val parse = fn (lookahead,lexer,error,arg) =>
53 :     (fn (a,b) => (ParserData.Actions.extract a,b))
54 :     (LrParser.parse {table = ParserData.table,
55 :     lexer=lexer,
56 :     lookahead=lookahead,
57 :     saction = ParserData.Actions.actions,
58 :     arg=arg,
59 :     void= ParserData.Actions.void,
60 :     ec = {is_keyword = ParserData.EC.is_keyword,
61 :     noShift = ParserData.EC.noShift,
62 :     preferred_change = ParserData.EC.preferred_change,
63 :     errtermvalue = ParserData.EC.errtermvalue,
64 :     error=error,
65 :     showTerminal = ParserData.EC.showTerminal,
66 :     terms = ParserData.EC.terms}}
67 :     )
68 :     val sameToken = Token.sameToken
69 :     end
70 :    
71 :     (* functor JoinWithArg creates a variant of the parser structure produced
72 :     above. In this case, the makeLexer take an additional argument before
73 :     yielding a value of type unit -> (svalue,pos) token
74 :     *)
75 :    
76 :     functor JoinWithArg(structure Lex : ARG_LEXER
77 :     structure ParserData: PARSER_DATA
78 :     structure LrParser : LR_PARSER
79 :     sharing ParserData.LrTable = LrParser.LrTable
80 :     sharing ParserData.Token = LrParser.Token
81 :     sharing type Lex.UserDeclarations.svalue = ParserData.svalue
82 :     sharing type Lex.UserDeclarations.pos = ParserData.pos
83 :     sharing type Lex.UserDeclarations.token = ParserData.Token.token)
84 :     : ARG_PARSER =
85 :     struct
86 :     structure Token = ParserData.Token
87 :     structure Stream = LrParser.Stream
88 :    
89 :     exception ParseError = LrParser.ParseError
90 :    
91 :     type arg = ParserData.arg
92 :     type lexarg = Lex.UserDeclarations.arg
93 :     type pos = ParserData.pos
94 :     type result = ParserData.result
95 :     type svalue = ParserData.svalue
96 :    
97 :     val makeLexer = fn s => fn arg =>
98 :     LrParser.Stream.streamify (Lex.makeLexer s arg)
99 :     val parse = fn (lookahead,lexer,error,arg) =>
100 :     (fn (a,b) => (ParserData.Actions.extract a,b))
101 :     (LrParser.parse {table = ParserData.table,
102 :     lexer=lexer,
103 :     lookahead=lookahead,
104 :     saction = ParserData.Actions.actions,
105 :     arg=arg,
106 :     void= ParserData.Actions.void,
107 :     ec = {is_keyword = ParserData.EC.is_keyword,
108 :     noShift = ParserData.EC.noShift,
109 :     preferred_change = ParserData.EC.preferred_change,
110 :     errtermvalue = ParserData.EC.errtermvalue,
111 :     error=error,
112 :     showTerminal = ParserData.EC.showTerminal,
113 :     terms = ParserData.EC.terms}}
114 :     )
115 :     val sameToken = Token.sameToken
116 :     end;

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0