MixAna.hs revision 6e2c88c65d50b2e44f7afa165e6a5fac0724f08c
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
38df2bfbe2de19e549aa812bab7c79fcf869b308Till MossakowskiModule : $Header$
38df2bfbe2de19e549aa812bab7c79fcf869b308Till MossakowskiDescription : mixfix analysis for terms
aabc0d2680ea5411d5a9c82c1b2ca1f4144ca18fRainer GrabbeCopyright : (c) Christian Maeder and Uni Bremen 2003-2005
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu ProdescuLicense : similar to LGPL, see HetCATS/LICENSE.txt or LIZENZ.txt
2eeec5240b424984e3ee26296da1eeab6c6d739eChristian MaederMaintainer : Christian.Maeder@dfki.de
38df2bfbe2de19e549aa812bab7c79fcf869b308Till MossakowskiStability : experimental
38df2bfbe2de19e549aa812bab7c79fcf869b308Till MossakowskiPortability : portable
38df2bfbe2de19e549aa812bab7c79fcf869b308Till MossakowskiMixfix analysis of terms and patterns, type annotations are also analysed
38df2bfbe2de19e549aa812bab7c79fcf869b308Till Mossakowski , iterateCharts
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maederimport qualified Data.Map as Map
38df2bfbe2de19e549aa812bab7c79fcf869b308Till Mossakowskiimport qualified Data.Set as Set
f7fe363b4d668402d4a604727418e99a48abf533Christian Maederimport qualified Text.ParserCombinators.Parsec as P
2df21ee905717748894ce0d1b775b2a01bef4a44Christian MaederaddType :: Term -> Term -> Term
2df21ee905717748894ce0d1b775b2a01bef4a44Christian MaederaddType (MixTypeTerm q ty ps) t = TypedTerm t q ty ps
2df21ee905717748894ce0d1b775b2a01bef4a44Christian MaederaddType _ _ = error "addType"
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder-- | try to reparse terms as a compound list
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian MaederisCompoundList :: Set.Set [Id] -> [Term] -> Bool
baef5e750fbc19bad340a3293a17ba34d4fabbedChristian MaederisCompoundList compIds =
baef5e750fbc19bad340a3293a17ba34d4fabbedChristian Maeder maybe False (flip Set.member compIds) . mapM reparseAsId
38df2bfbe2de19e549aa812bab7c79fcf869b308Till MossakowskiisTypeList :: Env -> [Term] -> Bool
f57279093718fac174b661b128d03b5049ac467cTill MossakowskiisTypeList e l = case mapM termToType l of
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder Nothing -> False
7f4e941c6b36ee1f694734bb35d82e395a2796b5Christian Maeder let Result ds ml = mapM ( \ t -> anaTypeM (Nothing, t) e) ts
7f4e941c6b36ee1f694734bb35d82e395a2796b5Christian Maeder in isJust ml && not (hasErrors ds)
7f4e941c6b36ee1f694734bb35d82e395a2796b5Christian MaedertermToType :: Term -> Maybe Type
66c74e6bb78d2c417fd8495b5dd267c6bd0acd5aChristian MaedertermToType t = case P.runParser ((case getPosList t of
66c74e6bb78d2c417fd8495b5dd267c6bd0acd5aChristian Maeder [] -> return ()
38df2bfbe2de19e549aa812bab7c79fcf869b308Till Mossakowski p : _ -> P.setPosition $ fromPos p)
2df21ee905717748894ce0d1b775b2a01bef4a44Christian Maeder >> parseType << P.eof) (emptyAnnos ()) "" $ showDoc t "" of
2df21ee905717748894ce0d1b775b2a01bef4a44Christian Maeder Right x -> Just x
baef5e750fbc19bad340a3293a17ba34d4fabbedChristian MaederanaPolyId :: PolyId -> TypeScheme -> State Env (Maybe TypeScheme)
33185a20196bfe66410ce6e9449005f5680a1656Christian MaederanaPolyId (PolyId i@(Id _ cs _) _ _) sc = do
8b66de47c89e252c907c8ed3a5ccd16dbccbfb3eChristian Maeder mSc <- anaTypeScheme sc
3a2de7e5a3c5da0a96c9563617ab332685a41cedChristian Maeder Nothing -> return Nothing
1e56499b4f29cca2c2a8aa47183a4fc248ed29e3Christian Maeder Just newSc@(TypeScheme tvars _ _) -> do
2df21ee905717748894ce0d1b775b2a01bef4a44Christian Maeder , Map.keysSet $ assumps e ]
2df21ee905717748894ce0d1b775b2a01bef4a44Christian Maeder es = filter (not . flip Set.member ids) cs
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder addDiags $ map (\ j -> mkDiag Warning
33185a20196bfe66410ce6e9449005f5680a1656Christian Maeder "unexpected identifier in compound list" j) es
33185a20196bfe66410ce6e9449005f5680a1656Christian Maeder if null cs || null tvars then return () else
7b7ca7ef1ad99f1da0057cb8a6aa68cf6d04359bTill Mossakowski addDiags [mkDiag Hint "is polymorphic compound identifier" i]
7b7ca7ef1ad99f1da0057cb8a6aa68cf6d04359bTill Mossakowski return $ Just newSc
33185a20196bfe66410ce6e9449005f5680a1656Christian MaederresolveQualOp :: PolyId -> TypeScheme -> State Env TypeScheme
33185a20196bfe66410ce6e9449005f5680a1656Christian MaederresolveQualOp i@(PolyId j _ _) sc = do
3a2de7e5a3c5da0a96c9563617ab332685a41cedChristian Maeder mSc <- anaPolyId i sc
f64563593a58e0e9de073c21ae69a1a877cb4692Till Mossakowski Nothing -> return sc
1e56499b4f29cca2c2a8aa47183a4fc248ed29e3Christian Maeder Just nSc -> do
ead4d317053c9092c59a16de66cac61f619a1293Christian Maeder case findOpId e j nSc of
7857e6ac0ed79540893dcb3e22af571ab2894932Till Mossakowski Nothing -> addDiags [mkDiag Error "operation not found" j]
baef5e750fbc19bad340a3293a17ba34d4fabbedChristian Maeder _ -> return ()
baef5e750fbc19bad340a3293a17ba34d4fabbedChristian MaederiterateCharts :: GlobalAnnos -> Set.Set [Id] -> [Term] -> Chart Term
2df21ee905717748894ce0d1b775b2a01bef4a44Christian Maeder -> State Env (Chart Term)
f64563593a58e0e9de073c21ae69a1a877cb4692Till MossakowskiiterateCharts ga compIds terms chart = do
7b7ca7ef1ad99f1da0057cb8a6aa68cf6d04359bTill Mossakowski let self = iterateCharts ga compIds
33185a20196bfe66410ce6e9449005f5680a1656Christian Maeder oneStep = nextChart addType (toMixTerm e) ga chart
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder vs = localVars e
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder tm = typeMap e
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder case terms of
2df21ee905717748894ce0d1b775b2a01bef4a44Christian Maeder [] -> return chart
2df21ee905717748894ce0d1b775b2a01bef4a44Christian Maeder t : tt -> let recurse trm = self tt $ oneStep
2df21ee905717748894ce0d1b775b2a01bef4a44Christian Maeder (trm, exprTok {tokPos = getRange trm}) in case t of
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder MixfixTerm ts -> self (ts ++ tt) chart
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder MixTypeTerm q typ ps -> do
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder mTyp <- anaStarType typ
ecf4047143afe26a351e9fb60827671bf5e2e30dChristian Maeder Nothing -> recurse t
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder Just nTyp -> self tt $ oneStep
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder (MixTypeTerm q (monoType nTyp) ps, typeTok {tokPos = ps})
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder BracketTerm b ts ps ->
ecf4047143afe26a351e9fb60827671bf5e2e30dChristian Maeder let bres = self (expandPos TermToken
2df21ee905717748894ce0d1b775b2a01bef4a44Christian Maeder (getBrackets b) ts ps ++ tt) chart in case (b, ts) of
2df21ee905717748894ce0d1b775b2a01bef4a44Christian Maeder (Squares, _ : _) -> if isCompoundList compIds ts then do
2df21ee905717748894ce0d1b775b2a01bef4a44Christian Maeder addDiags [mkDiag Hint "is compound list" t]
aabc0d2680ea5411d5a9c82c1b2ca1f4144ca18fRainer Grabbe else if isTypeList e ts then do
f7fe363b4d668402d4a604727418e99a48abf533Christian Maeder let testChart = oneStep (t, typeInstTok {tokPos = ps})
f7fe363b4d668402d4a604727418e99a48abf533Christian Maeder if null $ solveDiags testChart then do
aabc0d2680ea5411d5a9c82c1b2ca1f4144ca18fRainer Grabbe addDiags [mkDiag Hint "is type list" t]
4332f307777b02f460ab77a5dfade89628cbc215Rainer Grabbe self tt testChart
4332f307777b02f460ab77a5dfade89628cbc215Rainer Grabbe _ -> case (b, ts, tt) of
aabc0d2680ea5411d5a9c82c1b2ca1f4144ca18fRainer Grabbe (Parens, [QualOp b2 v sc [] _ ps2], hd@(BracketTerm Squares
4332f307777b02f460ab77a5dfade89628cbc215Rainer Grabbe ts2@(_ : _) ps3) : rtt) | isTypeList e ts2 -> do
4332f307777b02f460ab77a5dfade89628cbc215Rainer Grabbe addDiags [mkDiag Hint "is type list" ts2]
4332f307777b02f460ab77a5dfade89628cbc215Rainer Grabbe nSc <- resolveQualOp v sc
baef5e750fbc19bad340a3293a17ba34d4fabbedChristian Maeder self rtt $ oneStep
33185a20196bfe66410ce6e9449005f5680a1656Christian Maeder ( QualOp b2 v nSc (bracketTermToTypes e hd) UserGiven ps2
4332f307777b02f460ab77a5dfade89628cbc215Rainer Grabbe , exprTok {tokPos = appRange ps ps3})
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder QualVar (VarDecl v typ ok ps) -> do
1626d36d680e01037b6ee7ba66925a1d61eebbe9Christian Maeder mTyp <- anaStarType typ
1626d36d680e01037b6ee7ba66925a1d61eebbe9Christian Maeder recurse $ maybe t ( \ nType -> QualVar $ VarDecl v (monoType nType)
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder QualOp b v sc [] k ps -> do
2df21ee905717748894ce0d1b775b2a01bef4a44Christian Maeder nSc <- resolveQualOp v sc
2df21ee905717748894ce0d1b775b2a01bef4a44Christian Maeder recurse $ QualOp b v nSc [] k ps
2df21ee905717748894ce0d1b775b2a01bef4a44Christian Maeder QuantifiedTerm quant decls hd ps -> do
baef5e750fbc19bad340a3293a17ba34d4fabbedChristian Maeder newDs <- mapM (anaddGenVarDecl False) decls
baef5e750fbc19bad340a3293a17ba34d4fabbedChristian Maeder mt <- resolve ga hd
baef5e750fbc19bad340a3293a17ba34d4fabbedChristian Maeder putLocalVars vs
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder putTypeMap tm
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder recurse $ QuantifiedTerm quant (catMaybes newDs) (maybe hd id mt) ps
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder LambdaTerm decls part hd ps -> do
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder mDecls <- mapM (resolvePattern ga) decls
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder let anaDecls = catMaybes mDecls
1626d36d680e01037b6ee7ba66925a1d61eebbe9Christian Maeder bs = concatMap extractVars anaDecls
1626d36d680e01037b6ee7ba66925a1d61eebbe9Christian Maeder checkUniqueVars bs
1626d36d680e01037b6ee7ba66925a1d61eebbe9Christian Maeder mapM_ (addLocalVar False) bs
1626d36d680e01037b6ee7ba66925a1d61eebbe9Christian Maeder mt <- resolve ga hd
1626d36d680e01037b6ee7ba66925a1d61eebbe9Christian Maeder putLocalVars vs
1626d36d680e01037b6ee7ba66925a1d61eebbe9Christian Maeder recurse $ LambdaTerm anaDecls part (maybe hd id mt) ps
1626d36d680e01037b6ee7ba66925a1d61eebbe9Christian Maeder CaseTerm hd eqs ps -> do
1626d36d680e01037b6ee7ba66925a1d61eebbe9Christian Maeder mt <- resolve ga hd
1626d36d680e01037b6ee7ba66925a1d61eebbe9Christian Maeder newEs <- resolveCaseEqs ga eqs
1626d36d680e01037b6ee7ba66925a1d61eebbe9Christian Maeder recurse $ CaseTerm (maybe hd id mt) newEs ps
1626d36d680e01037b6ee7ba66925a1d61eebbe9Christian Maeder LetTerm b eqs hd ps -> do
1626d36d680e01037b6ee7ba66925a1d61eebbe9Christian Maeder newEs <- resolveLetEqs ga eqs
1626d36d680e01037b6ee7ba66925a1d61eebbe9Christian Maeder mt <- resolve ga hd
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder putLocalVars vs
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder recurse $ LetTerm b newEs (maybe hd id mt) ps
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder TermToken tok -> do
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder let (ds1, trm) = convertMixfixToken (literal_annos ga)
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder (flip ResolvedMixTerm []) TermToken tok
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder self tt $ oneStep $ case trm of
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder TermToken _ -> (trm, tok)
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder _ -> (trm, exprTok {tokPos = tokPos tok})
f63170ab2ed53197f50e4575383e7981189c87dcChristian Maeder AsPattern vd p ps -> do
f63170ab2ed53197f50e4575383e7981189c87dcChristian Maeder mp <- resolvePattern ga p
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder recurse $ AsPattern vd (maybe p id mp) ps
8b0bd90bc649e740c134ad0946e0d0409c3c96e6Christian Maeder TypedTerm trm k ty ps -> do
1626d36d680e01037b6ee7ba66925a1d61eebbe9Christian Maeder -- assume that type is analysed
getKnowns :: Id -> Set.Set Token
getPolyIds :: Assumps -> Set.Set Id
getPolyIds = Set.unions . map ( \ (i, s) ->
Set.fold ( \ oi -> case opType oi of
TypeScheme (_ : _) _ _ -> Set.insert i
let (sIds, ids) = Set.partition isSimpleId aIds
&& not (Set.member tok ks)
initRules :: (PrecMap, Set.Set Id) -> [Id] -> [Id] -> [Id] -> [Rule]
anaPattern :: Set.Set Id -> Term -> State Env Term
not (Set.member i s) -> do