diff --git a/lib/App/Frame.pm b/lib/App/Frame.pm new file mode 100644 index 0000000000000000000000000000000000000000..fa7e77033ca06525964302aed13e62fa203048f4 --- /dev/null +++ b/lib/App/Frame.pm @@ -0,0 +1,24 @@ +package Frame; + +use strict; +use warnings; + +use Data::Dumper; + +sub debug_frame +{ + my %frame = %{ $_[0] }; + print Dumper \%frame; +} + +sub frame_info +{ + my %frame = %{ $_[0] }; + print "Frame for line $frame{'rosen'}:\n"; + print ". $frame{'eki_num'} stations\n"; + print ". " . scalar @{ $frame{'syubetsu'} } . " service types\n"; + print ". " . scalar @{ $frame{'dia'}{'kudari'} } . " down services\n"; + print ". " . scalar @{ $frame{'dia'}{'nobori'} } . " up services\n"; +} + +1; diff --git a/lib/App/Ressya.pm b/lib/App/Ressya.pm new file mode 100644 index 0000000000000000000000000000000000000000..0b8d25abfa7cef5291ab3c891daf70a8a0d1aa9e --- /dev/null +++ b/lib/App/Ressya.pm @@ -0,0 +1,34 @@ +package Ressya; + +use strict; +use warnings; + +use Data::Dumper; + +sub kukan +{ + my @jikoku = @{ $_[0]{'jikoku'} }; + my $start = 0; + my $end; + my %res; + + while (!defined $jikoku[0]) + { + shift @jikoku; + $start++; + } + + $end = $start; + while (defined $jikoku[0]) + { + shift @jikoku; + $end++; + } + + $res{'start'} = $start; + $res{'end'} = $end; + + return \%res; +} + +1; diff --git a/src/oud2_parser.pl b/src/oud2_parser.pl index a2ce0abcf40ee0d4babc36f04efe37b7f081fd1e..f4c73be7a50bba02a71c41aa19083542ae4be203 100644 --- a/src/oud2_parser.pl +++ b/src/oud2_parser.pl @@ -1,11 +1,14 @@ #!/usr/bin/perl use Module::Load; +use utf8; use autodie 'open'; use strict; use warnings; use feature 'unicode_strings'; +binmode(STDOUT, ":encoding(UTF-8)"); + BEGIN { unshift @INC, './lib'; @@ -57,16 +60,8 @@ sub Dia::hash_of_ts_dep { shift; my $q = {"mode" => $_[0], sub Dia::hash_of_ts_ad { shift; my $q = {"mode" => $_[0], "chaku" => $_[2], "hatsu" => $_[4],}; return $q; } -sub Dia::list_of_ts -{ - shift; - print "Making list of ts...\n"; - return \@_; -} - -sub Dia::list_of_eki +sub Dia::take_all { - # TODO use Eki objects shift; return \@_; } @@ -88,7 +83,31 @@ sub Dia::ts_combine sub Dia::print_sta { shift; print "Found station: "; print $_[1]; print "\n"; } sub Dia::print_line { shift; print "Working on line: "; print $_[1]; print "\n"; } + +sub Dia::format_syubetsu +{ + shift; + my %syubetsu; + + $syubetsu{'name'} = $_[0]; + $syubetsu{'ryaku'} = $_[1]; + return \%syubetsu; +} + sub Dia::format_ressya +{ + shift; + my %ressya; + + $ressya{'syubetsu'} = $_[2]; + $ressya{'bangou'} = defined $_[3] ? $_[3] : "[no number]"; + $ressya{'meisyo'} = $_[4]; + $ressya{'jikoku'} = $_[5]; + + return \%ressya; +} + +sub Dia::debug_ressya { shift; print Dumper(\@_); @@ -110,14 +129,47 @@ sub Dia::format_mei sub Dia::return_name { shift; return $_[1]; } +sub Dia::concat_dia +{ + shift; shift; shift; + # TODO add support for multiple diagrams + my %dias; + my @dia = @_; + + $dias{'kudari'} = $dia[0]; + $dias{'nobori'} = $dia[1]; + return \%dias; +} + +sub Dia::frame +{ + shift; shift; + my %frame; + # print Dumper \@_; + my @data = @_; + + $frame{'rosen'} = $data[0]; + $frame{'eki'} = $data[1]; + + my @ekis = @{ $frame{'eki'} }; + $frame{'eki_num'} = scalar @ekis; + + $frame{'syubetsu'} = $data[2]; + $frame{'dia'} = $data[3]; + + return \%frame; +} + package main; +use App::Ressya; +use App::Frame; + use Data::Dumper; use File::BOM; use open qw( :std :encoding(UTF-8) ); -print Dumper \@ARGV; my $dia_path = $ARGV[0]; my $default_path = 'tests/dia/kyogoku.oud2'; my $dia_file; @@ -143,7 +195,9 @@ lexeme default = latm => 1 ALL ::= HEADER_SECTION ROSEN_SECTION EKI_SECTION + SYUBETSU_SECTION DIA_SECTION + action => Dia::frame HEADER_SECTION ::= HEADER_BEGIN @@ -151,17 +205,24 @@ HEADER_SECTION ::= HEADER_BEGIN ROSEN_SECTION ::= ROSEN_BEGIN ROSEN_NAME GARBAGE_LINES + action => Dia::second EKI_SECTION ::= EKI_ALL + action => ::first +SYUBETSU_SECTION ::= SYUBETSU_ALL + action => ::first DIA_SECTION ::= DIA_BEGIN GARBAGE_LINES DIA_DOWN_SECTION DIA_UP_SECTION + action => Dia::concat_dia DIA_DOWN_SECTION ::= DIA_DOWN_BEGIN RESSYAS GARBAGE_LINES + action => Dia::second DIA_UP_SECTION ::= DIA_UP_BEGIN RESSYAS GARBAGE_LINES + action => Dia::second HEADER_BEGIN ::= 'FileType=' @@ -169,10 +230,10 @@ HEADER_BEGIN ::= 'FileType=' ROSEN_BEGIN ::= 'Rosen.' ROSEN_NAME ::= 'Rosenmei=' NAME - action => Dia::print_line + action => Dia::second EKI_ALL ::= EKI_STRUCT+ - action => Dia::list_of_eki + action => Dia::take_all EKI_STRUCT ::= EKI_BEGIN EKI_NAME GARBAGE_LINES @@ -182,6 +243,21 @@ EKI_BEGIN ~ 'Eki.' EKI_NAME ::= 'Ekimei=' NAME action => Dia::second +SYUBETSU_ALL ::= SYUBETSU_STRUCT+ + action => Dia::take_all +SYUBETSU_STRUCT ::= SYUBETSU_BEGIN + SYUBETSU_SUB + GARBAGE_LINES + action => Dia::second +SYUBETSU_SUB ::= SYUBETSU_NAME + SYUBETSU_RYAKU + action => Dia::format_syubetsu +SYUBETSU_BEGIN ~ 'Ressyasyubetsu.' +SYUBETSU_NAME ::= 'Syubetsumei=' NAME + action => Dia::second +SYUBETSU_RYAKU ::= 'Ryakusyou=' NAME + action => Dia::second + DIA_BEGIN ::= 'Dia.' action => Dia::begin_dia_section DIA_DOWN_BEGIN ::= 'Kudari.' @@ -190,6 +266,7 @@ DIA_UP_BEGIN ::= 'Nobori.' action => Dia::dia_up_subsection RESSYAS ::= RESSYA+ + action => Dia::take_all RESSYA ::= 'Ressya.' GARBAGE_LINE RESSYA_TYPE @@ -200,22 +277,22 @@ RESSYA ::= 'Ressya.' action => Dia::format_ressya RESSYA_TYPE ::= 'Syubetsu=' NAME - action => Dia::return_name + action => Dia::second RESSYA_BANGOU ::= BANGOU_LINE* action => ::first BANGOU_LINE ::= 'Ressyabangou=' NAME - action => Dia::return_name + action => Dia::second RESSYA_MEI ::= MEI_STRUCT* action => ::first MEI_STRUCT ::= MEI_LINE GOU_LINE action => Dia::format_mei MEI_LINE ::= 'Ressyamei=' NAME - action => Dia::return_name + action => Dia::second GOU_LINE ::= GOUSUU* action => ::first GOUSUU ::= 'Gousuu=' NAME - action => Dia::return_name + action => Dia::second RESSYA_JIKOKU ::= 'EkiJikoku=' JIKOKU action => Dia::second JIKOKU ::= TS_TIMESTAMPS @@ -225,7 +302,7 @@ JIKOKU ::= TS_TIMESTAMPS # We make the assumption that a service always ends by a simple arrival timestamp. # TODO There are actually more possible end timestamps TS_TIMESTAMPS ::= TS_TIMESTAMP+ - action => Dia::list_of_ts + action => Dia::take_all # separator => COMMA # proper => 1 TS_TIMESTAMP ::= TS_TIMESTAMP_STRUCT COMMA @@ -297,16 +374,13 @@ my $recce = Marpa::R2::Scanless::R->new( #$diag->read(\$input); -#print $diag->parse(\"......", 'main'); -#print $diag->parse(\$contents, 'main'); -#print $recce->read(\$contents); try { print $recce->read(\$contents); } -catch ($e) { print "nej\n$e\n" } - +catch ($e) { print "Malformation in .oud file.\n$e\n" } print "\n"; -print $recce->show_progress(); - -print $recce->value(); +my %frame = %{ ${$recce->value()} }; +Frame::frame_info \%frame; +# my $r = $frame{'dia'}{'nobori'}[0]; +# print Ressya::kukan $r; close $diah;