fix codetest failure - ASSERT_ARGS does not have a ; after and
[parrot.git] / compilers / data_json / data_json.pir
blob156c2ab422e6e2b45f8fc5729d9eef267bf755b9
1 # Copyright (C) 2005-2008, Parrot Foundation.
2 # $Id$
4 =head1 NAME
6 data_json - parse JSON, a lightweight data-interchange format.
8 =head1 SYNOPSIS
10 Given a valid JSON (JavaScript Object Notation) string, the compiler will
11 return a sub that when called will produce the appropriate values.  For
12 example:
14     .local pmc json, code, result
15     json   = compreg 'data_json'
16     code   = json.'compile'('[1,2,3]')
17     result = code()
19 will create a PMC that C<does> C<array> containing the values 1, 2, and 3,
20 and store it in the C<result>.
22 For more information about the structure of the JSON representation, see
23 the documentation at L<http://www.json.org/>.
25 =cut
27 .HLL 'data_json'
29 .sub '__onload' :load
30     load_bytecode 'PGE.pbc'
31     load_bytecode 'PGE/Util.pbc'
32     load_bytecode 'TGE.pbc'
34     $P1 = newclass ['JSON'; 'Compiler']
35     $P2 = new $P1
36     compreg 'data_json', $P2
38     $P1 = new 'Hash'
39     $P1['\"'] = '"'
40     $P1['\\'] = "\\"
41     $P1['\/'] = '/'
42     $P1['\b'] = "\b"
43     $P1['\f'] = "\f"
44     $P1['\n'] = "\n"
45     $P1['\r'] = "\r"
46     $P1['\t'] = "\t"
48     set_root_global ['parrot'; 'data_json'], '$escapes', $P1
49 .end
52 .namespace ['JSON';'Compiler']
54 .sub 'compile' :method
55     .param string json_string
57     .local pmc parse, match
58     parse = get_root_global ['parrot'; 'JSON'], 'value'
60     $P0 = get_root_global ['parrot'; 'PGE'], 'Match'
61     match = $P0.'new'(json_string)
62     match.'to'(0)
63     match = parse(match)
64     unless match goto failed
66     .local pmc pirgrammar, pirbuilder, pir
67     pirgrammar = new ['JSON'; 'PIR']
68     pirbuilder = pirgrammar.'apply'(match)
69     pir = pirbuilder.'get'('result')
71     .local pmc pirc, result
72     pirc = compreg 'PIR'
73     result = pirc(pir)
74     .return (result)
76   failed:
77     $P0 = new 'Exception'
78     $P0[0] = "Invalid JSON value"
79     throw $P0
80 .end
83 .HLL 'parrot'
85 .include 'compilers/data_json/data_json/grammar.pir'
86 .include 'compilers/data_json/data_json/pge2pir.pir'
89 # Local Variables:
90 #   mode: pir
91 #   fill-column: 100
92 # End:
93 # vim: expandtab shiftwidth=4 ft=pir: