-- This Happy file was machine-generated by the BNF converter { {-# OPTIONS_GHC -fno-warn-incomplete-patterns -fno-warn-overlapping-patterns #-} module ParRl where import AbsRl import LexRl import ErrM } %name pRl Rl %name pRlblk Rlblk %name pJump Jump %name pFrom From %name pLabel Label %name pStep Step %name pExp Exp %name pOtime Otime %name pOplus Oplus %name pVar Var -- no lexer declaration %monad { Err } { thenM } { returnM } %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) } '<=' { PT _ (TS _ 9) } '=' { PT _ (TS _ 10) } '>' { PT _ (TS _ 11) } '>=' { PT _ (TS _ 12) } '[' { PT _ (TS _ 13) } ']' { PT _ (TS _ 14) } '^' { PT _ (TS _ 15) } 'else' { PT _ (TS _ 16) } 'empty' { PT _ (TS _ 17) } 'entry' { PT _ (TS _ 18) } 'exit' { PT _ (TS _ 19) } 'fi' { PT _ (TS _ 20) } 'from' { PT _ (TS _ 21) } 'goto' { PT _ (TS _ 22) } 'if' { PT _ (TS _ 23) } 'l' { PT _ (TS _ 24) } 'pop' { PT _ (TS _ 25) } 'push' { PT _ (TS _ 26) } 'skip' { PT _ (TS _ 27) } 'top' { PT _ (TS _ 28) } L_integ { PT _ (TI $$) } L_ident { PT _ (TV $$) } %% Integer :: { Integer } : L_integ { (read ( $1)) :: Integer } Ident :: { Ident } : L_ident { Ident $1 } Rl :: { Rl } Rl : {- empty -} { AbsRl.RLBLK1 } | Rlblk ';' Rl { AbsRl.RLBLK $1 $3 } Rlblk :: { Rlblk } Rlblk : Label ':' From Jump { AbsRl.RBlk1 $1 $3 $4 } | Label ':' From Step Jump { AbsRl.RBlk2 $1 $3 $4 $5 } Jump :: { Jump } Jump : 'goto' Label { AbsRl.RGoto $2 } | 'if' Exp 'goto' Label 'else' Label { AbsRl.RIf $2 $4 $6 } | 'exit' { AbsRl.RExit } From :: { From } From : 'from' Label { AbsRl.RFrom $2 } | 'fi' Exp 'from' Label 'else' Label { AbsRl.RFi $2 $4 $6 } | 'entry' { AbsRl.REntry } Label :: { Label } Label : 'l' Integer { AbsRl.Label $2 } Step :: { Step } Step : Var Oplus '=' Exp { AbsRl.Plus_Eq $1 $2 $4 } | Var '[' Exp ']' Oplus '=' Exp { AbsRl.Plus_In $1 $3 $5 $7 } | 'push' Var Var { AbsRl.Push $2 $3 } | 'pop' Var Var { AbsRl.Pop $2 $3 } | 'skip' { AbsRl.Skip } Exp :: { Exp } Exp : Integer { AbsRl.EConst $1 } | Ident { AbsRl.EVar $1 } | Var '[' Exp ']' { AbsRl.EIn $1 $3 } | Exp Otime Exp { AbsRl.ETime $1 $2 $3 } | 'top' Var Var { AbsRl.ETop $2 $3 } | 'empty' Var Var { AbsRl.EEmpty $2 $3 } Otime :: { Otime } Otime : Oplus { AbsRl.OPlus $1 } | '*' { AbsRl.Time } | '/' { AbsRl.Div } | '=' { AbsRl.Equal } | '<' { AbsRl.Less } | '>' { AbsRl.Greater } | '<=' { AbsRl.Less_Eq } | '>=' { AbsRl.Greater_Eq } | '!=' { AbsRl.Not_Eq } Oplus :: { Oplus } Oplus : '+' { AbsRl.Plus } | '-' { AbsRl.Minus } | '^' { AbsRl.Caret } Var :: { Var } Var : Ident { AbsRl.Var $1 } { returnM :: a -> Err a returnM = return thenM :: Err a -> (a -> Err b) -> Err b thenM = (>>=) happyError :: [Token] -> Err a happyError ts = Bad $ "syntax error at " ++ tokenPos ts ++ case ts of [] -> [] [Err _] -> " due to lexer error" t:_ -> " before `" ++ id(prToken t) ++ "'" myLexer = tokens }