diff options
| author | Andreas Källberg <anka.213@gmail.com> | 2023-09-11 12:29:13 +0200 |
|---|---|---|
| committer | Andreas Källberg <anka.213@gmail.com> | 2023-09-11 12:30:28 +0200 |
| commit | ffd7b27abd050dc50f5986c9b94f8fb5d120c2db (patch) | |
| tree | 920909feccf41ee79d3beb94a6d48463d0c7b4fb /src/compiler/GF/Grammar/Parser.y | |
| parent | 86af7b12b3f9f9f712ddcf19973cfb1a80042aa9 (diff) | |
Improve syntax error messages
Now you will get error messages like these:
example.gf:1:21:
Syntax error:
Unexpected token '}'.
Expected one of:
- '{'
- 'open'
- an identifier
Diffstat (limited to 'src/compiler/GF/Grammar/Parser.y')
| -rw-r--r-- | src/compiler/GF/Grammar/Parser.y | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/src/compiler/GF/Grammar/Parser.y b/src/compiler/GF/Grammar/Parser.y index 85b081cd7..6aedcd399 100644 --- a/src/compiler/GF/Grammar/Parser.y +++ b/src/compiler/GF/Grammar/Parser.y @@ -37,6 +37,9 @@ import PGF(mkCId) %name pBNFCRules ListCFRule %name pEBNFRules ListEBNFRule +%errorhandlertype explist +%error { happyError } + -- no lexer declaration %monad { P } { >>= } { return } %lexer { lexer } { T_EOF } @@ -702,8 +705,18 @@ Posn { -happyError :: P a -happyError = fail "syntax error" +happyError :: (Token, [String]) -> P a +happyError (t,strs) = fail $ + "Syntax error:\n Unexpected " ++ showToken t ++ ".\n Expected one of:\n" + ++ unlines (map ((" - "++).cleanupToken) strs) + + where + cleanupToken "Ident" = "an identifier" + cleanupToken x = x + showToken (T_Ident i) = "identifier '" ++ showIdent i ++ "'" + showToken t = case Map.lookup t invMap of + Nothing -> show t + Just s -> "token '" ++ s ++"'" mkListId,mkConsId,mkBaseId :: Ident -> Ident mkListId = prefixIdent "List" |
