%{ (* Header: Define the AST type *) open Ast %} %token EQUALS COMMA LEFT_BRACKET RIGHT_BRACKET LF %token INT STRING DATE %token TYPE RANGE VALUES %token IDENT %token EOF %start main %type main %% main: | columns EOF { Columns(List.rev($1)) } columns: | column { [$1] } | columns LF LF column { $4::$1 } column : | column_name LF column_type LF column_value { Column($1, $3, $5) } column_name : | LEFT_BRACKET IDENT RIGHT_BRACKET { $2 } column_type: | TYPE EQUALS INT { Int } | TYPE EQUALS STRING { String } | TYPE EQUALS DATE { Date } column_value: | VALUES EQUALS LEFT_BRACKET values RIGHT_BRACKET { Values(List.rev($4)) } | RANGE EQUALS LEFT_BRACKET range RIGHT_BRACKET { $4 } values : | value { [$1] } | values COMMA value { $3::$1 } range : | IDENT COMMA IDENT { Range($1, $3) } value: | IDENT { $1 }