10.04.2013 Views

Unni Cathrine Eiken February 2005

Unni Cathrine Eiken February 2005

Unni Cathrine Eiken February 2005

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

# Subrutine som tar inn argumentnummer (1 eller 2, tilsvarer ARG1 eller ARG2) og<br />

predikat.<br />

# Viser predikatets argumenter (NIVÅ0) og returnerer dem for bruk på neste nivå.<br />

sub parse_level0 {<br />

# Henter subrutinens parametre.<br />

my $argnum = shift;<br />

my $pred = shift;<br />

# Henter ut alle predikatets argumenter.<br />

my %args = $argnum == 1 ? %{$pred_args1{$pred}} : %{$pred_args2{$pred}};<br />

# Henter ut selve argumentene i sortert rekkefølge (etter antall forekomster og<br />

alfabetisk).<br />

my @args = sort { $args{$b} $args{$a} } sort { lc($a) cmp lc($b) } keys %args;<br />

}<br />

# Viser predikatets argument-liste.<br />

print "NIVÅ0, ARG$argnum ($pred): ";<br />

print join(', ', map { "$_ x $args{$_}" } @args), "\n";<br />

return @args;<br />

# Subrutine som tar inn argumentnummer (1 eller 2, tilsvarer ARG1 eller ARG2) og et<br />

argument (pluss ekstra styringsparametre).<br />

# Finner andre predikater som argumentet er brukt i forbindelse med.<br />

# Viser argumenter for alle funnede predikater, samt antallet ganger disse argumentene<br />

ble brukt.<br />

#<br />

# I resten av subrutinen kalles disse funnede argumentene for "refererte argumenter (på<br />

neste nivå)",<br />

# fordi de indirekte via et predikat er referert fra et argument (eks: et NIVÅ0-argument<br />

"refererer"<br />

# til en del NIVÅ1-arguenter, som igjen referer til en del NIVÅ2-argumenter).<br />

sub parse_level1or2 {<br />

# Henter subrutinens parametre.<br />

my $level = shift;<br />

my $argnum = shift;<br />

my $arg = shift;<br />

my $pred_lvl0 = shift;<br />

my $arg_lastlevel = $level == 1 ? '' : shift;<br />

# Tar ikke hensyn til '?'-argumenter.<br />

return if $arg eq '?';<br />

# Datastruktur som teller antall refererte argumenter på neste nivå.<br />

my %argrefs = ();<br />

# Henter ut alle predikatene som inneholder argumentet.<br />

my @preds = $argnum == 1 ? keys %{$arg1_preds{$arg}} : keys %{$arg2_preds{$arg}};<br />

# ...og gjennomløper disse predikatene.<br />

foreach $pred (@preds) {<br />

# Tar ikke hensyn til samme predikatet som man holder på med.<br />

next if $pred eq $pred_lvl0;<br />

# Henter ut alle predikatets argumenter.<br />

my %args = $argnum == 1 ? %{$pred_args1{$pred}} : %{$pred_args2{$pred}};<br />

# ...og gjennomløper og teller disse.<br />

foreach $argref (keys %args) {<br />

# Tar ikke hensyn til samme argument som man holder på med.<br />

next if $argref eq $arg || $argref eq $arg_lastlevel;<br />

}<br />

# Øker telleren (antall refererte argumenter på neste nivå).<br />

$argrefs{$argref} += $args{$argref};<br />

111

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!