0N/ADescription : parsing SparQ CompositionTables
0N/ACopyright : (c) Christian Maeder and Uni Bremen 2002-2005
0N/AMaintainer : fmossa@informatik.uni-bremen.de
0N/AStability : provisional
0N/APortability : portable
0N/AParses CompositionTables in SparQ(Lisp)-Format using Parsec
( parseSparQTableFromFile
parseSparQTableFromFile :: String -> IO (Either ParseError Table2)
parseSparQTableFromFile = parseFromFile (skip >> parseSparQTable << eof)
makeTable :: [Baserel] -> (BMap, Table2)
(Table_Attrs "" (Baserel "") rs)
(Compositiontable []) (Conversetable []) (Reflectiontable []) $ Models [])
parseSparQTable :: Parser Table2
parseSparQTable = inParens $ do
calculusName <- parseCalculusName
(i1, rs1) <- parseIdBaOths
(m, Table2 _ _ ns bs _ _, ct, i2) <- if null rs1 then do
ctOld <- parseConversetable
(i2, rs2) <- parseIdBaOths
let (m, t) = makeTable $ rs1 ++ rs2
return (m, t, toConTables m ctOld, i1 ++ i2)
let (m, t) = makeTable rs1
return (m, t, ctNew, i1 ++ i2)
[i] -> return $ Table2 calculusName (lkup i m) ns bs compt ct
[] -> fail "missing identity relation"
is -> fail $ "non-unique identity relation " ++ show is
parseComTab :: BMap -> Parser CmpTbl
parseComTab m = cKey compositionOperationS
>> inParens (parseComptab m)
parseComptab :: BMap -> Parser CmpTbl
(foldl' (\ t (r1, r2, rs) ->
. many1 . parseComptabent
parseComptabent m = inParens $ do
results <- parseComptabres m
return (rel1, rel2, results)
result@(Baserel str) <- parseRelationId
parseConv :: BMap -> Parser ConTables
e1 <- parseContab m inverseOperationS
e2 <- parseContab m shortcutOperationS
e3 <- parseContab m homingOperationS
<|> fmap (\ c -> (c, e, e, e)) (parseContab m converseOperationS)
parseContab :: BMap -> String -> Parser ConTable
parseContab m s = cKey s >> inParens (fmap
. many1 $ parseContabent m)
parseContabent m = inParens $
pair (parseRel m) (parseRelIds m <|> inParens (parseRelIds m))
parseRel :: BMap -> Parser Int
parseRel m = fmap (`lkup` m) parseRelationId