summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkrasimir <krasimir@chalmers.se>2010-07-07 12:23:21 +0000
committerkrasimir <krasimir@chalmers.se>2010-07-07 12:23:21 +0000
commit95f1d40c5636d6e9ba8d4877d044b83f41bbbf65 (patch)
treea133568fe20f11ca852f5a2b743a623a188ac68b
parentc066721dd1b200eb7e22c8c242bf48a83e5fcc69 (diff)
report type errors in the shell from command "p"
-rw-r--r--src/compiler/GF/Command/Commands.hs24
-rw-r--r--src/compiler/GF/Compile/ExampleBased.hs2
-rw-r--r--src/runtime/haskell/PGF/Parse.hs5
3 files changed, 18 insertions, 13 deletions
diff --git a/src/compiler/GF/Command/Commands.hs b/src/compiler/GF/Command/Commands.hs
index 6f3700032..54bcb9e70 100644
--- a/src/compiler/GF/Command/Commands.hs
+++ b/src/compiler/GF/Command/Commands.hs
@@ -482,7 +482,7 @@ allCommands env@(pgf, mos) = Map.fromList [
"will accept unknown adjectives, nouns and verbs with the resource grammar."
],
exec = \opts ts ->
- return $ fromParse opts ts $ concatMap (par opts) $ toStrings ts,
+ return $ fromParse opts (concat [map ((,) s) (par opts s) | s <- toStrings ts]),
flags = [
("cat","target category of parsing"),
("lang","the languages of parsing (comma-separated, no spaces)"),
@@ -1003,16 +1003,20 @@ allCommands env@(pgf, mos) = Map.fromList [
toStrings = map showAsString
toString = unwords . toStrings
- fromParse opts ts parses
- | isOpt "bracket" opts = ([], unlines $ map showBracketedString bss)
- | otherwise = case ts of
- [] -> ([], "no trees found" ++
- missingWordMsg (optMorpho opts) (concatMap words (toStrings ts))
- )
- _ -> fromExprs ts
+ fromParse opts [] = ([],"")
+ fromParse opts ((s,(po,bs)):ps)
+ | isOpt "bracket" opts = (es, showBracketedString bs
+ ++ "\n" ++ msg)
+ | otherwise = case po of
+ ParseOk ts -> let (es',msg') = fromExprs ts
+ in (es'++es,msg'++msg)
+ TypeError errs -> ([], render (text "The parsing is successful but the type checking failed with error(s):" $$
+ nest 2 (vcat (map (ppTcError . snd) errs)))
+ ++ "\n" ++ msg)
+ ParseFailed i -> ([], "parse failed at token " ++ show (words s !! max 0 (i-1))
+ ++ "\n" ++ msg)
where
- (prs,bss) = unzip parses
- ts = [t | ParseOk ts <- prs, t <- ts]
+ (es,msg) = fromParse opts ps
returnFromExprs es = return $ case es of
[] -> ([], "no trees found")
diff --git a/src/compiler/GF/Compile/ExampleBased.hs b/src/compiler/GF/Compile/ExampleBased.hs
index 199d1e375..74a07426f 100644
--- a/src/compiler/GF/Compile/ExampleBased.hs
+++ b/src/compiler/GF/Compile/ExampleBased.hs
@@ -49,7 +49,7 @@ convertFile conf src file = do
[] -> return ()
_ -> appv (" missing words: " ++ unwords ws)
return ws
- TypeError _ _ ->
+ TypeError _ ->
return []
ParseOk ts ->
case rank ts of
diff --git a/src/runtime/haskell/PGF/Parse.hs b/src/runtime/haskell/PGF/Parse.hs
index 1d09359ed..6bf0979a4 100644
--- a/src/runtime/haskell/PGF/Parse.hs
+++ b/src/runtime/haskell/PGF/Parse.hs
@@ -44,11 +44,12 @@ data ParseInput
-- | This data type encodes the different outcomes which you could get from the parser.
data ParseOutput
= ParseFailed Int -- ^ The integer is the position in number of tokens where the parser failed.
- | TypeError FId [TcError] -- ^ The parsing was successful but none of the trees is type correct.
+ | TypeError [(FId,TcError)] -- ^ The parsing was successful but none of the trees is type correct.
-- The forest id ('FId') points to the bracketed string from the parser
-- where the type checking failed. More than one error is returned
-- if there are many analizes for some phrase but they all are not type correct.
- | ParseOk [Tree] -- ^ If the parsing was successful we get a list of abstract syntax trees. The list should be non-empty.
+ | ParseOk [Tree] -- ^ If the parsing and the type checkeing are successful we get a list of abstract syntax trees.
+ -- The list should be non-empty.
parse :: PGF -> Language -> Type -> [Token] -> (ParseOutput,BracketedString)
parse pgf lang typ toks = loop (initState pgf lang typ) toks