1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| { module Parser(parse,Exp(..),Exp1(..),Term(..),Factor(..)) where import Lexer } %name parse %tokentype {Token} %error {parseError} %token let {TokenLet} in {TokenIn} int {TokenInt $$} var {TokenVar $$} '=' {TokenEq} '+' {TokenPlus} '-' {TokenMinus} '*' {TokenTimes} '/' {TokenDiv} '(' {TokenOB} ')' {TokenCB} %% Exp : let var '=' Exp in Exp { Let $2 $4 $6 } | Exp1 { Exp1 $1 }
Exp1 : Exp1 '+' Term { Plus $1 $3 } | Exp1 '-' Term { Minus $1 $3 } | Term { Term $1 }
Term : Term '*' Factor { Times $1 $3 } | Term '/' Factor { Div $1 $3 } | Factor { Factor $1 }
Factor : int { Int $1 } | var { Var $1 } | '(' Exp ')' { Brack $2 } { parseError :: [Token] -> a parseError _ = error "Parse error"
data Exp = Let String Exp Exp | Exp1 Exp1 deriving Show
data Exp1 = Plus Exp1 Term | Minus Exp1 Term | Term Term deriving Show
data Term = Times Term Factor | Div Term Factor | Factor Factor deriving Show
data Factor = Int Int | Var String | Brack Exp deriving Show }
|