committed by
Joachim Klein
1 changed files with 234 additions and 0 deletions
@ -0,0 +1,234 @@ |
|||||
|
#! /usr/bin/perl -w |
||||
|
|
||||
|
use strict; |
||||
|
use Getopt::Long; |
||||
|
|
||||
|
my @property_term_files; |
||||
|
my @model_term_files; |
||||
|
my @both_term_files; |
||||
|
my $outfile = '/dev/stdout'; |
||||
|
my $verbose = 0; |
||||
|
my $mark_start = 0; |
||||
|
|
||||
|
if (!GetOptions("prop-regexp|p=s" => \@property_term_files, |
||||
|
"model-regexp|m=s" => \@model_term_files, |
||||
|
"both-regexp|b=s" => \@both_term_files, |
||||
|
"mark-start|s" => \$mark_start, |
||||
|
"output|o=s" => \$outfile, |
||||
|
"verbose" => \$verbose, |
||||
|
)) { |
||||
|
usage(); |
||||
|
} |
||||
|
|
||||
|
sub usage { |
||||
|
print "prismlog2csv [arguments] [log-file]\n\n"; |
||||
|
print " --prop-regexp file read additional regular expressions matching per property from file\n"; |
||||
|
print " --model-regexp file read additional regular expressions matching per model build from file\n"; |
||||
|
print " --both-regexp file read additional regular expressions matching either per model or per property from file\n"; |
||||
|
exit(1); |
||||
|
} |
||||
|
|
||||
|
# regular expressions for synching from the log file |
||||
|
my $re_prism_start = qr/PRISM$/; |
||||
|
my $re_property = qr/^Model checking: (.+)$/; |
||||
|
my $re_model_file = qr/^Parsing model file "(.+)"...$/; |
||||
|
my $re_properties_file = qr/^Parsing properties file "(.+)".../; |
||||
|
my $re_command_line = qr/^Command line: (.+)$/; |
||||
|
my $re_property_constants = qr/^Property constants: (.+)$/; |
||||
|
my $re_model_constants = qr/^Model constants: (.+)$/; |
||||
|
my $re_error = qr/^Error: (.+)$/; |
||||
|
|
||||
|
|
||||
|
my @model_terms_standard = |
||||
|
( |
||||
|
[model_build_time => qr/^Time for model construction: (.+) seconds/], |
||||
|
[model_states => qr/^States: (\d+) \(\d+ initial\)/], |
||||
|
[model_states_initial => qr/^States: \d+ \((\d+) initial\)/], |
||||
|
[model_transitions => qr/^Transitions: (\d+)/], |
||||
|
[model_matrix_dd => qr/^(?:Rate|Transition) matrix: (\d+) nodes/], |
||||
|
); |
||||
|
|
||||
|
|
||||
|
my @property_terms_standard = |
||||
|
( |
||||
|
[property_mc_time => qr/^Time for model checking: (.+) seconds/], |
||||
|
[property_result => qr/^Result: ([^(]+)/], |
||||
|
); |
||||
|
|
||||
|
my @model_terms = @model_terms_standard; |
||||
|
my @property_terms = @property_terms_standard; |
||||
|
my @both_terms = (); |
||||
|
|
||||
|
|
||||
|
for my $model_term_file (@model_term_files) { |
||||
|
load_regexps_from_file($model_term_file, \@model_terms); |
||||
|
} |
||||
|
|
||||
|
for my $property_term_file (@property_term_files) { |
||||
|
load_regexps_from_file($property_term_file, \@property_terms); |
||||
|
} |
||||
|
|
||||
|
for my $both_term_file (@both_term_files) { |
||||
|
load_regexps_from_file($both_term_file, \@both_terms); |
||||
|
} |
||||
|
|
||||
|
if ($verbose) { |
||||
|
print STDERR "Model regular expressions:\n"; |
||||
|
print STDERR "--------------------------\n"; |
||||
|
foreach (@model_terms) { |
||||
|
print STDERR " ", $_->[0], ":\n ", $_->[1], "\n\n"; |
||||
|
} |
||||
|
|
||||
|
print STDERR "\nProperty regular expressions:\n"; |
||||
|
print STDERR "-----------------------------\n"; |
||||
|
foreach (@property_terms) { |
||||
|
print STDERR " ", $_->[0], ":\n ", $_->[1], "\n\n"; |
||||
|
} |
||||
|
|
||||
|
print STDERR "\nBoth regular expressions:\n"; |
||||
|
print STDERR "-------------------------\n"; |
||||
|
foreach (@both_terms) { |
||||
|
print STDERR " ", $_->[0], ":\n ", $_->[1], "\n\n"; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
open(OUT, ">", $outfile) or die "Can not open $outfile: $!\n"; |
||||
|
|
||||
|
my %current; |
||||
|
|
||||
|
while (my $line=<>) { |
||||
|
chomp($line); |
||||
|
if ($line =~ $re_prism_start) { |
||||
|
%current = (); |
||||
|
} |
||||
|
if ($line =~ $re_model_file) { |
||||
|
$current{model_file} = $1; |
||||
|
print OUT "# Model file: $1\n"; |
||||
|
if ($mark_start) { |
||||
|
print OUT get_model_key(), ";;start-model", "\n"; |
||||
|
} |
||||
|
} |
||||
|
if ($line =~ $re_properties_file) { |
||||
|
$current{properties_file} = $1; |
||||
|
print OUT "# Properties file: $1\n"; |
||||
|
} |
||||
|
if ($line =~ $re_command_line) { |
||||
|
$current{command_line} = $1; |
||||
|
print OUT "# Command line: $1\n"; |
||||
|
} |
||||
|
if ($line =~ $re_property) { |
||||
|
$current{property} = $1; |
||||
|
if ($mark_start) { |
||||
|
print OUT get_property_key(), ";start-check", "\n"; |
||||
|
} |
||||
|
$current{seen} = {}; |
||||
|
} |
||||
|
if ($line =~ $re_model_constants) { |
||||
|
$current{model_constants} = $1; |
||||
|
$current{model_constants} =~ s/\s//g; #remove whitespace |
||||
|
} |
||||
|
if ($line =~ $re_property_constants) { |
||||
|
$current{property_constants} = $1; |
||||
|
$current{property_constants} =~ s/\s//g; #remove whitespace |
||||
|
} |
||||
|
if ($line =~ $re_error) { |
||||
|
if (defined $current{property}) { |
||||
|
# we are in a property... |
||||
|
print OUT get_property_key(), ";error;", quote_semicolon($1), "\n"; |
||||
|
} else { |
||||
|
print OUT get_model_key(), ";;error;", quote_semicolon($1), "\n"; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
# custom regexps |
||||
|
foreach my $term (@model_terms) { |
||||
|
match_term($line, $term, 0); |
||||
|
} |
||||
|
|
||||
|
foreach my $term (@property_terms) { |
||||
|
match_term($line, $term, 1); |
||||
|
} |
||||
|
|
||||
|
foreach my $term (@both_terms) { |
||||
|
match_term($line, $term, defined $current{property}); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
sub match_term { |
||||
|
my $line = shift; |
||||
|
my $term = shift; |
||||
|
my $is_property = shift; |
||||
|
|
||||
|
my $id = $term->[0]; |
||||
|
if ($line =~ $term->[1]) { |
||||
|
my $xid; |
||||
|
if ($is_property) { |
||||
|
$xid = get_property_key() . ";" . $id; |
||||
|
} else { |
||||
|
$xid = get_model_key() . ";;" . $id; |
||||
|
} |
||||
|
|
||||
|
while (defined $current{seen}->{$xid}) { |
||||
|
if ($xid =~ /^(.+)-(\d+)$/) { |
||||
|
$xid = "$1-".($2+1); |
||||
|
} else { |
||||
|
$xid.="-2"; |
||||
|
} |
||||
|
} |
||||
|
$current{seen}->{$xid}=1; |
||||
|
|
||||
|
print OUT $xid, ";", quote_semicolon($1), "\n"; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
sub quote_semicolon { |
||||
|
my $s = shift; |
||||
|
|
||||
|
$s=~ s/;/_/g; |
||||
|
return $s; |
||||
|
} |
||||
|
|
||||
|
sub get_model_key { |
||||
|
my $model_file = $current{model_file} || ""; |
||||
|
$model_file .= (defined $current{model_constants} ? "@".$current{model_constants} : ""); |
||||
|
|
||||
|
return quote_semicolon($model_file); |
||||
|
} |
||||
|
|
||||
|
sub get_property_key { |
||||
|
my $model_file = get_model_key(); |
||||
|
|
||||
|
my $property = $current{property} || ""; |
||||
|
$property .= (defined $current{property_constants} ? "@".$current{property_constants} : ""); |
||||
|
|
||||
|
return quote_semicolon($model_file) . ";" . quote_semicolon($property); |
||||
|
} |
||||
|
|
||||
|
sub load_regexps_from_file { |
||||
|
my $term_file = shift; |
||||
|
my $terms = shift; |
||||
|
|
||||
|
open(IN, "<", $term_file) or die "Can not open $term_file: $!\n"; |
||||
|
my $cur_key = undef; |
||||
|
while (<IN>) { |
||||
|
chomp; |
||||
|
s/^\s*//; #remove whitespace |
||||
|
s/\s*$//; |
||||
|
next if /^#$/ || /^$/; |
||||
|
|
||||
|
if (defined $cur_key) { |
||||
|
my $regexp = $_; |
||||
|
push @{ $terms }, [ $cur_key, qr/$regexp/ ]; |
||||
|
$cur_key = undef; |
||||
|
} else { |
||||
|
$cur_key = $_; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
if (defined $cur_key) { |
||||
|
die "Lonely key $cur_key at end of $term_file\n"; |
||||
|
} |
||||
|
return 1; |
||||
|
} |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue