X-Git-Url: https://git.camperquake.de/gitweb.cgi?a=blobdiff_plain;ds=sidebyside;f=videosite%2FJSONNospace.yp;fp=videosite%2FJSONNospace.yp;h=384eda34cc53bc97152ae16391596997f4b56957;hb=c41cdd5161342c69724537a5094fb9e270f48c55;hp=0000000000000000000000000000000000000000;hpb=cf79fb9dc759e1ca100557fce9e00d82cd3a3a67;p=videosite.git diff --git a/videosite/JSONNospace.yp b/videosite/JSONNospace.yp new file mode 100644 index 0000000..384eda3 --- /dev/null +++ b/videosite/JSONNospace.yp @@ -0,0 +1,111 @@ +/* + * 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 | + escapedchar; + +%%