MixfixParser.hs revision a91ba3a25448d1aa24aaa6f094316334187084d5
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
375
376
377
378
379
380
381
382
383
384
385
386
387
388
ea03c5d09694b4a966fbd19d46cfa5772648d95fChristian MaederModule : $Header$
ea03c5d09694b4a966fbd19d46cfa5772648d95fChristian MaederDescription : Mixfix analysis of terms
ea03c5d09694b4a966fbd19d46cfa5772648d95fChristian MaederCopyright : Christian Maeder and Uni Bremen 2002-2006
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian MaederLicense : similar to LGPL, see HetCATS/LICENSE.txt or LIZENZ.txt
ea03c5d09694b4a966fbd19d46cfa5772648d95fChristian MaederMaintainer : Christian.Maeder@dfki.de
ea03c5d09694b4a966fbd19d46cfa5772648d95fChristian MaederStability : experimental
ea03c5d09694b4a966fbd19d46cfa5772648d95fChristian MaederPortability : portable
502ed7ed7fecd10b6d0c83cdd48a244ec45e840aChristian MaederMixfix analysis of terms
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder ( resolveFormula, resolveMixfix, MixResolve
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder , resolveMixTrm, resolveMixFrm
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder , IdSets, mkIdSets, emptyIdSets, unite, single
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder , makeRules, Mix(..), emptyMix
7c57322afb6342e5cc8b1fdc96050b707407fc61Christian Maeder , ids_BASIC_SPEC, ids_SIG_ITEMS, ids_OP_ITEM, ids_PRED_ITEM)
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maederimport qualified Data.Set as Set
7f0e81a8fc10c17b13569f23474a0e3fbfa79e7dChristian Maederimport qualified Data.Map as Map
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maederdata Mix b s f e = MixRecord
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder { getBaseIds :: b -> IdSets -- ^ ids of extra basic items
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder , getSigIds :: s -> IdSets -- ^ ids of extra sig items
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder , getExtIds :: e -> IdSets -- ^ ids of signature extensions
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder , mixRules :: (Token -> [Rule], Rules) -- ^ rules for Earley
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder , putParen :: f -> f -- ^ parenthesize extended formula
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder , mixResolve :: MixResolve f -- ^ resolve extended formula
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder-- | an initially empty record
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian MaederemptyMix :: Mix b s f e
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian MaederemptyMix = MixRecord
502ed7ed7fecd10b6d0c83cdd48a244ec45e840aChristian Maeder { getBaseIds = const emptyIdSets
ea03c5d09694b4a966fbd19d46cfa5772648d95fChristian Maeder , getSigIds = const emptyIdSets
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder , getExtIds = const emptyIdSets
ea03c5d09694b4a966fbd19d46cfa5772648d95fChristian Maeder , mixRules = error "emptyMix"
502ed7ed7fecd10b6d0c83cdd48a244ec45e840aChristian Maeder , putParen = id
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder , mixResolve = const $ const return
7c57322afb6342e5cc8b1fdc96050b707407fc61Christian Maeder-- precompute non-simple op and pred identifier for mixfix rules
502ed7ed7fecd10b6d0c83cdd48a244ec45e840aChristian Maeder-- | the precomputed sets of op and pred (non-simple) identifiers
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maedertype IdSets = (Set.Set Id, Set.Set Id) -- ops are first component
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder-- | the empty 'IdSets'
502ed7ed7fecd10b6d0c83cdd48a244ec45e840aChristian MaederemptyIdSets :: IdSets
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder-- | union 'IdSets'
7c57322afb6342e5cc8b1fdc96050b707407fc61Christian Maederunite :: [IdSets] -> IdSets
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maederunite l = (Set.unions $ map fst l, Set.unions $ map snd l)
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder-- | get all ids of a basic spec
502ed7ed7fecd10b6d0c83cdd48a244ec45e840aChristian Maederids_BASIC_SPEC :: (b -> IdSets) -> (s -> IdSets) -> BASIC_SPEC b s f -> IdSets
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maederids_BASIC_SPEC f g (Basic_spec al) =
7c57322afb6342e5cc8b1fdc96050b707407fc61Christian Maeder unite $ map (ids_BASIC_ITEMS f g . item) al
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maederids_BASIC_ITEMS :: (b -> IdSets) -> (s -> IdSets)
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder -> BASIC_ITEMS b s f -> IdSets
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maederids_BASIC_ITEMS f g bi = case bi of
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder Sig_items sis -> ids_SIG_ITEMS g sis
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder Free_datatype _ al _ -> ids_anDATATYPE_DECLs al
502ed7ed7fecd10b6d0c83cdd48a244ec45e840aChristian Maeder Sort_gen al _ -> unite $ map (ids_SIG_ITEMS g . item) al
7c57322afb6342e5cc8b1fdc96050b707407fc61Christian Maeder Ext_BASIC_ITEMS b -> f b
7c57322afb6342e5cc8b1fdc96050b707407fc61Christian Maeder _ -> emptyIdSets
7c57322afb6342e5cc8b1fdc96050b707407fc61Christian Maederids_anDATATYPE_DECLs :: [Annoted DATATYPE_DECL] -> IdSets
7c57322afb6342e5cc8b1fdc96050b707407fc61Christian Maederids_anDATATYPE_DECLs al =
7c57322afb6342e5cc8b1fdc96050b707407fc61Christian Maeder (Set.unions $ map (ids_DATATYPE_DECL . item) al, Set.empty)
7c57322afb6342e5cc8b1fdc96050b707407fc61Christian Maeder-- | get all ids of a sig items
3c72be149cf673945cbe07a04c336fb8f4d406a3Christian Maederids_SIG_ITEMS :: (s -> IdSets) -> SIG_ITEMS s f -> IdSets
7c57322afb6342e5cc8b1fdc96050b707407fc61Christian Maederids_SIG_ITEMS f si = case si of
7c57322afb6342e5cc8b1fdc96050b707407fc61Christian Maeder Sort_items _ _ _ -> emptyIdSets
7c57322afb6342e5cc8b1fdc96050b707407fc61Christian Maeder Op_items al _ -> (Set.unions $ map (ids_OP_ITEM . item) al, Set.empty)
7c57322afb6342e5cc8b1fdc96050b707407fc61Christian Maeder Pred_items al _ -> (Set.empty, Set.unions $ map (ids_PRED_ITEM . item) al)
3c72be149cf673945cbe07a04c336fb8f4d406a3Christian Maeder Datatype_items _ al _ -> ids_anDATATYPE_DECLs al
7c57322afb6342e5cc8b1fdc96050b707407fc61Christian Maeder Ext_SIG_ITEMS s -> f s
3c72be149cf673945cbe07a04c336fb8f4d406a3Christian Maeder-- | get all op ids of an op item
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maederids_OP_ITEM :: OP_ITEM f -> Set.Set Id
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maederids_OP_ITEM o = case o of
3c72be149cf673945cbe07a04c336fb8f4d406a3Christian Maeder Op_decl ops _ _ _ -> Set.unions $ map single ops
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder Op_defn i _ _ _ -> single i
502ed7ed7fecd10b6d0c83cdd48a244ec45e840aChristian Maeder-- | same as singleton
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maedersingle :: Id -> Set.Set Id
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder-- | get all pred ids of a pred item
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maederids_PRED_ITEM :: PRED_ITEM f -> Set.Set Id
502ed7ed7fecd10b6d0c83cdd48a244ec45e840aChristian Maederids_PRED_ITEM p = case p of
7c57322afb6342e5cc8b1fdc96050b707407fc61Christian Maeder Pred_decl preds _ _ -> Set.unions $ map single preds
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maeder Pred_defn i _ _ _ -> single i
7c57322afb6342e5cc8b1fdc96050b707407fc61Christian Maederids_DATATYPE_DECL :: DATATYPE_DECL -> Set.Set Id
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maederids_DATATYPE_DECL (Datatype_decl _ al _) =
502ed7ed7fecd10b6d0c83cdd48a244ec45e840aChristian Maeder Set.unions $ map (ids_ALTERNATIVE . item) al
c00adad2e9459b422dee09e3a2bddba66b433bb7Christian Maederids_ALTERNATIVE :: ALTERNATIVE -> Set.Set Id
7c57322afb6342e5cc8b1fdc96050b707407fc61Christian Maederids_ALTERNATIVE a = case a of
Alt_construct _ i cs _ -> Set.unions $ single i : map ids_COMPONENTS cs
Subsorts _ _ -> Set.empty
ids_COMPONENTS :: COMPONENTS -> Set.Set Id
Cons_select _ l _ _ -> Set.unions $ map single l
Sort _ -> Set.empty
let addR p = Set.fold ( \ i@(Id (t : _) _ _) ->
Map.insertWith (++) t
lm = foldr ( \ r@(_, _, t : _) -> Map.insertWith (++) t [r])
Map.empty $ listRules 1 ga
(spreds, rpreds) = Set.partition isSimpleId preds
sops = Set.union ops spreds
m = Map.insert placeTok uRules
$ Map.insert varTok [varR]
$ Map.insert exprTok
in (if isSimpleToken tok && not (Set.member tId sops)
else []) ++ Map.findWithDefault [] tok m
let addR p = Set.fold ( \ i l -> mixRule p i : l)
(cOps, sOps) = Set.partition begPlace opS
addR p = Set.fold ( \ i l ->