1 -- This Happy file was machine-generated by the BNF converter
11 -- no lexer declaration
12 %monad { Err } { thenM } { returnM }
22 '++' { PT _ (TS "++") }
23 '--' { PT _ (TS "--") }
28 '<=' { PT _ (TS "<=") }
30 '>=' { PT _ (TS ">=") }
31 '==' { PT _ (TS "==") }
32 '!=' { PT _ (TS "!=") }
36 'bool' { PT _ (TS "bool") }
37 'else' { PT _ (TS "else") }
38 'false' { PT _ (TS "false") }
39 'if' { PT _ (TS "if") }
40 'int' { PT _ (TS "int") }
41 'print' { PT _ (TS "print") }
42 'readBool' { PT _ (TS "readBool") }
43 'readInt' { PT _ (TS "readInt") }
44 'return' { PT _ (TS "return") }
45 'true' { PT _ (TS "true") }
46 'while' { PT _ (TS "while") }
48 L_ident { PT _ (TV $$) }
49 L_integ { PT _ (TI $$) }
55 Ident :: { Ident } : L_ident { Ident $1 }
56 Integer :: { Integer } : L_integ { (read $1) :: Integer }
59 Bool : 'true' { True }
68 Program :: { Program }
69 Program : ListFuncStm { Program (reverse $1) }
73 Stm : Exp ';' { SExp $1 }
74 | '{' ListStm '}' { SBlock (reverse $2) }
75 | Type Ident '=' Exp ';' { SDecl $1 $2 $4 }
76 | Type Ident ';' { SDeclD $1 $2 }
77 | 'while' '(' Exp ')' Stm { SWhile $3 $5 }
78 | 'if' '(' Exp ')' Stm 'else' Stm { SIf $3 $5 $7 }
79 | 'if' '(' Exp ')' Stm { if_ $3 $5 }
80 | 'print' Exp ';' { SPrint $2 }
81 | 'return' Exp ';' { SReturn $2 }
85 Exp : Ident '=' Exp { EAss $1 $3 }
86 | Exp1 Op0 Exp1 { compExp_ $1 $2 $3 }
91 Exp1 : Exp1 Op1 Exp2 { op1_ $1 $2 $3 }
96 Exp2 : Exp2 Op2 Exp3 { op2_ $1 $2 $3 }
101 Exp3 : Ident '++' { postIncr_ $1 }
102 | Ident '--' { postDecr_ $1 }
104 | Integer { EInt $1 }
106 | '-' Exp3 { ENeg $2 }
107 | '!' Exp3 { ENot $2 }
108 | 'readInt' { EReadI }
109 | 'readBool' { EReadB }
110 | Ident '(' ListExp ')' { EFunc $1 $3 }
115 ListStm : {- empty -} { [] }
116 | ListStm Stm { flip (:) $1 $2 }
120 ListExp : {- empty -} { [] }
122 | Exp ',' ListExp { (:) $1 $3 }
126 Decl : Type Ident { Decl $1 $2 }
129 ListDecl :: { [Decl] }
130 ListDecl : {- empty -} { [] }
132 | Decl ',' ListDecl { (:) $1 $3 }
136 Func : Type Ident '(' ListDecl ')' '{' ListStm '}' { Func $1 $2 $4 (reverse $7) }
139 ListFunc :: { [Func] }
140 ListFunc : {- empty -} { [] }
141 | ListFunc Func { flip (:) $1 $2 }
144 FuncStm :: { FuncStm }
145 FuncStm : Stm { S $1 }
149 ListFuncStm :: { [FuncStm] }
150 ListFuncStm : {- empty -} { [] }
151 | ListFuncStm FuncStm { flip (:) $1 $2 }
182 returnM :: a -> Err a
185 thenM :: Err a -> (a -> Err b) -> Err b
188 happyError :: [Token] -> Err a
190 Bad $ "syntax error at " ++ tokenPos ts ++ if null ts then [] else (" before " ++ unwords (map prToken (take 4 ts)))
193 if_ e_ s_ = SIf e_ s_ SNoop
194 compExp_ e1_ o_ e2_ = BiOpExp e1_ o_ e2_
195 op1_ e1_ o_ e2_ = BiOpExp e1_ o_ e2_
196 op2_ e1_ o_ e2_ = BiOpExp e1_ o_ e2_
197 postIncr_ i_ = EPost i_ Plus
198 postDecr_ i_ = EPost i_ Minus