diff options
Diffstat (limited to 'virt-df/virt_df_lvm2_parser.mly')
-rw-r--r-- | virt-df/virt_df_lvm2_parser.mly | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/virt-df/virt_df_lvm2_parser.mly b/virt-df/virt_df_lvm2_parser.mly new file mode 100644 index 0000000..9f47ced --- /dev/null +++ b/virt-df/virt_df_lvm2_parser.mly @@ -0,0 +1,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 */ { prerr_endline "empty line"; [] } + | lines line { prerr_endline "input 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 } + ; |