-- File generated by the BNF Converter. -- Parser definition for use with Happy. { {-# OPTIONS_GHC -fno-warn-incomplete-patterns -fno-warn-overlapping-patterns #-} {-# LANGUAGE PatternSynonyms #-} module ParJavaletteLight ( happyError , myLexer , pProg , pStm , pExp , pExp1 , pExp2 , pExp3 , pListStm , pTyp ) where import Prelude import qualified AbsJavaletteLight import LexJavaletteLight } %name pProg_internal Prog %name pStm_internal Stm %name pExp_internal Exp %name pExp1_internal Exp1 %name pExp2_internal Exp2 %name pExp3_internal Exp3 %name pListStm_internal ListStm %name pTyp_internal Typ %monad { Err } { (>>=) } { return } %tokentype {Token} %token '(' { PT _ (TS _ 1) } ')' { PT _ (TS _ 2) } '*' { PT _ (TS _ 3) } '+' { PT _ (TS _ 4) } '++' { PT _ (TS _ 5) } ';' { PT _ (TS _ 6) } '<' { PT _ (TS _ 7) } '=' { PT _ (TS _ 8) } 'double' { PT _ (TS _ 9) } 'int' { PT _ (TS _ 10) } 'while' { PT _ (TS _ 11) } '{' { PT _ (TS _ 12) } '}' { PT _ (TS _ 13) } L_Ident { PT _ (TV _)} L_doubl { PT _ (TD _)} L_integ { PT _ (TI _)} %% Ident :: { (AbsJavaletteLight.BNFC'Position, AbsJavaletteLight.Ident) } Ident : L_Ident { (uncurry AbsJavaletteLight.BNFC'Position (tokenLineCol $1), AbsJavaletteLight.Ident (tokenText $1)) } Double :: { (AbsJavaletteLight.BNFC'Position, Double) } Double : L_doubl { (uncurry AbsJavaletteLight.BNFC'Position (tokenLineCol $1), (read (tokenText $1) ) :: Double) } Integer :: { (AbsJavaletteLight.BNFC'Position, Integer) } Integer : L_integ { (uncurry AbsJavaletteLight.BNFC'Position (tokenLineCol $1), (read (tokenText $1) ) :: Integer) } Prog :: { (AbsJavaletteLight.BNFC'Position, AbsJavaletteLight.Prog) } Prog : Typ Ident '(' ')' '{' ListStm '}' { (fst $1, AbsJavaletteLight.Fun (fst $1) (snd $1) (snd $2) (snd $6)) } Stm :: { (AbsJavaletteLight.BNFC'Position, AbsJavaletteLight.Stm) } Stm : 'while' '(' Exp ')' '{' ListStm '}' { (uncurry AbsJavaletteLight.BNFC'Position (tokenLineCol $1), AbsJavaletteLight.SWhile (uncurry AbsJavaletteLight.BNFC'Position (tokenLineCol $1)) (snd $3) (snd $6)) } | Ident '++' ';' { (fst $1, AbsJavaletteLight.SIncr (fst $1) (snd $1)) } | Ident '=' Exp ';' { (fst $1, AbsJavaletteLight.SAss (fst $1) (snd $1) (snd $3)) } | Stm ';' { (fst $1, (snd $1)) } | Typ Ident ';' { (fst $1, AbsJavaletteLight.SDecl (fst $1) (snd $1) (snd $2)) } Exp :: { (AbsJavaletteLight.BNFC'Position, AbsJavaletteLight.Exp) } Exp : Exp1 { (fst $1, (snd $1)) } | Exp1 '<' Exp1 { (fst $1, AbsJavaletteLight.ELt (fst $1) (snd $1) (snd $3)) } Exp1 :: { (AbsJavaletteLight.BNFC'Position, AbsJavaletteLight.Exp) } Exp1 : Exp1 '+' Exp2 { (fst $1, AbsJavaletteLight.EPlus (fst $1) (snd $1) (snd $3)) } | Exp2 { (fst $1, (snd $1)) } Exp2 :: { (AbsJavaletteLight.BNFC'Position, AbsJavaletteLight.Exp) } Exp2 : Exp2 '*' Exp3 { (fst $1, AbsJavaletteLight.ETimes (fst $1) (snd $1) (snd $3)) } | Exp3 { (fst $1, (snd $1)) } Exp3 :: { (AbsJavaletteLight.BNFC'Position, AbsJavaletteLight.Exp) } Exp3 : '(' Exp ')' { (uncurry AbsJavaletteLight.BNFC'Position (tokenLineCol $1), (snd $2)) } | Double { (fst $1, AbsJavaletteLight.EDouble (fst $1) (snd $1)) } | Integer { (fst $1, AbsJavaletteLight.EInt (fst $1) (snd $1)) } | Ident { (fst $1, AbsJavaletteLight.EVar (fst $1) (snd $1)) } ListStm :: { (AbsJavaletteLight.BNFC'Position, [AbsJavaletteLight.Stm]) } ListStm : {- empty -} { (AbsJavaletteLight.BNFC'NoPosition, []) } | Stm ListStm { (fst $1, (:) (snd $1) (snd $2)) } Typ :: { (AbsJavaletteLight.BNFC'Position, AbsJavaletteLight.Typ) } Typ : 'double' { (uncurry AbsJavaletteLight.BNFC'Position (tokenLineCol $1), AbsJavaletteLight.TDouble (uncurry AbsJavaletteLight.BNFC'Position (tokenLineCol $1))) } | 'int' { (uncurry AbsJavaletteLight.BNFC'Position (tokenLineCol $1), AbsJavaletteLight.TInt (uncurry AbsJavaletteLight.BNFC'Position (tokenLineCol $1))) } { type Err = Either String happyError :: [Token] -> Err a happyError ts = Left $ "syntax error at " ++ tokenPos ts ++ case ts of [] -> [] [Err _] -> " due to lexer error" t:_ -> " before `" ++ (prToken t) ++ "'" myLexer :: String -> [Token] myLexer = tokens -- Entrypoints pProg :: [Token] -> Err AbsJavaletteLight.Prog pProg = fmap snd . pProg_internal pStm :: [Token] -> Err AbsJavaletteLight.Stm pStm = fmap snd . pStm_internal pExp :: [Token] -> Err AbsJavaletteLight.Exp pExp = fmap snd . pExp_internal pExp1 :: [Token] -> Err AbsJavaletteLight.Exp pExp1 = fmap snd . pExp1_internal pExp2 :: [Token] -> Err AbsJavaletteLight.Exp pExp2 = fmap snd . pExp2_internal pExp3 :: [Token] -> Err AbsJavaletteLight.Exp pExp3 = fmap snd . pExp3_internal pListStm :: [Token] -> Err [AbsJavaletteLight.Stm] pListStm = fmap snd . pListStm_internal pTyp :: [Token] -> Err AbsJavaletteLight.Typ pTyp = fmap snd . pTyp_internal }