5 | import Graphics.DOT.Lexer
7 | import public Graphics.DOT.AST
8 | import public Graphics.DOT.Utils
9 | import public Graphics.DOT.Parser
10 | import public Graphics.DOT.Interfaces
14 | import Libraries.Text.Lexer.Core
15 | import Libraries.Text.Parser.Core
23 | data DOTError : Type where
25 | FError : (errMsg : String) -> DOTError
27 | ParseError : (errMsg : String) -> DOTError
31 | show (FError errMsg) = "DOTERROR from file: " ++ errMsg
32 | show (ParseError errMsg) = "DOTERROR when parsing: " ++ errMsg
40 | readDOTFile : HasIO io => (fname : String) -> io (Either DOTError Graph)
42 | do (Right contents) <- readFile fname
43 | | Left err => pure $
(Left . FError) $
show err
44 | let (tokData, _) = lex contents
45 | Right (warns, ast, rem) <- pure $
parse tokData
46 | | Left pErrs => pure $
(Left . ParseError) $
show (map show pErrs)
47 | if (not . isNil) rem
48 | then pure $
(Left . ParseError) $
"Non-empty token remainder:\n\t\{show rem}"
49 | else pure $
Right ast
55 | lexTest : String -> IO ()
57 | do (Right contents) <- readFile fp
58 | | Left err => putStrLn $
"FILE ERROR: " ++ show err
59 | let (tokList, (line, col, rem)) = lex contents
60 | putStrLn $
"Reached " ++ (show line) ++ ":" ++ (show col)
61 | putStrLn $
"Remainder: " ++ rem
62 | putStrLn "----------------\n-- TOKEN LIST --\n----------------\n"
63 | putStrLn $
show tokList
65 | parseTest : String -> IO ()
67 | do (Right contents) <- readFile fp
68 | | Left err => putStrLn $
"FILE ERROR: " ++ show err
69 | let (tokData, _) = lex contents
70 | let pRes = parse tokData
74 | Left errs => show $
map show errs
75 | Right (pWarns, ast, pRem) =>
76 | show ast ++ "\n\tREM: " ++ show pRem
77 | Right (warns, ast, rem) <- pure $
parse tokData
78 | | Left errs => do putStrLn (show $
map show errs)
79 | putStrLn $
"Remainder: " ++ show rem