%{ open Ast_types %} %token COMMA %token INCREMENT %token IDENTIFIER %token UUIDV4 %token NEWLINE %token SEMICOLON %token NAME %token COLON %token DOT %token EOF %token INTSYMBOL %token INT %token LBRACE %token RBRACE %token EMAIL %token STRING %token USERNAME %start prog %% prog: | e = expr; EOF { Some e } ; id_or_other: | IDENTIFIER { $1 } | NAME { "name" } | UUIDV4 { "uuidv4" } | INCREMENT { "increment" } | EMAIL { "email" } | USERNAME { "username" } expr: | tbl = id_or_other; LBRACE; amount = INT; RBRACE; COLON; r = row; NEWLINE; e = expr { Table (tbl, amount, r, e) } | tbl = id_or_other; LBRACE; amount = INT; RBRACE; COLON; r = row; SEMICOLON; e = expr { Table (tbl,amount, r, e) } | tbl = id_or_other; LBRACE; amount = INT; RBRACE; COLON; r = row { Table (tbl,amount, r, End) } ; row: | row_title = id_or_other; parent = id_or_other; DOT; parent_id = id_or_other; COMMA; r = row { Foreign (parent,parent_id,row_title, r) } | row_title = id_or_other; parent = id_or_other; DOT; parent_id = id_or_other; { Foreign (parent,parent_id,row_title, End) } | row_title = id_or_other; UUIDV4; COMMA; r = row { Uuidv4 (row_title, r) } | row_title = id_or_other; UUIDV4 { Uuidv4 (row_title, End) } | row_title = id_or_other; LBRACE; union = union_fields; RBRACE; COMMA; r = row { List (row_title, union, r) } | row_title = id_or_other; LBRACE; union = union_fields; RBRACE { List (row_title, union, End) } | row_title = id_or_other; NAME; COMMA; r = row { Name (row_title, r) } | row_title = id_or_other; NAME { Name (row_title, End) } | row_title = id_or_other; EMAIL; COMMA; r = row { Email (row_title, r) } | row_title = id_or_other; EMAIL { Email (row_title, End) } | row_title = id_or_other; USERNAME; COMMA; r = row { Username (row_title, r) } | row_title = id_or_other; USERNAME { Username (row_title, End) } | row_title = id_or_other; INCREMENT; COMMA; r = row { Increment (row_title, r) } | row_title = id_or_other; INCREMENT { Increment (row_title, End) } | row_title = id_or_other; const = STRING; COMMA; r = row { Const (row_title, const, r) } | row_title = id_or_other; const = STRING { Const (row_title, const, End) } | row_title = id_or_other; INTSYMBOL;LBRACE;min = INT;COMMA;max = INT;RBRACE;COMMA; r = row { Int (row_title,min,max,r) } | row_title = id_or_other; INTSYMBOL;LBRACE;min = INT;COMMA;max = INT;RBRACE; { Int (row_title,min,max,End) } ; union_fields: vl = separated_list(COMMA, STRING) { vl } ;