summaryrefslogtreecommitdiffstats
path: root/virt-df/virt_df_lvm2_parser.mly
blob: c4ee57424e600cf2c90cc2c91896ffa82a24bbcd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/* 'df' command for virtual domains.  -*- text -*-
   (C) Copyright 2007-2008 Richard W.M. Jones, Red Hat Inc.
   http://libvirt.org/

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

/* Parser for LVM2 metadata.
   ocamlyacc tutorial:
   http://plus.kaist.ac.kr/~shoh/ocaml/ocamllex-ocamlyacc/ocamlyacc-tutorial/
 */

%{
  open Virt_df_lvm2_metadata
%}

%token LBRACE RBRACE			/* { } */
%token LSQUARE RSQUARE			/* [ ] */
%token EQ				/* = */
%token COMMA				/* , */
%token <string> STRING			/* "string" */
%token <int64> INT			/* an integer */
%token <float> FLOAT			/* a float */
%token <string> IDENT			/* a naked keyword/identifier */
%token EOF				/* end of file */

%start input
%type <Virt_df_lvm2_metadata.metadata> input

%%

input	: lines EOF	{ List.rev $1 }
	;

lines	: /* empty */	{ [] }
	| lines line	{ $2 :: $1 }
	;

line	: /* empty */	/* These dummy entries get removed after parsing. */
			{ ("", String "") }
	| IDENT EQ value
			{ ($1, $3) }
	| IDENT LBRACE lines RBRACE
			{ ($1, Metadata (List.rev $3)) }
	;

value	: STRING	{ String $1 }
	| INT		{ Int $1 }
	| FLOAT		{ Float $1 }
	| LSQUARE list RSQUARE
			{ List (List.rev $2) }
	;

list	: /* empty */	{ [] }
	| value		{ [$1] }
	| list COMMA value
			{ $3 :: $1 }
	;