mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-23 03:32:51 -06:00
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
This commit is contained in:
@@ -4,7 +4,7 @@
|
|||||||
module GF.Grammar.Lexer
|
module GF.Grammar.Lexer
|
||||||
( Token(..), Posn(..)
|
( Token(..), Posn(..)
|
||||||
, P, runP, runPartial, token, lexer, getPosn, failLoc
|
, P, runP, runPartial, token, lexer, getPosn, failLoc
|
||||||
, isReservedWord
|
, isReservedWord, invMap
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Control.Applicative
|
import Control.Applicative
|
||||||
@@ -134,7 +134,7 @@ data Token
|
|||||||
| T_Double Double -- double precision float literals
|
| T_Double Double -- double precision float literals
|
||||||
| T_Ident Ident
|
| T_Ident Ident
|
||||||
| T_EOF
|
| T_EOF
|
||||||
-- deriving Show -- debug
|
deriving (Eq, Ord, Show) -- debug
|
||||||
|
|
||||||
res = eitherResIdent
|
res = eitherResIdent
|
||||||
eitherResIdent :: (Ident -> Token) -> Ident -> Token
|
eitherResIdent :: (Ident -> Token) -> Ident -> Token
|
||||||
@@ -224,6 +224,13 @@ resWords = Map.fromList
|
|||||||
]
|
]
|
||||||
where b s t = (identS s, t)
|
where b s t = (identS s, t)
|
||||||
|
|
||||||
|
invMap :: Map.Map Token String
|
||||||
|
invMap = res
|
||||||
|
where
|
||||||
|
lst = Map.toList resWords
|
||||||
|
flp = map (\(k,v) -> (v,showIdent k)) lst
|
||||||
|
res = Map.fromList flp
|
||||||
|
|
||||||
unescapeInitTail :: String -> String
|
unescapeInitTail :: String -> String
|
||||||
unescapeInitTail = unesc . tail where
|
unescapeInitTail = unesc . tail where
|
||||||
unesc s = case s of
|
unesc s = case s of
|
||||||
|
|||||||
@@ -37,6 +37,9 @@ import PGF(mkCId)
|
|||||||
%name pBNFCRules ListCFRule
|
%name pBNFCRules ListCFRule
|
||||||
%name pEBNFRules ListEBNFRule
|
%name pEBNFRules ListEBNFRule
|
||||||
|
|
||||||
|
%errorhandlertype explist
|
||||||
|
%error { happyError }
|
||||||
|
|
||||||
-- no lexer declaration
|
-- no lexer declaration
|
||||||
%monad { P } { >>= } { return }
|
%monad { P } { >>= } { return }
|
||||||
%lexer { lexer } { T_EOF }
|
%lexer { lexer } { T_EOF }
|
||||||
@@ -702,8 +705,18 @@ Posn
|
|||||||
|
|
||||||
{
|
{
|
||||||
|
|
||||||
happyError :: P a
|
happyError :: (Token, [String]) -> P a
|
||||||
happyError = fail "syntax error"
|
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,mkConsId,mkBaseId :: Ident -> Ident
|
||||||
mkListId = prefixIdent "List"
|
mkListId = prefixIdent "List"
|
||||||
|
|||||||
Reference in New Issue
Block a user