%{ (* Definition: http://www.debian.org/doc/debian-policy/ch-miscellaneous.html#s-dpkgchangelog*) let mtch rules = prerr_endline ("Matched: " ^ rules) %} %token Ident %token Version %token Lparen %token Rparen %token Langle %token Rangle %token Semicolon %token Equals %token Space %token Tab %token Newline %token Eof %token Other %start entries %type < (string * string * string list * string * string * string) list> entries %type < (string * string * string list * string * string * string) > entry %% entries: Eof {[]} | entry entries {$1::$2} entry: package version distributions urgency opt_white Newline changes {let (ch,sg)= $7 in $1,$2,$3,$4,ch,sg} package: Ident opt_white {$1} version: Lparen opt_white Ident opt_white Rparen opt_white {$3} distributions: idents opt_white Semicolon opt_white {$1} idents: Ident {[$1]} | Ident opt_white idents {$1::$3} urgency: Ident Equals Ident {$3} changes: {"",""} | changeline changes {let (ch1,sg1) = $1 and (ch2,sg2) = $2 in ch1^ch2, sg1^sg2} changeline: Space Space some_nonwhite eol {" "^$3^"\n",""} | Space eol {" \n",""} | sigline {"", $1} | Space Space opt_white eol {" "^$3^"\n", ""} | eol {"\n", ""} sigline: Space nonwhite opt_items eol {$2^$3} eol: Newline {"\n"} some_nonwhite: opt_white nonwhite opt_items {$1^$2^$3} opt_items: {""} | item opt_items {$1^$2} item: nonwhite {$1} | Space {" "} | Tab {" "} nonwhite: Ident {$1} | Version {$1} | Lparen {"("} | Rparen {")"} | Langle {"<"} | Rangle {">"} | Semicolon {";"} | Equals {"="} | Other {$1} opt_white: {""} | Space opt_white {" "^$2} | Tab opt_white {" "^$2} any: item {$1} | Newline {"\n"} junk: {""} | any junk {$1^$2}