-
Notifications
You must be signed in to change notification settings - Fork 1
/
example1.php
76 lines (69 loc) · 2.52 KB
/
example1.php
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
<?php
require_once __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . 'vendor' . DIRECTORY_SEPARATOR . 'autoload.php';
use dbeurive\Shuntingyard\ShuntingYard;
define('TYPE_STRING', 'STRING');
define('TYPE_VARIABLE', 'VARIABLE');
define('TYPE_FUNCTION', 'FUNCTION');
define('TYPE_NUMERIC', 'NUMERIC');
define('TYPE_PARAM_SEPARATOR', 'PARAM_SEPARATOR');
define('TYPE_OPEN_BRACKET', 'OPEN_BRACKET');
define('TYPE_CLOSE_BRACKET', 'CLOSE_BRACKET');
define('TYPE_OPERATOR', 'OPERATOR');
define('TYPE_SPACE', 'SPACE');
$tokens = array(
array('/"(?:[^"\\\\]|\\\\["\\\\])+"/', TYPE_STRING),
array('/V\\d+/', TYPE_VARIABLE),
array('/[a-z_]+[0-9]*/', TYPE_FUNCTION),
array('/\\d+/', TYPE_NUMERIC),
array('/,/', TYPE_PARAM_SEPARATOR),
array('/\\(/', TYPE_OPEN_BRACKET),
array('/\\)/', TYPE_CLOSE_BRACKET),
array('/(<>|~|%|\\+|\\-|\\*|\\/|\\^|>=|<=|>|<|=|&)/', TYPE_OPERATOR),
array('/\\s+/', TYPE_SPACE, function(array $m) { return null; })
);
$precedences = array(
'%' => 4,
'~' => 4,
'^' => 4,
'&' => 3,
'*' => 3,
'/' => 3,
'+' => 2,
'-' => 2,
'>' => 1,
'<' => 1,
'>=' => 1,
'<=' => 1,
'=' => 1,
'<>' => 1
);
$associativities = array(
'~' => ShuntingYard::ASSOC_RIGHT,
'%' => ShuntingYard::ASSOC_RIGHT,
'^' => ShuntingYard::ASSOC_RIGHT,
'&' => ShuntingYard::ASSOC_LEFT,
'*' => ShuntingYard::ASSOC_LEFT,
'/' => ShuntingYard::ASSOC_LEFT,
'+' => ShuntingYard::ASSOC_LEFT,
'-' => ShuntingYard::ASSOC_LEFT,
'>' => ShuntingYard::ASSOC_LEFT,
'<' => ShuntingYard::ASSOC_LEFT,
'>=' => ShuntingYard::ASSOC_LEFT,
'<=' => ShuntingYard::ASSOC_LEFT,
'=' => ShuntingYard::ASSOC_LEFT,
'<>' => ShuntingYard::ASSOC_LEFT
);
$sy = new ShuntingYard(
$tokens,
$precedences,
$associativities,
array(TYPE_VARIABLE, TYPE_STRING, TYPE_NUMERIC),
array(TYPE_FUNCTION),
array(TYPE_OPERATOR),
TYPE_PARAM_SEPARATOR,
TYPE_OPEN_BRACKET,
TYPE_CLOSE_BRACKET
);
$text = '"azerty" / V1 + V2 * sin(10)';
$tokens = $sy->convert($text, $error);
print "$text:\n\n" . $sy->dumpRpn($tokens) . "\n\n";