54 lines
869 B
OCaml
54 lines
869 B
OCaml
%{
|
|
(* Header: Define the AST type *)
|
|
open Ast
|
|
%}
|
|
|
|
%token EQUALS COMMA LEFT_BRACKET RIGHT_BRACKET LF
|
|
%token INT STRING DATE
|
|
%token TYPE RANGE VALUES
|
|
%token <string> IDENT
|
|
%token EOF
|
|
%start main
|
|
%type <data> 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 }
|