Changeset 3644

Show
Ignore:
Timestamp:
05/22/05 15:48:36 (4 years ago)
Author:
autrijus
svk:copy_cache_prev:
5201
Message:

* first step in making legible stack trace in error

messages -- VError now carries [Pos], not Exp

Location:
src/Pugs
Files:
5 modified

Legend:

Unmodified
Added
Removed
  • src/Pugs/AST/Internals.hs

    r3601 r3644  
    513513    | VBlock    !VBlock 
    514514    | VJunc     !VJunc       -- ^ Junction value 
    515     | VError    !VStr !Exp 
     515    | VError    !VStr ![Pos] -- ^ Error 
    516516    | VHandle   !VHandle     -- ^ File handle 
    517517    | VSocket   !VSocket     -- ^ Socket handle 
     
    10711071    fail str = do 
    10721072        pos <- asks envPos 
    1073         shiftT . const . return $ VError str (NonTerm pos) 
     1073        shiftT . const . return $ VError str [pos] 
    10741074 
    10751075instance MonadTrans EvalT where 
  • src/Pugs/Parser.hs

    r3637 r3644  
    17711771    sym  <- choice . map symbol $ words " ... ??? !!! " 
    17721772    pos2 <- getPosition 
    1773     return . Val $ VError sym (NonTerm (mkPos pos1 pos2)) 
     1773    return . Val $ VError sym [mkPos pos1 pos2] 
    17741774 
    17751775methOps             :: a -> [b] 
     
    17851785runRule :: Env -> (Env -> a) -> RuleParser Env -> FilePath -> String -> a 
    17861786runRule env f p name str = f $ case ( runParser p env name str ) of 
    1787     Left err    -> env { envBody = Val $ VError msg (NonTerm (mkPos pos pos)) } 
     1787    Left err    -> env { envBody = Val $ VError msg [mkPos pos pos] } 
    17881788        where 
    17891789        pos = errorPos err 
  • src/Pugs/Pretty.hs

    r3506 r3644  
    2929 
    3030instance Pretty Exp where 
    31     format (Val (VError msg (NonTerm pos))) = text "Syntax error at" <+> (format pos) <+> format msg 
    32     format (NonTerm pos) = format pos 
     31    format (NonTerm pos) = text "Syntax error at" <+> format pos 
    3332    format (Val v) = format v 
    3433    format (Syn x vs) = text "Syn" <+> format x <+> (braces $ vcat (punctuate (text ";") (map format vs))) 
     
    116115    format (VCode _) = text "sub {...}" 
    117116    format (VBlock _) = text "{...}" 
    118     format (VError x y@(NonTerm _)) 
     117    format (VError x posList) 
    119118        -- Is this correct? Does this work on win32, too? 
    120119        | last x == '\n' = text . init $ x 
    121         | otherwise      = text "*** Error:" <+> (text x <+> (text "at" <+> format y)) 
    122     format (VError x _) = text "*** Error:" <+> text x 
     120        | otherwise      = text "***" <+> 
     121            (text x <+> (text "at" <+> vcat (map format posList))) 
    123122--  format (VArray x) = format (VList $ Array.elems x) 
    124123--  format (VHash h) = braces $ (joinList $ text ", ") $ 
  • src/Pugs/Prim.hs

    r3590 r3644  
    236236op1 "eval_yaml" = evalYaml 
    237237op1 "defined" = op1Cast (VBool . defined) 
    238 op1 "last" = \v -> return (VError "cannot last() outside a loop" (Val v)) 
    239 op1 "next" = \v -> return (VError "cannot next() outside a loop" (Val v)) 
    240 op1 "redo" = \v -> return (VError "cannot redo() outside a loop" (Val v)) 
     238op1 "last" = const $ fail "cannot last() outside a loop" 
     239op1 "next" = const $ fail "cannot next() outside a loop" 
     240op1 "redo" = const $ fail "cannot redo() outside a loop" 
    241241op1 "return" = op1Return . op1ShiftOut 
    242242op1 "yield" = op1Yield . op1ShiftOut 
     
    267267    errh <- readVar "$*ERR" 
    268268    pos  <- asks envPos 
    269     op2 "say" errh $ VList [ VStr $ pretty (VError (errmsg strs) (NonTerm pos)) ] 
     269    op2 "say" errh $ VList [ VStr $ pretty (VError (errmsg strs) [pos]) ] 
    270270    where 
    271271    errmsg "" = "Warning: something's wrong" 
     
    275275    throw <- fromVal =<< readVar "$?FAIL_SHOULD_DIE" 
    276276    pos   <- asks envPos 
    277     let msg = pretty (VError (errmsg strs) (NonTerm pos)) ++ "\n" 
     277    let msg = pretty (VError (errmsg strs) [pos]) ++ "\n" 
    278278    if throw 
    279279        -- "use fatal" is in effect, so die. 
     
    863863    = fmap VList $ mapM (op2 op x) y' 
    864864    | otherwise 
    865     = return $ VError "Hyper OP only works on lists" (Val VUndef) 
     865    = fail "Hyper OP only works on lists" 
    866866    where 
    867867    hyperLists [] [] = return [] 
  • src/Pugs/Prim/List.hs

    r3538 r3644  
    4343    then return $ head $ Set.elems set 
    4444    else return undef 
    45 op1Pick v = return $ VError "pick not defined" (Val v) 
     45op1Pick v = retError "pick not defined" v 
    4646 
    4747op1Sum :: Val -> Eval Val