0 | module Graphics.DOT.Parser
2 | import Libraries.Text.Parser
8 | import Graphics.DOT.Lexer
9 | import Graphics.DOT.AST
18 | Show (ParsingError DOTToken) where
19 | show (Error errStr Nothing) = errStr
20 | show (Error errStr (Just (MkBounds startLine startCol endLine endCol)))
21 | = "\{errStr}@L\{show startLine}:\{show startCol}-L\{show endLine}:\{show endCol}"
27 | lBrace : Grammar _ DOTToken True ()
28 | lBrace = terminal "Expected '{'"
29 | (\case LBrace => Just ()
32 | rBrace : Grammar _ DOTToken True ()
33 | rBrace = terminal "Expected '}' (might not be properly closed?)"
34 | (\case RBrace => Just ()
37 | lBracket : Grammar _ DOTToken True ()
38 | lBracket = terminal "Expected '['"
39 | (\case LBracket => Just ()
42 | rBracket : Grammar _ DOTToken True ()
43 | rBracket = terminal "Expected ']' (might not be properly closed?)"
44 | (\case RBracket => Just ()
47 | colon : Grammar _ DOTToken True ()
48 | colon = terminal "Expected ':'"
49 | (\case Colon => Just ()
52 | semicolon : Grammar _ DOTToken True ()
53 | semicolon = terminal "Expected ';' (shouldn't get this message)"
54 | (\case Semicolon => Just ()
57 | comma : Grammar _ DOTToken True ()
58 | comma = terminal "Expected ','"
59 | (\case Comma => Just ()
62 | equals : Grammar _ DOTToken True ()
63 | equals = terminal "Expected '='"
64 | (\case Equal => Just ()
67 | nameID : Grammar _ DOTToken True DOTID
68 | nameID = terminal "Not a name"
69 | (\case (NameID name) => Just (NameID name)
72 | numeralID : Grammar _ DOTToken True DOTID
73 | numeralID = terminal "Not a numeral"
74 | (\case (NumeralID num) => Just (Numeral num)
77 | stringID : Grammar _ DOTToken True DOTID
78 | stringID = terminal "Not a string"
79 | (\case (StringID str) => Just (StringID str)
82 | htmlID : Grammar _ DOTToken True DOTID
83 | htmlID = terminal "Not an HTML string"
84 | (\case (HTML_ID html) => Just (HTML html)
87 | nodeKW : Grammar _ DOTToken True Keyword
88 | nodeKW = terminal "Expected 'node' keyword"
89 | (\case Keyword "node" => Just NodeKW
92 | edgeKW : Grammar _ DOTToken True Keyword
93 | edgeKW = terminal "Expecetd 'edge' keyword"
94 | (\case Keyword "edge" => Just EdgeKW
97 | graphKW : Grammar _ DOTToken True Keyword
98 | graphKW = terminal "Expected 'graph' keyword"
99 | (\case Keyword "graph" => Just GraphKW
102 | digraphKW : Grammar _ DOTToken True Keyword
103 | digraphKW = terminal "Expected 'digraph' keyword"
104 | (\case Keyword "digraph" => Just DigraphKW
107 | subgraphKW : Grammar _ DOTToken True Keyword
108 | subgraphKW = terminal "Expected 'subgraph' keyword"
109 | (\case Keyword "subgraph" => Just SubgraphKW
112 | strictKW : Grammar _ DOTToken True Keyword
113 | strictKW = terminal "Expected 'strict' keyword"
114 | (\case Keyword "strict" => Just StrictKW
118 | compassPt : Grammar _ DOTToken True CompassPoint
119 | compassPt = terminal "Unknown compass-point"
120 | (\case CompassPt pt =>
131 | "_" => Just Underscore
136 | grEdgeOp : Grammar _ DOTToken True EdgeOp
137 | grEdgeOp = terminal "Expected '--'"
138 | (\case GrEdgeOp => Just Dash
142 | diGrEdgeOp : Grammar _ DOTToken True EdgeOp
143 | diGrEdgeOp = terminal "Exepected '->'"
144 | (\case DiGrEdgeOp => Just Arrow
151 | keyword : Grammar _ DOTToken True Keyword
164 | identifier : Grammar _ DOTToken True DOTID
165 | identifier = nameID
172 | assign_ : Grammar _ DOTToken True Assign
173 | assign_ = do idLHS <- identifier
175 | idRHS <- identifier
176 | pure (MkAssign idLHS idRHS)
179 | sepChoice : Grammar _ DOTToken False ()
180 | sepChoice = ignore $
optional (choose semicolon comma)
184 | a_list : Grammar _ DOTToken True (List Assign)
185 | a_list = do head <- assign_
187 | rest <- (a_list <|> pure [])
188 | pure (head :: rest)
191 | attr_list : Grammar _ DOTToken True (List (List Assign))
192 | attr_list = do lBracket
193 | mAList <- optional a_list
195 | rest <- (attr_list <|> pure [])
196 | the (Grammar _ _ False _) $
198 | Nothing => pure rest
199 | (Just aList) => pure (aList :: rest)
203 | attr_stmt : Grammar _ DOTToken True Stmt
206 | attrList <- attr_list
207 | pure (AttrStmt kw attrList)
209 | gne : Grammar _ DOTToken True Keyword
216 | idPort : Grammar _ DOTToken True Port
219 | maybeCPT <- optional compassPt
220 | pure (IDPort id_ maybeCPT)
223 | cptPort : Grammar _ DOTToken True Port
226 | pure (PlainPort cpt)
232 | port : Grammar _ DOTToken True Port
237 | node_id : Grammar _ DOTToken True NodeID
238 | node_id = do id_ <- identifier
239 | mPort <- optional port
240 | pure (MkNodeID id_ mPort)
243 | node_stmt : Grammar _ DOTToken True Stmt
244 | node_stmt = do nID <- node_id
245 | attrList <- (attr_list <|> pure [])
246 | pure (NodeStmt nID attrList)
249 | edgeop : Grammar _ DOTToken True EdgeOp
250 | edgeop = diGrEdgeOp
255 | subgraphStart : Grammar _ DOTToken True (Keyword, Maybe DOTID)
256 | subgraphStart = do kw <- subgraphKW
257 | mID <- optional identifier
263 | subgraph : Grammar _ DOTToken True Subgraph
264 | subgraph = do start <- optional subgraphStart
266 | stmtList <- stmt_list
268 | pure (MkSubgraph start stmtList)
271 | nidORsubgr : Grammar _ DOTToken True (Either NodeID Subgraph)
272 | nidORsubgr = (do subgr <- subgraph;
pure (Right subgr))
273 | <|> (do nID <- node_id;
pure (Left nID))
276 | edgeRHS' : Grammar _ DOTToken True (List EdgeRHS)
277 | edgeRHS' = do edgeOp <- edgeop
279 | rest <- (edgeRHS' <|> pure [])
280 | pure ((MkEdgeRHS edgeOp nORs) :: rest)
284 | edgeRHS : Grammar _ DOTToken True (List1 EdgeRHS)
285 | edgeRHS = do edgeOp <- edgeop
287 | rest <- (edgeRHS' <|> pure [])
288 | pure ((MkEdgeRHS edgeOp nORs) ::: rest)
292 | edge_stmt : Grammar _ DOTToken True Stmt
293 | edge_stmt = do nORs <- nidORsubgr
295 | attrList <- (attr_list <|> pure [])
296 | pure (EdgeStmt nORs rhs attrList)
298 | subgr_stmt : Grammar _ DOTToken True Stmt
299 | subgr_stmt = do subgr <- subgraph
300 | pure $
SubgraphStmt subgr
302 | assign_stmt : Grammar _ DOTToken True Stmt
303 | assign_stmt = do a <- assign_
304 | pure $
AssignStmt a
308 | stmt : Grammar _ DOTToken True Stmt
317 | stmt_list : Grammar _ DOTToken True (List Stmt)
318 | stmt_list = do aStmt <- stmt
319 | ignore $
optional semicolon
320 | rest <- (stmt_list <|> pure [])
321 | pure (aStmt :: rest)
324 | isStrict : Grammar _ DOTToken False Bool
325 | isStrict = do (Just _) <- optional strictKW
326 | | Nothing => pure False
330 | graphType : Grammar _ DOTToken True Keyword
331 | graphType = graphKW
337 | graph : Grammar _ DOTToken True Graph
338 | graph = do strict <- isStrict
340 | mID <- optional identifier
342 | stmtList <- stmt_list
344 | pure (MkGraph (if strict then Just StrictKW else Nothing) gType mID stmtList)
347 | parse : (xs : List (WithBounds DOTToken))
348 | -> Either (List1 (ParsingError DOTToken))
349 | (ParsingWarnings, Graph, List (WithBounds DOTToken))
350 | parse xs = parse graph xs