X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;f=videosite%2FJSLexArrayParser.pm;h=73a8d7e9a3f4483f5ab3d098b21f15fd4e0c28cf;hb=542ba5f881a3de86e9d6b01c64dbdbcff172fbaf;hp=f250d6125de729ff83208887a9e8e012149e97b5;hpb=58b8459c57374848e30ec37cf026a8c7680a8a9f;p=videosite.git diff --git a/videosite/JSLexArrayParser.pm b/videosite/JSLexArrayParser.pm index f250d61..73a8d7e 100644 --- a/videosite/JSLexArrayParser.pm +++ b/videosite/JSLexArrayParser.pm @@ -1,9 +1,9 @@ # -# 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::JSLexArrayParser; @@ -12,23 +12,35 @@ 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 = $class->SUPER::new(); - $self->{'_PARSER'} = videosite::jsarray->new(); + $self->{'_PARSER'} = videosite::JSONNospace->new(); $self->{'_LEXER'} = Parse::Lex->new(@tokens); return bless($self, $class); @@ -37,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; @@ -52,7 +64,7 @@ sub parse { $_[0]->YYAbort(); }, yydebug => 0x0); - return $result[0]?{@{$result[0]}}:undef; + return ref($result)?$result->[0]:$result; } 1;