-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathjson.php
More file actions
83 lines (74 loc) · 2.18 KB
/
json.php
File metadata and controls
83 lines (74 loc) · 2.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<?php
use SyntaxAnalyzer\Analyzer;
use Parser\AnalyzerRules;
require_once __DIR__ . '/testhelpers.php';
$p = new \LexicalAnalyzer\Parser(\Parser\JsonParser::getLexRule());
$s = '{"a":{"a":"b","c":"333"},"c":"b"}';
$s = '["a","q"]';
$s = '{"a":"bb","c":"b"}';
$s = '{"a":{"a":"b","c":"333"},"c":["a","q"],"d":"222"}';
$words = $p->run($s);
//print_r($words);
$rules = [
'array' => AnalyzerRules::one()
->r('/\[/', 'symbol')
->r(['array_item'], 'call', 'items', 1, PHP_INT_MAX)
->r('/\]/', 'symbol')
->n(1, PHP_INT_MAX)
->after(function ($v) {
$rs = [];
foreach ($v['items'] as $v) {
$rs[] = $v['value'];
}
return $rs;
})
->get(),
'array_item' => AnalyzerRules::one()
->r(['string', 'int'], 'call', 'value')
->r('/\,/', 'symbol', null, 0)
->after(function ($v) {
return ['value' => $v['value'][0]];
})
->get(),
'object' => AnalyzerRules::one()
->r('/\{/', 'symbol')
->r(['field'], 'call', 'fields', 1, PHP_INT_MAX)
->r('/\}/', 'symbol')
->n(1, PHP_INT_MAX)
->after(function ($v) {
$rs = [];
foreach ($v['fields'] as $v) {
$rs[$v['key']] = $v['value'];
}
return $rs;
})
->get(),
'field' => AnalyzerRules::one()
->r('/.*/', 'string', 'key')
->r('/\:/', 'symbol')
->r(['string', 'array', 'int', 'object'], 'call', 'value')
->r('/\,/', 'symbol', null, 0)
->after(function ($v) {
return ['key' => $v['key'][0]['value'], 'value' => $v['value'][0]];
})
->get(),
'string' => AnalyzerRules::one()
->r(null, 'string', 'value')
->after(function ($v) {
return $v['value'][0]['value'];
})
->get(),
'int' => AnalyzerRules::one()
->r(null, 'int', 'value')
->after(function ($v) {
return $v['value'][0]['value'];
})
->get(),
];
$g = new Analyzer($rules);
$i = 0;
$rs = $g->run($words);
print_r($rs[0]['value']);
print_r(json_encode($rs[0]['value']));
//$g->showLog();
//