2016-05-05 9 views
3

Ich schreibe einen monadischen Parser mit Alex und Happy in Haskell.Benutzerdefinierte Fehler beim Parsen anzeigen Happy Haskell

Meine Fehlerfunktion ist wie folgt definiert:

parseError :: Token -> Alex a 
parseError _ = alexError "error occurred" 

Wie kann ich benutzerdefinierte Fehler (wie falscher Typ bei dem Versuch, eine Zeichenfolge in eine Zahl hinzuzufügen) senden während der Analyse?


UPDATE

Der Parser muss nicht die Typprüfung tun, ich bin in der Produktion zu tun es, weil ich den Überblick über den Operanden-Typen halten. Wie in einem Kommentar gesagt, kann ich nicht die parseError verwenden, gibt es also eine Möglichkeit, einen Fehler zu drucken und den Parser zu stoppen?

+0

nur eine andere Zeichenfolge übergeben als '„Fehler aufgetreten“' auf ' alexError' ...? –

+0

Ok, aber ich muss den String aus meiner Produktionsregel übergeben, und 'parseError' Funktion nimmt nur einen' Token' Parameter, nicht irgendeine Zeichenfolge ich möchte – zeb

+0

Ich gebe zu, dass ich nicht sehr vertraut mit Alex oder glücklich, also vergeben ich, wenn das eine dumme Frage ist, aber: wenn 'parseError' nicht das tut, was Sie wollen, warum nicht' parseError' ändern, oder vermeiden, es ganz zugunsten der 'alexError'-Funktion zu verwenden, die das tut, was Sie wollen? –

Antwort

1

ich gelöst habe es durch Implementierung dieser Funktion:

fatalError :: (Show a1, Show a) => [Char] -> a -> a1 -> t 
fatalError s l c = error ("Error at line " ++ (show l) ++ " column " ++ (show c) ++ ": " ++ s) 

und ich nenne sie aus der Produktion, wenn ein Fehler erkannt wird