
Hi, Following is a simple parser definition I am trying to write for simple numerical expressions. A sequence of numerical expressions actually. Happy reports that there are 3 un-used terminals. AFAIK, they should be let, in and '='. Is that correct? Although, happy generates a .hs file without any other message. GHC gives a type mismatch error. I don't suppose it could be a lexer error, could it? a) Could this be a bug in Happy (very unlikely, IMO) it is generating code that has type mismatches. b) If there is a bug in my parser definition, shouldn't Happy beep on it? Any suggestions to fix it will be highly appreciated. Thanks, =================== { module Main where import Tokens_posn } %name calc %tokentype { Token } %token let { Let _ } in { In _ } ';' { Newstatement _ } int { Int _ $$ } var { Var _ $$ } '=' { Sym _ '=' } '+' { Sym _ '+' } '-' { Sym _ '-' } '*' { Sym _ '*' } '/' { Sym _ '/' } '(' { Sym _ '(' } ')' { Sym _ ')' } %% Exprs :: { [ Expr ] } Exprs : Exprs Expr ';' { $2 : $1 } | Expr ';' { [$1] } Expr : Expr '+' Term { PlusE $1 $3 } | Expr '-' Term { MinusE $1 $3 } | Term { $1 } Term : Term '*' Factor { TimesE $1 $3 } | Term '/' Factor { DivE $1 $3 } | Factor { $1 } Factor : '-' Atom { NegE $2 } | Atom { $1 } Atom : int { IntE $1 } | var { VarE $1 } | '(' Expr ')' { $2 } { data Expr = LetE String Expr Expr | PlusE Expr Expr | MinusE Expr Expr | TimesE Expr Expr | DivE Expr Expr | NegE Expr | IntE Int | VarE String deriving Show flist :: [Int] -> Int -> [Int] flist x a = a : x main:: IO () main = interact (show.runCalc) runCalc :: String -> Expr runCalc = calc . alexScanTokens happyError :: [Token] -> a happyError tks = error ("Parse error at " ++ lcn ++ "\n") where lcn = case tks of [] -> "end of file" tk:_ -> "line " ++ show l ++ ", column " ++ show c where AlexPn _ l c = token_posn tk } -- Rohit Garg http://rpg-314.blogspot.com/