26 lines
480 B
OCaml
26 lines
480 B
OCaml
|
%token BAGS
|
||
|
%token CONTAIN
|
||
|
%token NO
|
||
|
%token OTHER
|
||
|
%token COMMA ","
|
||
|
%token DOT "."
|
||
|
%token EOF
|
||
|
%token<int> NUMBER
|
||
|
%token<string> WORD
|
||
|
|
||
|
%start<Day7_syntax.rules> rules
|
||
|
|
||
|
%%
|
||
|
|
||
|
let rules := ~ = list(rule); EOF; <>
|
||
|
|
||
|
let rule := ~ = bag; CONTAIN; ~ = contents; DOT; <>
|
||
|
|
||
|
let contents :=
|
||
|
| NO; OTHER; BAGS; { [] }
|
||
|
| ~ = separated_nonempty_list(COMMA, number_bag); <>
|
||
|
|
||
|
let number_bag := n = NUMBER; b = bag; { b, n }
|
||
|
|
||
|
let bag := words = list(WORD); BAGS; { String.concat " " words }
|