Completed
Pull Request — master (#175)
by Tom
05:04 queued 04:06
created

TokenizedString   A

Complexity

Total Complexity 19

Size/Duplication

Total Lines 98
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 0

Importance

Changes 0
Metric Value
wmc 19
lcom 1
cbo 0
dl 0
loc 98
rs 10
c 0
b 0
f 0

12 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A move() 0 4 2
A next() 0 4 1
A reset() 0 4 1
A read() 0 3 1
A identifyChar() 0 5 2
A has() 0 3 1
A pos() 0 4 2
A newLine() 0 3 1
A lineNo() 0 3 1
A extractString() 0 8 3
A extractBrackets() 0 8 3
1
<?php
2
namespace Transphporm\Parser\Tokenizer;
3
use Transphporm\Parser\Tokenizer;
4
5
class TokenizedString {
6
	private $str;
7
	private $pos = -1;
8
	private $lineNo = 1;
9
10
	private $chars = [
11
		'"' => Tokenizer::STRING,
12
		'\'' => Tokenizer::STRING,
13
		'(' => Tokenizer::OPEN_BRACKET,
14
		')' => Tokenizer::CLOSE_BRACKET,
15
		'[' => Tokenizer::OPEN_SQUARE_BRACKET,
16
		']' => Tokenizer::CLOSE_SQUARE_BRACKET,
17
		'+' => Tokenizer::CONCAT,
18
		',' => Tokenizer::ARG,
19
		'.' => Tokenizer::DOT,
20
		'!' => Tokenizer::NOT,
21
		'=' => Tokenizer::EQUALS,
22
		'{' => Tokenizer::OPEN_BRACE,
23
		'}' => Tokenizer::CLOSE_BRACE,
24
		':' => Tokenizer::COLON,
25
		';' => Tokenizer::SEMI_COLON,
26
		'#' => Tokenizer::NUM_SIGN,
27
		'>' => Tokenizer::GREATER_THAN,
28
		'@' => Tokenizer::AT_SIGN,
29
		'-' => Tokenizer::SUBTRACT,
30
		'*' => Tokenizer::MULTIPLY,
31
		'/' => Tokenizer::DIVIDE,
32
		' ' => Tokenizer::WHITESPACE,
33
		"\n" => Tokenizer::NEW_LINE,
34
		"\r" => Tokenizer::WHITESPACE,
35
		"\t" => Tokenizer::WHITESPACE
36
	];
37
38
	public function __construct($str) {
39
		$this->str = $str;
40
	}
41
42
	public function move($n) {
43
		if ($n === false) $this->pos = strlen($this->str)-1;
44
		else $this->pos += $n;
45
	}
46
47
	public function next() {
48
		$this->pos++;
49
		return $this->pos < strlen($this->str);
50
	}
51
52
	public function reset() {
53
		$this->lineNo = 1;
54
		$this->pos = -1;
55
	}
56
57
	public function read($offset = 0) {
58
		return $this->str[$this->pos + $offset];
59
	}
60
61
	public function identifyChar($offset = 0) {
62
		$chr = $this->str[$this->pos + $offset];
63
		if (!empty($this->chars[$chr])) return $this->chars[$chr];
64
		else return Tokenizer::NAME;
65
	}
66
67
	public function has($offset = 0) {
68
		return isset($this->str[$this->pos + $offset]);
69
	}
70
71
	public function pos($str) {
72
		$pos = strpos($this->str,  $str, $this->pos);
73
		return $pos ? $pos-$this->pos : false;
74
	}
75
76
	public function newLine() {
77
		return $this->lineNo++;
78
	}
79
80
	public function lineNo() {
81
		return $this->lineNo;
82
	}
83
84
	public function extractString($offset = 0) {
85
		$pos = $this->pos + $offset;
86
		$char = $this->str[$pos];
87
		$end = strpos($this->str, $char, $pos+1);
88
		while ($end !== false && $this->str[$end-1] == '\\') $end = strpos($this->str, $char, $end+1);
89
90
		return substr($this->str, $pos+1, $end-$pos-1);
91
	}
92
93
	public function extractBrackets($startBracket = '(', $closeBracket = ')', $offset = 0) {
94
		$open = $this->pos+$offset;
95
		$close = strpos($this->str, $closeBracket, $open);
96
97
		$cPos = $open+1;
98
		while (($cPos = strpos($this->str, $startBracket, $cPos+1)) !== false && $cPos < $close) $close = strpos($this->str, $closeBracket, $close+1);
99
		return substr($this->str, $open+1, $close-$open-1);
100
	}
101
102
}