Mercurial > pub > Impl
view Lib/IMPL/Text/Parser/Player.pm @ 40:ac21a032e7a9
bnf parser in progress
author | Sergey |
---|---|
date | Thu, 10 Dec 2009 17:43:39 +0300 |
parents | 4f5a6a1bfb0e |
children | c442eb67fa22 |
line wrap: on
line source
package IMPL::Text::Parser::Player; use strict; use warnings; use base qw(IMPL::Object); use IMPL::Class::Property; use IMPL::Class::Property::Direct; use IMPL::Text::Parser::Chunk; my %opCodesMap = ( IMPL::Text::Parser::Chunk::OP_REGEXP , &MatchRegexp , IMPL::Text::Parser::Chunk::OP_STRING , &MatchString , IMPL::Text::Parser::Chunk::OP_REFERENCE , &MatchReference , IMPL::Text::Parser::Chunk::OP_CHUNK , &PlayChunk , IMPL::Text::Parser::Chunk::OP_SWITCH , &MatchSwitch , IMPL::Text::Parser::Chunk::OP_REPEAT , &MatchRepeat ); BEGIN { private _direct property _data => prop_all; private _direct property _current => prop_all; public _direct property Punctuation => prop_all; public _direct property Delimier => prop_all; } sub LoadString { my ($this,$string) = @_; my $rxDelim = /(\s+|[.,;!-+*~$^&|%()`@\\\/])/; my $line = 0; $this->{$_data} = [ map { $line++; map { [$line,$_] } split $rxDelim, $_ } split /\n/, $string ] } sub PlayChunk { my ($this,$chunk) = @_; $opCodesMap{shift @$_}->(@$_) foreach @{$chunk->opStream}; } sub MatchRegexp { my ($this,$rx) = @_; if ($this->{$_current}{token} =~ $rx) { } } sub moveNext { my ($this) = @_; my $pos = $this->{$_current}{pos}; $pos ++; if ($pos < @{$this->{$_data}}) { $this->{$_current} = { pos => $pos }; } else { return undef; } } 1;