Add _selftest() function and test script to verify Grabber functionality
[videosite.git] / videosite / JSONNospace.yp
1 /*
2  * This file contains a simple and quite possible wrong parser for
3  * JSON encoded structures.
4  *
5  * It does not support white space in quoted strings, those are silently
6  * dropped.
7  *
8  * It has primarily been written to parse video parameters from the
9  * DailyMotion site
10  *
11  * Token definitions:
12  *  COLON => ':',
13  *  QUOTE => '\"',
14  *  SINGLEQUOTE => '\\\'',
15  *  TRUE => 'true',
16  *  FALSE => 'false',
17  *  NULL => 'null',
18  *  QUADHEX => 'u[0-9a-fA-F]{4}',
19  *  INTEGER => '[0-9]+',
20  *  QUOTEDNORMAL => '[nr]',
21  *  SIMPLECHAR => '[-a-zA-Z\._\?\+=\&\!%<>]+',
22  *  BACKSLASH => '\\\\',
23  *  SLASH => '/',
24  *  COMMA => ',',
25  *  CURLYOPEN => '{',
26  *  CURLYCLOSE => '}',
27  *  SQUAREOPEN => '\[',
28  *  SQUARECLOSE => '\]',
29  */
30
31 %{
32 use Encode;
33 %}
34 %%
35     
36 basicstream:
37     basictype { return [ $_[1] ] } |
38     basicstream COMMA basictype { return [ @{$_[1]}, $_[3] ] };
39
40 basictype:
41     hash |
42     array |
43     quotestring |
44     boolean;
45
46 boolean:
47     TRUE { return 1 } |
48     FALSE { return 0 };
49
50 array:
51     SQUAREOPEN SQUARECLOSE { return [] } |
52     SQUAREOPEN basicstream SQUARECLOSE { return [ @{$_[2]} ] };
53
54 hash:
55     CURLYOPEN CURLYCLOSE { return { } } |
56     CURLYOPEN kvstream CURLYCLOSE { return { @{$_[2]} } };
57
58 kvstream:
59     kvpair |
60     kvstream COMMA kvpair { return [ @{$_[1]}, @{$_[3]} ] };
61
62 kvpair:
63     quotestring COLON quotestring { return [ $_[1], $_[3] ] } |
64     quotestring COLON hash { return [ $_[1], $_[3] ] } |
65     quotestring COLON array { return [ $_[1], $_[3] ] } |
66     quotestring COLON boolean { return [ $_[1], $_[3] ] } |
67     quotestring COLON NULL { return [ $_[1], undef ] } |
68     quotestring COLON INTEGER { return [ $_[1], $_[3] ] };
69
70 quotestring:
71     QUOTE QUOTE { return "" } | 
72     QUOTE charstream QUOTE { return $_[2] };
73
74 charstream:
75     char |
76     charstream char { return $_[1] . $_[2] };
77
78 escapedchar:
79     BACKSLASH CURLYOPEN { return $_[2] } |
80     BACKSLASH CURLYCLOSE { return $_[2] } |
81     BACKSLASH SQUAREOPEN { return $_[2] } |
82     BACKSLASH SQUARECLOSE { return $_[2] } |
83     BACKSLASH QUOTE { return $_[2] } |
84     BACKSLASH SINGLEQUOTE { return $_[2] } |
85     BACKSLASH SLASH { return $_[2] } |
86     BACKSLASH BACKSLASH { return $_[2] } |
87     BACKSLASH QUADHEX { return encode("utf8", pack("U", hex(substr($_[2],1)))) } |
88     BACKSLASH QUOTEDNORMAL {
89         if ($_[2] eq 'n') {
90             return "\n";
91         } elsif ($_[2] eq 'r') {
92             return "\r";
93         } else {
94             return $_[2];
95         }};
96
97 char:
98     QUOTEDNORMAL |
99     U |
100     QUADHEX |
101     SIMPLECHAR | 
102     INTEGER |
103     COLON |
104     COMMA |
105     SINGLEQUOTE |
106     TRUE |
107     FALSE |
108     NULL |
109     SQUAREOPEN |
110     SQUARECLOSE |
111     escapedchar;
112
113 %%