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 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
Parses simple lambda expressions to combinators
> {
> module Parser where
> import Lexer
> import Convert
> import PreludeGlaArray
> }
> %name parse
> %tokentype { Token }
> %token idT { Ident $$ }
> numT { Number $$ }
> boolT { Boolean $$ }
> "(" { LeftBracket }
> ")" { RightBracket }
> "[" { LeftSquare }
> "]" { RightSquare }
> "[]" { EmptyList }
> ";" { SemiColon }
> ":" { Colon }
> "+" { Infix "+" }
> "-" { Infix "-" }
> "/" { Infix "/" }
> "*" { Infix "*" }
> "==" { Infix "==" }
> "/=" { Infix "/=" }
> ">" { Infix ">" }
> "<" { Infix "<" }
> ">=" { Infix ">=" }
> "<=" { Infix "<=" }
> "=" { Builtin "=" }
> "else" { Builtin "else" }
> "if" { Builtin "if" }
> "in" { Builtin "in" }
> "let" { Builtin "let" }
> "then" { Builtin "then" }
> "end" { Builtin "end" }
> %%
> P : "let" Dec "in" B { mkLet $2 $4}
> | "if" B "then" B "else" B { mkIf $2 $4 $6}
> | B { $1 }
> B :: { Seq (Ptr Exp) }
> B : E "==" E { mkOp $1 Equ $3 }
> | E "/=" E { mkOp $1 NEq $3 }
> | E ">" E { mkOp $1 GT $3 }
> | E "<" E { mkOp $1 LT $3 }
> | E ">=" E { mkOp $1 GTE $3 }
> | E "<=" E { mkOp $1 LTE $3 }
> | E { $1 }
> E :: { Seq (Ptr Exp) }
> E : E "+" T { mkOp $1 Add $3}
> | E "-" T { mkOp $1 Sub $3}
> | T { $1 }
> T :: { Seq (Ptr Exp) }
> T : T "*" F { mkOp $1 Mul $3 }
> | T "/" F { mkOp $1 Quo $3 }
> | F { $1 }
> F :: { Seq (Ptr Exp) }
> F : "(" B ")" { $2 }
> | numT { mkNum $1 }
> | boolT { mkBool $1 }
> | idT { newPtr (mkVar $1) }
> | Apps { mkApps $1 }
> Apps :: { Seq [Ptr Exp] }
> Apps : F Apps { mkApp $1 $2 }
> | F { mkAtom $1 }
> Dec :: { (Token,Seq (Ptr Exp)) }
> Dec : idT Args "=" B { ($1, mkFun $1 $2 $4) }
> Args :: { [Exp] }
> Args : idT Args { mkVar $1 : $2}
> | { [] }
> {
> happyError :: Text a => a -> b
> happyError x = error ("Parse error, line " ++ show x ++ "\n")
> }
|