-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathToken.php
More file actions
118 lines (108 loc) · 3.39 KB
/
Token.php
File metadata and controls
118 lines (108 loc) · 3.39 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
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<?php
declare(strict_types=1);
namespace Qubus\View;
use function in_array;
use function is_array;
use function is_int;
final class Token
{
public int $type {
get => $this->type;
}
public ?string $value {
get => $this->value;
}
public int $line {
get => $this->line;
}
public int $char {
get => $this->char;
}
public const int EOF = -1;
public const int TEXT = 0;
public const int BLOCK_BEGIN = 1;
public const int OUTPUT_BEGIN = 2;
public const int RAW_BEGIN = 3;
public const int BLOCK_END = 4;
public const int OUTPUT_END = 5;
public const int RAW_END = 6;
public const int NAME = 7;
public const int NUMBER = 8;
public const int STRING = 9;
public const int OPERATOR = 10;
public const int CONSTANT = 11;
public function __construct(int $type, ?string $value, int $line, int $char)
{
$this->type = $type;
$this->value = $value;
$this->line = $line;
$this->char = $char;
}
public static function getTypeError($type): string
{
switch ($type) {
case self::EOF:
$name = 'end of file';
break;
case self::TEXT:
$name = 'text type';
break;
case self::BLOCK_BEGIN:
$name = 'block begin (either "' . Lexer::BLOCK_BEGIN . '" or "'
. Lexer::BLOCK_BEGIN_TRIM . '")';
break;
case self::OUTPUT_BEGIN:
$name = 'output begin (either "' . Lexer::OUTPUT_BEGIN . '" or "'
. Lexer::OUTPUT_BEGIN_TRIM . '")';
break;
case self::RAW_BEGIN:
$name = 'raw begin (either "' . Lexer::RAW_BEGIN . '" or "'
. Lexer::RAW_BEGIN_TRIM . '")';
break;
case self::BLOCK_END:
$name = 'block end (either "' . Lexer::BLOCK_END . '" or "'
. Lexer::BLOCK_END_TRIM . '")';
break;
case self::OUTPUT_END:
$name = 'output end (either "' . Lexer::OUTPUT_END . '" or "'
. Lexer::OUTPUT_END_TRIM . '")';
break;
case self::RAW_END:
$name = 'raw end (either "' . Lexer::RAW_END . '" or "'
. Lexer::RAW_END_TRIM . '")';
break;
case self::NAME:
$name = 'name type';
break;
case self::NUMBER:
$name = 'number type';
break;
case self::STRING:
$name = 'string type';
break;
case self::OPERATOR:
$name = 'operator type';
break;
case self::CONSTANT:
$name = 'constant type (true, false, or null)';
break;
}
return $name;
}
public function test($type, $values = null): bool
{
if (null === $values && ! is_int($type)) {
$values = $type;
$type = self::NAME;
}
return ($this->type === $type) && (
null === $values ||
(is_array($values) && in_array($this->value, $values)) ||
$this->value === $values
);
}
public function __toString(): string
{
return $this->value;
}
}