Skip to content
Snippets Groups Projects
Commit e04ef58f authored by pm3g19's avatar pm3g19
Browse files

Improved error checking

parent 84040589
No related branches found
No related tags found
No related merge requests found
......@@ -28,7 +28,7 @@ eval env expr = let (eval', evalFull') = (eval env, evalFull env) in case expr o
IsEqual -> case args' of -- TODO not sufficent.
[e1, e2] -> Boolean (e1 == e2)
_ -> "isEqual argument error"
_ -> error "isEqual argument error"
XProduct -> case inputSets' of
[(Set l1), (Set l2)] -> Set $ [ x `concatRecord` y | x <- l1, y <- l2]
......@@ -38,16 +38,19 @@ eval env expr = let (eval', evalFull') = (eval env, evalFull env) in case expr o
[Boolean e1, Boolean e2] -> Boolean (e1 `op` e2)
_ -> error "Boolean function takes in two arguments."
RecordIndex -> eval' $ let (Record recordData:Int index:_) = args' in
recordData !! (index - 1)
RecordIndex -> eval' $ case args' of
[Record recordData,Int index] -> recordData `listAtIndex` index
--TODO CBH
RecordSelect -> case args' of
(Record recordData: indexes ) -> Record filteredList
where
indexesRaw = map checkInt indexes
filteredList = map (eval'.(recordData!!)) indexesRaw
checkInt (Int i) = i - 1
--filteredList = map (eval'.(recordData !!)) indexesRaw
filteredList = map (eval'.listAtIndex recordData) indexesRaw
checkInt (Int i) = i
checkInt _ = error "Arguments to index record must be integers"
{-numberedElems = zip [1..] recordData :: [(Int, Expr)]
filtered = filter ((`elem` indexesRaw).fst) numberedElems :: [(Int, Expr)]
filteredList = map snd filtered :: [Expr]-}
......@@ -93,9 +96,13 @@ eval env expr = let (eval', evalFull') = (eval env, evalFull env) in case expr o
let (newEnv, newControl) = evalControl1 env control in
eval newEnv newControl
(Record exprs) -> Record $ map eval' exprs
(Record exprs) -> Record $ map eval' exprs
_ -> expr
listAtIndex :: [a] -> Int -> a
listAtIndex recordData i | i > length recordData = error $ "Index " ++ show i ++ " too large."
| otherwise = recordData !! (i - 1)
evalControl1 :: Environment -> Expr -> (Environment, Expr)
evalControl1 env (Control last (currentExpr:exprs)) = (newEnv, Control newLast exprs)
......
......@@ -7,18 +7,24 @@ import CSV
import Lexer
import Parser
import Debug.Trace
import Control.Exception
printErr s = hPutStrLn stderr ("[ERROR] " ++ s)
parse :: String -> Program
parse = parseSource.(\x -> let o = alexScanTokens x in traceShowId o)
parse = parseSource.alexScanTokens
--outline
main = do
args <- getArgs
case args of
(srcname:_) -> interpret srcname
_ -> interpret "solutions/pr4.cql"
--_ -> interpret "extra-problems/pr3.cql"
--_ -> interpret "sampleprogram.txt"
--("default":_) -> catch (interpret "/home/patryk/dev/plc/extra-problems/ex1.cql") (errorFunc)
(srcname:_) -> catch (interpret srcname) (errorFunc)
--_ -> printErr "No source file specified."
_ -> catch (interpret "/home/patryk/dev/plc/extra-problems/ex1.cql") (errorFunc)
errorFunc :: ErrorCall -> IO ()
errorFunc = printErr.show
interpret :: FilePath -> IO () -- the main function, takes in file name, prints out result
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment