X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=videosite%2FJSLexArrayParser.pm;h=73a8d7e9a3f4483f5ab3d098b21f15fd4e0c28cf;hb=542ba5f881a3de86e9d6b01c64dbdbcff172fbaf;hp=20e6e0ef7813cfb9cf679893b6e94cb065ba6bfb;hpb=385562c7e75f81207b5079415eaea99792b91a9a;p=videosite.git diff --git a/videosite/JSLexArrayParser.pm b/videosite/JSLexArrayParser.pm index 20e6e0e..73a8d7e 100644 --- a/videosite/JSLexArrayParser.pm +++ b/videosite/JSLexArrayParser.pm @@ -1,32 +1,47 @@ # -# A helper class for parsing textual JS hashes into perl -# hashes +# A helper class for parsing textual JSON structures into perl +# structures # -# The parser is in jsarray.yp, to regenerate you'll need the Parse::YAPP -# package. Use 'yapp -m videosite::jsarray -s jsarray.yp' to regenerate +# The parser is in JSONNospace.yp, to regenerate you'll need the Parse::YAPP +# package. Use 'yapp -m videosite::JSONNospace -s JSONNospace.yp' to regenerate # -package videosite::JSArrayParser; +package videosite::JSLexArrayParser; + +use videosite::JSArrayParser; +@ISA = qw(videosite::JSArrayParser); use Parse::Lex; -use videosite::jsarray; +use videosite::JSONNospace; +use Data::Dumper; use strict; my @tokens = ( - COLON => '[:]', - RIGHTC => '[\}]', - LEFTC => '[\{]', - QUOTE => '[\"]', - COMMA => '[,]', - ID => '[\w_%\.\+-]+' + COLON => ':', + QUOTE => '\"', + SINGLEQUOTE => '\\\'', + TRUE => 'true', + FALSE => 'false', + NULL => 'null', + QUADHEX => 'u[0-9a-fA-F]{4}', + INTEGER => '[0-9]+', + QUOTEDNORMAL => '[nr]', + SIMPLECHAR => '[-\w\._\?\+=\&\!%<>;]+', + BACKSLASH => '\\\\', + SLASH => '/', + COMMA => ',', + CURLYOPEN => '{', + CURLYCLOSE => '}', + SQUAREOPEN => '\[', + SQUARECLOSE => '\]', ); sub new { my $class = shift; - my $self = { - '_PARSER' => videosite::jsarray->new(), - '_LEXER' => Parse::Lex->new(@tokens), - }; + my $self = $class->SUPER::new(); + + $self->{'_PARSER'} = videosite::JSONNospace->new(); + $self->{'_LEXER'} = Parse::Lex->new(@tokens); return bless($self, $class); } @@ -34,11 +49,11 @@ sub new { sub parse { my $self = shift; my $s = shift; - my @result; + my $result; my $l = $self->{'_LEXER'}; $l->from($s); - @result = $self->{'_PARSER'}->YYParse( + $result = $self->{'_PARSER'}->YYParse( yylex => sub { my $tok = $l->next(); return ('', undef) unless $tok; @@ -49,7 +64,7 @@ sub parse { $_[0]->YYAbort(); }, yydebug => 0x0); - return $result[0]?{@{$result[0]}}:undef; + return ref($result)?$result->[0]:$result; } 1;