Below is the file 'revision_parser.mly' from this revision. You can also download the file.

%token NEW_MANIFEST
%token OLD_REVISION
%token OLD_MANIFEST
%token PATCH
%token FROM
%token TO
%token ADD_FILE
%token DELETE_FILE
%token DELETE_DIR
%token RENAME_FILE
%token RENAME_DIR
%token EOF
%token <string> ID
%token <string> STRING

%start revision_set
%type <Revision_types.t> revision_set

%%
revision_set:
    NEW_MANIFEST ID edge_list           { ($2, Q.to_list $3) }
;

edge_list:
    edge                                { Q.push Q.empty $1 }
  | edge_list edge                      { Q.push $1 $2 }
;

edge:
    OLD_REVISION ID
    OLD_MANIFEST ID change_set_opt      { { Revision_types.old_revision = $2 ;
					    Revision_types.old_manifest = $4 ;
					    Revision_types.change_set = Q.to_list $5 } }
;

change_set_opt:
    /* empty */                         { Q.empty }
  | change_set                          { $1 }
;

change_set:
  | change                              { Q.push Q.empty $1 }
  | change_set change                   { Q.push $1 $2 }
;

change:
  | PATCH STRING FROM ID TO ID          { Revision_types.PATCH ($2, $4, $6) }
  | ADD_FILE STRING                     { Revision_types.ADD_FILE $2 }
  | DELETE_FILE STRING                  { Revision_types.DELETE_FILE $2 }
  | DELETE_DIR STRING                   { Revision_types.DELETE_DIR $2 }
  | RENAME_FILE STRING TO STRING        { Revision_types.RENAME_FILE ($2, $4) }
  | RENAME_DIR STRING TO STRING         { Revision_types.RENAME_DIR ($2, $4) }
;