/* * This file contains a simple and quite possible wrong parser for * JSON encoded structures. * * It does not support white space in quoted strings, those are silently * dropped. * * It has primarily been written to parse video parameters from the * DailyMotion site * * Token definitions: * COLON => ':', * QUOTE => '\"', * SINGLEQUOTE => '\\\'', * TRUE => 'true', * FALSE => 'false', * NULL => 'null', * QUADHEX => 'u[0-9a-fA-F]{4}', * INTEGER => '[0-9]+', * QUOTEDNORMAL => '[nr]', * SIMPLECHAR => '[-a-zA-Z\._\?\+=\&\!%<>]+', * BACKSLASH => '\\\\', * SLASH => '/', * COMMA => ',', * CURLYOPEN => '{', * CURLYCLOSE => '}', * SQUAREOPEN => '\[', * SQUARECLOSE => '\]', */ %{ use Encode; %} %% basicstream: basictype { return [ $_[1] ] } | basicstream COMMA basictype { return [ @{$_[1]}, $_[3] ] }; basictype: hash | array | quotestring | boolean; boolean: TRUE { return 1 } | FALSE { return 0 }; array: SQUAREOPEN SQUARECLOSE { return [] } | SQUAREOPEN basicstream SQUARECLOSE { return [ @{$_[2]} ] }; hash: CURLYOPEN CURLYCLOSE { return { } } | CURLYOPEN kvstream CURLYCLOSE { return { @{$_[2]} } }; kvstream: kvpair | kvstream COMMA kvpair { return [ @{$_[1]}, @{$_[3]} ] }; kvpair: quotestring COLON quotestring { return [ $_[1], $_[3] ] } | quotestring COLON hash { return [ $_[1], $_[3] ] } | quotestring COLON array { return [ $_[1], $_[3] ] } | quotestring COLON boolean { return [ $_[1], $_[3] ] } | quotestring COLON NULL { return [ $_[1], undef ] } | quotestring COLON INTEGER { return [ $_[1], $_[3] ] }; quotestring: QUOTE QUOTE { return "" } | QUOTE charstream QUOTE { return $_[2] }; charstream: char | charstream char { return $_[1] . $_[2] }; escapedchar: BACKSLASH CURLYOPEN { return $_[2] } | BACKSLASH CURLYCLOSE { return $_[2] } | BACKSLASH SQUAREOPEN { return $_[2] } | BACKSLASH SQUARECLOSE { return $_[2] } | BACKSLASH QUOTE { return $_[2] } | BACKSLASH SINGLEQUOTE { return $_[2] } | BACKSLASH SLASH { return $_[2] } | BACKSLASH BACKSLASH { return $_[2] } | BACKSLASH QUADHEX { return encode("utf8", pack("U", hex(substr($_[2],1)))) } | BACKSLASH QUOTEDNORMAL { if ($_[2] eq 'n') { return "\n"; } elsif ($_[2] eq 'r') { return "\r"; } else { return $_[2]; }}; char: QUOTEDNORMAL | U | QUADHEX | SIMPLECHAR | INTEGER | COLON | COMMA | SINGLEQUOTE | TRUE | FALSE | NULL | SQUAREOPEN | SQUARECLOSE | escapedchar; %%