/* This file is generated by sugar from pure.s. -*- c -*- */ %{ open Psugar let abort = Util.abort %} %token Lparen %token Rparen %token Comma %token Dot %token Kfun %token Eof %token Id %token Literal %token Str %token Num %start main %type main %nonassoc Kelse0 %nonassoc Kelse %% id: Id { $1 } num: Num { $1 } literal: Literal { $1 } str: Str { $1 } main: | e Eof { $1 } | error { Format.printf "Parse error: missing parenthesis in function application?\n"; exit 1 } | Eof { Format.printf "Parse error: empty input\n"; exit 1 } e: | e1 { $1 } | Kfun error { abort $1 [("Fun: 'fun' id ++ ',' '.' e",10)] } | Kfun id_plus_comma error { abort $1 [("Fun: 'fun' id ++ ',' '.' e",20)] } | Kfun id_plus_comma Dot error { abort $3 [("Fun: 'fun' id ++ ',' '.' e",24)] } | Lparen error { abort $1 [("Atom: '(' e ')'",9)] } | Lparen e error { abort $1 [("Atom: '(' e ')'",11)] } e1: | e2 { $1 } | Kfun id_plus_comma Dot e1 { Fun ($1,$2,$4) } e2: | e3 { $1 } | e2 e3 { App (ze $1,$1,$2) } e3: | Lparen e Rparen { Atom ($1,$2) } | id { Id (zid $1,$1) } id_plus_comma: | id { [$1] } | id Comma id_plus_comma { $1 :: $3 }