%{ 
	open Types 
%}

%token <string> CONST
%token <Types.symbol> IDENT
%token LPAR RPAR SEQ SPLIT MERGE PAR REC EOF POINT
%right SPLIT MERGE
%right SEQ
%right PAR
%left REC
%left POINT
%start main
%type <Types.faust_exp> main
%%
main:  faust_exp EOF                  { $1 };
faust_exp: CONST                      { Const(N (int_of_string $1)) }
    | CONST POINT                     { Const(R (float_of_string $1)) }
    | CONST POINT CONST               { Const(R (float_of_string ($1 ^ "." ^ $3))) }
    | IDENT                           { Ident($1) }
    | LPAR faust_exp RPAR             { $2 }
    | faust_exp PAR faust_exp         { Par($1,$3) }
    | faust_exp SPLIT faust_exp       { Split($1,$3) }
    | faust_exp MERGE faust_exp       { Merge($1,$3) }
    | faust_exp SEQ faust_exp         { Seq($1,$3) }
    | faust_exp REC faust_exp         { Rec($1,$3) };