parser
author "Tomas Zeman <tzeman@volny.cz>"
Fri, 15 Jan 2010 16:48:13 +0100
changeset 28 3337257bf0e7
parent 22 78285474e8d3
child 35 5a18e00f9ba1
permissions -rw-r--r--
ciena.grammar: handle vlan-untagged-data for sub-port
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
9
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
     1
#!/usr/bin/perl -w
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
     2
18
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
     3
# Copyright (c) 2009, Tomas Zeman <tzeman@volny.cz>
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
     4
# All rights reserved.
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
     5
#
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
     6
# Redistribution and use in source and binary forms, with or without
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
     7
# modification, are permitted providing that the following conditions 
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
     8
# are met:
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
     9
# 1. Redistributions of source code must retain the above copyright
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    10
#    notice, this list of conditions and the following disclaimer.
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    11
# 2. Redistributions in binary form must reproduce the above copyright
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    12
#    notice, this list of conditions and the following disclaimer in the
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    13
#    documentation and/or other materials provided with the distribution.
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    14
#
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    15
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    16
# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    17
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    18
# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    19
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    20
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    21
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    22
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    23
# STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    24
# IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    25
# POSSIBILITY OF SUCH DAMAGE.
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    26
#
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    27
$main::VERSION = "1.0";
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    28
9
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    29
use strict;
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    30
use Parse::RecDescent;
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    31
use Data::Dumper;
17
d39ff14a8964 parser: store result via Storable if requested
"Tomas Zeman <tzeman@volny.cz>"
parents: 9
diff changeset
    32
use Storable;
18
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    33
use Getopt::Std;
9
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    34
18
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    35
my $opts = {};
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    36
getopts("do:g:", $opts);
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    37
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    38
my $grammar_file = $opts->{g};
9
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    39
unless (defined $grammar_file) {
18
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    40
	HELP_MESSAGE();
9
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    41
	exit 1;
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    42
}
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    43
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    44
unless (-f $grammar_file) {
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    45
	die "Grammar file $grammar_file does not exit";
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    46
}
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    47
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    48
my $grammar = '';
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    49
{
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    50
	open G, $grammar_file;
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    51
	local $/;
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    52
	$grammar = <G>;
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    53
	close G;
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    54
}
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    55
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    56
# Enable warnings within the Parse::RecDescent module.
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    57
$::RD_ERRORS = 1; # Make sure the parser dies when it encounters an error
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    58
$::RD_WARN   = 1; # Enable warnings. This will warn on unused rules &c.
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    59
$::RD_HINT   = 1; # Give out hints to help fix problems.
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    60
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    61
my $parser = Parse::RecDescent->new($grammar);
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    62
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    63
my $content = '';
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    64
{
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    65
	local $/;
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    66
	$content = <>;
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    67
}
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    68
18
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    69
$::res = {}; # parse tree result
9
837e0e828d06 added generic parser
"Tomas Zeman <tzeman@volny.cz>"
parents:
diff changeset
    70
my $p_res = $parser->file($content);
22
78285474e8d3 parser: die if parsing failed
"Tomas Zeman <tzeman@volny.cz>"
parents: 18
diff changeset
    71
defined $p_res || die "Parser failed";
18
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    72
my $storable = $opts->{o};
17
d39ff14a8964 parser: store result via Storable if requested
"Tomas Zeman <tzeman@volny.cz>"
parents: 9
diff changeset
    73
store($::res, $storable) if (defined $storable && length($storable) > 0);
18
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    74
print Dumper $::res if ($opts->{d});
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    75
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    76
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    77
sub main::VERSION_MESSAGE {
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    78
	my $fh = shift;
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    79
	print $fh "parser version $main::VERSION - Copyright 2009 Tomas Zeman\n";
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    80
}
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    81
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    82
sub main::HELP_MESSAGE {
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    83
	print <<EOF;
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    84
Usage: parser [ -d ] [ -o data ] -g grammar_file
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    85
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    86
   -o data	store parse tree into file (using Storable module)
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    87
   -d		dump parse tree to stdout
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    88
   -g grammar_file
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    89
   		file containing parse grammar
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    90
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    91
EOF
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    92
}
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    93
8d541766cd1f parser: (c), getopts
"Tomas Zeman <tzeman@volny.cz>"
parents: 17
diff changeset
    94