never executed always true always false
1 {-# LANGUAGE DeriveDataTypeable #-}
2 module Conjure.Language.AST.Reformer (HighLevelTree(..),HLTree(..),flatten,flattenSeq,contains,filterContaining,TreeItemLinks(..),ListItemClasses(..)) where
3
4 import Conjure.Language.AST.Syntax
5 import Conjure.Language.Lexer (ETok (..), trueStart, sourcePosAfter)
6 import Conjure.Prelude
7
8
9 import Data.Semigroup ((<>))
10 import qualified Data.Sequence as S
11 import Text.Megaparsec (SourcePos (SourcePos))
12
13
14
15
16 -- class HighLevelTree a where
17 -- makeTree :: HighLevelTree a => a -> S.Seq ETok
18 flatten :: HighLevelTree a => a -> [ETok]
19 flatten x = case makeTree x of
20 HLNone -> []
21 HLTagged _ xs -> concatMap flatten xs
22 HLLeaf t -> [t]
23 flattenSeq :: HighLevelTree a => a -> S.Seq ETok
24 flattenSeq = S.fromList . flatten
25
26 instance HighLevelTree HLTree where
27 makeTree = id
28
29 instance HighLevelTree StatementNode where
30 makeTree x = case x of
31 DeclarationStatement dsn -> makeTree dsn
32 BranchingStatement bsn -> makeTree bsn
33 SuchThatStatement stsn -> makeTree stsn
34 WhereStatement wsn -> makeTree wsn
35 ObjectiveStatement osn -> makeTree osn
36 HeuristicStatement l1 ex -> makeTree l1 <> makeTree ex
37 UnexpectedToken tok -> makeTree tok
38
39 instance HighLevelTree DeclarationStatementNode where
40 makeTree x = case x of
41 FindStatement f fsn -> makeTree f <> makeTree fsn
42 GivenStatement g gsn -> makeTree g <> makeTree gsn
43 LettingStatement t lsn -> makeTree t <> makeTree lsn
44
45
46 instance HighLevelTree LettingStatementNode where
47 makeTree (LettingStatementNode a b c) = mconcat[ makeTree a, makeTree b, makeTree c]
48
49 instance HighLevelTree LettingAssignmentNode where
50 makeTree x = case x of
51 LettingExpr d -> makeTree d
52 LettingDomain d e -> makeTree d <> makeTree e
53 LettingEnum d e f g -> mconcat [makeTree d, makeTree e, makeTree f, makeTree g]
54 LettingUnnamed d e f g h -> mconcat [makeTree d, makeTree e, makeTree f, makeTree g, makeTree h]
55
56 instance HighLevelTree FindStatementNode where
57 makeTree (FindStatementNode a b c) = mconcat [makeTree a, makeTree b, makeTree c]
58
59 instance HighLevelTree GivenStatementNode where
60 makeTree x = case x of
61 GivenStatementNode a b c -> mconcat [makeTree a, makeTree b, makeTree c]
62 GivenEnumNode a b c d -> mconcat [makeTree a, makeTree b, makeTree c, makeTree d]
63
64
65
66 instance HighLevelTree BranchingStatementNode where
67 makeTree (BranchingStatementNode lt lt' ln) = mconcat [makeTree lt, makeTree lt', makeTree ln]
68
69
70 instance HighLevelTree SuchThatStatementNode where
71 makeTree (SuchThatStatementNode l1 l2 l3) = makeTree l1 <> makeTree l2 <> makeTree l3
72 instance HighLevelTree WhereStatementNode where
73 makeTree (WhereStatementNode l1 l2) = makeTree l1 <> makeTree l2
74 instance HighLevelTree ObjectiveStatementNode where
75 makeTree x = case x of
76 ObjectiveMin lt en -> makeTree lt <> makeTree en
77 ObjectiveMax lt en -> makeTree lt <> makeTree en
78
79
80
81
82 instance HighLevelTree ExpressionNode where
83 makeTree x = HLTagged (TIExpression x) $ case x of
84 Literal ln -> [makeTree ln]
85 IdentifierNode nn -> [makeTree nn]
86 MetaVarExpr tk -> [makeTree tk]
87 QuantificationExpr qen -> [makeTree qen]
88 OperatorExpressionNode oen -> [makeTree oen]
89 ParenExpression pen ->[makeTree pen]
90 AbsExpression pen -> [makeTree pen]
91 DomainExpression dex -> [makeTree dex]
92 FunctionalApplicationNode lt ln -> [makeTree lt ,makeTree ln]
93 SpecialCase nd -> [makeTree nd]
94 AttributeAsConstriant l1 exprs -> [makeTree l1 , makeTree exprs]
95 MissingExpressionNode e -> [makeTree e]
96
97 instance HighLevelTree SpecialCaseNode where
98 makeTree x = case x of
99 ExprWithDecls l1 en l2 sns l3 -> mconcat [makeTree l1,makeTree en,makeTree l2, makeTree sns , makeTree l3]
100
101
102 instance HighLevelTree DomainExpressionNode where
103 makeTree (DomainExpressionNode a b c) = makeTree a <> makeTree b <> makeTree c
104 instance HighLevelTree QuantificationExpressionNode where
105 makeTree (QuantificationExpressionNode a b c d e f) = mconcat [
106 makeTree a, makeTree b, makeTree c, makeTree d, makeTree e, makeTree f]
107
108 instance HighLevelTree QuantificationOverNode where
109 makeTree x = case x of
110 QuantifiedSubsetOfNode a b -> makeTree a <> makeTree b
111 QuantifiedMemberOfNode a b -> makeTree a <> makeTree b
112 QuantifiedDomainNode a -> makeTree a
113
114 instance HighLevelTree OverDomainNode where
115 makeTree (OverDomainNode a b) = makeTree a <> makeTree b
116
117 instance HighLevelTree QuanticationGuard where
118 makeTree (QuanticationGuard a b ) = makeTree a <> makeTree b
119
120 instance HighLevelTree AbstractPatternNode where
121 makeTree x = case x of
122 AbstractIdentifier nn -> makeTree nn
123 AbstractMetaVar lt -> makeTree lt
124 AbstractPatternTuple a b -> makeTree a <> makeTree b
125 AbstractPatternMatrix ln -> makeTree ln
126 AbstractPatternSet ln -> makeTree ln
127 instance HighLevelTree QuantificationPattern where
128 makeTree (QuantificationPattern en) = makeTree en
129
130 instance HighLevelTree LiteralNode where
131 makeTree x = case x of
132 IntLiteral lt Nothing -> makeTree lt
133 IntLiteral lt (Just (cln, tag)) -> makeTree lt <> makeTree cln <> makeTree tag
134 BoolLiteral lt -> makeTree lt
135 MatrixLiteral mln -> makeTree mln
136 TupleLiteralNode lt -> makeTree lt
137 TupleLiteralNodeShort st -> makeTree st
138 RecordLiteral lt ln -> makeTree lt <> makeTree ln
139 VariantLiteral lt ln -> makeTree lt <> makeTree ln
140 SetLiteral ln -> makeTree ln
141 MSetLiteral lt ln -> makeTree lt <> makeTree ln
142 FunctionLiteral lt ln -> makeTree lt <> makeTree ln
143 SequenceLiteral lt ln -> makeTree lt <> makeTree ln
144 PermutationLiteral lt ln -> makeTree lt <> makeTree ln
145 RelationLiteral lt ln -> makeTree lt <> makeTree ln
146 PartitionLiteral lt ln -> makeTree lt <> makeTree ln
147
148 instance HighLevelTree ETok where
149 makeTree = HLLeaf
150
151 instance HighLevelTree PermutationElemNode where
152 makeTree (PermutationElemNode ln) = makeTree ln
153
154 instance HighLevelTree PartitionElemNode where
155 makeTree (PartitionElemNode ln) = makeTree ln
156
157 instance HighLevelTree RelationElemNode where
158 makeTree x = case x of
159 RelationElemNodeLabeled lt -> makeTree lt
160 RelationElemNodeShort st -> makeTree st
161
162 instance HighLevelTree ArrowPairNode where
163 makeTree (ArrowPairNode a b c) = mconcat [makeTree a, makeTree b, makeTree c]
164
165 instance HighLevelTree RecordMemberNode where
166 makeTree (RecordMemberNode nn lt en) = mconcat [makeTree nn, makeTree lt, makeTree en]
167 instance HighLevelTree LongTuple where
168 makeTree (LongTuple a b) = makeTree a <> makeTree b
169
170 instance HighLevelTree ShortTuple where
171 makeTree (ShortTuple a) = makeTree a
172
173 instance HighLevelTree MatrixLiteralNode where
174 makeTree ( MatrixLiteralNode a b c d e) = mconcat
175 [ makeTree a
176 , makeTree b
177 , makeTree c
178 , makeTree d
179 , makeTree e
180 ]
181
182 instance HighLevelTree ComprehensionNode where
183 makeTree (ComprehensionNode a b) = makeTree a <> makeTree b
184 instance HighLevelTree ComprehensionExpressionNode where
185 makeTree (ComprehensionExpressionNode a b c d e) =
186 mconcat
187 [ makeTree a
188 , makeTree b
189 , makeTree c
190 , makeTree d
191 , makeTree e
192 ]
193
194 instance HighLevelTree ComprehensionBodyNode where
195 makeTree x = case x of
196 CompBodyCondition en -> makeTree en
197 CompBodyDomain a b c -> makeTree a <> makeTree b <> makeTree c
198 CompBodyGenExpr a b c -> makeTree a <> makeTree b <> makeTree c
199 CompBodyLettingNode a b c d -> mconcat [makeTree a, makeTree b, makeTree c, makeTree d]
200
201 instance HighLevelTree OperatorExpressionNode where
202 makeTree x = case x of
203 PostfixOpNode en pon -> makeTree en <> makeTree pon
204 PrefixOpNode lt en -> makeTree lt <> makeTree en
205 BinaryOpNode en lt en' -> mconcat [makeTree en, makeTree lt, makeTree en']
206
207 instance HighLevelTree PostfixOpNode where
208 makeTree x = case x of
209 IndexedNode l -> makeTree l
210 OpFactorial lt -> makeTree lt
211 ApplicationNode ln -> makeTree ln
212 ExplicitDomain l1 l2 dom l3 -> mconcat [makeTree l1,makeTree l2,makeTree dom,makeTree l3]
213
214
215
216
217 instance HighLevelTree DomainNode where
218 makeTree x = HLTagged (TIDomain x) $ case x of
219 ParenDomainNode a b c -> [makeTree a, makeTree b, makeTree c]
220 BoolDomainNode lt -> [makeTree lt]
221 RangedIntDomainNode lt Nothing ln -> [makeTree lt, makeTree ln]
222 RangedIntDomainNode lt (Just (cln, tag)) ln -> [makeTree lt, makeTree cln, makeTree tag, makeTree ln]
223 MetaVarDomain a -> [makeTree a]
224 RangedEnumNode nn ln -> [makeTree nn , makeTree ln]
225 -- EnumDomainNode nn -> makeTree nn
226 ShortTupleDomainNode ln -> [makeTree ln]
227 TupleDomainNode lt ln -> [makeTree lt , makeTree ln]
228 RecordDomainNode lt ln -> [makeTree lt , makeTree ln]
229 VariantDomainNode lt ln -> [makeTree lt , makeTree ln]
230 MatrixDomainNode a m_ib b c d -> [makeTree a ,makeTree m_ib, makeTree b , makeTree c , makeTree d]
231 SetDomainNode a b c d -> [makeTree a , makeTree b , makeTree c , makeTree d]
232 MSetDomainNode a b c d -> [makeTree a , makeTree b, makeTree c , makeTree d]
233 FunctionDomainNode a b c d e -> [makeTree a , makeTree b , makeTree c , makeTree d,makeTree e]
234 SequenceDomainNode a b c d -> [makeTree a , makeTree b , makeTree c , makeTree d]
235 PermutationDomainNode a b c d -> [makeTree a , makeTree b , makeTree c , makeTree d]
236 RelationDomainNode a b c d -> [makeTree a , makeTree b , makeTree c , makeTree d]
237 PartitionDomainNode a b c d -> [makeTree a , makeTree b , makeTree c , makeTree d]
238 MissingDomainNode m -> [makeTree m]
239
240 instance HighLevelTree IndexedByNode where
241 makeTree (IndexedByNode a b ) = makeTree a <> makeTree b
242
243
244 instance HighLevelTree a => HighLevelTree (Maybe a) where
245 makeTree = maybe mempty makeTree
246
247 instance HighLevelTree AttributeNode where
248 makeTree x = case x of
249 NamedAttributeNode nn m_e -> makeTree nn <> makeTree m_e
250 -- NamedExpressionAttribute nn en -> makeTree nn <> makeTree en
251
252 instance HighLevelTree RangeNode where
253 makeTree x = case x of
254 SingleRangeNode en -> makeTree en
255 OpenRangeNode ddn -> makeTree ddn
256 RightUnboundedRangeNode en ddn -> makeTree en <> makeTree ddn
257 LeftUnboundedRangeNode ddn en -> makeTree ddn <> makeTree en
258 BoundedRangeNode en ddn en' -> mconcat [makeTree en, makeTree ddn, makeTree en']
259
260 -- instance HighLevelTree DoubleDotNode where
261 -- makeTree (DoubleDotNode a b) = makeTree a <> makeTree b
262
263 instance HighLevelTree NamedDomainNode where
264 makeTree (NameDomainNode a Nothing) = makeTree a
265 makeTree (NameDomainNode a (Just (b,c))) = mconcat [makeTree a,makeTree b,makeTree c]
266
267 instance HighLevelTree NameNode where
268 makeTree (NameNode n) = makeTree n
269 makeTree (MissingNameNode n) = makeTree n
270
271 instance HighLevelTree NameNodeS where
272 makeTree (NameNodeS n) = makeTree n
273 instance HighLevelTree ParenExpressionNode where
274 makeTree (ParenExpressionNode a b c) = makeTree a <> makeTree b <> makeTree c
275
276
277
278
279
280 instance HighLevelTree b => HighLevelTree (Sequence b) where
281 makeTree (Seq es) = mconcat $ map makeTree es
282
283 instance HighLevelTree b => HighLevelTree (SeqElem b) where
284 makeTree (SeqElem v s) = makeTree v <> makeTree s
285 makeTree (MissingSeqElem v s) = makeTree v <> makeTree s
286 instance HighLevelTree b => HighLevelTree [b] where
287 makeTree = HLTagged TIGeneral . map makeTree
288
289 type TreeTag = ListItemClasses
290 data HLTree
291 = HLTagged TreeItemLinks [HLTree]
292 | HLLeaf ETok
293 | HLNone
294 deriving (Show,Data,Typeable)
295
296 instance Semigroup HLTree where
297 HLNone <> a = a
298 a <> HLNone = a
299 HLTagged TIGeneral xs <> a = HLTagged TIGeneral (xs++[a])
300 a <> HLTagged TIGeneral xs = HLTagged TIGeneral $ a:xs
301 a <> b = HLTagged TIGeneral [a,b]
302
303 instance Monoid HLTree where
304 mempty = HLNone
305
306 taggedSeq :: HighLevelTree a => TreeTag -> Sequence a -> HLTree
307 taggedSeq s (Seq els) = HLTagged (TIList s) $ makeTree <$> els
308 taggedList :: HighLevelTree a => TreeTag -> ListNode a -> HLTree
309 taggedList s (ListNode a b c) = HLTagged TIGeneral $ makeTree a : taggedSeq s b : [makeTree c]
310
311 -- Tag types for nodes, mainly used to guide completions
312 data ListItemClasses
313 = ICAttribute
314 | ICExpression
315 | ICDomain
316 | ICRange
317 | ICIdentifier
318 | ICStatement
319 deriving (Show,Data,Ord,Eq)
320
321 -- Embed the actual syntax portion into the tree, in case needed
322 data TreeItemLinks
323 = TIExpression ExpressionNode
324 | TIDomain DomainNode
325 | TIList ListItemClasses
326 | TIGeneral
327 deriving (Show,Data)
328 instance Eq TreeItemLinks where
329 TIGeneral == TIGeneral = True
330 _ == _ = False
331 instance HighLevelTree (ListNode ExpressionNode) where
332 makeTree = taggedList ICExpression
333 instance HighLevelTree (ListNode NameNode) where
334 makeTree = taggedList ICIdentifier
335 instance HighLevelTree (ListNode DomainNode) where
336 makeTree = taggedList ICDomain
337
338 instance HighLevelTree (ListNode RangeNode) where
339 makeTree = taggedList ICRange
340
341 instance HighLevelTree (ListNode AttributeNode) where
342 makeTree = taggedList ICAttribute
343 instance HighLevelTree (ListNode RecordMemberNode) where
344 makeTree = taggedList ICIdentifier
345 instance HighLevelTree (ListNode ArrowPairNode) where
346 makeTree = taggedList ICIdentifier
347 instance HighLevelTree (ListNode RelationElemNode) where
348 makeTree = taggedList ICIdentifier
349 instance HighLevelTree (ListNode PermutationElemNode) where
350 makeTree = taggedList ICIdentifier
351 instance HighLevelTree (ListNode PartitionElemNode) where
352 makeTree = taggedList ICIdentifier
353 instance HighLevelTree (ListNode NamedDomainNode) where
354 makeTree = taggedList ICIdentifier
355
356 instance HighLevelTree (ListNode AbstractPatternNode) where
357 makeTree = taggedList ICIdentifier
358 class HighLevelTree a where
359 makeTree :: a -> HLTree
360
361 instance HighLevelTree LToken where
362 makeTree (RealToken a) = makeTree a
363 makeTree (SkippedToken t) = HLLeaf t
364 makeTree (MissingToken m) = HLLeaf m
365 instance HighLevelTree SToken where
366 makeTree (StrictToken ts t) = HLTagged TIGeneral $ (HLLeaf <$> ts) ++ [HLLeaf t]
367
368 instance HighLevelTree ProgramTree where
369 makeTree (ProgramTree Nothing sts cln) = HLTagged TIGeneral $ (HLTagged (TIList ICStatement) $ makeTree <$> sts) : [makeTree cln]
370 makeTree (ProgramTree (Just lv) sts cln) = HLTagged TIGeneral $ [makeTree lv] ++ (makeTree <$> sts) ++ [makeTree cln]
371
372 instance HighLevelTree LangVersionNode where
373 makeTree (LangVersionNode a b c) = HLTagged TIGeneral $ makeTree a : makeTree b : [makeTree c]
374
375
376 -- getContainers :: HLTree -> Int -> Int -> HLTree
377 -- getContainers HLNone r c = HLNone
378
379
380 bounds :: ETok -> SourcePos -> Bool
381 bounds t (SourcePos _ r c)= let
382 (SourcePos _ rl cl,SourcePos _ rr cr) = (trueStart t,sourcePosAfter t)
383 in r >= rl && c >= cl && r <= rr && c <= cr
384
385 -- inBounds :: SourcePos -> HLTree -> Bool
386 -- inBounds (SourcePos _ r c) t
387 -- | null $ flatten t = False
388 -- | otherwise = let
389 -- (SourcePos _ rl cl,SourcePos _ rr cr) = bounds t
390 -- in r >= rl && c >= cl && r <= rr && c <= cr
391
392 contains :: SourcePos -> HLTree -> Bool
393 contains p t = case t of
394 HLNone -> False
395 HLLeaf e -> bounds e p
396 HLTagged _ xs -> any (contains p) xs
397 -- HLGeneral xs -> any (contains p) xs
398 -- HLList _ xs -> any (contains p ) xs
399
400 filterContaining :: SourcePos -> HLTree -> [HLTree]
401 filterContaining _ HLNone = []
402 filterContaining p n@(HLLeaf _) = [n |contains p n]
403 filterContaining p (HLTagged t xs) = let cs = [x | x <-xs,contains p x]
404 in HLTagged t cs : concatMap (filterContaining p) cs