mock_csv/parser/parser.mly
2024-12-11 08:33:41 +01:00

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 }