Rename JSArrayParser to JSLexArrayParser
[videosite.git] / videosite / JSLexArrayParser.pm
diff --git a/videosite/JSLexArrayParser.pm b/videosite/JSLexArrayParser.pm
new file mode 100644 (file)
index 0000000..20e6e0e
--- /dev/null
@@ -0,0 +1,55 @@
+#
+# A helper class for parsing textual JS hashes into perl 
+# hashes
+#
+# 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
+#
+
+package videosite::JSArrayParser;
+
+use Parse::Lex;
+use videosite::jsarray;
+use strict;
+
+my @tokens = (
+    COLON  => '[:]',
+    RIGHTC => '[\}]',
+    LEFTC => '[\{]',
+    QUOTE => '[\"]',
+    COMMA => '[,]',
+    ID =>    '[\w_%\.\+-]+'
+);
+
+sub new {
+    my $class = shift;
+    my $self = {
+        '_PARSER' => videosite::jsarray->new(),
+        '_LEXER' => Parse::Lex->new(@tokens),
+    };
+
+    return bless($self, $class);
+}
+
+sub parse {
+    my $self = shift;
+    my $s = shift;
+    my @result;
+    my $l = $self->{'_LEXER'};
+
+    $l->from($s);
+    @result = $self->{'_PARSER'}->YYParse(
+        yylex => sub {
+            my $tok = $l->next();
+            return ('', undef) unless $tok;
+            return ('', undef) if $l->eoi();
+            return ($tok->name(), $tok->text());
+        },
+        yyerror => sub {
+            $_[0]->YYAbort();
+        },
+        yydebug => 0x0);
+    return $result[0]?{@{$result[0]}}:undef;
+}
+
+1;