Skip to content

Commit 57f92b4

Browse files
authored
kore-parser: Print human-readable parse errors (#2243)
1 parent 7f5571e commit 57f92b4

File tree

216 files changed

+239
-138
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

216 files changed

+239
-138
lines changed

kore/app/parser/Main.hs

Lines changed: 55 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,11 @@ module Main (main) where
22

33
import Prelude.Kore
44

5+
import Control.Monad.Catch
6+
( Exception (..)
7+
, SomeException
8+
, handle
9+
)
510
import qualified Data.Map.Strict as Map
611
import Data.Text
712
( Text
@@ -30,9 +35,6 @@ import Kore.Attribute.Symbol
3035
)
3136
import qualified Kore.Builtin as Builtin
3237
import Kore.Debug
33-
import Kore.Error
34-
( printError
35-
)
3638
import Kore.IndexedModule.IndexedModule
3739
( VerifiedModule
3840
, toVerifiedDefinition
@@ -41,6 +43,9 @@ import Kore.Log
4143
( runLoggerT
4244
)
4345
import qualified Kore.Log as Log
46+
import Kore.Log.ErrorVerify
47+
( errorVerify
48+
)
4449
import Kore.Parser
4550
( parseKoreDefinition
4651
, parseKorePattern
@@ -119,53 +124,61 @@ parserInfoModifiers =
119124
\Verifies well-formedness"
120125
<> header "kore-parser - a parser for Kore definitions"
121126

127+
{- | Top-level exception handler.
128+
129+
Renders exceptions for the user with 'displayException' and exits
130+
unsuccessfully.
131+
132+
-}
133+
handleTop :: IO () -> IO ()
134+
handleTop =
135+
handle handler
136+
where
137+
handler = die . displayException @SomeException
122138

123139
-- TODO(virgil): Maybe add a regression test for main.
124140
-- | Parses a kore file and Check wellformedness
125141
main :: IO ()
126-
main = do
142+
main = handleTop $ do
127143
options <-
128144
mainGlobal
129145
(ExeName "kore-parser")
130146
Nothing -- environment variable name for extra arguments
131147
commandLineParser
132148
parserInfoModifiers
133-
case localOptions options of
134-
Nothing -> -- global options parsed, but local failed; exit gracefully
135-
return ()
136-
Just KoreParserOptions
137-
{ fileName
138-
, patternFileName
139-
, mainModuleName
140-
, willPrintDefinition
141-
, willPrintPattern
142-
, willVerify
143-
, appKore
144-
}
145-
-> flip runLoggerT Log.emptyLogger $ do
146-
parsedDefinition <- mainDefinitionParse fileName
147-
indexedModules <- if willVerify
148-
then lift $ mainVerify parsedDefinition
149-
else return Map.empty
150-
lift $ when willPrintDefinition
151-
$ if appKore
152-
then putStrLn
153-
$ unparseToString2
154-
$ completeDefinition
155-
$ toVerifiedDefinition indexedModules
156-
else putDoc (debug parsedDefinition)
157-
158-
when (patternFileName /= "") $ do
159-
parsedPattern <- mainPatternParse patternFileName
160-
when willVerify $ do
161-
indexedModule <-
162-
lift $ lookupMainModule
163-
(ModuleName mainModuleName)
164-
indexedModules
165-
_ <- mainPatternVerify indexedModule parsedPattern
166-
return ()
167-
when willPrintPattern $
168-
lift $ putDoc (debug parsedPattern)
149+
for_ (localOptions options) $ \koreParserOptions ->
150+
flip runLoggerT Log.emptyLogger $ do
151+
let KoreParserOptions { fileName } = koreParserOptions
152+
parsedDefinition <- mainDefinitionParse fileName
153+
let KoreParserOptions { willVerify } = koreParserOptions
154+
indexedModules <- if willVerify
155+
then lift $ mainVerify parsedDefinition
156+
else return Map.empty
157+
let KoreParserOptions { willPrintDefinition } = koreParserOptions
158+
let KoreParserOptions { appKore } = koreParserOptions
159+
lift $ when willPrintDefinition
160+
$ if appKore
161+
then putStrLn
162+
$ unparseToString2
163+
$ completeDefinition
164+
$ toVerifiedDefinition indexedModules
165+
else putDoc (debug parsedDefinition)
166+
167+
let KoreParserOptions { patternFileName } = koreParserOptions
168+
unless (null patternFileName) $ do
169+
parsedPattern <- mainPatternParse patternFileName
170+
when willVerify $ do
171+
let KoreParserOptions { mainModuleName } = koreParserOptions
172+
indexedModule <-
173+
lookupMainModule
174+
(ModuleName mainModuleName)
175+
indexedModules
176+
& lift
177+
_ <- mainPatternVerify indexedModule parsedPattern
178+
return ()
179+
let KoreParserOptions { willPrintPattern } = koreParserOptions
180+
when willPrintPattern $
181+
lift $ putDoc (debug parsedPattern)
169182

170183
-- | IO action that parses a kore definition from a filename and prints timing
171184
-- information.
@@ -182,18 +195,12 @@ mainPatternParse = mainParse parseKorePattern
182195
mainVerify
183196
:: ParsedDefinition
184197
-- ^ Parsed definition to check well-formedness
185-
-> IO
186-
(Map.Map
187-
ModuleName
188-
(VerifiedModule StepperAttributes)
189-
)
198+
-> IO (Map.Map ModuleName (VerifiedModule StepperAttributes))
190199
mainVerify definition = flip runLoggerT Log.emptyLogger $ do
191200
verifyResult <-
192201
clockSomething "Verifying the definition"
193202
(verifyAndIndexDefinition
194203
Builtin.koreVerifiers
195204
definition
196205
)
197-
case verifyResult of
198-
Left err1 -> liftIO $ die $ printError err1
199-
Right indexedModules -> return indexedModules
206+
either errorVerify return verifyResult

kore/app/share/GlobalMain.hs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,14 +118,16 @@ import qualified Kore.Attribute.Symbol as Attribute
118118
( Symbol
119119
)
120120
import qualified Kore.Builtin as Builtin
121-
import Kore.Error
122121
import Kore.IndexedModule.IndexedModule
123122
( VerifiedModule
124123
)
125124
import Kore.Log as Log
126125
import Kore.Log.ErrorParse
127126
( errorParse
128127
)
128+
import Kore.Log.ErrorVerify
129+
( errorVerify
130+
)
129131
import Kore.Parser
130132
( ParsedPattern
131133
, parseKoreDefinition
@@ -451,7 +453,7 @@ mainPatternVerify verifiedModule patt = do
451453
verifyResult <-
452454
clockSomething "Verifying the pattern"
453455
(runPatternVerifier context $ verifyStandalonePattern Nothing patt)
454-
either (error . printError) return verifyResult
456+
either errorVerify return verifyResult
455457
where
456458
context =
457459
PatternVerifier.verifiedModuleContext verifiedModule
@@ -500,9 +502,7 @@ verifyDefinitionWithBase
500502
Builtin.koreVerifiers
501503
definition
502504
)
503-
case verifyResult of
504-
Left err1 -> error (printError err1)
505-
Right indexedDefinition -> return indexedDefinition
505+
either errorVerify return verifyResult
506506

507507
{- | Parse a Kore definition from a filename.
508508

kore/src/Kore/Log/ErrorParse.hs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ newtype ErrorParse = ErrorParse { message :: String }
2525

2626
instance Exception ErrorParse where
2727
toException = toException . SomeEntry
28-
fromException exn =
29-
fromException exn >>= fromEntry
28+
fromException exn = fromException exn >>= fromEntry
29+
displayException = message
3030

3131
instance Pretty ErrorParse where
3232
pretty ErrorParse { message } =

kore/src/Kore/Log/ErrorVerify.hs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
{- |
2+
Copyright : (c) Runtime Verification, 2020
3+
License : NCSA
4+
5+
-}
6+
7+
module Kore.Log.ErrorVerify
8+
( ErrorVerify (..)
9+
, errorVerify
10+
) where
11+
12+
import Prelude.Kore
13+
14+
import Control.Monad.Catch
15+
( Exception (..)
16+
, MonadThrow
17+
, throwM
18+
)
19+
import Pretty
20+
21+
import Kore.ASTVerifier.Error
22+
( VerifyError
23+
)
24+
import qualified Kore.Error as Kore
25+
import Log
26+
27+
newtype ErrorVerify = ErrorVerify { koreError :: Kore.Error VerifyError }
28+
deriving Show
29+
30+
instance Exception ErrorVerify where
31+
toException = toException . SomeEntry
32+
fromException exn = fromException exn >>= fromEntry
33+
displayException = Kore.printError . koreError
34+
35+
instance Pretty ErrorVerify where
36+
pretty ErrorVerify { koreError } =
37+
Pretty.pretty (Kore.printError koreError)
38+
39+
instance Entry ErrorVerify where
40+
entrySeverity _ = Error
41+
42+
errorVerify :: MonadThrow log => Kore.Error VerifyError -> log a
43+
errorVerify koreError =
44+
throwM ErrorVerify { koreError }

kore/src/Kore/Log/Registry.hs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ import Kore.Log.ErrorRuleMergeDuplicate
8484
( ErrorRuleMergeDuplicateIds
8585
, ErrorRuleMergeDuplicateLabels
8686
)
87+
import Kore.Log.ErrorVerify
88+
( ErrorVerify
89+
)
8790
import Kore.Log.InfoAttemptUnification
8891
( InfoAttemptUnification
8992
)
@@ -162,6 +165,7 @@ entryHelpDocs :: [Pretty.Doc ()]
162165
, mk $ Proxy @ErrorBottomTotalFunction
163166
, mk $ Proxy @ErrorDecidePredicateUnknown
164167
, mk $ Proxy @ErrorParse
168+
, mk $ Proxy @ErrorVerify
165169
, mk $ Proxy @ErrorRuleMergeDuplicateIds
166170
, mk $ Proxy @ErrorRuleMergeDuplicateLabels
167171
, mk $ Proxy @WarnFunctionWithoutEvaluators

kore/src/Log/Entry.hs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,9 @@ data SomeEntry where
6969

7070
instance Show SomeEntry where
7171
show (SomeEntry entry) = show entry
72-
instance Exception SomeEntry
72+
73+
instance Exception SomeEntry where
74+
displayException = show . longDoc
7375

7476
instance Entry SomeEntry where
7577
toEntry = id

kore/test/resources/test-bool-2.kore.golden

Lines changed: 0 additions & 4 deletions
This file was deleted.

kore/test/resources/test-bool-3.kore.golden

Lines changed: 0 additions & 5 deletions
This file was deleted.

kore/test/resources/test-exception-14.kore.golden

Lines changed: 0 additions & 5 deletions
This file was deleted.

kore/test/resources/test-hooks-4.kore.golden

Lines changed: 0 additions & 4 deletions
This file was deleted.

kore/test/resources/test-hooks-5.kore.golden

Lines changed: 0 additions & 4 deletions
This file was deleted.

kore/test/resources/test-hooks-8.kore.golden

Lines changed: 0 additions & 4 deletions
This file was deleted.

kore/test/resources/test-hooks-9.kore.golden

Lines changed: 0 additions & 4 deletions
This file was deleted.

kore/test/resources/test-hooks-ctor.kore.golden

Lines changed: 0 additions & 4 deletions
This file was deleted.

kore/test/resources/test-int-2.kore.golden

Lines changed: 0 additions & 4 deletions
This file was deleted.

kore/test/resources/test-int-3.kore.golden

Lines changed: 0 additions & 5 deletions
This file was deleted.

kore/test/resources/test-int-4.kore.golden

Lines changed: 0 additions & 5 deletions
This file was deleted.

kore/test/resources/test-issue-94-1.kore.golden

Lines changed: 0 additions & 5 deletions
This file was deleted.

kore/test/resources/test-issue-94-2.kore.golden

Lines changed: 0 additions & 10 deletions
This file was deleted.

test/parser/Makefile

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
ifeq ($(origin TOP), undefined)
2+
TOP = $(shell git rev-parse --show-toplevel)
3+
endif
4+
5+
include $(TOP)/include.mk
6+
7+
DIFF = diff -u
8+
%.golden: DIFF = true
9+
10+
FAILED = ( mv $@ $@.fail && false )
11+
12+
TESTS = $(wildcard *.kore)
13+
OUTS += $(foreach TEST, $(TESTS), $(TEST).out)
14+
GOLDEN += $(foreach TEST, $(TESTS), $(TEST).golden)
15+
16+
%.kore.out : %.kore $(KORE_PARSER)
17+
$(KORE_PARSER) --no-print-definition $< 2>$@ || true
18+
$(DIFF) $*.kore.golden $@ || $(FAILED)
19+
20+
%.golden: %.out
21+
cp $< $@
22+
23+
### TARGETS
24+
25+
test: test-k
26+
27+
test-k: $(OUTS)
28+
29+
golden: $(GOLDEN)
30+
31+
clean:
32+
rm -fr *.out *.fail
33+
34+
.PHONY: test-k test golden clean
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.
File renamed without changes.

0 commit comments

Comments
 (0)